]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/vehicles/vehicle/raptor.qc
Merge branch 'master' into Mario/entcs
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / vehicles / vehicle / raptor.qc
index beb0e74c8b9382082078e668f14f9dd11ff04317..a03c936bd787f6d8e075857ed38b3efc8c5841f3 100644 (file)
@@ -1,34 +1,7 @@
-#ifndef VEHICLE_RAPTOR
-#define VEHICLE_RAPTOR
 #include "raptor.qh"
 
-#include "raptor_weapons.qc"
-
-CLASS(Raptor, Vehicle)
-/* spawnflags */ ATTRIB(Raptor, spawnflags, int, VHF_DMGSHAKE | VHF_DMGROLL);
-/* mins       */ ATTRIB(Raptor, mins, vector, '-80 -80 0');
-/* maxs       */ ATTRIB(Raptor, maxs, vector, '80 80 70');
-/* view offset*/ ATTRIB(Raptor, view_ofs, vector, '0 0 160');
-/* view dist  */ ATTRIB(Raptor, height, float, 200);
-/* model         */ ATTRIB(Raptor, mdl, string, "models/vehicles/raptor.dpm");
-/* model         */ ATTRIB(Raptor, model, string, "models/vehicles/raptor.dpm");
-/* head_model */ ATTRIB(Raptor, head_model, string, "");
-/* hud_model  */ ATTRIB(Raptor, hud_model, string, "models/vehicles/raptor_cockpit.dpm");
-/* tags       */ ATTRIB(Raptor, tag_head, string, "");
-/* tags       */ ATTRIB(Raptor, tag_hud, string, "tag_hud");
-/* tags       */ ATTRIB(Raptor, tag_view, string, "tag_camera");
-/* netname    */ ATTRIB(Raptor, netname, string, "raptor");
-/* fullname   */ ATTRIB(Raptor, vehicle_name, string, _("Raptor"));
-/* icon       */ ATTRIB(Raptor, m_icon, string, "vehicle_raptor");
-ENDCLASS(Raptor)
-REGISTER_VEHICLE(RAPTOR, NEW(Raptor));
-
-#endif
-
 #ifdef IMPLEMENTATION
 
-#include "raptor_weapons.qc"
-
 #ifdef SVQC
 
 bool autocvar_g_vehicle_raptor = true;
@@ -49,6 +22,8 @@ float autocvar_g_vehicle_raptor_speed_up = 1700;
 float autocvar_g_vehicle_raptor_speed_down = 1700;
 float autocvar_g_vehicle_raptor_friction = 2;
 
+bool autocvar_g_vehicle_raptor_swim = false;
+
 float autocvar_g_vehicle_raptor_cannon_turnspeed = 120;
 float autocvar_g_vehicle_raptor_cannon_turnlimit = 20;
 float autocvar_g_vehicle_raptor_cannon_pitchlimit_up = 12;
@@ -79,88 +54,81 @@ vector autocvar_g_vehicle_raptor_bouncepain = '1 4 1000';
 .entity bomb1;
 .entity bomb2;
 
-float raptor_altitude(float amax)
-{SELFPARAM();
-       tracebox(self.origin, self.mins, self.maxs, self.origin - ('0 0 1' * amax), MOVE_WORLDONLY, self);
-       return vlen(self.origin - trace_endpos);
-}
-
-void raptor_land()
-{SELFPARAM();
+void raptor_land(entity this)
+{
        float hgt;
 
-       hgt = raptor_altitude(512);
-       self.velocity = (self.velocity * 0.9) + ('0 0 -1800' * (hgt / 256) * sys_frametime);
-       self.angles_x *= 0.95;
-       self.angles_z *= 0.95;
+       hgt = vehicle_altitude(this, 512);
+       this.velocity = (this.velocity * 0.9) + ('0 0 -1800' * (hgt / 256) * PHYS_INPUT_FRAMETIME);
+       this.angles_x *= 0.95;
+       this.angles_z *= 0.95;
 
-       if(hgt < 128)
-       if(hgt > 0)
-               self.frame = (hgt / 128) * 25;
+       if(hgt < 128 && hgt > 0)
+               this.frame = (hgt / 128) * 25;
 
-       self.bomb1.gun1.avelocity_y = 90 + ((self.frame / 25) * 2000);
-       self.bomb1.gun2.avelocity_y = -self.bomb1.gun1.avelocity_y;
+       this.bomb1.gun1.avelocity_y = 90 + ((this.frame / 25) * 2000);
+       this.bomb1.gun2.avelocity_y = -this.bomb1.gun1.avelocity_y;
 
        if(hgt < 16)
        {
-               self.movetype = MOVETYPE_TOSS;
-               self.think      = vehicles_think;
-               self.frame      = 0;
+               set_movetype(this, MOVETYPE_TOSS);
+               setthink(this, vehicles_think);
+               this.frame      = 0;
        }
 
-       self.nextthink  = time;
+       this.nextthink  = time;
 
-       CSQCMODEL_AUTOUPDATE(self);
+       CSQCMODEL_AUTOUPDATE(this);
 }
 
-void raptor_exit(float eject)
-{SELFPARAM();
-       vector spot;
-       self.tur_head.exteriormodeltoclient = world;
+void raptor_exit(entity this, int eject)
+{
+       this.tur_head.exteriormodeltoclient = NULL;
 
-       if(!IS_DEAD(self))
+       if(!IS_DEAD(this))
        {
-               self.think        = raptor_land;
-               self.nextthink  = time;
+               setthink(this, raptor_land);
+               this.nextthink = time;
        }
 
-       if(!self.owner)
+       if(!this.owner)
                return;
 
-       makevectors(self.angles);
+       makevectors(this.angles);
+       vector spot;
        if(eject)
        {
-               spot = self.origin + v_forward * 100 + '0 0 64';
-               spot = vehicles_findgoodexit(spot);
-               setorigin(self.owner , spot);
-               self.owner.velocity = (v_up + v_forward * 0.25) * 750;
-               self.owner.oldvelocity = self.owner.velocity;
+               spot = this.origin + v_forward * 100 + '0 0 64';
+               spot = vehicles_findgoodexit(this, spot);
+               setorigin(this.owner , spot);
+               this.owner.velocity = (v_up + v_forward * 0.25) * 750;
+               this.owner.oldvelocity = this.owner.velocity;
        }
        else
        {
-               if(vdist(self.velocity, >, 2 * autocvar_sv_maxairspeed))
+               if(vdist(this.velocity, >, 2 * autocvar_sv_maxairspeed))
                {
-                       self.owner.velocity = normalize(self.velocity) * autocvar_sv_maxairspeed * 2;
-                       self.owner.velocity_z += 200;
-                       spot = self.origin + v_forward * 32 + '0 0 64';
-                       spot = vehicles_findgoodexit(spot);
+                       this.owner.velocity = normalize(this.velocity) * autocvar_sv_maxairspeed * 2;
+                       this.owner.velocity_z += 200;
+                       spot = this.origin + v_forward * 32 + '0 0 64';
+                       spot = vehicles_findgoodexit(this, spot);
                }
                else
                {
-                       self.owner.velocity = self.velocity * 0.5;
-                       self.owner.velocity_z += 10;
-                       spot = self.origin - v_forward * 200 + '0 0 64';
-                       spot = vehicles_findgoodexit(spot);
+                       this.owner.velocity = this.velocity * 0.5;
+                       this.owner.velocity_z += 10;
+                       spot = this.origin - v_forward * 200 + '0 0 64';
+                       spot = vehicles_findgoodexit(this, spot);
                }
-               self.owner.oldvelocity = self.owner.velocity;
-               setorigin(self.owner , spot);
+               this.owner.oldvelocity = this.owner.velocity;
+               setorigin(this.owner , spot);
        }
 
-       antilag_clear(self.owner, CS(self.owner));
-       self.owner = world;
+       antilag_clear(this.owner, CS(this.owner));
+       this.owner = NULL;
 }
 
-bool raptor_frame(entity this)
+bool raptor_frame(entity this, float dt)
 {
        entity vehic = this.vehicle;
        return = true;
@@ -174,7 +142,6 @@ bool raptor_frame(entity this)
 
        vehicles_frame(vehic, this);
 
-       float ftmp = 0;
        /*
        ftmp = vlen(vehic.velocity);
        if(ftmp > autocvar_g_vehicle_raptor_speed_forward)
@@ -188,7 +155,7 @@ bool raptor_frame(entity this)
                vehic.sound_nexttime = time + 7.955812;
                //sound (vehic.tur_head, CH_TRIGGER_SINGLE, SND_VEH_RAPTOR_FLY, 1 - ftmp,   ATTEN_NORM );
                sound (vehic, CH_TRIGGER_SINGLE, SND_VEH_RAPTOR_SPEED, 1, ATTEN_NORM);
-               vehic.wait = ftmp;
+               vehic.wait = 0;
        }
        /*
        else if(fabs(ftmp - vehic.wait) > 0.2)
@@ -202,7 +169,7 @@ bool raptor_frame(entity this)
        if(IS_DEAD(vehic))
        {
                PHYS_INPUT_BUTTON_ATCK(this) = PHYS_INPUT_BUTTON_ATCK2(this) = false;
-               return 1;
+               return;
        }
        crosshair_trace(this);
 
@@ -228,7 +195,7 @@ bool raptor_frame(entity this)
        if(df_y > 180)  df_y -= 360;
        if(df_y < -180) df_y += 360;
 
-       ftmp = shortangle_f(this.v_angle_y - vang_y, vang_y);
+       float ftmp = shortangle_f(this.v_angle_y - vang_y, vang_y);
        if(ftmp > 180)  ftmp -= 360; if(ftmp < -180) ftmp += 360;
        vehic.avelocity_y = bound(-autocvar_g_vehicle_raptor_turnspeed, ftmp + vehic.avelocity_y * 0.9, autocvar_g_vehicle_raptor_turnspeed);
 
@@ -281,7 +248,7 @@ bool raptor_frame(entity this)
        else if (PHYS_INPUT_BUTTON_JUMP(this))
                df +=  v_up * autocvar_g_vehicle_raptor_speed_up;
 
-       vehic.velocity  += df * frametime;
+       vehic.velocity  += df * dt;
        this.velocity = this.movement  = vehic.velocity;
        setorigin(this, vehic.origin + '0 0 32');
 
@@ -292,10 +259,10 @@ bool raptor_frame(entity this)
        if(autocvar_g_vehicle_raptor_cannon_locktarget == 2)
        {
                if(vehic.gun1.lock_time < time || IS_DEAD(vehic.gun1.enemy) || STAT(FROZEN, vehic.gun1.enemy))
-                       vehic.gun1.enemy = world;
+                       vehic.gun1.enemy = NULL;
 
                if(trace_ent)
-               if(trace_ent.movetype)
+               if(trace_ent.move_movetype)
                if(trace_ent.takedamage)
                if(!IS_DEAD(trace_ent) && !STAT(FROZEN, trace_ent))
                {
@@ -321,7 +288,7 @@ bool raptor_frame(entity this)
                        vf = real_origin(vehic.gun1.enemy);
                        UpdateAuxiliaryXhair(this, vf, '1 0 0', 1);
                        vector _vel = vehic.gun1.enemy.velocity;
-                       if(vehic.gun1.enemy.movetype == MOVETYPE_WALK)
+                       if(vehic.gun1.enemy.move_movetype == MOVETYPE_WALK)
                                _vel_z *= 0.1;
 
                        if(autocvar_g_vehicle_raptor_cannon_predicttarget)
@@ -339,11 +306,11 @@ bool raptor_frame(entity this)
        else if(autocvar_g_vehicle_raptor_cannon_locktarget == 1)
        {
 
-               vehicles_locktarget(vehic, (1 / autocvar_g_vehicle_raptor_cannon_locking_time) * frametime,
-                                                        (1 / autocvar_g_vehicle_raptor_cannon_locking_releasetime) * frametime,
+               vehicles_locktarget(vehic, (1 / autocvar_g_vehicle_raptor_cannon_locking_time) * dt,
+                                                        (1 / autocvar_g_vehicle_raptor_cannon_locking_releasetime) * dt,
                                                         autocvar_g_vehicle_raptor_cannon_locked_time);
 
-               if(vehic.lock_target != world)
+               if(vehic.lock_target != NULL)
                if(autocvar_g_vehicle_raptor_cannon_predicttarget)
                if(vehic.lock_strength == 1)
                {
@@ -390,20 +357,20 @@ bool raptor_frame(entity this)
        Weapon wep1 = WEP_RAPTOR;
        if(!forbidWeaponUse(this))
        if(PHYS_INPUT_BUTTON_ATCK(this))
-       if (wep1.wr_checkammo1(wep1))
+       if (wep1.wr_checkammo1(wep1, vehic))
        {
            .entity weaponentity = weaponentities[0];
                wep1.wr_think(wep1, vehic, weaponentity, 1);
        }
 
        if(vehic.vehicle_flags  & VHF_SHIELDREGEN)
-               vehicles_regen(vehic, vehic.dmg_time, vehicle_shield, autocvar_g_vehicle_raptor_shield, autocvar_g_vehicle_raptor_shield_regen_pause, autocvar_g_vehicle_raptor_shield_regen, frametime, true);
+               vehicles_regen(vehic, vehic.dmg_time, vehicle_shield, autocvar_g_vehicle_raptor_shield, autocvar_g_vehicle_raptor_shield_regen_pause, autocvar_g_vehicle_raptor_shield_regen, dt, true);
 
        if(vehic.vehicle_flags  & VHF_HEALTHREGEN)
-               vehicles_regen(vehic, vehic.dmg_time, vehicle_health, autocvar_g_vehicle_raptor_health, autocvar_g_vehicle_raptor_health_regen_pause, autocvar_g_vehicle_raptor_health_regen, frametime, false);
+               vehicles_regen(vehic, vehic.dmg_time, vehicle_health, autocvar_g_vehicle_raptor_health, autocvar_g_vehicle_raptor_health_regen_pause, autocvar_g_vehicle_raptor_health_regen, dt, false);
 
        if(vehic.vehicle_flags  & VHF_ENERGYREGEN)
-               vehicles_regen(vehic, vehic.cnt, vehicle_energy, autocvar_g_vehicle_raptor_energy, autocvar_g_vehicle_raptor_energy_regen_pause, autocvar_g_vehicle_raptor_energy_regen, frametime, false);
+               vehicles_regen(vehic, vehic.cnt, vehicle_energy, autocvar_g_vehicle_raptor_energy, autocvar_g_vehicle_raptor_energy_regen_pause, autocvar_g_vehicle_raptor_energy_regen, dt, false);
 
        Weapon wep2a = WEP_RAPTOR_BOMB;
        if(!forbidWeaponUse(this))
@@ -437,21 +404,23 @@ bool raptor_frame(entity this)
 
        if(vehic.bomb1.cnt < time)
        {
-               entity _missile = findchainentity(enemy, vehic);
-               float _incomming = 0;
-               while(_missile)
+               bool incoming = false;
+               IL_EACH(g_projectiles, it.enemy == vehic,
                {
-                       if(_missile.flags & FL_PROJECTILE)
-                       if(MISSILE_IS_TRACKING(_missile))
-                       if(vdist(vehic.origin - _missile.origin, <, 2 * autocvar_g_vehicle_raptor_flare_range))
-                               ++_incomming;
+                       if(MISSILE_IS_TRACKING(it))
+                       if(vdist(vehic.origin - it.origin, <, 2 * autocvar_g_vehicle_raptor_flare_range))
+                       {
+                               incoming = true;
+                               break;
+                       }
+               });
 
-                       _missile = _missile.chain;
+               if(incoming)
+               {
+                       msg_entity = this;
+                       soundto(MSG_ONE, vehic, CH_PAIN_SINGLE, SND(VEH_MISSILE_ALARM), VOL_BASE, ATTEN_NONE);
                }
 
-               if(_incomming)
-                       sound(vehic, CH_PAIN_SINGLE, SND_VEH_MISSILE_ALARM, VOL_BASE, ATTEN_NONE);
-
                vehic.bomb1.cnt = time + 1;
        }
 
@@ -464,7 +433,7 @@ bool raptor_frame(entity this)
        PHYS_INPUT_BUTTON_ATCK(this) = PHYS_INPUT_BUTTON_ATCK2(this) = PHYS_INPUT_BUTTON_CROUCH(this) = false;
 }
 
-bool raptor_takeoff(entity this)
+bool raptor_takeoff(entity this, float dt)
 {
        entity vehic = this.vehicle;
        return = true;
@@ -482,7 +451,7 @@ bool raptor_takeoff(entity this)
        // Takeoff sequense
        if(vehic.frame < 25)
        {
-               vehic.frame += 25 / (autocvar_g_vehicle_raptor_takeofftime / sys_frametime);
+               vehic.frame += 25 / (autocvar_g_vehicle_raptor_takeofftime / PHYS_INPUT_FRAMETIME);
                vehic.velocity_z = min(vehic.velocity_z * 1.5, 256);
                vehic.bomb1.gun1.avelocity_y = 90 + ((vehic.frame / 25) * 25000);
                vehic.bomb1.gun2.avelocity_y = -vehic.bomb1.gun1.avelocity_y;
@@ -494,13 +463,13 @@ bool raptor_takeoff(entity this)
                this.PlayerPhysplug = raptor_frame;
 
        if(vehic.vehicle_flags  & VHF_SHIELDREGEN)
-               vehicles_regen(vehic, vehic.dmg_time, vehicle_shield, autocvar_g_vehicle_raptor_shield, autocvar_g_vehicle_raptor_shield_regen_pause, autocvar_g_vehicle_raptor_shield_regen, frametime, true);
+               vehicles_regen(vehic, vehic.dmg_time, vehicle_shield, autocvar_g_vehicle_raptor_shield, autocvar_g_vehicle_raptor_shield_regen_pause, autocvar_g_vehicle_raptor_shield_regen, dt, true);
 
        if(vehic.vehicle_flags  & VHF_HEALTHREGEN)
-               vehicles_regen(vehic, vehic.dmg_time, vehicle_health, autocvar_g_vehicle_raptor_health, autocvar_g_vehicle_raptor_health_regen_pause, autocvar_g_vehicle_raptor_health_regen, frametime, false);
+               vehicles_regen(vehic, vehic.dmg_time, vehicle_health, autocvar_g_vehicle_raptor_health, autocvar_g_vehicle_raptor_health_regen_pause, autocvar_g_vehicle_raptor_health_regen, dt, false);
 
        if(vehic.vehicle_flags  & VHF_ENERGYREGEN)
-               vehicles_regen(vehic, vehic.cnt, vehicle_energy, autocvar_g_vehicle_raptor_energy, autocvar_g_vehicle_raptor_energy_regen_pause, autocvar_g_vehicle_raptor_energy_regen, frametime, false);
+               vehicles_regen(vehic, vehic.cnt, vehicle_energy, autocvar_g_vehicle_raptor_energy, autocvar_g_vehicle_raptor_energy_regen_pause, autocvar_g_vehicle_raptor_energy_regen, dt, false);
 
 
        vehic.bomb1.alpha = vehic.bomb2.alpha = (time - vehic.lip) / (vehic.delay - vehic.lip);
@@ -515,79 +484,82 @@ bool raptor_takeoff(entity this)
        PHYS_INPUT_BUTTON_ATCK(this) = PHYS_INPUT_BUTTON_ATCK2(this) = PHYS_INPUT_BUTTON_CROUCH(this) = false;
 }
 
-void raptor_blowup()
-{SELFPARAM();
-       self.deadflag   = DEAD_DEAD;
-       self.vehicle_exit(VHEF_NORMAL);
-       RadiusDamage (self, self.enemy, 250, 15, 250, world, world, 250, DEATH_VH_RAPT_DEATH.m_id, world);
-
-       self.alpha                = -1;
-       self.movetype      = MOVETYPE_NONE;
-       self.effects            = EF_NODRAW;
-       self.colormod      = '0 0 0';
-       self.avelocity    = '0 0 0';
-       self.velocity      = '0 0 0';
-
-       setorigin(self, self.pos1);
-       self.touch = func_null;
-       self.nextthink = 0;
+void raptor_blowup(entity this, entity toucher)
+{
+       this.deadflag   = DEAD_DEAD;
+       this.vehicle_exit(this, VHEF_NORMAL);
+       RadiusDamage (this, this.enemy, 250, 15, 250, NULL, NULL, 250, DEATH_VH_RAPT_DEATH.m_id, NULL);
+
+       this.alpha                = -1;
+       set_movetype(this, MOVETYPE_NONE);
+       this.effects            = EF_NODRAW;
+       this.colormod      = '0 0 0';
+       this.avelocity    = '0 0 0';
+       this.velocity      = '0 0 0';
+
+       setorigin(this, this.pos1);
+       settouch(this, func_null);
+       this.nextthink = 0;
 }
 
-void raptor_diethink()
-{SELFPARAM();
-       if(time >= self.wait)
-               self.think = raptor_blowup;
+void raptor_diethink(entity this)
+{
+       if(time >= this.wait)
+       {
+               raptor_blowup(this, NULL);
+               return;
+       }
 
        if(random() < 0.05)
        {
-               sound (self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
-               Send_Effect(EFFECT_EXPLOSION_SMALL, randomvec() * 80 + (self.origin + '0 0 100'), '0 0 0', 1);
+               sound (this, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
+               Send_Effect(EFFECT_EXPLOSION_SMALL, randomvec() * 80 + (this.origin + '0 0 100'), '0 0 0', 1);
        }
-       self.nextthink = time;
+       this.nextthink = time;
 
-       CSQCMODEL_AUTOUPDATE(self);
+       CSQCMODEL_AUTOUPDATE(this);
 }
 
 // If we dont do this ever now and then, the raptors rotors
 // stop working, presumably due to angle overflow. cute.
-void raptor_rotor_anglefix()
-{SELFPARAM();
-       self.gun1.angles_y = anglemods(self.gun1.angles_y);
-       self.gun2.angles_y = anglemods(self.gun2.angles_y);
-       self.nextthink = time + 15;
+void raptor_rotor_anglefix(entity this)
+{
+       this.gun1.angles_y = anglemods(this.gun1.angles_y);
+       this.gun2.angles_y = anglemods(this.gun2.angles_y);
+       this.nextthink = time + 15;
 }
 
-float raptor_impulse(float _imp)
-{SELFPARAM();
+bool raptor_impulse(entity this, int _imp)
+{
        switch(_imp)
        {
                case IMP_weapon_group_1.impulse:
-                       self.vehicle.vehicle_weapon2mode = RSM_BOMB;
-                       CSQCVehicleSetup(self, 0);
+                       this.vehicle.vehicle_weapon2mode = RSM_BOMB;
+                       CSQCVehicleSetup(this, 0);
                        return true;
                case IMP_weapon_group_2.impulse:
-                       self.vehicle.vehicle_weapon2mode = RSM_FLARE;
-                       CSQCVehicleSetup(self, 0);
+                       this.vehicle.vehicle_weapon2mode = RSM_FLARE;
+                       CSQCVehicleSetup(this, 0);
                        return true;
 
                case IMP_weapon_next_byid.impulse:
                case IMP_weapon_next_bypriority.impulse:
                case IMP_weapon_next_bygroup.impulse:
-                       self.vehicle.vehicle_weapon2mode += 1;
-                       if(self.vehicle.vehicle_weapon2mode > RSM_LAST)
-                               self.vehicle.vehicle_weapon2mode = RSM_FIRST;
+                       this.vehicle.vehicle_weapon2mode += 1;
+                       if(this.vehicle.vehicle_weapon2mode > RSM_LAST)
+                               this.vehicle.vehicle_weapon2mode = RSM_FIRST;
 
-                       CSQCVehicleSetup(self, 0);
+                       CSQCVehicleSetup(this, 0);
                        return true;
                case IMP_weapon_last.impulse:
                case IMP_weapon_prev_byid.impulse:
                case IMP_weapon_prev_bypriority.impulse:
                case IMP_weapon_prev_bygroup.impulse:
-                       self.vehicle.vehicle_weapon2mode -= 1;
-                       if(self.vehicle.vehicle_weapon2mode < RSM_FIRST)
-                               self.vehicle.vehicle_weapon2mode = RSM_LAST;
+                       this.vehicle.vehicle_weapon2mode -= 1;
+                       if(this.vehicle.vehicle_weapon2mode < RSM_FIRST)
+                               this.vehicle.vehicle_weapon2mode = RSM_LAST;
 
-                       CSQCVehicleSetup(self, 0);
+                       CSQCVehicleSetup(this, 0);
                        return true;
 
                /*
@@ -602,34 +574,33 @@ float raptor_impulse(float _imp)
 
 spawnfunc(vehicle_raptor)
 {
-       if(!autocvar_g_vehicle_raptor) { remove(self); return; }
-       if(!vehicle_initialize(VEH_RAPTOR, false)) { remove(self); return; }
+       if(!autocvar_g_vehicle_raptor) { delete(this); return; }
+       if(!vehicle_initialize(this, VEH_RAPTOR, false)) { delete(this); return; }
 }
 
 METHOD(Raptor, vr_impact, void(Raptor thisveh, entity instance))
 {
     if(autocvar_g_vehicle_raptor_bouncepain)
-        vehicles_impact(autocvar_g_vehicle_raptor_bouncepain_x, autocvar_g_vehicle_raptor_bouncepain_y, autocvar_g_vehicle_raptor_bouncepain_z);
+        vehicles_impact(instance, autocvar_g_vehicle_raptor_bouncepain_x, autocvar_g_vehicle_raptor_bouncepain_y, autocvar_g_vehicle_raptor_bouncepain_z);
 }
 METHOD(Raptor, vr_enter, void(Raptor thisveh, entity instance))
 {
-    SELFPARAM();
-    self.vehicle_weapon2mode = RSM_BOMB;
-    self.owner.PlayerPhysplug = raptor_takeoff;
-    self.movetype         = MOVETYPE_BOUNCEMISSILE;
-    self.solid           = SOLID_SLIDEBOX;
-    self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_raptor_health) * 100;
-    self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_raptor_shield) * 100;
-    self.velocity_z = 1; // Nudge upwards to takeoff sequense can work.
-    self.tur_head.exteriormodeltoclient = self.owner;
-
-    self.delay = time + autocvar_g_vehicle_raptor_bombs_refire;
-    self.lip   = time;
-
-    if(self.owner.flagcarried)
-       setorigin(self.owner.flagcarried, '-20 0 96');
-
-    CSQCVehicleSetup(self.owner, 0);
+    instance.vehicle_weapon2mode = RSM_BOMB;
+    instance.owner.PlayerPhysplug = raptor_takeoff;
+    set_movetype(instance, MOVETYPE_BOUNCEMISSILE);
+    instance.solid               = SOLID_SLIDEBOX;
+    instance.owner.vehicle_health = (instance.vehicle_health / autocvar_g_vehicle_raptor_health) * 100;
+    instance.owner.vehicle_shield = (instance.vehicle_shield / autocvar_g_vehicle_raptor_shield) * 100;
+    instance.velocity = '0 0 1'; // nudge upwards so takeoff sequence can work
+    instance.tur_head.exteriormodeltoclient = instance.owner;
+
+    instance.delay = time + autocvar_g_vehicle_raptor_bombs_refire;
+    instance.lip   = time;
+
+    if(instance.owner.flagcarried)
+       setorigin(instance.owner.flagcarried, '-20 0 96');
+
+    CSQCVehicleSetup(instance.owner, 0);
 }
 METHOD(Raptor, vr_death, void(Raptor thisveh, entity instance))
 {
@@ -638,8 +609,8 @@ METHOD(Raptor, vr_death, void(Raptor thisveh, entity instance))
     instance.solid                             = SOLID_CORPSE;
     instance.takedamage                        = DAMAGE_NO;
     instance.deadflag                  = DEAD_DYING;
-    instance.movetype                  = MOVETYPE_BOUNCE;
-    instance.think                             = raptor_diethink;
+    set_movetype(instance, MOVETYPE_BOUNCE);
+    setthink(instance, raptor_diethink);
     instance.nextthink                 = time;
     instance.wait                              = time + 5 + (random() * 5);
 
@@ -651,120 +622,124 @@ METHOD(Raptor, vr_death, void(Raptor thisveh, entity instance))
     instance.avelocity -= '0 0.5 1' * (random() * 400);
 
     instance.colormod = '-0.5 -0.5 -0.5';
-    instance.touch = raptor_blowup;
+    settouch(instance, raptor_blowup);
 }
 METHOD(Raptor, vr_spawn, void(Raptor thisveh, entity instance))
 {
-    SELFPARAM();
-    if(!self.gun1)
+    if(!instance.gun1)
     {
         entity spinner;
         vector ofs;
 
         //FIXME: Camera is in a bad place in HUD model.
-        //setorigin(self.vehicle_viewport, '25 0 5');
+        //setorigin(instance.vehicle_viewport, '25 0 5');
 
-        self.vehicles_impulse   = raptor_impulse;
+        instance.vehicles_impulse = raptor_impulse;
 
-        self.frame = 0;
+        instance.frame = 0;
 
-        self.bomb1 = new(raptor_bomb);
-        self.bomb2 = new(raptor_bomb);
-        self.gun1  = new(raptor_gun);
-        self.gun2  = new(raptor_gun);
+        instance.bomb1 = new(raptor_bomb);
+        instance.bomb2 = new(raptor_bomb);
+        instance.gun1  = new(raptor_gun);
+        instance.gun2  = new(raptor_gun);
 
-        setmodel(self.bomb1, MDL_VEH_RAPTOR_CB_FOLDED);
-        setmodel(self.bomb2, MDL_VEH_RAPTOR_CB_FOLDED);
-        setmodel(self.gun1, MDL_VEH_RAPTOR_GUN);
-        setmodel(self.gun2, MDL_VEH_RAPTOR_GUN);
-        setmodel(self.tur_head, MDL_VEH_RAPTOR_TAIL);
+        setmodel(instance.bomb1, MDL_VEH_RAPTOR_CB_FOLDED);
+        setmodel(instance.bomb2, MDL_VEH_RAPTOR_CB_FOLDED);
+        setmodel(instance.gun1, MDL_VEH_RAPTOR_GUN);
+        setmodel(instance.gun2, MDL_VEH_RAPTOR_GUN);
+        setmodel(instance.tur_head, MDL_VEH_RAPTOR_TAIL);
 
-        setattachment(self.bomb1, self, "bombmount_left");
-        setattachment(self.bomb2, self, "bombmount_right");
-        setattachment(self.tur_head, self,"root");
+        setattachment(instance.bomb1, instance, "bombmount_left");
+        setattachment(instance.bomb2, instance, "bombmount_right");
+        setattachment(instance.tur_head, instance,"root");
 
         // FIXMODEL Guns mounts to angled bones
-        self.bomb1.angles = self.angles;
-        self.angles = '0 0 0';
+        instance.bomb1.angles = instance.angles;
+        instance.angles = '0 0 0';
         // This messes up gun-aim, so work arround it.
-        //setattachment(self.gun1, self, "gunmount_left");
-        ofs = gettaginfo(self, gettagindex(self, "gunmount_left"));
-        ofs -= self.origin;
-        setattachment(self.gun1, self, "");
-        setorigin(self.gun1, ofs);
+        //setattachment(instance.gun1, instance, "gunmount_left");
+        ofs = gettaginfo(instance, gettagindex(instance, "gunmount_left"));
+        ofs -= instance.origin;
+        setattachment(instance.gun1, instance, "");
+        setorigin(instance.gun1, ofs);
 
-        //setattachment(self.gun2, self, "gunmount_right");
-        ofs = gettaginfo(self, gettagindex(self, "gunmount_right"));
-        ofs -= self.origin;
-        setattachment(self.gun2, self, "");
-        setorigin(self.gun2, ofs);
+        //setattachment(instance.gun2, instance, "gunmount_right");
+        ofs = gettaginfo(instance, gettagindex(instance, "gunmount_right"));
+        ofs -= instance.origin;
+        setattachment(instance.gun2, instance, "");
+        setorigin(instance.gun2, ofs);
 
-        self.angles = self.bomb1.angles;
-        self.bomb1.angles = '0 0 0';
+        instance.angles = instance.bomb1.angles;
+        instance.bomb1.angles = '0 0 0';
 
         spinner = new(raptor_spinner);
-        spinner.owner = self;
+        spinner.owner = instance;
         setmodel(spinner, MDL_VEH_RAPTOR_PROP);
-        setattachment(spinner, self, "engine_left");
-        spinner.movetype = MOVETYPE_NOCLIP;
+        setattachment(spinner, instance, "engine_left");
+        set_movetype(spinner, MOVETYPE_NOCLIP);
         spinner.avelocity = '0 90 0';
-        self.bomb1.gun1 = spinner;
+        instance.bomb1.gun1 = spinner;
 
         spinner = new(raptor_spinner);
-        spinner.owner = self;
+        spinner.owner = instance;
         setmodel(spinner, MDL_VEH_RAPTOR_PROP);
-        setattachment(spinner, self, "engine_right");
-        spinner.movetype = MOVETYPE_NOCLIP;
+        setattachment(spinner, instance, "engine_right");
+        set_movetype(spinner, MOVETYPE_NOCLIP);
         spinner.avelocity = '0 -90 0';
-        self.bomb1.gun2 = spinner;
+        instance.bomb1.gun2 = spinner;
 
         // Sigh.
-        self.bomb1.think = raptor_rotor_anglefix;
-        self.bomb1.nextthink = time;
+        setthink(instance.bomb1, raptor_rotor_anglefix);
+        instance.bomb1.nextthink = time;
 
-        self.mass                         = 1 ;
+        instance.mass                     = 1 ;
     }
 
-    self.frame           = 0;
-    self.vehicle_health = autocvar_g_vehicle_raptor_health;
-    self.vehicle_shield = autocvar_g_vehicle_raptor_shield;
-    self.movetype         = MOVETYPE_TOSS;
-    self.solid           = SOLID_SLIDEBOX;
-    self.vehicle_energy = 1;
+    instance.frame               = 0;
+    instance.vehicle_health = autocvar_g_vehicle_raptor_health;
+    instance.vehicle_shield = autocvar_g_vehicle_raptor_shield;
+    set_movetype(instance, MOVETYPE_TOSS);
+    instance.solid               = SOLID_SLIDEBOX;
+    instance.vehicle_energy = 1;
+
+    if(!autocvar_g_vehicle_raptor_swim)
+       instance.dphitcontentsmask |= DPCONTENTS_LIQUIDSMASK;
 
-    self.PlayerPhysplug = raptor_frame;
+    instance.PlayerPhysplug = raptor_frame;
 
-    self.bomb1.gun1.avelocity_y = 90;
-    self.bomb1.gun2.avelocity_y = -90;
+    instance.bomb1.gun1.avelocity_y = 90;
+    instance.bomb1.gun2.avelocity_y = -90;
 
-    self.delay = time;
+    instance.delay = time;
 
-    self.bouncefactor = autocvar_g_vehicle_raptor_bouncefactor;
-    self.bouncestop = autocvar_g_vehicle_raptor_bouncestop;
-    self.damageforcescale = 0.25;
-    self.vehicle_health = autocvar_g_vehicle_raptor_health;
-    self.vehicle_shield = autocvar_g_vehicle_raptor_shield;
+    instance.bouncefactor = autocvar_g_vehicle_raptor_bouncefactor;
+    instance.bouncestop = autocvar_g_vehicle_raptor_bouncestop;
+    instance.damageforcescale = 0.25;
+    instance.vehicle_health = autocvar_g_vehicle_raptor_health;
+    instance.vehicle_shield = autocvar_g_vehicle_raptor_shield;
 }
 METHOD(Raptor, vr_setup, void(Raptor thisveh, entity instance))
 {
-    SELFPARAM();
     if(autocvar_g_vehicle_raptor_shield)
-        self.vehicle_flags |= VHF_HASSHIELD;
+        instance.vehicle_flags |= VHF_HASSHIELD;
 
     if(autocvar_g_vehicle_raptor_shield_regen)
-        self.vehicle_flags |= VHF_SHIELDREGEN;
+        instance.vehicle_flags |= VHF_SHIELDREGEN;
 
     if(autocvar_g_vehicle_raptor_health_regen)
-        self.vehicle_flags |= VHF_HEALTHREGEN;
+        instance.vehicle_flags |= VHF_HEALTHREGEN;
 
     if(autocvar_g_vehicle_raptor_energy_regen)
-        self.vehicle_flags |= VHF_ENERGYREGEN;
+        instance.vehicle_flags |= VHF_ENERGYREGEN;
+
+    instance.vehicle_exit = raptor_exit;
+    instance.respawntime = autocvar_g_vehicle_raptor_respawntime;
+    instance.vehicle_health = autocvar_g_vehicle_raptor_health;
+    instance.vehicle_shield = autocvar_g_vehicle_raptor_shield;
+    instance.max_health = instance.vehicle_health;
 
-    self.vehicle_exit = raptor_exit;
-    self.respawntime = autocvar_g_vehicle_raptor_respawntime;
-    self.vehicle_health = autocvar_g_vehicle_raptor_health;
-    self.vehicle_shield = autocvar_g_vehicle_raptor_shield;
-    self.max_health = self.vehicle_health;
+    if(!autocvar_g_vehicle_raptor_swim)
+       instance.dphitcontentsmask |= DPCONTENTS_LIQUIDSMASK;
 }
 
 #endif
@@ -776,9 +751,8 @@ METHOD(Raptor, vr_hud, void(Raptor thisveh))
                      "vehicle_icon_ammo1", autocvar_hud_progressbar_vehicles_ammo1_color,
                      "vehicle_icon_ammo2", autocvar_hud_progressbar_vehicles_ammo2_color);
 }
-METHOD(Raptor, vr_crosshair, void(Raptor thisveh))
+METHOD(Raptor, vr_crosshair, void(Raptor thisveh, entity player))
 {
-    SELFPARAM();
     string crosshair;
 
     switch(weapon2mode)
@@ -789,14 +763,14 @@ METHOD(Raptor, vr_crosshair, void(Raptor thisveh))
     }
 
     vector tmpSize = '0 0 0';
-    if(weapon2mode != RSM_FLARE)
+    if(weapon2mode != RSM_FLARE && !spectatee_status)
     {
         vector where;
 
         if(!dropmark)
         {
             dropmark = spawn();
-            dropmark.owner = self;
+            dropmark.owner = player;
             dropmark.gravity = 1;
         }
 
@@ -805,7 +779,7 @@ METHOD(Raptor, vr_crosshair, void(Raptor thisveh))
         {
             setorigin(dropmark, pmove_org);
             dropmark.velocity = pmove_vel;
-            tracetoss(dropmark, self);
+            tracetoss(dropmark, player);
 
             where = project_3d_to_2d(trace_endpos);