]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/engineer.c
Added function for "+use" with teslas -- also added semi-support for railgun
[divverent/nexuiz.git] / TeamNexuiz / game / gamec / engineer.c
1 .float option, opton5;\r
2 .float has_mine;\r
3 void () MagnetMineTouch;\r
4 void () MagTimer;\r
5 void () RemoveMagnetMine;\r
6 //tesla\r
7 void () Tesla_Die;\r
8 void () Tesla_Pain;\r
9 void () Tesla_Idle;\r
10 void () Tesla_Touch;\r
11 \r
12 void () SUB_NULL;\r
13 \r
14 //temp\r
15 void (entity bld) CheckBelowBuilding;\r
16 void (entity gunhead) CheckSentry;\r
17 void () Sentry_Rotate;\r
18 float () Sentry_FindTarget;\r
19 void () Sentry_FoundTarget;\r
20 void () Sentry_HuntTarget;\r
21 void () Sentry_Pain;\r
22 void () Sentry_Die;\r
23 \r
24 void EngineerSpecial()\r
25 {\r
26         //      sprint(self, "Not done yet\n"); \r
27         // this is gonna contain build menu eventually\r
28 };\r
29 \r
30 /*==========================\r
31  TF Engineer Build Function\r
32  =========================*/\r
33 void(entity gunhead) CheckSentry = \r
34 {\r
35         local vector dist;\r
36         local entity gunbase;\r
37         gunbase = gunhead.trigger_field;\r
38         dist = gunbase.origin - gunhead.origin;\r
39         if (vlen(dist) > 15)\r
40         {\r
41                 bprint(self.real_owner.netname);\r
42                 bprint("'s sentry gun malfunctioned\n");\r
43                 Sentry_Die();\r
44         }\r
45 };\r
46 \r
47 void () TeamFortress_EngineerBuild =\r
48 {\r
49         local entity te;\r
50 \r
51         if ((self.is_building == 0))\r
52         {\r
53 //              if ((((self.ammo_cells < 100) && (self.has_dispenser == 0)) && (self.has_sentry == 0)))\r
54 //              {\r
55 //                      CenterPrint (self, "You don't have enough metal to \nbuild anything.\n\n");\r
56 //                      return;\r
57 //              }\r
58                 self.current_menu = 15;\r
59                 self.menu_count = 25;\r
60         }\r
61         else\r
62         {\r
63                 if ((self.is_building == 1))\r
64                 {\r
65                         sprint (self, "You stop building.\n");\r
66 \r
67                         if (self.weaponentity.pos1 != '0 0 0')\r
68                         {\r
69 //                              self.reload_time = time;\r
70                                 self.weaponentity.pos1 = '0 0 0';\r
71                                 self.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED;\r
72                         }\r
73 \r
74                         self.pausetime = 0;\r
75                         self.tfstate = (self.tfstate - (self.tfstate & 65536));\r
76                         TeamFortress_SetSpeed (self);\r
77                         te = find (world, netname, "build_timer");\r
78                         while (te)\r
79                         {\r
80                                 if ((te.owner == self))\r
81                                 {\r
82                                         dremove (te);\r
83                                         te = world;\r
84                                 }\r
85                                 else\r
86                                 {\r
87                                         te = find (te, netname, "build_timer");\r
88                                 }\r
89                         }\r
90                         self.is_building = 0;\r
91 //                      self.current_weapon = self.weapon;              // add function to make weapon disappear?\r
92                         W_SetCurrentAmmo ();\r
93                 }\r
94         }\r
95 };\r
96 \r
97 float(entity obj, entity builder) CheckArea = \r
98 {\r
99         local vector src;\r
100         local vector end;\r
101         local float pos;\r
102         pos = pointcontents(obj.origin);\r
103         if (pos == -2 || pos == -6)\r
104         {\r
105                 return 0;\r
106         }\r
107         src_x = obj.origin_x + obj.maxs_x + 16;\r
108         src_y = obj.origin_y + obj.maxs_y + 16;\r
109         src_z = obj.origin_z + obj.maxs_z + 16;\r
110         pos = pointcontents(src);\r
111         if (pos == -2 || pos == -6)\r
112         {\r
113                 return 0;\r
114         }\r
115         end_x = obj.origin_x + obj.mins_x - 16;\r
116         end_y = obj.origin_y + obj.mins_y - 16;\r
117         end_z = obj.origin_z + obj.mins_z - 16;\r
118         traceline(src, end, 1, obj);\r
119         if (trace_fraction != 1)\r
120         {\r
121                 return 0;\r
122         }\r
123         pos = pointcontents(end);\r
124         if (pos == -2 || pos == -6)\r
125         {\r
126                 return 0;\r
127         }\r
128         src_x = obj.origin_x + obj.mins_x - 16;\r
129         src_y = obj.origin_y + obj.maxs_y + 16;\r
130         src_z = obj.origin_z + obj.maxs_z + 16;\r
131         pos = pointcontents(src);\r
132         if (pos == -2 || pos == -6)\r
133         {\r
134                 return 0;\r
135         }\r
136         end_x = obj.origin_x + obj.maxs_x + 16;\r
137         end_y = obj.origin_y + obj.mins_y - 16;\r
138         end_z = obj.origin_z + obj.mins_z - 16;\r
139         traceline(src, end, 1, obj);\r
140         if (trace_fraction != 1)\r
141         {\r
142                 return 0;\r
143         }\r
144         pos = pointcontents(end);\r
145         if (pos == -2 || pos == -6)\r
146         {\r
147                 return 0;\r
148         }\r
149         traceline(builder.origin, obj.origin, 1, builder);\r
150         if (trace_fraction != 1)\r
151         {\r
152                 return 0;\r
153         }\r
154         return 1;\r
155 };\r
156 \r
157 void(float objtobuild) TeamFortress_Build = \r
158 {\r
159         if (self.is_building == 1) {    // double-checks incase someone uses code with TeamFortress_EngineerBuild(number)\r
160                 TeamFortress_EngineerBuild();\r
161                 return;\r
162         }\r
163         if ((self.reload_time + .25) > time) { \r
164                 sprint(self, "You cant build while reloading.\n");\r
165                 return; \r
166         }\r
167 \r
168         local float btime;\r
169         local entity te;\r
170         local vector tmp1;\r
171         local vector tmp2;\r
172         newmis = spawn();\r
173         makevectors(self.v_angle);\r
174         v_forward_z = 0;\r
175         v_forward = normalize(v_forward) * 64;\r
176         newmis.origin = self.origin + v_forward;\r
177         if (objtobuild == 1)\r
178         {\r
179                 if (self.has_dispenser)\r
180                 {\r
181                         sprint(self, "You can only have one dispenser.\nTry dismantling your old one.\n");\r
182                         return;\r
183                 }\r
184                 tmp1 = '-16 -16 0';\r
185                 tmp2 = '16 16 24';\r
186                 newmis.mdl = "progs/dispencr.mdl";\r
187                 newmis.netname = "dispenser";\r
188                 btime = time + 2;\r
189         }\r
190         else\r
191         {\r
192                 if (objtobuild == 2)\r
193                 {\r
194                         if (self.has_sentry)\r
195                         {\r
196                                 sprint(self, "You can only have one sentry gun.\nTry dismantling your old one.\n");\r
197                                 return;\r
198                         }\r
199                         tmp1 = '-16 -16 0';\r
200                         tmp2 = '16 16 48';\r
201 //                      newmis.mdl = "progs/turrbase.mdl";\r
202                         newmis.mdl = "models/sentry/turr1_base.md3";\r
203 //                      newmis.scale = .75;\r
204                         newmis.netname = "sentrygun";\r
205 //                      btime = time + 5;\r
206                         btime = .1;\r
207                 }\r
208                 if ((objtobuild == 3))\r
209                 {\r
210                         if (self.has_tesla)\r
211                         {\r
212                                 sprint (self, "You can only have one tesla gun\n");\r
213                                 return;\r
214                         }\r
215                         tmp1 = '-16 -16 0';\r
216                         tmp2 = '16 16 48';\r
217                         newmis.mdl = "models/engineer/tesla/tesla.md3";\r
218                         newmis.scale = .70;                     //temp -- morphed's models too freaking huge :x\r
219 \r
220                         newmis.netname = "tesla";\r
221                         btime = (time + 6);\r
222                 }\r
223 // Begin telepad 1\r
224                 if (objtobuild == 5)\r
225                 {\r
226                         if (self.has_teleporter >= 2)\r
227                         {\r
228                                 sprint(self, "You can only have 2 teleporters.\nTry dismantling an old one.\n");\r
229                  dremove(newmis);\r
230                                 return;\r
231                         }\r
232                         tmp1 = '-16 -16 0';\r
233                         tmp2 = '16 16 4';\r
234                         newmis.mdl = "progs/telepad.mdl";\r
235                         newmis.netname = "teleporter";\r
236         \r
237                         btime = time + 3;\r
238                 }\r
239 // End telepad 1\r
240         }\r
241         if (CheckArea(newmis, self) == 0)\r
242         {\r
243                 sprint(self, "Not enough room to build here\n");\r
244                 dremove(newmis);\r
245                 return;\r
246         }\r
247         self.is_building = 1;\r
248         self.immune_to_check = time + 10;\r
249 //      self.maxspeed = 0;                      // make sure player cant move\r
250         self.tfstate = self.tfstate | 65536;\r
251 /*      self.weapon = self.current_weapon;              // get rid of player's weapon model\r
252         self.current_weapon = 0;\r
253         self.weaponmodel = "";\r
254         self.weaponframe = 0;*/\r
255 //      TeamFortress_SetSpeed(self);                    // hmm? player cant move?\r
256         newmis.owner = self;\r
257         newmis.classname = "timer";\r
258         newmis.netname = "build_timer";\r
259         newmis.nextthink = btime;\r
260         newmis.think = TeamFortress_FinishedBuilding;\r
261         newmis.colormap = self.colormap;\r
262         newmis.weapon = objtobuild;\r
263         newmis.angles_y = anglemod(self.angles_y + 180);\r
264         newmis.velocity = '0 0 8';\r
265         newmis.movetype = 6;\r
266         newmis.solid = 2;\r
267         setmodel(newmis, newmis.mdl);\r
268         setsize(newmis, tmp1, tmp2);\r
269         setorigin(newmis, newmis.origin);\r
270         newmis.flags = newmis.flags - (newmis.flags & 512);\r
271 \r
272         self.velocity = '0 0 0';                // stop player movement\r
273         DoReload (5, (btime - time));           // Engineer build function shared with reload one\r
274                                                                                 // 5 is for building, btime minus time is for build time\r
275 };\r
276 \r
277 void(entity bld) CheckBelowBuilding = \r
278 {\r
279         local vector below;\r
280         below = bld.origin;\r
281         if (bld.classname == "detpack")\r
282         {\r
283                 below_z = below_z - 8;\r
284         }\r
285         else\r
286         {\r
287                 below_z = below_z - 24;\r
288         }\r
289         traceline(bld.origin, below, 1, bld);\r
290         if (trace_fraction == 1)\r
291         {\r
292                 bld.movetype = 6;\r
293                 bld.flags = bld.flags - (bld.flags & 512);\r
294         }\r
295 };\r
296 \r
297 void () Tesla_Animate;\r
298 void() TeamFortress_FinishedBuilding = \r
299 {\r
300         local entity oldself;\r
301         local vector source;\r
302 \r
303         if (self.owner.is_building != 1)\r
304         {\r
305                 return;\r
306         }\r
307         oldself = self;\r
308         self = self.owner;\r
309         oldself.owner = world;\r
310         oldself.real_owner = self;\r
311         self.is_building = 0;\r
312         self.tfstate = self.tfstate - (self.tfstate & 65536);\r
313         self.current_weapon = self.weapon;\r
314         self.StatusRefreshTime = time + 0.1;\r
315         TeamFortress_SetSpeed(self);\r
316 /*      if (oldself.weapon == 1)\r
317         {\r
318                 self.has_dispenser = 1;\r
319                 sprint(self, "You finish building the dispenser.\n");\r
320                 teamsprint(self.team_no, self, self.netname);\r
321                 teamsprint(self.team_no, self, " has built a Dispenser.\n");\r
322                 self.ammo_cells = self.ammo_cells - 100;\r
323                 oldself.classname = "building_dispenser";\r
324                 oldself.netname = "dispenser";\r
325                 oldself.blocked = T_Dispenser;\r
326                 oldself.touch = T_Dispenser;\r
327                 oldself.max_health = 150;\r
328                 oldself.health = 150;\r
329                 oldself.think = DispenserThink;\r
330                 oldself.nextthink = time + 5;\r
331                 oldself.th_die = Dispenser_Die;\r
332                 oldself.mdl = "progs/dispencr.mdl";\r
333                 oldself.team_no = self.team_no;\r
334                 oldself.real_owner = self;\r
335                 oldself.colormap = self.colormap;\r
336                 oldself.takedamage = 2;\r
337                 oldself.owner = world;\r
338                 oldself.movetype = 6;\r
339                 oldself.velocity = '0 0 8';\r
340                 oldself.flags = oldself.flags - (oldself.flags & 512);\r
341                 oldself.ammo_shells = ceil(self.ammo_shells * 0.25);\r
342                 oldself.ammo_nails = ceil(self.ammo_nails * 0.25);\r
343                 oldself.ammo_rockets = ceil(self.ammo_rockets * 0.25);\r
344                 oldself.ammo_cells = ceil(self.ammo_cells * 0.25);\r
345                 oldself.armorvalue = ceil(self.armorvalue * 0.25);\r
346                 self.ammo_shells = ceil(self.ammo_shells * 0.75);\r
347                 self.ammo_nails = ceil(self.ammo_nails * 0.75);\r
348                 self.ammo_rockets = ceil(self.ammo_rockets * 0.75);\r
349                 self.ammo_cells = ceil(self.ammo_cells * 0.75);\r
350                 self.armorvalue = ceil(self.armorvalue * 0.75);\r
351                 oldself.solid = 2;\r
352                 setmodel(oldself, oldself.mdl);\r
353                 //setsize(oldself, '-8 -8 0', '8 8 24');gold. commented out.. plexi's idea :j\r
354                 setorigin(oldself, oldself.origin);\r
355         }\r
356         else\r
357         {*/\r
358                 if (oldself.weapon == 2)\r
359                 {\r
360                         local entity barrel;\r
361                         barrel = spawn();\r
362 //                      barrel.mdl = "models/sentry/turr1_base.md3";\r
363 //                      barrel.mdl = "models/sentry/turr1_barrel.md3";\r
364 //                      barrel.scale = .75;\r
365                         //barrel.solid = 2;\r
366 \r
367 //                      barrel.angles_x = barrel.angles_x - 70;\r
368 \r
369 //                      barrel.angles_z = barrel.angles_z - 90;\r
370 /*                      barrel.angles_x = 0;\r
371                         barrel.angles_y = oldself.angles_y;\r
372                         barrel.angles_z = 0;*/\r
373 //                      barrel.movetype = 4;\r
374 //                      barrel.movetype = MOVETYPE_FOLL`OW;\r
375                         barrel.yaw_speed = 10;\r
376 //                      barrel.angles_z = barrel.angles_z - 45;\r
377                         setmodel(barrel, "models/sentry/turr1_barrel.md3");\r
378 //                      setsize(barrel, '-16 -16 0', '16 16 48');               // temp //'d\r
379 //                      setorigin(barrel, oldself.origin + '0 0 8');\r
380                         setorigin(barrel, '0 0 0');\r
381                         \r
382 \r
383                         self.has_sentry = 1;\r
384                         sprint(self, "You finish building the sentry gun.\n");\r
385                         teamsprint(self.team_no, self, self.netname);\r
386                         teamsprint(self.team_no, self, " has built a Sentry Gun.\n");\r
387                         oldself.classname = "building_sentrygun_base";\r
388                         oldself.netname = "sentry gun";\r
389                         oldself.takedamage = 0;\r
390                         oldself.th_die = Sentry_Die;\r
391                         self.ammo_cells = self.ammo_cells - 130;\r
392                         setsize(oldself, '-16 -16 0', '16 16 4');\r
393                         newmis = spawn();\r
394                         newmis.classname = "building_sentrygun";\r
395                         newmis.health = 150;\r
396                         newmis.max_health = newmis.health;\r
397                         newmis.weapon = 1;\r
398                         newmis.th_die = Sentry_Die;\r
399                         newmis.th_pain = Sentry_Pain;\r
400 //                      newmis.mdl = "progs/turrgun.mdl";\r
401                         newmis.mdl = "models/sentry/turr1_body.md3";\r
402 //                      newmis.scale = .75;\r
403                         sound(oldself, 3, "weapons/tnkatck4.wav", 1, 1);\r
404                         newmis.solid = 2;\r
405                         setmodel(newmis, newmis.mdl);\r
406                         setsize(newmis, '-16 -16 0', '16 16 48');\r
407                         setorigin(newmis, oldself.origin + '0 0 8');\r
408                         newmis.real_owner = oldself.real_owner;\r
409                         newmis.trigger_field = oldself;\r
410                         oldself.oldenemy = newmis;\r
411                         newmis.movetype = 4;\r
412                         oldself.colormap = self.colormap;\r
413                         newmis.colormap = self.colormap;\r
414                         newmis.takedamage = 2;\r
415                         newmis.velocity = '0 0 -8';\r
416                         newmis.flags = newmis.flags - (newmis.flags & 512);\r
417                         oldself.flags = oldself.flags - (oldself.flags & 512);\r
418                         newmis.team_no = self.team_no;\r
419                         newmis.think = lvl1_sentry_stand;\r
420                         newmis.nextthink = time + 0.5;\r
421                         newmis.yaw_speed = 10;\r
422                         newmis.heat = 0;\r
423                         newmis.angles_x = 0;\r
424 //                      newmis.angles_y = oldself.angles_y;\r
425                         newmis.angles_y = oldself.angles_y;\r
426                         newmis.angles_z = 0;\r
427                         newmis.waitmin = anglemod(newmis.angles_y - 50);\r
428                         newmis.waitmax = anglemod(newmis.angles_y + 50);\r
429                         if (newmis.waitmin > newmis.waitmax)\r
430                         {\r
431                                 newmis.waitmin = newmis.waitmax;\r
432                                 newmis.waitmax = anglemod(newmis.angles_y - 50);\r
433                         }\r
434                         newmis.ammo_shells = 25;\r
435                         newmis.maxammo_shells = 100;\r
436                         newmis.maxammo_rockets = 20;\r
437 \r
438                         newmis.barrel_ent = barrel;\r
439 \r
440 //                      setattachment(newmis, oldself, "tag_base_body");\r
441                         setattachment(barrel, newmis, "tag_body_barrel");\r
442 \r
443 \r
444                 }\r
445                 else\r
446                 {\r
447 //tesla\r
448                         if ((oldself.weapon == 3))\r
449                         {\r
450                                 self.has_tesla = 1;\r
451                                 sprint (self, "You finish building the tesla coil.\n");\r
452                                 oldself.real_owner = self;\r
453                                 teamsprint (self.team_no, self, self.netname);\r
454                                 teamsprint (self.team_no, self, " has built a tesla.\n");\r
455                                 sound (oldself, 3, "weapons/guerilla_set.wav", 1, 1);\r
456                                 oldself.classname = "building_tesla";\r
457                                 oldself.netname = "tesla";\r
458                                 oldself.takedamage = 2;\r
459                                 oldself.solid = 2;\r
460                                 oldself.th_die = Tesla_Die;\r
461                                 oldself.th_pain = Tesla_Pain;\r
462                                 self.ammo_cells = (self.ammo_cells - 150);\r
463                                 oldself.health = 200;\r
464                                 oldself.movetype = 6;\r
465                                 oldself.colormap = self.colormap;\r
466                                 oldself.velocity = '0 0 -8';\r
467                                 oldself.avelocity = '0 0 0';\r
468                                 oldself.flags = (oldself.flags - (oldself.flags & 512));\r
469                                 oldself.team_no = self.team_no;\r
470                                 oldself.think = Tesla_Idle;\r
471                                 oldself.nextthink = (time + 2);\r
472                                 oldself.touch = Tesla_Touch;\r
473                                 oldself.enemy = world;\r
474                                 oldself.maxammo_shells = 0;\r
475                                 oldself.maxammo_nails = 0;\r
476                                 oldself.maxammo_rockets = 0;\r
477                                 oldself.max_health = 100;\r
478                                 oldself.ammo_cells = 50;\r
479                                 oldself.tf_items = 0;\r
480                                 /*if (!(self.weapons_carried & 8))\r
481                                 {\r
482                                         oldself.ammo_shells = 2;\r
483                                         oldself.ammo_nails = 2;\r
484                                         oldself.ammo_rockets = 1;\r
485                                         oldself.currentammo = 5;\r
486                                         oldself.max_health = 200;\r
487                                         oldself.ammo_cells = 120;\r
488                                 }*/\r
489                                 oldself.currentammo = 0;                // 6 Upgrades. (6 minus this number is pgrade count)\r
490                                 oldself.health = oldself.max_health;\r
491                                 oldself.waitmin = ((oldself.ammo_shells + 2) * (oldself.ammo_nails + 2));\r
492                                 oldself.waitmax = 0;\r
493 \r
494                                 // The tesla animater -- till I learn to be a better coder ;)\r
495                                 local entity tesanim;\r
496                                 tesanim = spawn();\r
497                                 tesanim.owner = oldself;\r
498                                 tesanim.think = Tesla_Animate;\r
499                                 tesanim.nextthink = time;\r
500                         }\r
501 // TELEPAD 2 BEGIN*/ \r
502         /*if (oldself.weapon == 5)\r
503         {\r
504                 self.has_teleporter = (self.has_teleporter + 1);\r
505                 sprint (self, "You finish building the Teleporter Pad.\n");\r
506 \r
507 //        teamprefixsprint(self.team_no,self); //- OfN\r
508 \r
509         teamsprint(self.team_no, self, self.netname);\r
510                 teamsprint(self.team_no, self, " has built a Teleporter Pad.\n");\r
511                 sound (oldself, 3, "weapons/guerset.wav", 1, 1);\r
512 \r
513                 self.ammo_cells = self.ammo_cells - 90;\r
514 \r
515                 // Create the teleporter\r
516                 oldself.classname = "building_teleporter";\r
517                 oldself.netname = "teleporter";\r
518 //              oldself.blocked = Teleporter_touch;             // Actual touch function\r
519                 oldself.touch = Teleporter_touch;\r
520                 oldself.max_health = 300;\r
521                 oldself.health = 300;\r
522                 oldself.th_die = Teleporter_Die;                // Death function\r
523                 oldself.mdl = "progs/telepad.mdl";              // Actual mdl\r
524                 oldself.team_no = self.team_no;\r
525                 oldself.maxammo_cells = 200;    //CH Max of 20 teleports\r
526                 oldself.ammo_cells = 100;       //CH start not at full\r
527 \r
528                 oldself.real_owner = self;                      // The Engineer owns this item\r
529                 oldself.colormap = self.colormap;       // Set the Color\r
530                 oldself.takedamage = 2;\r
531                 oldself.owner = world;\r
532                 oldself.movetype = 6;\r
533                 oldself.velocity = '0 0 8';\r
534                 oldself.flags = oldself.flags - (oldself.flags & 512);\r
535 \r
536                 oldself.solid = 2;\r
537                 setmodel(oldself, oldself.mdl);\r
538                 setsize (oldself, '-16 -16 0', '16 16 4');\r
539                 setorigin(oldself, oldself.origin + '0 0 8'); //CH does jump\r
540 \r
541                 oldself.heat = 4; //dont come on for 4 seconds\r
542                 oldself.think = Teleporter_heat_think;\r
543                 oldself.nextthink = time + 1;\r
544                 oldself.spawnflags = 4; //CH cause extensive checks for height\r
545 \r
546                 oldself.is_malfunctioning = 0;\r
547                 oldself.all_active=0; // OfN - reset HACKER improvements\r
548                 }\r
549 // TELEPAD 2 END\r
550                 }*/\r
551         }\r
552         W_SetCurrentAmmo();\r
553 };\r
554 \r
555 \r
556 \r
557 \r
558 \r
559 void () Drop_Magnetic_Mine =\r
560 {\r
561         if (self.has_mine == 1)\r
562         {\r
563                 sprint (self, "Hey, one mine at a time!\n");\r
564                 return;\r
565         }\r
566 \r
567         local entity item;\r
568 \r
569         item = spawn ();\r
570         item.team_no = self.team_no;\r
571         item.owner = self;\r
572         item.classname = "drop1";\r
573         item.origin = (self.origin - '0 0 -10');\r
574 \r
575 //      item.angles_x = 360;\r
576 \r
577         item.angles_y = 45;\r
578         item.flags = 256;\r
579 //      item.solid = 2;\r
580         item.solid = SOLID_TRIGGER;\r
581         item.movetype = 6;\r
582 \r
583         item.velocity = '0 0 1';\r
584         setsize (item, '-1 -1 0', '1 1 6');\r
585 \r
586         item.nextthink = (time + 180);\r
587 \r
588         item.touch = MagnetMineTouch;\r
589         setmodel (item, "models/magmine/magnetmine.md3");\r
590         item.scale = .35;\r
591 \r
592         item.think = RemoveMagnetMine;\r
593 \r
594         item.pausetime = time + 2;\r
595         self.has_mine = 1;\r
596         sprint(self, "You set a Mag Mine!\n");\r
597 }\r
598 \r
599 void EngineerGrenade(float req)\r
600 {\r
601         if(req == WR_GRENADE1)\r
602         {\r
603                 if(W_ThrowGrenade(W_ArmorGrenade))\r
604                         self.grenade_time = time + cvar("g_balance_grenade_armor_refire");\r
605         }\r
606         else if(req == WR_GRENADE2)\r
607         {\r
608                 Drop_Magnetic_Mine();\r
609                 self.grenade_time = time + 2;\r
610         }\r
611 }\r
612 \r
613 void EngineerPreThink()\r
614 {\r
615 }\r
616 \r
617 void EngineerPostThink()\r
618 {\r
619 }\r
620 \r
621 void BecomeEngineer(float portion)\r
622 {\r
623         self.max_health = cvar("g_balance_class_engineer_health") * portion;\r
624 \r
625         self.max_armor = cvar("g_balance_class_engineer_armor") * portion;\r
626 \r
627         self.mass = cvar("g_balance_class_engineer_mass");\r
628 \r
629         SetPlayerSpeed(self);\r
630 \r
631         self.items = IT_WEP1 | IT_WEP2 | IT_WEP3 | IT_WEP4;\r
632         self.switchweapon = WEP2;\r
633         self.ammo_shells = floor(20 * portion);\r
634         self.ammo_nails = floor(20 * portion);\r
635         self.ammo_rockets = floor(1 * portion);\r
636         self.ammo_cells = floor(0 * portion);\r
637         self.playerclass = 9;           // TF P.C.\r
638         SetMaxAmmoFor (32);\r
639 }\r
640 \r
641 // Magnetic Mine\r
642 void () RemoveMagnetMine =\r
643 {\r
644         sprint (self.owner, "Your Mag Mine is gone...\n");\r
645         self.owner.has_mine = 0;\r
646         dremove (self);\r
647         return;\r
648 };\r
649 \r
650 void () MagTimer =\r
651 {\r
652         local entity theowner;\r
653         local string st;\r
654 \r
655         theowner = self.owner;\r
656         theowner.option5 = (theowner.option5 - .5);\r
657         st = ftos (theowner.option5);\r
658 //      sound (theowner, 0, "ambient/100hzhum.wav", 1, 1);              // find new wav! :o\r
659         theowner.origin = self.origin;\r
660         CenterPrint2 (theowner, "You are stuck on a mag mine!\n", st);\r
661         if ((theowner.option5 < 2))\r
662         {\r
663                 theowner.option5 = 0;\r
664                 sprint (theowner.enemy, "Your Mag Mine died...\n");\r
665                 theowner.enemy.has_mine = 0;\r
666                 remove (self);\r
667                 return;\r
668         }\r
669         self.nextthink = (time + .5);\r
670 };\r
671 \r
672 void () MagMineActivate =\r
673 {\r
674         if ((other.option == 0))\r
675         {\r
676                 self.owner.has_mine = 1;\r
677                 newmis = spawn ();\r
678                 newmis.classname = "timer";\r
679                 newmis.netname = " FlashTimer";\r
680                 newmis.team_no = self.owner.team_no;\r
681                 newmis.owner = other;\r
682                 other.enemy = self.owner;\r
683                 newmis.think = MagTimer;\r
684                 newmis.nextthink = (time + 1);\r
685                 newmis.origin = other.origin;\r
686         }\r
687         other.option5 = (floor ((other.armorvalue * .25)) + 3);\r
688         if ((other.option5 > 15))\r
689         {\r
690                 other.option5 = 15;\r
691         }\r
692 };\r
693 \r
694 void () RemoveDudMine =\r
695 {\r
696         dremove(self);\r
697 }\r
698 \r
699 void () MagnetMineTouch =\r
700 {\r
701         local float isgood;\r
702         local entity isnearplayer;\r
703         \r
704         isnearplayer = findradius (self.origin, 10);\r
705         while (isnearplayer)\r
706         {\r
707                 if ((isnearplayer.classname == "player"))\r
708                 {\r
709                         isgood = 1;\r
710 //                      bprint (isnearplayer.classname);\r
711 //                      bprint ("\n");\r
712 //                      return;\r
713                 }\r
714                 isnearplayer = isnearplayer.chain;\r
715         }\r
716         if (isgood != 1)\r
717                 return;\r
718 \r
719         if ((self.pausetime > time))\r
720         {\r
721                 return;\r
722         }\r
723         if ((other.classname != "player"))\r
724         {\r
725                 return;\r
726         }\r
727         if ((other.health <= 0))\r
728         {\r
729                 return;\r
730         }\r
731 //      if ((other.is_undercover == 1))         //temp  - add function!!\r
732 //      {\r
733 //              return;\r
734 //      }\r
735         if ((other.team_no == self.owner.team_no))\r
736         {\r
737                 return;\r
738         }\r
739         if ((other.classname == "player"))\r
740         {\r
741                 MagMineActivate ();\r
742                 sprint (other, "You stepped on a Magnetic Mine! :(\n");\r
743                 sprint (self.owner, "Your Magnet Mine worked!\n");\r
744                 self.pausetime = (time + 5);\r
745         }\r
746         self.touch = SUB_NULL;\r
747         self.effects = EF_BRIGHTFIELD | EF_ADDITIVE;\r
748         self.think = RemoveDudMine;\r
749         self.nextthink = (time + 15);\r
750 //      dremove (self);\r
751 };\r
752 \r
753 // Checks the distance between the player and the object\r
754 void () CheckDistance =\r
755 {\r
756         local vector dist;\r
757 \r
758         if (!(self.owner.building.classname == "building_tesla" && self.enemy.classname == "building_dispenser")) {\r
759         if ((self.owner.building != self.enemy))\r
760         {\r
761                 dremove (self);\r
762                 return;\r
763         } }\r
764         dist = self.enemy.origin - self.owner.origin;\r
765         if ((vlen (dist) > 64.000000))\r
766         {\r
767                 CenterPrint (self.owner, "\n");\r
768                 self.owner.menu_count = 25.000000;\r
769                 self.owner.current_menu = 1.000000;\r
770                 self.owner.building = world;\r
771                 dremove (self);\r
772                 return;\r
773         }\r
774         self.nextthink = (time + 0.300000);\r
775 };\r
776 \r
777 \r
778 void (entity gun) Engineer_UseTesla =\r
779 {\r
780         local entity dist_checker;\r
781         local string st;\r
782 \r
783                 if ((gun.ammo_rockets == TF_FLARE_LIT))\r
784                 {\r
785                         gun.maxammo_cells = 120;\r
786                 }\r
787                 else\r
788                 {\r
789                         if ((gun.ammo_rockets == TF_FLARE_OFF))\r
790                         {\r
791                                 gun.maxammo_cells = 120;\r
792                         }\r
793                         else\r
794                         {\r
795                                 if ((gun.ammo_rockets == 2))\r
796                                 {\r
797                                         gun.maxammo_cells = 200;\r
798                                 }\r
799                                 else\r
800                                 {\r
801                                         if ((gun.ammo_rockets == 3))\r
802                                         {\r
803                                                 gun.maxammo_cells = 300;\r
804                                         }\r
805                                 }\r
806                         }\r
807                 }\r
808 \r
809         sprint(self, "Èåáìôè:");\r
810         st = ftos(gun.health);\r
811         sprint(self, st);\r
812         sprint(self, "¯");\r
813         st = ftos(gun.max_health);\r
814         sprint(self, st);\r
815         sprint(self, " Ãåììó:");\r
816         st = ftos(gun.ammo_cells);\r
817         sprint(self, st);\r
818         sprint(self, "¯");\r
819         st = ftos(gun.maxammo_cells);\r
820         sprint(self, st);\r
821         st = ftos ((6 - gun.currentammo));\r
822         sprint(self, " Õðçòáäåó Ìåæô:");\r
823         sprint (self, st);\r
824         st = ftos ((6 - gun.currentammo));\r
825         sprint (self, "\n");\r
826         sprint(self, "Öïìôáçå:");\r
827         st = ftos(gun.ammo_shells);\r
828         sprint(self, st);\r
829         sprint(self, " Áíðåòáçå:");\r
830         st = ftos(gun.ammo_nails);\r
831         sprint(self, st);\r
832         sprint(self, " Ðï÷åò Óõððìù:");\r
833         st = ftos(gun.ammo_rockets);\r
834         sprint(self, st);\r
835         sprint(self, "\n");\r
836         if (gun.tf_items)\r
837         {\r
838                 if ((gun.tf_items & 2))\r
839                 {\r
840                         sprint (self, "TeslaTurret(tm) ");\r
841                 }\r
842                 if ((gun.tf_items & TF_FLARE_OFF))\r
843                 {\r
844                         sprint (self, "Improved Targeter ");\r
845                 }\r
846                 if ((gun.tf_items & 1024))\r
847                 {\r
848                         sprint (self, "Spy Detector");\r
849                 }\r
850                 sprint (self, "\n");\r
851         }\r
852         self.current_menu = 18;\r
853         self.menu_count = 25;\r
854         self.building = gun;\r
855         dist_checker = spawn ();\r
856         dist_checker.classname = "timer";\r
857         dist_checker.owner = self;\r
858         dist_checker.enemy = gun;\r
859         dist_checker.think = CheckDistance;\r
860         dist_checker.nextthink = (time + 0.3);\r
861 };\r
862 \r
863 void () button_fire;\r
864 // Engineer and Medic "USE" function -- called when user presses a key bound to +use\r
865 // replaces using wrench on sentry gun and buiaxe to heal.\r
866 void () Use_Function =\r
867 {\r
868         local vector source;\r
869         local vector org;\r
870         local vector def;\r
871         local float healam;\r
872         local entity te;\r
873 \r
874         makevectors (self.v_angle);\r
875         source = (self.origin + '0 0 16');\r
876         traceline (source, (source + (v_forward * 64)), 0.000000, self);\r
877         if ((trace_fraction == 1))\r
878         {\r
879                 return;\r
880         }\r
881         org = (trace_endpos - (v_forward * 4));\r
882         if ((trace_ent.goal_activation & 8))\r
883         {\r
884                 if (Activated (trace_ent, self))\r
885                 {\r
886                         DoResults (trace_ent, self, 1);\r
887                         if ((trace_ent.classname == "func_button"))\r
888                         {\r
889                                 trace_ent.enemy = self;\r
890                                 other = self;\r
891                                 self = trace_ent;\r
892                                 self.dont_do_triggerwork = 1;\r
893                                 button_fire ();\r
894                                 self = other;\r
895                         }\r
896                 }\r
897                 else\r
898                 {\r
899                         if ((trace_ent.else_goal != 0.000000))\r
900                         {\r
901                                 te = Findgoal (trace_ent.else_goal);\r
902                                 if (te)\r
903                                 {\r
904                                         DoResults (te, self, (trace_ent.goal_result & 2));\r
905                                 }\r
906                         }\r
907                         else\r
908                         {\r
909                                 sound (self, 1, "player/axhit2.wav", 1, 1);\r
910                                 WriteByte (4, 23);\r
911                                 WriteByte (4, 2);\r
912                                 WriteByte (4, 3);\r
913                                 WriteCoord (4, org_x);\r
914                                 WriteCoord (4, org_y);\r
915                                 WriteCoord (4, org_z);\r
916                         }\r
917                 }\r
918                 return;\r
919         }\r
920 //      if (trace_ent.takedamage)\r
921         if (trace_ent.classname != "player")\r
922         {\r
923                 if ((trace_ent.classname == "building_dispenser"))\r
924                 {\r
925                         //Engineer_UseDispenser (trace_ent);\r
926                         return;\r
927                 }\r
928                 else\r
929                 {\r
930                         if ((trace_ent.classname == "building_sentrygun"))\r
931                         {\r
932                                 //Engineer_UseSentryGun (trace_ent);\r
933                                 return;\r
934                         }\r
935                         else\r
936                         {\r
937                                 if ((trace_ent.classname == "building_sentrygun_base"))\r
938                                 {\r
939                                         if (trace_ent.oldenemy)\r
940                                         {\r
941                                                 //Engineer_UseSentryGun (trace_ent.oldenemy);\r
942                                         }\r
943                                         return;\r
944                                 }\r
945                                 else\r
946                                 {\r
947                                         if ((trace_ent.classname == "building_tesla"))\r
948                                         {\r
949                                                 Engineer_UseTesla (trace_ent);\r
950                                                 return;\r
951                                         }\r
952                                 }\r
953                         }\r
954                 }\r
955         }\r
956 };