1 void SUB_DontUseTargets() { }
7 activator = self.enemy;
12 void FixSize(entity e)
14 e.mins_x = rint(e.mins_x);
15 e.mins_y = rint(e.mins_y);
16 e.mins_z = rint(e.mins_z);
18 e.maxs_x = rint(e.maxs_x);
19 e.maxs_y = rint(e.maxs_y);
20 e.maxs_z = rint(e.maxs_z);
24 void trigger_common_write(bool withtarget)
26 WriteByte(MSG_ENTITY, self.warpzone_isboxy);
27 WriteByte(MSG_ENTITY, self.scale);
31 WriteString(MSG_ENTITY, self.target);
32 WriteString(MSG_ENTITY, self.target2);
33 WriteString(MSG_ENTITY, self.target3);
34 WriteString(MSG_ENTITY, self.target4);
35 WriteString(MSG_ENTITY, self.targetname);
36 WriteString(MSG_ENTITY, self.killtarget);
39 WriteCoord(MSG_ENTITY, self.origin_x);
40 WriteCoord(MSG_ENTITY, self.origin_y);
41 WriteCoord(MSG_ENTITY, self.origin_z);
43 WriteCoord(MSG_ENTITY, self.mins_x);
44 WriteCoord(MSG_ENTITY, self.mins_y);
45 WriteCoord(MSG_ENTITY, self.mins_z);
46 WriteCoord(MSG_ENTITY, self.maxs_x);
47 WriteCoord(MSG_ENTITY, self.maxs_y);
48 WriteCoord(MSG_ENTITY, self.maxs_z);
50 WriteCoord(MSG_ENTITY, self.movedir_x);
51 WriteCoord(MSG_ENTITY, self.movedir_y);
52 WriteCoord(MSG_ENTITY, self.movedir_z);
54 WriteCoord(MSG_ENTITY, self.angles_x);
55 WriteCoord(MSG_ENTITY, self.angles_y);
56 WriteCoord(MSG_ENTITY, self.angles_z);
61 void trigger_common_read(bool withtarget)
63 self.warpzone_isboxy = ReadByte();
64 self.scale = ReadByte();
68 if(self.target) { strunzone(self.target); }
69 self.target = strzone(ReadString());
70 if(self.target2) { strunzone(self.target2); }
71 self.target2 = strzone(ReadString());
72 if(self.target3) { strunzone(self.target3); }
73 self.target3 = strzone(ReadString());
74 if(self.target4) { strunzone(self.target4); }
75 self.target4 = strzone(ReadString());
76 if(self.targetname) { strunzone(self.targetname); }
77 self.targetname = strzone(ReadString());
78 if(self.killtarget) { strunzone(self.killtarget); }
79 self.killtarget = strzone(ReadString());
82 self.origin_x = ReadCoord();
83 self.origin_y = ReadCoord();
84 self.origin_z = ReadCoord();
85 setorigin(self, self.origin);
87 self.mins_x = ReadCoord();
88 self.mins_y = ReadCoord();
89 self.mins_z = ReadCoord();
90 self.maxs_x = ReadCoord();
91 self.maxs_y = ReadCoord();
92 self.maxs_z = ReadCoord();
93 setsize(self, self.mins, self.maxs);
95 self.movedir_x = ReadCoord();
96 self.movedir_y = ReadCoord();
97 self.movedir_z = ReadCoord();
99 self.angles_x = ReadCoord();
100 self.angles_y = ReadCoord();
101 self.angles_z = ReadCoord();
104 void trigger_remove_generic()
106 if(self.target) { strunzone(self.target); }
107 self.target = string_null;
109 if(self.target2) { strunzone(self.target2); }
110 self.target2 = string_null;
112 if(self.target3) { strunzone(self.target3); }
113 self.target3 = string_null;
115 if(self.target4) { strunzone(self.target4); }
116 self.target4 = string_null;
118 if(self.targetname) { strunzone(self.targetname); }
119 self.target = string_null;
121 if(self.killtarget) { strunzone(self.killtarget); }
122 self.killtarget = string_null;
127 ==============================
130 the global "activator" should be set to the entity that initiated the firing.
132 If self.delay is set, a DelayedUse entity will be created that will actually
133 do the SUB_UseTargets after that many seconds have passed.
135 Centerprints any self.message to the activator.
137 Removes all entities with a targetname that match self.killtarget,
138 and removes them, so some events can remove other triggers.
140 Search for (string)targetname in all entities that
141 match (string)self.target and call their .use function
143 ==============================
145 void SUB_UseTargets()
147 entity t, otemp, act;
156 // create a temp object to fire at a later time
158 t.nextthink = time + self.delay;
159 t.think = DelayThink;
161 t.message = self.message;
162 t.killtarget = self.killtarget;
163 t.target = self.target;
164 t.target2 = self.target2;
165 t.target3 = self.target3;
166 t.target4 = self.target4;
176 if(IS_PLAYER(activator) && self.message != "")
177 if(IS_REAL_CLIENT(activator))
179 centerprint(activator, self.message);
180 if (self.noise == "")
181 play2(activator, SND(TALK));
185 // kill the killtagets
190 for(t = world; (t = find(t, targetname, s)); )
201 if(this.target_random)
202 RandomSelection_Init();
204 for(i = 0; i < 4; ++i)
209 case 0: s = this.target; break;
210 case 1: s = this.target2; break;
211 case 2: s = this.target3; break;
212 case 3: s = this.target4; break;
216 // Flag to set func_clientwall state
217 // 1 == deactivate, 2 == activate, 0 == do nothing
218 float aw_flag = self.antiwall_flag;
219 for(t = world; (t = find(t, targetname, s)); )
222 if(this.target_random)
224 RandomSelection_Add(t, 0, string_null, 1, 0);
228 if (t.classname == "func_clientwall" || t.classname == "func_clientillusionary")
229 t.antiwall_flag = aw_flag;
239 if(this.target_random && RandomSelection_chosen_ent)
241 setself(RandomSelection_chosen_ent);
253 void trigger_touch_generic(void() touchfunc)
256 for(e = findradius((self.absmin + self.absmax) * 0.5, vlen(self.absmax - self.absmin) * 0.5 + 1); e; e = e.chain)
257 if(e.isplayermodel || e.classname == "csqcprojectile")
259 vector emin = e.absmin, emax = e.absmax;
260 if(self.solid == SOLID_BSP)
265 if(boxesoverlap(emin, emax, self.absmin, self.absmax)) // quick
266 if(WarpZoneLib_BoxTouchesBrush(emin, emax, self, e)) // accurate
273 void trigger_draw_generic(entity this)
275 float dt = time - self.move_time;
276 self.move_time = time;
277 if(dt <= 0) { return; }
279 if(self.trigger_touch) { trigger_touch_generic(self.trigger_touch); }