]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/vehicles/cl_vehicles.qc
Properly support team field on trigger_multiple
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / vehicles / cl_vehicles.qc
index 3472a7f1c7e7e76747e0b056ef22c31d12c589ca..b2f87821eea414ca4b6eb764663571d4d1826c4c 100644 (file)
@@ -1,3 +1,4 @@
+#include "cl_vehicles.qh"
 const string vCROSS_BURST = "gfx/vehicles/crosshair_burst.tga";
 const string vCROSS_DROP  = "gfx/vehicles/crosshair_drop.tga";
 const string vCROSS_GUIDE = "gfx/vehicles/crosshair_guide.tga";
@@ -18,41 +19,45 @@ entity AuxiliaryXhair[MAX_AXH];
 float alarm1time;
 float alarm2time;
 
-void vehicle_alarm(entity e, int ch, string s0und)
+void vehicle_alarm(entity e, int ch, Sound s0und)
 {
+    TC(Sound, s0und);
        if(!autocvar_cl_vehicles_alarm)
                return;
 
-       _sound(e, ch, s0und, VOL_BASEVOICE, ATTEN_NONE);
+       sound(e, ch, s0und, VOL_BASEVOICE, ATTEN_NONE);
 }
 
 void AuxiliaryXhair_Draw2D(entity this)
 {
-       if (scoreboard_showscores)
+       if (scoreboard_active)
                return;
 
-       vector size = draw_getimagesize(self.axh_image) * autocvar_cl_vehicles_crosshair_size;
-       vector pos = project_3d_to_2d(self.move_origin) - 0.5 * size;
+       vector pos = project_3d_to_2d(this.origin);
 
        if (!(pos.z < 0 || pos.x < 0 || pos.y < 0 || pos.x > vid_conwidth || pos.y > vid_conheight))
        {
+               vector size = draw_getimagesize(this.axh_image) * autocvar_cl_vehicles_crosshair_size;
+               pos.x -= 0.5 * size.x;
+               pos.y -= 0.5 * size.y;
                pos.z = 0;
-               size.z = 0;
-               drawpic(pos, self.axh_image, size, self.colormod, autocvar_crosshair_alpha * self.alpha, self.axh_drawflag);
+               drawpic(pos, this.axh_image, size, this.colormod, autocvar_crosshair_alpha * this.alpha, this.axh_drawflag);
        }
 
-       if(time - self.cnt > self.axh_fadetime)
-               self.draw2d = func_null;
+       if(time - this.cnt > this.axh_fadetime)
+               this.draw2d = func_null;
 }
 
-void Net_AuXair2(bool bIsNew)
+NET_HANDLE(ENT_CLIENT_AUXILIARYXHAIR, bool isnew)
 {
+       int sf = ReadByte();
+
        int axh_id      = bound(0, ReadByte(), MAX_AXH);
-       entity axh              = AuxiliaryXhair[axh_id];
+       entity axh = AuxiliaryXhair[axh_id];
 
-       if(axh == world || wasfreed(axh))  // MADNESS? THIS IS QQQQCCCCCCCCC (wasfreed, why do you exsist?)
+       if(axh == NULL || wasfreed(axh))
        {
-               axh                                     = spawn();
+               axh                                     = new(auxiliary_crosshair);
                axh.draw2d                      = func_null;
                axh.drawmask            = MASK_NORMAL;
                axh.axh_drawflag        = DRAWFLAG_ADDITIVE;
@@ -60,27 +65,50 @@ void Net_AuXair2(bool bIsNew)
                axh.axh_image           = vCROSS_HINT;
                axh.alpha                       = 1;
                AuxiliaryXhair[axh_id] = axh;
+               IL_PUSH(g_drawables_2d, axh);
+       }
+
+       if(sf & 2)
+       {
+               axh.origin_x = ReadCoord();
+               axh.origin_y = ReadCoord();
+               axh.origin_z = ReadCoord();
+       }
+
+       if(sf & 4)
+       {
+               axh.colormod_x = ReadByte() / 255;
+               axh.colormod_y = ReadByte() / 255;
+               axh.colormod_z = ReadByte() / 255;
        }
 
-       axh.move_origin_x       = ReadCoord();
-       axh.move_origin_y       = ReadCoord();
-       axh.move_origin_z       = ReadCoord();
-       axh.colormod_x          = ReadByte() / 255;
-       axh.colormod_y          = ReadByte() / 255;
-       axh.colormod_z          = ReadByte() / 255;
        axh.cnt                         = time;
        axh.draw2d                      = AuxiliaryXhair_Draw2D;
+       return true;
 }
 
-void Net_VehicleSetup()
-{SELFPARAM();
+NET_HANDLE(TE_CSQC_VEHICLESETUP, bool isnew)
+{
        int hud_id = ReadByte();
+       return = true;
 
        // hud_id == 0 means we exited a vehicle, so stop alarm sound/s
-       if(hud_id == 0)
+       // note: HUD_NORMAL is set to 0 currently too, but we'll check both just in case
+       if(hud_id == 0 || hud_id == HUD_NORMAL)
        {
-               sound(self, CH_TRIGGER_SINGLE, SND_Null, VOL_BASEVOICE, ATTEN_NONE);
-               sound(self, CH_PAIN_SINGLE, SND_Null, VOL_BASEVOICE, ATTEN_NONE);
+               sound(this, CH_TRIGGER_SINGLE, SND_Null, VOL_BASEVOICE, ATTEN_NONE);
+               sound(this, CH_PAIN_SINGLE, SND_Null, VOL_BASEVOICE, ATTEN_NONE);
+
+               for(int i = 0; i < MAX_AXH; ++i)
+               {
+                       entity axh = AuxiliaryXhair[i];
+
+                       if(axh != NULL && !wasfreed(axh))
+                       {
+                               AuxiliaryXhair[i] = NULL;
+                               delete(axh);
+                       }
+               }
                return;
        }
 
@@ -89,8 +117,8 @@ void Net_VehicleSetup()
        {
                entity axh = AuxiliaryXhair[i];
 
-               if(axh != world && !wasfreed(axh))  // MADNESS? THIS IS QQQQCCCCCCCCC (wasfreed, why do you exsist?)
-                       remove(axh);
+               if(axh != NULL && !wasfreed(axh))  // MADNESS? THIS IS QQQQCCCCCCCCC (wasfreed, why do you exsist?)
+                       delete(axh);
 
                axh              = spawn();
                axh.draw2d       = func_null;
@@ -100,6 +128,7 @@ void Net_VehicleSetup()
                axh.axh_image    = vCROSS_HINT;
                axh.alpha        = 1;
                AuxiliaryXhair[i] = axh;
+               IL_PUSH(g_drawables_2d, axh);
        }
 
        if(hud_id == HUD_BUMBLEBEE_GUN)
@@ -107,8 +136,8 @@ void Net_VehicleSetup()
                AuxiliaryXhair[0].axh_image = vCROSS_BURST; // Plasma cannons
                AuxiliaryXhair[1].axh_image = vCROSS_BURST; // Raygun
        } else {
-               Vehicle info = get_vehicleinfo(hud_id);
-       info.vr_setup(info);
+               Vehicle info = Vehicles_from(hud_id);
+       info.vr_setup(info, NULL);
        }
 }
 
@@ -119,32 +148,23 @@ void Vehicles_drawHUD(
        string iconAmmo1,
        vector colorAmmo1,
        string iconAmmo2,
-       vector colorAmmo2,
-       string crosshair)
-{SELFPARAM();
-       if(autocvar_r_letterbox)
-               return;
-
-       if(scoreboard_showscores)
-               return;
-
+       vector colorAmmo2)
+{
        // Initialize
-       vector hudSize = '0 0 0';
-       vector hudPos  = '0 0 0';
        vector tmpSize = '0 0 0';
        vector tmpPos  = '0 0 0';
 
-       float hudAlpha = autocvar_hud_panel_fg_alpha;
+       float hudAlpha = autocvar_hud_panel_fg_alpha * hud_fade_alpha;
        float barAlpha = autocvar_hud_progressbar_alpha * hudAlpha;
        float blinkValue = 0.55 + sin(time * 7) * 0.45;
 
-       float health  = getstati(STAT_VEHICLESTAT_HEALTH)  * 0.01;
-       float shield  = getstati(STAT_VEHICLESTAT_SHIELD)  * 0.01;
-       float energy  = getstati(STAT_VEHICLESTAT_ENERGY)  * 0.01;
-       float ammo1   = getstati(STAT_VEHICLESTAT_AMMO1)   * 0.01;
-       float reload1 = getstati(STAT_VEHICLESTAT_RELOAD1) * 0.01;
-       float ammo2   = getstati(STAT_VEHICLESTAT_AMMO2)   * 0.01;
-       float reload2 = getstati(STAT_VEHICLESTAT_RELOAD2) * 0.01;
+       float health  = STAT(VEHICLESTAT_HEALTH)  * 0.01;
+       float shield  = STAT(VEHICLESTAT_SHIELD)  * 0.01;
+       float energy  = STAT(VEHICLESTAT_ENERGY)  * 0.01;
+       float ammo1   = STAT(VEHICLESTAT_AMMO1)   * 0.01;
+       float reload1 = STAT(VEHICLESTAT_RELOAD1) * 0.01;
+       float ammo2   = STAT(VEHICLESTAT_AMMO2)   * 0.01;
+       float reload2 = STAT(VEHICLESTAT_RELOAD2) * 0.01;
 
        // HACK to deal with the inconsistent use of the vehicle stats
        ammo1 = (ammo1) ? ammo1 : energy;
@@ -154,29 +174,29 @@ void Vehicles_drawHUD(
        if (precache_pic(frame) == "")
                frame = "gfx/hud/default/vehicle_frame";
 
-       hudSize  = draw_getimagesize(frame) * autocvar_cl_vehicles_hudscale;
-       hudPos.x = (vid_conwidth - hudSize.x) / 2;
-       hudPos.y = vid_conheight - hudSize.y;
+       vehicleHud_Size  = draw_getimagesize(frame) * autocvar_cl_vehicles_hudscale;
+       vehicleHud_Pos.x = (vid_conwidth - vehicleHud_Size.x) / 2;
+       vehicleHud_Pos.y = vid_conheight - vehicleHud_Size.y;
 
        if(teamplay && autocvar_hud_panel_bg_color_team)
-               drawpic(hudPos, frame, hudSize, myteamcolors * autocvar_hud_panel_bg_color_team, autocvar_hud_panel_bg_alpha, DRAWFLAG_NORMAL);
+               drawpic(vehicleHud_Pos, frame, vehicleHud_Size, myteamcolors * autocvar_hud_panel_bg_color_team, autocvar_hud_panel_bg_alpha * hud_fade_alpha, DRAWFLAG_NORMAL);
        else
-               drawpic(hudPos, frame, hudSize, autocvar_hud_panel_bg_color, autocvar_hud_panel_bg_alpha, DRAWFLAG_NORMAL);
+               drawpic(vehicleHud_Pos, frame, vehicleHud_Size, autocvar_hud_panel_bg_color, autocvar_hud_panel_bg_alpha * hud_fade_alpha, DRAWFLAG_NORMAL);
 
        if(!autocvar__vehicles_shownchasemessage && time < vh_notice_time)
        {
                float tmpblinkValue = 0.55 + sin(time * 3) * 0.45;
-               tmpPos.x = hudPos.x + hudSize.x * (96/256) - tmpSize.x;
-               tmpPos.y = hudPos.y;
+               tmpPos.x = vehicleHud_Pos.x + vehicleHud_Size.x * (96/256) - tmpSize.x;
+               tmpPos.y = vehicleHud_Pos.y;
                tmpSize = '1 1 1' * hud_fontsize;
-               drawstring(tmpPos, sprintf(_("Press %s"), getcommandkey("dropweapon", "dropweapon")), tmpSize, '1 0 0' + '0 1 1' * tmpblinkValue, hudAlpha, DRAWFLAG_NORMAL);
+               drawstring(tmpPos, sprintf(_("Press %s"), getcommandkey(_("drop weapon"), "dropweapon")), tmpSize, '1 0 0' + '0 1 1' * tmpblinkValue, hudAlpha, DRAWFLAG_NORMAL);
        }
 
        // Model
-       tmpSize.x = hudSize.x / 3;
-       tmpSize.y = hudSize.y;
-       tmpPos.x  = hudPos.x + hudSize.x / 3;
-       tmpPos.y  = hudPos.y;
+       tmpSize.x = vehicleHud_Size.x / 3;
+       tmpSize.y = vehicleHud_Size.y;
+       tmpPos.x  = vehicleHud_Pos.x + vehicleHud_Size.x / 3;
+       tmpPos.y  = vehicleHud_Pos.y;
 
        if(health < 0.25)
                drawpic_skin(tmpPos, vehicle, tmpSize, '1 0 0' + '0 1 1' * blinkValue, hudAlpha, DRAWFLAG_NORMAL);
@@ -191,22 +211,22 @@ void Vehicles_drawHUD(
        drawpic_skin(tmpPos, "vehicle_shield", tmpSize, '1 1 1' * shield + '1 0 0' * (1 - shield), hudAlpha * shield, DRAWFLAG_NORMAL);
 
        // Health bar
-       tmpSize.y = hudSize.y / 2;
-       tmpPos.x  = hudPos.x + hudSize.x * (32/768);
-       tmpPos.y  = hudPos.y;
+       tmpSize.y = vehicleHud_Size.y / 2;
+       tmpPos.x  = vehicleHud_Pos.x + vehicleHud_Size.x * (32/768);
+       tmpPos.y  = vehicleHud_Pos.y;
 
        drawsetcliparea(tmpPos.x + (tmpSize.x * (1 - health)), tmpPos.y, tmpSize.x, tmpSize.y);
        drawpic_skin(tmpPos, "vehicle_bar_northwest", tmpSize, autocvar_hud_progressbar_health_color, barAlpha, DRAWFLAG_NORMAL);
 
        // Shield bar
-       tmpPos.y = hudPos.y + hudSize.y / 2;
+       tmpPos.y = vehicleHud_Pos.y + vehicleHud_Size.y / 2;
 
        drawsetcliparea(tmpPos.x + (tmpSize.x * (1 - shield)), tmpPos.y, tmpSize.x, tmpSize.y);
        drawpic_skin(tmpPos, "vehicle_bar_southwest", tmpSize, autocvar_hud_progressbar_armor_color, barAlpha, DRAWFLAG_NORMAL);
 
        // Ammo1 bar
-       tmpPos.x = hudPos.x + hudSize.x * (480/768);
-       tmpPos.y = hudPos.y;
+       tmpPos.x = vehicleHud_Pos.x + vehicleHud_Size.x * (480/768);
+       tmpPos.y = vehicleHud_Pos.y;
 
        if(ammo1)
                drawsetcliparea(tmpPos.x, tmpPos.y, tmpSize.x * ammo1, tmpSize.y);
@@ -216,7 +236,7 @@ void Vehicles_drawHUD(
        drawpic_skin(tmpPos, "vehicle_bar_northeast", tmpSize, colorAmmo1, barAlpha, DRAWFLAG_NORMAL);
 
        // Ammo2 bar
-       tmpPos.y = hudPos.y + hudSize.y / 2;
+       tmpPos.y = vehicleHud_Pos.y + vehicleHud_Size.y / 2;
 
        if(ammo2)
                drawsetcliparea(tmpPos.x, tmpPos.y, tmpSize.x * ammo2, tmpSize.y);
@@ -227,17 +247,17 @@ void Vehicles_drawHUD(
        drawresetcliparea();
 
        // Health icon
-       tmpSize.x = hudSize.x * (80/768);
-       tmpSize.y = hudSize.y * (80/256);
-       tmpPos.x  = hudPos.x + hudSize.x * (64/768);
-       tmpPos.y  = hudPos.y + hudSize.y * (48/256);
+       tmpSize.x = vehicleHud_Size.x * (80/768);
+       tmpSize.y = vehicleHud_Size.y * (80/256);
+       tmpPos.x  = vehicleHud_Pos.x + vehicleHud_Size.x * (64/768);
+       tmpPos.y  = vehicleHud_Pos.y + vehicleHud_Size.y * (48/256);
 
        if(health < 0.25)
        {
                if(alarm1time < time)
                {
                        alarm1time = time + 2;
-                       vehicle_alarm(self, CH_PAIN_SINGLE, SND(VEH_ALARM));
+                       vehicle_alarm(NULL, CH_PAIN_SINGLE, SND_VEH_ALARM);
                }
                drawpic_skin(tmpPos, "vehicle_icon_health", tmpSize, '1 1 1', hudAlpha * blinkValue, DRAWFLAG_NORMAL);
        }
@@ -245,21 +265,21 @@ void Vehicles_drawHUD(
        {
                if(alarm1time)
                {
-                       vehicle_alarm(self, CH_PAIN_SINGLE, SND(Null));
+                       vehicle_alarm(NULL, CH_PAIN_SINGLE, SND_Null);
                        alarm1time = 0;
                }
                drawpic_skin(tmpPos, "vehicle_icon_health", tmpSize, '1 1 1', hudAlpha, DRAWFLAG_NORMAL);
        }
 
        // Shield icon
-       tmpPos.y = hudPos.y + hudSize.y / 2;
+       tmpPos.y = vehicleHud_Pos.y + vehicleHud_Size.y / 2;
 
        if(shield < 0.25)
        {
                if(alarm2time < time)
                {
                        alarm2time = time + 1;
-                       vehicle_alarm(self, CH_TRIGGER_SINGLE, SND(VEH_ALARM_SHIELD));
+                       vehicle_alarm(NULL, CH_TRIGGER_SINGLE, SND_VEH_ALARM_SHIELD);
                }
                drawpic_skin(tmpPos, "vehicle_icon_shield", tmpSize, '1 1 1', hudAlpha * blinkValue, DRAWFLAG_NORMAL);
        }
@@ -267,15 +287,15 @@ void Vehicles_drawHUD(
        {
                if(alarm2time)
                {
-                       vehicle_alarm(self, CH_TRIGGER_SINGLE, SND(Null));
+                       vehicle_alarm(NULL, CH_TRIGGER_SINGLE, SND_Null);
                        alarm2time = 0;
                }
                drawpic_skin(tmpPos, "vehicle_icon_shield", tmpSize, '1 1 1', hudAlpha, DRAWFLAG_NORMAL);
        }
 
        // Ammo1 icon
-       tmpPos.x = hudPos.x + hudSize.x * (624/768);
-       tmpPos.y = hudPos.y + hudSize.y * (48/256);
+       tmpPos.x = vehicleHud_Pos.x + vehicleHud_Size.x * (624/768);
+       tmpPos.y = vehicleHud_Pos.y + vehicleHud_Size.y * (48/256);
 
        if(iconAmmo1)
        {
@@ -286,7 +306,7 @@ void Vehicles_drawHUD(
        }
 
        // Ammo2 icon
-       tmpPos.y = hudPos.y + hudSize.y / 2;
+       tmpPos.y = vehicleHud_Pos.y + vehicleHud_Size.y / 2;
 
        if(iconAmmo2)
        {
@@ -295,77 +315,12 @@ void Vehicles_drawHUD(
                else
                        drawpic_skin(tmpPos, iconAmmo2, tmpSize, '1 1 1', hudAlpha * 0.2, DRAWFLAG_NORMAL);
        }
+}
 
-       // Bumblebee gunner crosshairs
-       if(hud == VEH_BUMBLEBEE.vehicleid)
-       {
-               tmpSize = '1 1 1' * hud_fontsize;
-               tmpPos.x = hudPos.x + hudSize.x * (520/768);
-
-               if(!AuxiliaryXhair[1].draw2d)
-               {
-                       tmpPos.y = hudPos.y + hudSize.y * (96/256) - tmpSize.y;
-                       drawstring(tmpPos, _("No right gunner!"), tmpSize, '1 1 1', hudAlpha * blinkValue, DRAWFLAG_NORMAL);
-               }
-
-               if(!AuxiliaryXhair[2].draw2d)
-               {
-                       tmpPos.y = hudPos.y + hudSize.y * (160/256);
-                       drawstring(tmpPos, _("No left gunner!"), tmpSize, '1 1 1', hudAlpha * blinkValue, DRAWFLAG_NORMAL);
-               }
-       }
-
-       // Raptor bomb crosshair
-       if(hud == VEH_RAPTOR.vehicleid && weapon2mode != RSM_FLARE)
-       {
-               vector where;
-
-               if(!dropmark)
-               {
-                       dropmark = spawn();
-                       dropmark.owner = self;
-                       dropmark.gravity = 1;
-               }
-
-               if(reload2 == 1)
-               {
-                       setorigin(dropmark, pmove_org);
-                       dropmark.velocity = pmove_vel;
-                       tracetoss(dropmark, self);
-
-                       where = project_3d_to_2d(trace_endpos);
-
-                       setorigin(dropmark, trace_endpos);
-                       tmpSize = draw_getimagesize(vCROSS_DROP) * autocvar_cl_vehicles_crosshair_size;
-
-                       if (!(where.z < 0 || where.x < 0 || where.y < 0 || where.x > vid_conwidth || where.y > vid_conheight))
-                       {
-                               where.x -= tmpSize.x * 0.5;
-                               where.y -= tmpSize.y * 0.5;
-                               where.z = 0;
-                               drawpic(where, vCROSS_DROP, tmpSize, '0 1 0', autocvar_crosshair_alpha * 0.9, DRAWFLAG_ADDITIVE);
-                               drawpic(where, vCROSS_DROP, tmpSize, '0 1 0', autocvar_crosshair_alpha * 0.6, DRAWFLAG_NORMAL); // Ensure visibility against bright bg
-                       }
-                       dropmark.cnt = time + 5;
-               }
-               else
-               {
-                       if(dropmark.cnt > time)
-                       {
-                               where = project_3d_to_2d(dropmark.origin);
-                               tmpSize = draw_getimagesize(vCROSS_DROP) * autocvar_cl_vehicles_crosshair_size * 1.25;
-
-                               if (!(where.z < 0 || where.x < 0 || where.y < 0 || where.x > vid_conwidth || where.y > vid_conheight))
-                               {
-                                       where.x -= tmpSize.x * 0.5;
-                                       where.y -= tmpSize.y * 0.5;
-                                       where.z = 0;
-                                       drawpic(where, vCROSS_DROP, tmpSize, '1 0 0', autocvar_crosshair_alpha * 0.9, DRAWFLAG_ADDITIVE);
-                                       drawpic(where, vCROSS_DROP, tmpSize, '1 0 0', autocvar_crosshair_alpha * 0.6, DRAWFLAG_NORMAL); // Ensure visibility against bright bg
-                               }
-                       }
-               }
-       }
+void Vehicles_drawCrosshair(string crosshair)
+{
+       vector tmpSize = '0 0 0';
+       vector tmpPos  = '0 0 0';
 
        // Crosshair
        if(crosshair)
@@ -374,6 +329,10 @@ void Vehicles_drawHUD(
                tmpPos.x = (vid_conwidth - tmpSize.x) / 2;
                tmpPos.y = (vid_conheight - tmpSize.y) / 2;
 
-               drawpic(tmpPos, crosshair, tmpSize, '1 1 1', autocvar_crosshair_alpha, DRAWFLAG_NORMAL);
+               vector wcross_color = '1 1 1';
+               if(autocvar_cl_vehicles_crosshair_colorize)
+                       wcross_color = crosshair_getcolor(NULL, STAT(VEHICLESTAT_HEALTH));
+
+               drawpic(tmpPos, crosshair, tmpSize, wcross_color, autocvar_crosshair_alpha, DRAWFLAG_NORMAL);
        }
 }