]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/turrets/sv_turrets.qc
Merge branch 'master' into Mario/fullbright_skins
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / turrets / sv_turrets.qc
index a06fbcbb96392c24fdc53b5b07573a4c48167318..57bb008fcdb133516ec9e0ca0c1ebbdf57a54678 100644 (file)
@@ -2,41 +2,41 @@
 #include <server/autocvars.qh>
 
 // Generic aiming
-vector turret_aim_generic()
-{SELFPARAM();
+vector turret_aim_generic(entity this)
+{
 
        vector pre_pos, prep;
        float distance, impact_time = 0, i, mintime;
 
-       turret_tag_fire_update();
+       turret_tag_fire_update(this);
 
-       if(self.aim_flags & TFL_AIM_SIMPLE)
-               return real_origin(self.enemy);
+       if(this.aim_flags & TFL_AIM_SIMPLE)
+               return real_origin(this.enemy);
 
-       mintime = max(self.attack_finished_single[0] - time,0) + sys_frametime;
+       mintime = max(this.attack_finished_single[0] - time,0) + sys_frametime;
 
        // Baseline
-       pre_pos = real_origin(self.enemy);
+       pre_pos = real_origin(this.enemy);
 
        // Lead?
-       if (self.aim_flags & TFL_AIM_LEAD)
+       if (this.aim_flags & TFL_AIM_LEAD)
        {
-               if (self.aim_flags & TFL_AIM_SHOTTIMECOMPENSATE)           // Need to conpensate for shot traveltime
+               if (this.aim_flags & TFL_AIM_SHOTTIMECOMPENSATE)           // Need to conpensate for shot traveltime
                {
                        prep = pre_pos;
 
-                       distance = vlen(prep - self.tur_shotorg);
-                       impact_time = distance / self.shot_speed;
+                       distance = vlen(prep - this.tur_shotorg);
+                       impact_time = distance / this.shot_speed;
 
-                       prep = pre_pos + (self.enemy.velocity * (impact_time + mintime));
+                       prep = pre_pos + (this.enemy.velocity * (impact_time + mintime));
 
-                       if(self.aim_flags & TFL_AIM_ZPREDICT)
-                       if(!IS_ONGROUND(self.enemy))
-                       if(self.enemy.movetype == MOVETYPE_WALK || self.enemy.movetype == MOVETYPE_TOSS || self.enemy.movetype == MOVETYPE_BOUNCE)
+                       if(this.aim_flags & TFL_AIM_ZPREDICT)
+                       if(!IS_ONGROUND(this.enemy))
+                       if(this.enemy.movetype == MOVETYPE_WALK || this.enemy.movetype == MOVETYPE_TOSS || this.enemy.movetype == MOVETYPE_BOUNCE)
                        {
                                float vz;
                                prep_z = pre_pos_z;
-                               vz = self.enemy.velocity_z;
+                               vz = this.enemy.velocity_z;
                                for(i = 0; i < impact_time; i += sys_frametime)
                                {
                                        vz = vz - (autocvar_sv_gravity * sys_frametime);
@@ -46,13 +46,13 @@ vector turret_aim_generic()
                        pre_pos = prep;
                }
                else
-                       pre_pos = pre_pos + self.enemy.velocity * mintime;
+                       pre_pos = pre_pos + this.enemy.velocity * mintime;
        }
 
-       if(self.aim_flags & TFL_AIM_SPLASH)
+       if(this.aim_flags & TFL_AIM_SPLASH)
        {
-               //tracebox(pre_pos + '0 0 32',self.enemy.mins,self.enemy.maxs,pre_pos -'0 0 64',MOVE_WORLDONLY,self.enemy);
-               traceline(pre_pos + '0 0 32',pre_pos -'0 0 64',MOVE_WORLDONLY,self.enemy);
+               //tracebox(pre_pos + '0 0 32',this.enemy.mins,this.enemy.maxs,pre_pos -'0 0 64',MOVE_WORLDONLY,this.enemy);
+               traceline(pre_pos + '0 0 32',pre_pos -'0 0 64',MOVE_WORLDONLY,this.enemy);
                if(trace_fraction != 1.0)
                        pre_pos = trace_endpos;
        }
@@ -164,46 +164,46 @@ float turret_targetscore_generic(entity _turret, entity _target)
 }
 
 // Generic damage handling
-void turret_hide()
-{SELFPARAM();
-       self.effects   |= EF_NODRAW;
-       self.nextthink = time + self.respawntime - 0.2;
-       self.think       = turret_respawn;
+void turret_hide(entity this)
+{
+       this.effects   |= EF_NODRAW;
+       this.nextthink = time + this.respawntime - 0.2;
+       setthink(this, turret_respawn);
 }
 
-void turret_die()
-{SELFPARAM();
-       self.deadflag             = DEAD_DEAD;
-       self.tur_head.deadflag = self.deadflag;
+void turret_die(entity this)
+{
+       this.deadflag             = DEAD_DEAD;
+       this.tur_head.deadflag = this.deadflag;
 
 // Unsolidify and hide real parts
-       self.solid                       = SOLID_NOT;
-       self.tur_head.solid      = self.solid;
+       this.solid                       = SOLID_NOT;
+       this.tur_head.solid      = this.solid;
 
-       self.event_damage                 = func_null;
-       self.takedamage                  = DAMAGE_NO;
+       this.event_damage                 = func_null;
+       this.takedamage                  = DAMAGE_NO;
 
-       self.health                      = 0;
+       this.health                      = 0;
 
 // Go boom
-       //RadiusDamage (self,self, min(self.ammo,50),min(self.ammo,50) * 0.25,250,world,min(self.ammo,50)*5,DEATH_TURRET,world);
+       //RadiusDamage (this,this, min(this.ammo,50),min(this.ammo,50) * 0.25,250,NULL,min(this.ammo,50)*5,DEATH_TURRET,NULL);
 
-       Turret tur = get_turretinfo(self.m_id);
-       if(self.damage_flags & TFL_DMG_DEATH_NORESPAWN)
+       Turret tur = get_turretinfo(this.m_id);
+       if(this.damage_flags & TFL_DMG_DEATH_NORESPAWN)
        {
-               tur.tr_death(tur, self);
+               tur.tr_death(tur, this);
 
-               remove(self.tur_head);
-               remove(self);
+               remove(this.tur_head);
+               remove(this);
        }
        else
        {
                // Setup respawn
-               self.SendFlags    |= TNSF_STATUS;
-               self.nextthink   = time + 0.2;
-               self.think               = turret_hide;
+               this.SendFlags    |= TNSF_STATUS;
+               this.nextthink   = time + 0.2;
+               setthink(this, turret_hide);
 
-               tur.tr_death(tur, self);
+               tur.tr_death(tur, this);
        }
 }
 
@@ -245,57 +245,57 @@ void turret_damage(entity this, entity inflictor, entity attacker, float damage,
                this.tur_head.event_damage = func_null;
                this.takedamage                  = DAMAGE_NO;
                this.nextthink = time;
-               this.think = turret_die;
+               setthink(this, turret_die);
        }
 
        this.SendFlags  |= TNSF_STATUS;
 }
 
-void() turret_think;
-void turret_respawn()
-{SELFPARAM();
+void turret_think(entity this);
+void turret_respawn(entity this)
+{
        // Make sure all parts belong to the same team since
        // this function doubles as "teamchange" function.
-       self.tur_head.team      = self.team;
-       self.effects                       &= ~EF_NODRAW;
-       self.deadflag                           = DEAD_NO;
-       self.effects                            = EF_LOWPRECISION;
-       self.solid                                      = SOLID_BBOX;
-       self.takedamage                         = DAMAGE_AIM;
-       self.event_damage                       = turret_damage;
-       self.avelocity                          = '0 0 0';
-       self.tur_head.avelocity         = self.avelocity;
-       self.tur_head.angles            = self.idle_aim;
-       self.health                                     = self.max_health;
-       self.enemy                                      = world;
-       self.volly_counter                      = self.shot_volly;
-       self.ammo                                       = self.ammo_max;
-
-       self.nextthink = time + self.ticrate;
-       self.think       = turret_think;
-
-       self.SendFlags = TNSF_FULL_UPDATE;
-
-       Turret tur = get_turretinfo(self.m_id);
-       tur.tr_setup(tur, self);
+       this.tur_head.team      = this.team;
+       this.effects                       &= ~EF_NODRAW;
+       this.deadflag                           = DEAD_NO;
+       this.effects                            = EF_LOWPRECISION;
+       this.solid                                      = SOLID_BBOX;
+       this.takedamage                         = DAMAGE_AIM;
+       this.event_damage                       = turret_damage;
+       this.avelocity                          = '0 0 0';
+       this.tur_head.avelocity         = this.avelocity;
+       this.tur_head.angles            = this.idle_aim;
+       this.health                                     = this.max_health;
+       this.enemy                                      = NULL;
+       this.volly_counter                      = this.shot_volly;
+       this.ammo                                       = this.ammo_max;
+
+       this.nextthink = time + this.ticrate;
+       setthink(this, turret_think);
+
+       this.SendFlags = TNSF_FULL_UPDATE;
+
+       Turret tur = get_turretinfo(this.m_id);
+       tur.tr_setup(tur, this);
 }
 
 
 // Main functions
 #define cvar_base "g_turrets_unit_"
 .float clientframe;
-void turrets_setframe(float _frame, float client_only)
-{SELFPARAM();
-       if((client_only ? self.clientframe : self.frame ) != _frame)
+void turrets_setframe(entity this, float _frame, float client_only)
+{
+       if((client_only ? this.clientframe : this.frame ) != _frame)
        {
-               self.SendFlags |= TNSF_ANIM;
-               self.anim_start_time = time;
+               this.SendFlags |= TNSF_ANIM;
+               this.anim_start_time = time;
        }
 
         if(client_only)
-               self.clientframe = _frame;
+               this.clientframe = _frame;
        else
-               self.frame = _frame;
+               this.frame = _frame;
 
 }
 
@@ -306,66 +306,66 @@ bool turret_send(entity this, entity to, float sf)
        WriteByte(MSG_ENTITY, sf);
        if(sf & TNSF_SETUP)
        {
-               WriteByte(MSG_ENTITY, self.m_id);
+               WriteByte(MSG_ENTITY, this.m_id);
 
-               WriteCoord(MSG_ENTITY, self.origin_x);
-               WriteCoord(MSG_ENTITY, self.origin_y);
-               WriteCoord(MSG_ENTITY, self.origin_z);
+               WriteCoord(MSG_ENTITY, this.origin_x);
+               WriteCoord(MSG_ENTITY, this.origin_y);
+               WriteCoord(MSG_ENTITY, this.origin_z);
 
-               WriteAngle(MSG_ENTITY, self.angles_x);
-               WriteAngle(MSG_ENTITY, self.angles_y);
+               WriteAngle(MSG_ENTITY, this.angles_x);
+               WriteAngle(MSG_ENTITY, this.angles_y);
        }
 
        if(sf & TNSF_ANG)
        {
-               WriteShort(MSG_ENTITY, rint(self.tur_head.angles_x));
-               WriteShort(MSG_ENTITY, rint(self.tur_head.angles_y));
+               WriteShort(MSG_ENTITY, rint(this.tur_head.angles_x));
+               WriteShort(MSG_ENTITY, rint(this.tur_head.angles_y));
        }
 
        if(sf & TNSF_AVEL)
        {
-               WriteShort(MSG_ENTITY, rint(self.tur_head.avelocity_x));
-               WriteShort(MSG_ENTITY, rint(self.tur_head.avelocity_y));
+               WriteShort(MSG_ENTITY, rint(this.tur_head.avelocity_x));
+               WriteShort(MSG_ENTITY, rint(this.tur_head.avelocity_y));
        }
 
        if(sf & TNSF_MOVE)
        {
-               WriteShort(MSG_ENTITY, rint(self.origin_x));
-               WriteShort(MSG_ENTITY, rint(self.origin_y));
-               WriteShort(MSG_ENTITY, rint(self.origin_z));
+               WriteShort(MSG_ENTITY, rint(this.origin_x));
+               WriteShort(MSG_ENTITY, rint(this.origin_y));
+               WriteShort(MSG_ENTITY, rint(this.origin_z));
 
-               WriteShort(MSG_ENTITY, rint(self.velocity_x));
-               WriteShort(MSG_ENTITY, rint(self.velocity_y));
-               WriteShort(MSG_ENTITY, rint(self.velocity_z));
+               WriteShort(MSG_ENTITY, rint(this.velocity_x));
+               WriteShort(MSG_ENTITY, rint(this.velocity_y));
+               WriteShort(MSG_ENTITY, rint(this.velocity_z));
 
-               WriteShort(MSG_ENTITY, rint(self.angles_y));
+               WriteShort(MSG_ENTITY, rint(this.angles_y));
        }
 
        if(sf & TNSF_ANIM)
        {
-               WriteCoord(MSG_ENTITY, self.anim_start_time);
-               WriteByte(MSG_ENTITY, self.frame);
+               WriteCoord(MSG_ENTITY, this.anim_start_time);
+               WriteByte(MSG_ENTITY, this.frame);
        }
 
        if(sf & TNSF_STATUS)
        {
-               WriteByte(MSG_ENTITY, self.team);
+               WriteByte(MSG_ENTITY, this.team);
 
-               if(self.health <= 0)
+               if(this.health <= 0)
                        WriteByte(MSG_ENTITY, 0);
                else
-                       WriteByte(MSG_ENTITY, ceil((self.health / self.max_health) * 255));
+                       WriteByte(MSG_ENTITY, ceil((this.health / this.max_health) * 255));
        }
 
        return true;
 }
 
 void load_unit_settings(entity ent, bool is_reload)
-{SELFPARAM();
+{
        string unitname = ent.netname;
        string sbase;
 
-       if (ent == world)
+       if (ent == NULL)
                return;
 
        if(!ent.turret_scale_damage)    ent.turret_scale_damage = 1;
@@ -379,7 +379,7 @@ void load_unit_settings(entity ent, bool is_reload)
        sbase = strcat(cvar_base,unitname);
        if (is_reload)
        {
-               ent.enemy = world;
+               ent.enemy = NULL;
                ent.tur_head.avelocity = '0 0 0';
 
                ent.tur_head.angles = '0 0 0';
@@ -422,31 +422,31 @@ void load_unit_settings(entity ent, bool is_reload)
        ent.track_blendrate  = cvar(strcat(sbase,"_track_blendrate"));
 
        if(is_reload) {
-               Turret tur = get_turretinfo(self.m_id);
-               tur.tr_setup(tur, self);
+               Turret tur = get_turretinfo(ent.m_id);
+               tur.tr_setup(tur, ent);
        }
 }
 
-void turret_projectile_explode()
-{SELFPARAM();
+void turret_projectile_explode(entity this)
+{
 
-       self.takedamage = DAMAGE_NO;
-       self.event_damage = func_null;
+       this.takedamage = DAMAGE_NO;
+       this.event_damage = func_null;
 #ifdef TURRET_DEBUG
        float d;
-       d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, self, world, self.owner.shot_force, self.totalfrags, world);
-       self.owner.tur_debug_dmg_t_h = self.owner.tur_debug_dmg_t_h + d;
-       self.owner.tur_debug_dmg_t_f = self.owner.tur_debug_dmg_t_f + self.owner.shot_dmg;
+       d = RadiusDamage (this, this.owner, this.owner.shot_dmg, 0, this.owner.shot_radius, this, NULL, this.owner.shot_force, this.totalfrags, NULL);
+       this.owner.tur_debug_dmg_t_h = this.owner.tur_debug_dmg_t_h + d;
+       this.owner.tur_debug_dmg_t_f = this.owner.tur_debug_dmg_t_f + this.owner.shot_dmg;
 #else
-       RadiusDamage (self, self.realowner, self.owner.shot_dmg, 0, self.owner.shot_radius, self, world, self.owner.shot_force, self.totalfrags, world);
+       RadiusDamage (this, this.realowner, this.owner.shot_dmg, 0, this.owner.shot_radius, this, NULL, this.owner.shot_force, this.totalfrags, NULL);
 #endif
-       remove(self);
+       remove(this);
 }
 
-void turret_projectile_touch()
+void turret_projectile_touch(entity this)
 {
-       PROJECTILE_TOUCH;
-       turret_projectile_explode();
+       PROJECTILE_TOUCH(this);
+       turret_projectile_explode(this);
 }
 
 void turret_projectile_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector vforce)
@@ -455,28 +455,29 @@ void turret_projectile_damage(entity this, entity inflictor, entity attacker, fl
        this.health     -= damage;
        //this.realowner = attacker; // Dont change realowner, it does not make much sense for turrets
        if(this.health <= 0)
-               WITH(entity, self, this, W_PrepareExplosionByDamage(this.owner, turret_projectile_explode));
+               W_PrepareExplosionByDamage(this, this.owner, turret_projectile_explode);
 }
 
-entity turret_projectile(string _snd, float _size, float _health, float _death, float _proj_type, float _cull, float _cli_anim)
-{SELFPARAM();
+entity turret_projectile(entity actor, Sound _snd, float _size, float _health, float _death, float _proj_type, float _cull, float _cli_anim)
+{
+    TC(Sound, _snd);
        entity proj;
 
-       _sound (self, CH_WEAPON_A, _snd, VOL_BASE, ATTEN_NORM);
+       sound (actor, CH_WEAPON_A, _snd, VOL_BASE, ATTEN_NORM);
        proj                             = spawn ();
-       setorigin(proj, self.tur_shotorg);
+       setorigin(proj, actor.tur_shotorg);
        setsize(proj, '-0.5 -0.5 -0.5' * _size, '0.5 0.5 0.5' * _size);
-       proj.owner                = self;
-       proj.realowner    = self;
+       proj.owner                = actor;
+       proj.realowner    = actor;
        proj.bot_dodge    = true;
-       proj.bot_dodgerating = self.shot_dmg;
-       proj.think                = turret_projectile_explode;
-       proj.touch                = turret_projectile_touch;
+       proj.bot_dodgerating = actor.shot_dmg;
+       setthink(proj, turret_projectile_explode);
+       settouch(proj, turret_projectile_touch);
        proj.nextthink    = time + 9;
        proj.movetype           = MOVETYPE_FLYMISSILE;
-       proj.velocity           = normalize(self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
+       proj.velocity           = normalize(actor.tur_shotdir_updated + randomvec() * actor.shot_spread) * actor.shot_speed;
        proj.flags                = FL_PROJECTILE;
-       proj.enemy                = self.enemy;
+       proj.enemy                = actor.enemy;
        proj.totalfrags  = _death;
        PROJECTILE_MAKETRIGGER(proj);
        if(_health)
@@ -498,39 +499,33 @@ entity turret_projectile(string _snd, float _size, float _health, float _death,
 ** and updated aim<->predict impact distance.
 **/
 void turret_do_updates(entity t_turret)
-{SELFPARAM();
-       vector enemy_pos;
-
-       setself(t_turret);
-
-       enemy_pos = real_origin(self.enemy);
+{
+       vector enemy_pos = real_origin(t_turret.enemy);
 
-       turret_tag_fire_update();
+       turret_tag_fire_update(t_turret);
 
-       self.tur_shotdir_updated = v_forward;
-       self.tur_dist_enemy = vlen(self.tur_shotorg - enemy_pos);
-       self.tur_dist_aimpos = vlen(self.tur_shotorg - self.tur_aimpos);
+       t_turret.tur_shotdir_updated = v_forward;
+       t_turret.tur_dist_enemy = vlen(t_turret.tur_shotorg - enemy_pos);
+       t_turret.tur_dist_aimpos = vlen(t_turret.tur_shotorg - t_turret.tur_aimpos);
 
-       /*if((self.firecheck_flags & TFL_FIRECHECK_VERIFIED) && (self.enemy))
+       /*if((t_turret.firecheck_flags & TFL_FIRECHECK_VERIFIED) && (t_turret.enemy))
        {
-               oldpos = self.enemy.origin;
-               setorigin(self.enemy, self.tur_aimpos);
-               tracebox(self.tur_shotorg, '-1 -1 -1', '1 1 1', self.tur_shotorg + (self.tur_shotdir_updated * self.tur_dist_aimpos), MOVE_NORMAL,self);
-               setorigin(self.enemy, oldpos);
+               oldpos = t_turret.enemy.origin;
+               setorigin(t_turret.enemy, t_turret.tur_aimpos);
+               tracebox(t_turret.tur_shotorg, '-1 -1 -1', '1 1 1', t_turret.tur_shotorg + (t_turret.tur_shotdir_updated * t_turret.tur_dist_aimpos), MOVE_NORMAL,t_turret);
+               setorigin(t_turret.enemy, oldpos);
 
-               if(trace_ent == self.enemy)
-                       self.tur_dist_impact_to_aimpos = 0;
+               if(trace_ent == t_turret.enemy)
+                       t_turret.tur_dist_impact_to_aimpos = 0;
                else
-                       self.tur_dist_impact_to_aimpos = vlen(trace_endpos - self.tur_aimpos);
+                       t_turret.tur_dist_impact_to_aimpos = vlen(trace_endpos - t_turret.tur_aimpos);
        }
        else*/
-               tracebox(self.tur_shotorg, '-1 -1 -1','1 1 1', self.tur_shotorg + (self.tur_shotdir_updated * self.tur_dist_aimpos), MOVE_NORMAL,self);
-
-       self.tur_dist_impact_to_aimpos = vlen(trace_endpos - self.tur_aimpos) - (vlen(self.enemy.maxs - self.enemy.mins) * 0.5);
-       self.tur_impactent                       = trace_ent;
-       self.tur_impacttime                     = vlen(self.tur_shotorg - trace_endpos) / self.shot_speed;
+               tracebox(t_turret.tur_shotorg, '-1 -1 -1','1 1 1', t_turret.tur_shotorg + (t_turret.tur_shotdir_updated * t_turret.tur_dist_aimpos), MOVE_NORMAL,t_turret);
 
-       setself(this);
+       t_turret.tur_dist_impact_to_aimpos = vlen(trace_endpos - t_turret.tur_aimpos) - (vlen(t_turret.enemy.maxs - t_turret.enemy.mins) * 0.5);
+       t_turret.tur_impactent                   = trace_ent;
+       t_turret.tur_impacttime                 = vlen(t_turret.tur_shotorg - trace_endpos) / t_turret.shot_speed;
 }
 
 /**
@@ -538,137 +533,137 @@ void turret_do_updates(entity t_turret)
 ** the units .track_type and .track_flags
 **/
 .float turret_framecounter;
-void turret_track()
-{SELFPARAM();
+void turret_track(entity this)
+{
        vector target_angle; // This is where we want to aim
        vector move_angle;   // This is where we can aim
        float f_tmp;
        vector v1, v2;
-       v1 = self.tur_head.angles;
-       v2 = self.tur_head.avelocity;
+       v1 = this.tur_head.angles;
+       v2 = this.tur_head.avelocity;
 
-       if (self.track_flags == TFL_TRACK_NO)
+       if (this.track_flags == TFL_TRACK_NO)
                return;
 
-       if(!self.active)
-               target_angle = self.idle_aim - ('1 0 0' * self.aim_maxpitch);
-       else if (self.enemy == world)
+       if(!this.active)
+               target_angle = this.idle_aim - ('1 0 0' * this.aim_maxpitch);
+       else if (this.enemy == NULL)
        {
-               if(time > self.lip)
-                       target_angle = self.idle_aim + self.angles;
+               if(time > this.lip)
+                       target_angle = this.idle_aim + this.angles;
                else
-                       target_angle = vectoangles(normalize(self.tur_aimpos - self.tur_shotorg));
+                       target_angle = vectoangles(normalize(this.tur_aimpos - this.tur_shotorg));
        }
        else
        {
-               target_angle = vectoangles(normalize(self.tur_aimpos - self.tur_shotorg));
+               target_angle = vectoangles(normalize(this.tur_aimpos - this.tur_shotorg));
        }
 
-       self.tur_head.angles_x = anglemods(self.tur_head.angles_x);
-       self.tur_head.angles_y = anglemods(self.tur_head.angles_y);
+       this.tur_head.angles_x = anglemods(this.tur_head.angles_x);
+       this.tur_head.angles_y = anglemods(this.tur_head.angles_y);
 
        // Find the diffrence between where we currently aim and where we want to aim
-       //move_angle = target_angle - (self.angles + self.tur_head.angles);
-       //move_angle = shortangle_vxy(move_angle,(self.angles + self.tur_head.angles));
+       //move_angle = target_angle - (this.angles + this.tur_head.angles);
+       //move_angle = shortangle_vxy(move_angle,(this.angles + this.tur_head.angles));
 
-       move_angle = AnglesTransform_ToAngles(AnglesTransform_LeftDivide(AnglesTransform_FromAngles(self.angles), AnglesTransform_FromAngles(target_angle))) - self.tur_head.angles;
-       move_angle = shortangle_vxy(move_angle, self.tur_head.angles);
+       move_angle = AnglesTransform_ToAngles(AnglesTransform_LeftDivide(AnglesTransform_FromAngles(this.angles), AnglesTransform_FromAngles(target_angle))) - this.tur_head.angles;
+       move_angle = shortangle_vxy(move_angle, this.tur_head.angles);
 
-       switch(self.track_type)
+       switch(this.track_type)
        {
                case TFL_TRACKTYPE_STEPMOTOR:
-                       f_tmp = self.aim_speed * self.ticrate; // dgr/sec -> dgr/tic
-                       if (self.track_flags & TFL_TRACK_PITCH)
+                       f_tmp = this.aim_speed * this.ticrate; // dgr/sec -> dgr/tic
+                       if (this.track_flags & TFL_TRACK_PITCH)
                        {
-                               self.tur_head.angles_x += bound(-f_tmp,move_angle_x, f_tmp);
-                               if(self.tur_head.angles_x > self.aim_maxpitch)
-                                       self.tur_head.angles_x = self.aim_maxpitch;
+                               this.tur_head.angles_x += bound(-f_tmp,move_angle_x, f_tmp);
+                               if(this.tur_head.angles_x > this.aim_maxpitch)
+                                       this.tur_head.angles_x = this.aim_maxpitch;
 
-                               if(self.tur_head.angles_x  < -self.aim_maxpitch)
-                                       self.tur_head.angles_x = self.aim_maxpitch;
+                               if(this.tur_head.angles_x  < -this.aim_maxpitch)
+                                       this.tur_head.angles_x = this.aim_maxpitch;
                        }
 
-                       if (self.track_flags & TFL_TRACK_ROTATE)
+                       if (this.track_flags & TFL_TRACK_ROTATE)
                        {
-                               self.tur_head.angles_y += bound(-f_tmp, move_angle_y, f_tmp);
-                               if(self.tur_head.angles_y > self.aim_maxrotate)
-                                       self.tur_head.angles_y = self.aim_maxrotate;
+                               this.tur_head.angles_y += bound(-f_tmp, move_angle_y, f_tmp);
+                               if(this.tur_head.angles_y > this.aim_maxrotate)
+                                       this.tur_head.angles_y = this.aim_maxrotate;
 
-                               if(self.tur_head.angles_y  < -self.aim_maxrotate)
-                                       self.tur_head.angles_y = self.aim_maxrotate;
+                               if(this.tur_head.angles_y  < -this.aim_maxrotate)
+                                       this.tur_head.angles_y = this.aim_maxrotate;
                        }
 
                        // CSQC
-                       self.SendFlags  |= TNSF_ANG;
+                       this.SendFlags  |= TNSF_ANG;
 
                        return;
 
                case TFL_TRACKTYPE_FLUIDINERTIA:
-                       f_tmp = self.aim_speed * self.ticrate; // dgr/sec -> dgr/tic
-                       move_angle_x = bound(-self.aim_speed, move_angle_x * self.track_accel_pitch * f_tmp, self.aim_speed);
-                       move_angle_y = bound(-self.aim_speed, move_angle_y * self.track_accel_rotate * f_tmp, self.aim_speed);
-                       move_angle = (self.tur_head.avelocity * self.track_blendrate) + (move_angle * (1 - self.track_blendrate));
+                       f_tmp = this.aim_speed * this.ticrate; // dgr/sec -> dgr/tic
+                       move_angle_x = bound(-this.aim_speed, move_angle_x * this.track_accel_pitch * f_tmp, this.aim_speed);
+                       move_angle_y = bound(-this.aim_speed, move_angle_y * this.track_accel_rotate * f_tmp, this.aim_speed);
+                       move_angle = (this.tur_head.avelocity * this.track_blendrate) + (move_angle * (1 - this.track_blendrate));
                        break;
 
                case TFL_TRACKTYPE_FLUIDPRECISE:
 
-                       move_angle_y = bound(-self.aim_speed, move_angle_y, self.aim_speed);
-                       move_angle_x = bound(-self.aim_speed, move_angle_x, self.aim_speed);
+                       move_angle_y = bound(-this.aim_speed, move_angle_y, this.aim_speed);
+                       move_angle_x = bound(-this.aim_speed, move_angle_x, this.aim_speed);
 
                        break;
        }
 
        //  pitch
-       if (self.track_flags & TFL_TRACK_PITCH)
+       if (this.track_flags & TFL_TRACK_PITCH)
        {
-               self.tur_head.avelocity_x = move_angle_x;
-               if((self.tur_head.angles_x + self.tur_head.avelocity_x * self.ticrate) > self.aim_maxpitch)
+               this.tur_head.avelocity_x = move_angle_x;
+               if((this.tur_head.angles_x + this.tur_head.avelocity_x * this.ticrate) > this.aim_maxpitch)
                {
-                       self.tur_head.avelocity_x = 0;
-                       self.tur_head.angles_x = self.aim_maxpitch;
+                       this.tur_head.avelocity_x = 0;
+                       this.tur_head.angles_x = this.aim_maxpitch;
 
-                       self.SendFlags  |= TNSF_ANG;
+                       this.SendFlags  |= TNSF_ANG;
                }
 
-               if((self.tur_head.angles_x + self.tur_head.avelocity_x * self.ticrate) < -self.aim_maxpitch)
+               if((this.tur_head.angles_x + this.tur_head.avelocity_x * this.ticrate) < -this.aim_maxpitch)
                {
-                       self.tur_head.avelocity_x = 0;
-                       self.tur_head.angles_x = -self.aim_maxpitch;
+                       this.tur_head.avelocity_x = 0;
+                       this.tur_head.angles_x = -this.aim_maxpitch;
 
-                       self.SendFlags  |= TNSF_ANG;
+                       this.SendFlags  |= TNSF_ANG;
                }
        }
 
        //  rot
-       if (self.track_flags & TFL_TRACK_ROTATE)
+       if (this.track_flags & TFL_TRACK_ROTATE)
        {
-               self.tur_head.avelocity_y = move_angle_y;
+               this.tur_head.avelocity_y = move_angle_y;
 
-               if((self.tur_head.angles_y + self.tur_head.avelocity_y * self.ticrate) > self.aim_maxrotate)
+               if((this.tur_head.angles_y + this.tur_head.avelocity_y * this.ticrate) > this.aim_maxrotate)
                {
-                       self.tur_head.avelocity_y = 0;
-                       self.tur_head.angles_y = self.aim_maxrotate;
+                       this.tur_head.avelocity_y = 0;
+                       this.tur_head.angles_y = this.aim_maxrotate;
 
-                       self.SendFlags  |= TNSF_ANG;
+                       this.SendFlags  |= TNSF_ANG;
                }
 
-               if((self.tur_head.angles_y + self.tur_head.avelocity_y * self.ticrate) < -self.aim_maxrotate)
+               if((this.tur_head.angles_y + this.tur_head.avelocity_y * this.ticrate) < -this.aim_maxrotate)
                {
-                       self.tur_head.avelocity_y = 0;
-                       self.tur_head.angles_y = -self.aim_maxrotate;
+                       this.tur_head.avelocity_y = 0;
+                       this.tur_head.angles_y = -this.aim_maxrotate;
 
-                       self.SendFlags  |= TNSF_ANG;
+                       this.SendFlags  |= TNSF_ANG;
                }
        }
 
-       self.SendFlags  |= TNSF_AVEL;
+       this.SendFlags  |= TNSF_AVEL;
 
        // Force a angle update every 10'th frame
-       self.turret_framecounter += 1;
-       if(self.turret_framecounter >= 10)
+       this.turret_framecounter += 1;
+       if(this.turret_framecounter >= 10)
        {
-               self.SendFlags |= TNSF_ANG;
-               self.turret_framecounter = 0;
+               this.SendFlags |= TNSF_ANG;
+               this.turret_framecounter = 0;
        }
 }
 
@@ -709,7 +704,7 @@ float turret_validate_target(entity e_turret, entity e_target, float validate_fl
                return -1;
 
        if(MUTATOR_CALLHOOK(TurretValidateTarget, e_turret, e_target, validate_flags))
-               return ret_float;
+               return M_ARGV(3, float);
 
        if (validate_flags & TFL_TARGETSELECT_NO)
                return -4;
@@ -835,37 +830,37 @@ float turret_validate_target(entity e_turret, entity e_target, float validate_fl
        return 1;
 }
 
-entity turret_select_target()
-{SELFPARAM();
+entity turret_select_target(entity this)
+{
        entity e;               // target looper entity
        float  score;   // target looper entity score
        entity e_enemy;  // currently best scoreing target
        float  m_score;  // currently best scoreing target's score
 
        m_score = 0;
-       if(self.enemy && self.enemy.takedamage && turret_validate_target(self,self.enemy,self.target_validate_flags) > 0)
+       if(this.enemy && this.enemy.takedamage && turret_validate_target(this,this.enemy,this.target_validate_flags) > 0)
        {
-               e_enemy = self.enemy;
-               m_score = self.turret_score_target(self,e_enemy) * self.target_select_samebias;
+               e_enemy = this.enemy;
+               m_score = this.turret_score_target(this,e_enemy) * this.target_select_samebias;
        }
        else
-               e_enemy = self.enemy = world;
+               e_enemy = this.enemy = NULL;
 
-       e = findradius(self.origin, self.target_range);
+       e = findradius(this.origin, this.target_range);
 
        // Nothing to aim at?
        if (!e)
-               return world;
+               return NULL;
 
        while (e)
        {
                if(e.takedamage)
                {
-                       float f = turret_validate_target(self, e, self.target_select_flags);
+                       float f = turret_validate_target(this, e, this.target_select_flags);
                        //dprint("F is: ", ftos(f), "\n");
                        if ( f > 0)
                        {
-                               score = self.turret_score_target(self,e);
+                               score = this.turret_score_target(this,e);
                                if ((score > m_score) && (score > 0))
                                {
                                        e_enemy = e;
@@ -902,213 +897,212 @@ entity turret_select_target()
 /**
 ** Preforms pre-fire checks based on the uints firecheck_flags
 **/
-float turret_firecheck()
-{SELFPARAM();
+bool turret_firecheck(entity this)
+{
        // This one just dont care =)
-       if (self.firecheck_flags & TFL_FIRECHECK_NO)
-               return 1;
+       if (this.firecheck_flags & TFL_FIRECHECK_NO)
+               return true;
 
-       if (self.enemy == world)
-               return 0;
+       if (this.enemy == NULL)
+               return false;
 
        // Ready?
-       if (self.firecheck_flags & TFL_FIRECHECK_REFIRE)
-               if (self.attack_finished_single[0] > time) return 0;
+       if (this.firecheck_flags & TFL_FIRECHECK_REFIRE)
+               if (this.attack_finished_single[0] > time) return false;
 
        // Special case: volly fire turret that has to fire a full volly if a shot was fired.
-       if (self.shoot_flags & TFL_SHOOT_VOLLYALWAYS)
-               if (self.volly_counter != self.shot_volly)
-                       if(self.ammo >= self.shot_dmg)
-                               return 1;
+       if (this.shoot_flags & TFL_SHOOT_VOLLYALWAYS)
+               if (this.volly_counter != this.shot_volly)
+                       if(this.ammo >= this.shot_dmg)
+                               return true;
 
        // Lack of zombies makes shooting dead things unnecessary :P
-       if (self.firecheck_flags & TFL_FIRECHECK_DEAD)
-               if (IS_DEAD(self.enemy))
-                       return 0;
+       if (this.firecheck_flags & TFL_FIRECHECK_DEAD)
+               if (IS_DEAD(this.enemy))
+                       return false;
 
        // Own ammo?
-       if (self.firecheck_flags & TFL_FIRECHECK_AMMO_OWN)
-               if (self.ammo < self.shot_dmg)
-                       return 0;
+       if (this.firecheck_flags & TFL_FIRECHECK_AMMO_OWN)
+               if (this.ammo < this.shot_dmg)
+                       return false;
 
        // Other's ammo? (support-supply units)
-       if (self.firecheck_flags & TFL_FIRECHECK_AMMO_OTHER)
-               if (self.enemy.ammo >= self.enemy.ammo_max)
-                       return 0;
+       if (this.firecheck_flags & TFL_FIRECHECK_AMMO_OTHER)
+               if (this.enemy.ammo >= this.enemy.ammo_max)
+                       return false;
 
        // Target of opertunity?
-       if(turret_validate_target(self, self.tur_impactent, self.target_validate_flags) > 0)
+       if(turret_validate_target(this, this.tur_impactent, this.target_validate_flags) > 0)
        {
-               self.enemy = self.tur_impactent;
-               return 1;
+               this.enemy = this.tur_impactent;
+               return true;
        }
 
-       if (self.firecheck_flags & TFL_FIRECHECK_DISTANCES)
+       if (this.firecheck_flags & TFL_FIRECHECK_DISTANCES)
        {
                // To close?
-               if (self.tur_dist_aimpos < self.target_range_min)
-                       if(turret_validate_target(self, self.tur_impactent, self.target_validate_flags) > 0)
-                               return 1; // Target of opertunity?
+               if (this.tur_dist_aimpos < this.target_range_min)
+                       if(turret_validate_target(this, this.tur_impactent, this.target_validate_flags) > 0)
+                               return true; // Target of opertunity?
                        else
-                               return 0;
+                               return false;
        }
 
        // Try to avoid FF?
-       if (self.firecheck_flags & TFL_FIRECHECK_AFF)
-               if (self.tur_impactent.team == self.team)
-                       return 0;
+       if (this.firecheck_flags & TFL_FIRECHECK_AFF)
+               if (this.tur_impactent.team == this.team)
+                       return false;
 
        // aim<->predicted impact
-       if (self.firecheck_flags & TFL_FIRECHECK_AIMDIST)
-               if (self.tur_dist_impact_to_aimpos > self.aim_firetolerance_dist)
-                       return 0;
+       if (this.firecheck_flags & TFL_FIRECHECK_AIMDIST)
+               if (this.tur_dist_impact_to_aimpos > this.aim_firetolerance_dist)
+                       return false;
 
        // Volly status
-       if (self.shot_volly > 1)
-               if (self.volly_counter == self.shot_volly)
-                       if (self.ammo < (self.shot_dmg * self.shot_volly))
-                               return 0;
+       if (this.shot_volly > 1)
+               if (this.volly_counter == this.shot_volly)
+                       if (this.ammo < (this.shot_dmg * this.shot_volly))
+                               return false;
 
-       /*if(self.firecheck_flags & TFL_FIRECHECK_VERIFIED)
-               if(self.tur_impactent != self.enemy)
-                       return 0;*/
+       /*if(this.firecheck_flags & TFL_FIRECHECK_VERIFIED)
+               if(this.tur_impactent != this.enemy)
+                       return false;*/
 
-       return 1;
+       return true;
 }
 
-bool turret_checkfire()
-{SELFPARAM();
-       bool ret = false; // dummy
-       if(MUTATOR_CALLHOOK(Turret_CheckFire, ret))
-               return ret_bool;
+bool turret_checkfire(entity this)
+{
+       if(MUTATOR_CALLHOOK(Turret_CheckFire, this))
+               return M_ARGV(1, bool);
 
-       return self.turret_firecheckfunc();
+       return this.turret_firecheckfunc(this);
 }
 
-void turret_fire()
-{SELFPARAM();
+void turret_fire(entity this)
+{
        if (autocvar_g_turrets_nofire != 0)
                return;
 
-       if(MUTATOR_CALLHOOK(TurretFire, self))
+       if(MUTATOR_CALLHOOK(TurretFire, this))
                return;
 
-       Turret info = get_turretinfo(self.m_id);
-       info.tr_attack(info, self);
+       Turret info = get_turretinfo(this.m_id);
+       info.tr_attack(info, this);
 
-       self.attack_finished_single[0] = time + self.shot_refire;
-       self.ammo -= self.shot_dmg;
-       self.volly_counter = self.volly_counter - 1;
+       this.attack_finished_single[0] = time + this.shot_refire;
+       this.ammo -= this.shot_dmg;
+       this.volly_counter = this.volly_counter - 1;
 
-       if (self.volly_counter <= 0)
+       if (this.volly_counter <= 0)
        {
-               self.volly_counter = self.shot_volly;
+               this.volly_counter = this.shot_volly;
 
-               if (self.shoot_flags & TFL_SHOOT_CLEARTARGET)
-                       self.enemy = world;
+               if (this.shoot_flags & TFL_SHOOT_CLEARTARGET)
+                       this.enemy = NULL;
 
-               if (self.shot_volly > 1)
-                       self.attack_finished_single[0] = time + self.shot_volly_refire;
+               if (this.shot_volly > 1)
+                       this.attack_finished_single[0] = time + this.shot_volly_refire;
        }
 
 #ifdef TURRET_DEBUG
-       if (self.enemy) paint_target3(self.tur_aimpos, 64, self.tur_debug_rvec, self.tur_impacttime + 0.25);
+       if (this.enemy) paint_target3(this.tur_aimpos, 64, this.tur_debug_rvec, this.tur_impacttime + 0.25);
 #endif
 }
 
-void turret_think()
-{SELFPARAM();
-       self.nextthink = time + self.ticrate;
+void turret_think(entity this)
+{
+       this.nextthink = time + this.ticrate;
 
-       MUTATOR_CALLHOOK(TurretThink, self);
+       MUTATOR_CALLHOOK(TurretThink, this);
 
 #ifdef TURRET_DEBUG
-       if (self.tur_debug_tmr1 < time)
+       if (this.tur_debug_tmr1 < time)
        {
-               if (self.enemy) paint_target (self.enemy,128,self.tur_debug_rvec,0.9);
-               paint_target(self,256,self.tur_debug_rvec,0.9);
-               self.tur_debug_tmr1 = time + 1;
+               if (this.enemy) paint_target (this.enemy,128,this.tur_debug_rvec,0.9);
+               paint_target(this,256,this.tur_debug_rvec,0.9);
+               this.tur_debug_tmr1 = time + 1;
        }
 #endif
 
        // Handle ammo
-       if (!(self.spawnflags & TSF_NO_AMMO_REGEN))
-       if (self.ammo < self.ammo_max)
-               self.ammo = min(self.ammo + self.ammo_recharge, self.ammo_max);
+       if (!(this.spawnflags & TSF_NO_AMMO_REGEN))
+       if (this.ammo < this.ammo_max)
+               this.ammo = min(this.ammo + this.ammo_recharge, this.ammo_max);
 
        // Inactive turrets needs to run the think loop,
        // So they can handle animation and wake up if need be.
-       if(!self.active)
+       if(!this.active)
        {
-               turret_track();
+               turret_track(this);
                return;
        }
 
        // This is typicaly used for zaping every target in range
        // turret_fusionreactor uses this to recharge friendlys.
-       if (self.shoot_flags & TFL_SHOOT_HITALLVALID)
+       if (this.shoot_flags & TFL_SHOOT_HITALLVALID)
        {
-               // Do a self.turret_fire for every valid target.
-               entity e = findradius(self.origin,self.target_range);
+               // Do a this.turret_fire for every valid target.
+               entity e = findradius(this.origin,this.target_range);
                while (e)
                {
                        if(e.takedamage)
                        {
-                               if (turret_validate_target(self,e,self.target_validate_flags))
+                               if (turret_validate_target(this,e,this.target_validate_flags))
                                {
-                                       self.enemy = e;
+                                       this.enemy = e;
 
-                                       turret_do_updates(self);
+                                       turret_do_updates(this);
 
-                                       if (turret_checkfire())
-                                               turret_fire();
+                                       if (turret_checkfire(this))
+                                               turret_fire(this);
                                }
                        }
 
                        e = e.chain;
                }
-               self.enemy = world;
+               this.enemy = NULL;
        }
-       else if(self.shoot_flags & TFL_SHOOT_CUSTOM)
+       else if(this.shoot_flags & TFL_SHOOT_CUSTOM)
        {
                // This one is doing something.. oddball. assume its handles what needs to be handled.
 
                // Predict?
-               if(!(self.aim_flags & TFL_AIM_NO))
-                       self.tur_aimpos = turret_aim_generic();
+               if(!(this.aim_flags & TFL_AIM_NO))
+                       this.tur_aimpos = turret_aim_generic(this);
 
                // Turn & pitch?
-               if(!(self.track_flags & TFL_TRACK_NO))
-                       turret_track();
+               if(!(this.track_flags & TFL_TRACK_NO))
+                       turret_track(this);
 
-               turret_do_updates(self);
+               turret_do_updates(this);
 
                // Fire?
-               if (turret_checkfire())
-                       turret_fire();
+               if (turret_checkfire(this))
+                       turret_fire(this);
        }
        else
        {
                // Special case for volly always. if it fired once it must compleate the volly.
-               if(self.shoot_flags & TFL_SHOOT_VOLLYALWAYS)
-                       if(self.volly_counter != self.shot_volly)
+               if(this.shoot_flags & TFL_SHOOT_VOLLYALWAYS)
+                       if(this.volly_counter != this.shot_volly)
                        {
                                // Predict or whatnot
-                               if(!(self.aim_flags & TFL_AIM_NO))
-                                       self.tur_aimpos = turret_aim_generic();
+                               if(!(this.aim_flags & TFL_AIM_NO))
+                                       this.tur_aimpos = turret_aim_generic(this);
 
                                // Turn & pitch
-                               if(!(self.track_flags & TFL_TRACK_NO))
-                                       turret_track();
+                               if(!(this.track_flags & TFL_TRACK_NO))
+                                       turret_track(this);
 
-                               turret_do_updates(self);
+                               turret_do_updates(this);
 
                                // Fire!
-                               if (turret_checkfire())
-                                       turret_fire();
+                               if (turret_checkfire(this))
+                                       turret_fire(this);
 
-                               Turret tur = get_turretinfo(self.m_id);
-                               tur.tr_think(tur, self);
+                               Turret tur = get_turretinfo(this.m_id);
+                               tur.tr_think(tur, this);
 
                                return;
                        }
@@ -1117,100 +1111,99 @@ void turret_think()
 
                // g_turrets_targetscan_maxdelay forces a target re-scan at least this often
                float do_target_scan = 0;
-               if((self.target_select_time + autocvar_g_turrets_targetscan_maxdelay) < time)
+               if((this.target_select_time + autocvar_g_turrets_targetscan_maxdelay) < time)
                        do_target_scan = 1;
 
                // Old target (if any) invalid?
-               if(self.target_validate_time < time)
-               if (turret_validate_target(self, self.enemy, self.target_validate_flags) <= 0)
+               if(this.target_validate_time < time)
+               if (turret_validate_target(this, this.enemy, this.target_validate_flags) <= 0)
                {
-                       self.enemy = world;
-                       self.target_validate_time = time + 0.5;
+                       this.enemy = NULL;
+                       this.target_validate_time = time + 0.5;
                        do_target_scan = 1;
                }
 
                // But never more often then g_turrets_targetscan_mindelay!
-               if (self.target_select_time + autocvar_g_turrets_targetscan_mindelay > time)
+               if (this.target_select_time + autocvar_g_turrets_targetscan_mindelay > time)
                        do_target_scan = 0;
 
                if(do_target_scan)
                {
-                       self.enemy = turret_select_target();
-                       self.target_select_time = time;
+                       this.enemy = turret_select_target(this);
+                       this.target_select_time = time;
                }
 
                // No target, just go to idle, do any custom stuff and bail.
-               if (self.enemy == world)
+               if (this.enemy == NULL)
                {
                        // Turn & pitch
-                       if(!(self.track_flags & TFL_TRACK_NO))
-                               turret_track();
+                       if(!(this.track_flags & TFL_TRACK_NO))
+                               turret_track(this);
 
-                       Turret tur = get_turretinfo(self.m_id);
-                       tur.tr_think(tur, self);
+                       Turret tur = get_turretinfo(this.m_id);
+                       tur.tr_think(tur, this);
 
                        // And bail.
                        return;
                }
                else
-                       self.lip = time + autocvar_g_turrets_aimidle_delay; // Keep track of the last time we had a target.
+                       this.lip = time + autocvar_g_turrets_aimidle_delay; // Keep track of the last time we had a target.
 
                // Predict?
-               if(!(self.aim_flags & TFL_AIM_NO))
-                       self.tur_aimpos = turret_aim_generic();
+               if(!(this.aim_flags & TFL_AIM_NO))
+                       this.tur_aimpos = turret_aim_generic(this);
 
                // Turn & pitch?
-               if(!(self.track_flags & TFL_TRACK_NO))
-                       turret_track();
+               if(!(this.track_flags & TFL_TRACK_NO))
+                       turret_track(this);
 
-               turret_do_updates(self);
+               turret_do_updates(this);
 
                // Fire?
-               if (turret_checkfire())
-                       turret_fire();
+               if (turret_checkfire(this))
+                       turret_fire(this);
        }
 
-       Turret tur = get_turretinfo(self.m_id);
-       tur.tr_think(tur, self);
+       Turret tur = get_turretinfo(this.m_id);
+       tur.tr_think(tur, this);
 }
 
 /*
        When .used a turret switch team to activator.team.
-       If activator is world, the turret go inactive.
+       If activator is NULL, the turret go inactive.
 */
-void turret_use()
-{SELFPARAM();
-       LOG_TRACE("Turret ",self.netname, " used by ", activator.classname, "\n");
+void turret_use(entity this, entity actor, entity trigger)
+{
+       LOG_TRACE("Turret ",this.netname, " used by ", actor.classname, "\n");
 
-       self.team = activator.team;
+       this.team = actor.team;
 
-       if(self.team == 0)
-               self.active = ACTIVE_NOT;
+       if(this.team == 0)
+               this.active = ACTIVE_NOT;
        else
-               self.active = ACTIVE_ACTIVE;
+               this.active = ACTIVE_ACTIVE;
 
 }
 
-void turret_link()
-{SELFPARAM();
-       Net_LinkEntity(self, true, 0, turret_send);
-       self.think       = turret_think;
-       self.nextthink = time;
-       self.tur_head.effects = EF_NODRAW;
+void turret_link(entity this)
+{
+       Net_LinkEntity(this, true, 0, turret_send);
+       setthink(this, turret_think);
+       this.nextthink = time;
+       this.tur_head.effects = EF_NODRAW;
 }
 
-void turrets_manager_think()
+void turrets_manager_think(entity this)
 {
-       SELFPARAM();
        this.nextthink = time + 1;
 
        if (autocvar_g_turrets_reloadcvars == 1)
        {
-               FOREACH_ENTITY(IS_TURRET(it), LAMBDA(
+               FOREACH_ENTITY(IS_TURRET(it), {
                        load_unit_settings(it, true);
                        Turret tur = get_turretinfo(it.m_id);
                        tur.tr_think(tur, it);
-               ));
+               });
                cvar_set("g_turrets_reloadcvars", "0");
        }
 }
@@ -1244,8 +1237,8 @@ void turret_initparams(entity tur)
        #undef TRY
 }
 
-float turret_initialize(Turret tur)
-{SELFPARAM();
+bool turret_initialize(entity this, Turret tur)
+{
        if(!autocvar_g_turrets)
                return false;
 
@@ -1253,144 +1246,144 @@ float turret_initialize(Turret tur)
                return false; // invalid turret
 
        // if tur_head exists, we can assume this turret re-spawned
-       if(!self.tur_head) {
+       if(!this.tur_head) {
                tur.tr_precache(tur);
        }
 
-       entity e = find(world, classname, "turret_manager");
+       entity e = find(NULL, classname, "turret_manager");
        if(!e)
        {
                e = new(turret_manager);
-               e.think = turrets_manager_think;
+               setthink(e, turrets_manager_think);
                e.nextthink = time + 2;
        }
 
-       if(!(self.spawnflags & TSF_SUSPENDED))
-               builtin_droptofloor();
-
-       self.netname = tur.netname;
-       load_unit_settings(self, 0);
-
-       if(!self.team || !teamplay)             { self.team = MAX_SHOT_DISTANCE; }
-       if(!self.ticrate)                               { self.ticrate = ((self.turret_flags & TUR_FLAG_SUPPORT) ? 0.2 : 0.1); }
-       if(!self.health)                                { self.health = 1000; }
-       if(!self.shot_refire)                   { self.shot_refire = 1; }
-       if(!self.tur_shotorg)                   { self.tur_shotorg = '50 0 50'; }
-       if(!self.turret_flags)                  { self.turret_flags = TUR_FLAG_SPLASH | TUR_FLAG_MEDPROJ | TUR_FLAG_PLAYER; }
-       if(!self.damage_flags)                  { self.damage_flags = TFL_DMG_YES | TFL_DMG_RETALIATE | TFL_DMG_AIMSHAKE; }
-       if(!self.aim_flags)                             { self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE; }
-       if(!self.track_type)                    { self.track_type = TFL_TRACKTYPE_STEPMOTOR; }
-       if(!self.track_flags)                   { self.track_flags = TFL_TRACK_PITCH | TFL_TRACK_ROTATE; }
-       if(!self.ammo_flags)                    { self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE; }
-       if(!self.target_select_flags)   { self.target_select_flags = TFL_TARGETSELECT_LOS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_RANGELIMITS | TFL_TARGETSELECT_ANGLELIMITS; }
-       if(!self.firecheck_flags)               { self.firecheck_flags = TFL_FIRECHECK_DEAD | TFL_FIRECHECK_DISTANCES | TFL_FIRECHECK_LOS
+       if(!(this.spawnflags & TSF_SUSPENDED))
+               droptofloor(this);
+
+       this.netname = tur.netname;
+       load_unit_settings(this, 0);
+
+       if(!this.team || !teamplay)             { this.team = MAX_SHOT_DISTANCE; }
+       if(!this.ticrate)                               { this.ticrate = ((this.turret_flags & TUR_FLAG_SUPPORT) ? 0.2 : 0.1); }
+       if(!this.health)                                { this.health = 1000; }
+       if(!this.shot_refire)                   { this.shot_refire = 1; }
+       if(!this.tur_shotorg)                   { this.tur_shotorg = '50 0 50'; }
+       if(!this.turret_flags)                  { this.turret_flags = TUR_FLAG_SPLASH | TUR_FLAG_MEDPROJ | TUR_FLAG_PLAYER; }
+       if(!this.damage_flags)                  { this.damage_flags = TFL_DMG_YES | TFL_DMG_RETALIATE | TFL_DMG_AIMSHAKE; }
+       if(!this.aim_flags)                             { this.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE; }
+       if(!this.track_type)                    { this.track_type = TFL_TRACKTYPE_STEPMOTOR; }
+       if(!this.track_flags)                   { this.track_flags = TFL_TRACK_PITCH | TFL_TRACK_ROTATE; }
+       if(!this.ammo_flags)                    { this.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE; }
+       if(!this.target_select_flags)   { this.target_select_flags = TFL_TARGETSELECT_LOS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_RANGELIMITS | TFL_TARGETSELECT_ANGLELIMITS; }
+       if(!this.firecheck_flags)               { this.firecheck_flags = TFL_FIRECHECK_DEAD | TFL_FIRECHECK_DISTANCES | TFL_FIRECHECK_LOS
                                                                                                                   | TFL_FIRECHECK_AIMDIST | TFL_FIRECHECK_TEAMCHECK | TFL_FIRECHECK_AMMO_OWN | TFL_FIRECHECK_REFIRE; }
 
-       if(self.track_type != TFL_TRACKTYPE_STEPMOTOR)
+       if(this.track_type != TFL_TRACKTYPE_STEPMOTOR)
        {
                // Fluid / Ineria mode. Looks mutch nicer.
                // Can reduce aim preformance alot, needs a bit diffrent aimspeed
 
-               self.aim_speed = bound(0.1, ((!self.aim_speed) ? 180 : self.aim_speed), 1000);
+               this.aim_speed = bound(0.1, ((!this.aim_speed) ? 180 : this.aim_speed), 1000);
 
-               if(!self.track_accel_pitch)             { self.track_accel_pitch = 0.5; }
-               if(!self.track_accel_rotate)    { self.track_accel_rotate = 0.5; }
-               if(!self.track_blendrate)               { self.track_blendrate = 0.35; }
+               if(!this.track_accel_pitch)             { this.track_accel_pitch = 0.5; }
+               if(!this.track_accel_rotate)    { this.track_accel_rotate = 0.5; }
+               if(!this.track_blendrate)               { this.track_blendrate = 0.35; }
        }
 
-       turret_initparams(self);
+       turret_initparams(this);
 
-       self.turret_flags = TUR_FLAG_ISTURRET | (tur.spawnflags);
+       this.turret_flags = TUR_FLAG_ISTURRET | (tur.spawnflags);
 
-       if(self.turret_flags & TUR_FLAG_SPLASH)
-               self.aim_flags |= TFL_AIM_SPLASH;
+       if(this.turret_flags & TUR_FLAG_SPLASH)
+               this.aim_flags |= TFL_AIM_SPLASH;
 
-       if(self.turret_flags & TUR_FLAG_MISSILE)
-               self.target_select_flags |= TFL_TARGETSELECT_MISSILES;
+       if(this.turret_flags & TUR_FLAG_MISSILE)
+               this.target_select_flags |= TFL_TARGETSELECT_MISSILES;
 
-       if(self.turret_flags & TUR_FLAG_PLAYER)
-               self.target_select_flags |= TFL_TARGETSELECT_PLAYERS;
+       if(this.turret_flags & TUR_FLAG_PLAYER)
+               this.target_select_flags |= TFL_TARGETSELECT_PLAYERS;
 
-       if(self.spawnflags & TSL_NO_RESPAWN)
-               self.damage_flags |= TFL_DMG_DEATH_NORESPAWN;
+       if(this.spawnflags & TSL_NO_RESPAWN)
+               this.damage_flags |= TFL_DMG_DEATH_NORESPAWN;
 
-       if (self.turret_flags & TUR_FLAG_SUPPORT)
-               self.turret_score_target = turret_targetscore_support;
+       if (this.turret_flags & TUR_FLAG_SUPPORT)
+               this.turret_score_target = turret_targetscore_support;
        else
-               self.turret_score_target = turret_targetscore_generic;
+               this.turret_score_target = turret_targetscore_generic;
 
        ++turret_count;
 
-       _setmodel(self, tur.model);
-       setsize(self, tur.mins, tur.maxs);
-
-       self.m_id                                       = tur.m_id;
-       self.classname                          = "turret_main";
-       self.active                                     = ACTIVE_ACTIVE;
-       self.effects                            = EF_NODRAW;
-       self.netname                            = tur.turret_name;
-       self.ticrate                            = bound(sys_frametime, self.ticrate, 60);
-       self.max_health                         = self.health;
-       self.target_validate_flags      = self.target_select_flags;
-       self.ammo                                       = self.ammo_max;
-       self.ammo_recharge                 *= self.ticrate;
-       self.solid                                      = SOLID_BBOX;
-       self.takedamage                         = DAMAGE_AIM;
-       self.movetype                           = MOVETYPE_NOCLIP;
-       self.view_ofs                           = '0 0 0';
-       self.turret_firecheckfunc       = turret_firecheck;
-       self.event_damage                       = turret_damage;
-       self.use                                        = turret_use;
-       self.bot_attack                         = true;
-       self.nextthink                          = time + 1;
-       self.nextthink                     += turret_count * sys_frametime;
-
-       self.tur_head = new(turret_head);
-       _setmodel(self.tur_head, tur.head_model);
-       setsize(self.tur_head, '0 0 0', '0 0 0');
-       setorigin(self.tur_head, '0 0 0');
-       setattachment(self.tur_head, self, "tag_head");
-
-       self.tur_head.netname           = self.tur_head.classname;
-       self.tur_head.team                      = self.team;
-       self.tur_head.owner                     = self;
-       self.tur_head.takedamage        = DAMAGE_NO;
-       self.tur_head.solid                     = SOLID_NOT;
-       self.tur_head.movetype          = self.movetype;
-
-       if(!self.tur_defend)
-       if(self.target != "")
+       _setmodel(this, tur.model);
+       setsize(this, tur.mins, tur.maxs);
+
+       this.m_id                                       = tur.m_id;
+       this.classname                          = "turret_main";
+       this.active                                     = ACTIVE_ACTIVE;
+       this.effects                            = EF_NODRAW;
+       this.netname                            = tur.turret_name;
+       this.ticrate                            = bound(sys_frametime, this.ticrate, 60);
+       this.max_health                         = this.health;
+       this.target_validate_flags      = this.target_select_flags;
+       this.ammo                                       = this.ammo_max;
+       this.ammo_recharge                 *= this.ticrate;
+       this.solid                                      = SOLID_BBOX;
+       this.takedamage                         = DAMAGE_AIM;
+       this.movetype                           = MOVETYPE_NOCLIP;
+       this.view_ofs                           = '0 0 0';
+       this.turret_firecheckfunc       = turret_firecheck;
+       this.event_damage                       = turret_damage;
+       this.use                                        = turret_use;
+       this.bot_attack                         = true;
+       this.nextthink                          = time + 1;
+       this.nextthink                     += turret_count * sys_frametime;
+
+       this.tur_head = new(turret_head);
+       _setmodel(this.tur_head, tur.head_model);
+       setsize(this.tur_head, '0 0 0', '0 0 0');
+       setorigin(this.tur_head, '0 0 0');
+       setattachment(this.tur_head, this, "tag_head");
+
+       this.tur_head.netname           = this.tur_head.classname;
+       this.tur_head.team                      = this.team;
+       this.tur_head.owner                     = this;
+       this.tur_head.takedamage        = DAMAGE_NO;
+       this.tur_head.solid                     = SOLID_NOT;
+       this.tur_head.movetype          = this.movetype;
+
+       if(!this.tur_defend)
+       if(this.target != "")
        {
-               self.tur_defend = find(world, targetname, self.target);
-               if (self.tur_defend == world)
+               this.tur_defend = find(NULL, targetname, this.target);
+               if (this.tur_defend == NULL)
                {
-                       self.target = "";
+                       this.target = "";
                        LOG_TRACE("Turret has invalid defendpoint!\n");
                }
        }
 
-       if (self.tur_defend)
-               self.idle_aim = self.tur_head.angles + angleofs(self.tur_head, self.tur_defend);
+       if (this.tur_defend)
+               this.idle_aim = this.tur_head.angles + angleofs(this.tur_head, this.tur_defend);
        else
-               self.idle_aim = '0 0 0';
+               this.idle_aim = '0 0 0';
 
 #ifdef TURRET_DEBUG
-       self.tur_debug_start = self.nextthink;
-       while(vdist(self.tur_debug_rvec, <, 2))
-               self.tur_debug_rvec = randomvec() * 4;
+       this.tur_debug_start = this.nextthink;
+       while(vdist(this.tur_debug_rvec, <, 2))
+               this.tur_debug_rvec = randomvec() * 4;
 
-       self.tur_debug_rvec_x = fabs(self.tur_debug_rvec_x);
-       self.tur_debug_rvec_y = fabs(self.tur_debug_rvec_y);
-       self.tur_debug_rvec_z = fabs(self.tur_debug_rvec_z);
+       this.tur_debug_rvec_x = fabs(this.tur_debug_rvec_x);
+       this.tur_debug_rvec_y = fabs(this.tur_debug_rvec_y);
+       this.tur_debug_rvec_z = fabs(this.tur_debug_rvec_z);
 #endif
 
-       turret_link();
-       turret_respawn();
-       turret_tag_fire_update();
+       turret_link(this);
+       turret_respawn(this);
+       turret_tag_fire_update(this);
 
-       tur.tr_setup(tur, self);
+       tur.tr_setup(tur, this);
 
-       if(MUTATOR_CALLHOOK(TurretSpawn, self))
+       if(MUTATOR_CALLHOOK(TurretSpawn, this))
                return false;
 
        return true;