+float autocvar_g_vehicles_crush_dmg;
+float autocvar_g_vehicles_crush_force;
+
void vehicles_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force);
void vehicles_return();
+void vehicles_enter();
+void vehicles_touch();
+void vehicles_reset_colors();
void vehicles_clearrturn();
+void vehicles_setreturn();
+
#define MAX_AXH 4
.entity AuxiliaryXhair[MAX_AXH];
.entity lock_target;
.float lock_strength;
.float lock_time;
-void vehicles_locktarget2(float incr, float decr, float _lock_time)
+void vehicles_locktarget(float incr, float decr, float _lock_time)
{
if(self.lock_target && self.lock_target.deadflag != DEAD_NO)
- self.lock_target = world;
+ {
+ self.lock_target = world;
+ self.lock_strength = 0;
+ self.lock_time = 0;
+ }
if(trace_ent != world)
{
if(self.lock_time > time)
return;
- /*if not (trace_ent.vehicle_flags & VHF_ISVEHICLE || trace_ent.turrcaps_flags & TFL_TURRCAPS_ISTURRET)
- self.lock_strength = min(self.lock_strength - decr, 1);
- else if(trace_ent.deadflag != DEAD_NO)
- self.lock_strength = min(self.lock_strength - decr, 1);*/
-
if(self.lock_target == world && trace_ent != world)
self.lock_target = trace_ent;
return v_forward * force_fromtag_power;
}
-void vehicles_enter();
+
+
+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;
+ self.iscreature = TRUE;
+ self.movetype = MOVETYPE_WALK;
+ self.solid = SOLID_SLIDEBOX;
+ self.takedamage = DAMAGE_AIM;
+ self.deadflag = DEAD_NO;
+ self.bot_attack = TRUE;
+ self.flags = FL_NOTARGET;
+ self.avelocity = '0 0 0';
+
+ // Reset locking
+ self.lock_strength = 0;
+ self.lock_target = world;
+ self.misc_bulletcounter = 0;
+
+ // Return to spawn
+ self.angles = self.pos2;
+ setorigin(self, self.pos1 + '0 0 128');
+ // Show it
+ pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
+
+ vehicles_reset_colors();
+ self.vehicle_spawn();
+}
+
+// Better way of determening whats crushable needed! (fl_crushable?)
+float vehicles_crushable(entity e)
+{
+ if(e.classname == "player")
+ return TRUE;
+
+ if(e.classname == "monster_zombie")
+ return TRUE;
+
+ return FALSE;
+}
+
void vehicles_touch()
{
- // Vehicle currently
+ // Vehicle currently in use
if(self.owner)
{
// Colided with world?
{
//other.velocity += self.velocity * (self.mass / other.mass);
}
+ 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);
+ }
}
+ return;
}
if(other.classname != "player")
if(self.team != other.team)
return;
+ self.vehicle_ammo1 = 0;
+ self.vehicle_ammo2 = 0;
+ self.vehicle_reload1 = 0;
+ self.vehicle_reload2 = 0;
+ self.vehicle_energy = 0;
+
self.owner = other;
self.switchweapon = other.switchweapon;
CSQCVehicleSetup(self.owner, self.hud);
- if(self.vehicle_enter)
- self.vehicle_enter();
+ self.vehicle_enter();
}
void vehicles_exit(float eject)
self.owner.switchweapon = self.switchweapon;
}
+ if(self.deadflag == DEAD_NO)
+ self.avelocity = '0 0 0';
+
self.vehicle_hudmodel.viewmodelforclient = self;
self.tur_head.nodrawtoclient = self;
+ vehicles_setreturn();
self.phase = time + 1;
if(!teams_matter)
self.team = 0;
- if(self.vehicle_exit)
- self.vehicle_exit(eject);
-
+ self.vehicle_exit(eject);
self.owner = world;
}
else
self.vehicle_health -= damage;
+ self.velocity += force; // * (vlen(force) / self.mass);
+
if(self.vehicle_health <= 0)
{
if(self.owner)
vehicles_exit(VHEF_RELESE);
self.vehicle_die();
+ vehicles_setreturn();
}
}
void vehicles_return()
{
pointparticles(particleeffectnum("teleport"), self.enemy.origin + '0 0 64', '0 0 0', 1);
- self.enemy.think = self.use;
+
+ self.enemy.think = vehicles_spawn;
self.enemy.nextthink = time;
+
remove(self);
}
{
if(ret.enemy == self)
{
- ret.think = SUB_Remove;
- ret.nextthink = time + 0.1;
+ ret.classname = "";
+ ret.think = SUB_Remove;
+ ret.nextthink = time + 0.1;
return;
}
+
ret = ret.chain;
}
}
-void vehicles_setreturn(float retime, void() respawn_proc)
+void vehicles_setreturn()
{
+ entity ret;
+
vehicles_clearrturn();
- if (self.deadflag == DEAD_NO)
- {
- entity ret;
-
- ret = spawn();
- ret.classname = "vehicle_return";
- ret.enemy = self;
- ret.think = vehicles_return;
- ret.nextthink = time + retime;
- ret.use = respawn_proc;
- }
+ ret = spawn();
+ ret.classname = "vehicle_return";
+ ret.enemy = self;
+ ret.think = vehicles_return;
+ ret.nextthink = time + self.vehicle_respawntime;
}
float vehicles_customizeentityforclient()
vector max_s,
float nodrop,
void() spawnproc,
+ float _respawntime,
float() physproc,
void() enterproc,
void(float extflag) exitfunc,
addstat(STAT_VEHICLESTAT_AMMO2, AS_INT, vehicle_ammo2);
addstat(STAT_VEHICLESTAT_RELOAD2, AS_FLOAT, vehicle_reload2);
-
if(bodymodel == "")
error("vehicles: missing bodymodel!");
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 = spawnproc;
- self.nextthink = time;
+ 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.vehicle_respawntime = _respawntime;
+ self.vehicle_spawn = spawnproc;
if(autocvar_g_nodepthtestplayers)
self.effects = self.effects | EF_NODEPTHTEST;
setmodel(self.vehicle_hudmodel, hudmodel);
setmodel(self.vehicle_viewport, "null");
+
if(topmodel != "")
{
setmodel(self.tur_head, topmodel);
self.vehicle_die = self.vehicle_exit;
self.vehicle_spawn = self.vehicle_exit;
self.AuxiliaryXhair = self.AuxiliaryXhair;
- //self.vehicle_message = self.vehicle_exit;
}