#include "sv_vehicles.qh"
-#include "../effects/effects.qh"
#if 0
bool vehicle_send(entity to, int sf)
}
#endif
-bool SendAuxiliaryXhair(entity to, int sf)
-{SELFPARAM();
+bool SendAuxiliaryXhair(entity this, entity to, int sf)
+{
- WriteByte(MSG_ENTITY, ENT_CLIENT_AUXILIARYXHAIR);
+ WriteHeader(MSG_ENTITY, ENT_CLIENT_AUXILIARYXHAIR);
WriteByte(MSG_ENTITY, self.cnt);
msg_entity = own;
- WriteByte(MSG_ONE, SVC_TEMPENTITY);
- WriteByte(MSG_ONE, TE_CSQC_VEHICLESETUP);
+ WriteHeader(MSG_ONE, TE_CSQC_VEHICLESETUP);
WriteByte(MSG_ONE, vehicle_id);
}
void vehicles_locktarget(float incr, float decr, float _lock_time)
{SELFPARAM();
- if(self.lock_target && self.lock_target.deadflag != DEAD_NO)
+ if(self.lock_target && IS_DEAD(self.lock_target))
{
self.lock_target = world;
self.lock_strength = 0;
if(SAME_TEAM(trace_ent, self))
trace_ent = world;
- if(trace_ent.deadflag != DEAD_NO)
+ if(IS_DEAD(trace_ent))
trace_ent = world;
if(!(IS_VEHICLE(trace_ent) || IS_TURRET(trace_ent)))
proj.use = vehicles_projectile_explode;
proj.owner = self;
proj.realowner = _owner;
- proj.think = SUB_Remove;
+ proj.think = SUB_Remove_self;
proj.nextthink = time + 30;
if(_health)
{SELFPARAM();
entity _gib = spawn();
_setmodel(_gib, _template.model);
- setorigin(_gib, gettaginfo(self, gettagindex(self, _tag)));
+ vector org = gettaginfo(self, gettagindex(self, _tag));
+ setorigin(_gib, org);
_gib.velocity = _vel;
_gib.movetype = MOVETYPE_TOSS;
_gib.solid = SOLID_CORPSE;
void vehicles_clearreturn(entity veh)
{
- entity ret;
// Remove "return helper", if any.
- ret = findchain(classname, "vehicle_return");
- while(ret)
+ for (entity ret = findchain(classname, "vehicle_return"); ret; ret = ret.chain)
{
if(ret.wp00 == veh)
{
ret.classname = "";
- ret.think = SUB_Remove;
+ ret.think = SUB_Remove_self;
ret.nextthink = time + 0.1;
if(ret.waypointsprite_attached)
return;
}
- ret = ret.chain;
}
}
rgb = Team_ColorRGB(self.team);
else
rgb = '1 1 1';
- entity wp = WaypointSprite_Spawn(WP_Vehicle, 0, 0, self, '0 0 64', world, 0, self, waypointsprite_attached, true, RADARICON_POWERUP);
+ entity wp = WaypointSprite_Spawn(WP_Vehicle, 0, 0, self, '0 0 64', world, 0, self, waypointsprite_attached, true, RADARICON_Vehicle);
wp.colormod = rgb;
if(self.waypointsprite_attached)
{
vehicles_clearreturn(veh);
- ret = spawn();
- ret.classname = "vehicle_return";
+ ret = new(vehicle_return);
ret.wp00 = veh;
ret.team = veh.team;
ret.think = vehicles_showwp;
- if(veh.deadflag != DEAD_NO)
+ if(IS_DEAD(veh))
{
ret.cnt = time + veh.respawntime;
ret.nextthink = min(time + veh.respawntime, time + veh.respawntime - 5);
else
self.active = ACTIVE_ACTIVE;
- if(self.active == ACTIVE_ACTIVE && self.deadflag == DEAD_NO && !gameover)
+ if(self.active == ACTIVE_ACTIVE && !IS_DEAD(self) && !gameover)
{
LOG_TRACE("Respawning vehicle: ", self.netname, "\n");
if(self.effects & EF_NODRAW)
}
}
-void vehicles_painframe()
-{SELFPARAM();
- if(self.owner.vehicle_health <= 50)
- if(self.pain_frame < time)
+void vehicles_painframe(entity this)
+{
+ int myhealth = ((this.owner) ? this.owner.vehicle_health : ((this.vehicle_health / this.max_health) * 100));
+
+ if(myhealth <= 50)
+ if(this.pain_frame < time)
{
- float _ftmp;
- _ftmp = self.owner.vehicle_health / 50;
- self.pain_frame = time + 0.1 + (random() * 0.5 * _ftmp);
- pointparticles(particleeffectnum(EFFECT_SMOKE_SMALL), (self.origin + (randomvec() * 80)), '0 0 0', 1);
+ float _ftmp = myhealth / 50;
+ this.pain_frame = time + 0.1 + (random() * 0.5 * _ftmp);
+ pointparticles(EFFECT_SMOKE_SMALL, (this.origin + (randomvec() * 80)), '0 0 0', 1);
- if(self.vehicle_flags & VHF_DMGSHAKE)
- self.velocity += randomvec() * 30;
+ if(this.vehicle_flags & VHF_DMGSHAKE)
+ this.velocity += randomvec() * 30;
- if(self.vehicle_flags & VHF_DMGROLL)
- if(self.vehicle_flags & VHF_DMGHEADROLL)
- self.tur_head.angles += randomvec();
+ if(this.vehicle_flags & VHF_DMGROLL)
+ if(this.vehicle_flags & VHF_DMGHEADROLL)
+ this.tur_head.angles += randomvec();
else
- self.angles += randomvec();
-
+ this.angles += randomvec();
}
}
+void vehicles_frame(entity this, entity actor)
+{
+ vehicles_painframe(this);
+}
+
void vehicles_damage(entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force)
{SELFPARAM();
self.dmg_time = time;
// WEAPONTODO
- if(DEATH_ISWEAPON(deathtype, WEP_VORTEX.m_id))
+ if(DEATH_ISWEAPON(deathtype, WEP_VORTEX))
damage *= autocvar_g_vehicles_vortex_damagerate;
- if(DEATH_ISWEAPON(deathtype, WEP_MACHINEGUN.m_id))
+ if(DEATH_ISWEAPON(deathtype, WEP_MACHINEGUN))
damage *= autocvar_g_vehicles_machinegun_damagerate;
- if(DEATH_ISWEAPON(deathtype, WEP_RIFLE.m_id))
+ if(DEATH_ISWEAPON(deathtype, WEP_RIFLE))
damage *= autocvar_g_vehicles_rifle_damagerate;
- if(DEATH_ISWEAPON(deathtype, WEP_VAPORIZER.m_id))
+ if(DEATH_ISWEAPON(deathtype, WEP_VAPORIZER))
damage *= autocvar_g_vehicles_vaporizer_damagerate;
- if(DEATH_ISWEAPON(deathtype, WEP_SEEKER.m_id))
+ if(DEATH_ISWEAPON(deathtype, WEP_SEEKER))
damage *= autocvar_g_vehicles_tag_damagerate;
- if(DEATH_WEAPONOFWEAPONDEATH(deathtype))
+ if(DEATH_WEAPONOF(deathtype) != WEP_Null)
damage *= autocvar_g_vehicles_weapon_damagerate;
self.enemy = attacker;
if(_minspeed < wc)
{
float take = min(_speedfac * wc, _maxpain);
- Damage (self, world, world, take, DEATH_FALL, self.origin, '0 0 0');
+ Damage (self, world, world, take, DEATH_FALL.m_id, self.origin, '0 0 0');
self.play_time = time + 0.25;
//dprint("wc: ", ftos(wc), "\n");
//vector exitspot;
float mysize;
- tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, prefer_spot, MOVE_NORMAL, self.owner);
+ tracebox(self.origin + '0 0 32', STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), prefer_spot, MOVE_NORMAL, self.owner);
if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
return prefer_spot;
v = randomvec();
v_z = 0;
v = v2 + normalize(v) * mysize;
- tracebox(v2, PL_MIN, PL_MAX, v, MOVE_NORMAL, self.owner);
+ tracebox(v2, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), v, MOVE_NORMAL, self.owner);
if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
return v;
}
WriteAngle(MSG_ONE, 0);
}
- setsize(_player, PL_MIN,PL_MAX);
+ setsize(_player, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL));
_player.takedamage = DAMAGE_AIM;
_player.solid = SOLID_SLIDEBOX;
_player.alpha = 1;
_player.PlayerPhysplug = func_null;
_player.vehicle = world;
- _player.view_ofs = PL_VIEW_OFS;
+ _player.view_ofs = STAT(PL_VIEW_OFS, NULL);
_player.event_damage = PlayerDamage;
_player.hud = HUD_NORMAL;
- _player.switchweapon = _vehicle.switchweapon;
+ PS(_player).m_switchweapon = _vehicle.m_switchweapon;
_player.last_vehiclecheck = time + 3;
_player.vehicle_enter_delay = time + 2;
}
_vehicle.flags |= FL_NOTARGET;
- if(_vehicle.deadflag == DEAD_NO)
+ if(!IS_DEAD(_vehicle))
_vehicle.avelocity = '0 0 0';
_vehicle.tur_head.nodrawtoclient = world;
if(vehicles_crushable(other))
{
if(vlen(self.velocity) >= 30)
- Damage(other, self, self.owner, autocvar_g_vehicles_crush_dmg, DEATH_VH_CRUSH, '0 0 0', normalize(other.origin - self.origin) * autocvar_g_vehicles_crush_force);
+ Damage(other, self, self.owner, autocvar_g_vehicles_crush_dmg, DEATH_VH_CRUSH.m_id, '0 0 0', normalize(other.origin - self.origin) * autocvar_g_vehicles_crush_force);
return; // Dont do selfdamage when hitting "soft targets".
}
vehicles_enter(other, self);
}
-bool vehicle_impulse(int imp)
-{SELFPARAM();
- switch(imp)
+bool vehicle_impulse(entity this, int imp)
+{
+ entity v = this.vehicle;
+ if (!v) return false;
+ if (IS_DEAD(v)) return false;
+ bool(int) f = v.vehicles_impulse;
+ if (f && f(imp)) return true;
+ switch (imp)
{
- case 17:
+ case IMP_weapon_drop.impulse:
{
stuffcmd(self, "\ntoggle cl_eventchase_vehicle\nset _vehicles_shownchasemessage 1\n");
return true;
}
}
-
return false;
}
if((!IS_PLAYER(pl))
|| (veh.phase >= time)
|| (pl.vehicle_enter_delay >= time)
- || (pl.frozen)
- || (pl.deadflag != DEAD_NO)
+ || (STAT(FROZEN, pl))
+ || (IS_DEAD(pl))
|| (pl.vehicle)
) { return; }
if(DIFF_TEAM(pl, veh))
if(autocvar_g_vehicles_steal)
{
- entity head;
- FOR_EACH_PLAYER(head) if(SAME_TEAM(head, veh))
- Send_Notification(NOTIF_ONE, head, MSG_CENTER, CENTER_VEHICLE_STEAL);
+ FOREACH_CLIENT(IS_PLAYER(it) && SAME_TEAM(it, veh), LAMBDA(Send_Notification(NOTIF_ONE, it, MSG_CENTER, CENTER_VEHICLE_STEAL)));
Send_Notification(NOTIF_ONE, pl, MSG_CENTER, CENTER_VEHICLE_STEAL_SELF);
veh.vehicle_hudmodel.viewmodelforclient = pl;
- tracebox(pl.origin, PL_MIN, PL_MAX, pl.origin, false, pl);
+ tracebox(pl.origin, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), pl.origin, false, pl);
pl.crouch = false;
- pl.view_ofs = PL_VIEW_OFS;
- setsize (pl, PL_MIN, PL_MAX);
+ pl.view_ofs = STAT(PL_VIEW_OFS, NULL);
+ setsize (pl, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL));
veh.event_damage = vehicles_damage;
veh.nextthink = 0;
veh.colormap = pl.colormap;
if(veh.tur_head)
veh.tur_head.colormap = pl.colormap;
- veh.switchweapon = pl.switchweapon;
+ veh.m_switchweapon = PS(pl).m_switchweapon;
pl.hud = veh.vehicleid;
pl.PlayerPhysplug = veh.PlayerPhysplug;
//veh.exteriormodeltoclient = veh.owner;
//veh.tur_head.exteriormodeltoclient = veh.owner;
- pl.flags &= ~FL_ONGROUND;
- veh.flags &= ~FL_ONGROUND;
+ UNSET_ONGROUND(pl);
+ UNSET_ONGROUND(veh);
veh.team = pl.team;
veh.flags -= FL_NOTARGET;
Vehicle info = get_vehicleinfo(self.vehicleid);
info.vr_think(info);
+ vehicles_painframe(self);
+
CSQCMODEL_AUTOUPDATE(self);
}
if(self.vehicle_controller)
self.team = self.vehicle_controller.team;
- entity head; // remove hooks (if any)
- FOR_EACH_PLAYER(head)
- if(head.hook.aiment == self)
- RemoveGrapplingHook(head);
+ FOREACH_CLIENT(IS_PLAYER(it) && it.hook.aiment == self, LAMBDA(RemoveGrapplingHook(it)));
vehicles_reset_colors();
self.vehicle_flags |= VHF_ISVEHICLE;
- self.vehicle_viewport = spawn();
- self.vehicle_hudmodel = spawn();
- self.tur_head = spawn();
+ self.vehicle_viewport = new(vehicle_viewport);
+ self.vehicle_hudmodel = new(vehicle_hudmodel);
+ self.tur_head = new(tur_head);
self.tur_head.owner = self;
self.takedamage = DAMAGE_NO;
self.bot_attack = true;