]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/vehicles/vehicle/bumblebee.qc
Merge branch 'terencehill/lms_itemtimes_fix' into 'master'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / vehicles / vehicle / bumblebee.qc
index 2eee4dcf5af11a90ae40b077f1962c9fd3e2133b..cd2804a337bc10aee7d236538cd49c0b7f8b8f4d 100644 (file)
@@ -8,6 +8,8 @@ CLASS(Bumblebee, Vehicle)
 /* spawnflags */ ATTRIB(Bumblebee, spawnflags, int, VHF_DMGSHAKE);
 /* mins       */ ATTRIB(Bumblebee, mins, vector, '-245 -130 -130');
 /* maxs       */ ATTRIB(Bumblebee, maxs, vector, '230 130 130');
+/* view offset*/ ATTRIB(Bumblebee, view_ofs, vector, '0 0 300');
+/* view dist  */ ATTRIB(Bumblebee, height, float, 450);
 /* model         */ ATTRIB(Bumblebee, mdl, string, "models/vehicles/bumblebee_body.dpm");
 /* model         */ ATTRIB(Bumblebee, model, string, "models/vehicles/bumblebee_body.dpm");
 /* head_model */ ATTRIB(Bumblebee, head_model, string, "");
@@ -101,6 +103,9 @@ float bumblebee_gunner_frame()
        entity gunner   = self;
        setself(vehic);
 
+       // this isn't technically a vehicle (yet), let's not do frame functions on it (yet)
+       //vehicles_frame(gun, player);
+
        vehic.solid = SOLID_NOT;
        //setorigin(gunner, vehic.origin);
        gunner.velocity = vehic.velocity;
@@ -134,7 +139,7 @@ float bumblebee_gunner_frame()
                if(trace_ent)
                        if(trace_ent.movetype)
                                if(trace_ent.takedamage)
-                                       if(!trace_ent.deadflag)
+                                       if(!IS_DEAD(trace_ent) && !STAT(FROZEN, trace_ent))
                                        {
                                                if(DIFF_TEAM(trace_ent, gunner))
                                                {
@@ -174,13 +179,13 @@ float bumblebee_gunner_frame()
 
        if(!forbidWeaponUse(gunner))
        if(gunner.BUTTON_ATCK)
-               if(time > gun.attack_finished_single)
+               if(time > gun.attack_finished_single[0])
                        if(gun.vehicle_energy >= autocvar_g_vehicle_bumblebee_cannon_cost)
                        {
                                gun.vehicle_energy -= autocvar_g_vehicle_bumblebee_cannon_cost;
                                bumblebee_fire_cannon(gun, "fire", gunner);
                                gun.delay = time;
-                               gun.attack_finished_single = time + autocvar_g_vehicle_bumblebee_cannon_refire;
+                               gun.attack_finished_single[0] = time + autocvar_g_vehicle_bumblebee_cannon_refire;
                        }
 
        VEHICLE_UPDATE_PLAYER(gunner, health, bumblebee);
@@ -209,11 +214,11 @@ vector bumblebee_gunner_findgoodexit(vector prefer_spot, entity gunner, entity p
        //vector exitspot;
        float mysize;
 
-       tracebox(gunner.origin + '0 0 32', PL_MIN, PL_MAX, prefer_spot, MOVE_NORMAL, player);
+       tracebox(gunner.origin + '0 0 32', STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), prefer_spot, MOVE_NORMAL, player);
        if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
                return prefer_spot;
 
-       mysize = 1.5 * vlen(PL_MAX - PL_MIN); // can't use gunner's size, as they don't have a size
+       mysize = 1.5 * vlen(STAT(PL_MAX, NULL) - STAT(PL_MIN, NULL)); // can't use gunner's size, as they don't have a size
        float i;
        vector v, v2;
        v2 = 0.5 * (gunner.absmin + gunner.absmax);
@@ -222,7 +227,7 @@ vector bumblebee_gunner_findgoodexit(vector prefer_spot, entity gunner, entity p
                v = randomvec();
                v_z = 0;
                v = v2 + normalize(v) * mysize;
-               tracebox(v2, PL_MIN, PL_MAX, v, MOVE_NORMAL, player);
+               tracebox(v2, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), v, MOVE_NORMAL, player);
                if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
                        return v;
        }
@@ -249,7 +254,7 @@ void bumblebee_gunner_exit(int _exitflag)
        }
 
        CSQCVehicleSetup(player, HUD_NORMAL);
-       setsize(player, PL_MIN, PL_MAX);
+       setsize(player, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL));
 
        player.takedamage     = DAMAGE_AIM;
        player.solid          = SOLID_SLIDEBOX;
@@ -257,11 +262,11 @@ void bumblebee_gunner_exit(int _exitflag)
        player.effects       &= ~EF_NODRAW;
        player.alpha          = 1;
        player.PlayerPhysplug = func_null;
-       player.view_ofs       = PL_VIEW_OFS;
+       player.view_ofs       = STAT(PL_VIEW_OFS, NULL);
        player.event_damage   = PlayerDamage;
        player.hud            = HUD_NORMAL;
        player.teleportable       = TELEPORT_NORMAL;
-       player.switchweapon   = gunner.switchweapon;
+       PS(player).m_switchweapon = gunner.m_switchweapon;
        player.vehicle_enter_delay = time + 2;
 
        fixedmakevectors(vehic.angles);
@@ -295,7 +300,7 @@ bool bumblebee_gunner_enter()
        if(!vehic.gunner1 && !vehic.gunner2 && ((time >= vehic.gun1.phase) + (time >= vehic.gun2.phase)) == 2)
        {
                // we can have some fun
-               if(vlen(real_origin(vehic.gun2) - player.origin) < vlen(real_origin(vehic.gun1) - player.origin))
+               if(vlen2(real_origin(vehic.gun2) - player.origin) < vlen2(real_origin(vehic.gun1) - player.origin))
                {
                        gunner = vehic.gun2;
                        vehic.gunner2 = player;
@@ -330,7 +335,7 @@ bool bumblebee_gunner_enter()
 
        RemoveGrapplingHook(player);
 
-       gunner.switchweapon = player.switchweapon;
+       gunner.m_switchweapon = PS(player).m_switchweapon;
        gunner.vehicle_exit = bumblebee_gunner_exit;
        gunner.vehicle_hudmodel.viewmodelforclient = player;
 
@@ -359,7 +364,7 @@ bool vehicles_valid_pilot()
                return false;
 
        if((!IS_PLAYER(other))
-       || (other.deadflag != DEAD_NO)
+       || (IS_DEAD(other))
        || (other.vehicle)
        || (DIFF_TEAM(other, self))
        ) { return false; }
@@ -426,7 +431,9 @@ float bumblebee_pilot_frame()
        vehic = self.vehicle;
        setself(vehic);
 
-       if(vehic.deadflag != DEAD_NO)
+       vehicles_frame(vehic, pilot);
+
+       if(IS_DEAD(vehic))
        {
                setself(pilot);
                pilot.BUTTON_ATCK = pilot.BUTTON_ATCK2 = 0;
@@ -508,13 +515,13 @@ float bumblebee_pilot_frame()
 
        if(autocvar_g_vehicle_bumblebee_healgun_locktime)
        {
-               if(vehic.tur_head.lock_time < time || vehic.tur_head.enemy.deadflag)
+               if(vehic.tur_head.lock_time < time || IS_DEAD(vehic.tur_head.enemy) || STAT(FROZEN, vehic.tur_head.enemy))
                        vehic.tur_head.enemy = world;
 
                if(trace_ent)
                if(trace_ent.movetype)
                if(trace_ent.takedamage)
-               if(!trace_ent.deadflag)
+               if(!IS_DEAD(trace_ent) && !STAT(FROZEN, trace_ent))
                {
                        if(teamplay)
                        {
@@ -562,7 +569,7 @@ float bumblebee_pilot_frame()
                        }
                        else
                        {
-                               if(trace_ent.deadflag == DEAD_NO)
+                               if(!IS_DEAD(trace_ent))
                                        if((teamplay && trace_ent.team == pilot.team) || !teamplay)
                                        {
 
@@ -659,7 +666,7 @@ void bumblebee_exit(float eject)
 
        self.touch = vehicles_touch;
 
-       if(self.deadflag == DEAD_NO)
+       if(!IS_DEAD(self))
        {
                self.think = bumblebee_land;
                self.nextthink  = time;
@@ -672,7 +679,7 @@ void bumblebee_exit(float eject)
 
        fixedmakevectors(self.angles);
        vector spot;
-       if(vlen(self.velocity) > autocvar_g_vehicle_bumblebee_speed_forward * 0.5)
+       if(vdist(self.velocity, >, autocvar_g_vehicle_bumblebee_speed_forward * 0.5))
                spot = self.origin + v_up * 128 + v_forward * 300;
        else
                spot = self.origin + v_up * 128 - v_forward * 300;
@@ -729,19 +736,19 @@ spawnfunc(vehicle_bumblebee)
        if(!vehicle_initialize(VEH_BUMBLEBEE, false)) { remove(self); return; }
 }
 
-               METHOD(Bumblebee, vr_impact, void(Bumblebee thisveh))
+               METHOD(Bumblebee, vr_impact, void(Bumblebee thisveh, entity instance))
                {
                        if(autocvar_g_vehicle_bumblebee_bouncepain)
                                vehicles_impact(autocvar_g_vehicle_bumblebee_bouncepain_x, autocvar_g_vehicle_bumblebee_bouncepain_y, autocvar_g_vehicle_bumblebee_bouncepain_z);
                }
-               METHOD(Bumblebee, vr_enter, void(Bumblebee thisveh))
+               METHOD(Bumblebee, vr_enter, void(Bumblebee thisveh, entity instance))
                {
                        SELFPARAM();
                        self.touch = bumblebee_touch;
                        self.nextthink = 0;
                        self.movetype = MOVETYPE_BOUNCEMISSILE;
                }
-               METHOD(Bumblebee, vr_think, void(Bumblebee thisveh))
+               METHOD(Bumblebee, vr_think, void(Bumblebee thisveh, entity instance))
                {
                        SELFPARAM();
                        self.angles_z *= 0.8;
@@ -779,7 +786,7 @@ spawnfunc(vehicle_bumblebee)
                                }
                        }
                }
-               METHOD(Bumblebee, vr_death, void(Bumblebee thisveh))
+               METHOD(Bumblebee, vr_death, void(Bumblebee thisveh, entity instance))
                {
                        SELFPARAM();
                        entity oldself = self;
@@ -843,7 +850,7 @@ spawnfunc(vehicle_bumblebee)
 
                        setorigin(self, self.pos1);
                }
-               METHOD(Bumblebee, vr_spawn, void(Bumblebee thisveh))
+               METHOD(Bumblebee, vr_spawn, void(Bumblebee thisveh, entity instance))
                {
                        SELFPARAM();
                        if(!self.gun1)
@@ -859,9 +866,9 @@ spawnfunc(vehicle_bumblebee)
                                self.vehicle_shieldent.alpha = -1;
                                self.vehicle_shieldent.effects = EF_LOWPRECISION | EF_NODRAW;
 
-                               self.gun1 = spawn();
-                               self.gun2 = spawn();
-                               self.gun3 = spawn();
+                               self.gun1 = new(vehicle_playerslot);
+                               self.gun2 = new(vehicle_playerslot);
+                               self.gun3 = new(bumblebee_raygun);
 
                                self.vehicle_flags |= VHF_MULTISLOT;
 
@@ -869,8 +876,6 @@ spawnfunc(vehicle_bumblebee)
                                self.gun2.owner = self;
                                self.gun3.owner = self;
 
-                               self.gun1.classname = self.gun2.classname = "vehicle_playerslot";
-
                                setmodel(self.gun1, MDL_VEH_BUMBLEBEE_CANNON_RIGHT);
                                setmodel(self.gun2, MDL_VEH_BUMBLEBEE_CANNON_LEFT);
                                setmodel(self.gun3, MDL_VEH_BUMBLEBEE_CANNON_CENTER);
@@ -923,7 +928,7 @@ spawnfunc(vehicle_bumblebee)
 
                        setorigin(self, self.origin + '0 0 25');
                }
-               METHOD(Bumblebee, vr_setup, void(Bumblebee thisveh))
+               METHOD(Bumblebee, vr_setup, void(Bumblebee thisveh, entity instance))
                {
                        SELFPARAM();
                        if(autocvar_g_vehicle_bumblebee_energy)
@@ -984,7 +989,7 @@ void CSQC_BUMBLE_GUN_HUD()
                {
                        Vehicles_drawCrosshair(vCROSS_HEAL);
                }
-               METHOD(Bumblebee, vr_setup, void(Bumblebee thisveh))
+               METHOD(Bumblebee, vr_setup, void(Bumblebee thisveh, entity instance))
                {
                        AuxiliaryXhair[0].axh_image = vCROSS_LOCK;  // Raygun-locked
                        AuxiliaryXhair[1].axh_image = vCROSS_BURST; // Gunner1