1 void turret_ewheel_projectile_explode()
5 org2 = findbetterlocation (self.origin, 8);
6 pointparticles(particleeffectnum("laser_impact"), org2, trace_plane_normal * 1000, 1);
7 //w_deathtypestring = "saw the eweel. to late.";
11 d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
12 self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
13 self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
15 RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
17 sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
28 for (i = 0; i < 1; ++i)
30 turret_do_updates(self);
32 sound (self, CHAN_WEAPON, "weapons/lasergun_fire.wav", VOL_BASE, ATTN_NORM);
33 pointparticles(particleeffectnum("laser_muzzleflash"), self.tur_shotorg, self.tur_shotdir_updated * 1000, 1);
36 setorigin(proj, self.tur_shotorg);
37 proj.classname = "ewheel bolt";
39 proj.bot_dodge = FALSE;
40 proj.bot_dodgerating = self.shot_dmg;
41 proj.think = turret_ewheel_projectile_explode;
42 proj.nextthink = time + 9;
43 proj.solid = SOLID_BBOX;
44 proj.movetype = MOVETYPE_FLYMISSILE;
45 proj.velocity = normalize(self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
46 //proj.angles = vectoangles(proj.velocity);
47 proj.touch = turret_ewheel_projectile_explode;
48 proj.enemy = self.enemy;
49 proj.flags = FL_PROJECTILE | FL_NOTARGET;
51 CSQCProjectile(proj, TRUE, PROJECTILE_LASER, TRUE);
53 self.tur_head.frame += 2;
55 if (self.tur_head.frame > 3)
56 self.tur_head.frame = 0;
61 float ewheel_moveverb_roam(float eval)
68 return verb.verb_static_value;
74 makevectors(self.angles);
75 self.moveto = v_forward * 128;
76 self.steerto = steerlib_beamsteer(v_forward,1024,32,36,128);
78 movelib_move_simple(v_forward,cvar("g_turrets_unit_ewheel_speed_fast"),0.4);
80 return VS_CALL_YES_DOING;
86 return VS_CALL_YES_DONE;
89 float ewheel_moveverb_path(float eval)
96 return verb.verb_static_value;
101 // Do we have a path?
102 if not(self.pathcurrent)
106 // Are we close enougth to a path node to switch to the next?
107 if (vlen(self.origin - self.pathcurrent.origin) < 64)
108 if (self.pathcurrent.path_next == world)
110 // Path endpoint reached
111 pathlib_deletepath(self.pathcurrent.owner);
112 self.pathcurrent = world;
116 if (self.pathgoal.use)
119 if (self.pathgoal.enemy)
121 self.pathcurrent = pathlib_astar(self.pathgoal.origin,self.pathgoal.enemy.origin);
122 self.pathgoal = self.pathgoal.enemy;
126 self.pathgoal = world;
129 self.pathcurrent = self.pathcurrent.path_next;
133 if (self.pathcurrent)
136 switch (self.waterlevel)
145 self.moveto = self.pathcurrent.origin;
146 self.steerto = steerlib_attract2(self.moveto,0.5,500,0.95);
149 movelib_move_simple(v_forward,cvar("g_turrets_unit_ewheel_speed_fast"),0.4);
151 return VS_CALL_YES_DOING;
154 return VS_CALL_YES_DONE;
158 if (self.pathcurrent)
159 pathlib_deletepath(self.pathcurrent.owner);
161 self.pathcurrent = world;
163 return VS_CALL_YES_DONE;
166 return VS_CALL_YES_DONE;
169 float ewheel_moveverb_enemy(float eval)
176 if (self.spawnflags & TSF_NO_PATHBREAK)
177 if (self.pathcurrent)
180 return verb.verb_static_value;
187 self.steerto = steerlib_arrive(self.enemy.origin,self.target_range_optimal);
188 self.steerto = steerlib_beamsteer(self.steerto,1024,64,68,256);
189 self.moveto = self.origin + self.steerto * 128;
191 makevectors(self.angles);
193 if (self.tur_dist_enemy > self.target_range_optimal)
195 if ( self.tur_head.spawnshieldtime < 1 )
198 movelib_move_simple(v_forward ,cvar("g_turrets_unit_ewheel_speed_fast"),0.4);
200 else if (self.tur_head.spawnshieldtime < 2)
204 movelib_move_simple(v_forward,cvar("g_turrets_unit_ewheel_speed_slow"),0.4);
209 movelib_move_simple(v_forward,cvar("g_turrets_unit_ewheel_speed_slower"),0.4);
212 else if (self.tur_dist_enemy < self.target_range_min)
215 movelib_move_simple(v_forward * -1,cvar("g_turrets_unit_ewheel_speed_slow"),0.4);
219 movelib_beak_simple(cvar("g_turrets_unit_ewheel_speed_stop"));
222 return VS_CALL_YES_DOING;
226 return VS_CALL_YES_DONE;
229 float ewheel_moveverb_runaway(float eval)
234 if (self.spawnflags & TSF_NO_PATHBREAK)
235 if (self.pathcurrent)
239 if (self.health < 50)
240 return verb.verb_static_value;
245 self.steerto = (steerlib_push(self.enemy.origin) * 0.7) + (steerlib_traceavoid_flat(0.3, 500, '0 0 128') * 0.3);
246 self.moveto = self.origin + self.steerto * 1000;
249 movelib_move_simple(v_forward ,cvar("g_turrets_unit_ewheel_speed_fast"),0.4);
251 return VS_CALL_YES_DOING;
255 return VS_CALL_YES_DONE;
258 float ewheel_moveverb_idle(float eval)
266 return verb.verb_static_value;
269 self.moveto = self.origin;
271 if (vlen(self.velocity))
272 movelib_beak_simple(cvar("g_turrets_unit_ewheel_speed_stop"));
274 return VS_CALL_YES_DOING;
277 return VS_CALL_YES_DONE;
280 void ewheel_postthink()
283 vector wish_angle,real_angle;
285 vz = self.velocity_z;
287 self.angles_x = anglemods(self.angles_x);
288 self.angles_y = anglemods(self.angles_y);
291 makevectors(self.angles);
294 wish_angle = normalize(self.steerto);
295 wish_angle = vectoangles(wish_angle);
296 real_angle = wish_angle - self.angles;
297 real_angle = shortangle_vxy(real_angle,self.tur_head.angles);
299 self.tur_head.spawnshieldtime = fabs(real_angle_y);
300 real_angle_y = bound(-self.tur_head.aim_speed,real_angle_y,self.tur_head.aim_speed);
301 self.angles_y = (self.angles_y + real_angle_y);
304 self.angles_z = bound(-45,real_angle_y * -2.5,45);
306 verbstack_pop(self.verbs_move);
315 self.velocity_z = vz;
318 void ewheel_respawnhook()
322 setorigin(self,self.pos1);
324 if (self.target != "")
326 e = find(world,targetname,self.target);
329 dprint("Initital waypoint for ewheel does NOT exsist, fix your map!\n");
333 if (e.classname != "turret_checkpoint")
334 dprint("Warning: not a turrret path\n");
337 self.pathcurrent = WALKER_PATH(self.origin,e.origin);
343 void ewheel_diehook()
345 turret_trowgib2(self.origin,self.velocity + v_up * 400,'-0.6 -0.2 -02',self,time + random() * 2 +3);
347 if (self.pathcurrent)
348 pathlib_deletepath(self.pathcurrent.owner);
350 self.pathcurrent = world;
352 if (self.damage_flags & TFL_DMG_DEATH_NORESPAWN)
354 verbstack_flush(self.verbs_move);
355 remove(self.verbs_move);
360 void turret_ewheel_dinit()
364 if (self.netname == "") self.netname = "eWheel Turret";
366 if (self.target != "")
368 e = find(world,targetname,self.target);
371 bprint("Warning! initital waypoint for ewheel does NOT exsist!\n");
375 if (e.classname != "turret_checkpoint")
376 dprint("Warning: not a turrret path\n");
378 self.goalcurrent = e;
381 self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
382 self.turrcaps_flags = TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MOVE | TFL_TURRCAPS_ROAM | TFL_TURRCAPS_HEADATTACHED;
384 self.turret_respawnhook = ewheel_respawnhook;
385 self.turret_diehook = ewheel_diehook;
387 if (turret_stdproc_init("ewheel_std",0,"models/turrets/ewheel-base.md3","models/turrets/ewheel-gun1.md3") == 0)
393 self.target_select_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
394 self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;// | TFL_TARGETSELECT_LOS;
395 self.damage_flags |= TFL_DMG_DEATH_NOGIBS;
397 self.iscreature = TRUE;
398 self.movetype = MOVETYPE_WALK;
399 self.solid = SOLID_SLIDEBOX;
400 self.takedamage = DAMAGE_AIM;
402 setattachment(self.tur_head,self,"tag_head");
403 setsize(self,'-32 -32 0','32 32 48');
404 setsize(self.tur_head,'0 0 0','0 0 0');
406 self.pos1 = self.origin;
408 self.idle_aim = '0 0 0';
411 self.turret_firefunc = ewheel_attack;
412 self.turret_postthink = ewheel_postthink;
413 self.tur_head.frame = 1;
415 self.verbs_move = spawn();
417 //verbstack_push(self.verbs_move, ewheel_moveverb_roam, WVM_IDLE, 0, self);
418 verbstack_push(self.verbs_move, ewheel_moveverb_idle, WVM_IDLE, 0, self);
419 verbstack_push(self.verbs_move, ewheel_moveverb_enemy, WVM_ENEMY, 0, self);
420 verbstack_push(self.verbs_move, ewheel_moveverb_path, WVM_PATH, 0, self);
421 //verbstack_push(self.verbs_move, ewheel_moveverb_runaway,WVM_PANIC, 0, self);
423 // Convert from dgr / sec to dgr / tic
424 self.tur_head.aim_speed = cvar("g_turrets_unit_ewheel_turnrate");
425 self.tur_head.aim_speed = self.tur_head.aim_speed / (1 / self.ticrate);
427 if (self.target != "")
429 e = find(world,targetname,self.target);
432 dprint("Initital waypoint for ewheel does NOT exsist, fix your map!\n");
436 if (e.classname != "turret_checkpoint")
437 dprint("Warning: not a turrret path\n");
440 self.pathcurrent = WALKER_PATH(self.origin,e.origin);
446 void spawnfunc_turret_ewheel()
448 g_turrets_common_precash();
450 precache_model ("models/turrets/ewheel-base.md3");
451 precache_model ("models/turrets/ewheel-gun1.md3");
453 self.think = turret_ewheel_dinit;
454 self.nextthink = time + 0.5;