1 #define ewheel_amin_stop 0
2 #define ewheel_amin_fwd_slow 1
3 #define ewheel_amin_fwd_fast 2
4 #define ewheel_amin_bck_slow 3
5 #define ewheel_amin_bck_fast 4
7 void turret_ewheel_projectile_explode()
11 org2 = findbetterlocation (self.origin, 8);
12 pointparticles(particleeffectnum("laser_impact"), org2, trace_plane_normal * 1000, 1);
13 //w_deathtypestring = "saw the eweel. to late.";
17 d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
18 self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
19 self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
21 RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
23 sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
34 for (i = 0; i < 1; ++i)
36 turret_do_updates(self);
38 sound (self, CHAN_WEAPON, "weapons/lasergun_fire.wav", VOL_BASE, ATTN_NORM);
39 pointparticles(particleeffectnum("laser_muzzleflash"), self.tur_shotorg, self.tur_shotdir_updated * 1000, 1);
42 setorigin(proj, self.tur_shotorg);
43 proj.classname = "ewheel bolt";
45 proj.bot_dodge = FALSE;
46 proj.bot_dodgerating = self.shot_dmg;
47 proj.think = turret_ewheel_projectile_explode;
48 proj.nextthink = time + 9;
49 proj.solid = SOLID_BBOX;
50 proj.movetype = MOVETYPE_FLYMISSILE;
51 proj.velocity = normalize(self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
52 //proj.angles = vectoangles(proj.velocity);
53 proj.touch = turret_ewheel_projectile_explode;
54 proj.enemy = self.enemy;
55 proj.flags = FL_PROJECTILE | FL_NOTARGET;
57 CSQCProjectile(proj, TRUE, PROJECTILE_LASER, TRUE);
59 self.tur_head.frame += 2;
61 if (self.tur_head.frame > 3)
62 self.tur_head.frame = 0;
68 float ewheel_moveverb_roam(float eval)
75 return verb.verb_static_value;
81 makevectors(self.angles);
82 self.moveto = v_forward * 128;
83 self.steerto = steerlib_beamsteer(v_forward,1024,32,36,128);
85 movelib_move_simple(v_forward,cvar("g_turrets_unit_ewheel_speed_fast"),0.4);
87 return VS_CALL_YES_DOING;
93 return VS_CALL_YES_DONE;
97 void ewheel_move_path()
100 if not(self.pathcurrent)
104 // Are we close enougth to a path node to switch to the next?
105 if (vlen(self.origin - self.pathcurrent.origin) < 64)
106 if (self.pathcurrent.path_next == world)
108 // Path endpoint reached
109 pathlib_deletepath(self.pathcurrent.owner);
110 self.pathcurrent = world;
114 if (self.pathgoal.use)
117 if (self.pathgoal.enemy)
119 self.pathcurrent = pathlib_astar(self.pathgoal.origin,self.pathgoal.enemy.origin);
120 self.pathgoal = self.pathgoal.enemy;
124 self.pathgoal = world;
127 self.pathcurrent = self.pathcurrent.path_next;
131 if (self.pathcurrent)
134 self.moveto = self.pathcurrent.origin;
135 self.steerto = steerlib_attract2(self.moveto,0.5,500,0.95);
137 movelib_move_simple(v_forward,cvar("g_turrets_unit_ewheel_speed_fast"),0.4);
143 void ewheel_move_enemy()
146 self.steerto = steerlib_arrive(self.enemy.origin,self.target_range_optimal);
148 //self.steerto = steerlib_standoff(self.enemy.origin,self.target_range_optimal);
149 //self.steerto = steerlib_beamsteer(self.steerto,1024,64,68,256);
150 self.moveto = self.origin + self.steerto * 128;
152 if (self.tur_dist_enemy > self.target_range_optimal)
154 if ( self.tur_head.spawnshieldtime < 1 )
156 self.frame = ewheel_amin_fwd_fast;
157 movelib_move_simple(v_forward ,cvar("g_turrets_unit_ewheel_speed_fast"),0.4);
159 else if (self.tur_head.spawnshieldtime < 2)
162 self.frame = ewheel_amin_fwd_slow;
163 movelib_move_simple(v_forward,cvar("g_turrets_unit_ewheel_speed_slow"),0.4);
167 self.frame = ewheel_amin_fwd_slow;
168 movelib_move_simple(v_forward,cvar("g_turrets_unit_ewheel_speed_slower"),0.4);
171 else if (self.tur_dist_enemy < self.target_range_optimal * 0.5)
173 self.frame = ewheel_amin_bck_slow;
174 movelib_move_simple(v_forward * -1,cvar("g_turrets_unit_ewheel_speed_slow"),0.4);
178 self.frame = ewheel_amin_stop;
179 movelib_beak_simple(cvar("g_turrets_unit_ewheel_speed_stop"));
185 float ewheel_moveverb_runaway(float eval)
190 if (self.spawnflags & TSF_NO_PATHBREAK)
191 if (self.pathcurrent)
195 if (self.health < 50)
196 return verb.verb_static_value;
201 self.steerto = (steerlib_push(self.enemy.origin) * 0.7) + (steerlib_traceavoid_flat(0.3, 500, '0 0 128') * 0.3);
202 self.moveto = self.origin + self.steerto * 1000;
205 movelib_move_simple(v_forward ,cvar("g_turrets_unit_ewheel_speed_fast"),0.4);
207 return VS_CALL_YES_DOING;
211 return VS_CALL_YES_DONE;
215 void ewheel_move_idle()
218 if (vlen(self.velocity))
219 movelib_beak_simple(cvar("g_turrets_unit_ewheel_speed_stop"));
222 void ewheel_postthink()
225 vector wish_angle,real_angle;
227 vz = self.velocity_z;
229 self.angles_x = anglemods(self.angles_x);
230 self.angles_y = anglemods(self.angles_y);
233 makevectors(self.angles);
236 wish_angle = normalize(self.steerto);
237 wish_angle = vectoangles(wish_angle);
238 real_angle = wish_angle - self.angles;
239 real_angle = shortangle_vxy(real_angle,self.tur_head.angles);
241 self.tur_head.spawnshieldtime = fabs(real_angle_y);
242 real_angle_y = bound(-self.tur_head.aim_speed,real_angle_y,self.tur_head.aim_speed);
243 self.angles_y = (self.angles_y + real_angle_y);
246 self.angles_z = bound(-45,real_angle_y * -2.5,45);
255 //verbstack_pop(self.verbs_move);
257 self.velocity_z = vz;
260 void ewheel_respawnhook()
264 setorigin(self,self.pos1);
266 if (self.target != "")
268 e = find(world,targetname,self.target);
271 dprint("Initital waypoint for ewheel does NOT exsist, fix your map!\n");
275 if (e.classname != "turret_checkpoint")
276 dprint("Warning: not a turrret path\n");
279 self.pathcurrent = WALKER_PATH(self.origin,e.origin);
285 void ewheel_diehook()
287 turret_trowgib2(self.origin,self.velocity + v_up * 400,'-0.6 -0.2 -02',self,time + random() * 2 +3);
289 if (self.pathcurrent)
290 pathlib_deletepath(self.pathcurrent.owner);
292 self.pathcurrent = world;
295 if (self.damage_flags & TFL_DMG_DEATH_NORESPAWN)
297 verbstack_flush(self.verbs_move);
298 remove(self.verbs_move);
304 void turret_ewheel_dinit()
308 if (self.netname == "") self.netname = "eWheel Turret";
310 if (self.target != "")
312 e = find(world,targetname,self.target);
315 bprint("Warning! initital waypoint for ewheel does NOT exsist!\n");
319 if (e.classname != "turret_checkpoint")
320 dprint("Warning: not a turrret path\n");
322 self.goalcurrent = e;
325 self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
326 self.turrcaps_flags = TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MOVE | TFL_TURRCAPS_ROAM | TFL_TURRCAPS_HEADATTACHED;
328 self.turret_respawnhook = ewheel_respawnhook;
329 self.turret_diehook = ewheel_diehook;
331 if (turret_stdproc_init("ewheel_std",0,"models/turrets/ewheel-base2.md3","models/turrets/ewheel-gun1.md3") == 0)
337 self.target_select_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
338 self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;// | TFL_TARGETSELECT_LOS;
339 self.damage_flags |= TFL_DMG_DEATH_NOGIBS;
341 self.iscreature = TRUE;
342 self.movetype = MOVETYPE_WALK;
343 self.solid = SOLID_SLIDEBOX;
344 self.takedamage = DAMAGE_AIM;
346 setattachment(self.tur_head,self,"tag_head");
347 setsize(self,'-32 -32 0','32 32 48');
348 setsize(self.tur_head,'0 0 0','0 0 0');
350 self.pos1 = self.origin;
352 self.idle_aim = '0 0 0';
355 self.turret_firefunc = ewheel_attack;
356 self.turret_postthink = ewheel_postthink;
357 self.tur_head.frame = 1;
359 //self.verbs_move = spawn();
360 //self.verbs_move.owner = self;
362 //verbstack_push(self.verbs_move, ewheel_moveverb_roam, WVM_IDLE, 0, self);
363 //verbstack_push(self.verbs_move, ewheel_moveverb_idle, WVM_IDLE, 0, self);
364 //verbstack_push(self.verbs_move, ewheel_moveverb_enemy, WVM_ENEMY, 0, self);
365 //verbstack_push(self.verbs_move, ewheel_moveverb_path, WVM_PATH, 0, self);
366 //verbstack_push(self.verbs_move, ewheel_moveverb_runaway,WVM_PANIC, 0, self);
368 // Convert from dgr / sec to dgr / tic
369 self.tur_head.aim_speed = cvar("g_turrets_unit_ewheel_turnrate");
370 self.tur_head.aim_speed = self.tur_head.aim_speed / (1 / self.ticrate);
372 if (self.target != "")
374 e = find(world,targetname,self.target);
377 dprint("Initital waypoint for ewheel does NOT exsist, fix your map!\n");
381 if (e.classname != "turret_checkpoint")
382 dprint("Warning: not a turrret path\n");
385 self.pathcurrent = WALKER_PATH(self.origin,e.origin);
391 void spawnfunc_turret_ewheel()
393 g_turrets_common_precash();
395 precache_model ("models/turrets/ewheel-base2.md3");
396 precache_model ("models/turrets/ewheel-gun1.md3");
398 self.think = turret_ewheel_dinit;
399 self.nextthink = time + 0.5;