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);
23 void trigger_setnextthink(entity e, float dtime)
26 e.nextthink = time + dtime;
33 void trigger_common_write(bool withtarget)
35 WriteByte(MSG_ENTITY, self.warpzone_isboxy);
36 WriteByte(MSG_ENTITY, self.scale);
40 WriteString(MSG_ENTITY, self.target);
41 WriteString(MSG_ENTITY, self.target2);
42 WriteString(MSG_ENTITY, self.target3);
43 WriteString(MSG_ENTITY, self.target4);
44 WriteString(MSG_ENTITY, self.targetname);
45 WriteString(MSG_ENTITY, self.killtarget);
48 WriteCoord(MSG_ENTITY, self.origin_x);
49 WriteCoord(MSG_ENTITY, self.origin_y);
50 WriteCoord(MSG_ENTITY, self.origin_z);
52 WriteCoord(MSG_ENTITY, self.mins_x);
53 WriteCoord(MSG_ENTITY, self.mins_y);
54 WriteCoord(MSG_ENTITY, self.mins_z);
56 WriteCoord(MSG_ENTITY, self.movedir_x);
57 WriteCoord(MSG_ENTITY, self.movedir_y);
58 WriteCoord(MSG_ENTITY, self.movedir_z);
60 WriteCoord(MSG_ENTITY, self.angles_x);
61 WriteCoord(MSG_ENTITY, self.angles_y);
62 WriteCoord(MSG_ENTITY, self.angles_z);
67 void trigger_common_read(bool withtarget)
69 self.warpzone_isboxy = ReadByte();
70 self.scale = ReadByte();
74 self.target = strzone(ReadString());
75 self.target2 = strzone(ReadString());
76 self.target3 = strzone(ReadString());
77 self.target4 = strzone(ReadString());
78 self.targetname = strzone(ReadString());
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, stemp, otemp, act;
156 // create a temp object to fire at a later time
158 t.classname = "DelayedUse";
159 t.nextthink = time + self.delay;
160 t.think = DelayThink;
162 t.message = self.message;
163 t.killtarget = self.killtarget;
164 t.target = self.target;
165 t.target2 = self.target2;
166 t.target3 = self.target3;
167 t.target4 = self.target4;
177 if(IS_PLAYER(activator) && self.message != "")
178 if(IS_REAL_CLIENT(activator))
180 centerprint(activator, self.message);
181 if (self.noise == "")
182 play2(activator, "misc/talk.wav");
186 // kill the killtagets
191 for(t = world; (t = find(t, targetname, s)); )
203 if(stemp.target_random)
204 RandomSelection_Init();
206 for(i = 0; i < 4; ++i)
211 case 0: s = stemp.target; break;
212 case 1: s = stemp.target2; break;
213 case 2: s = stemp.target3; break;
214 case 3: s = stemp.target4; break;
218 for(t = world; (t = find(t, targetname, s)); )
221 if(stemp.target_random)
223 RandomSelection_Add(t, 0, string_null, 1, 0);
236 if(stemp.target_random && RandomSelection_chosen_ent)
238 self = RandomSelection_chosen_ent;
250 void trigger_touch_generic(void() touchfunc)
253 for(e = findradius((self.absmin + self.absmax) * 0.5, vlen(self.absmax - self.absmin) * 0.5 + 1); e; e = e.chain)
256 vector emin = e.absmin, emax = e.absmax;
257 if(self.solid == SOLID_BSP)
262 if(boxesoverlap(emin, emax, self.absmin, self.absmax)) // quick
263 if(WarpZoneLib_BoxTouchesBrush(emin, emax, self, e)) // accurate
270 void trigger_draw_generic()
272 float dt = time - self.move_time;
273 self.move_time = time;
274 if(dt <= 0) { return; }
276 setorigin(self, self.origin + self.velocity * frametime);
278 if(self.trigger_touch) { trigger_touch_generic(self.trigger_touch); }