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();
/** AuxiliaryXhair*
- Send addictional points of interest to be drawn, to vehicle owner
+ Send additional points of interest to be drawn, to vehicle owner
**/
float MAX_AXH = 4;
.entity AuxiliaryXhair[MAX_AXH];
*/
// 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;
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)
// 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)
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);
// End generic vehile projectile system
/** vehicles_spawn
- Exetuted for all vehiles on (re)spawn.
+ Exetuted for all vehicles on (re)spawn.
Sets defaults for newly spawned units.
**/
void vehicles_spawn()
// Colided with world?
if(other == world)
{
- // Apply velocity based self damage here
}
else
{
if(self.phase > time)
return;
- if(teams_matter)
+ if(teamplay)
if(self.team)
if(self.team != other.team)
return;
// .viewmodelforclient works better.
//self.vehicle_hudmodel.drawonlytoclient = self.owner;
-#ifndef VEHICLES_CSQC
- self.vehicle_hudmodel.viewmodelforclient = self.owner;
-#endif
+ self.vehicle_hudmodel.viewmodelforclient = self.owner;
self.event_damage = vehicles_damage;
self.nextthink = 0;
self.team = self.owner.team;
self.flags -= FL_NOTARGET;
-#ifndef VEHICLES_CSQC
msg_entity = other;
WriteByte (MSG_ONE, SVC_SETVIEWPORT);
WriteEntity(MSG_ONE, self.vehicle_viewport);
}
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
}
-#endif
-//#endif
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();
}
+/** 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;
+ //vector exitspot;
float mysize;
tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, prefer_spot, MOVE_NORMAL, self.owner);
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)
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)
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;
}
}
}
+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;
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;
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)
}
}
-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;
{
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)
{
if(e != self.vehicle_shieldent)
{
- e.effects = _effects | EF_LOWPRECISION;
+ 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.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);
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();
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;
-
- if(autocvar_g_vehicles_delayspawn)
- self.nextthink = time + _respawntime;
- else
- self.nextthink = time;
-
+ self.think = vehicles_spawn;
+ self.nextthink = time;
self.vehicle_respawntime = _respawntime;
self.vehicle_spawn = spawnproc;
self.pos1 = self.origin;
self.pos2 = self.angles;
-#ifdef VEHICLES_CSQC
- if(use_csqc)
- net_link_vehile();
-#endif
+ self.tur_head.team = self.team;
+
return TRUE;
}
-
void bugmenot()
{
self.vehicle_exit = self.vehicle_exit;