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 setSendEntity(this, sendfunc);
45 this.SendFlags = 0xFFFFFF;
48 void trigger_common_write(entity this, bool withtarget)
51 if(this.warpzone_isboxy)
53 if(this.origin != '0 0 0')
55 WriteByte(MSG_ENTITY, f);
59 WriteString(MSG_ENTITY, this.target);
60 WriteString(MSG_ENTITY, this.target2);
61 WriteString(MSG_ENTITY, this.target3);
62 WriteString(MSG_ENTITY, this.target4);
63 WriteString(MSG_ENTITY, this.targetname);
64 WriteString(MSG_ENTITY, this.killtarget);
69 WriteCoord(MSG_ENTITY, this.origin.x);
70 WriteCoord(MSG_ENTITY, this.origin.y);
71 WriteCoord(MSG_ENTITY, this.origin.z);
74 WriteShort(MSG_ENTITY, this.modelindex);
75 WriteCoord(MSG_ENTITY, this.mins.x);
76 WriteCoord(MSG_ENTITY, this.mins.y);
77 WriteCoord(MSG_ENTITY, this.mins.z);
78 WriteCoord(MSG_ENTITY, this.maxs.x);
79 WriteCoord(MSG_ENTITY, this.maxs.y);
80 WriteCoord(MSG_ENTITY, this.maxs.z);
81 WriteByte(MSG_ENTITY, bound(1, this.scale * 16, 255));
83 WriteCoord(MSG_ENTITY, this.movedir_x);
84 WriteCoord(MSG_ENTITY, this.movedir_y);
85 WriteCoord(MSG_ENTITY, this.movedir_z);
87 WriteCoord(MSG_ENTITY, this.angles_x);
88 WriteCoord(MSG_ENTITY, this.angles_y);
89 WriteCoord(MSG_ENTITY, this.angles_z);
94 void trigger_common_read(entity this, bool withtarget)
97 this.warpzone_isboxy = (f & 1);
101 if(this.target) { strunzone(this.target); }
102 this.target = strzone(ReadString());
103 if(this.target2) { strunzone(this.target2); }
104 this.target2 = strzone(ReadString());
105 if(this.target3) { strunzone(this.target3); }
106 this.target3 = strzone(ReadString());
107 if(this.target4) { strunzone(this.target4); }
108 this.target4 = strzone(ReadString());
109 if(this.targetname) { strunzone(this.targetname); }
110 this.targetname = strzone(ReadString());
111 if(this.killtarget) { strunzone(this.killtarget); }
112 this.killtarget = strzone(ReadString());
117 this.origin_x = ReadCoord();
118 this.origin_y = ReadCoord();
119 this.origin_z = ReadCoord();
122 this.origin = '0 0 0';
123 setorigin(this, this.origin);
125 this.modelindex = ReadShort();
126 this.mins_x = ReadCoord();
127 this.mins_y = ReadCoord();
128 this.mins_z = ReadCoord();
129 this.maxs_x = ReadCoord();
130 this.maxs_y = ReadCoord();
131 this.maxs_z = ReadCoord();
132 this.scale = ReadByte() / 16;
133 setsize(this, this.mins, this.maxs);
135 this.movedir_x = ReadCoord();
136 this.movedir_y = ReadCoord();
137 this.movedir_z = ReadCoord();
139 this.angles_x = ReadCoord();
140 this.angles_y = ReadCoord();
141 this.angles_z = ReadCoord();
144 void trigger_remove_generic(entity this)
146 if(this.target) { strunzone(this.target); }
147 this.target = string_null;
149 if(this.target2) { strunzone(this.target2); }
150 this.target2 = string_null;
152 if(this.target3) { strunzone(this.target3); }
153 this.target3 = string_null;
155 if(this.target4) { strunzone(this.target4); }
156 this.target4 = string_null;
158 if(this.targetname) { strunzone(this.targetname); }
159 this.target = string_null;
161 if(this.killtarget) { strunzone(this.killtarget); }
162 this.killtarget = string_null;
167 ==============================
170 the global "activator" should be set to the entity that initiated the firing.
172 If this.delay is set, a DelayedUse entity will be created that will actually
173 do the SUB_UseTargets after that many seconds have passed.
175 Centerprints any this.message to the activator.
177 Removes all entities with a targetname that match this.killtarget,
178 and removes them, so some events can remove other triggers.
180 Search for (string)targetname in all entities that
181 match (string)this.target and call their .use function
183 ==============================
185 void SUB_UseTargets(entity this, entity actor, entity trigger)
192 // create a temp object to fire at a later time
193 entity t = new(DelayedUse);
194 t.nextthink = time + this.delay;
195 setthink(t, DelayThink);
197 t.message = this.message;
198 t.killtarget = this.killtarget;
199 t.target = this.target;
200 t.target2 = this.target2;
201 t.target3 = this.target3;
202 t.target4 = this.target4;
213 if(IS_PLAYER(actor) && this.message != "")
214 if(IS_REAL_CLIENT(actor))
216 centerprint(actor, this.message);
217 if (this.noise == "")
218 play2(actor, SND(TALK));
222 // kill the killtagets
227 for(entity t = NULL; (t = find(t, targetname, s)); )
236 if(this.target_random)
237 RandomSelection_Init();
239 for(int i = 0; i < 4; ++i)
244 case 0: s = this.target; break;
245 case 1: s = this.target2; break;
246 case 2: s = this.target3; break;
247 case 3: s = this.target4; break;
251 // Flag to set func_clientwall state
252 // 1 == deactivate, 2 == activate, 0 == do nothing
253 int aw_flag = this.antiwall_flag;
254 for(entity t = NULL; (t = find(t, targetname, s)); )
258 if(this.target_random)
260 RandomSelection_Add(t, 0, string_null, 1, 0);
264 if (t.classname == "func_clientwall" || t.classname == "func_clientillusionary")
265 t.antiwall_flag = aw_flag;
267 t.use(t, actor, this);
274 if(this.target_random && RandomSelection_chosen_ent)
275 RandomSelection_chosen_ent.use(RandomSelection_chosen_ent, actor, this);
278 void SUB_UseTargets_self(entity this)
280 SUB_UseTargets(this, NULL, NULL);