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
30 turret_do_updates(self);
\r
32 sound (self, CHAN_WEAPON, "weapons/lasergun_fire.wav", VOL_BASE, ATTN_NORM);
\r
33 pointparticles(particleeffectnum("laser_muzzleflash"), self.tur_shotorg, self.tur_shotdir_updated * 1000, 1);
\r
36 setorigin(proj, self.tur_shotorg);
\r
37 //setsize(proj, '-0.5 -0.5 -0.5', '0.5 0.5 0.5');
\r
38 //setmodel(proj, "models/laser.mdl"); // precision set above
\r
39 proj.classname = "ewheel bolt";
\r
41 proj.bot_dodge = FALSE;
\r
42 proj.bot_dodgerating = self.shot_dmg;
\r
43 proj.think = turret_ewheel_projectile_explode;
\r
44 proj.nextthink = time + 9;
\r
45 proj.solid = SOLID_BBOX;
\r
46 proj.movetype = MOVETYPE_FLYMISSILE;
\r
47 proj.velocity = normalize(self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;
\r
48 proj.angles = vectoangles(proj.velocity);
\r
49 proj.touch = turret_ewheel_projectile_explode;
\r
50 //proj.effects = EF_LOWPRECISION | EF_BRIGHTFIELD;
\r
51 proj.enemy = self.enemy;
\r
52 proj.flags = FL_PROJECTILE | FL_NOTARGET;
\r
54 CSQCProjectile(proj, TRUE, PROJECTILE_LASER, TRUE);
\r
56 self.tur_head.frame += 2;
\r
58 if (self.tur_head.frame > 3)
\r
59 self.tur_head.frame = 0;
\r
64 #define EWHEEL_MASS 25
\r
65 #define EWHEEL_MAXSPEED 800
\r
66 #define EWHEEL_ACCEL_SLOW 100
\r
67 #define EWHEEL_ACCEL_FAST 350
\r
68 #define EWHEEL_BREAK_SLOW 150
\r
69 #define EWHEEL_BREAK_FAST 250
\r
70 #define EWHEEL_DRAG 0.25
\r
72 void ewheel_enemymove()
\r
74 vector wish_angle,real_angle,steer,avoid;
\r
75 float turn_limit,angle_ofs;
\r
77 //steer = steerlib_attract2(point,0.5,2000,0.95);
\r
78 steer = steerlib_pull(self.enemy.origin);
\r
79 avoid = steerlib_traceavoid(0.3,350);
\r
81 wish_angle = normalize(avoid * 0.5 + steer);
\r
82 wish_angle = vectoangles(wish_angle);
\r
83 real_angle = wish_angle - self.angles;
\r
85 if (real_angle_x > self.angles_x)
\r
87 if (real_angle_x >= 180)
\r
88 real_angle_x -= 360;
\r
92 if (real_angle_x <= -180)
\r
93 real_angle_x += 360;
\r
96 if (real_angle_y > self.tur_head.angles_y)
\r
98 if (real_angle_y >= 180)
\r
99 real_angle_y -= 360;
\r
103 if (real_angle_y <= -180)
\r
104 real_angle_y += 360;
\r
107 turn_limit = cvar("g_turrets_unit_ewheel_turnrate");
\r
108 // Convert from dgr / sec to dgr / tic
\r
109 turn_limit = turn_limit / (1 / self.ticrate);
\r
110 angle_ofs = fabs(real_angle_y);
\r
111 real_angle_y = bound(turn_limit * -1,real_angle_y,turn_limit);
\r
112 self.angles_y = (self.angles_y + real_angle_y);
\r
114 // Simulate banking
\r
115 self.angles_z = bound(-45,real_angle_y * -2,45);
\r
117 if (self.frame > 40)
\r
120 makevectors(self.angles);
\r
121 if (self.tur_dist_aimpos > self.target_range_optimal)
\r
123 if ( angle_ofs < 1 )
\r
126 movelib_move(v_forward * EWHEEL_ACCEL_FAST,EWHEEL_MAXSPEED,EWHEEL_DRAG,EWHEEL_MASS,0);
\r
128 else if (angle_ofs < 2)
\r
131 movelib_move(v_forward * EWHEEL_ACCEL_SLOW,EWHEEL_MAXSPEED,EWHEEL_DRAG,EWHEEL_MASS,EWHEEL_BREAK_SLOW);
\r
135 movelib_move('0 0 0',EWHEEL_MAXSPEED,EWHEEL_DRAG,EWHEEL_MASS,EWHEEL_BREAK_FAST);
\r
139 movelib_move('0 0 0',EWHEEL_MAXSPEED,EWHEEL_DRAG,EWHEEL_MASS,EWHEEL_BREAK_FAST);
\r
142 void ewheel_roammove()
\r
144 movelib_move(v_forward,EWHEEL_MAXSPEED,0,EWHEEL_MASS,EWHEEL_BREAK_SLOW);
\r
148 vector wish_angle,real_angle,steer,avoid;
\r
149 float turn_limit,angle_ofs;
\r
154 dist = vlen(self.origin - self.pos1);
\r
156 //steer = steerlib_attract2(point,0.5,2000,0.95);
\r
157 steer = steerlib_pull(self.pos1);
\r
158 avoid = steerlib_traceavoid(0.3,350);
\r
160 wish_angle = normalize(avoid * 0.5 + steer);
\r
161 wish_angle = vectoangles(wish_angle);
\r
162 real_angle = wish_angle - self.angles;
\r
164 real_angle_y = shortangle_f(real_angle_y,self.angles_y);
\r
166 turn_limit = cvar("g_turrets_unit_ewheel_turnrate");
\r
167 // Convert from dgr/sec to dgr/tic
\r
168 turn_limit = turn_limit / (1 / self.ticrate);
\r
169 angle_ofs = fabs(real_angle_y);
\r
171 real_angle_y = bound(turn_limit * -1,real_angle_y,turn_limit);
\r
172 self.angles_y = (self.angles_y + real_angle_y);
\r
174 self.angles_z = bound(-12,real_angle_y * -1,12);
\r
176 if(self.frame > 40)
\r
179 makevectors(self.angles);
\r
181 lspeed = vlen(self.velocity);
\r
183 if((dist < 64)||(self.phase < time))
\r
185 movelib_move('0 0 0',150,0,50,200);
\r
186 self.pos1 = self.origin + v_forward * 256 + randomvec() * 128;
\r
187 self.pos1_z = self.origin_z;
\r
188 self.phase = time + 5;
\r
190 else if(dist < 128)
\r
194 movelib_move(v_forward * 50,150,0,50,50);
\r
196 movelib_move(v_forward * 100,150,0,50,0);
\r
202 movelib_move(v_forward * 50,150,0,50,50);
\r
204 movelib_move(v_forward * 250,150,0,50,0);
\r
209 void ewheel_postthink()
\r
212 ewheel_enemymove();
\r
219 void ewheel_respawnhook()
\r
221 setorigin(self,self.pos1);
\r
224 void ewheel_diehook()
\r
228 float ewheel_firecheck()
\r
230 bprint("Firecheck\n");
\r
234 void turret_ewheel_dinit()
\r
238 if (self.netname == "") self.netname = "Ewheel Turret";
\r
240 // self.ticrate = 0.05;
\r
242 if (self.target != "")
\r
244 e = find(world,targetname,self.target);
\r
247 bprint("Warning! initital waypoint for ewheel does NOT exsist!\n");
\r
251 if (e.classname != "turret_checkpoint")
\r
252 dprint("Warning: not a turrret path\n");
\r
254 self.goalcurrent = e;
\r
257 self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
\r
258 self.turrcaps_flags = TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MOVE | TFL_TURRCAPS_ROAM | TFL_TURRCAPS_HEADATTACHED;
\r
259 //self.aim_flags = TFL_AIM_SIMPLE;// TFL_AIM_LEAD | TFL_AIM_ZEASE;
\r
261 self.turret_respawnhook = ewheel_respawnhook;
\r
262 self.turret_diehook = ewheel_diehook;
\r
264 self.ticrate = 0.05;
\r
265 if (turret_stdproc_init("ewheel_std") == 0)
\r
270 //self.turret_firecheckfunc = ewheel_firecheck;
\r
272 self.target_select_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
\r
273 self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
\r
274 self.damage_flags |= TFL_DMG_DEATH_NOGIBS;
\r
276 //self.flags = FL_CLIENT;
\r
277 self.iscreature = TRUE;
\r
278 self.movetype = MOVETYPE_WALK;
\r
279 self.gravity = 0.01;
\r
280 self.solid = SOLID_SLIDEBOX;
\r
281 self.takedamage = DAMAGE_AIM;
\r
283 setmodel(self,"models/turrets/ewheel-base.md3");
\r
284 setmodel(self.tur_head,"models/turrets/ewheel-gun1.md3");
\r
286 setattachment(self.tur_head,self,"tag_head");
\r
288 self.pos1 = self.origin;
\r
290 self.idle_aim = '0 0 0';
\r
292 // Our fire routine
\r
293 self.turret_firefunc = ewheel_attack;
\r
294 self.turret_postthink = ewheel_postthink;
\r
295 self.tur_head.frame = 1;
\r
299 void spawnfunc_turret_ewheel()
\r
301 precache_model ("models/turrets/ewheel-base.md3");
\r
302 precache_model ("models/turrets/ewheel-gun1.md3");
\r
304 self.think = turret_ewheel_dinit;
\r
305 self.nextthink = time + 0.5;
\r