#include "sv_vehicles.qh"
+#include <common/items/_mod.qh>
+#include <common/mapobjects/defs.qh>
+#include <common/mapobjects/teleporters.qh>
+#include <common/mapobjects/triggers.qh>
+#include <server/bot/api.qh>
+#include <server/client.qh>
+#include <server/damage.qh>
+#include <server/items/items.qh>
+#include <server/weapons/common.qh>
+#include <server/world.qh>
+
bool SendAuxiliaryXhair(entity this, entity to, int sf)
{
WriteHeader(MSG_ENTITY, ENT_CLIENT_AUXILIARYXHAIR);
if(inflictor.owner == this.owner)
return;
- TakeResource(this, RESOURCE_HEALTH, damage);
+ TakeResource(this, RES_HEALTH, damage);
this.velocity += force;
- if(GetResourceAmount(this, RESOURCE_HEALTH) < 1)
+ if(GetResource(this, RES_HEALTH) < 1)
{
this.takedamage = DAMAGE_NO;
this.event_damage = func_null;
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, DMG_NOWEP, toucher);
+ RadiusDamage (this, this.realowner, this.shot_dmg, 0, this.shot_radius, this, NULL, this.shot_force, this.projectiledeathtype, DMG_NOWEP, toucher);
delete(this);
}
vehicles_projectile_explode(this, trigger);
}
-entity vehicles_projectile(entity this, string _mzlfx, Sound _mzlsound,
+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)
{
- TC(Sound, _mzlsound);
- entity proj;
-
- proj = spawn();
+ TC(Sound, _mzlsound);
+ entity proj = new(vehicles_projectile);
PROJECTILE_MAKETRIGGER(proj);
setorigin(proj, _org);
proj.shot_dmg = _dmg;
proj.shot_radius = _radi;
proj.shot_force = _force;
- proj.totalfrags = _deahtype;
+ proj.projectiledeathtype = _deahtype;
proj.solid = SOLID_BBOX;
set_movetype(proj, MOVETYPE_FLYMISSILE);
proj.flags = FL_PROJECTILE;
{
proj.takedamage = DAMAGE_AIM;
proj.event_damage = vehicles_projectile_damage;
- SetResourceAmountExplicit(proj, RESOURCE_HEALTH, _health);
+ SetResourceExplicit(proj, RES_HEALTH, _health);
}
else
proj.flags |= FL_NOTARGET;
if(_mzlsound != SND_Null)
sound (this, CH_WEAPON_A, _mzlsound, VOL_BASE, ATTEN_NORM);
- if(_mzlfx)
- Send_Effect_(_mzlfx, proj.origin, proj.velocity, 1);
+ if(_mzlfx != EFFECT_Null)
+ Send_Effect(_mzlfx, proj.origin, proj.velocity, 1);
setsize (proj, '-1 -1 -1' * _size, '1 1 1' * _size);
entity vehicle_tossgib(entity this, entity _template, vector _vel, string _tag, bool _burn, bool _explode, float _maxtime, vector _rot)
{
- entity _gib = spawn();
+ entity _gib = new(vehicle_gib);
_setmodel(_gib, _template.model);
vector org = gettaginfo(this, gettagindex(this, _tag));
setorigin(_gib, org);
_slot.vehicle_enter = _enterfunc;
STAT(HUD, _slot) = _hud;
_slot.vehicle_flags = VHF_PLAYERSLOT;
- _slot.vehicle_viewport = spawn();
- _slot.vehicle_hudmodel = spawn();
+ _slot.vehicle_viewport = new(vehicle_viewport);
+ _slot.vehicle_hudmodel = new(vehicle_hudmodel);
_slot.vehicle_hudmodel.viewmodelforclient = _slot;
_slot.vehicle_viewport.effects = (EF_ADDITIVE | EF_DOUBLESIDED | EF_FULLBRIGHT | EF_NODEPTHTEST | EF_NOGUNBOB | EF_NOSHADOW | EF_LOWPRECISION | EF_SELECTABLE | EF_TELEPORT_BIT);
this.velocity = '0 0 0';
this.effects = eff;
- Vehicle info = Vehicles_from(this.vehicleid);
+ Vehicle info = this.vehicledef; //REGISTRY_GET(Vehicles, this.vehicleid);
info.vr_setcolors(info, this);
}
if(timer + rpause < time)
{
if(_healthscale)
- regen = regen * (GetResourceAmount(this, RESOURCE_HEALTH) / this.max_health);
+ regen = regen * (GetResource(this, RES_HEALTH) / this.max_health);
this.(regen_field) = min(this.(regen_field) + regen * delta_time, field_max);
void vehicles_regen_resource(entity this, float timer, .float regen_field, float field_max, float rpause, float regen, float delta_time, float _healthscale, int resource)
{
- float resource_amount = GetResourceAmount(this, resource);
+ float resource_amount = GetResource(this, resource);
if(resource_amount < field_max)
if(timer + rpause < time)
if(_healthscale)
regen = regen * (resource_amount / this.max_health);
- SetResourceAmount(this, resource, min(resource_amount + regen * delta_time, field_max));
+ SetResource(this, resource, min(resource_amount + regen * delta_time, field_max));
if(this.owner)
- this.owner.(regen_field) = (GetResourceAmount(this, resource) / field_max) * 100;
+ this.owner.(regen_field) = (GetResource(this, resource) / field_max) * 100;
}
}
void vehicles_painframe(entity this)
{
- int myhealth = ((this.owner) ? this.owner.vehicle_health : ((GetResourceAmount(this, RESOURCE_HEALTH) / this.max_health) * 100));
+ int myhealth = ((this.owner) ? this.owner.vehicle_health : ((GetResource(this, RES_HEALTH) / this.max_health) * 100));
if(myhealth <= 50)
if(this.pain_frame < time)
this.velocity += randomvec() * 30;
if(this.vehicle_flags & VHF_DMGROLL)
+ {
if(this.vehicle_flags & VHF_DMGHEADROLL)
this.tur_head.angles += randomvec();
else
this.angles += randomvec();
+ }
}
}
{
if (wasfreed(this.vehicle_shieldent) || this.vehicle_shieldent == NULL)
{
- this.vehicle_shieldent = spawn();
+ this.vehicle_shieldent = new(vehicle_shieldent);
this.vehicle_shieldent.effects = EF_LOWPRECISION;
setmodel(this.vehicle_shieldent, MDL_VEH_SHIELD);
if(this.vehicle_shield < 0)
{
- TakeResource(this, RESOURCE_HEALTH, fabs(this.vehicle_shield));
+ TakeResource(this, RES_HEALTH, fabs(this.vehicle_shield));
this.vehicle_shieldent.colormod = '2 0 0';
this.vehicle_shield = 0;
this.vehicle_shieldent.alpha = 0.75;
}
else
{
- TakeResource(this, RESOURCE_HEALTH, damage);
+ TakeResource(this, RES_HEALTH, damage);
if(sound_allowed(MSG_BROADCAST, attacker))
spamsound (this, CH_PAIN, SND_ONS_HIT2, VOL_BASE, ATTEN_NORM); // FIXME: PLACEHOLDER
else
this.velocity += force;
- if(GetResourceAmount(this, RESOURCE_HEALTH) <= 0)
+ if(GetResource(this, RES_HEALTH) <= 0)
{
if(this.owner)
+ {
if(this.vehicle_flags & VHF_DEATHEJECT)
vehicles_exit(this, VHEF_EJECT);
else
vehicles_exit(this, VHEF_RELEASE);
-
+ }
antilag_clear(this, this);
- Vehicle info = Vehicles_from(this.vehicleid);
+ Vehicle info = this.vehicledef; //REGISTRY_GET(Vehicles, this.vehicleid);
info.vr_death(info, this);
vehicles_setreturn(this);
}
bool vehicles_heal(entity targ, entity inflictor, float amount, float limit)
{
- float true_limit = ((limit != RESOURCE_LIMIT_NONE) ? limit : targ.max_health);
- if(GetResourceAmount(targ, RESOURCE_HEALTH) <= 0 || GetResourceAmount(targ, RESOURCE_HEALTH) >= true_limit)
+ float true_limit = ((limit != RES_LIMIT_NONE) ? limit : targ.max_health);
+ if(GetResource(targ, RES_HEALTH) <= 0 || GetResource(targ, RES_HEALTH) >= true_limit)
return false;
- GiveResourceWithLimit(targ, RESOURCE_HEALTH, amount, true_limit);
+ GiveResourceWithLimit(targ, RES_HEALTH, amount, true_limit);
if(targ.owner)
- targ.owner.vehicle_health = (GetResourceAmount(targ, RESOURCE_HEALTH) / targ.max_health) * 100;
+ targ.owner.vehicle_health = (GetResource(targ, RES_HEALTH) / targ.max_health) * 100;
return true;
}
if(this.play_time < time)
{
- float wc = vlen(this.velocity - this.oldvelocity);
- //dprint("oldvel: ", vtos(this.oldvelocity), "\n");
- //dprint("vel: ", vtos(this.velocity), "\n");
- if(_minspeed < wc)
+ if(vdist(this.velocity - this.oldvelocity, >, _minspeed))
{
+ float wc = vlen(this.velocity - this.oldvelocity);
float take = min(_speedfac * wc, _maxpain);
- Damage (this, NULL, NULL, take, DEATH_FALL.m_id, DMG_NOWEP, 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");
- //dprint("take: ", ftos(take), "\n");
}
}
}
WriteByte (MSG_ONE, SVC_SETVIEWPORT);
WriteEntity( MSG_ONE, player);
+ // NOTE: engine networked
WriteByte (MSG_ONE, SVC_SETVIEWANGLES);
WriteAngle(MSG_ONE, 0);
WriteAngle(MSG_ONE, vehic.angles_y);
set_movetype(player, MOVETYPE_WALK);
player.effects &= ~EF_NODRAW;
player.teleportable = TELEPORT_NORMAL;
- player.alpha = 1;
+ player.alpha = default_player_alpha;
player.PlayerPhysplug = func_null;
player.vehicle = NULL;
player.view_ofs = STAT(PL_VIEW_OFS, player);
// Vehicle currently in use
if(this.owner)
{
- if(!forbidWeaponUse(this.owner))
if(toucher != NULL)
if((this.origin_z + this.maxs_z) > (toucher.origin_z))
if(vehicles_crushable(toucher))
+ if(!weaponLocked(this.owner))
{
- if(vdist(this.velocity, >=, 30))
+ if(vdist(this.velocity, >=, autocvar_g_vehicles_crush_minspeed))
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".
}
if(this.play_time < time) {
- Vehicle info = Vehicles_from(this.vehicleid);
+ Vehicle info = this.vehicledef; //REGISTRY_GET(Vehicles, this.vehicleid);
info.vr_impact(info, this);
}
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;
|| (pl.vehicle)
) { return; }
- Vehicle info = Vehicles_from(veh.vehicleid);
+ Vehicle info = veh.vehicledef; //REGISTRY_GET(Vehicles, veh.vehicleid);
if(autocvar_g_vehicles_enter) // vehicle's touch function should handle this if entering via use key is disabled (TODO)
if(veh.vehicle_flags & VHF_MULTISLOT)
veh.vehicle_hudmodel.viewmodelforclient = pl;
- pl.crouch = false;
+ UNSET_DUCKED(pl);
pl.view_ofs = STAT(PL_VIEW_OFS, pl);
setsize(pl, STAT(PL_MIN, pl), STAT(PL_MAX, pl));
WriteByte (MSG_ONE, SVC_SETVIEWPORT);
WriteEntity(MSG_ONE, veh.vehicle_viewport);
+ // NOTE: engine networked
WriteByte (MSG_ONE, SVC_SETVIEWANGLES);
if(veh.tur_head)
{
if(this.owner)
STAT(VEHICLESTAT_W2MODE, this.owner) = STAT(VEHICLESTAT_W2MODE, this);
- Vehicle info = Vehicles_from(this.vehicleid);
+ Vehicle info = this.vehicledef; //REGISTRY_GET(Vehicles, this.vehicleid);
info.vr_think(info, this);
vehicles_painframe(this);
});
- Vehicle info = Vehicles_from(this.vehicleid);
+ Vehicle info = this.vehicledef; //REGISTRY_GET(Vehicles, this.vehicleid);
info.vr_spawn(info, this);
vehicles_reset_colors(this, NULL);
return false;
if(!this.tur_head)
- {
info.vr_precache(info);
- IL_PUSH(g_vehicles, this);
- }
if(this.targetname && this.targetname != "")
{
this.damagedbycontents = true;
IL_PUSH(g_damagedbycontents, this);
this.vehicleid = info.vehicleid;
+ this.vehicledef = info;
this.PlayerPhysplug = info.PlayerPhysplug;
this.event_damage = func_null;
this.event_heal = func_null;