]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/gamemodes/gamemode/onslaught/onslaught.qc
Fix up more mutator hooks
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / gamemodes / gamemode / onslaught / onslaught.qc
index 4fc4a982cbefefb330b95d5cdafa979d2e769b96..fad837f403e27e99abbd740b8961c6f1a2da87c5 100644 (file)
@@ -13,7 +13,7 @@ REGISTER_MUTATOR(ons, false)
                ons_Initialize();
 
                ActivateTeamplay();
-               SetLimits(autocvar_g_onslaught_point_limit, -1, -1, -1);
+               SetLimits(autocvar_g_onslaught_point_limit, autocvar_leadlimit_override, autocvar_timelimit_override, -1);
                have_team_spawns = -1; // request team spawns
        }
 
@@ -162,8 +162,8 @@ void FixSize(entity e);
 // CaptureShield Functions
 // =======================
 
-bool ons_CaptureShield_Customize()
-{SELFPARAM();
+bool ons_CaptureShield_Customize(entity this)
+{
        entity e = WaypointSprite_getviewentity(other);
 
        if(!self.enemy.isshielded && (ons_ControlPoint_Attackable(self.enemy, e.team) > 0 || self.enemy.classname != "onslaught_controlpoint")) { return false; }
@@ -172,8 +172,8 @@ bool ons_CaptureShield_Customize()
        return true;
 }
 
-void ons_CaptureShield_Touch()
-{SELFPARAM();
+void ons_CaptureShield_Touch(entity this)
+{
        if(!self.enemy.isshielded && (ons_ControlPoint_Attackable(self.enemy, other.team) > 0 || self.enemy.classname != "onslaught_controlpoint")) { return; }
        if(!IS_PLAYER(other)) { return; }
        if(SAME_TEAM(other, self)) { return; }
@@ -208,8 +208,8 @@ void ons_CaptureShield_Spawn(entity generator, bool is_generator)
        shield.team = generator.team;
        shield.colormap = generator.colormap;
        shield.reset = ons_CaptureShield_Reset;
-       shield.touch = ons_CaptureShield_Touch;
-       shield.customizeentityforclient = ons_CaptureShield_Customize;
+       settouch(shield, ons_CaptureShield_Touch);
+       setcefc(shield, ons_CaptureShield_Customize);
        shield.effects = EF_ADDITIVE;
        shield.movetype = MOVETYPE_NOCLIP;
        shield.solid = SOLID_TRIGGER;
@@ -395,36 +395,36 @@ bool ons_Link_Send(entity this, entity to, int sendflags)
        return true;
 }
 
-void ons_Link_CheckUpdate()
-{SELFPARAM();
+void ons_Link_CheckUpdate(entity this)
+{
        // TODO check if the two sides have moved (currently they won't move anyway)
        float cc = 0, cc1 = 0, cc2 = 0;
 
-       if(self.goalentity.islinked || self.goalentity.iscaptured) { cc1 = (self.goalentity.team - 1) * 0x01; }
-       if(self.enemy.islinked || self.enemy.iscaptured) { cc2 = (self.enemy.team - 1) * 0x10; }
+       if(this.goalentity.islinked || this.goalentity.iscaptured) { cc1 = (this.goalentity.team - 1) * 0x01; }
+       if(this.enemy.islinked || this.enemy.iscaptured) { cc2 = (this.enemy.team - 1) * 0x10; }
 
        cc = cc1 + cc2;
 
-       if(cc != self.clientcolors)
+       if(cc != this.clientcolors)
        {
-               self.clientcolors = cc;
-               self.SendFlags |= 4;
+               this.clientcolors = cc;
+               this.SendFlags |= 4;
        }
 
-       self.nextthink = time;
+       this.nextthink = time;
 }
 
-void ons_DelayedLinkSetup()
-{SELFPARAM();
-       self.goalentity = find(world, targetname, self.target);
-       self.enemy = find(world, targetname, self.target2);
-       if(!self.goalentity) { objerror("can not find target\n"); }
-       if(!self.enemy) { objerror("can not find target2\n"); }
+void ons_DelayedLinkSetup(entity this)
+{
+       this.goalentity = find(world, targetname, this.target);
+       this.enemy = find(world, targetname, this.target2);
+       if(!this.goalentity) { objerror("can not find target\n"); }
+       if(!this.enemy) { objerror("can not find target2\n"); }
 
-       LOG_DEBUG(strcat(etos(self.goalentity), " linked with ", etos(self.enemy), "\n"));
-       self.SendFlags |= 3;
-       self.think = ons_Link_CheckUpdate;
-       self.nextthink = time;
+       LOG_DEBUG(strcat(etos(this.goalentity), " linked with ", etos(this.enemy), "\n"));
+       this.SendFlags |= 3;
+       setthink(this, ons_Link_CheckUpdate);
+       this.nextthink = time;
 }
 
 
@@ -546,10 +546,7 @@ void ons_ControlPoint_Icon_Damage(entity this, entity inflictor, entity attacker
                onslaught_updatelinks();
 
                // Use targets now (somebody make sure this is in the right place..)
-               setself(this.owner);
-               activator = this;
-               WITHSELF(this, SUB_UseTargets());
-               setself(this);
+               SUB_UseTargets(this.owner, this, NULL);
 
                this.owner.waslinked = this.owner.islinked;
                if(this.owner.model != "models/onslaught/controlpoint_pad.md3")
@@ -562,9 +559,9 @@ void ons_ControlPoint_Icon_Damage(entity this, entity inflictor, entity attacker
        this.SendFlags |= CPSF_STATUS;
 }
 
-void ons_ControlPoint_Icon_Think()
-{SELFPARAM();
-       self.nextthink = time + ONS_CP_THINKRATE;
+void ons_ControlPoint_Icon_Think(entity this)
+{
+       this.nextthink = time + ONS_CP_THINKRATE;
 
        if(autocvar_g_onslaught_cp_proxydecap)
        {
@@ -572,9 +569,9 @@ void ons_ControlPoint_Icon_Think()
                int _friendly_count = 0;
 
                FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it), {
-                       if(vdist(it.origin - self.origin, <, autocvar_g_onslaught_cp_proxydecap_distance))
+                       if(vdist(it.origin - this.origin, <, autocvar_g_onslaught_cp_proxydecap_distance))
                        {
-                               if(SAME_TEAM(it, self))
+                               if(SAME_TEAM(it, this))
                                        ++_friendly_count;
                                else
                                        ++_enemy_count;
@@ -584,113 +581,107 @@ void ons_ControlPoint_Icon_Think()
                _friendly_count = _friendly_count * (autocvar_g_onslaught_cp_proxydecap_dps * ONS_CP_THINKRATE);
                _enemy_count = _enemy_count * (autocvar_g_onslaught_cp_proxydecap_dps * ONS_CP_THINKRATE);
 
-               self.health = bound(0, self.health + (_friendly_count - _enemy_count), self.max_health);
-               self.SendFlags |= CPSF_STATUS;
-               if(self.health <= 0)
+               this.health = bound(0, this.health + (_friendly_count - _enemy_count), this.max_health);
+               this.SendFlags |= CPSF_STATUS;
+               if(this.health <= 0)
                {
-                       ons_ControlPoint_Icon_Damage(self, self, self, 1, 0, self.origin, '0 0 0');
+                       ons_ControlPoint_Icon_Damage(this, this, this, 1, 0, this.origin, '0 0 0');
                        return;
                }
        }
 
-       if (time > self.pain_finished + 5)
+       if (time > this.pain_finished + 5)
        {
-               if(self.health < self.max_health)
+               if(this.health < this.max_health)
                {
-                       self.health = self.health + self.count;
-                       if (self.health >= self.max_health)
-                               self.health = self.max_health;
-                       WaypointSprite_UpdateHealth(self.owner.sprite, self.health);
+                       this.health = this.health + this.count;
+                       if (this.health >= this.max_health)
+                               this.health = this.max_health;
+                       WaypointSprite_UpdateHealth(this.owner.sprite, this.health);
                }
        }
 
-       if(self.owner.islinked != self.owner.waslinked)
+       if(this.owner.islinked != this.owner.waslinked)
        {
                // unteam the spawnpoint if needed
-               int t = self.owner.team;
-               if(!self.owner.islinked)
-                       self.owner.team = 0;
+               int t = this.owner.team;
+               if(!this.owner.islinked)
+                       this.owner.team = 0;
 
-               setself(self.owner);
-               activator = self;
-               SUB_UseTargets ();
-               setself(this);
+               SUB_UseTargets(this.owner, this, NULL);
 
-               self.owner.team = t;
+               this.owner.team = t;
 
-               self.owner.waslinked = self.owner.islinked;
+               this.owner.waslinked = this.owner.islinked;
        }
 
        // damaged fx
-       if(random() < 0.6 - self.health / self.max_health)
+       if(random() < 0.6 - this.health / this.max_health)
        {
-               Send_Effect(EFFECT_ELECTRIC_SPARKS, self.origin + randompos('-10 -10 -20', '10 10 20'), '0 0 0', 1);
+               Send_Effect(EFFECT_ELECTRIC_SPARKS, this.origin + randompos('-10 -10 -20', '10 10 20'), '0 0 0', 1);
 
                if(random() > 0.8)
-                       sound(self, CH_PAIN, SND_ONS_SPARK1, VOL_BASE, ATTEN_NORM);
+                       sound(this, CH_PAIN, SND_ONS_SPARK1, VOL_BASE, ATTEN_NORM);
                else if (random() > 0.5)
-                       sound(self, CH_PAIN, SND_ONS_SPARK2, VOL_BASE, ATTEN_NORM);
+                       sound(this, CH_PAIN, SND_ONS_SPARK2, VOL_BASE, ATTEN_NORM);
        }
 }
 
-void ons_ControlPoint_Icon_BuildThink()
-{SELFPARAM();
+void ons_ControlPoint_Icon_BuildThink(entity this)
+{
        int a;
 
-       self.nextthink = time + ONS_CP_THINKRATE;
+       this.nextthink = time + ONS_CP_THINKRATE;
 
        // only do this if there is power
-       a = ons_ControlPoint_CanBeLinked(self.owner, self.owner.team);
+       a = ons_ControlPoint_CanBeLinked(this.owner, this.owner.team);
        if(!a)
                return;
 
-       self.health = self.health + self.count;
+       this.health = this.health + this.count;
 
-       self.SendFlags |= CPSF_STATUS;
+       this.SendFlags |= CPSF_STATUS;
 
-       if (self.health >= self.max_health)
+       if (this.health >= this.max_health)
        {
-               self.health = self.max_health;
-               self.count = autocvar_g_onslaught_cp_regen * ONS_CP_THINKRATE; // slow repair rate from now on
-               self.think = ons_ControlPoint_Icon_Think;
-               sound(self, CH_TRIGGER, SND_ONS_CONTROLPOINT_BUILT, VOL_BASE, ATTEN_NORM);
-               self.owner.iscaptured = true;
-               self.solid = SOLID_BBOX;
+               this.health = this.max_health;
+               this.count = autocvar_g_onslaught_cp_regen * ONS_CP_THINKRATE; // slow repair rate from now on
+               setthink(this, ons_ControlPoint_Icon_Think);
+               sound(this, CH_TRIGGER, SND_ONS_CONTROLPOINT_BUILT, VOL_BASE, ATTEN_NORM);
+               this.owner.iscaptured = true;
+               this.solid = SOLID_BBOX;
 
-               Send_Effect(EFFECT_CAP(self.owner.team), self.owner.origin, '0 0 0', 1);
+               Send_Effect(EFFECT_CAP(this.owner.team), this.owner.origin, '0 0 0', 1);
 
-               WaypointSprite_UpdateMaxHealth(self.owner.sprite, self.max_health);
-               WaypointSprite_UpdateHealth(self.owner.sprite, self.health);
+               WaypointSprite_UpdateMaxHealth(this.owner.sprite, this.max_health);
+               WaypointSprite_UpdateHealth(this.owner.sprite, this.health);
 
-               if(IS_PLAYER(self.owner.ons_toucher))
+               if(IS_PLAYER(this.owner.ons_toucher))
                {
-                       Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_ONSLAUGHT_CAPTURE, self.owner.ons_toucher.netname, self.owner.message);
-                       Send_Notification(NOTIF_ALL_EXCEPT, self.owner.ons_toucher, MSG_CENTER, APP_TEAM_NUM(self.owner.ons_toucher.team, CENTER_ONS_CAPTURE), self.owner.message);
-                       Send_Notification(NOTIF_ONE, self.owner.ons_toucher, MSG_CENTER, CENTER_ONS_CAPTURE, self.owner.message);
-                       PlayerScore_Add(self.owner.ons_toucher, SP_ONS_CAPS, 1);
-                       PlayerTeamScore_AddScore(self.owner.ons_toucher, 10);
+                       Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_ONSLAUGHT_CAPTURE, this.owner.ons_toucher.netname, this.owner.message);
+                       Send_Notification(NOTIF_ALL_EXCEPT, this.owner.ons_toucher, MSG_CENTER, APP_TEAM_NUM(this.owner.ons_toucher.team, CENTER_ONS_CAPTURE), this.owner.message);
+                       Send_Notification(NOTIF_ONE, this.owner.ons_toucher, MSG_CENTER, CENTER_ONS_CAPTURE, this.owner.message);
+                       PlayerScore_Add(this.owner.ons_toucher, SP_ONS_CAPS, 1);
+                       PlayerTeamScore_AddScore(this.owner.ons_toucher, 10);
                }
 
-               self.owner.ons_toucher = world;
+               this.owner.ons_toucher = world;
 
                onslaught_updatelinks();
 
                // Use targets now (somebody make sure this is in the right place..)
-               setself(self.owner);
-               activator = self;
-               SUB_UseTargets ();
-               setself(this);
+               SUB_UseTargets(this.owner, this, NULL);
 
-               self.SendFlags |= CPSF_SETUP;
+               this.SendFlags |= CPSF_SETUP;
        }
-       if(self.owner.model != MDL_ONS_CP_PAD2.model_str())
-               setmodel_fixsize(self.owner, MDL_ONS_CP_PAD2);
+       if(this.owner.model != MDL_ONS_CP_PAD2.model_str())
+               setmodel_fixsize(this.owner, MDL_ONS_CP_PAD2);
 
-       if(random() < 0.9 - self.health / self.max_health)
-               Send_Effect(EFFECT_RAGE, self.origin + 10 * randomvec(), '0 0 -1', 1);
+       if(random() < 0.9 - this.health / this.max_health)
+               Send_Effect(EFFECT_RAGE, this.origin + 10 * randomvec(), '0 0 -1', 1);
 }
 
-void onslaught_controlpoint_icon_link(entity e, void() spawnproc);
+void onslaught_controlpoint_icon_link(entity e, void(entity this) spawnproc);
 
 void ons_ControlPoint_Icon_Spawn(entity cp, entity player)
 {
@@ -785,8 +776,8 @@ void ons_ControlPoint_UpdateSprite(entity e)
        }
 }
 
-void ons_ControlPoint_Touch()
-{SELFPARAM();
+void ons_ControlPoint_Touch(entity this)
+{
        entity toucher = other;
        int attackable;
 
@@ -822,8 +813,8 @@ void ons_ControlPoint_Touch()
        onslaught_updatelinks();
 }
 
-void ons_ControlPoint_Think()
-{SELFPARAM();
+void ons_ControlPoint_Think(entity this)
+{
        self.nextthink = time + ONS_CP_THINKRATE;
        CSQCMODEL_AUTOUPDATE(self);
 }
@@ -839,7 +830,7 @@ void ons_ControlPoint_Reset(entity this)
        this.iscaptured = false;
        this.islinked = false;
        this.isshielded = true;
-       this.think = ons_ControlPoint_Think;
+       setthink(this, ons_ControlPoint_Think);
        this.ons_toucher = world;
        this.nextthink = time + ONS_CP_THINKRATE;
        setmodel_fixsize(this, MDL_ONS_CP_PAD1);
@@ -849,27 +840,23 @@ void ons_ControlPoint_Reset(entity this)
 
        onslaught_updatelinks();
 
-       activator = this;
-       SUB_UseTargets(); // to reset the structures, playerspawns etc.
+       SUB_UseTargets(this, this, NULL); // to reset the structures, playerspawns etc.
 
        CSQCMODEL_AUTOUPDATE(this);
 }
 
-void ons_DelayedControlPoint_Setup()
-{SELFPARAM();
+void ons_DelayedControlPoint_Setup(entity this)
+{
        onslaught_updatelinks();
 
        // captureshield setup
-       ons_CaptureShield_Spawn(self, false);
+       ons_CaptureShield_Spawn(this, false);
 
-       CSQCMODEL_AUTOINIT(self);
+       CSQCMODEL_AUTOINIT(this);
 }
 
 void ons_ControlPoint_Setup(entity cp)
-{SELFPARAM();
-       // declarations
-       setself(cp); // for later usage with droptofloor()
-
+{
        // main setup
        cp.ons_worldcpnext = ons_worldcplist; // link control point into ons_worldcplist
        ons_worldcplist = cp;
@@ -878,8 +865,8 @@ void ons_ControlPoint_Setup(entity cp)
        cp.team = 0;
        cp.solid = SOLID_BBOX;
        cp.movetype = MOVETYPE_NONE;
-       cp.touch = ons_ControlPoint_Touch;
-       cp.think = ons_ControlPoint_Think;
+       settouch(cp, ons_ControlPoint_Touch);
+       setthink(cp, ons_ControlPoint_Think);
        cp.nextthink = time + ONS_CP_THINKRATE;
        cp.reset = ons_ControlPoint_Reset;
        cp.colormap = 1024;
@@ -902,14 +889,13 @@ void ons_ControlPoint_Setup(entity cp)
        {
                setorigin(cp, cp.origin + '0 0 20');
                cp.noalign = false;
-               setself(cp);
-               droptofloor();
+               droptofloor(cp);
                cp.movetype = MOVETYPE_TOSS;
        }
 
        // waypointsprites
-       WaypointSprite_SpawnFixed(WP_Null, self.origin + CPGEN_WAYPOINT_OFFSET, self, sprite, RADARICON_NONE);
-       WaypointSprite_UpdateRule(self.sprite, self.team, SPRITERULE_TEAMPLAY);
+       WaypointSprite_SpawnFixed(WP_Null, cp.origin + CPGEN_WAYPOINT_OFFSET, cp, sprite, RADARICON_NONE);
+       WaypointSprite_UpdateRule(cp.sprite, cp.team, SPRITERULE_TEAMPLAY);
 
        InitializeEntity(cp, ons_DelayedControlPoint_Setup, INITPRIO_SETLOCATION);
 }
@@ -1004,7 +990,7 @@ void ons_GeneratorDamage(entity this, entity inflictor, entity attacker, float d
                this.takedamage = DAMAGE_NO; // can't be hurt anymore
                this.event_damage = func_null; // won't do anything if hurt
                this.count = 0; // reset counter
-               this.think = func_null;
+               setthink(this, func_null);
                this.nextthink = 0;
                //this.think(); // do the first explosion now
 
@@ -1035,22 +1021,22 @@ void ons_GeneratorDamage(entity this, entity inflictor, entity attacker, float d
        this.SendFlags |= GSF_STATUS;
 }
 
-void ons_GeneratorThink()
-{SELFPARAM();
-       self.nextthink = time + GEN_THINKRATE;
+void ons_GeneratorThink(entity this)
+{
+       this.nextthink = time + GEN_THINKRATE;
        if (!gameover)
        {
-               if(!self.isshielded && self.wait < time)
+               if(!this.isshielded && this.wait < time)
                {
-                       self.wait = time + 5;
+                       this.wait = time + 5;
                        FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it), {
-                               if(SAME_TEAM(it, self))
+                               if(SAME_TEAM(it, this))
                                {
                                        Send_Notification(NOTIF_ONE, it, MSG_CENTER, CENTER_ONS_NOTSHIELDED_TEAM);
                                        soundto(MSG_ONE, it, CHAN_AUTO, SND(KH_ALARM), VOL_BASE, ATTEN_NONE);    // FIXME: unique sound?
                                }
                                else
-                                       Send_Notification(NOTIF_ONE, it, MSG_CENTER, APP_TEAM_NUM(self.team, CENTER_ONS_NOTSHIELDED));
+                                       Send_Notification(NOTIF_ONE, it, MSG_CENTER, APP_TEAM_NUM(this.team, CENTER_ONS_NOTSHIELDED));
                        });
                }
        }
@@ -1066,7 +1052,7 @@ void ons_GeneratorReset(entity this)
        this.islinked = true;
        this.isshielded = true;
        this.event_damage = ons_GeneratorDamage;
-       this.think = ons_GeneratorThink;
+       setthink(this, ons_GeneratorThink);
        this.nextthink = time + GEN_THINKRATE;
 
        Net_LinkEntity(this, false, 0, generator_send);
@@ -1081,8 +1067,8 @@ void ons_GeneratorReset(entity this)
        onslaught_updatelinks();
 }
 
-void ons_DelayedGeneratorSetup()
-{SELFPARAM();
+void ons_DelayedGeneratorSetup(entity this)
+{
        // bot waypoints
        waypoint_spawnforitem_force(self, self.origin);
        self.nearestwaypointtimeout = 0; // activate waypointing again
@@ -1097,8 +1083,8 @@ void ons_DelayedGeneratorSetup()
 }
 
 
-void onslaught_generator_touch()
-{SELFPARAM();
+void onslaught_generator_touch(entity this)
+{
        if ( IS_PLAYER(other) )
        if ( SAME_TEAM(self,other) )
        if ( self.iscaptured )
@@ -1108,10 +1094,9 @@ void onslaught_generator_touch()
 }
 
 void ons_GeneratorSetup(entity gen) // called when spawning a generator entity on the map as a spawnfunc
-{SELFPARAM();
+{
        // declarations
        int teamnumber = gen.team;
-       setself(gen); // for later usage with droptofloor()
 
        // main setup
        gen.ons_worldgeneratornext = ons_worldgeneratorlist; // link generator into ons_worldgeneratorlist
@@ -1127,12 +1112,12 @@ void ons_GeneratorSetup(entity gen) // called when spawning a generator entity o
        gen.bot_attack = true;
        gen.event_damage = ons_GeneratorDamage;
        gen.reset = ons_GeneratorReset;
-       gen.think = ons_GeneratorThink;
+       setthink(gen, ons_GeneratorThink);
        gen.nextthink = time + GEN_THINKRATE;
        gen.iscaptured = true;
        gen.islinked = true;
        gen.isshielded = true;
-       gen.touch = onslaught_generator_touch;
+       settouch(gen, onslaught_generator_touch);
 
        // appearence
        // model handled by CSQC
@@ -1141,14 +1126,13 @@ void ons_GeneratorSetup(entity gen) // called when spawning a generator entity o
        gen.colormap = 1024 + (teamnumber - 1) * 17;
 
        // generator placement
-       setself(gen);
-       droptofloor();
+       droptofloor(gen);
 
        // waypointsprites
-       WaypointSprite_SpawnFixed(WP_Null, self.origin + CPGEN_WAYPOINT_OFFSET, self, sprite, RADARICON_NONE);
-       WaypointSprite_UpdateRule(self.sprite, self.team, SPRITERULE_TEAMPLAY);
-       WaypointSprite_UpdateMaxHealth(self.sprite, self.max_health);
-       WaypointSprite_UpdateHealth(self.sprite, self.health);
+       WaypointSprite_SpawnFixed(WP_Null, gen.origin + CPGEN_WAYPOINT_OFFSET, gen, sprite, RADARICON_NONE);
+       WaypointSprite_UpdateRule(gen.sprite, gen.team, SPRITERULE_TEAMPLAY);
+       WaypointSprite_UpdateMaxHealth(gen.sprite, gen.max_health);
+       WaypointSprite_UpdateHealth(gen.sprite, gen.health);
 
        InitializeEntity(gen, ons_DelayedGeneratorSetup, INITPRIO_SETLOCATION);
 }
@@ -1612,13 +1596,13 @@ void havocbot_ons_reset_role(entity this)
  * Find control point or generator owned by the same team self which is nearest to pos
  * if max_dist is positive, only control points within this range will be considered
  */
-entity ons_Nearest_ControlPoint(vector pos, float max_dist)
-{SELFPARAM();
+entity ons_Nearest_ControlPoint(entity this, vector pos, float max_dist)
+{
        entity tmp_entity, closest_target = world;
        tmp_entity = findchain(classname, "onslaught_controlpoint");
        while(tmp_entity)
        {
-               if(SAME_TEAM(tmp_entity, self))
+               if(SAME_TEAM(tmp_entity, this))
                if(tmp_entity.iscaptured)
                if(max_dist <= 0 || vdist(tmp_entity.origin - pos, <=, max_dist))
                if(vlen2(tmp_entity.origin - pos) <= vlen2(closest_target.origin - pos) || closest_target == world)
@@ -1628,7 +1612,7 @@ entity ons_Nearest_ControlPoint(vector pos, float max_dist)
        tmp_entity = findchain(classname, "onslaught_generator");
        while(tmp_entity)
        {
-               if(SAME_TEAM(tmp_entity, self))
+               if(SAME_TEAM(tmp_entity, this))
                if(max_dist <= 0 || vdist(tmp_entity.origin - pos, <, max_dist))
                if(vlen2(tmp_entity.origin - pos) <= vlen2(closest_target.origin - pos) || closest_target == world)
                        closest_target = tmp_entity;
@@ -1643,8 +1627,8 @@ entity ons_Nearest_ControlPoint(vector pos, float max_dist)
  * if max_dist is positive, only control points within this range will be considered
  * This function only check distances on the XY plane, disregarding Z
  */
-entity ons_Nearest_ControlPoint_2D(vector pos, float max_dist)
-{SELFPARAM();
+entity ons_Nearest_ControlPoint_2D(entity this, vector pos, float max_dist)
+{
        entity tmp_entity, closest_target = world;
        vector delta;
        float smallest_distance = 0, distance;
@@ -1656,7 +1640,7 @@ entity ons_Nearest_ControlPoint_2D(vector pos, float max_dist)
                delta_z = 0;
                distance = vlen(delta);
 
-               if(SAME_TEAM(tmp_entity, self))
+               if(SAME_TEAM(tmp_entity, this))
                if(tmp_entity.iscaptured)
                if(max_dist <= 0 || distance <= max_dist)
                if(closest_target == world || distance <= smallest_distance )
@@ -1674,7 +1658,7 @@ entity ons_Nearest_ControlPoint_2D(vector pos, float max_dist)
                delta_z = 0;
                distance = vlen(delta);
 
-               if(SAME_TEAM(tmp_entity, self))
+               if(SAME_TEAM(tmp_entity, this))
                if(max_dist <= 0 || distance <= max_dist)
                if(closest_target == world || distance <= smallest_distance )
                {
@@ -1771,7 +1755,7 @@ bool ons_Teleport(entity player, entity tele_target, float range, bool tele_effe
 // ==============
 
 MUTATOR_HOOKFUNCTION(ons, reset_map_global)
-{SELFPARAM();
+{
        FOREACH_CLIENT(IS_PLAYER(it), {
                it.ons_roundlost = false;
                it.ons_deathloc = '0 0 0';
@@ -1781,22 +1765,26 @@ MUTATOR_HOOKFUNCTION(ons, reset_map_global)
 }
 
 MUTATOR_HOOKFUNCTION(ons, ClientDisconnect)
-{SELFPARAM();
-       self.ons_deathloc = '0 0 0';
-       return false;
+{
+       entity player = M_ARGV(0, entity);
+
+       player.ons_deathloc = '0 0 0';
 }
 
 MUTATOR_HOOKFUNCTION(ons, MakePlayerObserver)
-{SELFPARAM();
-       self.ons_deathloc = '0 0 0';
-       return false;
+{
+       entity player = M_ARGV(0, entity);
+
+       player.ons_deathloc = '0 0 0';
 }
 
 MUTATOR_HOOKFUNCTION(ons, PlayerSpawn)
-{SELFPARAM();
+{
+       entity player = M_ARGV(0, entity);
+
        if(!round_handler_IsRoundStarted())
        {
-               self.player_blocked = true;
+               player.player_blocked = true;
                return false;
        }
 
@@ -1810,13 +1798,13 @@ MUTATOR_HOOKFUNCTION(ons, PlayerSpawn)
                l.sprite.SendFlags |= 16;
        }
 
-       if(ons_stalemate) { Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_OVERTIME_CONTROLPOINT); }
+       if(ons_stalemate) { Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_OVERTIME_CONTROLPOINT); }
 
        if ( autocvar_g_onslaught_spawn_choose )
-       if ( self.ons_spawn_by )
-       if ( ons_Teleport(self,self.ons_spawn_by,autocvar_g_onslaught_teleport_radius,false) )
+       if ( player.ons_spawn_by )
+       if ( ons_Teleport(player,player.ons_spawn_by,autocvar_g_onslaught_teleport_radius,false) )
        {
-               self.ons_spawn_by = world;
+               player.ons_spawn_by = world;
                return false;
        }
 
@@ -1825,7 +1813,7 @@ MUTATOR_HOOKFUNCTION(ons, PlayerSpawn)
        {
                float random_target = autocvar_g_onslaught_spawn_at_controlpoints_random;
                entity tmp_entity, closest_target = world;
-               vector spawn_loc = self.ons_deathloc;
+               vector spawn_loc = player.ons_deathloc;
 
                // new joining player or round reset, don't bother checking
                if(spawn_loc == '0 0 0') { return false; }
@@ -1834,7 +1822,7 @@ MUTATOR_HOOKFUNCTION(ons, PlayerSpawn)
 
                for(tmp_entity = ons_worldcplist; tmp_entity; tmp_entity = tmp_entity.ons_worldcpnext)
                {
-                       if(SAME_TEAM(tmp_entity, self))
+                       if(SAME_TEAM(tmp_entity, player))
                        if(random_target)
                                RandomSelection_Add(tmp_entity, 0, string_null, 1, 1);
                        else if(vlen(tmp_entity.origin - spawn_loc) <= vlen(closest_target.origin - spawn_loc) || closest_target == world)
@@ -1853,14 +1841,14 @@ MUTATOR_HOOKFUNCTION(ons, PlayerSpawn)
                                iteration_scale -= i / 10;
                                loc = closest_target.origin + '0 0 96' * iteration_scale;
                                loc += ('0 1 0' * random()) * 128 * iteration_scale;
-                               tracebox(loc, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), loc, MOVE_NORMAL, self);
+                               tracebox(loc, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), loc, MOVE_NORMAL, player);
                                if(trace_fraction == 1.0 && !trace_startsolid)
                                {
                                        traceline(closest_target.origin, loc, MOVE_NOMONSTERS, closest_target); // double check to make sure we're not spawning outside the world
                                        if(trace_fraction == 1.0 && !trace_startsolid)
                                        {
-                                               setorigin(self, loc);
-                                               self.angles = normalize(loc - closest_target.origin) * RAD2DEG;
+                                               setorigin(player, loc);
+                                               player.angles = normalize(loc - closest_target.origin) * RAD2DEG;
                                                return false;
                                        }
                                }
@@ -1873,7 +1861,7 @@ MUTATOR_HOOKFUNCTION(ons, PlayerSpawn)
        {
                float random_target = autocvar_g_onslaught_spawn_at_generator_random;
                entity tmp_entity, closest_target = world;
-               vector spawn_loc = self.ons_deathloc;
+               vector spawn_loc = player.ons_deathloc;
 
                // new joining player or round reset, don't bother checking
                if(spawn_loc == '0 0 0') { return false; }
@@ -1886,7 +1874,7 @@ MUTATOR_HOOKFUNCTION(ons, PlayerSpawn)
                                RandomSelection_Add(tmp_entity, 0, string_null, 1, 1);
                        else
                        {
-                               if(SAME_TEAM(tmp_entity, self))
+                               if(SAME_TEAM(tmp_entity, player))
                                if(vlen(tmp_entity.origin - spawn_loc) <= vlen(closest_target.origin - spawn_loc) || closest_target == world)
                                        closest_target = tmp_entity;
                        }
@@ -1904,14 +1892,14 @@ MUTATOR_HOOKFUNCTION(ons, PlayerSpawn)
                                iteration_scale -= i / 10;
                                loc = closest_target.origin + '0 0 128' * iteration_scale;
                                loc += ('0 1 0' * random()) * 256 * iteration_scale;
-                               tracebox(loc, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), loc, MOVE_NORMAL, self);
+                               tracebox(loc, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), loc, MOVE_NORMAL, player);
                                if(trace_fraction == 1.0 && !trace_startsolid)
                                {
                                        traceline(closest_target.origin, loc, MOVE_NOMONSTERS, closest_target); // double check to make sure we're not spawning outside the world
                                        if(trace_fraction == 1.0 && !trace_startsolid)
                                        {
-                                               setorigin(self, loc);
-                                               self.angles = normalize(loc - closest_target.origin) * RAD2DEG;
+                                               setorigin(player, loc);
+                                               player.angles = normalize(loc - closest_target.origin) * RAD2DEG;
                                                return false;
                                        }
                                }
@@ -1924,6 +1912,8 @@ MUTATOR_HOOKFUNCTION(ons, PlayerSpawn)
 
 MUTATOR_HOOKFUNCTION(ons, PlayerDies)
 {
+       entity frag_target = M_ARGV(2, entity);
+
        frag_target.ons_deathloc = frag_target.origin;
        entity l;
        for(l = ons_worldgeneratorlist; l; l = l.ons_worldgeneratornext)
@@ -1951,25 +1941,24 @@ MUTATOR_HOOKFUNCTION(ons, MonsterMove)
        return false;
 }
 
-void ons_MonsterSpawn_Delayed()
-{SELFPARAM();
-       entity e, own = self.owner;
+void ons_MonsterSpawn_Delayed(entity this)
+{
+       entity own = self.owner;
 
-       if(!own) { remove(self); return; }
+       if(!own) { remove(this); return; }
 
        if(own.targetname)
        {
-               e = find(world, target, own.targetname);
+               entity e = find(world, target, own.targetname);
                if(e != world)
                {
                        own.team = e.team;
 
-                       activator = e;
-                       own.use();
+                       own.use(own, e, NULL);
                }
        }
 
-       remove(self);
+       remove(this);
 }
 
 MUTATOR_HOOKFUNCTION(ons, MonsterSpawn)
@@ -1981,32 +1970,33 @@ MUTATOR_HOOKFUNCTION(ons, MonsterSpawn)
        return false;
 }
 
-void ons_TurretSpawn_Delayed()
-{SELFPARAM();
-       entity e, own = self.owner;
+void ons_TurretSpawn_Delayed(entity this)
+{
+       entity own = this.owner;
 
-       if(!own) { remove(self); return; }
+       if(!own) { remove(this); return; }
 
        if(own.targetname)
        {
-               e = find(world, target, own.targetname);
+               entity e = find(world, target, own.targetname);
                if(e != world)
                {
                        own.team = e.team;
                        own.active = ACTIVE_NOT;
 
-                       activator = e;
-                       own.use();
+                       own.use(own, e, NULL);
                }
        }
 
-       remove(self);
+       remove(this);
 }
 
 MUTATOR_HOOKFUNCTION(ons, TurretSpawn)
-{SELFPARAM();
+{
+       entity turret = M_ARGV(0, entity);
+
        entity e = spawn();
-       e.owner = self;
+       e.owner = turret;
        InitializeEntity(e, ons_TurretSpawn_Delayed, INITPRIO_FINDTARGET);
 
        return false;
@@ -2036,19 +2026,25 @@ MUTATOR_HOOKFUNCTION(ons, GetTeamCount)
 }
 
 MUTATOR_HOOKFUNCTION(ons, SpectateCopy)
-{SELFPARAM();
-       self.ons_roundlost = other.ons_roundlost; // make spectators see it too
-       return false;
+{
+       entity spectatee = M_ARGV(0, entity);
+       entity client = M_ARGV(1, entity);
+
+       client.ons_roundlost = spectatee.ons_roundlost; // make spectators see it too
 }
 
 MUTATOR_HOOKFUNCTION(ons, SV_ParseClientCommand)
-{SELFPARAM();
+{
        if(MUTATOR_RETURNVALUE) // command was already handled?
                return false;
 
+       entity player = M_ARGV(0, entity);
+       string cmd_name = M_ARGV(1, string);
+       int cmd_argc = M_ARGV(2, int);
+
        if ( cmd_name == "ons_spawn" )
        {
-               vector pos = self.origin;
+               vector pos = player.origin;
                if(cmd_argc > 1)
                        pos_x = stof(argv(1));
                if(cmd_argc > 2)
@@ -2056,53 +2052,53 @@ MUTATOR_HOOKFUNCTION(ons, SV_ParseClientCommand)
                if(cmd_argc > 3)
                        pos_z = stof(argv(3));
 
-               if ( IS_PLAYER(self) )
+               if ( IS_PLAYER(player) )
                {
-                       if ( !STAT(FROZEN, self) )
+                       if ( !STAT(FROZEN, player) )
                        {
-                               entity source_point = ons_Nearest_ControlPoint(self.origin, autocvar_g_onslaught_teleport_radius);
+                               entity source_point = ons_Nearest_ControlPoint(player, player.origin, autocvar_g_onslaught_teleport_radius);
 
-                               if ( !source_point && self.health > 0 )
+                               if ( !source_point && player.health > 0 )
                                {
-                                       sprint(self, "\nYou need to be next to a control point\n");
-                                       return 1;
+                                       sprint(player, "\nYou need to be next to a control point\n");
+                                       return true;
                                }
 
 
-                               entity closest_target = ons_Nearest_ControlPoint_2D(pos, autocvar_g_onslaught_click_radius);
+                               entity closest_target = ons_Nearest_ControlPoint_2D(player, pos, autocvar_g_onslaught_click_radius);
 
                                if ( closest_target == world )
                                {
-                                       sprint(self, "\nNo control point found\n");
-                                       return 1;
+                                       sprint(player, "\nNo control point found\n");
+                                       return true;
                                }
 
-                               if ( self.health <= 0 )
+                               if ( player.health <= 0 )
                                {
-                                       self.ons_spawn_by = closest_target;
-                                       self.respawn_flags = self.respawn_flags | RESPAWN_FORCE;
+                                       player.ons_spawn_by = closest_target;
+                                       player.respawn_flags = player.respawn_flags | RESPAWN_FORCE;
                                }
                                else
                                {
                                        if ( source_point == closest_target )
                                        {
-                                               sprint(self, "\nTeleporting to the same point\n");
-                                               return 1;
+                                               sprint(player, "\nTeleporting to the same point\n");
+                                               return true;
                                        }
 
-                                       if ( !ons_Teleport(self,closest_target,autocvar_g_onslaught_teleport_radius,true) )
-                                               sprint(self, "\nUnable to teleport there\n");
+                                       if ( !ons_Teleport(player,closest_target,autocvar_g_onslaught_teleport_radius,true) )
+                                               sprint(player, "\nUnable to teleport there\n");
                                }
 
-                               return 1;
+                               return true;
                        }
 
-                       sprint(self, "\nNo teleportation for you\n");
+                       sprint(player, "\nNo teleportation for you\n");
                }
 
-               return 1;
+               return true;
        }
-       return 0;
+       return false;
 }
 
 MUTATOR_HOOKFUNCTION(ons, PlayerUseKey)
@@ -2111,7 +2107,7 @@ MUTATOR_HOOKFUNCTION(ons, PlayerUseKey)
 
        if((time > self.teleport_antispam) && (!IS_DEAD(self)) && !self.vehicle)
        {
-               entity source_point = ons_Nearest_ControlPoint(self.origin, autocvar_g_onslaught_teleport_radius);
+               entity source_point = ons_Nearest_ControlPoint(self, self.origin, autocvar_g_onslaught_teleport_radius);
                if ( source_point )
                {
                        stuffcmd(self, "qc_cmd_cl hud clickradar\n");
@@ -2124,6 +2120,8 @@ MUTATOR_HOOKFUNCTION(ons, PlayerUseKey)
 
 MUTATOR_HOOKFUNCTION(ons, PlayHitsound)
 {
+       entity frag_victim = M_ARGV(0, entity);
+
        return (frag_victim.classname == "onslaught_generator" && !frag_victim.isshielded)
                || (frag_victim.classname == "onslaught_controlpoint_icon" && !frag_victim.owner.isshielded);
 }
@@ -2153,9 +2151,11 @@ MUTATOR_HOOKFUNCTION(ons, SendWaypoint)
 
 MUTATOR_HOOKFUNCTION(ons, TurretValidateTarget)
 {
+       entity turret_target = M_ARGV(1, entity);
+
        if(substring(turret_target.classname, 0, 10) == "onslaught_") // don't attack onslaught targets, that's the player's job!
        {
-               ret_float = -3;
+               M_ARGV(3, float) = -3;
                return true;
        }
 
@@ -2174,7 +2174,7 @@ MUTATOR_HOOKFUNCTION(ons, TurretThink)
        }
 
        if(self.team != self.tur_head.team)
-               turret_respawn();
+               turret_respawn(self);
 
        return false;
 }
@@ -2195,16 +2195,16 @@ keys:
  */
 spawnfunc(onslaught_link)
 {
-       if(!g_onslaught) { remove(self); return; }
+       if(!g_onslaught) { remove(this); return; }
 
-       if (self.target == "" || self.target2 == "")
+       if (this.target == "" || this.target2 == "")
                objerror("target and target2 must be set\n");
 
-       self.ons_worldlinknext = ons_worldlinklist; // link into ons_worldlinklist
-       ons_worldlinklist = self;
+       this.ons_worldlinknext = ons_worldlinklist; // link into ons_worldlinklist
+       ons_worldlinklist = this;
 
-       InitializeEntity(self, ons_DelayedLinkSetup, INITPRIO_FINDTARGET);
-       Net_LinkEntity(self, false, 0, ons_Link_Send);
+       InitializeEntity(this, ons_DelayedLinkSetup, INITPRIO_FINDTARGET);
+       Net_LinkEntity(this, false, 0, ons_Link_Send);
 }
 
 /*QUAKED spawnfunc_onslaught_controlpoint (0 .5 .8) (-32 -32 0) (32 32 128)
@@ -2220,9 +2220,9 @@ keys:
 
 spawnfunc(onslaught_controlpoint)
 {
-       if(!g_onslaught) { remove(self); return; }
+       if(!g_onslaught) { remove(this); return; }
 
-       ons_ControlPoint_Setup(self);
+       ons_ControlPoint_Setup(this);
 }
 
 /*QUAKED spawnfunc_onslaught_generator (0 .5 .8) (-32 -32 -24) (32 32 64)
@@ -2236,10 +2236,10 @@ keys:
  */
 spawnfunc(onslaught_generator)
 {
-       if(!g_onslaught) { remove(self); return; }
-       if(!self.team) { objerror("team must be set"); }
+       if(!g_onslaught) { remove(this); return; }
+       if(!this.team) { objerror("team must be set"); }
 
-       ons_GeneratorSetup(self);
+       ons_GeneratorSetup(this);
 }
 
 // scoreboard setup
@@ -2253,7 +2253,7 @@ void ons_ScoreRules()
        ScoreRules_basics_end();
 }
 
-void ons_DelayedInit() // Do this check with a delay so we can wait for teams to be set up
+void ons_DelayedInit(entity this) // Do this check with a delay so we can wait for teams to be set up
 {
        ons_ScoreRules();