4 float() DoorShouldOpen;
\r
6 void() fd_secret_move1;
\r
7 void() fd_secret_move2;
\r
8 void() fd_secret_move3;
\r
9 void() fd_secret_move4;
\r
10 void() fd_secret_move5;
\r
11 void() fd_secret_move6;
\r
12 void() fd_secret_done;
\r
15 float() DoorShouldOpen =
\r
18 local float plyrcount;
\r
23 return TF_FLARE_OFF;
\r
25 plyrcount = TF_FLARE_LIT;
\r
26 ptr = find(world, classname, "player");
\r
27 while (ptr != world)
\r
29 if (!(ptr.tf_items & self.items) && ptr.playerclass != TF_FLARE_LIT && ptr.solid != TF_FLARE_LIT && ptr.model != string_null)
\r
31 plyrcount = plyrcount + TF_FLARE_OFF;
\r
32 if (plyrcount == TF_FLARE_OFF)
\r
44 ptr = find(ptr, classname, "player");
\r
46 if (plyrcount != TF_FLARE_LIT)
\r
48 if (plyrcount == TF_FLARE_OFF)
\r
50 bprint(plyr1.netname);
\r
57 bprint(plyr1.netname);
\r
59 bprint(plyr2.netname);
\r
64 bprint("More players need");
\r
67 bprint(" to unlock the ");
\r
68 if (self.items & 131072)
\r
77 return TF_FLARE_LIT;
\r
80 if (self.items & 131072)
\r
88 bprint(" door has been unlocked\n");
\r
89 return TF_FLARE_OFF;
\r
92 void() door_blocked =
\r
94 T_Damage(other, self, self, self.dmg);
\r
95 if (self.wait >= TF_FLARE_LIT)
\r
97 if (self.state == 3)
\r
108 void() door_hit_top =
\r
110 sound(self, 2, self.noise1, TF_FLARE_OFF, TF_FLARE_OFF);
\r
111 self.state = TF_FLARE_LIT;
\r
112 if (self.spawnflags & 32)
\r
116 self.think = door_go_down;
\r
117 self.nextthink = self.ltime + self.wait;
\r
120 void() door_hit_bottom =
\r
122 self.goal_state = 2;
\r
123 sound(self, 2, self.noise1, TF_FLARE_OFF, TF_FLARE_OFF);
\r
124 self.state = TF_FLARE_OFF;
\r
127 void() door_go_down =
\r
129 sound(self, 2, self.noise2, TF_FLARE_OFF, TF_FLARE_OFF);
\r
130 if (self.max_health)
\r
132 self.takedamage = TF_FLARE_OFF;
\r
133 self.health = self.max_health;
\r
136 SUB_CalcMove(self.pos1, self.speed, door_hit_bottom);
\r
139 void() door_go_up =
\r
141 if (self.state == 2)
\r
145 if (self.state == TF_FLARE_LIT)
\r
147 self.nextthink = self.ltime + self.wait;
\r
150 sound(self, 2, self.noise2, TF_FLARE_OFF, TF_FLARE_OFF);
\r
152 SUB_CalcMove(self.pos2, self.speed, door_hit_top);
\r
156 void() door_fire =
\r
158 local entity oself;
\r
159 local entity starte;
\r
160 if (self.owner != self)
\r
162 objerror("door_fire: self.owner != self");
\r
166 sound(self, 2, self.noise4, TF_FLARE_OFF, TF_FLARE_OFF);
\r
168 self.message = string_null;
\r
170 if (self.spawnflags & 32)
\r
172 if (self.state == 2 || self.state == TF_FLARE_LIT)
\r
179 } while (self != starte && self != world);
\r
189 } while (self != starte && self != world);
\r
195 local entity oself;
\r
197 self.owner.message = "";
\r
198 self.enemy.message = "";
\r
205 void() door_trigger_touch =
\r
208 if (other.health <= TF_FLARE_LIT)
\r
212 if (!Activated(self, other))
\r
214 if (self.else_goal != TF_FLARE_LIT)
\r
216 te = Findgoal(self.else_goal);
\r
219 DoResults(te, other, self.goal_result & 2);
\r
224 if (time < self.attack_finished)
\r
228 self.attack_finished = time + TF_FLARE_OFF;
\r
234 void() door_killed =
\r
236 local entity oself;
\r
239 self.health = self.max_health;
\r
240 self.takedamage = TF_FLARE_LIT;
\r
245 void() door_touch =
\r
248 if (other.classname != "player")
\r
252 if (self.owner.attack_finished > time)
\r
256 if (!Activated(self, other))
\r
258 if (self.else_goal != TF_FLARE_LIT)
\r
260 te = Findgoal(self.else_goal);
\r
263 DoResults(te, other, self.goal_result & 2);
\r
268 self.owner.attack_finished = time + 2;
\r
269 if (self.owner.message != "")
\r
271 CenterPrint(other, self.owner.message);
\r
272 sound(other, 2, "misc/talk.wav", TF_FLARE_OFF, TF_FLARE_OFF);
\r
278 if ((self.items & other.items) != self.items)
\r
280 if (self.owner.items == 131072)
\r
282 if (world.worldtype == 2)
\r
284 CenterPrint(other, "You need the silver keycard");
\r
285 sound(self, 2, self.noise3, TF_FLARE_OFF, TF_FLARE_OFF);
\r
289 if (world.worldtype == TF_FLARE_OFF)
\r
291 CenterPrint(other, "You need the silver runekey");
\r
292 sound(self, 2, self.noise3, TF_FLARE_OFF, TF_FLARE_OFF);
\r
296 if (world.worldtype == TF_FLARE_LIT)
\r
298 CenterPrint(other, "You need the silver key");
\r
299 sound(self, 2, self.noise3, TF_FLARE_OFF, TF_FLARE_OFF);
\r
306 if (world.worldtype == 2)
\r
308 CenterPrint(other, "You need the gold keycard\n");
\r
309 sound(self, 2, self.noise3, TF_FLARE_OFF, TF_FLARE_OFF);
\r
313 if (world.worldtype == TF_FLARE_OFF)
\r
315 CenterPrint(other, "You need the gold runekey");
\r
316 sound(self, 2, self.noise3, TF_FLARE_OFF, TF_FLARE_OFF);
\r
320 if (world.worldtype == TF_FLARE_LIT)
\r
322 CenterPrint(other, "You need the gold key");
\r
323 sound(self, 2, self.noise3, TF_FLARE_OFF, TF_FLARE_OFF);
\r
330 other.items = other.items - self.items;
\r
331 other.tf_items = other.tf_items | self.items;
\r
332 if (DoorShouldOpen())
\r
334 self.touch = SUB_Null;
\r
337 self.enemy.touch = SUB_Null;
\r
343 entity(vector fmins, vector fmaxs) spawn_field =
\r
345 local entity trigger;
\r
349 trigger.movetype = TF_FLARE_LIT;
\r
350 trigger.solid = TF_FLARE_OFF;
\r
351 trigger.owner = self;
\r
352 trigger.touch = door_trigger_touch;
\r
353 trigger.team_no = self.team_no;
\r
354 trigger.playerclass = self.playerclass;
\r
355 trigger.items_allowed = self.items_allowed;
\r
356 trigger.activate_goal_no = self.activate_goal_no;
\r
357 trigger.inactivate_goal_no = self.inactivate_goal_no;
\r
358 trigger.remove_goal_no = self.remove_goal_no;
\r
359 trigger.restore_goal_no = self.restore_goal_no;
\r
360 trigger.activate_group_no = self.activate_group_no;
\r
361 trigger.inactivate_group_no = self.inactivate_group_no;
\r
362 trigger.remove_group_no = self.remove_group_no;
\r
363 trigger.restore_group_no = self.restore_group_no;
\r
364 trigger.goal_activation = self.goal_activation;
\r
365 trigger.goal_effects = self.goal_effects;
\r
366 trigger.goal_result = self.goal_result;
\r
367 trigger.goal_group = self.goal_group;
\r
370 setsize(trigger, t1 - '60 60 8', t2 + '60 60 8');
\r
374 float(entity e1, entity e2) EntitiesTouching =
\r
376 if (e1.mins_x > e2.maxs_x)
\r
378 return TF_FLARE_LIT;
\r
380 if (e1.mins_y > e2.maxs_y)
\r
382 return TF_FLARE_LIT;
\r
384 if (e1.mins_z > e2.maxs_z)
\r
386 return TF_FLARE_LIT;
\r
388 if (e1.maxs_x < e2.mins_x)
\r
390 return TF_FLARE_LIT;
\r
392 if (e1.maxs_y < e2.mins_y)
\r
394 return TF_FLARE_LIT;
\r
396 if (e1.maxs_z < e2.mins_z)
\r
398 return TF_FLARE_LIT;
\r
400 return TF_FLARE_OFF;
\r
403 void() LinkDoors =
\r
406 local entity starte;
\r
407 local vector cmins;
\r
408 local vector cmaxs;
\r
413 if (self.spawnflags & 4)
\r
425 self.owner = starte;
\r
428 starte.health = self.health;
\r
430 if (self.targetname)
\r
432 starte.targetname = self.targetname;
\r
434 if (self.message != "")
\r
436 starte.message = self.message;
\r
438 t = find(t, classname, self.classname);
\r
441 self.enemy = starte;
\r
447 if (self.targetname)
\r
455 self.owner.trigger_field = spawn_field(cmins, cmaxs);
\r
458 if (EntitiesTouching(self, t))
\r
462 objerror("cross connected doors");
\r
466 if (t.mins_x < cmins_x)
\r
468 cmins_x = t.mins_x;
\r
470 if (t.mins_y < cmins_y)
\r
472 cmins_y = t.mins_y;
\r
474 if (t.mins_z < cmins_z)
\r
476 cmins_z = t.mins_z;
\r
478 if (t.maxs_x > cmaxs_x)
\r
480 cmaxs_x = t.maxs_x;
\r
482 if (t.maxs_y > cmaxs_y)
\r
484 cmaxs_y = t.maxs_y;
\r
486 if (t.maxs_z > cmaxs_z)
\r
488 cmaxs_z = t.maxs_z;
\r
491 } while (TF_FLARE_OFF);
\r
494 void() func_door =
\r
496 // Q3F/ETF Map Support
\r
497 if (self.allowteams == "red")
\r
501 if (self.allowteams == "blue")
\r
506 if(self.noise2) precache_sound (self.noise2); //tz 05 11 10
\r
508 if (CheckExistence() == TF_FLARE_LIT)
\r
513 if (world.worldtype == TF_FLARE_LIT)
\r
515 precache_sound("doors/medtry.wav");
\r
516 precache_sound("doors/meduse.wav");
\r
517 self.noise3 = "doors/medtry.wav";
\r
518 self.noise4 = "doors/meduse.wav";
\r
522 if (world.worldtype == TF_FLARE_OFF)
\r
524 precache_sound("doors/runetry.wav");
\r
525 precache_sound("doors/runeuse.wav");
\r
526 self.noise3 = "doors/runetry.wav";
\r
527 self.noise4 = "doors/runeuse.wav";
\r
531 if (world.worldtype == 2)
\r
533 precache_sound("doors/basetry.wav");
\r
534 precache_sound("doors/baseuse.wav");
\r
535 self.noise3 = "doors/basetry.wav";
\r
536 self.noise4 = "doors/baseuse.wav";
\r
540 dprint("no worldtype set!\n");
\r
544 if (self.sounds == TF_FLARE_LIT)
\r
546 precache_sound("misc/null.wav");
\r
547 precache_sound("misc/null.wav");
\r
548 self.noise1 = "misc/null.wav";
\r
550 self.noise2 = "misc/null.wav";
\r
552 if (self.sounds == TF_FLARE_OFF)
\r
554 precache_sound("doors/drclos4.wav");
\r
555 precache_sound("doors/doormv1.wav");
\r
556 self.noise1 = "doors/drclos4.wav";
\r
558 self.noise2 = "doors/doormv1.wav";
\r
560 if (self.sounds == 2)
\r
562 precache_sound("doors/hydro1.wav");
\r
563 precache_sound("doors/hydro2.wav");
\r
564 self.noise2 = "doors/hydro1.wav";
\r
565 self.noise1 = "doors/hydro2.wav";
\r
567 if (self.sounds == 3)
\r
569 precache_sound("doors/stndr1.wav");
\r
570 precache_sound("doors/stndr2.wav");
\r
571 self.noise2 = "doors/stndr1.wav";
\r
572 self.noise1 = "doors/stndr2.wav";
\r
574 if (self.sounds == 4)
\r
576 precache_sound("doors/ddoor1.wav");
\r
577 precache_sound("doors/ddoor2.wav");
\r
578 self.noise1 = "doors/ddoor2.wav";
\r
579 self.noise2 = "doors/ddoor1.wav";
\r
581 if (self.armorclass == TF_FLARE_OFF)
\r
583 precache_sound("doors/creekdr1.wav");
\r
584 precache_sound("doors/creekdr2.wav");
\r
585 self.noise2 = "doors/creekdr1.wav";
\r
586 self.noise1 = "doors/creekdr2.wav";
\r
588 if (self.armorclass == 2)
\r
590 precache_sound("doors/metaldr1.wav");
\r
591 precache_sound("doors/metaldr2.wav");
\r
592 self.noise2 = "doors/metaldr1.wav";
\r
593 self.noise1 = "doors/metaldr2.wav";
\r
595 if (self.armorclass == 3)
\r
597 precache_sound("doors/electdr1.wav");
\r
598 precache_sound("doors/electdr2.wav");
\r
599 self.noise2 = "doors/electdr1.wav";
\r
600 self.noise1 = "doors/electdr2.wav";
\r
602 if (self.armorclass == 4)
\r
604 precache_sound("doors/track_st.wav");
\r
605 precache_sound("doors/track_e.wav");
\r
606 self.noise2 = "doors/track_st.wav";
\r
607 self.noise1 = "doors/track_e.wav";
\r
610 self.max_health = self.health;
\r
613 setorigin(self, self.origin);
\r
614 setmodel(self, self.model);
\r
615 self.classname = "door";
\r
616 self.blocked = door_blocked;
\r
617 self.use = door_use;
\r
618 if (self.spawnflags & 16)
\r
620 self.items = 131072;
\r
622 if (self.spawnflags & 8)
\r
624 self.items = 262144;
\r
642 self.pos1 = self.origin;
\r
643 self.pos2 = self.pos1 + self.movedir * (fabs(self.movedir * self.size) - self.lip);
\r
644 if (self.spawnflags & TF_FLARE_OFF)
\r
646 setorigin(self, self.pos2);
\r
647 self.pos2 = self.pos1;
\r
648 self.pos1 = self.origin;
\r
650 self.state = TF_FLARE_OFF;
\r
653 self.takedamage = TF_FLARE_OFF;
\r
654 self.th_die = door_killed;
\r
660 self.touch = door_touch;
\r
661 self.think = LinkDoors;
\r
662 self.nextthink = self.ltime + 0.1;
\r
665 void() fd_secret_use =
\r
668 self.health = 10000;
\r
669 if (self.origin != self.oldorigin)
\r
673 if (self.spawnflags & 32)
\r
677 self.message = string_null;
\r
679 if (!(self.spawnflags & 8))
\r
681 self.th_pain = SUB_Null;
\r
682 self.takedamage = TF_FLARE_LIT;
\r
684 self.velocity = '0 0 0';
\r
685 sound(self, 2, self.noise1, TF_FLARE_OFF, TF_FLARE_OFF);
\r
686 self.nextthink = self.ltime + 0.1;
\r
687 temp = TF_FLARE_OFF - (self.spawnflags & 2);
\r
688 makevectors(self.mangle);
\r
689 if (!(self.t_width))
\r
691 if (self.spawnflags & 4)
\r
693 self.t_width = fabs(v_up * self.size);
\r
697 self.t_width = fabs(v_right * self.size);
\r
700 if (!(self.t_length))
\r
702 self.t_length = fabs(v_forward * self.size);
\r
704 if (self.spawnflags & 4)
\r
706 self.dest1 = self.origin - v_up * self.t_width;
\r
710 self.dest1 = self.origin + v_right * (self.t_width * temp);
\r
712 self.dest2 = self.dest1 + v_forward * self.t_length;
\r
713 SUB_CalcMove(self.dest1, self.speed, fd_secret_move1);
\r
714 sound(self, 2, self.noise2, TF_FLARE_OFF, TF_FLARE_OFF);
\r
717 void() fd_secret_move1 =
\r
719 self.nextthink = self.ltime + TF_FLARE_OFF;
\r
720 self.think = fd_secret_move2;
\r
721 sound(self, 2, self.noise3, TF_FLARE_OFF, TF_FLARE_OFF);
\r
724 void() fd_secret_move2 =
\r
726 sound(self, 2, self.noise2, TF_FLARE_OFF, TF_FLARE_OFF);
\r
727 SUB_CalcMove(self.dest2, self.speed, fd_secret_move3);
\r
730 void() fd_secret_move3 =
\r
732 sound(self, 2, self.noise3, TF_FLARE_OFF, TF_FLARE_OFF);
\r
733 if (!(self.spawnflags & TF_FLARE_OFF))
\r
735 self.nextthink = self.ltime + self.wait;
\r
736 self.think = fd_secret_move4;
\r
740 void() fd_secret_move4 =
\r
742 sound(self, 2, self.noise2, TF_FLARE_OFF, TF_FLARE_OFF);
\r
743 SUB_CalcMove(self.dest1, self.speed, fd_secret_move5);
\r
746 void() fd_secret_move5 =
\r
748 self.nextthink = self.ltime + TF_FLARE_OFF;
\r
749 self.think = fd_secret_move6;
\r
750 sound(self, 2, self.noise3, TF_FLARE_OFF, TF_FLARE_OFF);
\r
753 void() fd_secret_move6 =
\r
755 sound(self, 2, self.noise2, TF_FLARE_OFF, TF_FLARE_OFF);
\r
756 SUB_CalcMove(self.oldorigin, self.speed, fd_secret_done);
\r
759 void() fd_secret_done =
\r
761 if (!(self.targetname) || (self.spawnflags & 16))
\r
763 self.health = 10000;
\r
764 self.takedamage = TF_FLARE_OFF;
\r
765 self.th_pain = fd_secret_use;
\r
766 self.th_die = fd_secret_use;
\r
768 sound(self, 2, self.noise3, TF_FLARE_OFF, TF_FLARE_OFF);
\r
771 void() secret_blocked =
\r
773 if (time < self.attack_finished)
\r
777 self.attack_finished = time + 0.5;
\r
778 T_Damage(other, self, self, self.dmg);
\r
781 void() secret_touch =
\r
783 if (other.classname != "player")
\r
787 if (self.attack_finished > time)
\r
791 if (self.spawnflags & 32)
\r
795 self.attack_finished = time + 2;
\r
798 CenterPrint(other, self.message);
\r
799 sound(other, 4, "misc/talk.wav", TF_FLARE_OFF, TF_FLARE_OFF);
\r
803 void() func_door_secret =
\r
805 if (CheckExistence() == TF_FLARE_LIT)
\r
810 if (self.sounds == TF_FLARE_LIT)
\r
814 if (self.sounds == TF_FLARE_OFF)
\r
816 precache_sound("doors/latch2.wav");
\r
817 precache_sound("doors/winch2.wav");
\r
818 precache_sound("doors/drclos4.wav");
\r
819 self.noise1 = "doors/latch2.wav";
\r
820 self.noise2 = "doors/winch2.wav";
\r
821 self.noise3 = "doors/drclos4.wav";
\r
823 if (self.sounds == 2)
\r
825 precache_sound("doors/airdoor1.wav");
\r
826 precache_sound("doors/airdoor2.wav");
\r
827 self.noise2 = "doors/airdoor1.wav";
\r
828 self.noise1 = "doors/airdoor2.wav";
\r
829 self.noise3 = "doors/airdoor2.wav";
\r
831 if (self.sounds == 3)
\r
833 precache_sound("doors/basesec1.wav");
\r
834 precache_sound("doors/basesec2.wav");
\r
835 self.noise2 = "doors/basesec1.wav";
\r
836 self.noise1 = "doors/basesec2.wav";
\r
837 self.noise3 = "doors/basesec2.wav";
\r
843 self.mangle = self.angles;
\r
844 self.angles = '0 0 0';
\r
847 self.classname = "door";
\r
848 setmodel(self, self.model);
\r
849 setorigin(self, self.origin);
\r
850 self.touch = secret_touch;
\r
851 self.blocked = secret_blocked;
\r
853 self.use = fd_secret_use;
\r
854 if (!(self.targetname) || (self.spawnflags & 16))
\r
856 self.health = 10000;
\r
857 self.takedamage = TF_FLARE_OFF;
\r
858 self.th_pain = fd_secret_use;
\r
860 self.oldorigin = self.origin;
\r