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