1 #include "sv_powerups.qh"
3 MUTATOR_HOOKFUNCTION(powerups, W_PlayStrengthSound)
5 entity player = M_ARGV(0, entity);
7 if(StatusEffects_active(STATUSEFFECT_Strength, player)
8 && ((time > player.prevstrengthsound + autocvar_sv_strengthsound_antispam_time) // prevent insane sound spam
9 || (time > player.prevstrengthsoundattempt + autocvar_sv_strengthsound_antispam_refire_threshold)))
11 sound(player, CH_TRIGGER, SND_STRENGTH_FIRE, VOL_BASE, ATTEN_NORM);
12 player.prevstrengthsound = time;
14 player.prevstrengthsoundattempt = time;
17 MUTATOR_HOOKFUNCTION(powerups, LogDeath_AppendItemCodes)
19 entity player = M_ARGV(0, entity);
21 if(StatusEffects_active(STATUSEFFECT_Strength, player))
22 M_ARGV(1, string) = strcat(M_ARGV(1, string), "S");
24 if(StatusEffects_active(STATUSEFFECT_Shield, player))
25 M_ARGV(1, string) = strcat(M_ARGV(1, string), "I");
27 // TODO: item codes for other powerups?
30 MUTATOR_HOOKFUNCTION(powerups, Damage_Calculate)
32 entity attacker = M_ARGV(1, entity);
33 entity targ = M_ARGV(2, entity);
35 // apply strength multiplier
36 if(StatusEffects_active(STATUSEFFECT_Strength, attacker))
40 M_ARGV(4, float) = M_ARGV(4, float) * autocvar_g_balance_powerup_strength_selfdamage;
41 M_ARGV(6, vector) = M_ARGV(6, vector) * autocvar_g_balance_powerup_strength_selfforce;
45 M_ARGV(4, float) = M_ARGV(4, float) * autocvar_g_balance_powerup_strength_damage;
46 M_ARGV(6, vector) = M_ARGV(6, vector) * autocvar_g_balance_powerup_strength_force;
50 // apply shield multiplier
51 if(StatusEffects_active(STATUSEFFECT_Shield, targ))
53 M_ARGV(4, float) = M_ARGV(4, float) * autocvar_g_balance_powerup_invincible_takedamage;
56 M_ARGV(6, vector) = M_ARGV(6, vector) * autocvar_g_balance_powerup_invincible_takeforce;
61 MUTATOR_HOOKFUNCTION(powerups, CustomizeWaypoint)
63 entity wp = M_ARGV(0, entity);
64 entity player = M_ARGV(1, entity);
66 entity e = WaypointSprite_getviewentity(player);
68 // if you have the invisibility powerup, sprites ALWAYS are restricted to your team
69 // but only apply this to real players, not to spectators
70 if(IS_CLIENT(wp.owner) && (e == player) && DIFF_TEAM(wp.owner, e) && StatusEffects_active(STATUSEFFECT_Invisibility, wp.owner))
74 MUTATOR_HOOKFUNCTION(powerups, MonsterValidTarget)
76 entity targ = M_ARGV(1, entity);
77 return StatusEffects_active(STATUSEFFECT_Invisibility, targ);
80 MUTATOR_HOOKFUNCTION(powerups, PlayerPhysics_UpdateStats)
82 entity player = M_ARGV(0, entity);
83 // these automatically reset, no need to worry
85 if(StatusEffects_active(STATUSEFFECT_Speed, player))
86 STAT(MOVEVARS_HIGHSPEED, player) *= autocvar_g_balance_powerup_speed_highspeed;
89 MUTATOR_HOOKFUNCTION(powerups, WeaponRateFactor)
91 entity player = M_ARGV(1, entity);
93 if(StatusEffects_active(STATUSEFFECT_Speed, player))
94 M_ARGV(0, float) *= autocvar_g_balance_powerup_speed_attackrate;
97 MUTATOR_HOOKFUNCTION(powerups, BuildMutatorsPrettyString)
99 if(autocvar_g_powerups == 0)
100 M_ARGV(0, string) = strcat(M_ARGV(0, string), ", No powerups");
101 if(autocvar_g_powerups > 0)
102 M_ARGV(0, string) = strcat(M_ARGV(0, string), ", Powerups");
105 MUTATOR_HOOKFUNCTION(powerups, BotShouldAttack)
107 entity targ = M_ARGV(1, entity);
109 if(StatusEffects_active(STATUSEFFECT_Invisibility, targ))
113 MUTATOR_HOOKFUNCTION(powerups, BuildMutatorsString)
115 if(autocvar_g_powerups == 0)
116 M_ARGV(0, string) = strcat(M_ARGV(0, string), ":no_powerups");
117 if(autocvar_g_powerups > 0)
118 M_ARGV(0, string) = strcat(M_ARGV(0, string), ":powerups");