1 #define RACER_MIN '-40 -40 0'
2 #define RACER_MAX '40 40 44'
4 void racer_exit(float eject);
7 float jetfromtag_power;
8 float jetfromtag_normpower;
9 float jetfromtag_nosolid;
10 vector jetfromtag_origin;
12 vector jetfromtag(string tagname,float jet_length,float air_power,float solid_power)
15 float air_frac, solid_frac, air_pwr, solid_pwr;
17 jetfromtag_origin = gettaginfo(self,gettagindex(self,tagname));
18 v_forward = normalize(v_forward);
20 force_dir = jetfromtag_origin - v_forward * jet_length;
21 traceline(jetfromtag_origin, force_dir, MOVE_NORMAL, self);
23 solid_frac = 1 - trace_fraction;
24 air_frac = trace_fraction;
27 jetfromtag_nosolid += 1;
29 solid_pwr = solid_frac * solid_power;
30 air_pwr = air_frac * air_power;
32 jetfromtag_power = solid_pwr + air_pwr;
33 jetfromtag_normpower = jetfromtag_power / (air_power+solid_power);
34 if(trace_fraction == 1)
37 return v_forward * (jetfromtag_power + cvar("g_vehicle_racer_power_min"));
40 void racer_align4point(float spring_length,float spring_up,float blendrate)
42 vector fl_org,fl_force,fr_org,fr_force,bl_org,bl_force,br_org,br_force;
43 vector push_vector,align;
44 float fl_push, fr_push, bl_push, br_push;
46 jetfromtag_nosolid = 0;
48 fr_force = jetfromtag("tag_engine_fr",spring_length,cvar("g_vehicle_racer_power_air"), cvar("g_vehicle_racer_power_solid"));
49 fr_org = jetfromtag_origin; fr_push = jetfromtag_normpower;
51 fl_force = jetfromtag("tag_engine_fl",spring_length,cvar("g_vehicle_racer_power_air"), cvar("g_vehicle_racer_power_solid"));
52 fl_org = jetfromtag_origin; fl_push = jetfromtag_normpower;
54 br_force = jetfromtag("tag_engine_br",spring_length,cvar("g_vehicle_racer_power_air"), cvar("g_vehicle_racer_power_solid"));
55 br_org = jetfromtag_origin; br_push = jetfromtag_normpower;
57 bl_force = jetfromtag("tag_engine_bl",spring_length,cvar("g_vehicle_racer_power_air"), cvar("g_vehicle_racer_power_solid"));
58 bl_org = jetfromtag_origin; bl_push = jetfromtag_normpower;
60 push_vector = fr_force + fl_force + br_force + bl_force;
64 align_x = (fl_push - bl_push);
65 align_x += (fr_push - br_push);
68 align_z = (fl_push - fr_push);
69 align_z += (bl_push - br_push);
72 self.angles_x *= 0.96;
73 self.angles_z *= 0.96;
75 self.angles_x += align_x * frametime;
76 self.angles_z += align_z * frametime;
78 self.velocity = self.velocity + (push_vector * frametime);
79 self.velocity_z -= sv_gravity * frametime;
82 void racer_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
84 self.velocity += force;
95 player.fixangle = FALSE;
97 player.BUTTON_ZOOM = 0;
98 player.BUTTON_CROUCH = 0;
102 if(player.BUTTON_USE)
110 racer.angles_x *= -1;
111 makevectors(racer.angles);
112 racer.angles_x *= -1;
115 ftmp = cvar("g_vehicle_racer_turnspeed") / server_fps;
118 ftmp = bound(ftmp2,shortangle_f(player.v_angle_y - racer.angles_y,racer.angles_y),ftmp);
121 racer.angles_y = safeangle(racer.angles_y + ftmp);
122 if(player.BUTTON_JUMP)
124 player.BUTTON_JUMP = 0;
125 racer.velocity = racer.velocity + v_forward * 250 + v_up * 600;
129 if(vlen(player.movement) == 0)
132 ftmp = self.velocity_z;
133 self.velocity = self.velocity - self.velocity * cvar("g_vehicle_racer_speed_stop");
134 self.velocity_z = ftmp;
139 if(player.movement_x != 0)
141 if(player.movement_x > 0)
142 player.movement_x = 1;
143 else if(player.movement_x < 0)
144 player.movement_x = -1;
147 if(player.movement_y != 0)
149 if(player.movement_y < 0)
150 player.movement_y = -1;
151 else if(player.movement_y > 0)
152 player.movement_y = 1;
156 self.velocity = self.velocity + ((v_right * player.movement_y) * cvar("g_vehicle_racer_speed_strafe")) * frametime;
157 self.velocity = self.velocity + ((v_forward * player.movement_x) * cvar("g_vehicle_racer_speed_forward")) * frametime;
167 df = vlen(self.velocity) * cvar("g_vehicle_racer_downforce") * v_up;
168 self.velocity = self.velocity - df;
169 player.movement = racer.velocity;
170 racer_align4point(cvar("g_vehicle_racer_springlength"),100,cvar("g_vehicle_racer_inert"));
172 if(cvar("g_vehicle_racer_drag"))
173 self.velocity = movelib_dragvec(cvar("g_vehicle_racer_drag"),cvar("g_vehicle_racer_dragexp"));
176 player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
177 setorigin(player,racer.origin + '0 0 32');
178 player.velocity = racer.velocity;
185 movelib_beak_simple(cvar("g_vehicle_racer_speed_stop"));
187 self.nextthink = time;
193 self.owner.angles = self.angles;
195 //setattachment(other,self,"");
197 self.think = SUB_Null;
198 self.owner.takedamage = DAMAGE_NO;
199 self.owner.solid = SOLID_NOT;
200 self.owner.movetype = MOVETYPE_NOCLIP;
201 //setsize(self.owner,spiderbot_MIN,spiderbot_MAX);
202 self.owner.alpha = -1;
203 self.owner.PlayerPhysplug = racer_pplug;
204 self.owner.vehicle = self;
205 self.owner.event_damage = SUB_Null;
206 //self.event_damage = vehicle_stdproc_damage ;
207 self.colormap = self.owner.colormap;
208 //self.tur_head.colormap = self.owner.colormap;
209 //self.vehicle_hudmodel.viewmodelforclient = self.owner;
210 //self.owner.hud = HUD_SPIDEBOT;
211 //self.owner.vehicle_health = (self.vehicle_health / cvar("g_vehicle_spiderbot_health"));
212 //self.owner.vehicle_shield = (self.vehicle_shield / cvar("g_vehicle_spiderbot_shield"));
214 //setorigin(self.owner,self.origin);
215 //setattachment(self.owner,self,"");
216 //setorigin(self.owner,'0 0 0');
219 WriteByte (MSG_ONE, SVC_SETVIEWPORT);
220 WriteEntity( MSG_ONE, self.vehicle_viewport);
222 WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES
223 WriteAngle(MSG_ONE, self.angles_x); // tilt
224 WriteAngle(MSG_ONE, self.angles_y); // yaw
225 WriteAngle(MSG_ONE, 0); // roll
227 //self.owner.view_ofs = '0 0 0';
228 //self.tur_head.nodrawtoclient = self.owner;
231 void racer_exit(float eject)
233 self.velocity = '0 0 0';
235 msg_entity = self.owner;
236 WriteByte (MSG_ONE, SVC_SETVIEWPORT);
237 WriteEntity( MSG_ONE, self.owner);
239 WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES
240 WriteAngle(MSG_ONE, 0); // tilt
241 WriteAngle(MSG_ONE, self.angles_y); // yaw
242 WriteAngle(MSG_ONE, 0); // roll
244 self.think = racer_think;
245 self.nextthink = time;
247 self.owner.takedamage = DAMAGE_AIM;
248 self.owner.solid = SOLID_SLIDEBOX;
249 self.owner.movetype = MOVETYPE_WALK;
251 setsize(self.owner,PL_MIN,PL_MAX);
253 self.owner.alpha = 1;
254 self.owner.PlayerPhysplug = SUB_Null;
255 self.owner.vehicle = world;
256 self.owner.view_ofs = PL_VIEW_OFS;
257 self.owner.event_damage = PlayerDamage;
258 //self.owner.hud = HUD_NORMAL;
260 self.colormap = 1024;
261 //self.tur_head.colormap = 1024;
263 //self.vehicle_hudmodel.viewmodelforclient = self;
264 //self.tur_head.nodrawtoclient = self;
265 setattachment(self.owner,world,"");
269 makevectors(self.angles);
270 setorigin(self.owner,self.origin + v_forward * 100);
271 self.owner.velocity = (v_up + v_forward * 0.25) * 750;
274 setorigin(self.owner,self.origin + '0 0 64' - v_forward * 200);
284 if(vlen(self.velocity) == 0)
287 if(other.classname != "player")
291 a = normalize(other.origin - self.origin);
292 a = a - normalize(self.velocity);
297 if(other.classname != "player")
300 if(other.deadflag != DEAD_NO)
303 if(other.vehicle != world)
310 float racer_customizeentityforclient()
312 if(self.deadflag == DEAD_DEAD)
319 void racer_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force);
322 self.think = racer_think;
323 self.nextthink = time;
325 //self.vehicle_health = CCVAR("_health");
326 //self.vehicle_shield = CCVAR("_shield");
327 //self.event_damage = vehicle_stdproc_damage;
328 self.event_damage = racer_damage;
329 //self.iscreature = TRUE;
331 self.movetype = MOVETYPE_FLY;
332 self.solid = SOLID_SLIDEBOX;
333 //self.takedamage = DAMAGE_AIM;
334 self.touch = racer_touch;
335 //self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = 1;
337 //self.tur_head.angles = '0 0 0';
338 //self.colormap = 1024;
339 //self.tur_head.colormap = 1024;
340 self.deadflag = DEAD_NO;
341 self.bot_attack = TRUE;
342 setorigin(self,self.origin + '0 0 128');
343 setsize(self,RACER_MIN*0.5,RACER_MAX*0.5);
344 setorigin(self,self.tur_aimpos);
345 pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
351 sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
352 pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
354 //RadiusDamage (self, self.owner, self.owner.shot_dmg, self.owner.shot_dmg * 0.5, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
355 RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_TURRET, world);
357 self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = -1;
358 self.nextthink = time + 10;
359 self.think = spiderbot_spawn;
361 setorigin(self,self.tur_aimpos);
370 self.event_damage = SUB_Null;
371 self.iscreature = FALSE;
372 self.solid = SOLID_NOT;
373 self.takedamage = DAMAGE_NO;
374 self.touch = SUB_Null;
375 self.nextthink = time + random() * 2;
376 self.think = spiderbot_blowup;
377 self.deadflag = DEAD_DEAD;
378 self.vehicle_hudmodel.viewmodelforclient = self;
380 self.tur_head.frame = 0;
387 server_fps = (1 / sys_ticrate);
390 addstat(STAT_HUD, AS_INT, hud);
391 addstat(STAT_SPIDERBOT_ROCKETS, AS_INT, rockets);
392 addstat(STAT_SPIDERBOT_RELOAD, AS_FLOAT, rockets_reload);
393 addstat(STAT_SPIDERBOT_HEAT, AS_FLOAT, vehicle_heat);
394 addstat(STAT_SPIDERBOT_HEALTH, AS_FLOAT, vehicle_health);
395 addstat(STAT_SPIDERBOT_SHIELD, AS_FLOAT, vehicle_shield);
398 if (self.netname == "") self.netname = "Race PoD";
400 self.vehicle_viewport = spawn();
401 self.event_damage = racer_damage;
403 //self.vehicle_hudmodel = spawn();
404 //self.vehicle_flags = VHF_HASSHIELD | VHF_SHIELDREGEN | VHF_HEALTHREGEN;
405 //self.cvar_basename = "g_vehicle_spiderbot";
407 setmodel (self.vehicle_viewport, "models/null.md3");
408 setmodel(self,"models/racers/waka.dpm");
410 setattachment(self.vehicle_viewport,self,"");
411 //self.tur_head.customizeentityforclient = spiderbot_customizeentityforclient;
413 setorigin(self.vehicle_viewport,'-400 0 40');
414 self.tur_aimpos = self.origin;
417 //self.vehicle_die = spiderbot_die;
418 //self.vehicle_exit = spiderbot_exit;
421 void spawnfunc_racer()
423 g_turrets_common_precash();
425 precache_model ( "models/racers/waka.dpm");
427 self.think = racer_dinit;
428 self.nextthink = time + 0.5;