]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/tturrets/units/unit_ewheel.qc
3cdce87afa3380af9012513224e888077d152e8e
[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     float i;\r
27 \r
28     for (i=0;i<1;++i)\r
29     {\r
30         turret_do_updates(self);\r
31 \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
34 \r
35         proj                    = spawn ();\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
40         proj.owner           = self;\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
53 \r
54         CSQCProjectile(proj, TRUE, PROJECTILE_LASER, TRUE);\r
55 \r
56         self.tur_head.frame += 2;\r
57 \r
58         if (self.tur_head.frame > 3)\r
59             self.tur_head.frame = 0;\r
60     }\r
61 \r
62 }\r
63 \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
71 \r
72 void ewheel_enemymove()\r
73 {\r
74     vector wish_angle,real_angle,steer,avoid;\r
75     float turn_limit,angle_ofs;\r
76 \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
80 \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
84 \r
85     if (real_angle_x > self.angles_x)\r
86     {\r
87         if (real_angle_x >= 180)\r
88             real_angle_x -= 360;\r
89     }\r
90     else\r
91     {\r
92         if (real_angle_x <= -180)\r
93             real_angle_x += 360;\r
94     }\r
95 \r
96     if (real_angle_y > self.tur_head.angles_y)\r
97     {\r
98         if (real_angle_y >= 180)\r
99             real_angle_y -= 360;\r
100     }\r
101     else\r
102     {\r
103         if (real_angle_y <= -180)\r
104             real_angle_y += 360;\r
105     }\r
106 \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
113 \r
114     // Simulate banking\r
115     self.angles_z = bound(-45,real_angle_y * -2,45);\r
116 \r
117     if (self.frame > 40)\r
118         self.frame = 1;\r
119 \r
120     makevectors(self.angles);\r
121     if (self.tur_dist_aimpos > self.target_range_optimal)\r
122     {\r
123         if ( angle_ofs < 1 )\r
124         {\r
125             self.frame += 2;\r
126             movelib_move(v_forward * EWHEEL_ACCEL_FAST,EWHEEL_MAXSPEED,EWHEEL_DRAG,EWHEEL_MASS,0);\r
127         }\r
128         else if (angle_ofs < 2)\r
129         {\r
130             self.frame += 1;\r
131             movelib_move(v_forward * EWHEEL_ACCEL_SLOW,EWHEEL_MAXSPEED,EWHEEL_DRAG,EWHEEL_MASS,EWHEEL_BREAK_SLOW);\r
132         }\r
133         else\r
134         {\r
135             movelib_move('0 0 0',EWHEEL_MAXSPEED,EWHEEL_DRAG,EWHEEL_MASS,EWHEEL_BREAK_FAST);\r
136         }\r
137     }\r
138     else\r
139         movelib_move('0 0 0',EWHEEL_MAXSPEED,EWHEEL_DRAG,EWHEEL_MASS,EWHEEL_BREAK_FAST);\r
140 }\r
141 \r
142 void ewheel_roammove()\r
143 {\r
144     movelib_move(v_forward,EWHEEL_MAXSPEED,0,EWHEEL_MASS,EWHEEL_BREAK_SLOW);\r
145     self.angles_z = 0;\r
146 \r
147     /*\r
148     vector wish_angle,real_angle,steer,avoid;\r
149     float turn_limit,angle_ofs;\r
150     float dist;\r
151 \r
152     return;\r
153 \r
154     dist = vlen(self.origin - self.pos1);\r
155 \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
159 \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
163 \r
164     real_angle_y = shortangle_f(real_angle_y,self.angles_y);\r
165 \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
170 \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
173 \r
174     self.angles_z = bound(-12,real_angle_y * -1,12);\r
175 \r
176     if(self.frame > 40)\r
177         self.frame = 1;\r
178 \r
179     makevectors(self.angles);\r
180     float lspeed;\r
181     lspeed = vlen(self.velocity);\r
182 \r
183     if((dist < 64)||(self.phase < time))\r
184     {\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
189     }\r
190     else if(dist < 128)\r
191     {\r
192         self.frame += 1;\r
193         if(lspeed > 100)\r
194             movelib_move(v_forward * 50,150,0,50,50);\r
195         else\r
196             movelib_move(v_forward * 100,150,0,50,0);\r
197     }\r
198     else\r
199     {\r
200         self.frame += 1;\r
201         if(angle_ofs > 10)\r
202             movelib_move(v_forward * 50,150,0,50,50);\r
203         else\r
204             movelib_move(v_forward * 250,150,0,50,0);\r
205     }\r
206     */\r
207 }\r
208 \r
209 void ewheel_postthink()\r
210 {\r
211     if (self.enemy)\r
212         ewheel_enemymove();\r
213     else\r
214         ewheel_roammove();\r
215 \r
216 }\r
217 \r
218 \r
219 void ewheel_respawnhook()\r
220 {\r
221     setorigin(self,self.pos1);\r
222 }\r
223 \r
224 void ewheel_diehook()\r
225 {\r
226 }\r
227 \r
228 float ewheel_firecheck()\r
229 {\r
230     bprint("Firecheck\n");\r
231     return 1;\r
232 }\r
233 \r
234 void turret_ewheel_dinit()\r
235 {\r
236     entity e;\r
237 \r
238     if (self.netname == "")      self.netname     = "Ewheel Turret";\r
239 \r
240     // self.ticrate = 0.05;\r
241 \r
242     if (self.target != "")\r
243     {\r
244         e = find(world,targetname,self.target);\r
245         if (!e)\r
246         {\r
247             bprint("Warning! initital waypoint for ewheel does NOT exsist!\n");\r
248             self.target = "";\r
249         }\r
250 \r
251         if (e.classname != "turret_checkpoint")\r
252             dprint("Warning: not a turrret path\n");\r
253         else\r
254             self.goalcurrent = e;\r
255     }\r
256 \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
260 \r
261     self.turret_respawnhook = ewheel_respawnhook;\r
262     self.turret_diehook = ewheel_diehook;\r
263 \r
264     self.ticrate = 0.05;\r
265     if (turret_stdproc_init("ewheel_std") == 0)\r
266     {\r
267         remove(self);\r
268         return;\r
269     }\r
270     //self.turret_firecheckfunc = ewheel_firecheck;\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 |= TFL_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     self.idle_aim = '0 0 0';\r
291 \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
296 }\r
297 \r
298 \r
299 void spawnfunc_turret_ewheel()\r
300 {\r
301     precache_model ("models/turrets/ewheel-base.md3");\r
302     precache_model ("models/turrets/ewheel-gun1.md3");\r
303 \r
304     self.think = turret_ewheel_dinit;\r
305     self.nextthink = time + 0.5;\r
306 }\r