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