]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/vehicles/sv_vehicles.qc
Make ReadVector/WriteVector more commonly used
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / vehicles / sv_vehicles.qc
index 1848b63b7a0692ebbe01e323c3a50c2d044f6a02..dc217bb35b646eeb3558de329004562dc2331a34 100644 (file)
@@ -9,9 +9,7 @@ bool SendAuxiliaryXhair(entity this, entity to, int sf)
 
        if(sf & 2)
        {
-               WriteCoord(MSG_ENTITY, this.origin_x);
-               WriteCoord(MSG_ENTITY, this.origin_y);
-               WriteCoord(MSG_ENTITY, this.origin_z);
+               WriteVector(MSG_ENTITY, this.origin);
        }
 
        if(sf & 4)
@@ -26,8 +24,8 @@ bool SendAuxiliaryXhair(entity this, entity to, int sf)
 
 bool AuxiliaryXhair_customize(entity this, entity client)
 {
-       //entity e = WaypointSprite_getviewentity(client);
-       entity axh = client.(AuxiliaryXhair[this.cnt]);
+       entity e = WaypointSprite_getviewentity(client);
+       entity axh = e.(AuxiliaryXhair[this.cnt]);
        return axh.owner == this.owner; // cheaply check if the client's axh owner is the same as our real owner
 }
 
@@ -201,7 +199,7 @@ vector vehicles_force_fromtag_maglev(entity this, string tag_name, float spring_
 }
 
 // projectile handling
-void vehicles_projectile_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force)
+void vehicles_projectile_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force)
 {
        // Ignore damage from oterh projectiles from my owner (dont mess up volly's)
        if(inflictor.owner == this.owner)
@@ -232,9 +230,9 @@ void vehicles_projectile_explode(entity this, entity toucher)
        PROJECTILE_TOUCH(this, toucher);
 
        this.event_damage = func_null;
-       RadiusDamage (this, this.realowner, this.shot_dmg, 0, this.shot_radius, this, NULL, this.shot_force, this.totalfrags, toucher);
+       RadiusDamage (this, this.realowner, this.shot_dmg, 0, this.shot_radius, this, NULL, this.shot_force, this.totalfrags, DMG_NOWEP, toucher);
 
-       delete (this);
+       delete(this);
 }
 
 void vehicles_projectile_explode_think(entity this)
@@ -403,12 +401,14 @@ vector vehicle_aimturret(entity _vehic, vector _target, entity _turrret, string
        return vtag;
 }
 
-void vehicles_reset_colors(entity this)
+void vehicles_reset_colors(entity this, entity player)
 {
        int eff = 0, cmap;
        const vector cmod = '0 0 0';
        if(this.team && teamplay)
                cmap = 1024 + (this.team - 1) * 17;
+       else if(player)
+               cmap = player.colormap;
        else
                cmap = 1024;
        if(autocvar_g_nodepthtestplayers)
@@ -419,25 +419,25 @@ void vehicles_reset_colors(entity this)
        // Find all ents attacked to main model and setup effects, colormod etc.
        FOREACH_ENTITY_ENT(tag_entity, this,
        {
-               if(it != this.vehicle_shieldent)
-               {
-                       it.effects = eff;
-                       it.colormod = cmod;
-                       it.colormap = cmap;
-                       it.alpha = 1;
-               }
+               if(it == this.vehicle_shieldent)
+                       continue;
+
+               it.effects = eff;
+               it.colormod = cmod;
+               it.colormap = cmap;
+               it.alpha = 1;
        });
 
        // Also check head tags
        FOREACH_ENTITY_ENT(tag_entity, this.tur_head,
        {
-               if(it != this.vehicle_shieldent)
-               {
-                       it.effects = eff;
-                       it.colormod = cmod;
-                       it.colormap = cmap;
-                       it.alpha = 1;
-               }
+               if(it == this.vehicle_shieldent)
+                       continue;
+
+               it.effects = eff;
+               it.colormod = cmod;
+               it.colormap = cmap;
+               it.alpha = 1;
        });
 
        this.vehicle_hudmodel.effects  = this.effects  = eff; // | EF_LOWPRECISION;
@@ -520,6 +520,7 @@ void vehicles_showwp(entity this)
        else
                rgb = '1 1 1';
        entity wp = WaypointSprite_Spawn(WP_Vehicle, 0, 0, ent, '0 0 64', NULL, 0, ent, waypointsprite_attached, true, RADARICON_Vehicle);
+       wp.wp_extra = ent.wp00.vehicleid;
        wp.colormod = rgb;
        if(ent.waypointsprite_attached)
        {
@@ -575,7 +576,7 @@ void vehicle_use(entity this, entity actor, entity trigger)
                else
                {
                        vehicles_setreturn(this);
-                       vehicles_reset_colors(this);
+                       vehicles_reset_colors(this, actor);
                }
        }
 }
@@ -637,7 +638,7 @@ void vehicles_frame(entity this, entity actor)
        vehicles_painframe(this);
 }
 
-void vehicles_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force)
+void vehicles_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force)
 {
        this.dmg_time = time;
 
@@ -750,7 +751,7 @@ void vehicles_impact(entity this, float _minspeed, float _speedfac, float _maxpa
                if(_minspeed < wc)
                {
                        float take = min(_speedfac * wc, _maxpain);
-                       Damage (this, NULL, NULL, take, DEATH_FALL.m_id, this.origin, '0 0 0');
+                       Damage (this, NULL, NULL, take, DEATH_FALL.m_id, DMG_NOWEP, this.origin, '0 0 0');
                        this.play_time = time + 0.25;
 
                        //dprint("wc: ", ftos(wc), "\n");
@@ -783,6 +784,7 @@ vector vehicles_findgoodexit(entity this, entity player, vector prefer_spot)
        return this.origin;
 }
 
+.int old_vehicle_flags;
 void vehicles_exit(entity vehic, bool eject)
 {
        entity player = vehic.owner;
@@ -861,6 +863,10 @@ void vehicles_exit(entity vehic, bool eject)
 
        vehic.team = vehic.tur_head.team;
 
+       if(vehic.old_vehicle_flags & VHF_SHIELDREGEN)
+               vehic.vehicle_flags |= VHF_SHIELDREGEN;
+       vehic.old_vehicle_flags = 0;
+
        sound (vehic, CH_TRIGGER_SINGLE, SND_Null, 1, ATTEN_NORM);
        vehic.vehicle_hudmodel.viewmodelforclient = vehic;
        vehic.phase = time + 1;
@@ -868,7 +874,7 @@ void vehicles_exit(entity vehic, bool eject)
        vehic.vehicle_exit(vehic, eject);
 
        vehicles_setreturn(vehic);
-       vehicles_reset_colors(vehic);
+       vehicles_reset_colors(vehic, NULL);
        vehic.owner = NULL;
 
        CSQCMODEL_AUTOINIT(vehic);
@@ -893,7 +899,7 @@ void vehicles_touch(entity this, entity toucher)
                if(vehicles_crushable(toucher))
                {
                        if(vdist(this.velocity, >=, 30))
-                               Damage(toucher, this, this.owner, autocvar_g_vehicles_crush_dmg, DEATH_VH_CRUSH.m_id, '0 0 0', normalize(toucher.origin - this.origin) * autocvar_g_vehicles_crush_force);
+                               Damage(toucher, this, this.owner, autocvar_g_vehicles_crush_dmg, DEATH_VH_CRUSH.m_id, DMG_NOWEP, '0 0 0', normalize(toucher.origin - this.origin) * autocvar_g_vehicles_crush_force);
 
                        return; // Dont do selfdamage when hitting "soft targets".
                }
@@ -967,6 +973,10 @@ void vehicles_enter(entity pl, entity veh)
 
                Send_Notification(NOTIF_ONE, pl, MSG_CENTER, CENTER_VEHICLE_STEAL_SELF);
 
+               veh.vehicle_shield = 0;
+               veh.old_vehicle_flags = veh.vehicle_flags; // make a backup just so we're not permanently crippling this vehicle
+               veh.vehicle_flags &= ~VHF_SHIELDREGEN;
+
                if (autocvar_g_vehicles_steal_show_waypoint) {
                        entity wp = WaypointSprite_Spawn(WP_VehicleIntruder, 0, 0, pl, '0 0 68', NULL, veh.team, veh, wps_intruder, true, RADARICON_DANGER);
                        wp.colormod = Team_ColorRGB(pl.team);
@@ -1034,6 +1044,8 @@ void vehicles_enter(entity pl, entity veh)
        veh.team = pl.team;
        veh.flags -= FL_NOTARGET;
 
+       vehicles_reset_colors(veh, pl);
+
        if (IS_REAL_CLIENT(pl))
        {
                Send_Notification(NOTIF_ONE, pl, MSG_CENTER, CENTER_VEHICLE_ENTER);
@@ -1147,11 +1159,12 @@ void vehicles_spawn(entity this)
            }
        });
 
-       vehicles_reset_colors(this);
 
        Vehicle info = Vehicles_from(this.vehicleid);
        info.vr_spawn(info, this);
 
+       vehicles_reset_colors(this, NULL);
+
        CSQCMODEL_AUTOINIT(this);
 }