]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/mutators/mutator/buffs/buffs.qc
Kill the ret_string global
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / mutators / mutator / buffs / buffs.qc
index 731b10ce97277d50b9903bda294076205fdb350c..492c657d87886d07dd289c4dc53c030355c36b1e 100644 (file)
@@ -505,13 +505,17 @@ float buff_Inferno_CalculateTime(float x, float offset_x, float offset_y, float
 // mutator hooks
 MUTATOR_HOOKFUNCTION(buffs, PlayerDamage_SplitHealthArmor)
 {
+       entity frag_target = M_ARGV(2, entity);
+       float frag_deathtype = M_ARGV(6, float);
+       float frag_damage = M_ARGV(7, float);
+
        if(frag_deathtype == DEATH_BUFF.m_id) { return false; }
 
        if(frag_target.buffs & BUFF_RESISTANCE.m_itemid)
        {
                vector v = healtharmor_applydamage(50, autocvar_g_buffs_resistance_blockpercent, frag_deathtype, frag_damage);
-               damage_take = v.x;
-               damage_save = v.y;
+               M_ARGV(4, float) = v.x; // take
+               M_ARGV(5, float) = v.y; // save
        }
 
        return false;
@@ -519,6 +523,12 @@ MUTATOR_HOOKFUNCTION(buffs, PlayerDamage_SplitHealthArmor)
 
 MUTATOR_HOOKFUNCTION(buffs, PlayerDamage_Calculate)
 {
+       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(frag_deathtype == DEATH_BUFF.m_id) { return false; }
 
        if(frag_target.buffs & BUFF_SPEED.m_itemid)
@@ -608,15 +618,20 @@ MUTATOR_HOOKFUNCTION(buffs, PlayerDamage_Calculate)
                        frag_attacker.armorvalue = bound(0, frag_attacker.armorvalue + bound(0, frag_damage * autocvar_g_buffs_vampire_damage_steal, frag_target.armorvalue), g_pickup_armorsmall_max);
        }
 
+       M_ARGV(4, float) = frag_damage;
+       M_ARGV(6, vector) = frag_force;
+
        return false;
 }
 
-MUTATOR_HOOKFUNCTION(buffs,PlayerSpawn)
-{SELFPARAM();
-       self.buffs = 0;
+MUTATOR_HOOKFUNCTION(buffs, PlayerSpawn)
+{
+       entity player = M_ARGV(0, entity);
+
+       player.buffs = 0;
        // reset timers here to prevent them continuing after re-spawn
-       self.buff_disability_time = 0;
-       self.buff_disability_effect_time = 0;
+       player.buff_disability_time = 0;
+       player.buff_disability_effect_time = 0;
        return false;
 }
 
@@ -656,18 +671,20 @@ MUTATOR_HOOKFUNCTION(buffs, PlayerJump)
 }
 
 MUTATOR_HOOKFUNCTION(buffs, MonsterMove)
-{SELFPARAM();
-       if(time < self.buff_disability_time)
+{
+       entity mon = M_ARGV(0, entity);
+
+       if(time < mon.buff_disability_time)
        {
-               monster_speed_walk *= autocvar_g_buffs_disability_speed;
-               monster_speed_run *= autocvar_g_buffs_disability_speed;
+               M_ARGV(1, float) *= autocvar_g_buffs_disability_speed; // run speed
+               M_ARGV(2, float) *= autocvar_g_buffs_disability_speed; // walk speed
        }
-
-       return false;
 }
 
 MUTATOR_HOOKFUNCTION(buffs, PlayerDies)
 {
+       entity frag_target = M_ARGV(2, entity);
+       
        if(frag_target.buffs)
        {
                int buffid = buff_FirstFromFlags(frag_target.buffs).m_id;
@@ -700,18 +717,19 @@ MUTATOR_HOOKFUNCTION(buffs, PlayerUseKey, CBC_ORDER_FIRST)
 }
 
 MUTATOR_HOOKFUNCTION(buffs, ForbidThrowCurrentWeapon)
-{SELFPARAM();
+{
        if(MUTATOR_RETURNVALUE || gameover) { return false; }
+       entity player = M_ARGV(0, entity);
 
-       if(self.buffs & BUFF_SWAPPER.m_itemid)
+       if(player.buffs & BUFF_SWAPPER.m_itemid)
        {
                float best_distance = autocvar_g_buffs_swapper_range;
                entity closest = world;
                FOREACH_CLIENT(IS_PLAYER(it), LAMBDA(
                        if(!IS_DEAD(it) && !STAT(FROZEN, it) && !it.vehicle)
-                       if(DIFF_TEAM(it, self))
+                       if(DIFF_TEAM(it, player))
                        {
-                               float test = vlen2(self.origin - it.origin);
+                               float test = vlen2(player.origin - it.origin);
                                if(test <= best_distance * best_distance)
                                {
                                        best_distance = sqrt(test);
@@ -724,18 +742,18 @@ MUTATOR_HOOKFUNCTION(buffs, ForbidThrowCurrentWeapon)
                {
                        vector my_org, my_vel, my_ang, their_org, their_vel, their_ang;
 
-                       my_org = self.origin;
-                       my_vel = self.velocity;
-                       my_ang = self.angles;
+                       my_org = player.origin;
+                       my_vel = player.velocity;
+                       my_ang = player.angles;
                        their_org = closest.origin;
                        their_vel = closest.velocity;
                        their_ang = closest.angles;
 
                        Drop_Special_Items(closest);
 
-                       MUTATOR_CALLHOOK(PortalTeleport, self); // initiate flag dropper
+                       MUTATOR_CALLHOOK(PortalTeleport, player); // initiate flag dropper
 
-                       setorigin(self, their_org);
+                       setorigin(player, their_org);
                        setorigin(closest, my_org);
 
                        closest.velocity = my_vel;
@@ -743,25 +761,25 @@ MUTATOR_HOOKFUNCTION(buffs, ForbidThrowCurrentWeapon)
                        closest.fixangle = true;
                        closest.oldorigin = my_org;
                        closest.oldvelocity = my_vel;
-                       self.velocity = their_vel;
-                       self.angles = their_ang;
-                       self.fixangle = true;
-                       self.oldorigin = their_org;
-                       self.oldvelocity = their_vel;
-
-                       // set pusher so self gets the kill if they fall into void
-                       closest.pusher = self;
+                       player.velocity = their_vel;
+                       player.angles = their_ang;
+                       player.fixangle = true;
+                       player.oldorigin = their_org;
+                       player.oldvelocity = their_vel;
+
+                       // set pusher so player gets the kill if they fall into void
+                       closest.pusher = player;
                        closest.pushltime = time + autocvar_g_maxpushtime;
                        closest.istypefrag = PHYS_INPUT_BUTTON_CHAT(closest);
 
                        Send_Effect(EFFECT_ELECTRO_COMBO, their_org, '0 0 0', 1);
                        Send_Effect(EFFECT_ELECTRO_COMBO, my_org, '0 0 0', 1);
 
-                       sound(self, CH_TRIGGER, SND_KA_RESPAWN, VOL_BASE, ATTEN_NORM);
+                       sound(player, CH_TRIGGER, SND_KA_RESPAWN, VOL_BASE, ATTEN_NORM);
                        sound(closest, CH_TRIGGER, SND_KA_RESPAWN, VOL_BASE, ATTEN_NORM);
 
                        // TODO: add a counter to handle how many times one can teleport, and a delay to prevent spam
-                       self.buffs = 0;
+                       player.buffs = 0;
                        return true;
                }
        }
@@ -782,32 +800,37 @@ bool buffs_RemovePlayer(entity player)
 
        return false;
 }
-MUTATOR_HOOKFUNCTION(buffs, MakePlayerObserver) { SELFPARAM(); return buffs_RemovePlayer(self); }
-MUTATOR_HOOKFUNCTION(buffs, ClientDisconnect) { SELFPARAM(); return buffs_RemovePlayer(self); }
+MUTATOR_HOOKFUNCTION(buffs, MakePlayerObserver) { entity player = M_ARGV(0, entity); return buffs_RemovePlayer(player); }
+MUTATOR_HOOKFUNCTION(buffs, ClientDisconnect) { entity player = M_ARGV(0, entity); return buffs_RemovePlayer(player); }
 
 MUTATOR_HOOKFUNCTION(buffs, CustomizeWaypoint)
-{SELFPARAM();
-       entity e = WaypointSprite_getviewentity(other);
+{
+       entity wp = M_ARGV(0, entity);
+       entity player = M_ARGV(1, entity);
+
+       entity e = WaypointSprite_getviewentity(player);
 
        // if you have the invisibility powerup, sprites ALWAYS are restricted to your team
        // but only apply this to real players, not to spectators
-       if((self.owner.flags & FL_CLIENT) && (self.owner.buffs & BUFF_INVISIBLE.m_itemid) && (e == other))
-       if(DIFF_TEAM(self.owner, e))
+       if((wp.owner.flags & FL_CLIENT) && (wp.owner.buffs & BUFF_INVISIBLE.m_itemid) && (e == player))
+       if(DIFF_TEAM(wp.owner, e))
                return true;
 
        return false;
 }
 
 MUTATOR_HOOKFUNCTION(buffs, OnEntityPreSpawn, CBC_ORDER_LAST)
-{SELFPARAM();
+{
+       entity ent = M_ARGV(0, entity);
+
        if(autocvar_g_buffs_replace_powerups)
-       switch(self.classname)
+       switch(ent.classname)
        {
                case "item_strength":
                case "item_invincible":
                {
                        entity e = spawn();
-                       buff_SpawnReplacement(e, self);
+                       buff_SpawnReplacement(e, ent);
                        return true;
                }
        }
@@ -815,25 +838,25 @@ MUTATOR_HOOKFUNCTION(buffs, OnEntityPreSpawn, CBC_ORDER_LAST)
 }
 
 MUTATOR_HOOKFUNCTION(buffs, WeaponRateFactor)
-{SELFPARAM();
-       if(self.buffs & BUFF_SPEED.m_itemid)
-               weapon_rate *= autocvar_g_buffs_speed_rate;
+{
+       entity player = M_ARGV(1, entity);
 
-       if(time < self.buff_disability_time)
-               weapon_rate *= autocvar_g_buffs_disability_rate;
+       if(player.buffs & BUFF_SPEED.m_itemid)
+               M_ARGV(0, float) *= autocvar_g_buffs_speed_rate;
 
-       return false;
+       if(time < player.buff_disability_time)
+               M_ARGV(0, float) *= autocvar_g_buffs_disability_rate;
 }
 
 MUTATOR_HOOKFUNCTION(buffs, WeaponSpeedFactor)
-{SELFPARAM();
-       if(self.buffs & BUFF_SPEED.m_itemid)
-               ret_float *= autocvar_g_buffs_speed_weaponspeed;
+{
+       entity player = M_ARGV(1, entity);
 
-       if(time < self.buff_disability_time)
-               ret_float *= autocvar_g_buffs_disability_weaponspeed;
+       if(player.buffs & BUFF_SPEED.m_itemid)
+               M_ARGV(0, float) *= autocvar_g_buffs_speed_weaponspeed;
 
-       return false;
+       if(time < player.buff_disability_time)
+               M_ARGV(0, float) *= autocvar_g_buffs_disability_weaponspeed;
 }
 
 MUTATOR_HOOKFUNCTION(buffs, PlayerPreThink)
@@ -989,27 +1012,33 @@ MUTATOR_HOOKFUNCTION(buffs, PlayerPreThink)
 }
 
 MUTATOR_HOOKFUNCTION(buffs, SpectateCopy)
-{SELFPARAM();
-       self.buffs = other.buffs;
-       return false;
+{
+       entity spectatee = M_ARGV(0, entity);
+       entity client = M_ARGV(1, entity);
+
+       client.buffs = spectatee.buffs;
 }
 
 MUTATOR_HOOKFUNCTION(buffs, VehicleEnter)
 {
-       vh_vehicle.buffs = vh_player.buffs;
-       vh_player.buffs = 0;
-       vh_vehicle.buff_time = max(0, vh_player.buff_time - time);
-       vh_player.buff_time = 0;
-       return false;
+       entity player = M_ARGV(0, entity);
+       entity veh = M_ARGV(1, entity);
+
+       veh.buffs = player.buffs;
+       player.buffs = 0;
+       veh.buff_time = max(0, player.buff_time - time);
+       player.buff_time = 0;
 }
 
 MUTATOR_HOOKFUNCTION(buffs, VehicleExit)
 {
-       vh_player.buffs = vh_player.oldbuffs = vh_vehicle.buffs;
-       vh_vehicle.buffs = 0;
-       vh_player.buff_time = time + vh_vehicle.buff_time;
-       vh_vehicle.buff_time = 0;
-       return false;
+       entity player = M_ARGV(0, entity);
+       entity veh = M_ARGV(1, entity);
+
+       player.buffs = player.oldbuffs = veh.buffs;
+       veh.buffs = 0;
+       player.buff_time = time + veh.buff_time;
+       veh.buff_time = 0;
 }
 
 MUTATOR_HOOKFUNCTION(buffs, PlayerRegen)
@@ -1031,14 +1060,12 @@ REPLICATE(cvar_cl_buffs_autoreplace, bool, "cl_buffs_autoreplace");
 
 MUTATOR_HOOKFUNCTION(buffs, BuildMutatorsString)
 {
-       ret_string = strcat(ret_string, ":Buffs");
-       return false;
+       M_ARGV(0, string) = strcat(M_ARGV(0, string), ":Buffs");
 }
 
 MUTATOR_HOOKFUNCTION(buffs, BuildMutatorsPrettyString)
 {
-       ret_string = strcat(ret_string, ", Buffs");
-       return false;
+       M_ARGV(0, string) = strcat(M_ARGV(0, string), ", Buffs");
 }
 
 void buffs_DelayedInit(entity this)