From: terencehill Date: Wed, 31 Jan 2018 18:17:40 +0000 (+0100) Subject: Merge branch 'master' into terencehill/accuracy_shotgun X-Git-Tag: xonotic-v0.8.5~2281^2~4 X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=commitdiff_plain;h=b945d959784e5b249c66aea4f3326d8ae048f1cd;hp=ef7fe075803e8c36a64360e2c8e5d5d3a82cbd60 Merge branch 'master' into terencehill/accuracy_shotgun # Conflicts: # qcsrc/server/g_damage.qc --- diff --git a/qcsrc/common/mutators/mutator/nades/nades.qc b/qcsrc/common/mutators/mutator/nades/nades.qc index 3dc7e4e0e3..b0c8d31409 100644 --- a/qcsrc/common/mutators/mutator/nades/nades.qc +++ b/qcsrc/common/mutators/mutator/nades/nades.qc @@ -370,11 +370,11 @@ void nade_napalm_boom(entity this) CSQCProjectile(fountain, true, PROJECTILE_NAPALM_FOUNTAIN, true); } -void nade_ice_freeze(entity freezefield, entity frost_target, float freeze_time) +void nade_ice_freeze(entity freezefield, entity frost_target, float freezetime) { frost_target.frozen_by = freezefield.realowner; Send_Effect(EFFECT_ELECTRO_IMPACT, frost_target.origin, '0 0 0', 1); - Freeze(frost_target, 1/freeze_time, 3, false); + Freeze(frost_target, 1 / freezetime, 3, false); Drop_Special_Items(frost_target); } diff --git a/qcsrc/common/weapons/weapon/hagar.qc b/qcsrc/common/weapons/weapon/hagar.qc index ff2e74539c..026ad6ad8a 100644 --- a/qcsrc/common/weapons/weapon/hagar.qc +++ b/qcsrc/common/weapons/weapon/hagar.qc @@ -181,14 +181,14 @@ void W_Hagar_Attack2_Load_Release(entity actor, .entity weaponentity) weapon_prepareattack_do(actor, weaponentity, true, WEP_CVAR_SEC(hagar, refire)); - W_SetupShot(actor, weaponentity, false, 2, SND_HAGAR_FIRE, CH_WEAPON_A, WEP_CVAR_SEC(hagar, damage)); + shots = actor.(weaponentity).hagar_load; + W_SetupShot(actor, weaponentity, false, 2, SND_HAGAR_FIRE, CH_WEAPON_A, WEP_CVAR_SEC(hagar, damage) * shots); Send_Effect(EFFECT_HAGAR_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1); forward = v_forward; right = v_right; up = v_up; - shots = actor.(weaponentity).hagar_load; missile = NULL; for(counter = 0; counter < shots; ++counter) { diff --git a/qcsrc/server/client.qc b/qcsrc/server/client.qc index 3333c04e49..3688c4eceb 100644 --- a/qcsrc/server/client.qc +++ b/qcsrc/server/client.qc @@ -2765,6 +2765,11 @@ void PlayerPostThink (entity this) } if (IS_PLAYER(this)) { + if(this.death_time == time && IS_DEAD(this)) + { + this.maxs.z = 5; + setsize(this, this.mins, this.maxs); + } DrownPlayer(this); UpdateChatBubble(this); if (CS(this).impulse) ImpulseCommands(this); diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh index e9cf6ee286..6b626a74eb 100644 --- a/qcsrc/server/defs.qh +++ b/qcsrc/server/defs.qh @@ -370,6 +370,7 @@ const float ACTIVE_TOGGLE = 3; .float revive_progress = _STAT(REVIVE_PROGRESS); .float revival_time; // time at which player was last revived .float revive_speed; // NOTE: multiplier (anything above 1 is instaheal) +.float freeze_time; .entity iceblock; .entity frozen_by; // for ice fields diff --git a/qcsrc/server/g_damage.qc b/qcsrc/server/g_damage.qc index 029660c2bf..713cf385dc 100644 --- a/qcsrc/server/g_damage.qc +++ b/qcsrc/server/g_damage.qc @@ -521,7 +521,7 @@ void Ice_Think(entity this) this.nextthink = time; } -void Freeze (entity targ, float freeze_time, float frozen_type, float show_waypoint) +void Freeze (entity targ, float revivespeed, float frozen_type, float show_waypoint) { if(!IS_PLAYER(targ) && !IS_MONSTER(targ)) // only specified entities can be freezed return; @@ -534,10 +534,11 @@ void Freeze (entity targ, float freeze_time, float frozen_type, float show_waypo STAT(FROZEN, targ) = frozen_type; targ.revive_progress = ((frozen_type == 3) ? 1 : 0); SetResourceAmount(targ, RESOURCE_HEALTH, ((frozen_type == 3) ? targ_maxhealth : 1)); - targ.revive_speed = freeze_time; + targ.revive_speed = revivespeed; if(targ.bot_attack) IL_REMOVE(g_bot_targets, targ); targ.bot_attack = false; + targ.freeze_time = time; entity ice = new(ice); ice.owner = targ; diff --git a/qcsrc/server/player.qc b/qcsrc/server/player.qc index 26fc9e6592..9d9281c0e9 100644 --- a/qcsrc/server/player.qc +++ b/qcsrc/server/player.qc @@ -173,9 +173,6 @@ void PlayerCorpseDamage(entity this, entity inflictor, entity attacker, float da vector v; Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, this, attacker); - // damage resistance (ignore most of the damage from a bullet or similar) - damage = max(damage - 5, 1); - v = healtharmor_applydamage(this.armorvalue, autocvar_g_balance_armor_blockpercent, deathtype, damage); take = v.x; save = v.y; @@ -630,11 +627,16 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, animdecide_setstate(this, this.anim_state | ANIMSTATE_DEAD1, true); else animdecide_setstate(this, this.anim_state | ANIMSTATE_DEAD2, true); + + /* // postpone resize until frame end so that dead player can still + // properly get hit by all the projectiles fired in this frame (shotgun) if (this.maxs.z > 5) { this.maxs_z = 5; setsize(this, this.mins, this.maxs); } + */ + // set damage function to corpse damage this.event_damage = PlayerCorpseDamage; // call the corpse damage function just in case it wants to gib @@ -653,7 +655,7 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, if(autocvar_sv_gentle > 0 || autocvar_ekg || this.classname == "body") { // remove corpse // clones don't run any animation code any more, so we must gib them when they die :( - PlayerCorpseDamage(this, inflictor, attacker, autocvar_sv_gibhealth+1.0, deathtype, hitloc, force); + this.event_damage(this, inflictor, attacker, autocvar_sv_gibhealth + 1, deathtype, hitloc, force); } // reset fields the weapons may use just in case diff --git a/qcsrc/server/weapons/accuracy.qc b/qcsrc/server/weapons/accuracy.qc index 0d6ecf066f..879dd88327 100644 --- a/qcsrc/server/weapons/accuracy.qc +++ b/qcsrc/server/weapons/accuracy.qc @@ -93,8 +93,8 @@ bool accuracy_isgooddamage(entity attacker, entity targ) int mutator_check = MUTATOR_CALLHOOK(AccuracyTargetValid, attacker, targ); if (warmup_stage) return false; - if (IS_DEAD(targ)) return false; - if (STAT(FROZEN, targ)) return false; + if (IS_DEAD(targ) && time > targ.death_time) return false; + if (STAT(FROZEN, targ) && time > targ.freeze_time) return false; if (SAME_TEAM(attacker, targ)) return false; if (mutator_check == MUT_ACCADD_INVALID) return true; diff --git a/qcsrc/server/weapons/tracing.qc b/qcsrc/server/weapons/tracing.qc index 486ae180a2..87330e7997 100644 --- a/qcsrc/server/weapons/tracing.qc +++ b/qcsrc/server/weapons/tracing.qc @@ -422,10 +422,10 @@ void fireBullet(entity this, .entity weaponentity, vector start, vector dir, flo yoda = 0; MUTATOR_CALLHOOK(FireBullet_Hit, this, hit, start, end, damage, this.(weaponentity)); damage = M_ARGV(4, float); - float g = accuracy_isgooddamage(this, hit); + bool gooddamage = accuracy_isgooddamage(this, hit); Damage(hit, this, this, damage * solid_penetration_left, dtype, start, force * dir * solid_penetration_left); // calculate hits for ballistic weapons - if(g) + if(gooddamage) { // do not exceed 100% float added_damage = min(damage - total_damage, damage * solid_penetration_left);