X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fvehicles%2Fvehicles.qc;h=d9d77b5f5211957f539c4ee41b1057beec0980a4;hb=7bda0f5360b57dcbda1e6913126dc0ae1f4cfdbc;hp=7dd30dca5fbb5fef965c5b46cfdd3119a9fbf697;hpb=5dea8b646ad7220a5d4ae5aa5c26afadbf46c031;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/vehicles/vehicles.qc b/qcsrc/server/vehicles/vehicles.qc index 7dd30dca5..d9d77b5f5 100644 --- a/qcsrc/server/vehicles/vehicles.qc +++ b/qcsrc/server/vehicles/vehicles.qc @@ -1,5 +1,8 @@ float autocvar_g_vehicles_crush_dmg; float autocvar_g_vehicles_crush_force; +float autocvar_g_vehicles_delayspawn; +float autocvar_g_vehicles_delayspawn_jitter; +float autocvar_g_vehicles_allow_flagcarry; void vehicles_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force); void vehicles_return(); @@ -10,7 +13,10 @@ void vehicles_clearrturn(); void vehicles_setreturn(); -#define MAX_AXH 4 +/** AuxiliaryXhair* + Send additional points of interest to be drawn, to vehicle owner +**/ +float MAX_AXH = 4; .entity AuxiliaryXhair[MAX_AXH]; float SendAuxiliaryXhair(entity to, float sf) @@ -75,7 +81,14 @@ void SendAuxiliaryXhair2(entity own, vector loc, vector clr, float axh_id) } */ +// End AuxiliaryXhair +/** + Notifies the client that he enterd a vehicle, and sends + realavent data. + + only sends vehicle_id atm (wich is a HUD_* constant, ex. HUD_SPIDERBOT) +**/ void CSQCVehicleSetup(entity own, float vehicle_id) { msg_entity = own; @@ -85,9 +98,23 @@ void CSQCVehicleSetup(entity own, float vehicle_id) WriteByte(MSG_ONE, vehicle_id); } +/** vehicles_locktarget + + Generic target locking. + + Figure out if what target is "locked" (if any), for missile tracking as such. + + after calling, "if(self.lock_target != world && self.lock_strength == 1)" mean + you have a locked in target. + + Exspects a crosshair_trace() or equivalent to be + dont before calling. + +**/ .entity lock_target; .float lock_strength; .float lock_time; +.float lock_soundtime; void vehicles_locktarget(float incr, float decr, float _lock_time) { if(self.lock_target && self.lock_target.deadflag != DEAD_NO) @@ -98,11 +125,20 @@ void vehicles_locktarget(float incr, float decr, float _lock_time) } if(self.lock_time > time) + { + if(self.lock_target) + if(self.lock_soundtime < time) + { + self.lock_soundtime = time + 0.5; + play2(self.owner, "vehicles/locked.wav"); + } + return; + } if(trace_ent != world) { - if(teams_matter && trace_ent.team == self.team) + if(teamplay && trace_ent.team == self.team) trace_ent = world; if(trace_ent.deadflag != DEAD_NO) @@ -114,7 +150,22 @@ void vehicles_locktarget(float incr, float decr, float _lock_time) if(self.lock_target == world && trace_ent != world) self.lock_target = trace_ent; - + + if(self.lock_target && trace_ent == self.lock_target) + { + if(self.lock_strength != 1 && self.lock_strength + incr >= 1) + { + play2(self.owner, "vehicles/lock.wav"); + self.lock_soundtime = time + 0.8; + } + else if (self.lock_strength != 1 && self.lock_soundtime < time) + { + play2(self.owner, "vehicles/locking.wav"); + self.lock_soundtime = time + 0.3; + } + + } + // Have a locking target // Trace hit current target if(trace_ent == self.lock_target && trace_ent != world) @@ -135,15 +186,15 @@ void vehicles_locktarget(float incr, float decr, float _lock_time) } } - #define VEHICLE_UPDATE_PLAYER(fld,vhname) \ -self.owner.vehicle_##fld = self.vehicle_##fld / autocvar_g_vehicle_##vhname##_##fld +self.owner.vehicle_##fld = (self.vehicle_##fld / autocvar_g_vehicle_##vhname##_##fld) * 100 #define vehicles_sweap_collision(orig,vel,dt,acm,mult) \ traceline(orig, orig + vel * dt, MOVE_NORMAL, self); \ if(trace_fraction != 1) \ acm += normalize(self.origin - trace_endpos) * (vlen(vel) * mult) +// Hover movement support float force_fromtag_power; float force_fromtag_normpower; vector force_fromtag_origin; @@ -159,6 +210,8 @@ vector vehicles_force_fromtag_hover(string tag_name, float spring_length, float return v_forward * force_fromtag_power; } +// Experimental hovermode wich uses attraction/repulstion from surface insted of gravity/repulsion +// Can possibly be use to move abt any surface (inclusing walls/celings) vector vehicles_force_fromtag_maglev(string tag_name, float spring_length, float max_power) { @@ -166,6 +219,7 @@ vector vehicles_force_fromtag_maglev(string tag_name, float spring_length, float v_forward = normalize(v_forward) * -1; traceline(force_fromtag_origin, force_fromtag_origin - (v_forward * spring_length), MOVE_NORMAL, self); + // TODO - this may NOT be compatible with wall/celing movement, unhardcode 0.25 (engine count multiplier) if(trace_fraction == 1.0) { force_fromtag_normpower = -0.25; @@ -178,8 +232,13 @@ vector vehicles_force_fromtag_maglev(string tag_name, float spring_length, float return v_forward * force_fromtag_power; } +// Generic vehile projectile system void vehicles_projectile_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) { + // Ignore damage from oterh projectiles from my owner (dont mess up volly's) + if(inflictor.owner == self.owner) + return; + self.health -= damage; self.velocity += force; if(self.health < 1) @@ -206,17 +265,16 @@ void vehicles_projectile_explode() PROJECTILE_TOUCH; self.event_damage = SUB_Null; - sound (self, CHAN_PROJECTILE, self.target2, VOL_BASE, ATTN_NORM); - pointparticles(particleeffectnum(self.target3), findbetterlocation (self.origin, 16), '0 0 0', 1); RadiusDamage (self, self.realowner, self.shot_dmg, 0, self.shot_radius, self, self.shot_force, self.totalfrags, other); remove (self); } -entity vehicles_projectile(string _impactfx, string _impactsnd, string _mzlfx, string _mzlsound, +entity vehicles_projectile(string _mzlfx, string _mzlsound, vector _org, vector _vel, float _dmg, float _radi, float _force, float _size, - float _deahtype, float _projtype, float _health) + float _deahtype, float _projtype, float _health, + float _cull, float _clianim) { entity proj; @@ -229,8 +287,6 @@ entity vehicles_projectile(string _impactfx, string _impactsnd, string _mzlfx, s proj.shot_radius = _radi; proj.shot_force = _force; proj.totalfrags = _deahtype; - proj.target2 = _impactsnd; - proj.target3 = _impactfx; proj.solid = SOLID_BBOX; proj.movetype = MOVETYPE_FLYMISSILE; proj.flags = FL_PROJECTILE; @@ -254,7 +310,7 @@ entity vehicles_projectile(string _impactfx, string _impactsnd, string _mzlfx, s proj.flags = FL_PROJECTILE | FL_NOTARGET; if(_mzlsound) - sound (self, CHAN_WEAPON, _mzlsound, VOL_BASE, ATTN_NORM); + sound (self, CH_WEAPON_A, _mzlsound, VOL_BASE, ATTN_NORM); if(_mzlfx) pointparticles(particleeffectnum(_mzlfx), proj.origin, proj.velocity, 1); @@ -262,18 +318,23 @@ entity vehicles_projectile(string _impactfx, string _impactsnd, string _mzlfx, s setsize (proj, '-1 -1 -1' * _size, '1 1 1' * _size); - CSQCProjectile(proj, TRUE, _projtype, TRUE); + CSQCProjectile(proj, _clianim, _projtype, _cull); return proj; } +// End generic vehile projectile system +/** vehicles_spawn + Exetuted for all vehicles on (re)spawn. + Sets defaults for newly spawned units. +**/ void vehicles_spawn() { dprint("Spawning vehicle: ", self.netname, "\n"); // De-own & reset self.vehicle_hudmodel.viewmodelforclient = self; - + self.owner = world; self.touch = vehicles_touch; self.event_damage = vehicles_damage; @@ -285,6 +346,7 @@ void vehicles_spawn() self.bot_attack = TRUE; self.flags = FL_NOTARGET; self.avelocity = '0 0 0'; + self.velocity = '0 0 0'; // Reset locking self.lock_strength = 0; @@ -321,7 +383,6 @@ void vehicles_touch() // Colided with world? if(other == world) { - // Apply velocity based self damage here } else { @@ -332,7 +393,7 @@ void vehicles_touch() else if(vehicles_crushable(other)) { if(vlen(self.velocity) != 0) - Damage(other, self, self.owner, autocvar_g_vehicles_crush_dmg, DEATH_SBCRUSH, '0 0 0', normalize(other.origin - self.origin) * autocvar_g_vehicles_crush_force); + Damage(other, self, self.owner, autocvar_g_vehicles_crush_dmg, DEATH_VHCRUSH, '0 0 0', normalize(other.origin - self.origin) * autocvar_g_vehicles_crush_force); } } return; @@ -363,7 +424,7 @@ void vehicles_enter() if(self.phase > time) return; - if(teams_matter) + if(teamplay) if(self.team) if(self.team != other.team) return; @@ -376,12 +437,12 @@ void vehicles_enter() self.owner = other; self.switchweapon = other.switchweapon; - + // .viewmodelforclient works better. //self.vehicle_hudmodel.drawonlytoclient = self.owner; - self.vehicle_hudmodel.viewmodelforclient = self.owner; - + self.vehicle_hudmodel.viewmodelforclient = self.owner; + self.event_damage = vehicles_damage; self.nextthink = 0; self.owner.angles = self.angles; @@ -404,7 +465,7 @@ void vehicles_enter() self.owner.vehicle_reload1 = self.vehicle_reload1; self.owner.vehicle_reload2 = self.vehicle_reload2; - // Cnnt do this, hides attached objects too. + // Cant do this, hides attached objects too. //self.exteriormodeltoclient = self.owner; //self.tur_head.exteriormodeltoclient = self.owner; @@ -427,7 +488,6 @@ void vehicles_enter() } else { - WriteByte (MSG_ONE, SVC_SETVIEWANGLES); WriteAngle(MSG_ONE, self.angles_x * -1); // tilt WriteAngle(MSG_ONE, self.angles_y); // yaw WriteAngle(MSG_ONE, 0); // roll @@ -436,12 +496,88 @@ void vehicles_enter() vehicles_clearrturn(); CSQCVehicleSetup(self.owner, self.hud); - + + if(other.flagcarried) + { + if(!autocvar_g_vehicles_allow_flagcarry) + DropFlag(other.flagcarried, world, world); + else + { + other.flagcarried.scale = 1; + setattachment(other.flagcarried, self, ""); + setorigin(other, '0 0 96'); + } + } + self.vehicle_enter(); } -void vehicles_exit(float eject) +/** vehicles_findgoodexit + Locates a valid location for the player to exit the vehicle. + Will first try prefer_spot, then up 100 random spots arround the vehicle + wich are in direct line of sight and empty enougth to hold a players bbox +**/ +vector vehicles_findgoodexit(vector prefer_spot) { + //vector exitspot; + float mysize; + + tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, prefer_spot, MOVE_NORMAL, self.owner); + if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid) + return prefer_spot; + + mysize = vlen(self.maxs - self.mins); + float i; + vector v, v2; + v2 = 0.5 * (self.absmin + self.absmax); + for(i = 0; i < 100; ++i) + { + v = randomvec(); + v_z = 0; + v = v2 + normalize(v) * mysize; + tracebox(v2, PL_MIN, PL_MAX, v, MOVE_NORMAL, self.owner); + if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid) + return v; + } + + /* + exitspot = (self.origin + '0 0 48') + v_forward * mysize; + tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner); + if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid) + return exitspot; + + exitspot = (self.origin + '0 0 48') - v_forward * mysize; + tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner); + if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid) + return exitspot; + + exitspot = (self.origin + '0 0 48') + v_right * mysize; + tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner); + if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid) + return exitspot; + + exitspot = (self.origin + '0 0 48') - v_right * mysize; + tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner); + if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid) + return exitspot; + */ + + return self.origin; +} + +/** vehicles_exit + Standarrd vehicle release fucntion. + custom code goes in self.vehicle_exit +**/ +void vehicles_exit(float eject) +{ + entity oldself; + if(self.flags & FL_CLIENT) + { + oldself = self; + self = self.vehicle; + } + self.flags |= FL_NOTARGET; if (self.owner) @@ -450,8 +586,8 @@ void vehicles_exit(float eject) WriteByte (MSG_ONE, SVC_SETVIEWPORT); WriteEntity( MSG_ONE, self.owner); - WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES - WriteAngle(MSG_ONE, 0); // tilt + WriteByte (MSG_ONE, SVC_SETVIEWANGLES); + WriteAngle(MSG_ONE, 0); // pich WriteAngle(MSG_ONE, self.angles_y); // yaw WriteAngle(MSG_ONE, 0); // roll @@ -468,7 +604,7 @@ void vehicles_exit(float eject) self.owner.event_damage = PlayerDamage; self.owner.hud = HUD_NORMAL; self.owner.switchweapon = self.switchweapon; - self.owner.BUTTON_USE = 0; + //self.owner.BUTTON_USE = 0; } if(self.deadflag == DEAD_NO) @@ -480,11 +616,25 @@ void vehicles_exit(float eject) self.phase = time + 1; - if(!teams_matter) + if(!teamplay) self.team = 0; - + else + self.team = self.tur_head.team; + + if(self.owner.flagcarried) + { + self.owner.flagcarried.scale = 0.6; + setattachment(self.owner.flagcarried, self.owner, ""); + setorigin(self.owner.flagcarried, FLAG_CARRY_POS); + } + + sound (self, CH_TRIGGER_SINGLE, "misc/null.wav", 1, ATTN_NORM); self.vehicle_exit(eject); self.owner = world; + vehicles_reset_colors(); + + if(oldself) + self = oldself; } @@ -496,7 +646,7 @@ void vehicles_regen(.float timer, .float regen_field, float field_max, float rpa self.regen_field = min(self.regen_field + regen * delta_time, field_max); if(self.owner) - self.owner.regen_field = self.regen_field / field_max; + self.owner.regen_field = (self.regen_field / field_max) * 100; } } @@ -514,6 +664,30 @@ void shieldhit_think() } } +void vehicles_painframe() +{ +//.float pain_finished; //Added by Supajoe + + if(self.owner.vehicle_health <= 50) + if(self.pain_frame < time) + { + float _ftmp; + _ftmp = self.owner.vehicle_health / 50; + self.pain_frame = time + 0.1 + (random() * 0.5 * _ftmp); + pointparticles(particleeffectnum("smoke_small"), (self.origin + (randomvec() * 80)), '0 0 0', 1); + + if(self.vehicle_flags & VHF_DMGSHAKE) + self.velocity += randomvec() * 30; + + if(self.vehicle_flags & VHF_DMGROLL) + if(self.vehicle_flags & VHF_DMGHEADROLL) + self.tur_head.angles += randomvec(); + else + self.angles += randomvec(); + + } +} + void vehicles_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) { self.dmg_time = time; @@ -532,7 +706,6 @@ void vehicles_damage(entity inflictor, entity attacker, float damage, float deat self.vehicle_shieldent.think = shieldhit_think; } - self.vehicle_shieldent.colormod = '1 1 1'; self.vehicle_shieldent.alpha = 0.45; self.vehicle_shieldent.angles = vectoangles(normalize(hitloc - (self.origin + self.vehicle_shieldent.origin))) - self.angles; @@ -542,15 +715,27 @@ void vehicles_damage(entity inflictor, entity attacker, float damage, float deat if(self.vehicle_shield < 0) { + self.vehicle_health -= fabs(self.vehicle_shield); self.vehicle_shieldent.colormod = '2 0 0'; self.vehicle_shield = 0; self.vehicle_shieldent.alpha = 0.75; - self.vehicle_health -= fabs(self.vehicle_shield); + + if(sound_allowed(MSG_BROADCAST, attacker)) + spamsound (self, CH_PAIN, "onslaught/ons_hit2.wav", VOL_BASE, ATTN_NORM); // FIXME: PLACEHOLDER } + else + if(sound_allowed(MSG_BROADCAST, attacker)) + spamsound (self, CH_PAIN, "onslaught/electricity_explode.wav", VOL_BASE, ATTN_NORM); // FIXME: PLACEHOLDER + } else + { self.vehicle_health -= damage; + if(sound_allowed(MSG_BROADCAST, attacker)) + spamsound (self, CH_PAIN, "onslaught/ons_hit2.wav", VOL_BASE, ATTN_NORM); // FIXME: PLACEHOLDER + } + self.velocity += force; // * (vlen(force) / self.mass); if(self.vehicle_health <= 0) @@ -566,16 +751,6 @@ void vehicles_damage(entity inflictor, entity attacker, float damage, float deat } } -void vehicles_return() -{ - pointparticles(particleeffectnum("teleport"), self.enemy.origin + '0 0 64', '0 0 0', 1); - - self.enemy.think = vehicles_spawn; - self.enemy.nextthink = time; - - remove(self); -} - void vehicles_clearrturn() { entity ret; @@ -587,33 +762,107 @@ void vehicles_clearrturn() { ret.classname = ""; ret.think = SUB_Remove; - ret.nextthink = time + 0.1; + ret.nextthink = time + 0.1; + + if(ret.waypointsprite_attached) + WaypointSprite_Kill(ret.waypointsprite_attached); + return; } - ret = ret.chain; } } +void vehicles_return() +{ + pointparticles(particleeffectnum("teleport"), self.enemy.origin + '0 0 64', '0 0 0', 1); + + self.enemy.think = vehicles_spawn; + self.enemy.nextthink = time; + + if(self.waypointsprite_attached) + WaypointSprite_Kill(self.waypointsprite_attached); + + remove(self); +} + +void vehicles_showwp_goaway() +{ + if(self.waypointsprite_attached) + WaypointSprite_Kill(self.waypointsprite_attached); + + remove(self); + +} + +void vehicles_showwp() +{ + entity oldself; + vector rgb; + + if(self.cnt) + { + self.think = vehicles_return; + self.nextthink = self.cnt; + } + else + { + self.think = vehicles_return; + self.nextthink = time +1; + + oldself = self; + self = spawn(); + setmodel(self, "null"); + self.team = oldself.enemy.team; + self.enemy = oldself.enemy; + setorigin(self, oldself.enemy.pos1); + + self.nextthink = time + 5; + self.think = vehicles_showwp_goaway; + } + + if(teamplay && self.team) + rgb = TeamColor(self.team); + else + rgb = '1 1 1'; + WaypointSprite_Spawn("vehicle", 0, 0, self, '0 0 64', world, 0, self, waypointsprite_attached, TRUE, RADARICON_POWERUP, rgb); + if(self.waypointsprite_attached) + { + WaypointSprite_UpdateRule(self.waypointsprite_attached, self.enemy.team, SPRITERULE_DEFAULT); + if(oldself == world) + WaypointSprite_UpdateBuildFinished(self.waypointsprite_attached, self.nextthink); + WaypointSprite_Ping(self.waypointsprite_attached); + } + + if(oldself != world) + self = oldself; +} + void vehicles_setreturn() { entity ret; - + vehicles_clearrturn(); ret = spawn(); ret.classname = "vehicle_return"; - ret.enemy = self; - ret.think = vehicles_return; - ret.nextthink = time + self.vehicle_respawntime; -} - -float vehicles_customizeentityforclient() -{ - if(self.deadflag == DEAD_DEAD) - return FALSE; + ret.enemy = self; + ret.team = self.team; + ret.think = vehicles_showwp; + + if(self.deadflag != DEAD_NO) + { + ret.cnt = time + self.vehicle_respawntime; + ret.nextthink = min(time + self.vehicle_respawntime, time + self.vehicle_respawntime - 5); + } else - return TRUE; + { + ret.nextthink = min(time + self.vehicle_respawntime, time + self.vehicle_respawntime - 1); + } + + setmodel(ret, "null"); + setorigin(ret, self.pos1 + '0 0 96'); + } void vehicles_configcheck(string configname, float check_cvar) @@ -639,8 +888,8 @@ void vehicles_reset_colors() else _colormap = 1024; - _glowmod = '0 0 0'; - _colormod = '0 0 0'; + _glowmod = '0 0 0'; + _colormod = '0 0 0'; // Find all ents attacked to main model and setup effects, colormod etc. e = findchainentity(tag_entity, self); @@ -648,7 +897,7 @@ void vehicles_reset_colors() { if(e != self.vehicle_shieldent) { - e.effects = _effects; + e.effects = _effects; // | EF_LOWPRECISION; e.colormod = _colormod; e.colormap = _colormap; e.alpha = 1; @@ -656,51 +905,16 @@ void vehicles_reset_colors() e = e.chain; } - self.vehicle_hudmodel.effects = self.effects = _effects; + self.vehicle_hudmodel.effects = self.effects = _effects; // | EF_LOWPRECISION; self.vehicle_hudmodel.colormod = self.colormod = _colormod; self.vehicle_hudmodel.colormap = self.colormap = _colormap; + self.vehicle_viewport.effects = (EF_ADDITIVE | EF_DOUBLESIDED | EF_FULLBRIGHT | EF_NODEPTHTEST | EF_NOGUNBOB | EF_NOSHADOW | EF_LOWPRECISION | EF_SELECTABLE | EF_TELEPORT_BIT); - self.alpha = 1; - self.avelocity = '0 0 0'; - self.velocity = '0 0 0'; - -} - -//#define VEHICLES_CSQC -#ifdef VEHICLES_CSQC -#define VSF_ORG 2 -#define VSF_VEL 4 -#define VSF_ANG 8 -#define VSF_COLORMAP 16 -#define VSF_STAT1 32 - -float SendVehicle(entity to, float sf) -{ - WriteByte(MSG_ENTITY, ENT_CLIENT_VEHICLE_RACER); - - WriteByte(MSG_ENTITY, self.cnt); - - WriteCoord(MSG_ENTITY, self.origin_x); - WriteCoord(MSG_ENTITY, self.origin_y); - WriteCoord(MSG_ENTITY, self.origin_z); - - WriteCoord(MSG_ENTITY, self.velocity_x); - WriteCoord(MSG_ENTITY, self.velocity_y); - WriteCoord(MSG_ENTITY, self.velocity_z); - - WriteAngle(MSG_ENTITY, self.angles_x); - WriteAngle(MSG_ENTITY, self.angles_y); - WriteAngle(MSG_ENTITY, self.angles_z); - - return TRUE; -} - -void NetLinkVehicle() -{ - self.SendFlags = 0xFFFFFF; - Net_LinkEntity(self, FALSE, 0, SendVehicle); + self.alpha = 1; + self.avelocity = '0 0 0'; + self.velocity = '0 0 0'; + self.effects = _effects; } -#endif float vehicle_initialize(string net_name, string bodymodel, @@ -710,27 +924,28 @@ float vehicle_initialize(string net_name, string hudtag, string viewtag, float vhud, - vector min_s, - vector max_s, - float nodrop, + vector min_s, + vector max_s, + float nodrop, void() spawnproc, float _respawntime, float() physproc, void() enterproc, void(float extflag) exitfunc, void() dieproc, - void() thinkproc ) + void() thinkproc, + float use_csqc) { addstat(STAT_HUD, AS_INT, hud); - addstat(STAT_VEHICLESTAT_HEALTH, AS_FLOAT, vehicle_health); - addstat(STAT_VEHICLESTAT_SHIELD, AS_FLOAT, vehicle_shield); - addstat(STAT_VEHICLESTAT_ENERGY, AS_FLOAT, vehicle_energy); + addstat(STAT_VEHICLESTAT_HEALTH, AS_INT, vehicle_health); + addstat(STAT_VEHICLESTAT_SHIELD, AS_INT, vehicle_shield); + addstat(STAT_VEHICLESTAT_ENERGY, AS_INT, vehicle_energy); addstat(STAT_VEHICLESTAT_AMMO1, AS_INT, vehicle_ammo1); - addstat(STAT_VEHICLESTAT_RELOAD1, AS_FLOAT, vehicle_reload1); + addstat(STAT_VEHICLESTAT_RELOAD1, AS_INT, vehicle_reload1); addstat(STAT_VEHICLESTAT_AMMO2, AS_INT, vehicle_ammo2); - addstat(STAT_VEHICLESTAT_RELOAD2, AS_FLOAT, vehicle_reload2); + addstat(STAT_VEHICLESTAT_RELOAD2, AS_INT, vehicle_reload2); if(bodymodel == "") error("vehicles: missing bodymodel!"); @@ -743,11 +958,11 @@ float vehicle_initialize(string net_name, else self.netname = net_name; - if(self.team && !teams_matter) + if(self.team && !teamplay) self.team = 0; - + self.vehicle_flags |= VHF_ISVEHICLE; - + setmodel(self, bodymodel); self.vehicle_viewport = spawn(); @@ -759,15 +974,14 @@ float vehicle_initialize(string net_name, self.iscreature = TRUE; self.hud = vhud; - //self.customizeentityforclient = vehicles_customizeentityforclient; self.vehicle_die = dieproc; self.vehicle_exit = exitfunc; self.vehicle_enter = enterproc; self.PlayerPhysplug = physproc; self.event_damage = vehicles_damage; self.touch = vehicles_touch; - self.think = vehicles_spawn; - self.nextthink = time; + self.think = vehicles_spawn; + self.nextthink = time; self.vehicle_respawntime = _respawntime; self.vehicle_spawn = spawnproc; @@ -802,15 +1016,14 @@ float vehicle_initialize(string net_name, tracebox(self.origin + '0 0 100', min_s, max_s, self.origin - '0 0 10000', MOVE_WORLDONLY, self); setorigin(self, trace_endpos); } - - //self.vehicle_hudmodel.effects = EF_NODEPTHTEST; + self.pos1 = self.origin; self.pos2 = self.angles; - + self.tur_head.team = self.team; + return TRUE; } - void bugmenot() { self.vehicle_exit = self.vehicle_exit;