return true;
}
+bool AuxiliaryXhair_customize(entity this, entity client)
+{
+ //entity e = WaypointSprite_getviewentity(client);
+ entity axh = client.(AuxiliaryXhair[this.cnt]);
+ return axh.owner == this.owner; // cheaply check if the client's axh owner is the same as our real owner
+}
+
.vector axh_prevorigin;
.vector axh_prevcolors;
{
axh = new(auxiliary_xhair);
axh.cnt = axh_id;
- axh.drawonlytoclient = own;
+ //axh.drawonlytoclient = own; // not spectatable
+ setcefc(axh, AuxiliaryXhair_customize);
axh.owner = own;
Net_LinkEntity(axh, false, 0, SendAuxiliaryXhair);
}
WriteHeader(MSG_ONE, TE_CSQC_VEHICLESETUP);
WriteByte(MSG_ONE, vehicle_id);
+
+ if(vehicle_id == 0 || vehicle_id == HUD_NORMAL)
+ {
+ for(int i = 0; i < MAX_AXH; ++i)
+ {
+ entity axh = own.(AuxiliaryXhair[i]);
+ own.(AuxiliaryXhair[i]) = NULL;
+
+ if(axh.owner == own && axh != NULL && !wasfreed(axh))
+ delete(axh);
+ }
+ }
}
void vehicles_locktarget(entity this, float incr, float decr, float _lock_time)
else
this.active = ACTIVE_ACTIVE;
- if(this.active == ACTIVE_ACTIVE && !IS_DEAD(this) && !gameover)
+ if(this.active == ACTIVE_ACTIVE && !IS_DEAD(this) && !game_stopped)
{
LOG_DEBUG("Respawning vehicle: ", this.netname);
if(this.effects & EF_NODRAW)
this.vehicle_shieldent.alpha = 0.75;
if(sound_allowed(MSG_BROADCAST, attacker))
- spamsound (this, CH_PAIN, "onslaught/ons_hit2.wav", VOL_BASE, ATTEN_NORM); // FIXME: PLACEHOLDER
+ spamsound (this, CH_PAIN, SND_ONS_HIT2, VOL_BASE, ATTEN_NORM); // FIXME: PLACEHOLDER
}
else
if(sound_allowed(MSG_BROADCAST, attacker))
- spamsound (this, CH_PAIN, "onslaught/electricity_explode.wav", VOL_BASE, ATTEN_NORM); // FIXME: PLACEHOLDER
+ spamsound (this, CH_PAIN, SND_ONS_ELECTRICITY_EXPLODE, VOL_BASE, ATTEN_NORM); // FIXME: PLACEHOLDER
}
else
this.vehicle_health -= damage;
if(sound_allowed(MSG_BROADCAST, attacker))
- spamsound (this, CH_PAIN, "onslaught/ons_hit2.wav", VOL_BASE, ATTEN_NORM); // FIXME: PLACEHOLDER
+ spamsound (this, CH_PAIN, SND_ONS_HIT2, VOL_BASE, ATTEN_NORM); // FIXME: PLACEHOLDER
}
if(this.damageforcescale < 1 && this.damageforcescale > 0)
}
// vehicle enter/exit handling
-vector vehicles_findgoodexit(entity this, vector prefer_spot)
+vector vehicles_findgoodexit(entity this, entity player, vector prefer_spot)
{
- tracebox(this.origin + '0 0 32', STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), prefer_spot, MOVE_NORMAL, this.owner);
+ // TODO: we actually want the player's size here
+ tracebox(this.origin + '0 0 32', PL_MIN_CONST, PL_MAX_CONST, prefer_spot, MOVE_NORMAL, player);
if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
return prefer_spot;
v = randomvec();
v_z = 0;
v = v2 + normalize(v) * mysize;
- tracebox(v2, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), v, MOVE_NORMAL, this.owner);
+ tracebox(v2, PL_MIN_CONST, PL_MAX_CONST, v, MOVE_NORMAL, player);
if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
return v;
}
WriteAngle(MSG_ONE, 0);
}
- setsize(player, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL));
+ setsize(player, STAT(PL_MIN, player), STAT(PL_MAX, player));
player.takedamage = DAMAGE_AIM;
player.solid = SOLID_SLIDEBOX;
player.alpha = 1;
player.PlayerPhysplug = func_null;
player.vehicle = NULL;
- player.view_ofs = STAT(PL_VIEW_OFS, NULL);
+ player.view_ofs = STAT(PL_VIEW_OFS, player);
player.event_damage = PlayerDamage;
player.hud = HUD_NORMAL;
for(int slot = 0; slot < MAX_WEAPONSLOTS; ++ slot)
CSQCMODEL_AUTOINIT(vehic);
+ if(player)
+ player.oldorigin = player.origin; // player's location is set by the exit functions, so we need to do this after everything
+
vehicles_exit_running = false;
}
void vehicles_enter(entity pl, entity veh)
{
- // Remove this when bots know how to use vehicles
+ // Remove this when bots know how to use vehicles
if((IS_BOT_CLIENT(pl) && !autocvar_g_vehicles_allow_bots))
return;
}
else return;
- RemoveGrapplingHook(pl);
+ RemoveGrapplingHooks(pl);
veh.vehicle_ammo1 = 0;
veh.vehicle_ammo2 = 0;
veh.vehicle_hudmodel.viewmodelforclient = pl;
pl.crouch = false;
- pl.view_ofs = STAT(PL_VIEW_OFS, NULL);
- setsize (pl, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL));
+ pl.view_ofs = STAT(PL_VIEW_OFS, pl);
+ setsize(pl, STAT(PL_MIN, pl), STAT(PL_MAX, pl));
veh.event_damage = vehicles_damage;
veh.nextthink = 0;
+ pl.items &= ~IT_USING_JETPACK;
pl.angles = veh.angles;
pl.takedamage = DAMAGE_NO;
pl.solid = SOLID_NOT;
if(this.vehicle_controller)
this.team = this.vehicle_controller.team;
- FOREACH_CLIENT(IS_PLAYER(it) && it.hook.aiment == this, RemoveGrapplingHook(it));
+ FOREACH_CLIENT(IS_PLAYER(it),
+ {
+ for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+ {
+ .entity weaponentity = weaponentities[slot];
+ if(it.(weaponentity).hook.aiment == this)
+ RemoveHook(it.(weaponentity).hook);
+ }
+ });
vehicles_reset_colors(this);
this.iscreature = true;
this.teleportable = false; // no teleporting for vehicles, too buggy
this.damagedbycontents = true;
+ IL_PUSH(g_damagedbycontents, this);
this.vehicleid = info.vehicleid;
this.PlayerPhysplug = info.PlayerPhysplug;
this.event_damage = func_null;
setattachment(this.vehicle_viewport, this.vehicle_hudmodel, info.tag_view);
}
- setsize(this, info.mins, info.maxs);
+ setsize(this, info.m_mins, info.m_maxs);
info.vr_setup(info, this);
if(!nodrop)
{
setorigin(this, this.origin);
- tracebox(this.origin + '0 0 100', info.mins, info.maxs, this.origin - '0 0 10000', MOVE_WORLDONLY, this);
+ tracebox(this.origin + '0 0 100', info.m_mins, info.m_maxs, this.origin - '0 0 10000', MOVE_WORLDONLY, this);
setorigin(this, trace_endpos);
}
else
this.nextthink = time + game_starttime;
- if(!MUTATOR_CALLHOOK(VehicleInit, this))
+ if(MUTATOR_CALLHOOK(VehicleInit, this))
return false;
return true;