]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/tturrets/units/unit_ewheel.qc
make turrets work again
[divverent/nexuiz.git] / data / qcsrc / server / tturrets / units / unit_ewheel.qc
1 void turret_ewheel_projectile_explode()\r
2 {\r
3     vector org2;\r
4 \r
5     org2 = findbetterlocation (self.origin, 8);\r
6     pointparticles(particleeffectnum("laser_impact"), org2, trace_plane_normal * 1000, 1);\r
7 \r
8 #ifdef TURRET_DEBUG\r
9     float d;\r
10 \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
14 #else\r
15     RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);\r
16 #endif\r
17     sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);\r
18 \r
19     remove (self);\r
20 }\r
21 \r
22 \r
23 void ewheel_attack()\r
24 {\r
25     entity proj;\r
26     vector v;\r
27     float f,i;\r
28 \r
29     for (i=0;i<1;++i)\r
30     {\r
31         f = gettagindex(self.tur_head,"tag_fire");\r
32         v = gettaginfo_relative(self.tur_head,f);\r
33         v_y = v_y * -1;\r
34         self.tur_shotorg = v;\r
35         turret_do_updates(self);\r
36 \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
39 \r
40         proj                    = spawn ();\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
45         proj.owner           = self;\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
58 \r
59         CSQCProjectile(proj, TRUE, PROJECTILE_LASER, TRUE);\r
60 \r
61         self.tur_head.frame += 2;\r
62 \r
63         if (self.tur_head.frame > 3)\r
64             self.tur_head.frame = 0;\r
65     }\r
66 \r
67 }\r
68 \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
75 \r
76 void ewheel_enemymove()\r
77 {\r
78     vector wish_angle,real_angle,steer,avoid;\r
79     float turn_limit,angle_ofs;\r
80 \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
84 \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
88 \r
89     if (real_angle_x > self.angles_x)\r
90     {\r
91         if (real_angle_x >= 180)\r
92             real_angle_x -= 360;\r
93     }\r
94     else\r
95     {\r
96         if (real_angle_x <= -180)\r
97             real_angle_x += 360;\r
98     }\r
99 \r
100     if (real_angle_y > self.tur_head.angles_y)\r
101     {\r
102         if (real_angle_y >= 180)\r
103             real_angle_y -= 360;\r
104     }\r
105     else\r
106     {\r
107         if (real_angle_y <= -180)\r
108             real_angle_y += 360;\r
109     }\r
110 \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
117 \r
118     // Simulate banking\r
119     self.angles_z = bound(-45,real_angle_y * -1,45);\r
120 \r
121 \r
122     if (self.frame > 40)\r
123         self.frame = 1;\r
124 \r
125     makevectors(self.angles);\r
126 \r
127     if (self.tur_dist_aimpos > self.target_range_optimal)\r
128     {\r
129         if ( angle_ofs < 10 )\r
130         {\r
131             self.frame += 2;\r
132             movelib_move(v_forward * EWHEEL_ACCEL_FAST,EWHEEL_MAXSPEED,0,EWHEEL_MASS,0);\r
133         }\r
134         else if (angle_ofs < 16)\r
135         {\r
136             self.frame += 0.5;\r
137             movelib_move(v_forward,EWHEEL_MAXSPEED,0,EWHEEL_MASS,EWHEEL_BREAK_SLOW);\r
138         }\r
139         else\r
140         {\r
141             movelib_move('0 0 0',EWHEEL_MAXSPEED,0,EWHEEL_MASS,EWHEEL_BREAK_FAST);\r
142         }\r
143     }\r
144     else\r
145         movelib_move('0 0 0',EWHEEL_MAXSPEED,0,EWHEEL_MASS,EWHEEL_BREAK_FAST);\r
146 }\r
147 \r
148 void ewheel_roammove()\r
149 {\r
150     movelib_move(v_forward,EWHEEL_MAXSPEED,0,EWHEEL_MASS,EWHEEL_BREAK_SLOW);\r
151     self.angles_z = 0;\r
152 \r
153     /*\r
154     vector wish_angle,real_angle,steer,avoid;\r
155     float turn_limit,angle_ofs;\r
156     float dist;\r
157 \r
158     return;\r
159 \r
160     dist = vlen(self.origin - self.pos1);\r
161 \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
165 \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
169 \r
170     real_angle_y = shortangle_f(real_angle_y,self.angles_y);\r
171 \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
176 \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
179 \r
180     self.angles_z = bound(-12,real_angle_y * -1,12);\r
181 \r
182     if(self.frame > 40)\r
183         self.frame = 1;\r
184 \r
185     makevectors(self.angles);\r
186     float lspeed;\r
187     lspeed = vlen(self.velocity);\r
188 \r
189     if((dist < 64)||(self.phase < time))\r
190     {\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
195     }\r
196     else if(dist < 128)\r
197     {\r
198         self.frame += 1;\r
199         if(lspeed > 100)\r
200             movelib_move(v_forward * 50,150,0,50,50);\r
201         else\r
202             movelib_move(v_forward * 100,150,0,50,0);\r
203     }\r
204     else\r
205     {\r
206         self.frame += 1;\r
207         if(angle_ofs > 10)\r
208             movelib_move(v_forward * 50,150,0,50,50);\r
209         else\r
210             movelib_move(v_forward * 250,150,0,50,0);\r
211     }\r
212     */\r
213 }\r
214 \r
215 void ewheel_postthink()\r
216 {\r
217     if (self.enemy)\r
218         ewheel_enemymove();\r
219     else\r
220         ewheel_roammove();\r
221 \r
222 }\r
223 \r
224 \r
225 void ewheel_respawnhook()\r
226 {\r
227     setorigin(self,self.pos1);\r
228 \r
229     //self.angles = self.wkr_spawn.angles;\r
230 \r
231 }\r
232 \r
233 void ewheel_diehook()\r
234 {\r
235 }\r
236 \r
237 void turret_ewheel_dinit()\r
238 {\r
239     entity e;\r
240 \r
241     if (self.netname == "")      self.netname     = "Ewheel Turret";\r
242 \r
243     // self.ticrate = 0.05;\r
244 \r
245     if (self.target != "")\r
246     {\r
247         e = find(world,targetname,self.target);\r
248         if (!e)\r
249         {\r
250             bprint("Warning! initital waypoint for ewheel does NOT exsist!\n");\r
251             self.target = "";\r
252         }\r
253 \r
254         if (e.classname != "turret_checkpoint")\r
255             dprint("Warning: not a turrret path\n");\r
256         else\r
257             self.goalcurrent = e;\r
258     }\r
259 \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
263 \r
264     self.turret_respawnhook = ewheel_respawnhook;\r
265     self.turret_diehook = ewheel_diehook;\r
266 \r
267     self.ticrate = 0.05;\r
268     if (turret_stdproc_init("ewheel_std") == 0)\r
269     {\r
270         remove(self);\r
271         return;\r
272     }\r
273 \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
277 \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
284 \r
285     setmodel(self,"models/turrets/ewheel-base.md3");\r
286     setmodel(self.tur_head,"models/turrets/ewheel-gun1.md3");\r
287 \r
288     setattachment(self.tur_head,self,"tag_head");\r
289 \r
290     self.pos1 = self.origin;\r
291 \r
292     vector v;\r
293     float f;\r
294     f = gettagindex(self.tur_head,"tag_fire");\r
295     v = gettaginfo_relative(self.tur_head,f);\r
296     v_y = v_y * -1;\r
297 \r
298     //setsize(self,WALKER_MIN,WALKER_MAX);\r
299     //setsize(self,'-70 -70 0','70 70 55');\r
300 \r
301     self.tur_shotorg = v;\r
302     self.tur_aimorg  = v;\r
303 \r
304     self.tur_aimorg_x = 0;\r
305     self.tur_aimorg_y = 0;\r
306     self.tur_aimorg_z = 25;\r
307 \r
308     self.idle_aim = '0 0 0';\r
309 \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
314 }\r
315 \r
316 \r
317 void spawnfunc_turret_ewheel()\r
318 {\r
319     precache_model ("models/turrets/ewheel-base.md3");\r
320     precache_model ("models/turrets/ewheel-gun1.md3");\r
321 \r
322     self.think = turret_ewheel_dinit;\r
323     self.nextthink = time + 0.5;\r
324 }\r