]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/mutators/mutator/globalforces/sv_globalforces.qc
take3: format 903 files
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / mutators / mutator / globalforces / sv_globalforces.qc
1 #include "sv_globalforces.qh"
2
3 AUTOCVAR(g_globalforces, float, false, "Global forces: knockback affects everyone");
4 AUTOCVAR(g_globalforces_noself, bool, true, "Global forces: ignore self damage");
5 AUTOCVAR(g_globalforces_self, float, 1, "Global forces: knockback self scale");
6 AUTOCVAR(g_globalforces_range, float, 1000, "Global forces: max range of effect");
7 REGISTER_MUTATOR(mutator_globalforces, autocvar_g_globalforces);
8
9 MUTATOR_HOOKFUNCTION(mutator_globalforces, BuildMutatorsString)
10 {
11         M_ARGV(0, string) = strcat(M_ARGV(0, string), ":GlobalForces");
12 }
13
14 MUTATOR_HOOKFUNCTION(mutator_globalforces, BuildMutatorsPrettyString)
15 {
16         M_ARGV(0, string) = strcat(M_ARGV(0, string), ", Global forces");
17 }
18
19 MUTATOR_HOOKFUNCTION(mutator_globalforces, PlayerDamage_SplitHealthArmor)
20 {
21         entity frag_attacker = M_ARGV(1, entity);
22         entity frag_target = M_ARGV(2, entity);
23         if (autocvar_g_globalforces_noself && frag_target == frag_attacker) { return; }
24         vector damage_force = M_ARGV(3, vector) * autocvar_g_globalforces;
25         FOREACH_CLIENT(IS_PLAYER(it) && it != frag_target, {
26                 if (autocvar_g_globalforces_range) {
27                         if (vdist(it.origin - frag_target.origin, >, autocvar_g_globalforces_range)) {
28                                 continue;
29                         }
30                 }
31                 float f = (it == frag_attacker) ? autocvar_g_globalforces_self : 1;
32                 it.velocity += damage_explosion_calcpush(f * it.damageforcescale * damage_force, it.velocity, autocvar_g_balance_damagepush_speedfactor);
33         });
34 }