4 /* function */ t_ewheel,
5 /* spawnflags */ TUR_FLAG_PLAYER | TUR_FLAG_MOVE | TUR_FLAG_ROAM,
6 /* mins,maxs */ '-32 -32 0', '32 32 48',
7 /* model */ "ewheel-base2.md3",
8 /* head_model */ "ewheel-gun1.md3",
9 /* netname */ "ewheel",
10 /* fullname */ _("eWheel Turret")
14 float autocvar_g_turrets_unit_ewheel_speed_fast;
15 float autocvar_g_turrets_unit_ewheel_speed_slow;
16 float autocvar_g_turrets_unit_ewheel_speed_slower;
17 float autocvar_g_turrets_unit_ewheel_speed_stop;
18 float autocvar_g_turrets_unit_ewheel_turnrate;
20 const float ewheel_anim_stop = 0;
21 const float ewheel_anim_fwd_slow = 1;
22 const float ewheel_anim_fwd_fast = 2;
23 const float ewheel_anim_bck_slow = 3;
24 const float ewheel_anim_bck_fast = 4;
26 //#define EWHEEL_FANCYPATH
27 void ewheel_move_path()
29 #ifdef EWHEEL_FANCYPATH
30 // Are we close enougth to a path node to switch to the next?
31 if (vlen(self.origin - self.pathcurrent.origin) < 64)
32 if (self.pathcurrent.path_next == world)
34 // Path endpoint reached
35 pathlib_deletepath(self.pathcurrent.owner);
36 self.pathcurrent = world;
40 if (self.pathgoal.use)
43 if (self.pathgoal.enemy)
45 self.pathcurrent = pathlib_astar(self.pathgoal.origin,self.pathgoal.enemy.origin);
46 self.pathgoal = self.pathgoal.enemy;
50 self.pathgoal = world;
53 self.pathcurrent = self.pathcurrent.path_next;
56 if (vlen(self.origin - self.pathcurrent.origin) < 64)
57 self.pathcurrent = self.pathcurrent.enemy;
63 self.moveto = self.pathcurrent.origin;
64 self.steerto = steerlib_attract2(self.moveto, 0.5, 500, 0.95);
66 movelib_move_simple(v_forward, (autocvar_g_turrets_unit_ewheel_speed_fast), 0.4);
70 void ewheel_move_enemy()
74 self.steerto = steerlib_arrive(self.enemy.origin,self.target_range_optimal);
76 self.moveto = self.origin + self.steerto * 128;
78 if (self.tur_dist_enemy > self.target_range_optimal)
80 if ( self.tur_head.spawnshieldtime < 1 )
82 newframe = ewheel_anim_fwd_fast;
83 movelib_move_simple(v_forward, (autocvar_g_turrets_unit_ewheel_speed_fast), 0.4);
85 else if (self.tur_head.spawnshieldtime < 2)
88 newframe = ewheel_anim_fwd_slow;
89 movelib_move_simple(v_forward, (autocvar_g_turrets_unit_ewheel_speed_slow), 0.4);
93 newframe = ewheel_anim_fwd_slow;
94 movelib_move_simple(v_forward, (autocvar_g_turrets_unit_ewheel_speed_slower), 0.4);
97 else if (self.tur_dist_enemy < self.target_range_optimal * 0.5)
99 newframe = ewheel_anim_bck_slow;
100 movelib_move_simple(v_forward * -1, (autocvar_g_turrets_unit_ewheel_speed_slow), 0.4);
104 newframe = ewheel_anim_stop;
105 movelib_beak_simple((autocvar_g_turrets_unit_ewheel_speed_stop));
108 turrets_setframe(newframe, FALSE);
111 void ewheel_move_idle()
115 self.SendFlags |= TNSF_ANIM;
116 self.anim_start_time = time;
120 if (vlen(self.velocity))
121 movelib_beak_simple((autocvar_g_turrets_unit_ewheel_speed_stop));
124 void spawnfunc_turret_ewheel() { if(!turret_initialize(TUR_EWHEEL)) remove(self); }
126 float t_ewheel(float req)
135 for (i = 0; i < 1; ++i)
137 turret_do_updates(self);
139 _mis = turret_projectile("weapons/lasergun_fire.wav", 1, 0, DEATH_TURRET_EWHEEL, PROJECTILE_LASER, TRUE, TRUE);
140 _mis.missile_flags = MIF_SPLASH;
142 pointparticles(particleeffectnum("laser_muzzleflash"), self.tur_shotorg, self.tur_shotdir_updated * 1000, 1);
144 self.tur_head.frame += 2;
146 if (self.tur_head.frame > 3)
147 self.tur_head.frame = 0;
155 vector wish_angle, real_angle;
157 vz = self.velocity_z;
159 self.angles_x = anglemods(self.angles_x);
160 self.angles_y = anglemods(self.angles_y);
162 fixedmakevectors(self.angles);
164 wish_angle = normalize(self.steerto);
165 wish_angle = vectoangles(wish_angle);
166 real_angle = wish_angle - self.angles;
167 real_angle = shortangle_vxy(real_angle, self.tur_head.angles);
169 self.tur_head.spawnshieldtime = fabs(real_angle_y);
170 real_angle_y = bound(-self.tur_head.aim_speed, real_angle_y, self.tur_head.aim_speed);
171 self.angles_y = (self.angles_y + real_angle_y);
175 else if(self.pathcurrent)
180 self.velocity_z = vz;
182 if(vlen(self.velocity))
183 self.SendFlags |= TNSF_MOVE;
189 self.velocity = '0 0 0';
191 #ifdef EWHEEL_FANCYPATH
192 if (self.pathcurrent)
193 pathlib_deletepath(self.pathcurrent.owner);
195 self.pathcurrent = world;
203 if(self.movetype == MOVETYPE_WALK)
205 self.velocity = '0 0 0';
208 setorigin(self, self.pos1);
210 if (self.target != "")
212 e = find(world, targetname, self.target);
215 dprint("Initital waypoint for ewheel does NOT exsist, fix your map!\n");
219 if (e.classname != "turret_checkpoint")
220 dprint("Warning: not a turrret path\n");
224 #ifdef EWHEEL_FANCYPATH
225 self.pathcurrent = WALKER_PATH(self.origin,e.origin);
228 self.pathcurrent = e;
234 self.iscreature = TRUE;
235 self.teleportable = TELEPORT_NORMAL;
236 self.damagedbycontents = TRUE;
237 self.movetype = MOVETYPE_WALK;
238 self.solid = SOLID_SLIDEBOX;
239 self.takedamage = DAMAGE_AIM;
240 self.idle_aim = '0 0 0';
241 self.pos1 = self.origin;
242 self.target_select_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMITS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
243 self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMITS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
244 self.frame = self.tur_head.frame = 1;
245 self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIEVE;
247 // Convert from dgr / sec to dgr / tic
248 self.tur_head.aim_speed = (autocvar_g_turrets_unit_ewheel_turnrate);
249 self.tur_head.aim_speed = self.tur_head.aim_speed / (1 / self.ticrate);
255 precache_model ("models/turrets/ewheel-base2.md3");
256 precache_model ("models/turrets/ewheel-gun1.md3");
271 dt = time - self.move_time;
272 self.move_time = time;
276 fixedmakevectors(self.angles);
277 setorigin(self, self.origin + self.velocity * dt);
278 self.tur_head.angles += dt * self.tur_head.move_avelocity;
279 self.angles_y = self.move_angles_y;
281 if (self.health < 127)
283 te_spark(self.origin + '0 0 40', randomvec() * 256 + '0 0 256', 16);
286 float t_ewheel(float req)
293 self.movetype = MOVETYPE_BOUNCE;
294 self.move_movetype = MOVETYPE_BOUNCE;
295 self.move_origin = self.origin;
296 self.move_time = time;
297 self.draw = ewheel_draw;
303 precache_model ("models/turrets/ewheel-base2.md3");
304 precache_model ("models/turrets/ewheel-gun1.md3");
313 #endif // REGISTER_TURRET