17 WriteHeader(MSG_ENTITY, ENT_CLIENT_AUXILIARYXHAIR);
24 WriteVector(MSG_ENTITY, this.
origin);
39 entity e = WaypointSprite_getviewentity(client);
40 entity axh = e.(AuxiliaryXhair[this.
cnt]);
41 return axh.owner == this.
owner;
53 entity axh = own.(AuxiliaryXhair[axh_id]);
55 if(axh ==
NULL || wasfreed(axh))
57 axh =
new(auxiliary_xhair);
65 if(loc != axh.axh_prevorigin)
71 if(clr != axh.axh_prevcolors)
77 own.(AuxiliaryXhair[axh_id]) = axh;
87 WriteHeader(
MSG_ONE, TE_CSQC_VEHICLESETUP);
90 if(vehicle_id == 0 || vehicle_id == HUD_NORMAL)
92 for(
int i = 0; i <
MAX_AXH; ++i)
94 entity axh = own.(AuxiliaryXhair[i]);
95 own.(AuxiliaryXhair[i]) =
NULL;
97 if(axh.owner == own && axh !=
NULL && !wasfreed(axh))
105 if(this.lock_target &&
IS_DEAD(this.lock_target))
107 this.lock_target =
NULL;
108 this.lock_strength = 0;
112 if(this.lock_time >
time)
115 if(this.lock_soundtime <
time)
117 this.lock_soundtime =
time + 0.5;
118 play2(this.
owner,
"vehicles/locked.wav");
142 if(this.lock_target &&
trace_ent == this.lock_target)
144 if(this.lock_strength != 1 && this.lock_strength + incr >= 1)
146 play2(this.
owner,
"vehicles/lock.wav");
147 this.lock_soundtime =
time + 0.8;
149 else if (this.lock_strength != 1 && this.lock_soundtime <
time)
151 play2(this.
owner,
"vehicles/locking.wav");
152 this.lock_soundtime =
time + 0.3;
160 this.lock_strength =
min(this.lock_strength + incr, 1);
161 if(this.lock_strength == 1)
162 this.lock_time =
time + _lock_time;
167 this.lock_strength =
max(this.lock_strength - decr * 2, 0);
169 this.lock_strength =
max(this.lock_strength - decr, 0);
171 if(this.lock_strength == 0)
172 this.lock_target =
NULL;
180 if(inflictor.owner ==
this.owner)
198 if(toucher == this.
owner.vehicle)
201 if(toucher == this.
owner.vehicle.tur_head)
208 RadiusDamage (
this, this.
realowner, this.shot_dmg, 0, this.shot_radius,
this,
NULL, this.shot_force, this.
projectiledeathtype,
DMG_NOWEP, toucher);
225 float _dmg,
float _radi,
float _force,
float _size,
226 int _deahtype,
float _projtype,
float _health,
227 bool _cull,
bool _clianim,
entity _owner)
235 proj.shot_dmg = _dmg;
236 proj.shot_radius = _radi;
237 proj.shot_force = _force;
238 proj.projectiledeathtype = _deahtype;
241 proj.flags = FL_PROJECTILE;
244 proj.bot_dodge =
true;
245 proj.bot_dodgerating = _dmg;
246 proj.velocity = _vel;
250 proj.realowner = _owner;
252 proj.nextthink =
time + 30;
263 if(_mzlsound != SND_Null)
266 if(_mzlfx != EFFECT_Null)
267 Send_Effect(_mzlfx, proj.origin, proj.velocity, 1);
269 setsize (proj,
'-1 -1 -1' * _size,
'1 1 1' * _size);
279 Send_Effect(EFFECT_EXPLOSION_SMALL,
randomvec() * 80 + (this.
origin +
'0 0 100'),
'0 0 0', 1);
280 Send_Effect(EFFECT_EXPLOSION_SMALL, this.
wp00.origin +
'0 0 64',
'0 0 0', 1);
300 entity _gib =
new(vehicle_gib);
301 _setmodel(_gib, _template.model);
304 _gib.velocity = _vel;
307 _gib.colormod =
'-0.5 -0.5 -0.5';
309 _gib.avelocity = _rot;
322 _gib.cnt =
time + _maxtime;
324 _gib.nextthink =
time + _maxtime - 1;
334 bool(
entity,
float) _framefunc,
340 _slot.PlayerPhysplug = _framefunc;
341 _slot.vehicle_exit = _exitfunc;
342 _slot.vehicle_enter = _enterfunc;
343 STAT(HUD, _slot) = _hud;
345 _slot.vehicle_viewport =
new(vehicle_viewport);
346 _slot.vehicle_hudmodel =
new(vehicle_hudmodel);
347 _slot.vehicle_hudmodel.viewmodelforclient = _slot;
350 setmodel(_slot.vehicle_hudmodel, _hud_model);
351 setmodel(_slot.vehicle_viewport, MDL_Null);
353 setattachment(_slot.vehicle_hudmodel, _slot,
"");
354 setattachment(_slot.vehicle_viewport, _slot.vehicle_hudmodel,
"");
360 float _pichlimit_min,
float _pichlimit_max,
361 float _rotlimit_min,
float _rotlimit_max,
float _aimspeed,
float dt)
369 ftmp = _aimspeed * dt;
370 vtmp_y =
bound(-ftmp, vtmp_y, ftmp);
371 vtmp_x =
bound(-ftmp, vtmp_x, ftmp);
372 _turrret.angles_y =
bound(_rotlimit_min, _turrret.angles_y + vtmp_y, _rotlimit_max);
373 _turrret.angles_x =
bound(_pichlimit_min, _turrret.angles_x + vtmp_x, _pichlimit_max);
380 const vector cmod =
'0 0 0';
382 cmap = 1024 + (this.
team - 1) * 17;
384 cmap = player.colormap;
395 if(it == this.vehicle_shieldent)
407 if(it == this.vehicle_shieldent)
416 this.vehicle_hudmodel.effects = this.
effects = eff;
417 this.vehicle_hudmodel.colormod = this.
colormod = cmod;
418 this.vehicle_hudmodel.colormap = this.
colormap = cmap;
427 info.vr_setcolors(info,
this);
433 IL_EACH(g_vehicle_returners, it.wp00 == veh,
436 setthink(it, SUB_Remove);
437 it.nextthink = time + 0.1;
438 IL_REMOVE(g_vehicle_returners, it);
440 if(it.waypointsprite_attached)
441 WaypointSprite_Kill(it.waypointsprite_attached);
448 Send_Effect(EFFECT_TELEPORT, this.
wp00.origin +
'0 0 64',
'0 0 0', 1);
453 if(this.waypointsprite_attached)
454 WaypointSprite_Kill(this.waypointsprite_attached);
461 if(this.waypointsprite_attached)
462 WaypointSprite_Kill(this.waypointsprite_attached);
474 ent.nextthink = ent.cnt;
479 ent.nextthink =
time + 1;
482 ent.team = this.
wp00.team;
483 ent.wp00 = this.
wp00;
486 ent.nextthink =
time + 5;
495 entity wp = WaypointSprite_Spawn(WP_Vehicle, 0, 0, ent,
'0 0 64',
NULL, 0, ent, waypointsprite_attached,
true, RADARICON_Vehicle);
496 wp.wp_extra = ent.wp00.vehicleid;
498 if(ent.waypointsprite_attached)
500 WaypointSprite_UpdateRule(ent.waypointsprite_attached, ent.wp00.team,
SPRITERULE_DEFAULT);
502 WaypointSprite_UpdateBuildFinished(ent.waypointsprite_attached, ent.nextthink);
503 WaypointSprite_Ping(ent.waypointsprite_attached);
511 entity ret =
new(vehicle_return);
512 IL_PUSH(g_vehicle_returners, ret);
519 ret.cnt =
time + veh.respawntime;
520 ret.nextthink =
min(
time + veh.respawntime,
time + veh.respawntime - 5);
524 ret.nextthink =
min(
time + veh.respawntime,
time + veh.respawntime - 1);
557 void vehicles_regen(
entity this,
float timer, .
float regen_field,
float field_max,
float rpause,
float regen,
float delta_time,
float _healthscale)
559 if(this.(regen_field) < field_max)
560 if(timer + rpause <
time)
565 this.(regen_field) =
min(this.(regen_field) + regen * delta_time, field_max);
568 this.
owner.(regen_field) = (this.(regen_field) / field_max) * 100;
574 float resource_amount =
GetResource(
this, resource);
576 if(resource_amount < field_max)
577 if(timer + rpause <
time)
580 regen = regen * (resource_amount / this.
max_health);
582 SetResource(
this, resource,
min(resource_amount + regen * delta_time, field_max));
609 if(this.pain_frame <
time)
611 float _ftmp = myhealth / 50;
612 this.pain_frame =
time +
max(0.1, 0.1 + (
random() * 0.5 * _ftmp));
613 Send_Effect(EFFECT_SMOKE_SMALL, (this.
origin + (
randomvec() * 80)),
'0 0 0', 1);
635 this.dmg_time =
time;
639 damage *= autocvar_g_vehicles_vortex_damagerate;
641 damage *= autocvar_g_vehicles_machinegun_damagerate;
643 damage *= autocvar_g_vehicles_rifle_damagerate;
645 damage *= autocvar_g_vehicles_vaporizer_damagerate;
647 damage *= autocvar_g_vehicles_tag_damagerate;
649 damage *= autocvar_g_vehicles_weapon_damagerate;
651 this.
enemy = attacker;
655 if((this.vehicle_flags &
VHF_HASSHIELD) && (this.vehicle_shield > 0))
657 if (wasfreed(this.vehicle_shieldent) || this.vehicle_shieldent ==
NULL)
659 this.vehicle_shieldent =
new(vehicle_shieldent);
662 setmodel(this.vehicle_shieldent, MDL_VEH_SHIELD);
663 setattachment(this.vehicle_shieldent,
this,
"");
665 this.vehicle_shieldent.scale = 256 /
vlen(this.
maxs - this.
mins);
669 this.vehicle_shieldent.colormod =
'1 1 1';
670 this.vehicle_shieldent.alpha = 0.45;
672 this.vehicle_shieldent.nextthink =
time;
673 this.vehicle_shieldent.effects &= ~
EF_NODRAW;
675 this.vehicle_shield -= damage;
677 if(this.vehicle_shield < 0)
680 this.vehicle_shieldent.colormod =
'2 0 0';
681 this.vehicle_shield = 0;
682 this.vehicle_shieldent.alpha = 0.75;
700 if(this.damageforcescale < 1 && this.damageforcescale > 0)
718 info.vr_death(info,
this);
725 float true_limit = ((limit !=
RES_LIMIT_NONE) ? limit : targ.max_health);
751 if(this.play_time <
time)
756 float take =
min(_speedfac * wc, _maxpain);
758 this.play_time =
time + 0.25;
767 tracebox(this.
origin +
'0 0 32', PL_MIN_CONST, PL_MAX_CONST, prefer_spot,
MOVE_NORMAL, player);
774 for(
int i = 0; i < autocvar_g_vehicles_exit_attempts; ++i)
779 tracebox(v2, PL_MIN_CONST, PL_MAX_CONST, v,
MOVE_NORMAL, player);
790 entity player = vehic.owner;
792 if(vehicles_exit_running)
794 LOG_TRACE(
"^1vehicles_exit already running! this is not good...");
798 vehicles_exit_running =
true;
802 vehic.vehicle_exit(vehic, eject);
803 vehicles_exit_running =
false;
822 setsize(player, STAT(PL_MIN, player), STAT(PL_MAX, player));
831 player.vehicle =
NULL;
832 player.view_ofs = STAT(PL_VIEW_OFS, player);
834 STAT(HUD, player) = HUD_NORMAL;
838 player.(weaponentity).m_switchweapon = vehic.(weaponentity).m_switchweapon;
839 delete(vehic.(weaponentity));
841 player.last_vehiclecheck =
time + 3;
842 player.vehicle_enter_delay =
time + 2;
846 Kill_Notification(NOTIF_ONE, player, MSG_CENTER, CPID_VEHICLES);
847 Kill_Notification(NOTIF_ONE, player, MSG_CENTER, CPID_VEHICLES_OTHER);
853 vehic.avelocity =
'0 0 0';
855 vehic.tur_head.nodrawtoclient =
NULL;
860 WaypointSprite_Kill(vehic.wps_intruder);
864 vehic.team = vehic.tur_head.team;
868 vehic.old_vehicle_flags = 0;
871 vehic.vehicle_hudmodel.viewmodelforclient = vehic;
872 vehic.phase =
time + 1;
874 vehic.vehicle_exit(vehic, eject);
880 CSQCMODEL_AUTOINIT(vehic);
883 player.oldorigin = player.origin;
885 vehicles_exit_running =
false;
897 if((this.origin_z + this.maxs_z) > (toucher.origin_z))
901 if(
vdist(this.
velocity, >=, autocvar_g_vehicles_crush_minspeed))
902 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);
907 if(this.play_time <
time) {
909 info.vr_impact(info,
this);
915 if(autocvar_g_vehicles_enter)
924 if (!v)
return false;
927 if (f && f(
this,imp))
return true;
930 case IMP_weapon_drop.impulse:
932 stuffcmd(
this,
"\ntoggle cl_eventchase_vehicle\nset _vehicles_shownchasemessage 1\n");
946 || (veh.phase >=
time)
947 || (pl.vehicle_enter_delay >=
time)
948 || (STAT(FROZEN, pl))
955 if(autocvar_g_vehicles_enter)
961 info.vr_gunner_enter(info, veh, pl);
970 if(autocvar_g_vehicles_steal)
974 Send_Notification(NOTIF_ONE, pl, MSG_CENTER, CENTER_VEHICLE_STEAL_SELF);
976 veh.vehicle_shield = 0;
977 veh.old_vehicle_flags = veh.vehicle_flags;
980 if (autocvar_g_vehicles_steal_show_waypoint) {
981 entity wp = WaypointSprite_Spawn(WP_VehicleIntruder, 0, 0, pl,
'0 0 68',
NULL, veh.team, veh, wps_intruder,
true, RADARICON_DANGER);
989 veh.vehicle_ammo1 = 0;
990 veh.vehicle_ammo2 = 0;
991 veh.vehicle_reload1 = 0;
992 veh.vehicle_reload2 = 0;
993 veh.vehicle_energy = 0;
1001 veh.vehicle_hudmodel.viewmodelforclient = pl;
1004 pl.view_ofs = STAT(PL_VIEW_OFS, pl);
1005 setsize(pl, STAT(PL_MIN, pl), STAT(PL_MAX, pl));
1010 pl.items &= ~IT_USING_JETPACK;
1011 pl.angles = veh.angles;
1014 pl.disableclientprediction = 1;
1016 pl.teleportable =
false;
1019 pl.view_ofs =
'0 0 0';
1020 veh.colormap = pl.colormap;
1022 veh.tur_head.colormap = pl.colormap;
1026 veh.(weaponentity) =
new(temp_wepent);
1027 veh.(weaponentity).m_switchweapon = pl.(weaponentity).m_switchweapon;
1029 STAT(HUD, pl) = veh.vehicleid;
1030 pl.PlayerPhysplug = veh.PlayerPhysplug;
1032 pl.vehicle_ammo1 = veh.vehicle_ammo1;
1033 pl.vehicle_ammo2 = veh.vehicle_ammo2;
1034 pl.vehicle_reload1 = veh.vehicle_reload1;
1035 pl.vehicle_reload2 = veh.vehicle_reload2;
1036 pl.vehicle_energy = veh.vehicle_energy;
1052 Send_Notification(NOTIF_ONE, pl, MSG_CENTER, CENTER_VEHICLE_ENTER);
1081 info.vr_enter(info, veh);
1091 STAT(VEHICLESTAT_W2MODE, this.
owner) = STAT(VEHICLESTAT_W2MODE,
this);
1094 info.vr_think(info,
this);
1098 CSQCMODEL_AUTOUPDATE(
this);
1118 this.vehicle_hudmodel.viewmodelforclient =
this;
1142 this.lock_strength = 0;
1143 this.lock_target =
NULL;
1150 Send_Effect(EFFECT_TELEPORT, this.
origin +
'0 0 64',
'0 0 0', 1);
1152 if(this.vehicle_controller)
1153 this.
team = this.vehicle_controller.team;
1160 if(it.(weaponentity).hook.aiment ==
this)
1167 info.vr_spawn(info,
this);
1171 CSQCMODEL_AUTOINIT(
this);
1176 if(!autocvar_g_vehicles)
1183 info.vr_precache(info);
1188 if(!this.vehicle_controller)
1190 LOG_DEBUG(
"^1WARNING: ^7Vehicle with invalid .targetname");
1195 this.
team = this.vehicle_controller.team;
1200 if(this.vehicle_controller.team == 0)
1209 if(this.
team && (!
teamplay || !autocvar_g_vehicles_teams))
1212 if(this.mdl ==
"" || !this.mdl)
1213 _setmodel(
this, info.
model);
1215 _setmodel(
this, this.mdl);
1219 this.vehicle_viewport =
new(vehicle_viewport);
1220 this.vehicle_hudmodel =
new(vehicle_hudmodel);
1232 this.PlayerPhysplug = info.PlayerPhysplug;
1250 _setmodel(this.vehicle_hudmodel, info.
hud_model);
1251 setmodel(this.vehicle_viewport, MDL_Null);
1256 setattachment(this.
tur_head,
this, info.tag_head);
1257 setattachment(this.vehicle_hudmodel, this.
tur_head, info.tag_hud);
1258 setattachment(this.vehicle_viewport, this.vehicle_hudmodel, info.tag_view);
1262 setattachment(this.
tur_head,
this,
"");
1263 setattachment(this.vehicle_hudmodel,
this, info.tag_hud);
1264 setattachment(this.vehicle_viewport, this.vehicle_hudmodel, info.tag_view);
1269 info.vr_setup(info,
this);
1284 else if(autocvar_g_vehicles_delayspawn)
bool vehicles_heal(entity targ, entity inflictor, float amount, float limit)
string hud_model
cockpit model
#define IL_EACH(this, cond, body)
void vehicles_showwp(entity this)
const float SOLID_SLIDEBOX
void vehicle_use(entity this, entity actor, entity trigger)
const int VHF_HASSHIELD
Indicates vehicle.
void vehicles_projectile_explode(entity this, entity toucher)
void vehicles_regen_resource(entity this, float timer,.float regen_field, float field_max, float rpause, float regen, float delta_time, float _healthscale, Resource resource)
void vehicles_gib_explode(entity this)
void shieldhit_think(entity this)
bool autocvar_g_nodepthtestplayers
const int VHF_PLAYERSLOT
Vehicle has multiple player slots.
void vehicles_setreturn(entity veh)
#define PROJECTILE_MAKETRIGGER(e)
bool SetResourceExplicit(entity e, Resource res_type, float amount)
Sets the resource amount of an entity without calling any hooks.
void vehicles_spawn(entity this)
float trace_dphitq3surfaceflags
void vehicles_showwp_goaway(entity this)
const int VHF_DMGROLL
Add random velocity each frame if health < 50%.
const int SPRITERULE_DEFAULT
const int TELEPORT_NORMAL
vector Team_ColorRGB(int teamid)
void vehicles_clearreturn(entity veh)
IntrusiveList g_damagedbycontents
void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, int deathtype,.entity weaponentity, vector hitloc, vector force)
ClientState CS(Client this)
#define FOREACH_CLIENT(cond, body)
string head_model
full name of tur_head model
bool vehicles_crushable(entity e)
const int VHF_DMGSHAKE
Vehicle is airborn.
bool vehicle_impulse(entity this, int imp)
void vehicles_regen(entity this, float timer,.float regen_field, float field_max, float rpause, float regen, float delta_time, float _healthscale)
float DPCONTENTS_PLAYERCLIP
void antilag_clear(entity e, entity store)
const float EF_NODEPTHTEST
void CSQCProjectile(entity e, float clientanimate, int type, float docull)
#define UNSET_ONGROUND(s)
void vehicles_enter(entity pl, entity veh)
entity vehicle_tossgib(entity this, entity _template, vector _vel, string _tag, bool _burn, bool _explode, float _maxtime, vector _rot)
#define DEATH_WEAPONOF(t)
#define FOREACH_ENTITY_ENT(fld, match, body)
IntrusiveList g_bot_dodge
IntrusiveList g_bot_targets
#define IS_REAL_CLIENT(v)
const int EF_TELEPORT_BIT
void TakeResource(entity receiver, Resource res_type, float amount)
Takes an entity some resource.
string model
full name of model
#define PROJECTILE_TOUCH(e, t)
#define setmodel(this, m)
void vehicles_impact(entity this, float _minspeed, float _speedfac, float _maxpain)
void vehicles_projectile_explode_think(entity this)
const float EF_FULLBRIGHT
bool weaponLocked(entity player)
void vehicles_projectile_explode_use(entity this, entity actor, entity trigger)
void vehicles_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype,.entity weaponentity, vector hitloc, vector force)
const int VHF_SHIELDREGEN
Vehicle has shileding.
vector m_mins
vehicle hitbox size
ERASEABLE entity IL_PUSH(IntrusiveList this, entity it)
Push to tail.
void GiveResourceWithLimit(entity receiver, Resource res_type, float amount, float limit)
Gives an entity some resource but not more than a limit.
vector m_maxs
vehicle hitbox size
void SetResource(entity e, Resource res_type, float amount)
Sets the current amount of resource the given entity will have.
bool vehicle_addplayerslot(entity _owner, entity _slot, int _hud, Model _hud_model, bool(entity, float) _framefunc, void(entity, bool) _exitfunc, float(entity, entity) _enterfunc)
const int MAX_WEAPONSLOTS
void CSQCVehicleSetup(entity own, int vehicle_id)
vector vehicle_aimturret(entity _vehic, vector _target, entity _turrret, string _tagname, float _pichlimit_min, float _pichlimit_max, float _rotlimit_min, float _rotlimit_max, float _aimspeed, float dt)
void vehicles_think(entity this)
void vehicles_projectile_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype,.entity weaponentity, vector hitloc, vector force)
void Damage(entity targ, entity inflictor, entity attacker, float damage, int deathtype,.entity weaponentity, vector hitloc, vector force)
float Q3SURFACEFLAG_NOIMPACT
void vehicles_frame(entity this, entity actor)
const int CH_TRIGGER_SINGLE
void RemoveGrapplingHooks(entity pl)
vector(float skel, float bonenum) _skel_get_boneabs_hidden
float MOVETYPE_FLYMISSILE
bool autocvar_g_fullbrightplayers
IntrusiveList g_projectiles
void vehicles_gib_touch(entity this, entity toucher)
float GetResource(entity e, Resource res_type)
Returns the current amount of resource the given entity has.
const int VHF_MULTISLOT
Add random head angles each frame if health < 50%.
void vehicles_locktarget(entity this, float incr, float decr, float _lock_time)
#define vdist(v, cmp, f)
Vector distance comparison, avoids sqrt()
void vehicles_reset(entity this)
float RadiusDamage(entity inflictor, entity attacker, float coredamage, float edgedamage, float rad, entity cantbe, entity mustbe, float forceintensity, int deathtype,.entity weaponentity, entity directhitentity)
const int VHF_DEATHEJECT
Vehicles energy regenerates.
void CSQCModel_UnlinkEntity(entity e)
#define MUTATOR_CALLHOOK(id,...)
#define IS_BOT_CLIENT(v)
want: (IS_CLIENT(v) && !IS_REAL_CLIENT(v))
entity weaponentities[MAX_WEAPONSLOTS]
void vehicles_return(entity this)
const int VHF_DMGHEADROLL
Add random angles each frame if health < 50%.
void vehicles_gib_think(entity this)
entity vehicles_projectile(entity this, entity _mzlfx, Sound _mzlsound, vector _org, vector _vel, float _dmg, float _radi, float _force, float _size, int _deahtype, float _projtype, float _health, bool _cull, bool _clianim, entity _owner)
void UpdateAuxiliaryXhair(entity own, vector loc, vector clr, int axh_id)
void vehicles_exit(entity vehic, bool eject)
float default_player_alpha
#define DEATH_ISWEAPON(t, w)
#define sound(e, c, s, v, a)
void vehicles_reset_colors(entity this, entity player)
bool autocvar_g_playerclip_collisions
void vehicles_painframe(entity this)
const float EF_SELECTABLE
bool vehicle_initialize(entity this, Vehicle info, bool nodrop)
void set_movetype(entity this, int mt)
void RemoveHook(entity this)
vector vehicles_findgoodexit(entity this, entity player, vector prefer_spot)
bool AuxiliaryXhair_customize(entity this, entity client)
void vehicles_touch(entity this, entity toucher)
bool SendAuxiliaryXhair(entity this, entity to, int sf)