1 void SUB_DontUseTargets(entity this, entity actor, entity trigger) { }
3 void SUB_UseTargets(entity this, entity actor, entity trigger);
5 void DelayThink(entity this)
7 SUB_UseTargets (this, this.enemy, NULL);
11 void FixSize(entity e)
13 e.mins_x = rint(e.mins_x);
14 e.mins_y = rint(e.mins_y);
15 e.mins_z = rint(e.mins_z);
17 e.maxs_x = rint(e.maxs_x);
18 e.maxs_y = rint(e.maxs_y);
19 e.maxs_z = rint(e.maxs_z);
24 void trigger_init(entity this)
26 string m = this.model;
31 _setmodel(this, m); // no precision needed
33 setorigin(this, this.origin);
35 setsize(this, this.mins * this.scale, this.maxs * this.scale);
37 setsize(this, this.mins, this.maxs);
39 BITSET_ASSIGN(this.effects, EF_NODEPTHTEST);
42 void trigger_link(entity this, bool(entity this, entity to, int sendflags) sendfunc)
44 this.SendEntity = SendEntity_self;
45 this.SendEntity3 = sendfunc;
46 this.SendFlags = 0xFFFFFF;
49 void trigger_common_write(entity this, bool withtarget)
52 if(this.warpzone_isboxy)
54 if(this.origin != '0 0 0')
56 WriteByte(MSG_ENTITY, f);
60 WriteString(MSG_ENTITY, this.target);
61 WriteString(MSG_ENTITY, this.target2);
62 WriteString(MSG_ENTITY, this.target3);
63 WriteString(MSG_ENTITY, this.target4);
64 WriteString(MSG_ENTITY, this.targetname);
65 WriteString(MSG_ENTITY, this.killtarget);
70 WriteCoord(MSG_ENTITY, this.origin.x);
71 WriteCoord(MSG_ENTITY, this.origin.y);
72 WriteCoord(MSG_ENTITY, this.origin.z);
75 WriteShort(MSG_ENTITY, this.modelindex);
76 WriteCoord(MSG_ENTITY, this.mins.x);
77 WriteCoord(MSG_ENTITY, this.mins.y);
78 WriteCoord(MSG_ENTITY, this.mins.z);
79 WriteCoord(MSG_ENTITY, this.maxs.x);
80 WriteCoord(MSG_ENTITY, this.maxs.y);
81 WriteCoord(MSG_ENTITY, this.maxs.z);
82 WriteByte(MSG_ENTITY, bound(1, this.scale * 16, 255));
84 WriteCoord(MSG_ENTITY, this.movedir_x);
85 WriteCoord(MSG_ENTITY, this.movedir_y);
86 WriteCoord(MSG_ENTITY, this.movedir_z);
88 WriteCoord(MSG_ENTITY, this.angles_x);
89 WriteCoord(MSG_ENTITY, this.angles_y);
90 WriteCoord(MSG_ENTITY, this.angles_z);
95 void trigger_common_read(entity this, bool withtarget)
98 this.warpzone_isboxy = (f & 1);
102 if(this.target) { strunzone(this.target); }
103 this.target = strzone(ReadString());
104 if(this.target2) { strunzone(this.target2); }
105 this.target2 = strzone(ReadString());
106 if(this.target3) { strunzone(this.target3); }
107 this.target3 = strzone(ReadString());
108 if(this.target4) { strunzone(this.target4); }
109 this.target4 = strzone(ReadString());
110 if(this.targetname) { strunzone(this.targetname); }
111 this.targetname = strzone(ReadString());
112 if(this.killtarget) { strunzone(this.killtarget); }
113 this.killtarget = strzone(ReadString());
118 this.origin_x = ReadCoord();
119 this.origin_y = ReadCoord();
120 this.origin_z = ReadCoord();
123 this.origin = '0 0 0';
124 setorigin(this, this.origin);
126 this.modelindex = ReadShort();
127 this.mins_x = ReadCoord();
128 this.mins_y = ReadCoord();
129 this.mins_z = ReadCoord();
130 this.maxs_x = ReadCoord();
131 this.maxs_y = ReadCoord();
132 this.maxs_z = ReadCoord();
133 this.scale = ReadByte() / 16;
134 setsize(this, this.mins, this.maxs);
136 this.movedir_x = ReadCoord();
137 this.movedir_y = ReadCoord();
138 this.movedir_z = ReadCoord();
140 this.angles_x = ReadCoord();
141 this.angles_y = ReadCoord();
142 this.angles_z = ReadCoord();
145 void trigger_remove_generic(entity this)
147 if(this.target) { strunzone(this.target); }
148 this.target = string_null;
150 if(this.target2) { strunzone(this.target2); }
151 this.target2 = string_null;
153 if(this.target3) { strunzone(this.target3); }
154 this.target3 = string_null;
156 if(this.target4) { strunzone(this.target4); }
157 this.target4 = string_null;
159 if(this.targetname) { strunzone(this.targetname); }
160 this.target = string_null;
162 if(this.killtarget) { strunzone(this.killtarget); }
163 this.killtarget = string_null;
168 ==============================
171 the global "activator" should be set to the entity that initiated the firing.
173 If self.delay is set, a DelayedUse entity will be created that will actually
174 do the SUB_UseTargets after that many seconds have passed.
176 Centerprints any self.message to the activator.
178 Removes all entities with a targetname that match self.killtarget,
179 and removes them, so some events can remove other triggers.
181 Search for (string)targetname in all entities that
182 match (string)self.target and call their .use function
184 ==============================
186 void SUB_UseTargets(entity this, entity actor, entity trigger)
193 // create a temp object to fire at a later time
194 entity t = new(DelayedUse);
195 t.nextthink = time + this.delay;
196 setthink(t, DelayThink);
198 t.message = this.message;
199 t.killtarget = this.killtarget;
200 t.target = this.target;
201 t.target2 = this.target2;
202 t.target3 = this.target3;
203 t.target4 = this.target4;
214 if(IS_PLAYER(actor) && this.message != "")
215 if(IS_REAL_CLIENT(actor))
217 centerprint(actor, this.message);
218 if (this.noise == "")
219 play2(actor, SND(TALK));
223 // kill the killtagets
228 for(entity t = world; (t = find(t, targetname, s)); )
237 if(this.target_random)
238 RandomSelection_Init();
240 for(int i = 0; i < 4; ++i)
245 case 0: s = this.target; break;
246 case 1: s = this.target2; break;
247 case 2: s = this.target3; break;
248 case 3: s = this.target4; break;
252 // Flag to set func_clientwall state
253 // 1 == deactivate, 2 == activate, 0 == do nothing
254 int aw_flag = this.antiwall_flag;
255 for(entity t = world; (t = find(t, targetname, s)); )
259 if(this.target_random)
261 RandomSelection_Add(t, 0, string_null, 1, 0);
265 if (t.classname == "func_clientwall" || t.classname == "func_clientillusionary")
266 t.antiwall_flag = aw_flag;
268 t.use(t, actor, this);
275 if(this.target_random && RandomSelection_chosen_ent)
276 RandomSelection_chosen_ent.use(RandomSelection_chosen_ent, actor, this);
279 void SUB_UseTargets_self(entity this)
281 SUB_UseTargets(this, NULL, NULL);