From: Rudolf Polzer Date: Mon, 28 Mar 2011 14:13:59 +0000 (+0200) Subject: new toy: autocvar_g_damagepush_speedfactor - ENJOY X-Git-Tag: xonotic-v0.5.0~305^2~21 X-Git-Url: http://de.git.xonotic.org/?a=commitdiff_plain;h=93eaab4d4fff741e5bd15c9b9c31562eafd5896c;p=xonotic%2Fxonotic-data.pk3dir.git new toy: autocvar_g_damagepush_speedfactor - ENJOY --- diff --git a/balance25.cfg b/balance25.cfg index 665dda5c9..12e869118 100644 --- a/balance25.cfg +++ b/balance25.cfg @@ -178,6 +178,7 @@ set g_balance_falldamage_deadminspeed 150 set g_balance_falldamage_minspeed 1400 set g_balance_falldamage_factor 0.15 set g_balance_falldamage_maxdamage 25 +set g_balance_damagepush_speedfactor 0 // }}} // {{{ powerups diff --git a/balanceLeeStricklin.cfg b/balanceLeeStricklin.cfg index 77aac858a..2da110fce 100644 --- a/balanceLeeStricklin.cfg +++ b/balanceLeeStricklin.cfg @@ -178,6 +178,7 @@ set g_balance_falldamage_deadminspeed 150 set g_balance_falldamage_minspeed 1400 set g_balance_falldamage_factor 0.15 set g_balance_falldamage_maxdamage 25 +set g_balance_damagepush_speedfactor 0 // }}} // {{{ powerups diff --git a/balanceSamual.cfg b/balanceSamual.cfg index a117a44a9..c30f46995 100644 --- a/balanceSamual.cfg +++ b/balanceSamual.cfg @@ -178,6 +178,7 @@ set g_balance_falldamage_deadminspeed 150 set g_balance_falldamage_minspeed 1000 set g_balance_falldamage_factor 0.20 set g_balance_falldamage_maxdamage 15 +set g_balance_damagepush_speedfactor 0 // }}} // {{{ powerups diff --git a/balanceXonotic.cfg b/balanceXonotic.cfg index a782c6387..1e9762408 100644 --- a/balanceXonotic.cfg +++ b/balanceXonotic.cfg @@ -178,6 +178,7 @@ set g_balance_falldamage_deadminspeed 150 set g_balance_falldamage_minspeed 800 set g_balance_falldamage_factor 0.20 set g_balance_falldamage_maxdamage 15 +set g_balance_damagepush_speedfactor 5 // }}} // {{{ powerups diff --git a/balancetZork.cfg b/balancetZork.cfg index 2fb726764..e1027337a 100644 --- a/balancetZork.cfg +++ b/balancetZork.cfg @@ -178,6 +178,7 @@ set g_balance_falldamage_deadminspeed 150 set g_balance_falldamage_minspeed 800 set g_balance_falldamage_factor 0.02 // maxspeed = minspeed + maxdamage / factor = 4550 set g_balance_falldamage_maxdamage 75 +set g_balance_damagepush_speedfactor 0 // }}} // {{{ powerups diff --git a/qcsrc/client/autocvars.qh b/qcsrc/client/autocvars.qh index d380c7fc3..fe46be10c 100644 --- a/qcsrc/client/autocvars.qh +++ b/qcsrc/client/autocvars.qh @@ -128,6 +128,7 @@ float autocvar_crosshair_ring_reload_size; float autocvar_crosshair_size; float autocvar_ekg; float autocvar_fov; +float autocvar_g_balance_damage_pushspeedfactor; float autocvar_g_balance_tuba_attenuation; float autocvar_g_balance_tuba_fadetime; float autocvar_g_balance_tuba_volume; diff --git a/qcsrc/client/damage.qc b/qcsrc/client/damage.qc index 13c8e462e..21366ad7b 100644 --- a/qcsrc/client/damage.qc +++ b/qcsrc/client/damage.qc @@ -57,7 +57,7 @@ void Ent_DamageInfo(float isNew) if(self.damageforcescale) if(vlen(thisforce)) { - self.move_velocity = self.move_velocity + self.damageforcescale * thisforce; + self.move_velocity = self.move_velocity + self.damageforcescale * damage_explosion_calcpush(thisforce, self.move_velocity, autocvar_g_balance_damagepush_speedfactor); self.move_flags &~= FL_ONGROUND; } diff --git a/qcsrc/client/progs.src b/qcsrc/client/progs.src index 1334d7d3c..b79c759e8 100644 --- a/qcsrc/client/progs.src +++ b/qcsrc/client/progs.src @@ -14,6 +14,7 @@ csqc_builtins.qc ../common/util.qh ../common/items.qh +../common/explosion_equation.qh ../common/mapinfo.qh @@ -71,6 +72,7 @@ noise.qc ../common/mapinfo.qc ../common/items.qc ../server/w_all.qc +../common/explosion_equation.qc ../warpzonelib/anglestransform.qc ../warpzonelib/mathlib.qc diff --git a/qcsrc/common/explosion_equation.qc b/qcsrc/common/explosion_equation.qc new file mode 100644 index 000000000..4d5eb5a7e --- /dev/null +++ b/qcsrc/common/explosion_equation.qc @@ -0,0 +1,54 @@ +vector explosion_calcpush_nomultiplier(vector explosion_v, vector target_v) +{ + // solution of the equations: + // v' = v + alpha vp // central hit + // m*v' + mp*vp' = m*v + mp*vp // conservation of momentum + // m*v'^2 + mp*vp'^2 = m*v^2 + mp*vp^2 // conservation of energy (ELASTIC hit) + // -> alpha = 0 // case 1: did not hit + // -> alpha = 2*mp*(vp^2 - vp.v) / ((m+mp) * vp^2) // case 2: did hit + // // non-elastic hits are somewhere between these two + + float alpha; + alpha = explosion_v * (explosion_v - target_v); + + if(alpha <= 0) + // target is too fast to be hittable by this + return '0 0 0'; + + alpha /= (explosion_v * explosion_v); + // now alpha is a multiplier + // we know we can divide by this, or above alpha would be == 0 + + return + explosion_v * alpha; +} + +#if 0 +vector explosion_calcpush(vector explosion_v, float explosion_m, vector target_v, float target_m, float elasticity) +{ + // solution of the equations: + // v' = v + alpha vp // central hit + // m*v' + mp*vp' = m*v + mp*vp // conservation of momentum + // m*v'^2 + mp*vp'^2 = m*v^2 + mp*vp^2 // conservation of energy (ELASTIC hit) + // -> alpha = 0 // case 1: did not hit + // -> alpha = 2*mp*(vp^2 - vp.v) / ((m+mp) * vp^2) // case 2: did hit + // // non-elastic hits are somewhere between these two + + // this would be physically correct, but we don't do that + return explosion_calcpush_nomultiplier(explosion_v, target_v, + (1 + elasticity) * ( + explosion_m + ) / ( + target_m + explosion_m + ) + ); +} +#endif + +// simplified formula, tuned so that if the target has velocity 0, we get exactly the original force +vector damage_explosion_calcpush(vector explosion_f, vector target_v, float speedfactor) +{ + if(speedfactor == 0) + return explosion_f; + return explosion_calcpush_nomultiplier(explosion_f * speedfactor, target_v) * (1.0 / speedfactor); +} diff --git a/qcsrc/common/explosion_equation.qh b/qcsrc/common/explosion_equation.qh new file mode 100644 index 000000000..c8630cdb1 --- /dev/null +++ b/qcsrc/common/explosion_equation.qh @@ -0,0 +1 @@ +vector damage_explosion_calcpush(vector explosion_f, vector target_v, float speedfactor); diff --git a/qcsrc/server/autocvars.qh b/qcsrc/server/autocvars.qh index c78460c17..2118694dc 100644 --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@ -735,6 +735,7 @@ float autocvar_g_ctf_shield_max_ratio; float autocvar_g_ctf_shield_min_negscore; float autocvar_g_cts_finish_kill_delay; float autocvar_g_cts_selfdamage; +float autocvar_g_damagepush_speedfactor; float autocvar_g_deathglow; float autocvar_g_debug_bot_commands; float autocvar_g_domination_default_teams; diff --git a/qcsrc/server/g_damage.qc b/qcsrc/server/g_damage.qc index c00a71821..fcd3d9bd1 100644 --- a/qcsrc/server/g_damage.qc +++ b/qcsrc/server/g_damage.qc @@ -839,7 +839,7 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float if (vlen(force)) if (self.classname != "player" || time >= self.spawnshieldtime || g_midair) { - self.velocity = self.velocity + self.damageforcescale * force; + self.velocity = self.velocity + self.damageforcescale * damage_explosion_calcpush(force, self.velocity, autocvar_g_damagepush_speedfactor); self.flags &~= FL_ONGROUND; UpdateCSQCProjectile(self); } diff --git a/qcsrc/server/progs.src b/qcsrc/server/progs.src index c76395fdb..cf5c7d6a8 100644 --- a/qcsrc/server/progs.src +++ b/qcsrc/server/progs.src @@ -17,6 +17,7 @@ post-builtins.qh ../common/constants.qh ../common/util.qh ../common/items.qh +../common/explosion_equation.qh autocvars.qh constants.qh @@ -179,6 +180,8 @@ anticheat.qc cheats.qc playerstats.qc +../common/explosion_equation.qc + mutators/base.qc mutators/gamemode_keyhunt.qc mutators/gamemode_freezetag.qc