]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/mutators/mutator/overkill/overkill.qc
Purify PutClientInServer and PlayerSpawn mutator hooks
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / mutators / mutator / overkill / overkill.qc
index 125025f205c40f8ce1908705ff831df50d18a252..b8a203990af6aaa2797788d24fd1f543e0974843 100644 (file)
@@ -41,7 +41,7 @@ REGISTER_MUTATOR(ok, cvar("g_overkill") && !cvar("g_instagib") && !g_nexball &&
 
 MUTATOR_HOOKFUNCTION(ok, W_DecreaseAmmo)
 {
-       entity actor = MUTATOR_ARGV(0, entity);
+       entity actor = M_ARGV(0, entity);
        if (actor.ok_use_ammocharge)
        {
                ok_DecreaseCharge(actor, PS(actor).m_weapon.m_id);
@@ -51,7 +51,7 @@ MUTATOR_HOOKFUNCTION(ok, W_DecreaseAmmo)
 
 MUTATOR_HOOKFUNCTION(ok, W_Reload)
 {
-       entity actor = MUTATOR_ARGV(0, entity);
+       entity actor = M_ARGV(0, entity);
        return actor.ok_use_ammocharge;
 }
 
@@ -94,6 +94,12 @@ float ok_CheckWeaponCharge(entity ent, int wep)
 
 MUTATOR_HOOKFUNCTION(ok, PlayerDamage_Calculate, CBC_ORDER_LAST)
 {
+       entity frag_attacker = M_ARGV(1, entity);
+       entity frag_target = M_ARGV(2, entity);
+       float frag_deathtype = M_ARGV(3, float);
+       float frag_damage = M_ARGV(4, float);
+       vector frag_force = M_ARGV(6, vector);
+
        if(IS_PLAYER(frag_attacker) && IS_PLAYER(frag_target))
        if(DEATH_ISWEAPON(frag_deathtype, WEP_BLASTER))
        {
@@ -107,6 +113,9 @@ MUTATOR_HOOKFUNCTION(ok, PlayerDamage_Calculate, CBC_ORDER_LAST)
                        Send_Notification(NOTIF_ONE, frag_attacker, MSG_CENTER, CENTER_SECONDARY_NODAMAGE);
                        frag_force = '0 0 0';
                }
+
+               M_ARGV(4, float) = frag_damage;
+               M_ARGV(6, vector) = frag_force;
        }
 
        return false;
@@ -135,12 +144,14 @@ MUTATOR_HOOKFUNCTION(ok, PlayerDies)
        e.pickup_anyway = true;
        e.spawnfunc_checked = true;
        spawnfunc_item_armor_small(e);
-       e.movetype = MOVETYPE_TOSS;
-       e.gravity = 1;
-       e.reset = SUB_Remove;
-       setorigin(e, frag_target.origin + '0 0 32');
-       e.velocity = '0 0 200' + normalize(targ.origin - frag_target.origin) * 500;
-       SUB_SetFade(e, time + 5, 1);
+       if (!wasfreed(e)) { // might have been blocked by a mutator
+        e.movetype = MOVETYPE_TOSS;
+        e.gravity = 1;
+        e.reset = SUB_Remove;
+        setorigin(e, frag_target.origin + '0 0 32');
+        e.velocity = '0 0 200' + normalize(targ.origin - frag_target.origin) * 500;
+        SUB_SetFade(e, time + 5, 1);
+       }
 
        frag_target.ok_lastwep = PS(frag_target).m_switchweapon.m_id;
 
@@ -245,28 +256,30 @@ MUTATOR_HOOKFUNCTION(ok, PlayerPreThink)
 }
 
 MUTATOR_HOOKFUNCTION(ok, PlayerSpawn)
-{SELFPARAM();
+{
+       entity player = M_ARGV(0, entity);
+
        if(autocvar_g_overkill_ammo_charge)
        {
-               FOREACH(Weapons, it != WEP_Null, LAMBDA(self.ammo_charge[it.m_id] = autocvar_g_overkill_ammo_charge_limit));
+               FOREACH(Weapons, it != WEP_Null, LAMBDA(player.ammo_charge[it.m_id] = autocvar_g_overkill_ammo_charge_limit));
 
-               self.ok_use_ammocharge = 1;
-               self.ok_notice_time = time;
+               player.ok_use_ammocharge = 1;
+               player.ok_notice_time = time;
        }
        else
-               self.ok_use_ammocharge = 0;
+               player.ok_use_ammocharge = 0;
 
        // if player changed their weapon while dead, don't switch to their death weapon
-       if(self.impulse)
-               self.ok_lastwep = 0;
+       if(player.impulse)
+               player.ok_lastwep = 0;
 
-       self.ok_pauseregen_finished = time + 2;
+       player.ok_pauseregen_finished = time + 2;
 
        return false;
 }
 
-void self_spawnfunc_weapon_hmg() { SELFPARAM(); spawnfunc_weapon_hmg(this); }
-void self_spawnfunc_weapon_rpc() { SELFPARAM(); spawnfunc_weapon_rpc(this); }
+void self_spawnfunc_weapon_hmg(entity this) { spawnfunc_weapon_hmg(this); }
+void self_spawnfunc_weapon_rpc(entity this) { spawnfunc_weapon_rpc(this); }
 
 MUTATOR_HOOKFUNCTION(ok, OnEntityPreSpawn)
 {SELFPARAM();
@@ -285,7 +298,7 @@ MUTATOR_HOOKFUNCTION(ok, OnEntityPreSpawn)
                        wep.respawntime = autocvar_g_overkill_superguns_respawn_time;
                        wep.pickup_anyway = true;
                        wep.spawnfunc_checked = true;
-                       wep.think = self_spawnfunc_weapon_hmg;
+                       setthink(wep, self_spawnfunc_weapon_hmg);
                        wep.nextthink = time + 0.1;
                        return true;
                }
@@ -302,7 +315,7 @@ MUTATOR_HOOKFUNCTION(ok, OnEntityPreSpawn)
                        wep.respawntime = autocvar_g_overkill_superguns_respawn_time;
                        wep.pickup_anyway = true;
                        wep.spawnfunc_checked = true;
-                       wep.think = self_spawnfunc_weapon_rpc;
+                       setthink(wep, self_spawnfunc_weapon_rpc);
                        wep.nextthink = time + 0.1;
                        return true;
                }