]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/tfmapitems.c
- Feigning spy throws grenade on feign and also cannot get up when someone is on...
[divverent/nexuiz.git] / TeamNexuiz / game / gamec / tfmapitems.c
1 /****************\r
2         XavioR's Team Fortress Map Entities conversion\r
3                                                 ************/\r
4 /*\r
5 // Things needed to be added (probably):\r
6 prematch\r
7 */\r
8 \r
9 // Goal stuff\r
10 \r
11 \r
12 .float if_item_has_moved;\r
13 .float if_item_hasnt_moved;\r
14 .float remove_spawnpoint;\r
15 .float restore_spawnpoint;\r
16 .float remove_spawngroup;\r
17 .float restore_spawngroup;\r
18 .float display_item_status1;\r
19 .float display_item_status2;\r
20 .float display_item_status3;\r
21 .float display_item_status4;\r
22 .string team_str_home;\r
23 .string team_str_moved;\r
24 .string team_str_carried;\r
25 .string non_team_str_home;\r
26 .string non_team_str_moved;\r
27 .string non_team_str_carried;\r
28 .float ex_skill_min;\r
29 .float ex_skill_max;\r
30 .float increase_team1;\r
31 .float increase_team2;\r
32 .float increase_team3;\r
33 .float increase_team4;\r
34 \r
35 \r
36 // Temp defs that need to be moved to TFDefs\r
37 .string broadcast;\r
38 .string team_broadcast;\r
39 .string non_team_broadcast;\r
40 .string owners_team_broadcast;\r
41 .string netname_broadcast;\r
42 .string netname_team_broadcast;\r
43 .string netname_non_team_broadcast;\r
44 .string netname_owners_team_broadcast;\r
45 .string team_drop;\r
46 .string non_team_drop;\r
47 .string netname_team_drop;\r
48 .string netname_non_team_drop;\r
49 string team_menu_string/*    = ""*/;\r
50 .float all_active;\r
51 .float item_list;\r
52 float item_list_bit;\r
53 .float delay_time;\r
54 .float dont_do_triggerwork;\r
55 .float g_a;\r
56 .float g_e;\r
57 .string t_s_h;\r
58 .string t_s_m;\r
59 .string t_s_c;\r
60 .string n_s_h;\r
61 .string n_s_m;\r
62 .string n_s_c;\r
63 .string b_b;\r
64 .string b_t;\r
65 .string b_n;\r
66 .string b_o;\r
67 .string n_b;\r
68 .string n_t;\r
69 .string n_n;\r
70 .string n_o;\r
71 .string d_t;\r
72 .string d_n;\r
73 .string d_n_t;\r
74 .string d_n_n;\r
75 \r
76 // Temp defs that need functions\r
77 float prematch;\r
78 \r
79 \r
80 .float h_i_g, r_i_g, a_s, a_n, a_r, a_c, rv_s_h, rs_s_h, rv_gr, rs_gr, rs_g;\r
81 .float rv_g;\r
82 .vector goal_min, goal_max;\r
83 \r
84 // Prototypes\r
85 // Team Functions\r
86 void(float tno, float scoretoadd) TeamFortress_TeamIncreaseScore;\r
87 void(float all) TeamFortress_TeamShowScores;\r
88 float() TeamFortress_TeamGetWinner;\r
89 \r
90 // Functions to handle entity placement when spawned\r
91 void() TF_PlaceItem;\r
92 void() TF_StartItem;\r
93 void() TF_PlaceGoal;\r
94 void() TF_StartGoal;\r
95 \r
96 // Spawn functions for all Map Entities\r
97 float() CheckExistence;\r
98 void() info_tfdetect;\r
99 void() info_player_teamspawn;\r
100 void() info_tfgoal;\r
101 void() info_tfgoal_timer;\r
102 void() item_tfgoal;\r
103 \r
104 // AutoDetection Function\r
105 void(entity AD) ParseTFDetect;\r
106 \r
107 // Generic Functions\r
108 entity(float ino) Finditem;\r
109 entity(float gno) Findgoal;\r
110 entity(float gno) Findteamspawn;\r
111 void(entity Goal) InactivateGoal;\r
112 void(entity Goal) RestoreGoal;\r
113 void(entity Goal) RemoveGoal;\r
114 float(entity Goal, entity Player, entity AP) IsAffectedBy;\r
115 //void(entity Goal, entity Player, entity AP, float addb) Apply_Results;\r
116 //float(entity Goal, entity AP) APMeetsCriteria;\r
117 void(entity Goal) SetupRespawn;\r
118 void() DoRespawn;\r
119 void(entity Goal, entity AP) DoGoalWork;\r
120 void(entity Goal, entity AP) DoGroupWork;\r
121 void(entity Item, entity AP) DoItemGroupWork;\r
122 void(entity Goal, entity AP) DoTriggerWork;\r
123 void(entity Goal, entity AP, float addb) DoResults;\r
124 //void(entity Goal, entity Player) RemoveResults;\r
125 \r
126 // Goal Functions\r
127 void() tfgoal_touch;\r
128 void() info_tfgoal_use;\r
129 \r
130 // Timer Goal Functions\r
131 void() tfgoal_timer_tick;\r
132 \r
133 // Item Functions\r
134 void() item_tfgoal_touch;\r
135 void(entity Item, entity AP, entity Goal) tfgoalitem_GiveToPlayer;\r
136 void(entity Item, entity AP, float method) tfgoalitem_RemoveFromPlayer;\r
137 void() tfgoalitem_remove;\r
138 void(entity Item) tfgoalitem_drop;\r
139 void(entity Item) tfgoalitem_checkgoalreturn;\r
140 void() ReturnItem;\r
141 void(entity Goal, entity Player, entity Item) DisplayItemStatus;\r
142 \r
143 // CTF Support Functions\r
144 void() CTF_FlagCheck;\r
145 \r
146 \r
147 void () TF_PlaceItem;\r
148 void () TF_StartItem;\r
149 void () TF_PlaceGoal;\r
150 void () TF_StartGoal;\r
151 //void () TF_PlaceCamp;\r
152 //void () TF_StartCamp;\r
153 void () info_tfdetect;\r
154 //void () info_tfnocamp;\r
155 void () info_player_teamspawn;\r
156 void () info_tfgoal;\r
157 void () info_tfgoal_timer;\r
158 void () item_tfgoal;\r
159 entity (float gno) Findgoal;\r
160 entity (float gno) Findteamspawn;\r
161 void (entity Goal) InactivateGoal;\r
162 void (entity Goal) RestoreGoal;\r
163 void (entity Goal) RemoveGoal;\r
164 float (entity Goal,entity Player,entity AP) IsAffectedBy;\r
165 void (entity Goal,entity Player,entity AP,float addb) Apply_Results;\r
166 float (entity Goal,entity AP) APMeetsCriteria;\r
167 void (entity Goal) SetupRespawn;\r
168 void () DoRespawn;\r
169 void (entity Item,entity AP) DoItemGroupWork;\r
170 void (entity Goal,entity AP) DoTriggerWork;\r
171 void (entity Goal,entity Player) RemoveResults;\r
172 void () info_tfgoal_use;\r
173 void () tfgoal_timer_tick;\r
174 void () item_tfgoal_touch;\r
175 void () tfgoalitem_remove;\r
176 void (entity Item) tfgoalitem_drop;\r
177 void (entity Item) tfgoalitem_checkgoalreturn;\r
178 void () ReturnItem;\r
179 \r
180 \r
181 void() MoveFlag = \r
182 {\r
183         if ( (prematch) )// && (self.owner.items & 131072) )\r
184         {\r
185                 T_Damage (self.owner, self.owner, self.owner, 500);\r
186         }\r
187 \r
188         makevectors(self.owner.v_angle);\r
189         setorigin(self, self.owner.origin - v_forward * 25 + '0 0 20');\r
190         self.angles_x = self.owner.angles_z;\r
191         self.angles_y = self.owner.angles_y + 90;\r
192         self.angles_z = 0 - self.owner.angles_x;\r
193         self.nextthink = time + 0.010000;\r
194         self.think = MoveFlag;\r
195         if (self.owner.deadflag)\r
196         {\r
197                 // pablo\r
198                 //self.movetype = 10;\r
199                 //self.velocity = '0 0 100';\r
200                 //\r
201                 self.owner.effects = self.owner.effects - (self.owner.effects & 128);\r
202                 self.owner.effects = self.owner.effects - (self.owner.effects & 64);\r
203                 dremove(self);\r
204         }\r
205         if (!(self.owner.items & 131072) && !(self.owner.items & 262144))\r
206         {\r
207                 self.owner.effects = self.owner.effects - (self.owner.effects & 128);\r
208                 self.owner.effects = self.owner.effects - (self.owner.effects & 64);\r
209                 dremove(self);\r
210         }\r
211 };\r
212 \r
213 void (entity Goal) UpdateAbbreviations =\r
214 {\r
215         if ((Goal.has_abbreviated == 0))\r
216         {\r
217                 if (((Goal.g_a != 0) && (Goal.goal_activation == 0)))\r
218                 {\r
219                         Goal.goal_activation = Goal.g_a;\r
220                 }\r
221                 if (((Goal.g_e != 0) && (Goal.goal_effects == 0)))\r
222                 {\r
223                         Goal.goal_effects = Goal.g_e;\r
224                 }\r
225                 if (((Goal.g_e != 0) && (Goal.goal_effects == 0)))\r
226                 {\r
227                         Goal.goal_effects = Goal.g_e;\r
228                 }\r
229                 if (((Goal.h_i_g != 0) && (Goal.has_item_from_group == 0)))\r
230                 {\r
231                         Goal.has_item_from_group = Goal.h_i_g;\r
232                 }\r
233                 if (((Goal.hn_i_g != 0) && (Goal.hasnt_item_from_group == 0)))\r
234                 {\r
235                         Goal.hasnt_item_from_group = Goal.hn_i_g;\r
236                 }\r
237                 if (((Goal.r_i_g != 0) && (Goal.remove_item_group == 0)))\r
238                 {\r
239                         Goal.remove_item_group = Goal.r_i_g;\r
240                 }\r
241                 if (((Goal.a_s != 0) && (Goal.ammo_shells == 0)))\r
242                 {\r
243                         Goal.ammo_shells = Goal.a_s;\r
244                 }\r
245                 if (((Goal.a_n != 0) && (Goal.ammo_nails == 0)))\r
246                 {\r
247                         Goal.ammo_nails = Goal.a_n;\r
248                 }\r
249                 if (((Goal.a_r != 0) && (Goal.ammo_rockets == 0)))\r
250                 {\r
251                         Goal.ammo_rockets = Goal.a_r;\r
252                 }\r
253                 if (((Goal.a_c != 0) && (Goal.ammo_cells == 0)))\r
254                 {\r
255                         Goal.ammo_cells = Goal.a_c;\r
256                 }\r
257                 if (((Goal.rv_s_h != 0) && (Goal.remove_spawngroup == 0)))\r
258                 {\r
259                         Goal.remove_spawngroup = Goal.rv_s_h;\r
260                 }\r
261                 if (((Goal.rs_s_h != 0) && (Goal.restore_spawngroup == 0)))\r
262                 {\r
263                         Goal.restore_spawngroup = Goal.rs_s_h;\r
264                 }\r
265                 if (((Goal.rv_gr != 0) && (Goal.remove_group_no == 0)))\r
266                 {\r
267                         Goal.remove_group_no = Goal.rv_gr;\r
268                 }\r
269                 if (((Goal.rs_gr != 0) && (Goal.restore_group_no == 0)))\r
270                 {\r
271                         Goal.restore_group_no = Goal.rs_gr;\r
272                 }\r
273                 if (((Goal.rv_g != 0) && (Goal.remove_goal_no == 0)))\r
274                 {\r
275                         Goal.remove_goal_no = Goal.rv_g;\r
276                 }\r
277                 if (((Goal.rs_g != 0) && (Goal.restore_goal_no == 0)))\r
278                 {\r
279                         Goal.restore_goal_no = Goal.rs_g;\r
280                 }\r
281                 if ((Goal.t_s_h != string_null))\r
282                 {\r
283                         Goal.team_str_home = Goal.t_s_h;\r
284                 }\r
285                 if ((Goal.t_s_m != string_null))\r
286                 {\r
287                         Goal.team_str_moved = Goal.t_s_m;\r
288                 }\r
289                 if ((Goal.t_s_c != string_null))\r
290                 {\r
291                         Goal.team_str_carried = Goal.t_s_c;\r
292                 }\r
293                 if ((Goal.n_s_h != string_null))\r
294                 {\r
295                         Goal.non_team_str_home = Goal.n_s_h;\r
296                 }\r
297                 if ((Goal.n_s_m != string_null))\r
298                 {\r
299                         Goal.non_team_str_moved = Goal.n_s_m;\r
300                 }\r
301                 if ((Goal.n_s_c != string_null))\r
302                 {\r
303                         Goal.non_team_str_carried = Goal.n_s_c;\r
304                 }\r
305                 if ((Goal.b_b != string_null))\r
306                 {\r
307                         Goal.broadcast = Goal.b_b;\r
308                 }\r
309                 if ((Goal.b_t != string_null))\r
310                 {\r
311                         Goal.team_broadcast = Goal.b_t;\r
312                 }\r
313                 if ((Goal.b_n != string_null))\r
314                 {\r
315                         Goal.non_team_broadcast = Goal.b_n;\r
316                 }\r
317                 if ((Goal.b_o != string_null))\r
318                 {\r
319                         Goal.owners_team_broadcast = Goal.b_o;\r
320                 }\r
321                 if ((Goal.n_b != string_null))\r
322                 {\r
323                         Goal.netname_broadcast = Goal.n_b;\r
324                 }\r
325                 if ((Goal.n_t != string_null))\r
326                 {\r
327                         Goal.netname_team_broadcast = Goal.n_t;\r
328                 }\r
329                 if ((Goal.n_n != string_null))\r
330                 {\r
331                         Goal.netname_non_team_broadcast = Goal.n_n;\r
332                 }\r
333                 if ((Goal.n_o != string_null))\r
334                 {\r
335                         Goal.netname_owners_team_broadcast = Goal.n_o;\r
336                 }\r
337                 if ((Goal.d_t != string_null))\r
338                 {\r
339                         Goal.team_drop = Goal.d_t;\r
340                 }\r
341                 if ((Goal.d_n != string_null))\r
342                 {\r
343                         Goal.non_team_drop = Goal.d_n;\r
344                 }\r
345                 if ((Goal.d_n_t != string_null))\r
346                 {\r
347                         Goal.netname_team_drop = Goal.d_n_t;\r
348                 }\r
349                 if ((Goal.d_n_n != string_null))\r
350                 {\r
351                         Goal.netname_non_team_drop = Goal.d_n_n;\r
352                 }\r
353                 if ((flagem_checked == 0))\r
354                 {\r
355                         if ((cvar ("temp1") & 4096))\r
356                         {\r
357                                 toggleflags = (toggleflags | 4096);\r
358                         }\r
359                         if ((cvar ("temp1") & 8192))\r
360                         {\r
361                                 toggleflags = (toggleflags | 8192);\r
362                         }\r
363                         flagem_checked = 1;\r
364                 }\r
365                 if (((toggleflags & 4096) && !(toggleflags & 8192)))\r
366                 {\r
367                         if ((((Goal.mdl == "progs/b_s_key.mdl") || (Goal.mdl == "progs/m_s_key.mdl")) || (Goal.mdl == "progs/w_s_key.mdl")))\r
368                         {\r
369                                 Goal.mdl = "progs/tf_flag.mdl";\r
370                                 Goal.skin = 1;\r
371                         }\r
372                         else\r
373                         {\r
374                                 if ((((Goal.mdl == "progs/b_g_key.mdl") || (Goal.mdl == "progs/m_g_key.mdl")) || (Goal.mdl == "progs/w_g_key.mdl")))\r
375                                 {\r
376                                         Goal.mdl = "progs/tf_flag.mdl";\r
377                                         Goal.skin = 2;\r
378                                 }\r
379                         }\r
380                 }\r
381                 if ((toggleflags & 8192))\r
382                 {\r
383                         if ((((Goal.mdl == "progs/b_s_key.mdl") || (Goal.mdl == "progs/m_s_key.mdl")) || (Goal.mdl == "progs/w_s_key.mdl")))\r
384                         {\r
385                                 Goal.mdl = "progs/tf_stan.mdl";\r
386                                 Goal.skin = 1;\r
387                         }\r
388                         else\r
389                         {\r
390                                 if ((((Goal.mdl == "progs/b_g_key.mdl") || (Goal.mdl == "progs/m_g_key.mdl")) || (Goal.mdl == "progs/w_g_key.mdl")))\r
391                                 {\r
392                                         Goal.mdl = "progs/tf_stan.mdl";\r
393                                         Goal.skin = 2;\r
394                                 }\r
395                                 else\r
396                                 {\r
397                                         if ((Goal.mdl == "progs/tf_flag.mdl"))\r
398                                         {\r
399                                                 Goal.mdl = "progs/tf_stan.mdl";\r
400                                         }\r
401                                 }\r
402                         }\r
403                 }\r
404                 Goal.has_abbreviated = 1;\r
405         }\r
406 };\r
407 \r
408 void () TF_PlaceItem =\r
409 {\r
410         self.flags = 256.000000;\r
411         self.movetype = 0.000000;\r
412         self.velocity = '0.000000 0.000000 0.000000';\r
413         self.oldorigin = self.origin;\r
414         if ((self.goal_activation & 512.000000))\r
415         {\r
416                 self.effects = (self.effects | 8.000000);\r
417         }\r
418         if ((item_list_bit == 0.000000))\r
419         {\r
420                 item_list_bit = 1.000000;\r
421         }\r
422         self.item_list = item_list_bit;\r
423         item_list_bit = item_list_bit * 2.000000;\r
424 };\r
425 \r
426 void () TF_StartItem =\r
427 {\r
428 \r
429         UpdateAbbreviations (self);\r
430         self.nextthink = (time + 0.200000);\r
431         self.think = TF_PlaceItem;\r
432         if ((self.goal_state == 3.000000))\r
433         {\r
434                 RemoveGoal (self);\r
435         }\r
436 };\r
437 \r
438 void () TF_PlaceGoal =\r
439 {\r
440         if ((self.classname != "info_tfgoal_timer"))\r
441         {\r
442                 if ((self.goal_activation & 1.000000))\r
443                 {\r
444                         self.touch = tfgoal_touch;\r
445                 }\r
446         }\r
447         else\r
448         {\r
449                 self.think = tfgoal_timer_tick;\r
450                 self.nextthink = (time + self.search_time);\r
451                 self.classname = "info_tfgoal";\r
452         }\r
453         self.flags = 256.000000;\r
454         self.movetype = 0.000000;\r
455         self.velocity = '0.000000 0.000000 0.000000';\r
456         self.oldorigin = self.origin;\r
457 };\r
458 \r
459 void () TF_StartGoal =\r
460 {\r
461 \r
462         UpdateAbbreviations (self);\r
463         self.nextthink = (time + 0.200000);\r
464         self.think = TF_PlaceGoal;\r
465         self.use = info_tfgoal_use;\r
466         if ((self.goal_state == 3.000000))\r
467         {\r
468                 RemoveGoal (self);\r
469         }\r
470 };\r
471 \r
472 float() CheckExistence =\r
473 {\r
474 \r
475         UpdateAbbreviations (self);\r
476         if ((self.ex_skill_min && (skill <= self.ex_skill_min)))\r
477         {\r
478                 return (0.000000);\r
479         }\r
480         else\r
481         {\r
482                 if ((self.ex_skill_max && (skill >= self.ex_skill_max)))\r
483                 {\r
484                         return (0.000000);\r
485                 }\r
486         }\r
487         return (1.000000);\r
488 };\r
489 \r
490 /*                                                      // ORIG NETQUAKETF INFO_TFDETECT\r
491 void () info_tfdetect =\r
492 {\r
493         UpdateAbbreviations (self);\r
494 };\r
495 */\r
496 \r
497 /*void () info_tfdetect = \r
498 {\r
499    local entity te;\r
500    local string st;\r
501 \r
502    UpdateAbbreviations (self);\r
503 \r
504    //TIMELEFT TIMER\r
505    te = find (world,classname,"countdown");\r
506    if (te != world) \r
507    { \r
508            return;\r
509    }\r
510 \r
511    st = infokey (world,"time"); // Unfortunately DP Engine doesnt support this (qw funct)\r
512    if (st == "off")\r
513    {\r
514            return;\r
515    }\r
516    newmis = spawn ();\r
517    newmis.classname = "countdown";\r
518    newmis.no_grenades_1 = 0;\r
519    st = infokey (world,"timelimit");\r
520    newmis.health = stof(st);\r
521    newmis.think = review_timeleft;\r
522    newmis.nextthink = (time + 1);\r
523 \r
524 \r
525 // MESSAGE DISP CODE\r
526         if (haltloop1 != 1) \r
527         {\r
528                 local string msg1timer;\r
529 \r
530                 msg1timer = infokey (world, "svmsg1");\r
531                 msg1time = stof(msg1timer);\r
532 \r
533                 if (msg1time > 0)\r
534                 {\r
535                         display_message ();\r
536                 }\r
537                 haltloop1 = 1;\r
538         }\r
539 \r
540         if (haltloop2 != 1)\r
541         {\r
542                 local string msg2timer;\r
543 \r
544                 msg2timer = infokey (world, "svmsg2");\r
545                 msg2time = stof(msg2timer);\r
546 \r
547                 if (msg2time > 0)\r
548                 {\r
549                         pre_messagetimer2 ();\r
550                 }\r
551                 haltloop2 = 1;\r
552         }\r
553 \r
554         if (haltloop3 != 1)\r
555         {\r
556                 local string msg3timer;\r
557 \r
558                 msg3timer = infokey (world, "svmsg3");\r
559                 msg3time = stof(msg3timer);\r
560 \r
561                 if (msg3time > 0)\r
562                 {\r
563                         pre_messagetimer3 ();\r
564                 }\r
565                 haltloop3 = 1;\r
566         }\r
567         if (quotestart != 1) {\r
568         quotetimer ();\r
569         quotestart = 1;\r
570         }\r
571 // Auto Level-change fix\r
572 };*/\r
573 \r
574 /* Gold.  this is the old info_tfdetect... new one is above*/\r
575 void() info_tfdetect = \r
576 {\r
577         UpdateAbbreviations(self);\r
578         /*gold. next 6 lines are part of plexi's code for the "timeleft" command.\r
579         newmis = spawn ();\r
580         newmis.classname = "countdown";\r
581         newmis.netname = "countdown";\r
582         newmis.no_grenades_1 = 0;\r
583         newmis.think = review_timeleft;\r
584         newmis.nextthink = (time + 1);*/\r
585 };\r
586 \r
587 void() info_player_teamspawn = \r
588 {\r
589         local entity te;\r
590         if (CheckExistence() == 0)\r
591         {\r
592                 dremove(self);\r
593                 return;\r
594         }\r
595         if (number_of_teams < self.team_no)\r
596         {\r
597                 number_of_teams = self.team_no;\r
598         }\r
599         if (self.team_no <= 0)\r
600         {\r
601                 dprint("no team_no associated with info_player_teamspawn\n");\r
602                 dremove(self);\r
603         }\r
604         if (self.items != 0)\r
605         {\r
606                 te = Finditem(self.items);\r
607                 if (!te)\r
608                 {\r
609                         dprint("info_player_teamspawn specifies a GoalItem that does not exist\n");\r
610                         dremove(self);\r
611                 }\r
612         }\r
613         if (self.team_no == 1)\r
614         {\r
615                 self.team_str_home = "ts1";\r
616         }\r
617         else\r
618         {\r
619                 if (self.team_no == 2)\r
620                 {\r
621                         self.team_str_home = "ts2";\r
622                 }\r
623                 else\r
624                 {\r
625                         if (self.team_no == 3)\r
626                         {\r
627                                 self.team_str_home = "ts3";\r
628                         }\r
629                         else\r
630                         {\r
631                                 if (self.team_no == 4)\r
632                                 {\r
633                                         self.team_str_home = "ts4";\r
634                                 }\r
635                         }\r
636                 }\r
637         }\r
638 };\r
639 \r
640 void() i_p_t = \r
641 {\r
642         self.classname = "info_player_teamspawn";\r
643         info_player_teamspawn();\r
644 };\r
645 \r
646 void() info_tfgoal = \r
647 {\r
648         if (CheckExistence() == 0)\r
649         {\r
650                 dremove(self);\r
651                 return;\r
652         }\r
653         if (self.mdl)\r
654         {\r
655                 precache_model(self.mdl);\r
656                 precache_model2(self.mdl);\r
657                 setmodel(self, self.mdl);\r
658         }\r
659         if (self.noise)\r
660         {\r
661                 precache_sound(self.noise);\r
662                 precache_sound2(self.noise);\r
663         }\r
664         else\r
665         {\r
666                 if (self.mdl == "progs/backpack.mdl")\r
667                 {\r
668                         precache_sound("items/backpack.wav");\r
669                         precache_sound2("items/backpack.wav");\r
670                         self.noise = "items/backpack.wav";\r
671                 }\r
672         }\r
673         precache_sound("items/protect.wav");\r
674         precache_sound("items/protect2.wav");\r
675         precache_sound("items/protect3.wav");\r
676         precache_sound("items/suit.wav");\r
677         precache_sound("items/suit2.wav");\r
678         precache_sound("items/inv1.wav");\r
679         precache_sound("items/inv2.wav");\r
680         precache_sound("items/inv3.wav");\r
681         precache_sound("items/damage.wav");\r
682         precache_sound("items/damage2.wav");\r
683         precache_sound("items/damage3.wav");\r
684         self.solid = 1;\r
685         if (self.goal_state == 0)\r
686         {\r
687                 self.goal_state = 2;\r
688         }\r
689         if (self.goal_min != '0 0 0')\r
690         {\r
691                 setsize(self, self.goal_min, self.goal_max);\r
692         }\r
693         else\r
694         {\r
695                 setsize(self, '-16 -16 -24', '16 16 32');\r
696         }\r
697         TF_StartGoal();\r
698 };\r
699 \r
700 void() i_t_g = \r
701 {\r
702         self.classname = "info_tfgoal";\r
703         info_tfgoal();\r
704 };\r
705 \r
706 void() info_tfgoal_timer = \r
707 {\r
708         if (CheckExistence() == 0)\r
709         {\r
710                 dremove(self);\r
711                 return;\r
712         }\r
713         if (self.mdl)\r
714         {\r
715                 precache_model(self.mdl);\r
716                 precache_model2(self.mdl);\r
717                 setmodel(self, self.mdl);\r
718         }\r
719         if (self.noise)\r
720         {\r
721                 precache_sound(self.noise);\r
722                 precache_sound2(self.noise);\r
723         }\r
724         if (self.search_time <= 0)\r
725         {\r
726                 dprint("Timer Goal created with no specified time.\n");\r
727                 dremove(self);\r
728         }\r
729         self.solid = 0;\r
730         if (self.goal_state == 0)\r
731         {\r
732                 self.goal_state = 2;\r
733         }\r
734         setsize(self, '-16 -16 -24', '16 16 32');\r
735         TF_StartGoal();\r
736 };\r
737 \r
738 void() i_t_t = \r
739 {\r
740         self.classname = "info_tfgoal_timer";\r
741         info_tfgoal_timer();\r
742 };\r
743 \r
744 void() item_tfgoal = \r
745 {\r
746         if (CheckExistence() == 0)\r
747         {\r
748                 dremove(self);\r
749                 return;\r
750         }\r
751         if (self.mdl)\r
752         {\r
753                 precache_model(self.mdl);\r
754                 precache_model2(self.mdl);\r
755                 setmodel(self, self.mdl);\r
756         }\r
757         else\r
758         {\r
759                 self.mdl = "";\r
760                 setmodel(self, "");\r
761         }\r
762         precache_sound2("items/itembk2.wav");\r
763         if (self.noise)\r
764         {\r
765                 precache_sound(self.noise);\r
766                 precache_sound2(self.noise);\r
767         }\r
768         self.touch = item_tfgoal_touch;\r
769         if (self.goal_state == 0)\r
770         {\r
771                 self.goal_state = 2;\r
772         }\r
773         self.solid = 1;\r
774         setorigin(self, self.origin);\r
775         if (!(self.netname))\r
776         {\r
777                 self.netname = "goalitem";\r
778         }\r
779         if (self.pausetime <= 0)\r
780         {\r
781                 self.pausetime = 60;\r
782         }\r
783         if (self.delay != 0 && self.pausetime == 0)\r
784         {\r
785                 self.pausetime = self.delay;\r
786         }\r
787         setsize(self, '-16 -16 -24', '16 16 32');\r
788         TF_StartItem();\r
789 };\r
790 \r
791 void (entity AD) ParseTFDetect =\r
792 {\r
793         if ((AD.team_broadcast != string_null))\r
794         {\r
795                 team_menu_string = AD.team_broadcast;\r
796         }\r
797         localcmd (AD.message);\r
798         cvar_set ("sv_maxspeed", "500");\r
799         team1lives = AD.ammo_shells;\r
800         team2lives = AD.ammo_nails;\r
801         team3lives = AD.ammo_rockets;\r
802         team4lives = AD.ammo_cells;\r
803         if ((team1lives == 0))\r
804         {\r
805                 team1lives = -1;\r
806         }\r
807         if ((team2lives == 0))\r
808         {\r
809                 team2lives = -1;\r
810         }\r
811         if ((team3lives == 0))\r
812         {\r
813                 team3lives = -1;\r
814         }\r
815         if ((team4lives == 0))\r
816         {\r
817                 team4lives = -1;\r
818         }\r
819         /*if ((AD.hook_out == 1))               // Hook always allowed, right?\r
820         {\r
821                 allow_hook = 0;\r
822         }*/\r
823         team1maxplayers = AD.ammo_medikit;\r
824         team2maxplayers = AD.ammo_detpack;\r
825         team3maxplayers = AD.maxammo_medikit;\r
826         team4maxplayers = AD.maxammo_detpack;\r
827         if ((team1maxplayers == 0))\r
828         {\r
829                 team1maxplayers = 100;\r
830         }\r
831         if ((team2maxplayers == 0))\r
832         {\r
833                 team2maxplayers = 100;\r
834         }\r
835         if ((team3maxplayers == 0))\r
836         {\r
837                 team3maxplayers = 100;\r
838         }\r
839         if ((team4maxplayers == 0))\r
840         {\r
841                 team4maxplayers = 100;\r
842         }\r
843         illegalclasses = AD.playerclass;\r
844 //      illegalclasses = AD.class;\r
845         illegalclasses1 = AD.maxammo_shells;\r
846         illegalclasses2 = AD.maxammo_nails;\r
847         illegalclasses3 = AD.maxammo_rockets;\r
848         illegalclasses4 = AD.maxammo_cells;\r
849         civilianteams = 0;\r
850         if ((illegalclasses1 == -1))\r
851         {\r
852                 illegalclasses1 = 0;\r
853                 civilianteams = (civilianteams | 1);\r
854         }\r
855         if ((illegalclasses2 == -1))\r
856         {\r
857                 illegalclasses2 = 0;\r
858                 civilianteams = (civilianteams | 2);\r
859         }\r
860         if ((illegalclasses3 == -1))\r
861         {\r
862                 illegalclasses3 = 0;\r
863                 civilianteams = (civilianteams | 4);\r
864         }\r
865         if ((illegalclasses4 == -1))\r
866         {\r
867                 illegalclasses4 = 0;\r
868                 civilianteams = (civilianteams | 8);\r
869         }\r
870 };\r
871 \r
872 entity(float ino) Finditem = \r
873 {\r
874         local entity tg;\r
875         local string st;\r
876         tg = find(world, classname, "item_tfgoal");\r
877         while (tg)\r
878         {\r
879                 if (tg.goal_no == ino)\r
880                 {\r
881                         return tg;\r
882                 }\r
883                 tg = find(tg, classname, "item_tfgoal");\r
884         }\r
885         dprint("Could not find an item with a goal_no of ");\r
886         st = ftos(ino);\r
887         dprint(st);\r
888         dprint(".\n");\r
889         return world;\r
890 };\r
891 \r
892 /*entity(float gno) Findgoal =          // moved to tffunctions\r
893 {\r
894         local entity tg;\r
895         local string st;\r
896         tg = find(world, classname, "info_tfgoal");\r
897         while (tg)\r
898         {\r
899                 if (tg.goal_no == gno)\r
900                 {\r
901                         return tg;\r
902                 }\r
903                 tg = find(tg, classname, "info_tfgoal");\r
904         }\r
905         dprint("Could not find a goal with a goal_no of ");\r
906         st = ftos(gno);\r
907         dprint(st);\r
908         dprint(".\n");\r
909 };*/\r
910 \r
911 entity(float gno) Findteamspawn = \r
912 {\r
913         local entity tg;\r
914         local string st;\r
915         tg = find(world, classname, "info_player_teamspawn");\r
916         while (tg)\r
917         {\r
918                 if (tg.goal_no == gno)\r
919                 {\r
920                         return tg;\r
921                 }\r
922                 tg = find(tg, classname, "info_player_teamspawn");\r
923         }\r
924         dprint("Could not find a Teamspawn with a goal_no of ");\r
925         st = ftos(gno);\r
926         dprint(st);\r
927         dprint(".\n");\r
928 };\r
929 \r
930 void(entity Goal) InactivateGoal = \r
931 {\r
932         if (Goal.goal_state == 1)\r
933         {\r
934                 if (Goal.search_time == 0)\r
935                 {\r
936                         Goal.solid = 1;\r
937                 }\r
938                 Goal.goal_state = 2;\r
939                 if (Goal.mdl != string_null)\r
940                 {\r
941                         setmodel(Goal, Goal.mdl);\r
942                 }\r
943         }\r
944 };\r
945 \r
946 void(entity Goal) RestoreGoal = \r
947 {\r
948         if (Goal.goal_state == 3)\r
949         {\r
950                 if (Goal.search_time == 0)\r
951                 {\r
952                         Goal.solid = 1;\r
953                 }\r
954                 else\r
955                 {\r
956                         Goal.nextthink = time + Goal.search_time;\r
957                 }\r
958                 Goal.goal_state = 2;\r
959                 if (Goal.mdl != string_null)\r
960                 {\r
961                         setmodel(Goal, Goal.mdl);\r
962                 }\r
963         }\r
964 };\r
965 \r
966 void(entity Goal) RemoveGoal = \r
967 {\r
968         Goal.solid = 0;\r
969         Goal.goal_state = 3;\r
970         if (Goal.mdl != string_null)\r
971         {\r
972                 setmodel(Goal, string_null);\r
973         }\r
974 };\r
975 \r
976 float(entity Goal, entity Player, entity AP) IsAffectedBy = \r
977 {\r
978         local float genv;\r
979         //if (Player.playerclass == 0)\r
980         if (Player.class == 0)\r
981         {\r
982                 return 0;\r
983         }\r
984         if (Goal.goal_effects & 32)\r
985         {\r
986                 genv = pointcontents(Goal.origin);\r
987                 if (pointcontents(Player.origin) != genv)\r
988                 {\r
989                         return 0;\r
990                 }\r
991         }\r
992         if (Goal.t_length != 0)\r
993         {\r
994                 if (vlen(Goal.origin - Player.origin) <= Goal.t_length)\r
995                 {\r
996                         if (Goal.goal_effects & 16)\r
997                         {\r
998                                 traceline(Goal.origin, Player.origin, 1, Goal);\r
999                                 if (trace_fraction == 1)\r
1000                                 {\r
1001                                         return 1;\r
1002                                 }\r
1003                         }\r
1004                         else\r
1005                         {\r
1006                                 return 1;\r
1007                         }\r
1008                 }\r
1009         }\r
1010         if (Goal.classname != "info_tfgoal_timer")\r
1011         {\r
1012                 if (Goal.goal_effects & 1 && Player == AP)\r
1013                 {\r
1014                         return 1;\r
1015                 }\r
1016                 if (Goal.goal_effects & 2 && AP.team_no == Player.team_no)\r
1017                 {\r
1018                         return 1;\r
1019                 }\r
1020                 if (Goal.goal_effects & 4 && AP.team_no != Player.team_no)\r
1021                 {\r
1022                         return 1;\r
1023                 }\r
1024                 if (Goal.goal_effects & 8 && Player != AP)\r
1025                 {\r
1026                         return 1;\r
1027                 }\r
1028         }\r
1029         if (Goal.maxammo_shells != 0 && Player.team_no == Goal.maxammo_shells)\r
1030         {\r
1031                 return 1;\r
1032         }\r
1033         if (Goal.maxammo_nails != 0 && Player.team_no != Goal.maxammo_shells)\r
1034         {\r
1035                 return 1;\r
1036         }\r
1037         return 0;\r
1038 };\r
1039 \r
1040 void(entity Goal, entity Player, entity AP, float addb) Apply_Results = \r
1041 {\r
1042         local entity oldself;\r
1043         local entity te;\r
1044         local entity oldte;\r
1045         local float oa;\r
1046         stuffcmd(Player, "bf\n");\r
1047         if (Goal.classname == "item_tfgoal")\r
1048         {\r
1049                 Player.item_list = Player.item_list | Goal.item_list;\r
1050         }\r
1051         if (Player == AP)\r
1052         {\r
1053                 if (Goal.count != 0)\r
1054                 {\r
1055                         if (Player.team_no > 0)\r
1056                         {\r
1057                                 TeamFortress_TeamIncreaseScore(Player.team_no, Goal.count);\r
1058                                 TeamFortress_TeamShowScores(2);\r
1059                         }\r
1060                 }\r
1061         }\r
1062         if (addb)\r
1063         {\r
1064                 if (Player.health > 0)\r
1065                 {\r
1066                         if (Goal.health > 0)\r
1067                         {\r
1068                                 T_Heal(Player, Goal.health, 0);\r
1069                         }\r
1070                         if (Goal.health < 0)\r
1071                         {\r
1072                                 if (0 - Player.health > Goal.health)\r
1073                                 {\r
1074                                         Player.armorvalue = 0;\r
1075                                         T_Damage(Player, Goal, Goal, Player.health + 1);\r
1076                                 }\r
1077                                 else\r
1078                                 {\r
1079                                         oa = Player.armorvalue;\r
1080                                         Player.armorvalue = 0;\r
1081                                         T_Damage(Player, Goal, Goal, 0 - Goal.health);\r
1082                                         Player.armorvalue = oa;\r
1083                                 }\r
1084                         }\r
1085                 }\r
1086                 if (Player.health > 0)\r
1087                 {\r
1088                         if (Goal.armortype)\r
1089                         {\r
1090                                                                                                                 // Temp (i hope)\r
1091 //                              Player.armortype = Goal.armortype;              // Armor type needs to be tweaked in this game\r
1092                         }\r
1093                         Player.armorvalue = Player.armorvalue + Goal.armorvalue;\r
1094                         if (Goal.armorclass)\r
1095                         {\r
1096                                 Player.armorclass = Goal.armorclass;\r
1097                         }\r
1098                         if (Goal.gravity > 0)\r
1099                         {\r
1100                                 Player.gravity = Goal.gravity;\r
1101                         }\r
1102                         Player.ammo_shells = Player.ammo_shells + Goal.ammo_shells;\r
1103                         Player.ammo_nails = Player.ammo_nails + Goal.ammo_nails;\r
1104                         Player.ammo_rockets = Player.ammo_rockets + Goal.ammo_rockets;\r
1105                         Player.ammo_cells = Player.ammo_cells + Goal.ammo_cells;\r
1106                         Player.ammo_medikit = Player.ammo_medikit + Goal.ammo_medikit;\r
1107                         Player.ammo_detpack = Player.ammo_detpack + Goal.ammo_detpack;\r
1108                         Player.no_grenades_1 = Player.no_grenades_1 + Goal.no_grenades_1;\r
1109                         Player.no_grenades_2 = Player.no_grenades_2 + Goal.no_grenades_2;\r
1110                         if (Player.no_grenades_1 > 4)\r
1111                         {\r
1112                                 Player.no_grenades_1 = 4;\r
1113                         }\r
1114                         if (Player.no_grenades_2 > 4)\r
1115                         {\r
1116                                 Player.no_grenades_2 = 4;\r
1117                         }\r
1118                         if (Player.ammo_detpack > Player.maxammo_detpack)\r
1119                         {\r
1120                                 Player.ammo_detpack = Player.maxammo_detpack;\r
1121                         }\r
1122                         if (Goal.invincible_finished > 0)\r
1123                         {\r
1124                                 Player.items = Player.items | 1048576;\r
1125                                 Player.invincible_time = 1;\r
1126                                 Player.invincible_finished = time + Goal.invincible_finished;\r
1127                                 if (Goal.classname == "item_tfgoal")\r
1128                                 {\r
1129                                         Player.tfstate = Player.tfstate | 32;\r
1130                                         Player.invincible_finished = time + 666;\r
1131                                 }\r
1132                         }\r
1133                         /*if (Goal.invisible_finished > 0)              // NexTF doesnt support invisibility?\r
1134                         {\r
1135                                 Player.items = Player.items | 524288;\r
1136                                 Player.invisible_time = 1;\r
1137                                 Player.invisible_finished = time + Goal.invisible_finished;\r
1138                                 if (Goal.classname == "item_tfgoal")\r
1139                                 {\r
1140                                         Player.tfstate = Player.tfstate | 64;\r
1141                                         Player.invisible_finished = time + 666;\r
1142                                 }\r
1143                         }*/\r
1144                         if (Goal.super_damage_finished > 0)\r
1145                         {\r
1146                                 Player.items = Player.items | 4194304;\r
1147                                 Player.super_time = 1;\r
1148                                 Player.super_damage_finished = time + Goal.super_damage_finished;\r
1149                                 if (Goal.classname == "item_tfgoal")\r
1150                                 {\r
1151                                         Player.tfstate = Player.tfstate | 128;\r
1152                                         Player.super_damage_finished = time + 666;\r
1153                                 }\r
1154                         }\r
1155                         if (Goal.radsuit_finished > 0)\r
1156                         {\r
1157                                 Player.items = Player.items | 2097152;\r
1158                                 Player.rad_time = 1;\r
1159                                 Player.radsuit_finished = time + Goal.radsuit_finished;\r
1160                                 if (Goal.classname == "item_tfgoal")\r
1161                                 {\r
1162                                         Player.tfstate = Player.tfstate | 256;\r
1163                                         Player.radsuit_finished = time + 666;\r
1164                                 }\r
1165                         }\r
1166                 }\r
1167                 Player.lives = Player.lives + Goal.lives;\r
1168                 Player.real_frags = /*Player.real_frags + */Goal.frags + Player.frags; // Fixed?\r
1169                 if (!(toggleflags & 128))\r
1170                 {\r
1171                         Player.frags = Player.real_frags;\r
1172                 }\r
1173                 \r
1174                 oldself = self;\r
1175                 self = Player;\r
1176                 TeamFortress_CheckClassStats();\r
1177                 //W_SetCurrentAmmo();           // This is automatic in nexuiz right?\r
1178                 self = oldself;\r
1179         }\r
1180         //if (Player.playerclass == 8 && (Goal.goal_result & 16)) // In nextf, spy class is "2"\r
1181         if (Player.class == 2 && (Goal.goal_result & 16))\r
1182         {\r
1183                 self.immune_to_check = time + 4;\r
1184                 //Spy_RemoveDisguise(Player);           // Wazat -- help [incomplete]\r
1185         }\r
1186         if (Goal.items != 0 && Goal.classname != "item_tfgoal")\r
1187         {\r
1188                 te = Finditem(Goal.items);\r
1189                 if (te)\r
1190                 {\r
1191                         tfgoalitem_GiveToPlayer(te, Player, Goal);\r
1192                 }\r
1193         }\r
1194         if (Goal.axhitme != 0)\r
1195         {\r
1196                 te = Finditem(Goal.axhitme);\r
1197                 if (te.owner == Player)\r
1198                 {\r
1199                         tfgoalitem_RemoveFromPlayer(te, Player, 1);\r
1200                 }\r
1201         }\r
1202         if (Goal.remove_item_group != 0)\r
1203         {\r
1204                 te = find(world, classname, "item_tfgoal");\r
1205                 while (te)\r
1206                 {\r
1207                         if (te.group_no == Goal.remove_item_group && te.owner == AP)\r
1208                         {\r
1209                                 oldte = te;\r
1210                                 te = find(te, classname, "item_tfgoal");\r
1211                                 tfgoalitem_RemoveFromPlayer(oldte, Player, 1);\r
1212                         }\r
1213                         else\r
1214                         {\r
1215                                 te = find(te, classname, "item_tfgoal");\r
1216                         }\r
1217                 }\r
1218         }\r
1219         if (Goal.display_item_status1 != 0)\r
1220         {\r
1221                 te = Finditem(Goal.display_item_status1);\r
1222                 if (te)\r
1223                 {\r
1224                         DisplayItemStatus(Goal, Player, te);\r
1225                 }\r
1226                 else\r
1227                 {\r
1228                         sprint(Player,"Item is missing.\n");\r
1229                 }\r
1230         }\r
1231         if (Goal.display_item_status2 != 0)\r
1232         {\r
1233                 te = Finditem(Goal.display_item_status2);\r
1234                 if (te)\r
1235                 {\r
1236                         DisplayItemStatus(Goal, Player, te);\r
1237                 }\r
1238                 else\r
1239                 {\r
1240                         sprint(Player,"Item is missing.\n");\r
1241                 }\r
1242         }\r
1243         if (Goal.display_item_status3 != 0)\r
1244         {\r
1245                 te = Finditem(Goal.display_item_status3);\r
1246                 if (te)\r
1247                 {\r
1248                         DisplayItemStatus(Goal, Player, te);\r
1249                 }\r
1250                 else\r
1251                 {\r
1252                         sprint(Player,"Item is missing.\n");\r
1253                 }\r
1254         }\r
1255         if (Goal.display_item_status4 != 0)\r
1256         {\r
1257                 te = Finditem(Goal.display_item_status4);\r
1258                 if (te)\r
1259                 {\r
1260                         DisplayItemStatus(Goal, Player, te);\r
1261                 }\r
1262                 else\r
1263                 {\r
1264                         sprint(Player,"Item is missing.\n");\r
1265                 }\r
1266         }\r
1267         /*if (Player.autodiscard)               //Not a function in NexTF\r
1268         {\r
1269                 oldself = self;\r
1270                 self = Player;\r
1271                 TeamFortress_Discard ();\r
1272                 self = oldself;\r
1273         }*/\r
1274 };\r
1275 \r
1276 void(entity Goal, entity Player) RemoveResults = \r
1277 {\r
1278         local entity oldself;\r
1279         local entity te;\r
1280         local float puinvin;\r
1281         local float puinvis;\r
1282         local float puquad;\r
1283         local float purad;\r
1284         if (Goal.classname == "item_tfgoal")\r
1285         {\r
1286                 if (!(Player.item_list & Goal.item_list))\r
1287                 {\r
1288                         return;\r
1289                 }\r
1290                 if (Goal.goal_activation & 1024)\r
1291                 {\r
1292                         return;\r
1293                 }\r
1294                 Player.item_list = Player.item_list - (Player.item_list & Goal.item_list);\r
1295         }\r
1296         if (Goal.health > 0)\r
1297         {\r
1298                 TF_T_Damage(Player, Goal, Goal, Goal.health, 1, 0);\r
1299         }\r
1300         if (Goal.health < 0)\r
1301         {\r
1302                 T_Heal(Player, 0 - Goal.health, 0);\r
1303         }\r
1304         Player.lives = Player.lives - Goal.lives;\r
1305         Player.armortype = Player.armortype - Goal.armortype;\r
1306         Player.armorvalue = Player.armorvalue - Goal.armorvalue;\r
1307         Player.armorclass = Player.armorclass - (Player.armorclass & Goal.armorclass);\r
1308         Player.real_frags = Player.real_frags - Goal.frags;\r
1309         if (!(toggleflags & 128))\r
1310         {\r
1311                 Player.frags = Player.real_frags;\r
1312         }\r
1313         Player.ammo_shells = Player.ammo_shells - Goal.ammo_shells;\r
1314         Player.ammo_nails = Player.ammo_nails - Goal.ammo_nails;\r
1315         Player.ammo_rockets = Player.ammo_rockets - Goal.ammo_rockets;\r
1316         Player.ammo_cells = Player.ammo_cells - Goal.ammo_cells;\r
1317         Player.ammo_medikit = Player.ammo_medikit - Goal.ammo_medikit;\r
1318         Player.ammo_detpack = Player.ammo_detpack - Goal.ammo_detpack;\r
1319         Player.no_grenades_1 = Player.no_grenades_1 - Goal.no_grenades_1;\r
1320         Player.no_grenades_2 = Player.no_grenades_2 - Goal.no_grenades_2;\r
1321         puinvin = 0;\r
1322         puinvis = 0;\r
1323         puquad = 0;\r
1324         purad = 0;\r
1325         te = find(world, classname, "item_tfgoal");\r
1326         while (te)\r
1327         {\r
1328                 if (te.owner == Player && te != Goal)\r
1329                 {\r
1330                         if (te.invincible_finished > 0)\r
1331                         {\r
1332                                 puinvin = 1;\r
1333                         }\r
1334                         if (te.invisible_finished > 0)\r
1335                         {\r
1336                                 puinvis = 1;\r
1337                         }\r
1338                         if (te.super_damage_finished > 0)\r
1339                         {\r
1340                                 puquad = 1;\r
1341                         }\r
1342                         if (te.radsuit_finished > 0)\r
1343                         {\r
1344                                 purad = 1;\r
1345                         }\r
1346                 }\r
1347                 te = find(te, classname, "item_tfgoal");\r
1348         }\r
1349         if (Goal.invincible_finished > 0 && !puinvin)\r
1350         {\r
1351                 Player.tfstate = Player.tfstate - (Player.tfstate & 32);\r
1352                 Player.items = Player.items | 1048576;\r
1353                 Player.invincible_time = 1;\r
1354                 Player.invincible_finished = time + Goal.invincible_finished;\r
1355         }\r
1356         if (Goal.invisible_finished > 0 && !puinvis)\r
1357         {\r
1358                 Player.tfstate = Player.tfstate - (Player.tfstate & 64);\r
1359                 Player.items = Player.items | 524288;\r
1360                 Player.invisible_time = 1;\r
1361                 Player.invisible_finished = time + Goal.invisible_finished;\r
1362         }\r
1363         if (Goal.super_damage_finished > 0 && !puquad)\r
1364         {\r
1365                 Player.tfstate = Player.tfstate - (Player.tfstate & 128);\r
1366                 Player.items = Player.items | 4194304;\r
1367                 Player.super_time = 1;\r
1368                 Player.super_damage_finished = time + Goal.super_damage_finished;\r
1369         }\r
1370         if (Goal.radsuit_finished > 0 && !purad)\r
1371         {\r
1372                 Player.tfstate = Player.tfstate - (Player.tfstate & 256);\r
1373                 Player.items = Player.items | 2097152;\r
1374                 Player.rad_time = 1;\r
1375                 Player.radsuit_finished = time + Goal.radsuit_finished;\r
1376         }\r
1377         oldself = self;\r
1378         self = Player;\r
1379         TeamFortress_CheckClassStats();\r
1380         //W_SetCurrentAmmo();           // automatic in nexuiz?\r
1381         self = oldself;\r
1382 };\r
1383 \r
1384 float(entity Goal, entity AP) APMeetsCriteria = \r
1385 {\r
1386         local float gotone;\r
1387         local entity te;\r
1388         if (AP != world)\r
1389         {\r
1390                 if (Goal.team_no)\r
1391                 {\r
1392                         if (Goal.team_no != AP.team_no)\r
1393                         {\r
1394                                 return 0;\r
1395                         }\r
1396                 }\r
1397                 if (Goal.playerclass)\r
1398                 {\r
1399                         if (Goal.playerclass != AP.playerclass)\r
1400                         {\r
1401                                 return 0;\r
1402                         }\r
1403                 }\r
1404                 if (Goal.class)\r
1405                 {\r
1406                         if (Goal.class != AP.class)\r
1407                         {\r
1408                                 return 0;\r
1409                         }\r
1410                 }\r
1411                 if (Goal.items_allowed)\r
1412                 {\r
1413                         te = Finditem(Goal.items_allowed);\r
1414                         if (te.owner != AP)\r
1415                         {\r
1416                                 return 0;\r
1417                         }\r
1418                 }\r
1419         }\r
1420         if (Goal.if_goal_is_active)\r
1421         {\r
1422                 te = Findgoal(Goal.if_goal_is_active);\r
1423                 if (te.goal_state != 1)\r
1424                 {\r
1425                         return 0;\r
1426                 }\r
1427         }\r
1428         if (Goal.if_goal_is_inactive)\r
1429         {\r
1430                 te = Findgoal(Goal.if_goal_is_inactive);\r
1431                 if (te.goal_state != 2)\r
1432                 {\r
1433                         return 0;\r
1434                 }\r
1435         }\r
1436         if (Goal.if_goal_is_removed)\r
1437         {\r
1438                 te = Findgoal(Goal.if_goal_is_removed);\r
1439                 if (te.goal_state != 3)\r
1440                 {\r
1441                         return 0;\r
1442                 }\r
1443         }\r
1444         if (Goal.if_group_is_active)\r
1445         {\r
1446                 te = find(world, classname, "info_tfgoal");\r
1447                 while (te)\r
1448                 {\r
1449                         if (te.group_no == Goal.if_group_is_active)\r
1450                         {\r
1451                                 if (te.goal_state != 1)\r
1452                                 {\r
1453                                         return 0;\r
1454                                 }\r
1455                         }\r
1456                         te = find(te, classname, "info_tfgoal");\r
1457                 }\r
1458         }\r
1459         if (Goal.if_group_is_inactive)\r
1460         {\r
1461                 te = find(world, classname, "info_tfgoal");\r
1462                 while (te)\r
1463                 {\r
1464                         if (te.group_no == Goal.if_group_is_inactive)\r
1465                         {\r
1466                                 if (te.goal_state != 2)\r
1467                                 {\r
1468                                         return 0;\r
1469                                 }\r
1470                         }\r
1471                         te = find(te, classname, "info_tfgoal");\r
1472                 }\r
1473         }\r
1474         if (Goal.if_group_is_removed)\r
1475         {\r
1476                 te = find(world, classname, "info_tfgoal");\r
1477                 while (te)\r
1478                 {\r
1479                         if (te.group_no == Goal.if_group_is_removed)\r
1480                         {\r
1481                                 if (te.goal_state != 3)\r
1482                                 {\r
1483                                         return 0;\r
1484                                 }\r
1485                         }\r
1486                         te = find(te, classname, "info_tfgoal");\r
1487                 }\r
1488         }\r
1489         if (Goal.if_item_has_moved)\r
1490         {\r
1491                 te = Finditem(Goal.if_item_has_moved);\r
1492                 if (te)\r
1493                 {\r
1494                         if (te.goal_state != 1 && te.origin == te.oldorigin)\r
1495                         {\r
1496                                 return 0;\r
1497                         }\r
1498                 }\r
1499         }\r
1500         if (Goal.if_item_hasnt_moved)\r
1501         {\r
1502                 te = Finditem(Goal.if_item_hasnt_moved);\r
1503                 if (te)\r
1504                 {\r
1505                         if (te.goal_state == 1 || te.origin != te.oldorigin)\r
1506                         {\r
1507                                 return 0;\r
1508                         }\r
1509                 }\r
1510         }\r
1511         if (AP != world)\r
1512         {\r
1513                 gotone = 0;\r
1514                 if (Goal.has_item_from_group)\r
1515                 {\r
1516                         te = find(world, classname, "item_tfgoal");\r
1517                         while (te != world && !gotone)\r
1518                         {\r
1519                                 if (te.group_no == Goal.has_item_from_group && te.owner == AP)\r
1520                                 {\r
1521                                         gotone = 1;\r
1522                                 }\r
1523                                 te = find(te, classname, "item_tfgoal");\r
1524                         }\r
1525                         if (!gotone)\r
1526                         {\r
1527                                 return 0;\r
1528                         }\r
1529                 }\r
1530         }\r
1531         return 1;\r
1532 };\r
1533 \r
1534 void(entity Goal) SetupRespawn = \r
1535 {\r
1536         if (Goal.search_time != 0)\r
1537         {\r
1538                 InactivateGoal(Goal);\r
1539                 Goal.think = tfgoal_timer_tick;\r
1540                 Goal.nextthink = time + Goal.search_time;\r
1541                 return;\r
1542         }\r
1543         if (Goal.goal_result & 1)\r
1544         {\r
1545                 RemoveGoal(Goal);\r
1546                 return;\r
1547         }\r
1548         if (Goal.wait > 0)\r
1549         {\r
1550                 Goal.nextthink = time + Goal.wait;\r
1551                 Goal.think = DoRespawn;\r
1552                 return;\r
1553         }\r
1554         else\r
1555         {\r
1556                 if (Goal.wait == -1)\r
1557                 {\r
1558                         return;\r
1559                 }\r
1560         }\r
1561         InactivateGoal(Goal);\r
1562 };\r
1563 \r
1564 void() DoRespawn = \r
1565 {\r
1566         RestoreGoal(self);\r
1567         InactivateGoal(self);\r
1568 };\r
1569 \r
1570 float(entity Goal, entity AP) Activated = \r
1571 {\r
1572         local float APMet;\r
1573         local float RevAct;\r
1574         local float Act;\r
1575         if (Goal.goal_state == 1)\r
1576         {\r
1577                 return 0;\r
1578         }\r
1579         if (Goal.goal_state == 3)\r
1580         {\r
1581                 return 0;\r
1582         }\r
1583         if (Goal.goal_state == 4)\r
1584         {\r
1585                 return 0;\r
1586         }\r
1587         APMet = APMeetsCriteria(Goal, AP);\r
1588         if (Goal.classname == "item_tfgoal")\r
1589         {\r
1590                 RevAct = Goal.goal_activation & 64;\r
1591         }\r
1592         else\r
1593         {\r
1594                 RevAct = Goal.goal_activation & 4;\r
1595         }\r
1596         Act = 0;\r
1597         if (APMet)\r
1598         {\r
1599                 if (!RevAct)\r
1600                 {\r
1601                         Act = 1;\r
1602                 }\r
1603         }\r
1604         else\r
1605         {\r
1606                 if (RevAct)\r
1607                 {\r
1608                         Act = 1;\r
1609                 }\r
1610         }\r
1611         return Act;\r
1612 };\r
1613 \r
1614 void(entity Goal, entity AP) DoGoalWork = \r
1615 {\r
1616         local entity te;\r
1617         local entity RI;\r
1618         if (Goal.activate_goal_no != 0)\r
1619         {\r
1620                 te = Findgoal(Goal.activate_goal_no);\r
1621                 if (te)\r
1622                 {\r
1623                         AttemptToActivate(te, AP, Goal);\r
1624                 }\r
1625         }\r
1626         if (Goal.inactivate_goal_no != 0)\r
1627         {\r
1628                 te = Findgoal(Goal.inactivate_goal_no);\r
1629                 if (te)\r
1630                 {\r
1631                         InactivateGoal(te);\r
1632                 }\r
1633         }\r
1634         if (Goal.restore_goal_no != 0)\r
1635         {\r
1636                 te = Findgoal(Goal.restore_goal_no);\r
1637                 if (te)\r
1638                 {\r
1639                         RestoreGoal(te);\r
1640                 }\r
1641         }\r
1642         if (Goal.remove_goal_no != 0)\r
1643         {\r
1644                 te = Findgoal(Goal.remove_goal_no);\r
1645                 if (te)\r
1646                 {\r
1647                         RemoveGoal(te);\r
1648                 }\r
1649         }\r
1650         if (Goal.return_item_no != 0)\r
1651         {\r
1652                 te = Finditem(Goal.return_item_no);\r
1653                 if (te)\r
1654                 {\r
1655                         if (te.goal_state == 1)\r
1656                         {\r
1657                                 tfgoalitem_RemoveFromPlayer(te, te.owner, 1);\r
1658                         }\r
1659                         RI = spawn();\r
1660                         RI.enemy = te;\r
1661                         RI.think = ReturnItem;\r
1662                         RI.nextthink = time + 0.1;\r
1663                         te.solid = 0;\r
1664                 }\r
1665         }\r
1666         if (Goal.remove_spawnpoint != 0)\r
1667         {\r
1668                 te = Findteamspawn(Goal.remove_spawnpoint);\r
1669                 if (te)\r
1670                 {\r
1671                         te.goal_state = 3;\r
1672                         te.team_str_home = string_null;\r
1673                 }\r
1674         }\r
1675         if (Goal.restore_spawnpoint != 0)\r
1676         {\r
1677                 te = Findteamspawn(Goal.restore_spawnpoint);\r
1678                 if (te)\r
1679                 {\r
1680                         if (te.goal_state == 3)\r
1681                         {\r
1682                                 te.goal_state = 2;\r
1683                                 if (te.team_no == 1)\r
1684                                 {\r
1685                                         te.team_str_home = "ts1";\r
1686                                 }\r
1687                                 else\r
1688                                 {\r
1689                                         if (te.team_no == 2)\r
1690                                         {\r
1691                                                 te.team_str_home = "ts2";\r
1692                                         }\r
1693                                         else\r
1694                                         {\r
1695                                                 if (te.team_no == 3)\r
1696                                                 {\r
1697                                                         te.team_str_home = "ts3";\r
1698                                                 }\r
1699                                                 else\r
1700                                                 {\r
1701                                                         if (te.team_no == 4)\r
1702                                                         {\r
1703                                                                 te.team_str_home = "ts4";\r
1704                                                         }\r
1705                                                 }\r
1706                                         }\r
1707                                 }\r
1708                         }\r
1709                 }\r
1710         }\r
1711 };\r
1712 \r
1713 void(entity Goal, entity AP) DoGroupWork = \r
1714 {\r
1715         local string st;\r
1716         local entity tg;\r
1717         local float allset;\r
1718         if (Goal.all_active != 0)\r
1719         {\r
1720                 if (Goal.last_impulse == 0)\r
1721                 {\r
1722                         dprint("Goal ");\r
1723                         st = ftos(Goal.goal_no);\r
1724                         dprint(st);\r
1725                         dprint(" has a .all_active specified, but no .last_impulse\n");\r
1726                 }\r
1727                 else\r
1728                 {\r
1729                         allset = 1;\r
1730                         tg = find(world, classname, "info_tfgoal");\r
1731                         while (tg)\r
1732                         {\r
1733                                 if (tg.group_no == Goal.all_active)\r
1734                                 {\r
1735                                         if (tg.goal_state != 1)\r
1736                                         {\r
1737                                                 allset = 0;\r
1738                                         }\r
1739                                 }\r
1740                                 tg = find(tg, classname, "info_tfgoal");\r
1741                         }\r
1742                         if (allset)\r
1743                         {\r
1744                                 tg = Findgoal(Goal.last_impulse);\r
1745                                 if (tg)\r
1746                                 {\r
1747                                         DoResults(tg, AP, Goal.goal_result & 2);\r
1748                                 }\r
1749                         }\r
1750                 }\r
1751         }\r
1752         if (Goal.activate_group_no != 0)\r
1753         {\r
1754                 tg = find(world, classname, "info_tfgoal");\r
1755                 while (tg)\r
1756                 {\r
1757                         if (tg.group_no == Goal.activate_group_no)\r
1758                         {\r
1759                                 DoResults(tg, AP, 0);\r
1760                         }\r
1761                         tg = find(tg, classname, "info_tfgoal");\r
1762                 }\r
1763         }\r
1764         if (Goal.inactivate_group_no != 0)\r
1765         {\r
1766                 tg = find(world, classname, "info_tfgoal");\r
1767                 while (tg)\r
1768                 {\r
1769                         if (tg.group_no == Goal.inactivate_group_no)\r
1770                         {\r
1771                                 InactivateGoal(tg);\r
1772                         }\r
1773                         tg = find(tg, classname, "info_tfgoal");\r
1774                 }\r
1775         }\r
1776         if (Goal.remove_group_no != 0)\r
1777         {\r
1778                 tg = find(world, classname, "info_tfgoal");\r
1779                 while (tg)\r
1780                 {\r
1781                         if (tg.group_no == Goal.remove_group_no)\r
1782                         {\r
1783                                 RemoveGoal(tg);\r
1784                         }\r
1785                         tg = find(tg, classname, "info_tfgoal");\r
1786                 }\r
1787         }\r
1788         if (Goal.restore_group_no != 0)\r
1789         {\r
1790                 tg = find(world, classname, "info_tfgoal");\r
1791                 while (tg)\r
1792                 {\r
1793                         if (tg.group_no == Goal.restore_group_no)\r
1794                         {\r
1795                                 RestoreGoal(tg);\r
1796                         }\r
1797                         tg = find(tg, classname, "info_tfgoal");\r
1798                 }\r
1799         }\r
1800         if (Goal.remove_spawngroup != 0)\r
1801         {\r
1802                 tg = find(world, classname, "info_player_teamspawn");\r
1803                 while (tg)\r
1804                 {\r
1805                         if (tg.group_no == Goal.remove_spawngroup)\r
1806                         {\r
1807                                 tg.goal_state = 3;\r
1808                                 tg.team_str_home = string_null;\r
1809                         }\r
1810                         tg = find(tg, classname, "info_player_teamspawn");\r
1811                 }\r
1812         }\r
1813         if (Goal.restore_spawngroup != 0)\r
1814         {\r
1815                 tg = find(world, classname, "info_player_teamspawn");\r
1816                 while (tg)\r
1817                 {\r
1818                         if (tg.group_no == Goal.restore_spawngroup)\r
1819                         {\r
1820                                 tg.goal_state = 2;\r
1821                                 if (tg.team_no == 1)\r
1822                                 {\r
1823                                         tg.team_str_home = "ts1";\r
1824                                 }\r
1825                                 else\r
1826                                 {\r
1827                                         if (tg.team_no == 2)\r
1828                                         {\r
1829                                                 tg.team_str_home = "ts2";\r
1830                                         }\r
1831                                         else\r
1832                                         {\r
1833                                                 if (tg.team_no == 3)\r
1834                                                 {\r
1835                                                         tg.team_str_home = "ts3";\r
1836                                                 }\r
1837                                                 else\r
1838                                                 {\r
1839                                                         if (tg.team_no == 4)\r
1840                                                         {\r
1841                                                                 tg.team_str_home = "ts4";\r
1842                                                         }\r
1843                                                 }\r
1844                                         }\r
1845                                 }\r
1846                         }\r
1847                         tg = find(tg, classname, "info_player_teamspawn");\r
1848                 }\r
1849         }\r
1850 };\r
1851 \r
1852 void(entity Item, entity AP) DoItemGroupWork = \r
1853 {\r
1854         local entity tg;\r
1855         local entity carrier;\r
1856         local float allcarried;\r
1857         local string st;\r
1858         allcarried = 1;\r
1859         if (Item.distance != 0)\r
1860         {\r
1861                 if (Item.pain_finished == 0)\r
1862                 {\r
1863                         dprint("GoalItem ");\r
1864                         st = ftos(Item.goal_no);\r
1865                         dprint(st);\r
1866                         dprint(" has a .distance specified, but no .pain_finished\n");\r
1867                 }\r
1868                 tg = find(world, classname, "item_tfgoal");\r
1869                 while (tg)\r
1870                 {\r
1871                         if (tg.group_no == Item.distance)\r
1872                         {\r
1873                                 if (tg.goal_state != 1)\r
1874                                 {\r
1875                                         allcarried = 0;\r
1876                                 }\r
1877                         }\r
1878                         tg = find(tg, classname, "item_tfgoal");\r
1879                 }\r
1880                 if (allcarried == 1)\r
1881                 {\r
1882                         tg = Findgoal(Item.pain_finished);\r
1883                         if (tg)\r
1884                         {\r
1885                                 DoResults(tg, AP, Item.goal_result & 2);\r
1886                         }\r
1887                 }\r
1888         }\r
1889         allcarried = 1;\r
1890         if (Item.speed != 0)\r
1891         {\r
1892                 if (Item.attack_finished == 0)\r
1893                 {\r
1894                         dprint("GoalItem ");\r
1895                         st = ftos(Item.goal_no);\r
1896                         dprint(st);\r
1897                         dprint(" has a .speed specified, but no .attack_finished\n");\r
1898                 }\r
1899                 carrier = world;\r
1900                 tg = find(world, classname, "item_tfgoal");\r
1901                 while (tg)\r
1902                 {\r
1903                         if (tg.group_no == Item.speed)\r
1904                         {\r
1905                                 if (tg.goal_state != 1)\r
1906                                 {\r
1907                                         allcarried = 0;\r
1908                                 }\r
1909                                 else\r
1910                                 {\r
1911                                         if (carrier == world)\r
1912                                         {\r
1913                                                 carrier = tg.owner;\r
1914                                         }\r
1915                                         else\r
1916                                         {\r
1917                                                 if (carrier != tg.owner)\r
1918                                                 {\r
1919                                                         allcarried = 0;\r
1920                                                 }\r
1921                                         }\r
1922                                 }\r
1923                         }\r
1924                         tg = find(tg, classname, "item_tfgoal");\r
1925                 }\r
1926                 if (allcarried == 1)\r
1927                 {\r
1928                         tg = Findgoal(Item.attack_finished);\r
1929                         if (tg)\r
1930                         {\r
1931                                 DoResults(tg, AP, Item.goal_result & 2);\r
1932                         }\r
1933                 }\r
1934         }\r
1935 };\r
1936 \r
1937 void(entity Goal, entity AP) DoTriggerWork = \r
1938 {\r
1939         local entity t;\r
1940         if (Goal.killtarget)\r
1941         {\r
1942                 t = world;\r
1943                 do\r
1944                 {\r
1945                         t = find(t, targetname, Goal.killtarget);\r
1946                         if (t != world)\r
1947                         {\r
1948                                 remove(t);\r
1949                         }\r
1950                 } while (t != world);\r
1951         }\r
1952         if (Goal.target)\r
1953         {\r
1954                 t = world;\r
1955                 activator = AP;\r
1956                 do\r
1957                 {\r
1958                         t = find(t, targetname, Goal.target);\r
1959                         if (t == world)\r
1960                         {\r
1961                                 return;\r
1962                         }\r
1963                         stemp = self;\r
1964                         otemp = other;\r
1965                         self = t;\r
1966                         other = stemp;\r
1967                         if (self.use != SUB_Null)\r
1968                         {\r
1969                                 if (self.use)\r
1970                                 {\r
1971                                         self.use();\r
1972                                 }\r
1973                         }\r
1974                         self = stemp;\r
1975                         other = otemp;\r
1976                         activator = AP;\r
1977                 } while (t != world);\r
1978         }\r
1979 };\r
1980 \r
1981 void() DelayedResult = \r
1982 {\r
1983         if (self.enemy.goal_state == 4)\r
1984         {\r
1985                 DoResults(self.enemy, self.owner, self.weapon);\r
1986         }\r
1987         dremove(self);\r
1988 };\r
1989 \r
1990 void(entity Goal, entity AP, float addb) DoResults = \r
1991 {\r
1992         local entity te;\r
1993 \r
1994         local float winners;\r
1995 \r
1996         if (Goal.goal_state == 1)\r
1997         {\r
1998                 return;\r
1999         }\r
2000         if (Goal.delay_time > 0 && Goal.goal_state != 4)\r
2001         {\r
2002                 Goal.goal_state = 4;\r
2003                 te = spawn();\r
2004                 te.think = DelayedResult;\r
2005                 te.nextthink = time + Goal.delay_time;\r
2006                 te.owner = AP;\r
2007                 te.enemy = Goal;\r
2008                 te.weapon = addb;\r
2009                 return;\r
2010         }\r
2011         UpdateAbbreviations(Goal);\r
2012         Goal.goal_state = 2;\r
2013         if (Goal.noise)\r
2014         {\r
2015                 if (Goal.volume == 1)\r
2016                 {\r
2017                         sound(other, 3, Goal.noise, 1, 0);\r
2018                 }\r
2019                 else\r
2020                 {\r
2021                         sound(other, 3, Goal.noise, 1, 1);\r
2022                 }\r
2023         }\r
2024         winners = 0;\r
2025         if (Goal.increase_team1 != 0)\r
2026         {\r
2027                 TeamFortress_TeamIncreaseScore(1, Goal.increase_team1);\r
2028                 winners = 1;\r
2029         }\r
2030         if (Goal.increase_team2 != 0)\r
2031         {\r
2032                 TeamFortress_TeamIncreaseScore(2, Goal.increase_team2);\r
2033                 winners = 1;\r
2034         }\r
2035         if (Goal.increase_team3 != 0)\r
2036         {\r
2037                 TeamFortress_TeamIncreaseScore(3, Goal.increase_team3);\r
2038                 winners = 1;\r
2039         }\r
2040         if (Goal.increase_team4 != 0)\r
2041         {\r
2042                 TeamFortress_TeamIncreaseScore(4, Goal.increase_team4);\r
2043                 winners = 1;\r
2044         }\r
2045         if (winners == 1)\r
2046         {\r
2047                 TeamFortress_TeamShowScores(2);\r
2048         }\r
2049         te = find(world, classname, "player");\r
2050         while (te != world)\r
2051         {\r
2052                 if (Goal.broadcast != string_null && CTF_Map == 0)\r
2053                 {\r
2054                         CenterPrint2(te, "\n\n\n", Goal.broadcast);\r
2055                 }\r
2056                 if (Goal.netname_broadcast != string_null && CTF_Map == 0)\r
2057                 {\r
2058                         sprint(te,AP.netname);\r
2059                         sprint(te,Goal.netname_broadcast);\r
2060                 }\r
2061                 if (AP == te)\r
2062                 {\r
2063                         if (Goal.message != string_null)\r
2064                         {\r
2065                                 CenterPrint2(te, Goal.message, AP.netname);\r
2066                         }\r
2067                 }\r
2068                 else\r
2069                 {\r
2070                         if (AP.team_no == te.team_no)\r
2071                         {\r
2072                                 if (Goal.owners_team_broadcast != string_null && te.team_no == Goal.owned_by)\r
2073                                 {\r
2074                                         CenterPrint2(te, Goal.owners_team_broadcast, AP.netname);\r
2075                                 }\r
2076                                 else\r
2077                                 {\r
2078                                         if (Goal.team_broadcast != string_null)\r
2079                                         {\r
2080                                                 CenterPrint2(te, Goal.team_broadcast, AP.netname);\r
2081                                         }\r
2082                                 }\r
2083                                 if (Goal.netname_owners_team_broadcast != string_null && te.team_no == Goal.owned_by)\r
2084                                 {\r
2085                                         sprint(te,AP.netname);\r
2086                                         sprint(te,Goal.netname_owners_team_broadcast);\r
2087                                 }\r
2088                                 else\r
2089                                 {\r
2090                                         if (Goal.netname_team_broadcast != string_null)\r
2091                                         {\r
2092                                                 sprint(te,AP.netname);\r
2093                                                 sprint(te,Goal.netname_team_broadcast);\r
2094                                         }\r
2095                                 }\r
2096                         }\r
2097                         else\r
2098                         {\r
2099                                 if (Goal.owners_team_broadcast != string_null && te.team_no == Goal.owned_by)\r
2100                                 {\r
2101                                         CenterPrint2(te, Goal.owners_team_broadcast, AP.netname);\r
2102                                 }\r
2103                                 else\r
2104                                 {\r
2105                                         if (Goal.non_team_broadcast != string_null)\r
2106                                         {\r
2107                                                 CenterPrint2(te, Goal.non_team_broadcast, AP.netname);\r
2108                                         }\r
2109                                 }\r
2110                                 if (Goal.netname_owners_team_broadcast != string_null && te.team_no == Goal.owned_by)\r
2111                                 {\r
2112                                         sprint(te,AP.netname);\r
2113                                         sprint(te,Goal.netname_owners_team_broadcast);\r
2114                                 }\r
2115                                 else\r
2116                                 {\r
2117                                         if (Goal.netname_non_team_broadcast != string_null)\r
2118                                         {\r
2119                                                 sprint(te,AP.netname);\r
2120                                                 sprint(te,Goal.netname_non_team_broadcast);\r
2121                                         }\r
2122                                 }\r
2123                         }\r
2124                 }\r
2125                 if (IsAffectedBy(Goal, te, AP))\r
2126                 {\r
2127                         if (Goal.search_time != 0 && (Goal.goal_effects & 64))\r
2128                         {\r
2129                                 if (APMeetsCriteria(Goal, te))\r
2130                                 {\r
2131                                         Apply_Results(Goal, te, AP, addb);\r
2132                                 }\r
2133                         }\r
2134                         else\r
2135                         {\r
2136                                 Apply_Results(Goal, te, AP, addb);\r
2137                         }\r
2138                 }\r
2139                 te = find(te, classname, "player");\r
2140         }\r
2141         if (Goal.classname != "item_tfgoal")\r
2142         {\r
2143                 Goal.goal_state = 1;\r
2144         }\r
2145         if (Goal.goal_result & 4)\r
2146         {\r
2147                 TeamFortress_TeamShowScores(1);\r
2148                 winners = TeamFortress_TeamGetWinner();\r
2149                 te = find(world, classname, "player");\r
2150                 while (te)\r
2151                 {\r
2152                         te.takedamage = 0;\r
2153                         te.movetype = 0;\r
2154                         te.velocity = '0 0 0';\r
2155                         te.avelocity = '0 0 0';\r
2156                         te = find(te, classname, "player");\r
2157                 }\r
2158                 te = spawn();\r
2159                 te.nextthink = time + 5;\r
2160                 te.think = execute_changelevel;\r
2161 //              te.think = changelevel;                 // Wazat -- may need fixing\r
2162                 dremove(Goal);\r
2163                 return;\r
2164         }\r
2165 \r
2166         DoGroupWork(Goal, AP);\r
2167         DoGoalWork(Goal, AP);\r
2168         DoTriggerWork(Goal, AP);\r
2169         if (Goal.classname == "info_tfgoal")\r
2170         {\r
2171                 SetupRespawn(Goal);\r
2172         }\r
2173 };\r
2174 \r
2175 void() tfgoal_touch = \r
2176 {\r
2177         if (!(self.goal_activation & 1))\r
2178         {\r
2179                 return;\r
2180         }\r
2181         if (other.classname != "player")\r
2182         {\r
2183                 return;\r
2184         }\r
2185         if (other.is_dead == 1)         // TEMP\r
2186         {\r
2187                 return;\r
2188         }\r
2189         if (self.goal_state == 1)\r
2190         {\r
2191                 return;\r
2192         }\r
2193         AttemptToActivate(self, other, self);\r
2194 };\r
2195 \r
2196 void() info_tfgoal_use = \r
2197 {\r
2198         AttemptToActivate(self, activator, self);\r
2199 };\r
2200 \r
2201 void() tfgoal_timer_tick = \r
2202 {\r
2203         if (self.goal_state != 3)\r
2204         {\r
2205                 if (APMeetsCriteria(self, world))\r
2206                 {\r
2207                         DoResults(self, world, 1);\r
2208                 }\r
2209                 else\r
2210                 {\r
2211                         InactivateGoal(self);\r
2212                         self.think = tfgoal_timer_tick;\r
2213                         self.nextthink = time + self.search_time;\r
2214                 }\r
2215         }\r
2216 };\r
2217 \r
2218 void() item_tfgoal_touch = \r
2219 {\r
2220         local entity te;\r
2221         if (other.is_dead == 1)         // TEMP\r
2222         {\r
2223                 return;\r
2224         }\r
2225         if (other.classname != "player")\r
2226         {\r
2227                 return;\r
2228         }\r
2229         if (other.health <= 0)\r
2230         {\r
2231                 return;\r
2232         }\r
2233         // for flag dropping\r
2234         if ( (self.tent == other) && (time < self.option5) )\r
2235         {\r
2236                 return;\r
2237         }\r
2238         if (Activated(self, other))\r
2239         {\r
2240                 tfgoalitem_GiveToPlayer(self, other, self);\r
2241                 self.goal_state = 1;\r
2242         }\r
2243         else\r
2244         {\r
2245                 if (self.else_goal != 0)\r
2246                 {\r
2247                         te = Findgoal(self.else_goal);\r
2248                         if (te)\r
2249                         {\r
2250                                 AttemptToActivate(te, other, self);\r
2251                         }\r
2252                 }\r
2253         }\r
2254 };\r
2255 \r
2256 void(entity Item, entity AP, entity Goal) tfgoalitem_GiveToPlayer = \r
2257 {\r
2258         Item.owner = AP;\r
2259         if (Item.mdl != string_null)\r
2260         {\r
2261                 setmodel(Item, string_null);\r
2262         }\r
2263         Item.solid = 0;\r
2264         if (Item.goal_activation & 1)\r
2265         {\r
2266                 AP.effects = AP.effects | 8;\r
2267         }\r
2268         if (Item.goal_activation & 2)\r
2269         {\r
2270                 TeamFortress_SetSpeed(AP);\r
2271         }\r
2272         if (Item.goal_activation & 512)\r
2273         {\r
2274                 Item.effects = Item.effects - (Item.effects | 8);\r
2275         }\r
2276 // NexTF Flags\r
2277         if (Item.items & 133701)\r
2278         {\r
2279                 AP.items = AP.items | 262144;\r
2280                 if (Item.team_no == 1)\r
2281                         AP.effects = AP.effects | EF_BLUE;\r
2282                 else if (Item.team_no == 2)\r
2283                         AP.effects = AP.effects | EF_RED;\r
2284                 else\r
2285                         AP.effects = AP.effects | 128;\r
2286                 newmis = spawn();\r
2287                 newmis.owner = AP;\r
2288                 newmis.movetype = 4;\r
2289                 newmis.solid = 0;\r
2290                 setsize(newmis, '0 0 0', '0 0 0');\r
2291                 newmis.angles = AP.angles;\r
2292                 newmis.nextthink = time + 0.5;\r
2293                 newmis.think = MoveFlag;\r
2294                 newmis.skin = 2;\r
2295                 setmodel(newmis, Item.mdl);\r
2296                 setorigin(newmis, AP.origin);\r
2297         }\r
2298         else {\r
2299         if (Item.items & 131072)\r
2300         {\r
2301                 AP.items = AP.items | 131072;\r
2302                 AP.effects = AP.effects | 64;\r
2303                 newmis = spawn();\r
2304                 newmis.owner = AP;\r
2305                 newmis.movetype = 4;\r
2306                 newmis.solid = 0;\r
2307                 setsize(newmis, '0 0 0', '0 0 0');\r
2308                 newmis.angles = AP.angles;\r
2309                 newmis.nextthink = time + 0.5;\r
2310                 newmis.think = MoveFlag;\r
2311                 newmis.skin = 1;\r
2312                 setmodel(newmis, "progs/tf_flag.mdl");\r
2313                 setorigin(newmis, AP.origin);\r
2314         }\r
2315         if (Item.items & 262144)\r
2316         {\r
2317                 AP.items = AP.items | 262144;\r
2318                 AP.effects = AP.effects | 128;\r
2319                 newmis = spawn();\r
2320                 newmis.owner = AP;\r
2321                 newmis.movetype = 4;\r
2322                 newmis.solid = 0;\r
2323                 setsize(newmis, '0 0 0', '0 0 0');\r
2324                 newmis.angles = AP.angles;\r
2325                 newmis.nextthink = time + 0.5;\r
2326                 newmis.think = MoveFlag;\r
2327                 newmis.skin = 2;\r
2328                 setmodel(newmis, "progs/tf_flag.mdl");\r
2329                 setorigin(newmis, AP.origin);\r
2330         }\r
2331         }\r
2332         if (Goal != Item)\r
2333         {\r
2334                 if (Goal.goal_result & 8)\r
2335                 {\r
2336                         Item.goal_state = 1;\r
2337                         return;\r
2338                 }\r
2339         }\r
2340 /*      if (AP.playerclass == 8 && (Item.goal_result & 16))\r
2341         {\r
2342                 AP.is_unabletospy = 1;\r
2343         }*/\r
2344         if (AP.class == 2 && (Item.goal_result & 16))\r
2345         {\r
2346                 AP.is_unabletospy = 1;\r
2347         }\r
2348         DoResults(Item, AP, 1);\r
2349         DoItemGroupWork(Item, AP);\r
2350 };\r
2351 \r
2352 void() ReturnItem = \r
2353 {\r
2354         self.enemy.goal_state = 2;\r
2355         self.enemy.solid = 1;\r
2356         self.enemy.movetype = 0;\r
2357         self.enemy.touch = item_tfgoal_touch;\r
2358         self.enemy.origin = self.enemy.oldorigin;\r
2359         if (self.enemy.mdl != string_null)\r
2360         {\r
2361                 setmodel(self.enemy, self.enemy.mdl);\r
2362         }\r
2363         setorigin(self.enemy, self.enemy.origin);\r
2364         //sound(self.enemy,"items/itembk2.wav", 1, 1);\r
2365         sound (self.enemy, 2, "items/itembk2.wav", 1, 1);\r
2366         tfgoalitem_checkgoalreturn(self.enemy);\r
2367         dremove(self);\r
2368 };\r
2369 \r
2370 void (entity Item, entity AP, float method) tfgoalitem_RemoveFromPlayer =\r
2371 {\r
2372         local entity te;\r
2373         local float lighton;\r
2374         local float slowon;\r
2375         local float key1on;\r
2376         local float key2on;\r
2377         local float spyoff;\r
2378         local entity DelayReturn;\r
2379 \r
2380         if ((Item == world))\r
2381         {\r
2382                 objerror ("error: tfgoalitem_RemoveFromPlayer(): Item == world");\r
2383                 return;\r
2384         }\r
2385         lighton = 0;\r
2386         slowon = 0;\r
2387         key1on = 0;\r
2388         key2on = 0;\r
2389         spyoff = 0;\r
2390         te = find (world, classname, "item_tfgoal");\r
2391         while (te)\r
2392         {\r
2393                 if (((te.owner == AP) && (te != Item)))\r
2394                 {\r
2395                         if ((te.goal_activation & 1))\r
2396                         {\r
2397                                 lighton = 1;\r
2398                         }\r
2399                         if ((te.goal_activation & 2))\r
2400                         {\r
2401                                 slowon = 1;\r
2402                         }\r
2403                         if ((te.items & 131072))\r
2404                         {\r
2405                                 key1on = 1;\r
2406                         }\r
2407                         if ((te.items & 262144))\r
2408                         {\r
2409                                 key2on = 1;\r
2410                         }\r
2411                         if ((te.goal_result & 16))\r
2412                         {\r
2413                                 spyoff = 1;\r
2414                         }\r
2415                 }\r
2416                 te = find (te, classname, "item_tfgoal");\r
2417         }\r
2418         if (!lighton)\r
2419         {\r
2420                 if ((AP.invincible_finished > (time + 3)))\r
2421                 {\r
2422                         lighton = 1;\r
2423                 }\r
2424                 else\r
2425                 {\r
2426                         if ((AP.super_damage_finished > (time + 3)))\r
2427                         {\r
2428                                 lighton = 1;\r
2429                         }\r
2430                 }\r
2431         }\r
2432         if (!lighton)\r
2433         {\r
2434                 AP.effects = (AP.effects - (AP.effects & 8));\r
2435                 AP.effects = (AP.effects - (AP.effects & 64));\r
2436                 AP.effects = (AP.effects - (AP.effects & 128));\r
2437         }\r
2438         if ((Item.goal_activation & 512))\r
2439         {\r
2440                 Item.effects = (Item.effects | 8);\r
2441         }\r
2442         if (!spyoff)\r
2443         {\r
2444                 AP.is_unabletospy = 0;\r
2445         }\r
2446         if (!key1on)\r
2447         {\r
2448                 AP.items = (AP.items - (AP.items & 131072));\r
2449         }\r
2450         if (!key2on)\r
2451         {\r
2452                 AP.items = (AP.items - (AP.items & 262144));\r
2453         }\r
2454         te = find (world, classname, "player");\r
2455         while ((te != world))\r
2456         {\r
2457                 if (IsAffectedBy (Item, te, AP))\r
2458                 {\r
2459                         RemoveResults (Item, te);\r
2460                 }\r
2461                 te = find (te, classname, "player");\r
2462         }\r
2463         if (((method == 0) || (method == 2)))\r
2464         {\r
2465                 te = find (world, classname, "player");\r
2466                 while ((te != world))\r
2467                 {\r
2468                         if ((te.team_no == Item.owned_by))\r
2469                         {\r
2470                                 if ((Item.team_drop != string_null))\r
2471                                 {\r
2472                                         CenterPrint2 (te, "\n\n\n", Item.team_drop);\r
2473                                 }\r
2474                                 if ((Item.netname_team_drop != string_null))\r
2475                                 {\r
2476                                         sprint (te, AP.netname);\r
2477                                         sprint (te, Item.netname_team_drop);\r
2478                                 }\r
2479                         }\r
2480                         else\r
2481                         {\r
2482                                 if ((Item.non_team_drop != string_null))\r
2483                                 {\r
2484                                         CenterPrint2 (te, "\n\n\n", Item.non_team_drop);\r
2485                                 }\r
2486                                 if ((Item.netname_non_team_drop != string_null))\r
2487                                 {\r
2488                                         sprint (te, AP.netname);\r
2489                                         sprint (te, Item.netname_non_team_drop);\r
2490                                 }\r
2491                         }\r
2492                         te = find (te, classname, "player");\r
2493                 }\r
2494                 if ((Item.goal_activation & 8))\r
2495                 {\r
2496                         DelayReturn = spawn ();\r
2497                         DelayReturn.enemy = Item;\r
2498                         if ((method == 0))\r
2499                         {\r
2500                                 DelayReturn.weapon = 0;\r
2501                         }\r
2502                         else\r
2503                         {\r
2504                                 DelayReturn.weapon = 1;\r
2505                         }\r
2506                         DelayReturn.think = ReturnItem;\r
2507                         DelayReturn.nextthink = (time + 0.5);\r
2508                 }\r
2509                 else\r
2510                 {\r
2511                         if ((Item.goal_activation & 4))\r
2512                         {\r
2513                                 if (((method == 2) && (Item.goal_activation & 4096)))\r
2514                                 {\r
2515                                         tfgoalitem_drop (Item, 1, AP);\r
2516                                 }\r
2517                                 else\r
2518                                 {\r
2519                                         tfgoalitem_drop (Item, 0, AP);\r
2520                                 }\r
2521                         }\r
2522                         else\r
2523                         {\r
2524                                 Item.owner = world;\r
2525                                 dremove (Item);\r
2526                                 TeamFortress_SetSpeed (AP);\r
2527                                 return;\r
2528                         }\r
2529                 }\r
2530                 Item.owner = world;\r
2531                 Item.flags = (Item.flags - (Item.flags & 512));\r
2532                 setsize (Item, Item.goal_min, Item.goal_max);\r
2533                 TeamFortress_SetSpeed (AP);\r
2534                 return;\r
2535         }\r
2536         else\r
2537         {\r
2538         if (method == 1)\r
2539         {\r
2540                         if (Item.goal_activation & 16)\r
2541                         {\r
2542                                 DelayReturn = spawn();\r
2543                                 DelayReturn.enemy = Item;\r
2544                                 DelayReturn.think = ReturnItem;\r
2545                                 DelayReturn.nextthink = time + 0.5;\r
2546                                 Item.owner = world;\r
2547                                 TeamFortress_SetSpeed(AP);\r
2548                                 return;\r
2549                         }\r
2550                         Item.solid = 0;\r
2551                         Item.owner = world;\r
2552                         TeamFortress_SetSpeed(AP);\r
2553                         return;\r
2554                 }\r
2555         }\r
2556         objerror ("Invalid method passed into tfgoalitem_RemoveFromPlayer\n");\r
2557 };\r
2558 \r
2559 // MTF's remove from player function\r
2560 /*void(entity Item, entity AP, float method) tfgoalitem_RemoveFromPlayer = \r
2561 {\r
2562         local entity te;\r
2563         local float lighton;\r
2564         local float slowon;\r
2565         local float key1on;\r
2566         local float key2on;\r
2567         local float spyoff;\r
2568         local string db1;\r
2569         local entity DelayReturn;\r
2570         if (Item == world)\r
2571         {\r
2572                 dprint("error: tfgoalitem_RemoveFromPlayer(): Item == world");\r
2573                 return;\r
2574         }\r
2575         lighton = 0;\r
2576         slowon = 0;\r
2577         key1on = 0;\r
2578         key2on = 0;\r
2579         spyoff = 0;\r
2580         te = find(world, classname, "item_tfgoal");\r
2581         while (te)\r
2582         {\r
2583                 if (te.owner == AP && te != Item)\r
2584                 {\r
2585                         if (te.goal_activation & 1)\r
2586                         {\r
2587                                 lighton = 1;\r
2588                         }\r
2589                         if (te.goal_activation & 2)\r
2590                         {\r
2591                                 slowon = 1;\r
2592                         }\r
2593                         if (te.items & 131072)\r
2594                         {\r
2595                                 key1on = 1;\r
2596                         }\r
2597                         if (te.items & 262144)\r
2598                         {\r
2599                                 key2on = 1;\r
2600                         }\r
2601                         if (te.goal_result & 16)\r
2602                         {\r
2603                                 spyoff = 1;\r
2604                         }\r
2605                 }\r
2606                 te = find(te, classname, "item_tfgoal");\r
2607         }\r
2608         if (!lighton)\r
2609         {\r
2610                 if (AP.invincible_finished > time + 3)\r
2611                 {\r
2612                         lighton = 1;\r
2613                 }\r
2614         }\r
2615         if (!lighton)\r
2616         {\r
2617                 AP.effects = AP.effects - (AP.effects & 8);\r
2618         }\r
2619         if (Item.goal_activation & 512)\r
2620         {\r
2621                 Item.effects = Item.effects | 8;\r
2622         }\r
2623         if (!spyoff)\r
2624         {\r
2625                 AP.is_unabletospy = 0;\r
2626         }\r
2627         if (!key1on)\r
2628         {\r
2629                 AP.items = AP.items - (AP.items & 131072);\r
2630         }\r
2631         if (!key2on)\r
2632         {\r
2633                 AP.items = AP.items - (AP.items & 262144);\r
2634         }\r
2635         te = find(world, classname, "player");\r
2636         while (te != world)\r
2637         {\r
2638                 if (IsAffectedBy(Item, te, AP))\r
2639                 {\r
2640                         RemoveResults(Item, te);\r
2641                 }\r
2642                 te = find(te, classname, "player");\r
2643         }\r
2644         if ((method == 0) || (method == 2))\r
2645         {\r
2646                 te = find(world, classname, "player");\r
2647                 while (te != world)\r
2648                 {\r
2649                         if (te.team_no == Item.owned_by)\r
2650                         {\r
2651                                 if (Item.team_drop != string_null)\r
2652                                 {\r
2653                                         CenterPrint2(te, "\n\n\n", Item.team_drop);\r
2654                                 }\r
2655                                 if (Item.netname_team_drop != string_null)\r
2656                                 {\r
2657                                         sprint(te,AP.netname);\r
2658                                         sprint(te,Item.netname_team_drop);\r
2659                                 }\r
2660                         }\r
2661                         else\r
2662                         {\r
2663                                 if (Item.non_team_drop != string_null)\r
2664                                 {\r
2665                                         CenterPrint2(te, "\n\n\n", Item.non_team_drop);\r
2666                                 }\r
2667                                 if (Item.netname_non_team_drop != string_null)\r
2668                                 {\r
2669                                         sprint(te,AP.netname);\r
2670                                         sprint(te,Item.netname_non_team_drop);\r
2671                                 }\r
2672                         }\r
2673                         te = find(te, classname, "player");\r
2674                 }\r
2675                 if (Item.goal_activation & 8)\r
2676                 {\r
2677                         DelayReturn = spawn();\r
2678                         DelayReturn.enemy = Item;\r
2679                         DelayReturn.think = ReturnItem;\r
2680                         DelayReturn.nextthink = time + 0.5;\r
2681                 }\r
2682                 else\r
2683                 {\r
2684                         if (Item.goal_activation & 4)\r
2685                         {\r
2686                                 if (method == 0)\r
2687                                         tfgoalitem_drop(Item);\r
2688                         }\r
2689                         else\r
2690                         {\r
2691                                 Item.owner = world;\r
2692                                 dremove(Item);\r
2693                                 TeamFortress_SetSpeed(AP);\r
2694                                 return;\r
2695                         }\r
2696                 }\r
2697                 Item.owner = world;\r
2698                 TeamFortress_SetSpeed(AP);\r
2699                 return;\r
2700         }\r
2701         if (method == 1)\r
2702         {\r
2703                 if (Item.goal_activation & 16)\r
2704                 {\r
2705                         DelayReturn = spawn();\r
2706                         DelayReturn.enemy = Item;\r
2707                         DelayReturn.think = ReturnItem;\r
2708                         DelayReturn.nextthink = time + 0.5;\r
2709                         Item.owner = world;\r
2710                         TeamFortress_SetSpeed(AP);\r
2711                         return;\r
2712                 }\r
2713                 Item.solid = 0;\r
2714                 Item.owner = world;\r
2715                 TeamFortress_SetSpeed(AP);\r
2716                 return;\r
2717         }\r
2718 \r
2719         dprint("Invalid method passed into tfgoalitem_RemoveFromPlayer\n");\r
2720 };*/\r
2721 \r
2722 void() tfgoalitem_dropthink = \r
2723 {\r
2724         local float pos;\r
2725         self.movetype = 10; //6;\r
2726         if (self.pausetime != 0)\r
2727         {\r
2728                 pos = pointcontents(self.origin);\r
2729                 if (pos == -4)\r
2730                 {\r
2731                         self.nextthink = time + self.pausetime / 4;\r
2732                 }\r
2733                 else\r
2734                 {\r
2735                         if (pos == -5)\r
2736                         {\r
2737                                 self.nextthink = time + 5;\r
2738                         }\r
2739                         else\r
2740                         {\r
2741                                 if (pos == -2 || pos == -6)\r
2742                                 {\r
2743                                         self.nextthink = time + 2;\r
2744                                 }\r
2745                                 else\r
2746                                 {\r
2747                                         self.nextthink = time + self.pausetime;\r
2748                                 }\r
2749                         }\r
2750                 }\r
2751                 self.think = tfgoalitem_remove;\r
2752         }\r
2753 };\r
2754 \r
2755 void(entity Item) tfgoalitem_drop = \r
2756 {\r
2757         Item.origin = Item.owner.origin - '0 0 8';\r
2758         //Item.velocity_z = 400;\r
2759         //Item.velocity_x = -50 + random() * 100;\r
2760         //Item.velocity_y = -50 + random() * 100;\r
2761         Item.velocity_z = 1;\r
2762         Item.velocity_x = 0;\r
2763         Item.velocity_y = 0;\r
2764         Item.goal_state = 2;\r
2765         Item.movetype = 6;\r
2766         Item.solid = 1;\r
2767         Item.touch = item_tfgoal_touch;\r
2768         setorigin(Item, Item.origin - '0 0 16');\r
2769         setsize(Item, '-16 -16 0', '16 16 56');\r
2770         if (Item.mdl != string_null)\r
2771         {\r
2772                 setmodel(Item, Item.mdl);\r
2773         }\r
2774         Item.nextthink = time + 5;\r
2775         Item.think = tfgoalitem_dropthink;\r
2776 };\r
2777 \r
2778 void() tfgoalitem_remove = \r
2779 {\r
2780         local entity te;\r
2781         if (self.goal_state == 1)\r
2782         {\r
2783                 return;\r
2784         }\r
2785         if (self.goal_activation & 32)\r
2786         {\r
2787                 self.solid = 1;\r
2788                 self.touch = item_tfgoal_touch;\r
2789                 self.origin = self.oldorigin;\r
2790                 if (self.mdl != string_null)\r
2791                 {\r
2792                         setmodel(self, self.mdl);\r
2793                 }\r
2794                 setorigin(self, self.origin);\r
2795                 //sound(self,"items/itembk2.wav", 1, 1);\r
2796                 tfgoalitem_checkgoalreturn(self);\r
2797                 if (self.noise3 != string_null || self.noise4 != string_null)\r
2798                 {\r
2799                         te = find(world, classname, "player");\r
2800                         while (te)\r
2801                         {\r
2802                                 if (te.team_no == self.owned_by)\r
2803                                 {\r
2804                                         CenterPrint2(te, "\n\n\n", self.noise3);\r
2805                                 }\r
2806                                 else\r
2807                                 {\r
2808                                         CenterPrint2(te, "\n\n\n", self.noise4);\r
2809                                 }\r
2810                                 te = find(te, classname, "player");\r
2811                         }\r
2812                 }\r
2813                 return;\r
2814         }\r
2815         dremove(self);\r
2816 };\r
2817 \r
2818 void(entity Item) tfgoalitem_checkgoalreturn = \r
2819 {\r
2820         local entity te;\r
2821         if (Item.impulse != 0)\r
2822         {\r
2823                 te = Findgoal(Item.impulse);\r
2824                 if (te)\r
2825                 {\r
2826                         te = Findgoal(Item.impulse);\r
2827                         if (te)\r
2828                         {\r
2829                                 AttemptToActivate(te, world, Item);\r
2830                         }\r
2831                 }\r
2832         }\r
2833 };\r
2834 \r
2835 void(entity Goal, entity Player, entity Item) DisplayItemStatus = \r
2836 {\r
2837         if (Item.goal_state == 1)\r
2838         {\r
2839                 if (Player.team_no == Item.owned_by)\r
2840                 {\r
2841                         sprint(Player,Goal.team_str_carried);\r
2842                 }\r
2843                 else\r
2844                 {\r
2845                         sprint(Player,Goal.non_team_str_carried);\r
2846                 }\r
2847                 sprint(Player," ");\r
2848                 if (Player == Item.owner)\r
2849                 {\r
2850                         sprint(Player," You");\r
2851                 }\r
2852                 else\r
2853                 {\r
2854                         sprint(Player,Item.owner.netname);\r
2855                 }\r
2856                 sprint(Player,".");\r
2857         }\r
2858         else\r
2859         {\r
2860                 if (Item.origin != Item.oldorigin)\r
2861                 {\r
2862                         if (Player.team_no == Item.owned_by)\r
2863                         {\r
2864                                 sprint(Player,Goal.team_str_moved);\r
2865                         }\r
2866                         else\r
2867                         {\r
2868                                 sprint(Player,Goal.non_team_str_moved);\r
2869                         }\r
2870                 }\r
2871                 else\r
2872                 {\r
2873                         if (Player.team_no == Item.owned_by)\r
2874                         {\r
2875                                 sprint(Player,Goal.team_str_home);\r
2876                         }\r
2877                         else\r
2878                         {\r
2879                                 sprint(Player,Goal.non_team_str_home);\r
2880                         }\r
2881                 }\r
2882         }\r
2883         sprint(Player,"\n");\r
2884 };\r
2885 \r
2886 void() info_player_team1 = \r
2887 {\r
2888         CTF_Map = 1;\r
2889         self.classname = "info_player_teamspawn";\r
2890         self.team_no = 2;\r
2891         self.goal_effects = 1;\r
2892         self.team_str_home = "ts2";\r
2893 };\r
2894 \r
2895 void() info_player_team2 = \r
2896 {\r
2897         CTF_Map = 1;\r
2898         self.classname = "info_player_teamspawn";\r
2899         self.team_no = 1;\r
2900         self.goal_effects = 1;\r
2901         self.team_str_home = "ts1";\r
2902 };\r
2903 \r
2904 void() item_flag_team2 = \r
2905 {\r
2906         team2maxplayers = 4;            //TEMP\r
2907         local entity dp;\r
2908         CTF_Map = 1;\r
2909         precache_model("progs/w_s_key.mdl");\r
2910         precache_sound("ogre/ogwake.wav");\r
2911         precache_sound("boss2/pop2.wav");\r
2912         self.classname = "item_tfgoal";\r
2913         self.netname = "Team 1 Flag";\r
2914         self.broadcast = " ÇÏÔ the enemy team's flag!\n";\r
2915         self.deathtype = "You've got the enemy flag!\n";\r
2916         self.noise = "ogre/ogwake.wav";\r
2917         self.mdl = "progs/tf_flag.mdl";\r
2918         self.skin = 0;\r
2919         setmodel(self, self.mdl);\r
2920         self.goal_no = 1;\r
2921         self.goal_activation = 1 | 4 | 128 | 32 | 16 | 512;\r
2922         self.goal_effects = 1;\r
2923         self.pausetime = 128;\r
2924         setsize(self, '-16 -16 -24', '16 16 32');\r
2925         self.touch = item_tfgoal_touch;\r
2926         self.goal_state = 2;\r
2927         self.solid = 1;\r
2928         setorigin(self, self.origin);\r
2929         self.nextthink = time + 0.2;\r
2930         self.think = TF_PlaceItem;\r
2931         dp = spawn();\r
2932         dp.origin = self.origin;\r
2933         dp.classname = "info_tfgoal";\r
2934         dp.goal_activation = 1;\r
2935         dp.team_no = 1;\r
2936         dp.items_allowed = 2;\r
2937         dp.goal_no = 3;\r
2938         dp.goal_effects = 3;\r
2939         dp.broadcast = " ÃÁÐÔÕÒÅÄ the enemy flag!\n";\r
2940         dp.message = "You ÃÁÐÔÕÒÅÄ the enemy flag!\n";\r
2941         dp.noise = "boss2/pop2.wav";\r
2942         dp.goal_result = 2;\r
2943         dp.activate_goal_no = 5;\r
2944         dp.axhitme = 2;\r
2945         dp.count = 10;\r
2946         dp.frags = 10;\r
2947         dp.solid = 1;\r
2948         dp.goal_state = 2;\r
2949         setsize(dp, '-16 -16 -24', '16 16 32');\r
2950         dp.nextthink = time + 0.2;\r
2951         dp.think = TF_PlaceGoal;\r
2952         dp = spawn();\r
2953         dp.origin = dp.origin;\r
2954         dp.classname = "info_tfgoal";\r
2955         dp.goal_effects = 1;\r
2956         dp.frags = 5;\r
2957         dp.goal_activation = 0;\r
2958         dp.goal_no = 5;\r
2959         dp.solid = 0;\r
2960         dp.goal_state = 2;\r
2961         setsize(dp, '-16 -16 -24', '16 16 32');\r
2962         dp.nextthink = time + 0.2;\r
2963         dp.think = TF_PlaceGoal;\r
2964 };\r
2965 \r
2966 void() item_flag_team1 = \r
2967 {\r
2968         team1maxplayers = 4;            //TEMP\r
2969         local entity dp;\r
2970         CTF_Map = 1;\r
2971         precache_model("progs/tf_flag.mdl");\r
2972         precache_sound("ogre/ogwake.wav");\r
2973         precache_sound("boss2/pop2.wav");\r
2974         self.classname = "item_tfgoal";\r
2975         self.netname = "Team 2 Flag";\r
2976         self.broadcast = " ÇÏÔ the enemy team's flag!\n";\r
2977         self.deathtype = "You've got the enemy flag!\n";\r
2978         self.noise = "ogre/ogwake.wav";\r
2979         self.mdl = "progs/tf_flag.mdl";\r
2980         setmodel(self, self.mdl);\r
2981         self.skin = 1;\r
2982         self.goal_no = 2;\r
2983         self.goal_activation = 1 | 4 | 128 | 32 | 16 | 512;\r
2984         self.goal_effects = 1;\r
2985         self.pausetime = 128;\r
2986         setsize(self, '-16 -16 -24', '16 16 32');\r
2987         self.touch = item_tfgoal_touch;\r
2988         self.goal_state = 2;\r
2989         self.solid = 1;\r
2990         setorigin(self, self.origin);\r
2991         self.nextthink = time + 0.2;\r
2992         self.think = TF_PlaceItem;\r
2993         dp = spawn();\r
2994         dp.origin = self.origin;\r
2995         dp.classname = "info_tfgoal";\r
2996         dp.goal_activation = 1;\r
2997         dp.team_no = 2;\r
2998         dp.items_allowed = 1;\r
2999         dp.goal_no = 4;\r
3000         dp.goal_effects = 3;\r
3001         dp.broadcast = " ÃÁÐÔÕÒÅÄ the enemy flag!\n";\r
3002         dp.message = "You ÃÁÐÔÕÒÅÄ the enemy flag!\n";\r
3003         dp.noise = "boss2/pop2.wav";\r
3004         dp.goal_result = 2;\r
3005         dp.activate_goal_no = 6;\r
3006         dp.axhitme = 1;\r
3007         dp.count = 10;\r
3008         dp.frags = 10;\r
3009         dp.solid = 1;\r
3010         dp.goal_state = 2;\r
3011         setsize(dp, '-16 -16 -24', '16 16 32');\r
3012         dp.nextthink = time + 0.2;\r
3013         dp.think = TF_PlaceGoal;\r
3014         dp = spawn();\r
3015         dp.origin = dp.origin;\r
3016         dp.classname = "info_tfgoal";\r
3017         dp.goal_effects = 1;\r
3018         dp.frags = 5;\r
3019         dp.goal_activation = 0;\r
3020         dp.goal_no = 6;\r
3021         dp.solid = 0;\r
3022         dp.goal_state = 2;\r
3023         setsize(dp, '-16 -16 -24', '16 16 32');\r
3024         dp.nextthink = time + 0.2;\r
3025         dp.think = TF_PlaceGoal;\r
3026 };\r
3027 \r
3028 void() CTF_FlagCheck = \r
3029 {\r
3030         local entity te;\r
3031         local float flagcount;\r
3032         local float pos;\r
3033         flagcount = 0;\r
3034         te = find(world, classname, "item_tfgoal");\r
3035         while (te != world)\r
3036         {\r
3037                 if (te.goal_no == 1)\r
3038                 {\r
3039                         pos = pointcontents(te.origin);\r
3040                         if (pos == -2 || pos == -6)\r
3041                         {\r
3042                                 dprint("*****BUG*****\nFlag(s) outside world.\nPlease report this.\n");\r
3043                                 te.nextthink = time + 0.2;\r
3044                                 te.think = tfgoalitem_remove;\r
3045                         }\r
3046                         flagcount = flagcount + 1;\r
3047                 }\r
3048                 else\r
3049                 {\r
3050                         if (te.goal_no == 2)\r
3051                         {\r
3052                                 pos = pointcontents(te.origin);\r
3053                                 if (pos == -2 || pos == -6)\r
3054                                 {\r
3055                                         dprint("*****BUG*****\nFlag(s) outside world.\nPlease report this.\n");\r
3056                                         te.nextthink = time + 0.2;\r
3057                                         te.think = tfgoalitem_remove;\r
3058                                 }\r
3059                                 flagcount = flagcount + 1;\r
3060                         }\r
3061                 }\r
3062                 te = find(te, classname, "item_tfgoal");\r
3063         }\r
3064         if (flagcount != 2)\r
3065         {\r
3066                 dprint("*****BUG*****\nFlag(s) missing.\nPlease report this.\n");\r
3067         }\r
3068         self.nextthink = time + 30;\r
3069 };