]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/engineer.c
git-svn-id: svn://svn.icculus.org/nexuiz/trunk@767 f962a42d-fe04-0410-a3ab-8c8b0445ebaa
[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 // move to tfdefs:\r
15 void () TeamFortress_FinishedBuilding;\r
16 void () lvl1_sentry_stand;\r
17 void (float tno, entity ignore, string st) teamsprint;\r
18 .entity real_owner;\r
19 .entity oldenemy;\r
20 .float current_weapon;\r
21 .float waitmin;\r
22 .float waitmax;\r
23 .void(entity attacker, float damage) th_pain;\r
24 \r
25 //temp\r
26 void (entity bld) CheckBelowBuilding;\r
27 void (entity gunhead) CheckSentry;\r
28 void () Sentry_Rotate;\r
29 float () Sentry_FindTarget;\r
30 void () Sentry_FoundTarget;\r
31 void () Sentry_HuntTarget;\r
32 void () Sentry_Pain;\r
33 void () Sentry_Die;\r
34 \r
35 void EngineerSpecial()\r
36 {\r
37         //      sprint(self, "Not done yet\n"); \r
38         // this is gonna contain build menu eventually\r
39 };\r
40 \r
41 /*==========================\r
42  TF Engineer Build Function\r
43  =========================*/\r
44 void(entity gunhead) CheckSentry = \r
45 {\r
46         local vector dist;\r
47         local entity gunbase;\r
48         gunbase = gunhead.trigger_field;\r
49         dist = gunbase.origin - gunhead.origin;\r
50         if (vlen(dist) > 15)\r
51         {\r
52                 bprint(self.real_owner.netname);\r
53                 bprint("'s sentry gun malfunctioned\n");\r
54                 Sentry_Die();\r
55         }\r
56 };\r
57 \r
58 void () TeamFortress_EngineerBuild =\r
59 {\r
60         local entity te;\r
61 \r
62         if ((self.is_building == 0))\r
63         {\r
64 //              if ((((self.ammo_cells < 100) && (self.has_dispenser == 0)) && (self.has_sentry == 0)))\r
65 //              {\r
66 //                      CenterPrint (self, "You don't have enough metal to \nbuild anything.\n\n");\r
67 //                      return;\r
68 //              }\r
69                 self.current_menu = 15;\r
70                 self.menu_count = 25;\r
71         }\r
72         else\r
73         {\r
74                 if ((self.is_building == 1))\r
75                 {\r
76                         sprint (self, "You stop building.\n");\r
77 \r
78                         if (self.weaponentity.pos1 != '0 0 0')\r
79                         {\r
80 //                              self.reload_time = time;\r
81                                 self.weaponentity.pos1 = '0 0 0';\r
82                                 self.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED;\r
83                         }\r
84 \r
85                         self.pausetime = 0;\r
86                         self.tfstate = (self.tfstate - (self.tfstate & 65536));\r
87                         TeamFortress_SetSpeed (self);\r
88                         te = find (world, netname, "build_timer");\r
89                         while (te)\r
90                         {\r
91                                 if ((te.owner == self))\r
92                                 {\r
93                                         dremove (te);\r
94                                         te = world;\r
95                                 }\r
96                                 else\r
97                                 {\r
98                                         te = find (te, netname, "build_timer");\r
99                                 }\r
100                         }\r
101                         self.is_building = 0;\r
102 //                      self.current_weapon = self.weapon;              // add function to make weapon disappear?\r
103                         W_SetCurrentAmmo ();\r
104                 }\r
105         }\r
106 };\r
107 \r
108 float(entity obj, entity builder) CheckArea = \r
109 {\r
110         local vector src;\r
111         local vector end;\r
112         local float pos;\r
113         pos = pointcontents(obj.origin);\r
114         if (pos == -2 || pos == -6)\r
115         {\r
116                 return 0;\r
117         }\r
118         src_x = obj.origin_x + obj.maxs_x + 16;\r
119         src_y = obj.origin_y + obj.maxs_y + 16;\r
120         src_z = obj.origin_z + obj.maxs_z + 16;\r
121         pos = pointcontents(src);\r
122         if (pos == -2 || pos == -6)\r
123         {\r
124                 return 0;\r
125         }\r
126         end_x = obj.origin_x + obj.mins_x - 16;\r
127         end_y = obj.origin_y + obj.mins_y - 16;\r
128         end_z = obj.origin_z + obj.mins_z - 16;\r
129         traceline(src, end, 1, obj);\r
130         if (trace_fraction != 1)\r
131         {\r
132                 return 0;\r
133         }\r
134         pos = pointcontents(end);\r
135         if (pos == -2 || pos == -6)\r
136         {\r
137                 return 0;\r
138         }\r
139         src_x = obj.origin_x + obj.mins_x - 16;\r
140         src_y = obj.origin_y + obj.maxs_y + 16;\r
141         src_z = obj.origin_z + obj.maxs_z + 16;\r
142         pos = pointcontents(src);\r
143         if (pos == -2 || pos == -6)\r
144         {\r
145                 return 0;\r
146         }\r
147         end_x = obj.origin_x + obj.maxs_x + 16;\r
148         end_y = obj.origin_y + obj.mins_y - 16;\r
149         end_z = obj.origin_z + obj.mins_z - 16;\r
150         traceline(src, end, 1, obj);\r
151         if (trace_fraction != 1)\r
152         {\r
153                 return 0;\r
154         }\r
155         pos = pointcontents(end);\r
156         if (pos == -2 || pos == -6)\r
157         {\r
158                 return 0;\r
159         }\r
160         traceline(builder.origin, obj.origin, 1, builder);\r
161         if (trace_fraction != 1)\r
162         {\r
163                 return 0;\r
164         }\r
165         return 1;\r
166 };\r
167 \r
168 void(float objtobuild) TeamFortress_Build = \r
169 {\r
170         if (self.is_building == 1) {    // double-checks incase someone uses code with TeamFortress_EngineerBuild(number)\r
171                 TeamFortress_EngineerBuild();\r
172                 return;\r
173         }\r
174         if ((self.reload_time + .25) > time) { \r
175                 sprint(self, "You cant build while reloading.\n");\r
176                 return; \r
177         }\r
178 \r
179         local float btime;\r
180         local entity te;\r
181         local vector tmp1;\r
182         local vector tmp2;\r
183         newmis = spawn();\r
184         makevectors(self.v_angle);\r
185         v_forward_z = 0;\r
186         v_forward = normalize(v_forward) * 64;\r
187         newmis.origin = self.origin + v_forward;\r
188         if (objtobuild == 1)\r
189         {\r
190                 if (self.has_dispenser)\r
191                 {\r
192                         sprint(self, "You can only have one dispenser.\nTry dismantling your old one.\n");\r
193                         return;\r
194                 }\r
195                 tmp1 = '-16 -16 0';\r
196                 tmp2 = '16 16 24';\r
197                 newmis.mdl = "progs/dispencr.mdl";\r
198                 newmis.netname = "dispenser";\r
199                 btime = time + 2;\r
200         }\r
201         else\r
202         {\r
203                 if (objtobuild == 2)\r
204                 {\r
205                         if (self.has_sentry)\r
206                         {\r
207                                 sprint(self, "You can only have one sentry gun.\nTry dismantling your old one.\n");\r
208                                 return;\r
209                         }\r
210                         tmp1 = '-16 -16 0';\r
211                         tmp2 = '16 16 48';\r
212 //                      newmis.mdl = "progs/turrbase.mdl";\r
213                         newmis.mdl = "models/sentry/turr1_base.md3";\r
214 //                      newmis.scale = .75;\r
215                         newmis.netname = "sentrygun";\r
216 //                      btime = time + 5;\r
217                         btime = .1;\r
218                 }\r
219                 if ((objtobuild == 3))\r
220                 {\r
221                         if (self.has_tesla)\r
222                         {\r
223                                 sprint (self, "You can only have one tesla gun\n");\r
224                                 return;\r
225                         }\r
226                         tmp1 = '-16 -16 0';\r
227                         tmp2 = '16 16 48';\r
228                         newmis.mdl = "models/engineer/tesla/tesla.md3";\r
229                         newmis.scale = .70;                     //temp -- morphed's models too freaking huge :x\r
230 \r
231                         newmis.netname = "tesla";\r
232                         btime = (time + 6);\r
233                 }\r
234 // Begin telepad 1\r
235                 if (objtobuild == 5)\r
236                 {\r
237                         if (self.has_teleporter >= 2)\r
238                         {\r
239                                 sprint(self, "You can only have 2 teleporters.\nTry dismantling an old one.\n");\r
240                  dremove(newmis);\r
241                                 return;\r
242                         }\r
243                         tmp1 = '-16 -16 0';\r
244                         tmp2 = '16 16 4';\r
245                         newmis.mdl = "progs/telepad.mdl";\r
246                         newmis.netname = "teleporter";\r
247         \r
248                         btime = time + 3;\r
249                 }\r
250 // End telepad 1\r
251         }\r
252         if (CheckArea(newmis, self) == 0)\r
253         {\r
254                 sprint(self, "Not enough room to build here\n");\r
255                 dremove(newmis);\r
256                 return;\r
257         }\r
258         self.is_building = 1;\r
259         self.immune_to_check = time + 10;\r
260 //      self.maxspeed = 0;                      // make sure player cant move\r
261         self.tfstate = self.tfstate | 65536;\r
262 /*      self.weapon = self.current_weapon;              // get rid of player's weapon model\r
263         self.current_weapon = 0;\r
264         self.weaponmodel = "";\r
265         self.weaponframe = 0;*/\r
266 //      TeamFortress_SetSpeed(self);                    // hmm? player cant move?\r
267         newmis.owner = self;\r
268         newmis.classname = "timer";\r
269         newmis.netname = "build_timer";\r
270         newmis.nextthink = btime;\r
271         newmis.think = TeamFortress_FinishedBuilding;\r
272         newmis.colormap = self.colormap;\r
273         newmis.weapon = objtobuild;\r
274         newmis.angles_y = anglemod(self.angles_y + 180);\r
275         newmis.velocity = '0 0 8';\r
276         newmis.movetype = 6;\r
277         newmis.solid = 2;\r
278         setmodel(newmis, newmis.mdl);\r
279         setsize(newmis, tmp1, tmp2);\r
280         setorigin(newmis, newmis.origin);\r
281         newmis.flags = newmis.flags - (newmis.flags & 512);\r
282 \r
283         self.velocity = '0 0 0';                // stop player movement\r
284         DoReload (5, (btime - time));           // Engineer build function shared with reload one\r
285                                                                                 // 5 is for building, btime minus time is for build time\r
286 };\r
287 \r
288 void(entity bld) CheckBelowBuilding = \r
289 {\r
290         local vector below;\r
291         below = bld.origin;\r
292         if (bld.classname == "detpack")\r
293         {\r
294                 below_z = below_z - 8;\r
295         }\r
296         else\r
297         {\r
298                 below_z = below_z - 24;\r
299         }\r
300         traceline(bld.origin, below, 1, bld);\r
301         if (trace_fraction == 1)\r
302         {\r
303                 bld.movetype = 6;\r
304                 bld.flags = bld.flags - (bld.flags & 512);\r
305         }\r
306 };\r
307 \r
308 void () Tesla_Animate;\r
309 void() TeamFortress_FinishedBuilding = \r
310 {\r
311         local entity oldself;\r
312         local vector source;\r
313 \r
314         if (self.owner.is_building != 1)\r
315         {\r
316                 return;\r
317         }\r
318         oldself = self;\r
319         self = self.owner;\r
320         oldself.owner = world;\r
321         oldself.real_owner = self;\r
322         self.is_building = 0;\r
323         self.tfstate = self.tfstate - (self.tfstate & 65536);\r
324         self.current_weapon = self.weapon;\r
325         self.StatusRefreshTime = time + 0.1;\r
326         TeamFortress_SetSpeed(self);\r
327 /*      if (oldself.weapon == 1)\r
328         {\r
329                 self.has_dispenser = 1;\r
330                 sprint(self, "You finish building the dispenser.\n");\r
331                 teamsprint(self.team_no, self, self.netname);\r
332                 teamsprint(self.team_no, self, " has built a Dispenser.\n");\r
333                 self.ammo_cells = self.ammo_cells - 100;\r
334                 oldself.classname = "building_dispenser";\r
335                 oldself.netname = "dispenser";\r
336                 oldself.blocked = T_Dispenser;\r
337                 oldself.touch = T_Dispenser;\r
338                 oldself.max_health = 150;\r
339                 oldself.health = 150;\r
340                 oldself.think = DispenserThink;\r
341                 oldself.nextthink = time + 5;\r
342                 oldself.th_die = Dispenser_Die;\r
343                 oldself.mdl = "progs/dispencr.mdl";\r
344                 oldself.team_no = self.team_no;\r
345                 oldself.real_owner = self;\r
346                 oldself.colormap = self.colormap;\r
347                 oldself.takedamage = 2;\r
348                 oldself.owner = world;\r
349                 oldself.movetype = 6;\r
350                 oldself.velocity = '0 0 8';\r
351                 oldself.flags = oldself.flags - (oldself.flags & 512);\r
352                 oldself.ammo_shells = ceil(self.ammo_shells * 0.25);\r
353                 oldself.ammo_nails = ceil(self.ammo_nails * 0.25);\r
354                 oldself.ammo_rockets = ceil(self.ammo_rockets * 0.25);\r
355                 oldself.ammo_cells = ceil(self.ammo_cells * 0.25);\r
356                 oldself.armorvalue = ceil(self.armorvalue * 0.25);\r
357                 self.ammo_shells = ceil(self.ammo_shells * 0.75);\r
358                 self.ammo_nails = ceil(self.ammo_nails * 0.75);\r
359                 self.ammo_rockets = ceil(self.ammo_rockets * 0.75);\r
360                 self.ammo_cells = ceil(self.ammo_cells * 0.75);\r
361                 self.armorvalue = ceil(self.armorvalue * 0.75);\r
362                 oldself.solid = 2;\r
363                 setmodel(oldself, oldself.mdl);\r
364                 //setsize(oldself, '-8 -8 0', '8 8 24');gold. commented out.. plexi's idea :j\r
365                 setorigin(oldself, oldself.origin);\r
366         }\r
367         else\r
368         {*/\r
369                 if (oldself.weapon == 2)\r
370                 {\r
371                         local entity barrel;\r
372                         barrel = spawn();\r
373 //                      barrel.mdl = "models/sentry/turr1_base.md3";\r
374 //                      barrel.mdl = "models/sentry/turr1_barrel.md3";\r
375 //                      barrel.scale = .75;\r
376                         //barrel.solid = 2;\r
377 \r
378 //                      barrel.angles_x = barrel.angles_x - 70;\r
379 \r
380 //                      barrel.angles_z = barrel.angles_z - 90;\r
381 /*                      barrel.angles_x = 0;\r
382                         barrel.angles_y = oldself.angles_y;\r
383                         barrel.angles_z = 0;*/\r
384 //                      barrel.movetype = 4;\r
385 //                      barrel.movetype = MOVETYPE_FOLL`OW;\r
386                         barrel.yaw_speed = 10;\r
387 //                      barrel.angles_z = barrel.angles_z - 45;\r
388                         setmodel(barrel, "models/sentry/turr1_barrel.md3");\r
389 //                      setsize(barrel, '-16 -16 0', '16 16 48');               // temp //'d\r
390 //                      setorigin(barrel, oldself.origin + '0 0 8');\r
391                         setorigin(barrel, '0 0 0');\r
392                         \r
393 \r
394                         self.has_sentry = 1;\r
395                         sprint(self, "You finish building the sentry gun.\n");\r
396                         teamsprint(self.team_no, self, self.netname);\r
397                         teamsprint(self.team_no, self, " has built a Sentry Gun.\n");\r
398                         oldself.classname = "building_sentrygun_base";\r
399                         oldself.netname = "sentry gun";\r
400                         oldself.takedamage = 0;\r
401                         oldself.th_die = Sentry_Die;\r
402                         self.ammo_cells = self.ammo_cells - 130;\r
403                         setsize(oldself, '-16 -16 0', '16 16 4');\r
404                         newmis = spawn();\r
405                         newmis.classname = "building_sentrygun";\r
406                         newmis.health = 150;\r
407                         newmis.max_health = newmis.health;\r
408                         newmis.weapon = 1;\r
409                         newmis.th_die = Sentry_Die;\r
410                         newmis.th_pain = Sentry_Pain;\r
411 //                      newmis.mdl = "progs/turrgun.mdl";\r
412                         newmis.mdl = "models/sentry/turr1_body.md3";\r
413 //                      newmis.scale = .75;\r
414                         sound(oldself, 3, "weapons/tnkatck4.wav", 1, 1);\r
415                         newmis.solid = 2;\r
416                         setmodel(newmis, newmis.mdl);\r
417                         setsize(newmis, '-16 -16 0', '16 16 48');\r
418                         setorigin(newmis, oldself.origin + '0 0 8');\r
419                         newmis.real_owner = oldself.real_owner;\r
420                         newmis.trigger_field = oldself;\r
421                         oldself.oldenemy = newmis;\r
422                         newmis.movetype = 4;\r
423                         oldself.colormap = self.colormap;\r
424                         newmis.colormap = self.colormap;\r
425                         newmis.takedamage = 2;\r
426                         newmis.velocity = '0 0 -8';\r
427                         newmis.flags = newmis.flags - (newmis.flags & 512);\r
428                         oldself.flags = oldself.flags - (oldself.flags & 512);\r
429                         newmis.team_no = self.team_no;\r
430                         newmis.think = lvl1_sentry_stand;\r
431                         newmis.nextthink = time + 0.5;\r
432                         newmis.yaw_speed = 10;\r
433                         newmis.heat = 0;\r
434                         newmis.angles_x = 0;\r
435 //                      newmis.angles_y = oldself.angles_y;\r
436                         newmis.angles_y = oldself.angles_y;\r
437                         newmis.angles_z = 0;\r
438                         newmis.waitmin = anglemod(newmis.angles_y - 50);\r
439                         newmis.waitmax = anglemod(newmis.angles_y + 50);\r
440                         if (newmis.waitmin > newmis.waitmax)\r
441                         {\r
442                                 newmis.waitmin = newmis.waitmax;\r
443                                 newmis.waitmax = anglemod(newmis.angles_y - 50);\r
444                         }\r
445                         newmis.ammo_shells = 25;\r
446                         newmis.maxammo_shells = 100;\r
447                         newmis.maxammo_rockets = 20;\r
448 \r
449                         newmis.barrel_ent = barrel;\r
450 \r
451 //                      setattachment(newmis, oldself, "tag_base_body");\r
452                         setattachment(barrel, newmis, "tag_body_barrel");\r
453 \r
454 \r
455                 }\r
456                 else\r
457                 {\r
458 //tesla\r
459                         if ((oldself.weapon == 3))\r
460                         {\r
461                                 self.has_tesla = 1;\r
462                                 sprint (self, "You finish building the tesla coil.\n");\r
463                                 oldself.real_owner = self;\r
464                                 teamsprint (self.team_no, self, self.netname);\r
465                                 teamsprint (self.team_no, self, " has built a tesla.\n");\r
466                                 sound (oldself, 3, "weapons/guerilla_set.wav", 1, 1);\r
467                                 oldself.classname = "building_tesla";\r
468                                 oldself.netname = "tesla";\r
469                                 oldself.takedamage = 2;\r
470                                 oldself.solid = 2;\r
471                                 oldself.th_die = Tesla_Die;\r
472                                 oldself.th_pain = Tesla_Pain;\r
473                                 self.ammo_cells = (self.ammo_cells - 150);\r
474                                 oldself.health = 200;\r
475                                 oldself.movetype = 6;\r
476                                 oldself.colormap = self.colormap;\r
477                                 oldself.velocity = '0 0 -8';\r
478                                 oldself.avelocity = '0 0 0';\r
479                                 oldself.flags = (oldself.flags - (oldself.flags & 512));\r
480                                 oldself.team_no = self.team_no;\r
481                                 oldself.think = Tesla_Idle;\r
482                                 oldself.nextthink = (time + 2);\r
483                                 oldself.touch = Tesla_Touch;\r
484                                 oldself.enemy = world;\r
485                                 oldself.maxammo_shells = 0;\r
486                                 oldself.maxammo_nails = 0;\r
487                                 oldself.maxammo_rockets = 0;\r
488                                 oldself.max_health = 100;\r
489                                 oldself.ammo_cells = 50;\r
490                                 oldself.tf_items = 0;\r
491                                 /*if (!(self.weapons_carried & 8))\r
492                                 {\r
493                                         oldself.ammo_shells = 2;\r
494                                         oldself.ammo_nails = 2;\r
495                                         oldself.ammo_rockets = 1;\r
496                                         oldself.currentammo = 5;\r
497                                         oldself.max_health = 200;\r
498                                         oldself.ammo_cells = 120;\r
499                                 }*/\r
500                                 oldself.currentammo = 0;                // 6 Upgrades. (6 minus this number is pgrade count)\r
501                                 oldself.health = oldself.max_health;\r
502                                 oldself.waitmin = ((oldself.ammo_shells + 2) * (oldself.ammo_nails + 2));\r
503                                 oldself.waitmax = 0;\r
504 \r
505                                 // The tesla animater -- till I learn to be a better coder ;)\r
506                                 local entity tesanim;\r
507                                 tesanim = spawn();\r
508                                 tesanim.owner = oldself;\r
509                                 tesanim.think = Tesla_Animate;\r
510                                 tesanim.nextthink = oldself.nextthink;\r
511                         }\r
512 // TELEPAD 2 BEGIN*/ \r
513         /*if (oldself.weapon == 5)\r
514         {\r
515                 self.has_teleporter = (self.has_teleporter + 1);\r
516                 sprint (self, "You finish building the Teleporter Pad.\n");\r
517 \r
518 //        teamprefixsprint(self.team_no,self); //- OfN\r
519 \r
520         teamsprint(self.team_no, self, self.netname);\r
521                 teamsprint(self.team_no, self, " has built a Teleporter Pad.\n");\r
522                 sound (oldself, 3, "weapons/guerset.wav", 1, 1);\r
523 \r
524                 self.ammo_cells = self.ammo_cells - 90;\r
525 \r
526                 // Create the teleporter\r
527                 oldself.classname = "building_teleporter";\r
528                 oldself.netname = "teleporter";\r
529 //              oldself.blocked = Teleporter_touch;             // Actual touch function\r
530                 oldself.touch = Teleporter_touch;\r
531                 oldself.max_health = 300;\r
532                 oldself.health = 300;\r
533                 oldself.th_die = Teleporter_Die;                // Death function\r
534                 oldself.mdl = "progs/telepad.mdl";              // Actual mdl\r
535                 oldself.team_no = self.team_no;\r
536                 oldself.maxammo_cells = 200;    //CH Max of 20 teleports\r
537                 oldself.ammo_cells = 100;       //CH start not at full\r
538 \r
539                 oldself.real_owner = self;                      // The Engineer owns this item\r
540                 oldself.colormap = self.colormap;       // Set the Color\r
541                 oldself.takedamage = 2;\r
542                 oldself.owner = world;\r
543                 oldself.movetype = 6;\r
544                 oldself.velocity = '0 0 8';\r
545                 oldself.flags = oldself.flags - (oldself.flags & 512);\r
546 \r
547                 oldself.solid = 2;\r
548                 setmodel(oldself, oldself.mdl);\r
549                 setsize (oldself, '-16 -16 0', '16 16 4');\r
550                 setorigin(oldself, oldself.origin + '0 0 8'); //CH does jump\r
551 \r
552                 oldself.heat = 4; //dont come on for 4 seconds\r
553                 oldself.think = Teleporter_heat_think;\r
554                 oldself.nextthink = time + 1;\r
555                 oldself.spawnflags = 4; //CH cause extensive checks for height\r
556 \r
557                 oldself.is_malfunctioning = 0;\r
558                 oldself.all_active=0; // OfN - reset HACKER improvements\r
559                 }\r
560 // TELEPAD 2 END\r
561                 }*/\r
562         }\r
563         W_SetCurrentAmmo();\r
564 };\r
565 \r
566 \r
567 \r
568 \r
569 \r
570 void () Drop_Magnetic_Mine =\r
571 {\r
572         if (self.has_mine == 1)\r
573         {\r
574                 sprint (self, "Hey, one mine at a time!\n");\r
575                 return;\r
576         }\r
577 \r
578         local entity item;\r
579 \r
580         item = spawn ();\r
581         item.team_no = self.team_no;\r
582         item.owner = self;\r
583         item.classname = "drop1";\r
584         item.origin = (self.origin - '0 0 -10');\r
585 \r
586 //      item.angles_x = 360;\r
587 \r
588         item.angles_y = 45;\r
589         item.flags = 256;\r
590 //      item.solid = 2;\r
591         item.solid = SOLID_TRIGGER;\r
592         item.movetype = 6;\r
593 \r
594         item.velocity = '0 0 1';\r
595         setsize (item, '-1 -1 0', '1 1 6');\r
596 \r
597         item.nextthink = (time + 180);\r
598 \r
599         item.touch = MagnetMineTouch;\r
600         setmodel (item, "models/magmine/magnetmine.md3");\r
601         item.scale = .35;\r
602 \r
603         item.think = RemoveMagnetMine;\r
604 \r
605         item.pausetime = time + 2;\r
606         self.has_mine = 1;\r
607         sprint(self, "You set a Mag Mine!\n");\r
608 }\r
609 \r
610 void EngineerGrenade(float req)\r
611 {\r
612         if(req == WR_GRENADE1)\r
613         {\r
614                 if(W_ThrowGrenade(W_ArmorGrenade))\r
615                         self.grenade_time = time + cvar("g_balance_grenade_armor_refire");\r
616         }\r
617         else if(req == WR_GRENADE2)\r
618         {\r
619                 Drop_Magnetic_Mine();\r
620                 self.grenade_time = time + 2;\r
621         }\r
622 }\r
623 \r
624 void EngineerPreThink()\r
625 {\r
626 }\r
627 \r
628 void EngineerPostThink()\r
629 {\r
630 }\r
631 \r
632 void BecomeEngineer(float portion)\r
633 {\r
634         self.max_health = cvar("g_balance_class_engineer_health") * portion;\r
635 \r
636         self.max_armor = cvar("g_balance_class_engineer_armor") * portion;\r
637 \r
638         self.mass = cvar("g_balance_class_engineer_mass");\r
639 \r
640         SetPlayerSpeed(self);\r
641 \r
642         self.items = IT_WEP1 | IT_WEP2 | IT_WEP3 | IT_WEP4;\r
643         self.switchweapon = WEP2;\r
644         self.ammo_shells = floor(20 * portion);\r
645         self.ammo_nails = floor(20 * portion);\r
646         self.ammo_rockets = floor(1 * portion);\r
647         self.ammo_cells = floor(0 * portion);\r
648         self.playerclass = 9;           // TF P.C.\r
649         SetMaxAmmoFor (32);\r
650 }\r
651 \r
652 // Magnetic Mine\r
653 void () RemoveMagnetMine =\r
654 {\r
655         sprint (self.owner, "Your Mag Mine is gone...\n");\r
656         self.owner.has_mine = 0;\r
657         dremove (self);\r
658         return;\r
659 };\r
660 \r
661 void () MagTimer =\r
662 {\r
663         local entity theowner;\r
664         local string st;\r
665 \r
666         theowner = self.owner;\r
667         theowner.option5 = (theowner.option5 - .5);\r
668         st = ftos (theowner.option5);\r
669 //      sound (theowner, 0, "ambient/100hzhum.wav", 1, 1);              // find new wav! :o\r
670         theowner.origin = self.origin;\r
671         CenterPrint2 (theowner, "You are stuck on a mag mine!\n", st);\r
672         if ((theowner.option5 < 2))\r
673         {\r
674                 theowner.option5 = 0;\r
675                 sprint (theowner.enemy, "Your Mag Mine died...\n");\r
676                 theowner.enemy.has_mine = 0;\r
677                 remove (self);\r
678                 return;\r
679         }\r
680         self.nextthink = (time + .5);\r
681 };\r
682 \r
683 void () MagMineActivate =\r
684 {\r
685         if ((other.option == 0))\r
686         {\r
687                 self.owner.has_mine = 1;\r
688                 newmis = spawn ();\r
689                 newmis.classname = "timer";\r
690                 newmis.netname = " FlashTimer";\r
691                 newmis.team_no = self.owner.team_no;\r
692                 newmis.owner = other;\r
693                 other.enemy = self.owner;\r
694                 newmis.think = MagTimer;\r
695                 newmis.nextthink = (time + 1);\r
696                 newmis.origin = other.origin;\r
697         }\r
698         other.option5 = (floor ((other.armorvalue * .25)) + 3);\r
699         if ((other.option5 > 15))\r
700         {\r
701                 other.option5 = 15;\r
702         }\r
703 };\r
704 \r
705 void () RemoveDudMine =\r
706 {\r
707         dremove(self);\r
708 }\r
709 \r
710 void () MagnetMineTouch =\r
711 {\r
712         local float isgood;\r
713         local entity isnearplayer;\r
714         \r
715         isnearplayer = findradius (self.origin, 10);\r
716         while (isnearplayer)\r
717         {\r
718                 if ((isnearplayer.classname == "player"))\r
719                 {\r
720                         isgood = 1;\r
721 //                      bprint (isnearplayer.classname);\r
722 //                      bprint ("\n");\r
723 //                      return;\r
724                 }\r
725                 isnearplayer = isnearplayer.chain;\r
726         }\r
727         if (isgood != 1)\r
728                 return;\r
729 \r
730         if ((self.pausetime > time))\r
731         {\r
732                 return;\r
733         }\r
734         if ((other.classname != "player"))\r
735         {\r
736                 return;\r
737         }\r
738         if ((other.health <= 0))\r
739         {\r
740                 return;\r
741         }\r
742 //      if ((other.is_undercover == 1))         //temp  - add function!!\r
743 //      {\r
744 //              return;\r
745 //      }\r
746         if ((other.team_no == self.owner.team_no))\r
747         {\r
748                 return;\r
749         }\r
750         if ((other.classname == "player"))\r
751         {\r
752                 MagMineActivate ();\r
753                 sprint (other, "You stepped on a Magnetic Mine! :(\n");\r
754                 sprint (self.owner, "Your Magnet Mine worked!\n");\r
755                 self.pausetime = (time + 5);\r
756         }\r
757         self.touch = SUB_NULL;\r
758         self.effects = EF_BRIGHTFIELD | EF_ADDITIVE;\r
759         self.think = RemoveDudMine;\r
760         self.nextthink = (time + 15);\r
761 //      dremove (self);\r
762 };