1 void turret_ewheel_projectile_explode()
\r
5 org2 = findbetterlocation (self.origin, 8);
\r
6 pointparticles(particleeffectnum("laser_impact"), org2, trace_plane_normal * 1000, 1);
\r
11 d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
\r
12 self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
\r
13 self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
\r
15 RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
\r
17 sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
\r
23 void ewheel_attack()
\r
31 f = gettagindex(self.tur_head,"tag_fire");
\r
32 v = gettaginfo_relative(self.tur_head,f);
\r
34 self.tur_shotorg = v;
\r
35 turret_do_updates(self);
\r
37 sound (self, CHAN_WEAPON, "weapons/lasergun_fire.wav", VOL_BASE, ATTN_NORM);
\r
38 pointparticles(particleeffectnum("laser_muzzleflash"), self.tur_shotorg_updated, self.tur_shotdir_updated * 1000, 1);
\r
41 setorigin(proj, self.tur_shotorg_updated);
\r
42 //setsize(proj, '-0.5 -0.5 -0.5', '0.5 0.5 0.5');
\r
43 //setmodel(proj, "models/laser.mdl"); // precision set above
\r
44 proj.classname = "ewheel bolt";
\r
46 proj.bot_dodge = FALSE;
\r
47 proj.bot_dodgerating = self.shot_dmg;
\r
48 proj.think = turret_ewheel_projectile_explode;
\r
49 proj.nextthink = time + 9;
\r
50 proj.solid = SOLID_BBOX;
\r
51 proj.movetype = MOVETYPE_FLYMISSILE;
\r
52 proj.velocity = normalize(self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
\r
53 proj.angles = vectoangles(proj.velocity);
\r
54 proj.touch = turret_ewheel_projectile_explode;
\r
55 //proj.effects = EF_LOWPRECISION | EF_BRIGHTFIELD;
\r
56 proj.enemy = self.enemy;
\r
57 proj.flags = FL_PROJECTILE | FL_NOTARGET;
\r
59 CSQCProjectile(proj, TRUE, PROJECTILE_LASER, TRUE);
\r
61 self.tur_head.frame += 2;
\r
63 if (self.tur_head.frame > 3)
\r
64 self.tur_head.frame = 0;
\r
69 #define EWHEEL_MASS 50
\r
70 #define EWHEEL_MAXSPEED 800
\r
71 #define EWHEEL_ACCEL_SLOW 25
\r
72 #define EWHEEL_ACCEL_FAST 100
\r
73 #define EWHEEL_BREAK_SLOW 100
\r
74 #define EWHEEL_BREAK_FAST 250
\r
76 void ewheel_enemymove()
\r
78 vector wish_angle,real_angle,steer,avoid;
\r
79 float turn_limit,angle_ofs;
\r
81 //steer = steerlib_attract2(point,0.5,2000,0.95);
\r
82 steer = steerlib_pull(self.enemy.origin);
\r
83 avoid = steerlib_traceavoid(0.3,350);
\r
85 wish_angle = normalize(avoid * 0.5 + steer);
\r
86 wish_angle = vectoangles(wish_angle);
\r
87 real_angle = wish_angle - self.angles;
\r
89 if (real_angle_x > self.angles_x)
\r
91 if (real_angle_x >= 180)
\r
92 real_angle_x -= 360;
\r
96 if (real_angle_x <= -180)
\r
97 real_angle_x += 360;
\r
100 if (real_angle_y > self.tur_head.angles_y)
\r
102 if (real_angle_y >= 180)
\r
103 real_angle_y -= 360;
\r
107 if (real_angle_y <= -180)
\r
108 real_angle_y += 360;
\r
111 turn_limit = cvar("g_turrets_unit_ewheel_turnrate");
\r
112 // Convert from dgr / sec to dgr / tic
\r
113 turn_limit = turn_limit / (1 / self.ticrate);
\r
114 angle_ofs = fabs(real_angle_y);
\r
115 real_angle_y = bound(turn_limit * -1,real_angle_y,turn_limit);
\r
116 self.angles_y = (self.angles_y + real_angle_y);
\r
118 // Simulate banking
\r
119 self.angles_z = bound(-45,real_angle_y * -1,45);
\r
122 if (self.frame > 40)
\r
125 makevectors(self.angles);
\r
127 if (self.tur_dist_aimpos > self.target_range_optimal)
\r
129 if ( angle_ofs < 10 )
\r
132 movelib_move(v_forward * EWHEEL_ACCEL_FAST,EWHEEL_MAXSPEED,0,EWHEEL_MASS,0);
\r
134 else if (angle_ofs < 16)
\r
137 movelib_move(v_forward,EWHEEL_MAXSPEED,0,EWHEEL_MASS,EWHEEL_BREAK_SLOW);
\r
141 movelib_move('0 0 0',EWHEEL_MAXSPEED,0,EWHEEL_MASS,EWHEEL_BREAK_FAST);
\r
145 movelib_move('0 0 0',EWHEEL_MAXSPEED,0,EWHEEL_MASS,EWHEEL_BREAK_FAST);
\r
148 void ewheel_roammove()
\r
150 movelib_move(v_forward,EWHEEL_MAXSPEED,0,EWHEEL_MASS,EWHEEL_BREAK_SLOW);
\r
154 vector wish_angle,real_angle,steer,avoid;
\r
155 float turn_limit,angle_ofs;
\r
160 dist = vlen(self.origin - self.pos1);
\r
162 //steer = steerlib_attract2(point,0.5,2000,0.95);
\r
163 steer = steerlib_pull(self.pos1);
\r
164 avoid = steerlib_traceavoid(0.3,350);
\r
166 wish_angle = normalize(avoid * 0.5 + steer);
\r
167 wish_angle = vectoangles(wish_angle);
\r
168 real_angle = wish_angle - self.angles;
\r
170 real_angle_y = shortangle_f(real_angle_y,self.angles_y);
\r
172 turn_limit = cvar("g_turrets_unit_ewheel_turnrate");
\r
173 // Convert from dgr/sec to dgr/tic
\r
174 turn_limit = turn_limit / (1 / self.ticrate);
\r
175 angle_ofs = fabs(real_angle_y);
\r
177 real_angle_y = bound(turn_limit * -1,real_angle_y,turn_limit);
\r
178 self.angles_y = (self.angles_y + real_angle_y);
\r
180 self.angles_z = bound(-12,real_angle_y * -1,12);
\r
182 if(self.frame > 40)
\r
185 makevectors(self.angles);
\r
187 lspeed = vlen(self.velocity);
\r
189 if((dist < 64)||(self.phase < time))
\r
191 movelib_move('0 0 0',150,0,50,200);
\r
192 self.pos1 = self.origin + v_forward * 256 + randomvec() * 128;
\r
193 self.pos1_z = self.origin_z;
\r
194 self.phase = time + 5;
\r
196 else if(dist < 128)
\r
200 movelib_move(v_forward * 50,150,0,50,50);
\r
202 movelib_move(v_forward * 100,150,0,50,0);
\r
208 movelib_move(v_forward * 50,150,0,50,50);
\r
210 movelib_move(v_forward * 250,150,0,50,0);
\r
215 void ewheel_postthink()
\r
218 ewheel_enemymove();
\r
225 void ewheel_respawnhook()
\r
227 setorigin(self,self.pos1);
\r
229 //self.angles = self.wkr_spawn.angles;
\r
233 void ewheel_diehook()
\r
237 void turret_ewheel_dinit()
\r
241 if (self.netname == "") self.netname = "Ewheel Turret";
\r
243 // self.ticrate = 0.05;
\r
245 if (self.target != "")
\r
247 e = find(world,targetname,self.target);
\r
250 bprint("Warning! initital waypoint for ewheel does NOT exsist!\n");
\r
254 if (e.classname != "turret_checkpoint")
\r
255 dprint("Warning: not a turrret path\n");
\r
257 self.goalcurrent = e;
\r
260 self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
\r
261 self.turrcaps_flags = TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MOVE | TFL_TURRCAPS_ROAM | TFL_TURRCAPS_LINKED;
\r
262 self.aim_flags = TFL_AIM_SIMPLE;// TFL_AIM_LEAD | TFL_AIM_ZEASE;
\r
264 self.turret_respawnhook = ewheel_respawnhook;
\r
265 self.turret_diehook = ewheel_diehook;
\r
267 self.ticrate = 0.05;
\r
268 if (turret_stdproc_init("ewheel_std") == 0)
\r
274 self.target_select_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
\r
275 self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
\r
276 self.damage_flags |= RFL_DMG_DEATH_NOGIBS;
\r
278 //self.flags = FL_CLIENT;
\r
279 self.iscreature = TRUE;
\r
280 self.movetype = MOVETYPE_WALK;
\r
281 self.gravity = 0.01;
\r
282 self.solid = SOLID_SLIDEBOX;
\r
283 self.takedamage = DAMAGE_AIM;
\r
285 setmodel(self,"models/turrets/ewheel-base.md3");
\r
286 setmodel(self.tur_head,"models/turrets/ewheel-gun1.md3");
\r
288 setattachment(self.tur_head,self,"tag_head");
\r
290 self.pos1 = self.origin;
\r
294 f = gettagindex(self.tur_head,"tag_fire");
\r
295 v = gettaginfo_relative(self.tur_head,f);
\r
298 //setsize(self,WALKER_MIN,WALKER_MAX);
\r
299 //setsize(self,'-70 -70 0','70 70 55');
\r
301 self.tur_shotorg = v;
\r
302 self.tur_aimorg = v;
\r
304 self.tur_aimorg_x = 0;
\r
305 self.tur_aimorg_y = 0;
\r
306 self.tur_aimorg_z = 25;
\r
308 self.idle_aim = '0 0 0';
\r
310 // Our fire routine
\r
311 self.turret_firefunc = ewheel_attack;
\r
312 self.turret_postthink = ewheel_postthink;
\r
313 self.tur_head.frame = 1;
\r
317 void spawnfunc_turret_ewheel()
\r
319 precache_model ("models/turrets/ewheel-base.md3");
\r
320 precache_model ("models/turrets/ewheel-gun1.md3");
\r
322 self.think = turret_ewheel_dinit;
\r
323 self.nextthink = time + 0.5;
\r