1 /*void() plat_center_touch;
\r
2 void() plat_outside_touch;
\r
3 void() plat_trigger_use;
\r
7 float PLAT_LOW_TRIGGER = 1;
\r
9 void() plat_spawn_inside_trigger =
\r
11 local entity trigger;
\r
12 local vector tmin, tmax;
\r
15 trigger.touch = plat_center_touch;
\r
16 trigger.movetype = MOVETYPE_NONE;
\r
17 trigger.solid = SOLID_TRIGGER;
\r
18 trigger.enemy = self;
\r
20 tmin = self.mins + '25 25 0';
\r
21 tmax = self.maxs - '25 25 -8';
\r
22 tmin_z = tmax_z - (self.pos1_z - self.pos2_z + 8);
\r
23 if (self.spawnflags & PLAT_LOW_TRIGGER)
\r
24 tmax_z = tmin_z + 8;
\r
26 if (self.size_x <= 50)
\r
28 tmin_x = (self.mins_x + self.maxs_x) / 2;
\r
29 tmax_x = tmin_x + 1;
\r
31 if (self.size_y <= 50)
\r
33 tmin_y = (self.mins_y + self.maxs_y) / 2;
\r
34 tmax_y = tmin_y + 1;
\r
37 setsize (trigger, tmin, tmax);
\r
40 void() plat_hit_top =
\r
42 sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM);
\r
44 self.think = plat_go_down;
\r
45 self.nextthink = self.ltime + 3;
\r
48 void() plat_hit_bottom =
\r
50 sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM);
\r
54 void() plat_go_down =
\r
56 sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM);
\r
58 SUB_CalcMove (self.pos2, self.speed, plat_hit_bottom);
\r
63 sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM);
\r
65 SUB_CalcMove (self.pos1, self.speed, plat_hit_top);
\r
68 void() plat_center_touch =
\r
70 if (other.classname != "player")
\r
73 if (other.health <= 0)
\r
77 if (self.state == 2)
\r
79 else if (self.state == 1)
\r
80 self.nextthink = self.ltime + 1; // delay going down
\r
83 void() plat_outside_touch =
\r
85 if (other.classname != "player")
\r
88 if (other.health <= 0)
\r
92 if (self.state == 1)
\r
96 void() plat_trigger_use =
\r
99 return; // allready activated
\r
104 void() plat_crush =
\r
106 if (self.state == 4)
\r
108 else if (self.state == 3)
\r
111 objerror ("plat_crush: bad self.state\n");
\r
116 self.use = SUB_Null;
\r
117 if (self.state != 4)
\r
118 objerror ("plat_use: not in up state");
\r
123 .string sound1, sound2;
\r
127 if (!self.t_length)
\r
128 self.t_length = 80;
\r
132 if (self.sounds == 0)
\r
135 if (self.sounds == 1)
\r
137 precache_sound ("plats/plat1.wav");
\r
138 precache_sound ("plats/plat2.wav");
\r
139 self.noise = "plats/plat1.wav";
\r
140 self.noise1 = "plats/plat2.wav";
\r
143 if (self.sounds == 2)
\r
145 precache_sound ("plats/medplat1.wav");
\r
146 precache_sound ("plats/medplat2.wav");
\r
147 self.noise = "plats/medplat1.wav";
\r
148 self.noise1 = "plats/medplat2.wav";
\r
153 precache_sound (self.sound1);
\r
154 self.noise = self.sound1;
\r
158 precache_sound (self.sound2);
\r
159 self.noise1 = self.sound2;
\r
162 self.mangle = self.angles;
\r
163 self.angles = '0 0 0';
\r
165 self.classname = "plat";
\r
166 self.solid = SOLID_BSP;
\r
167 self.movetype = MOVETYPE_PUSH;
\r
168 setorigin (self, self.origin);
\r
169 setmodel (self, self.model);
\r
170 setsize (self, self.mins , self.maxs);
\r
172 self.blocked = plat_crush;
\r
175 self.pos1 = self.origin;
\r
176 self.pos2 = self.origin;
\r
177 self.pos2_z = self.origin_z - self.size_z + 8;
\r
179 self.use = plat_trigger_use;
\r
181 plat_spawn_inside_trigger (); // the "start moving" trigger
\r
183 if (self.targetname)
\r
186 self.use = plat_use;
\r
190 setorigin (self, self.pos2);
\r
198 void() func_train_find;
\r
200 void() train_blocked =
\r
202 if (time < self.attack_finished)
\r
204 self.attack_finished = time + 0.5;
\r
208 if (self.think != func_train_find)
\r
213 void() train_wait =
\r
217 self.nextthink = self.ltime + self.wait;
\r
218 sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM);
\r
221 self.nextthink = self.ltime + 0.1;
\r
223 self.think = train_next;
\r
226 void() train_next =
\r
230 targ = find (world, targetname, self.target);
\r
231 self.target = targ.target;
\r
233 objerror ("train_next: no next target");
\r
235 self.wait = targ.wait;
\r
238 sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM);
\r
239 SUB_CalcMove (targ.origin - self.mins, self.speed, train_wait);
\r
242 void() func_train_find =
\r
246 targ = find (world, targetname, self.target);
\r
247 self.target = targ.target;
\r
248 setorigin (self, targ.origin - self.mins);
\r
249 if (!self.targetname)
\r
250 { // not triggered, so start immediately
\r
251 self.nextthink = self.ltime + 0.1;
\r
252 self.think = train_next;
\r
257 void() func_train =
\r
262 objerror ("func_train without a target");
\r
264 if (self.sounds == 0)
\r
266 self.noise = ("misc/null.wav");
\r
267 precache_sound ("misc/null.wav");
\r
268 self.noise1 = ("misc/null.wav");
\r
269 precache_sound ("misc/null.wav");
\r
272 if (self.sounds == 1)
\r
274 self.noise = ("plats/train2.wav");
\r
275 precache_sound ("plats/train2.wav");
\r
276 self.noise1 = ("plats/train1.wav");
\r
277 precache_sound ("plats/train1.wav");
\r
280 self.solid = SOLID_BSP;
\r
281 self.movetype = MOVETYPE_PUSH;
\r
282 self.blocked = train_blocked;
\r
283 self.use = train_use;
\r
284 self.classname = "train";
\r
286 setmodel (self, self.model);
\r
287 setsize (self, self.mins , self.maxs);
\r
288 setorigin (self, self.origin);
\r
289 self.nextthink = self.ltime + 0.1;
\r
290 self.think = func_train_find;
\r
294 void() train_next; // temp
\r
295 /*void() train_wait =
\r
297 self.think = train_next;
\r
298 self.nextthink = self.ltime + self.wait;
\r
301 /*void() train_next =
\r
304 targ = find(world, targetname, self.target);
\r
305 self.target = targ.target;
\r
307 objerror("train_next: no next target");
\r
308 self.wait = targ.wait;
\r
312 SUB_CalcMove(targ.origin - self.mins, targ.speed, train_wait);
\r
314 SUB_CalcMove(targ.origin - self.mins, self.speed, train_wait);
\r
317 void() func_train_find =
\r
320 targ = find(world, targetname, self.target);
\r
321 self.target = targ.target;
\r
322 setorigin(self, targ.origin - self.mins);
\r
323 self.nextthink = self.ltime + 1;
\r
324 self.think = train_next;
\r
327 /*QUAKED func_train (0 .5 .8) ?
\r
328 Ridable platform, targets path_corner path to follow.
\r
329 speed : speed the train moves (can be overridden by each path_corner)
\r
330 target : targetname of first path_corner (starts here)
\r
332 /*void() func_train =
\r
335 objerror("func_train without a target");
\r
339 self.solid = SOLID_BSP;
\r
340 self.movetype = MOVETYPE_PUSH;
\r
342 setmodel(self, self.model);
\r
343 setsize(self, self.mins, self.maxs);
\r
344 setorigin(self, self.origin);
\r
346 // wait for targets to spawn
\r
347 self.nextthink = self.ltime + 0.1;
\r
348 self.think = func_train_find;
\r
351 /*QUAKED func_rotating (0 .5 .8) ? - - X_AXIS Y_AXIS
\r
352 Brush model that spins in place on one axis (default Z).
\r
353 speed : speed to rotate (in degrees per second)
\r
354 noise : path/name of looping .wav file to play.
\r
356 void() func_rotating =
\r
360 precache_sound(self.noise);
\r
361 ambientsound(self.origin, self.noise, 1, ATTN_IDLE);
\r
365 // FIXME: test if this turns the right way, then remove this comment (negate as needed)
\r
366 if (self.spawnflags & 4) // X (untested)
\r
367 self.avelocity = '0 0 1' * self.speed;
\r
368 // FIXME: test if this turns the right way, then remove this comment (negate as needed)
\r
369 else if (self.spawnflags & 8) // Y (untested)
\r
370 self.avelocity = '1 0 0' * self.speed;
\r
371 // FIXME: test if this turns the right way, then remove this comment (negate as needed)
\r
373 self.avelocity = '0 1 0' * self.speed;
\r
375 self.solid = SOLID_BSP;
\r
376 self.movetype = MOVETYPE_PUSH;
\r
378 setmodel(self, self.model);
\r
379 setsize(self, self.mins, self.maxs);
\r
380 setorigin(self, self.origin);
\r
382 // wait for targets to spawn
\r
383 self.nextthink = self.ltime + 999999999;
\r
384 self.think = SUB_Null;
\r
389 void() func_bobbing_controller_think =
\r
392 self.nextthink = time + 0.1;
\r
393 // calculate sinewave using makevectors
\r
394 makevectors((time * self.owner.cnt + self.owner.phase) * '0 1 0');
\r
395 v = self.owner.destvec + self.owner.movedir * v_forward_y;
\r
396 // * 10 so it will arrive in 0.1 sec
\r
397 self.owner.velocity = (v - self.owner.origin) * 10;
\r
400 /*QUAKED func_bobbing (0 .5 .8) ? X_AXIS Y_AXIS
\r
401 Brush model that moves back and forth on one axis (default Z).
\r
402 speed : how long one cycle takes in seconds (default 4)
\r
403 height : how far the cycle moves (default 32)
\r
404 phase : cycle timing adjustment (0-1 as a fraction of the cycle, default 0)
\r
405 noise : path/name of looping .wav file to play.
\r
407 void() func_bobbing =
\r
409 local entity controller;
\r
412 precache_sound(self.noise);
\r
413 ambientsound(self.origin, self.noise, 1, ATTN_IDLE);
\r
419 // center of bobbing motion
\r
420 self.destvec = self.origin;
\r
421 // time scale to get degrees
\r
422 self.cnt = 360 / self.speed;
\r
424 if (self.spawnflags & 1) // X
\r
425 self.movedir = '1 0 0' * self.height;
\r
426 else if (self.spawnflags & 2) // Y
\r
427 self.movedir = '0 1 0' * self.height;
\r
429 self.movedir = '0 0 1' * self.height;
\r
431 self.solid = SOLID_BSP;
\r
432 self.movetype = MOVETYPE_PUSH;
\r
434 setmodel(self, self.model);
\r
435 setsize(self, self.mins, self.maxs);
\r
436 setorigin(self, self.origin);
\r
438 // wait for targets to spawn
\r
439 controller = spawn();
\r
440 controller.classname = "func_bobbing_controller";
\r
441 controller.owner = self;
\r
442 controller.nextthink = time + 1;
\r
443 controller.think = func_bobbing_controller_think;
\r
444 self.nextthink = self.ltime + 999999999;
\r
445 self.think = SUB_Null;
\r