]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/tturrets/units/unit_ewheel.qc
properly use the base volume for turrets
[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(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        = (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         self.tur_head.frame += 2;\r
60 \r
61         if (self.tur_head.frame > 3)\r
62             self.tur_head.frame = 0;\r
63     }\r
64 \r
65 }\r
66 \r
67 #define EWHEEL_MASS 50\r
68 #define EWHEEL_MAXSPEED 1500\r
69 #define EWHEEL_ACCEL_SLOW 50\r
70 #define EWHEEL_ACCEL_FAST 150\r
71 #define EWHEEL_BREAK_SLOW 100\r
72 #define EWHEEL_BREAK_FAST 250\r
73 \r
74 void ewheel_enemymove()\r
75 {\r
76     vector wish_angle,real_angle,steer,avoid;\r
77     float turn_limit,angle_ofs;\r
78 \r
79     //steer = steerlib_attract2(point,0.5,2000,0.95);\r
80     steer = steerlib_pull(self.enemy.origin);\r
81     avoid = steerlib_traceavoid(0.3,350);\r
82 \r
83     wish_angle = normalize(avoid * 0.5 + steer);\r
84     wish_angle = vectoangles(wish_angle);\r
85     real_angle = wish_angle - self.angles;\r
86 \r
87     if (real_angle_x > self.angles_x)\r
88     {\r
89         if (real_angle_x >= 180)\r
90             real_angle_x -= 360;\r
91     }\r
92     else\r
93     {\r
94         if (real_angle_x <= -180)\r
95             real_angle_x += 360;\r
96     }\r
97 \r
98     if (real_angle_y > self.tur_head.angles_y)\r
99     {\r
100         if (real_angle_y >= 180)\r
101             real_angle_y -= 360;\r
102     }\r
103     else\r
104     {\r
105         if (real_angle_y <= -180)\r
106             real_angle_y += 360;\r
107     }\r
108 \r
109     turn_limit = cvar("g_turrets_unit_ewheel_turnrate");\r
110     // Convert from dgr / sec to dgr / tic\r
111     turn_limit    = turn_limit / (1 / self.ticrate);\r
112     angle_ofs     = fabs(real_angle_y);\r
113     real_angle_y  = bound(turn_limit * -1,real_angle_y,turn_limit);\r
114     self.angles_y = (self.angles_y + real_angle_y);\r
115 \r
116     // Simulate banking\r
117     self.angles_z = bound(-45,real_angle_y * -1,45);\r
118 \r
119 \r
120     if (self.frame > 40)\r
121         self.frame = 1;\r
122 \r
123     makevectors(self.angles);\r
124 \r
125     if (self.tur_dist_enemy > self.target_range_optimal)\r
126     {\r
127         if ( angle_ofs < 10 )\r
128         {\r
129             self.frame += 2;\r
130             movelib_move(v_forward * EWHEEL_ACCEL_FAST,EWHEEL_MAXSPEED,0,EWHEEL_MASS,0);\r
131         }\r
132         else if (angle_ofs < 16)\r
133         {\r
134             self.frame += 0.5;\r
135             movelib_move(v_forward,EWHEEL_MAXSPEED,0,EWHEEL_MASS,EWHEEL_BREAK_SLOW);\r
136         }\r
137         else\r
138         {\r
139             movelib_move('0 0 0',EWHEEL_MAXSPEED,0,EWHEEL_MASS,EWHEEL_BREAK_FAST);\r
140         }\r
141     }\r
142     else\r
143         movelib_move('0 0 0',EWHEEL_MAXSPEED,0,EWHEEL_MASS,EWHEEL_BREAK_FAST);\r
144 }\r
145 \r
146 void ewheel_roammove()\r
147 {\r
148     movelib_move(v_forward,EWHEEL_MAXSPEED,0,EWHEEL_MASS,EWHEEL_BREAK_SLOW);\r
149     self.angles_z = 0;\r
150 \r
151     /*\r
152     vector wish_angle,real_angle,steer,avoid;\r
153     float turn_limit,angle_ofs;\r
154     float dist;\r
155 \r
156     return;\r
157 \r
158     dist = vlen(self.origin - self.pos1);\r
159 \r
160     //steer = steerlib_attract2(point,0.5,2000,0.95);\r
161     steer = steerlib_pull(self.pos1);\r
162     avoid = steerlib_traceavoid(0.3,350);\r
163 \r
164     wish_angle = normalize(avoid * 0.5 + steer);\r
165     wish_angle = vectoangles(wish_angle);\r
166     real_angle = wish_angle - self.angles;\r
167 \r
168     real_angle_y = shortangle_f(real_angle_y,self.angles_y);\r
169 \r
170     turn_limit = cvar("g_turrets_unit_ewheel_turnrate");\r
171     // Convert from dgr/sec to dgr/tic\r
172     turn_limit  = turn_limit / (1 / self.ticrate);\r
173     angle_ofs = fabs(real_angle_y);\r
174 \r
175     real_angle_y = bound(turn_limit * -1,real_angle_y,turn_limit);\r
176     self.angles_y = (self.angles_y + real_angle_y);\r
177 \r
178     self.angles_z = bound(-12,real_angle_y * -1,12);\r
179 \r
180     if(self.frame > 40)\r
181         self.frame = 1;\r
182 \r
183     makevectors(self.angles);\r
184     float lspeed;\r
185     lspeed = vlen(self.velocity);\r
186 \r
187     if((dist < 64)||(self.phase < time))\r
188     {\r
189         movelib_move('0 0 0',150,0,50,200);\r
190         self.pos1 = self.origin + v_forward * 256 + randomvec() * 128;\r
191         self.pos1_z = self.origin_z;\r
192         self.phase = time + 5;\r
193     }\r
194     else if(dist < 128)\r
195     {\r
196         self.frame += 1;\r
197         if(lspeed > 100)\r
198             movelib_move(v_forward * 50,150,0,50,50);\r
199         else\r
200             movelib_move(v_forward * 100,150,0,50,0);\r
201     }\r
202     else\r
203     {\r
204         self.frame += 1;\r
205         if(angle_ofs > 10)\r
206             movelib_move(v_forward * 50,150,0,50,50);\r
207         else\r
208             movelib_move(v_forward * 250,150,0,50,0);\r
209     }\r
210     */\r
211 }\r
212 \r
213 void ewheel_postthink()\r
214 {\r
215     if (self.enemy)\r
216         ewheel_enemymove();\r
217     else\r
218         ewheel_roammove();\r
219 \r
220 }\r
221 \r
222 \r
223 void ewheel_respawnhook()\r
224 {\r
225     setorigin(self,self.pos1);\r
226 \r
227     //self.angles = self.wkr_spawn.angles;\r
228 \r
229 }\r
230 \r
231 void ewheel_diehook()\r
232 {\r
233 }\r
234 \r
235 void turret_ewheel_dinit()\r
236 {\r
237     entity e;\r
238 \r
239     if (self.netname == "")      self.netname     = "Ewheel Turret";\r
240 \r
241     // self.ticrate = 0.05;\r
242 \r
243     if (self.target != "")\r
244     {\r
245         e = find(world,targetname,self.target);\r
246         if (!e)\r
247         {\r
248             bprint("Warning! initital waypoint for ewheel does NOT exsist!\n");\r
249             self.target = "";\r
250         }\r
251 \r
252         if (e.classname != "turret_checkpoint")\r
253             dprint("Warning: not a turrret path\n");\r
254         else\r
255             self.goalcurrent = e;\r
256     }\r
257 \r
258     self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;\r
259     self.turrcaps_flags = TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MOVE | TFL_TURRCAPS_ROAM | TFL_TURRCAPS_LINKED;\r
260     self.aim_flags = TFL_AIM_SIMPLE;// TFL_AIM_LEAD | TFL_AIM_ZEASE;\r
261 \r
262     self.turret_respawnhook = ewheel_respawnhook;\r
263     self.turret_diehook = ewheel_diehook;\r
264 \r
265     self.ticrate = 0.05;\r
266     if (turret_stdproc_init("ewheel_std") == 0)\r
267     {\r
268         remove(self);\r
269         return;\r
270     }\r
271 \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 |= RFL_DMG_DEATH_NOGIBS;\r
275 \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
282 \r
283     setmodel(self,"models/turrets/ewheel-base.md3");\r
284     setmodel(self.tur_head,"models/turrets/ewheel-gun1.md3");\r
285 \r
286     setattachment(self.tur_head,self,"tag_head");\r
287 \r
288     self.pos1 = self.origin;\r
289 \r
290     vector v;\r
291     float f;\r
292     f = gettagindex(self.tur_head,"tag_fire");\r
293     v = gettaginfo(self.tur_head,f);\r
294     v_y = v_y * -1;\r
295 \r
296     //setsize(self,WALKER_MIN,WALKER_MAX);\r
297     //setsize(self,'-70 -70 0','70 70 55');\r
298 \r
299     self.tur_shotorg = v;\r
300     self.tur_aimorg  = v;\r
301 \r
302     self.tur_aimorg_x = 0;\r
303     self.tur_aimorg_y = 0;\r
304     self.tur_aimorg_z = 25;\r
305 \r
306     self.idle_aim = '0 0 0';\r
307 \r
308     // Our fire routine\r
309     self.turret_firefunc  = ewheel_attack;\r
310     self.turret_postthink = ewheel_postthink;\r
311     self.tur_head.frame = 1;\r
312 }\r
313 \r
314 \r
315 void spawnfunc_turret_ewheel()\r
316 {\r
317     precache_model ("models/turrets/ewheel-base.md3");\r
318     precache_model ("models/turrets/ewheel-gun1.md3");\r
319 \r
320     self.think = turret_ewheel_dinit;\r
321     self.nextthink = time + 0.5;\r
322 }\r