void UpdateAuxiliaryXhair(entity own, vector loc, vector clr, float axh_id)
{
- if not(IS_REAL_CLIENT(own))
+ if(!IS_REAL_CLIENT(own))
return;
entity axh;
void CSQCVehicleSetup(entity own, float vehicle_id)
{
- if not(IS_REAL_CLIENT(own))
+ if(!IS_REAL_CLIENT(own))
return;
msg_entity = own;
WriteByte(MSG_ONE, SVC_TEMPENTITY);
WriteByte(MSG_ONE, TE_CSQC_VEHICLESETUP);
- if(vehicle_id != 0)
- WriteByte(MSG_ONE, vehicle_id);
- else
- WriteByte(MSG_ONE, 1 + own.vehicle.vehicle_weapon2mode + VEH_LAST);
+ WriteByte(MSG_ONE, vehicle_id);
}
vector targetdrone_getnewspot()
{
-
vector spot;
float i;
for(i = 0; i < 100; ++i)
if(trace_ent != world)
{
- if(teamplay && trace_ent.team == self.team)
+ if(SAME_TEAM(trace_ent, self))
trace_ent = world;
if(trace_ent.deadflag != DEAD_NO)
trace_ent = world;
- if not (trace_ent.vehicle_flags & VHF_ISVEHICLE ||
- trace_ent.turrcaps_flags & TFL_TURRCAPS_ISTURRET ||
- trace_ent.takedamage == DAMAGE_TARGETDRONE)
+ if(!((trace_ent.vehicle_flags & VHF_ISVEHICLE) || (trace_ent.turrcaps_flags & TFL_TURRCAPS_ISTURRET)))
trace_ent = world;
+
+ if(trace_ent.alpha <= 0.5 && trace_ent.alpha)
+ trace_ent = world; // invisible
}
if(self.lock_target == world && trace_ent != world)
play2(self.owner, "vehicles/locking.wav");
self.lock_soundtime = time + 0.3;
}
-
}
// Have a locking target
float _hud,
string _hud_model,
float() _framefunc,
- void(float) _exitfunc)
+ void(float) _exitfunc, float() _enterfunc)
{
- if not (_owner.vehicle_flags & VHF_MULTISLOT)
+ if(!(_owner.vehicle_flags & VHF_MULTISLOT))
_owner.vehicle_flags |= VHF_MULTISLOT;
_slot.PlayerPhysplug = _framefunc;
_slot.vehicle_exit = _exitfunc;
+ _slot.vehicle_enter = _enterfunc;
_slot.hud = _hud;
_slot.vehicle_flags = VHF_PLAYERSLOT;
_slot.vehicle_viewport = spawn();
}
e = e.chain;
}
+ // Also check head tags
+ e = findchainentity(tag_entity, self.tur_head);
+ while(e)
+ {
+ if(e != self.vehicle_shieldent)
+ {
+ e.effects = _effects; // | EF_LOWPRECISION;
+ e.colormod = _colormod;
+ e.colormap = _colormap;
+ e.alpha = 1;
+ }
+ e = e.chain;
+ }
self.vehicle_hudmodel.effects = self.effects = _effects; // | EF_LOWPRECISION;
self.vehicle_hudmodel.colormod = self.colormod = _colormod;
else
self.active = ACTIVE_ACTIVE;
- if(self.active == ACTIVE_ACTIVE && self.deadflag == DEAD_NO)
+ if(self.active == ACTIVE_ACTIVE && self.deadflag == DEAD_NO && !gameover)
{
dprint("Respawning vehicle: ", self.netname, "\n");
- vehicles_setreturn(self);
- vehicles_reset_colors();
+ if(self.effects & EF_NODRAW)
+ {
+ self.think = vehicles_spawn;
+ self.nextthink = time + 3;
+ }
+ else
+ {
+ vehicles_setreturn(self);
+ vehicles_reset_colors();
+ }
}
}
self.enemy = attacker;
+ self.pain_finished = time;
+
if((self.vehicle_flags & VHF_HASSHIELD) && (self.vehicle_shield > 0))
{
if (wasfreed(self.vehicle_shieldent) || self.vehicle_shieldent == world)
if(self.vehicle_flags & VHF_DEATHEJECT)
vehicles_exit(VHEF_EJECT);
else
- vehicles_exit(VHEF_RELESE);
+ vehicles_exit(VHEF_RELEASE);
antilag_clear(self);
_player.solid = SOLID_SLIDEBOX;
_player.movetype = MOVETYPE_WALK;
_player.effects &= ~EF_NODRAW;
+ _player.teleportable = TELEPORT_NORMAL;
_player.alpha = 1;
_player.PlayerPhysplug = func_null;
_player.vehicle = world;
_vehicle.tur_head.nodrawtoclient = world;
- if not(teamplay)
+ if(!teamplay)
_vehicle.team = 0;
Kill_Notification(NOTIF_ONE, _player, MSG_CENTER_CPID, CPID_VEHICLES);
vehicles_setreturn(_vehicle);
vehicles_reset_colors();
_vehicle.owner = world;
+
+ CSQCMODEL_AUTOINIT();
+
self = _oldself;
vehicles_exit_running = FALSE;
// Vehicle currently in use
if(self.owner)
{
+ if(!forbidWeaponUse(self.owner))
if(other != world)
+ if((self.origin_z + self.maxs_z) > (other.origin_z))
if(vehicles_crushable(other))
{
if(vlen(self.velocity) != 0)
else
return;
- if not(IS_PLAYER(pl))
+ if(!IS_PLAYER(pl))
return;
if(veh.phase > time)
return;
- if(pl.freezetag_frozen)
+ if(pl.frozen)
return;
if(pl.deadflag != DEAD_NO)
if(pl.vehicle)
return;
+ if(autocvar_g_vehicles_enter) // skip if we're using regular touch code
+ if(veh.vehicle_flags & VHF_MULTISLOT)
+ if(veh.owner)
+ {
+ entity oldself = self;
+ self = veh;
+ other = pl; // TODO: fix
+
+ if(!veh.gunner1)
+ if(veh.gun1.phase <= time)
+ if(veh.gun1.vehicle_enter)
+ if(veh.gun1.vehicle_enter())
+ {
+ self = oldself;
+ return;
+ }
+
+ if(!veh.gunner2)
+ if(veh.gun2.phase <= time)
+ if(veh.gun2.vehicle_enter)
+ if(veh.gun2.vehicle_enter())
+ {
+ self = oldself;
+ return;
+ }
+
+ self = oldself;
+ }
+
if(teamplay)
if(veh.team)
if(DIFF_TEAM(pl, veh))
Send_Notification(NOTIF_ONE, pl, MSG_CENTER, CENTER_VEHICLE_STEAL_SELF);
- WaypointSprite_Spawn("intruder", 0, 0, pl, '0 0 68', world, veh.team, veh, wps_intruder, TRUE, RADARICON_DANGER, Team_ColorRGB(pl.team));
+ if(autocvar_g_vehicles_steal_show_waypoint)
+ WaypointSprite_Spawn("intruder", 0, 0, pl, '0 0 68', world, veh.team, veh, wps_intruder, TRUE, RADARICON_DANGER, Team_ColorRGB(pl.team));
}
else return;
veh.vehicle_hudmodel.viewmodelforclient = pl;
+ tracebox(pl.origin, PL_MIN, PL_MAX, pl.origin, FALSE, pl);
+ pl.crouch = FALSE;
+ pl.view_ofs = PL_VIEW_OFS;
+ setsize (pl, PL_MIN, PL_MAX);
+
veh.event_damage = vehicles_damage;
veh.nextthink = 0;
pl.angles = veh.angles;
pl.takedamage = DAMAGE_NO;
pl.solid = SOLID_NOT;
pl.movetype = MOVETYPE_NOCLIP;
+ pl.teleportable = FALSE;
pl.alpha = -1;
- pl.vehicle = veh;
pl.event_damage = func_null;
pl.view_ofs = '0 0 0';
veh.colormap = pl.colormap;
if(veh.tur_head)
veh.tur_head.colormap = pl.colormap;
veh.switchweapon = pl.switchweapon;
- if(veh.hud)
- pl.hud = veh.hud;
- else
- pl.hud = veh.vehicleid;
+ pl.hud = veh.vehicleid;
pl.PlayerPhysplug = veh.PlayerPhysplug;
pl.vehicle_ammo1 = veh.vehicle_ammo1;
vh_player = pl;
vh_vehicle = veh;
MUTATOR_CALLHOOK(VehicleEnter);
- pl = vh_player;
- veh = vh_vehicle;
entity oldself = self;
self = veh;
+ CSQCModel_UnlinkEntity();
VEH_ACTION(veh.vehicleid, VR_ENTER);
self = oldself;
{
self.nextthink = time;
+ if(self.owner)
+ self.owner.vehicle_weapon2mode = self.vehicle_weapon2mode;
+
VEH_ACTION(self.vehicleid, VR_THINK);
+
+ CSQCMODEL_AUTOUPDATE();
}
// initialization
void vehicles_spawn()
{
- dprint("Spawning vehicle: ", self.netname, "\n");
+ dprint("Spawning vehicle: ", self.classname, "\n");
// disown & reset
self.vehicle_hudmodel.viewmodelforclient = self;
// Return to spawn
self.angles = self.pos2;
- setorigin(self, self.pos1 + '0 0 0');
+ setorigin(self, self.pos1);
// Show it
pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
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);
+
vehicles_reset_colors();
VEH_ACTION(self.vehicleid, VR_SPAWN);
+
+ CSQCMODEL_AUTOINIT();
}
float vehicle_initialize(float vehicle_id, float nodrop)
{
- if not(autocvar_g_vehicles)
+ if(!autocvar_g_vehicles)
return FALSE;
entity veh = get_vehicleinfo(vehicle_id);
- if(self.targetname)
+ if(!veh.vehicleid)
+ return FALSE;
+
+ if(!veh.tur_head) { VEH_ACTION(vehicle_id, VR_PRECACHE); }
+
+ if(self.targetname && self.targetname != "")
{
self.vehicle_controller = find(world, target, self.targetname);
- if not(self.vehicle_controller)
+ if(!self.vehicle_controller)
{
bprint("^1WARNING: ^7Vehicle with invalid .targetname\n");
+ self.active = ACTIVE_ACTIVE;
}
else
{
}
}
}
+ else { self.active = ACTIVE_ACTIVE; }
- if(self.team && !teamplay)
+ if(self.team && (!teamplay || !autocvar_g_vehicles_teams))
self.team = 0;
self.vehicle_flags |= VHF_ISVEHICLE;
self.vehicle_hudmodel = spawn();
self.tur_head = spawn();
self.tur_head.owner = self;
- self.takedamage = DAMAGE_AIM;
+ self.takedamage = DAMAGE_NO;
self.bot_attack = TRUE;
self.iscreature = TRUE;
self.teleportable = FALSE; // no teleporting for vehicles, too buggy
setsize(self, veh.mins, veh.maxs);
- if not(nodrop)
+ if(!nodrop)
{
setorigin(self, self.origin);
tracebox(self.origin + '0 0 100', veh.mins, veh.maxs, self.origin - '0 0 10000', MOVE_WORLDONLY, self);
VEH_ACTION(vehicle_id, VR_SETUP);
- if(autocvar_g_vehicles_delayspawn)
+ if(self.active == ACTIVE_NOT)
+ self.nextthink = 0; // wait until activated
+ else if(autocvar_g_vehicles_delayspawn)
self.nextthink = time + self.respawntime + (random() * autocvar_g_vehicles_delayspawn_jitter);
else
self.nextthink = time + game_starttime;