OpenMoHAA 0.82.0
Loading...
Searching...
No Matches
trigger.h
1/*
2===========================================================================
3Copyright (C) 2024 the OpenMoHAA team
4
5This file is part of OpenMoHAA source code.
6
7OpenMoHAA source code is free software; you can redistribute it
8and/or modify it under the terms of the GNU General Public License as
9published by the Free Software Foundation; either version 2 of the License,
10or (at your option) any later version.
11
12OpenMoHAA source code is distributed in the hope that it will be
13useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with OpenMoHAA source code; if not, write to the Free Software
19Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20===========================================================================
21*/
22
23// trigger.h: Environment based triggers.
24//
25
26#pragma once
27
28#include "glb_local.h"
29#include "animate.h"
30#include "gamescript.h"
31
32class ScriptMaster;
33
34extern Event EV_Trigger_ActivateTargets;
35extern Event EV_Trigger_SetWait;
36extern Event EV_Trigger_SetDelay;
37extern Event EV_Trigger_SetCount;
38extern Event EV_Trigger_SetMessage;
39extern Event EV_Trigger_SetNoise;
40extern Event EV_Trigger_SetThread;
41extern Event EV_Trigger_Effect;
42extern Event EV_Trigger_StartThread;
43extern Event EV_Trigger_SetTriggerable;
44extern Event EV_Trigger_SetNotTriggerable;
45
46#define TRIGGER_PLAYERS 4
47#define TRIGGER_MONSTERS 8
48#define TRIGGER_PROJECTILES 16
49
50class Trigger : public Animate
51{
52protected:
53 float wait;
54 float delay;
55 float trigger_time;
56 qboolean triggerActivated;
57 int count;
58 const_str noise;
59 const_str message;
60 ScriptThreadLabel m_Thread;
61 EntityPtr activator;
62 int respondto;
63 qboolean useTriggerDir;
64 float triggerCone;
65 Vector triggerDir;
66 float triggerDirYaw;
67 qboolean triggerable;
68 qboolean removable; // if count is 0, should this be removed?
69 qboolean edgeTriggered; // if true, trigger only triggers when entering trigger, not when standing in it
70 int multiFaceted; // if 0, it isn't. if 1 it is N/S oriented, if 2 it is E/W oriented
71
72public:
73 CLASS_PROTOTYPE(Trigger);
74
75 Trigger();
76 virtual ~Trigger();
77
78 // override this to allow objects other than players, projectiles, and monsters to activate the trigger
79 virtual qboolean respondTo(Entity *other);
80
81 // override this to redirect messages to an entity other than the one who triggered it
82 virtual Entity *getActivator(Entity *other);
83
84 void SetModelEvent(Event *ev);
85 void Touch(Event *ev);
86 void EventSetWait(Event *ev);
87 void EventSetDelay(Event *ev);
88 void EventSetCount(Event *ev);
89 void EventSetThread(Event *ev);
90 void SetTriggerDir(Event *ev);
91 void SetTriggerable(Event *ev);
92 void SetNotTriggerable(Event *ev);
93 void SetMultiFaceted(Event *ev);
94 void SetEdgeTriggered(Event *ev);
95 void SetTriggerCone(Event *ev);
96
97 void EventSetMessage(Event *ev);
98 void SetMessage(const char *message);
99 str& Message(void);
100
101 void EventSetNoise(Event *ev);
102 void SetNoise(const char *text);
103 str& Noise(void);
104
105 void SetTriggerDir(float angle);
106 Vector GetTriggerDir(void);
107 qboolean UsingTriggerDir(void);
108
109 void SetMultiFaceted(int newFacet);
110 void SetEdgeTriggered(qboolean newEdge);
111
112 int GetMultiFaceted(void);
113 qboolean GetEdgeTriggered(void);
114
115 void StartThread(Event *ev);
116 void TriggerStuff(Event *ev);
117 void ActivateTargets(Event *ev);
118 void DamageEvent(Event *ev) override;
119 void EventGetActivator(Event *ev); // Added in 2.30
120 void Archive(Archiver& arc) override;
121};
122
123class TriggerVehicle : public Trigger
124{
125public:
126 CLASS_PROTOTYPE(TriggerVehicle);
127
128 qboolean respondTo(Entity *other) override;
129};
130
132{
133public:
134 EntityPtr ent;
135 float time;
136
137public:
138 static void Archive(Archiver& arc, TriggerAllEntry *obj);
139};
140
141class TriggerAll : public Trigger
142{
143private:
145
146public:
147 CLASS_PROTOTYPE(TriggerAll);
148
149 void Archive(Archiver& arc) override;
150
151 void TriggerStuff(Event *ev);
152 bool IsTriggerable(Entity *other);
153 void SetTriggerTime(Entity *other, float time);
154};
155
156inline void TriggerAll::Archive(Archiver& arc)
157{
158 Trigger::Archive(arc);
159
160 entries.Archive(arc, &TriggerAllEntry::Archive);
161}
162
163class TouchField : public Trigger
164{
165private:
166 Event *ontouch;
167 EntityPtr owner;
168
169public:
170 CLASS_PROTOTYPE(TouchField);
171
172 TouchField();
173 virtual void Setup(Entity *ownerentity, Event& ontouch, Vector min, Vector max, int respondto);
174 void SendEvent(Event *ev);
175 void Archive(Archiver& arc) override;
176};
177
178inline void TouchField::Archive(Archiver& arc)
179{
180 Trigger::Archive(arc);
181
182 arc.ArchiveEventPointer(&ontouch);
183 arc.ArchiveSafePointer(&owner);
184}
185
186typedef SafePtr<TouchField> TouchFieldPtr;
187
188class TriggerOnce : public Trigger
189{
190public:
191 CLASS_PROTOTYPE(TriggerOnce);
192 TriggerOnce();
193};
194
195class TriggerSave : public TriggerOnce
196{
197private:
198 str m_sSaveName;
199
200public:
201 CLASS_PROTOTYPE(TriggerSave);
202
203 TriggerSave();
204
205 void SaveGame(Event *ev);
206 void EventSaveName(Event *ev);
207 void Archive(Archiver& arc) override;
208};
209
210class TriggerRelay : public Trigger
211{
212public:
213 CLASS_PROTOTYPE(TriggerRelay);
214
215 TriggerRelay();
216};
217
218class TriggerSecret : public TriggerOnce
219{
220public:
221 CLASS_PROTOTYPE(TriggerSecret);
222
223 TriggerSecret();
224 void FoundSecret(Event *ev);
225 void Activate(Event *ev);
226};
227
228class TriggerPush : public Trigger
229{
230protected:
231 float speed;
232
233public:
234 CLASS_PROTOTYPE(TriggerPush);
235
236 TriggerPush();
237 void Push(Event *ev);
238 void SetPushDir(Event *ev);
239 void SetPushSpeed(Event *ev);
240 void Archive(Archiver& arc) override;
241};
242
243inline void TriggerPush::Archive(Archiver& arc)
244{
245 Trigger::Archive(arc);
246
247 arc.ArchiveFloat(&speed);
248}
249
250class TriggerPushAny : public Trigger
251{
252protected:
253 float speed;
254
255public:
256 CLASS_PROTOTYPE(TriggerPushAny);
257
258 TriggerPushAny();
259 void Push(Event *ev);
260 void SetSpeed(Event *ev);
261 void Archive(Archiver& arc) override;
262};
263
264inline void TriggerPushAny::Archive(Archiver& arc)
265{
266 Trigger::Archive(arc);
267
268 arc.ArchiveFloat(&speed);
269}
270
271#define AMBIENT_ON (1 << 0)
272#define AMBIENT_OFF (1 << 1)
273#define TOGGLESOUND (1 << 5)
274
275class TriggerPlaySound : public Trigger
276{
277protected:
278 friend class SoundManager;
279
280 int state;
281 float min_dist;
282 float volume;
283 int channel;
284 qboolean ambient;
285
286public:
287 CLASS_PROTOTYPE(TriggerPlaySound);
288
289 TriggerPlaySound();
290 void ToggleSound(Event *ev);
291 void SetVolume(Event *ev);
292 void SetMinDist(Event *ev);
293 void SetChannel(Event *ev);
294
295 void StartSound(void);
296 void SetVolume(float vol);
297 void SetMinDist(float dist);
298
299 void Archive(Archiver& arc) override;
300};
301
302inline void TriggerPlaySound::Archive(Archiver& arc)
303{
304 Trigger::Archive(arc);
305
306 arc.ArchiveInteger(&state);
307 arc.ArchiveFloat(&min_dist);
308 arc.ArchiveFloat(&volume);
309 arc.ArchiveInteger(&channel);
310 arc.ArchiveBoolean(&ambient);
311 if (arc.Loading()) {
312 //
313 // see if its a toggle sound, if it is, lets start its sound again
314 //
315 if (spawnflags & TOGGLESOUND) {
316 //
317 // invert state so that final state will be right
318 //
319 state = !state;
320 PostEvent(EV_Trigger_Effect, EV_POSTSPAWN);
321 }
322 }
323}
324
325class TriggerSpeaker : public TriggerPlaySound
326{
327public:
328 CLASS_PROTOTYPE(TriggerSpeaker);
329
330 TriggerSpeaker();
331};
332
333class RandomSpeaker : public TriggerSpeaker
334{
335protected:
336 friend class SoundManager;
337
338 float chance;
339 float mindelay;
340 float maxdelay;
341
342public:
343 CLASS_PROTOTYPE(RandomSpeaker);
344
345 RandomSpeaker();
346 void TriggerSound(Event *ev);
347 void SetMinDelay(Event *ev);
348 void SetMaxDelay(Event *ev);
349 void SetChance(Event *ev);
350
351 void SetMinDelay(float value);
352 void SetMaxDelay(float value);
353 void SetChance(float value);
354 void ScheduleSound(void);
355
356 void Archive(Archiver& arc) override;
357};
358
359inline void RandomSpeaker::Archive(Archiver& arc)
360{
361 TriggerSpeaker::Archive(arc);
362
363 arc.ArchiveFloat(&chance);
364 arc.ArchiveFloat(&mindelay);
365 arc.ArchiveFloat(&maxdelay);
366}
367
368class TriggerChangeLevel : public Trigger
369{
370protected:
371 const_str map;
372 const_str spawnspot;
373
374public:
375 CLASS_PROTOTYPE(TriggerChangeLevel);
376
377 TriggerChangeLevel();
378 void SetMap(Event *ev);
379 void SetSpawnSpot(Event *ev);
380 void ChangeLevel(Event *ev);
381 const char *Map(void);
382 const char *SpawnSpot(void);
383 void Archive(Archiver& arc) override;
384};
385
386class TriggerExit : public Trigger
387{
388public:
389 CLASS_PROTOTYPE(TriggerExit);
390
391 TriggerExit();
392 void DisplayExitSign(Event *ev);
393 void TurnExitSignOff(Event *ev);
394};
395
396class TriggerUse : public Trigger
397{
398public:
399 CLASS_PROTOTYPE(TriggerUse);
400
401 TriggerUse();
402};
403
404//
405// Added in 2.30
406// Can only be triggered if within specific degrees
407class TriggerSidedUse : public TriggerUse
408{
409public:
410 CLASS_PROTOTYPE(TriggerSidedUse);
411
412 TriggerSidedUse();
413};
414
415class TriggerUseOnce : public TriggerUse
416{
417public:
418 CLASS_PROTOTYPE(TriggerUseOnce);
419
420 TriggerUseOnce();
421};
422
423class TriggerHurt : public Trigger
424{
425protected:
426 float damage;
427
428 void Hurt(Event *ev);
429 void SetDamage(Event *ev);
430
431public:
432 CLASS_PROTOTYPE(TriggerHurt);
433
434 TriggerHurt();
435 void Archive(Archiver& arc) override;
436};
437
438inline void TriggerHurt::Archive(Archiver& arc)
439{
440 Trigger::Archive(arc);
441
442 arc.ArchiveFloat(&damage);
443}
444
445class TriggerDamageTargets : public Trigger
446{
447protected:
448 float damage;
449
450 void DamageTargets(Event *ev);
451 void SetDamage(Event *ev);
452
453public:
454 CLASS_PROTOTYPE(TriggerDamageTargets);
455
456 TriggerDamageTargets();
457 void PassDamage(Event *ev);
458 void Archive(Archiver& arc) override;
459};
460
461inline void TriggerDamageTargets::Archive(Archiver& arc)
462
463{
464 Trigger::Archive(arc);
465
466 arc.ArchiveFloat(&damage);
467}
468
469class TriggerCameraUse : public TriggerUse
470{
471public:
472 CLASS_PROTOTYPE(TriggerCameraUse);
473
474 void TriggerCamera(Event *ev);
475};
476
477class TriggerBox : public Trigger
478{
479public:
480 CLASS_PROTOTYPE(TriggerBox);
481
482 void SetMins(Event *ev);
483 void SetMaxs(Event *ev);
484};
485
486class TriggerMusic : public Trigger
487{
488private:
489 friend class SoundManager;
490
491 qboolean oneshot;
492 const_str current;
493 const_str fallback;
494 const_str altcurrent;
495 const_str altfallback;
496
497public:
498 CLASS_PROTOTYPE(TriggerMusic);
499
500 TriggerMusic();
501 void SetCurrentMood(Event *ev);
502 void SetFallbackMood(Event *ev);
503 void SetAltCurrentMood(Event *ev);
504 void SetAltFallbackMood(Event *ev);
505 void ChangeMood(Event *ev);
506 void AltChangeMood(Event *ev);
507 void SetOneShot(Event *ev);
508
509 void SetMood(str crnt, str fback);
510 void SetAltMood(str crnt, str fback);
511 void SetOneShot(qboolean once);
512
513 void Archive(Archiver& arc) override;
514};
515
516class TriggerReverb : public Trigger
517{
518private:
519 friend class SoundManager;
520
521 qboolean oneshot;
522 int reverbtype;
523 int altreverbtype;
524 float reverblevel;
525 float altreverblevel;
526
527public:
528 CLASS_PROTOTYPE(TriggerReverb);
529
530 TriggerReverb();
531 void SetReverbLevel(Event *ev);
532 void SetReverbType(Event *ev);
533 void SetAltReverbType(Event *ev);
534 void SetAltReverbLevel(Event *ev);
535 void ChangeReverb(Event *ev);
536 void AltChangeReverb(Event *ev);
537 void SetOneShot(Event *ev);
538
539 void SetReverb(int type, float level);
540 void SetAltReverb(int type, float level);
541 void SetOneShot(qboolean once);
542
543 void Archive(Archiver& arc) override;
544};
545
546inline void TriggerReverb::Archive(Archiver& arc)
547
548{
549 Trigger::Archive(arc);
550
551 arc.ArchiveBoolean(&oneshot);
552 arc.ArchiveInteger(&reverbtype);
553 arc.ArchiveInteger(&altreverbtype);
554 arc.ArchiveFloat(&reverblevel);
555 arc.ArchiveFloat(&altreverblevel);
556}
557
558class TriggerByPushObject : public TriggerOnce
559{
560private:
561 const_str triggername;
562
563 void setTriggerName(Event *event);
564
565public:
566 CLASS_PROTOTYPE(TriggerByPushObject);
567
568 qboolean respondTo(Entity *other) override;
569 Entity *getActivator(Entity *other) override;
570
571 void Archive(Archiver& arc) override;
572};
573
574class TriggerGivePowerup : public Trigger
575{
576private:
577 qboolean oneshot;
578 const_str powerup_name;
579
580public:
581 CLASS_PROTOTYPE(TriggerGivePowerup);
582
583 TriggerGivePowerup();
584
585 void SetOneShot(Event *ev);
586 void SetPowerupName(Event *ev);
587 void GivePowerup(Event *ev);
588 void Archive(Archiver& arc) override;
589};
590
591class TriggerClickItem : public Trigger
592{
593public:
594 CLASS_PROTOTYPE(TriggerClickItem);
595
596 TriggerClickItem();
597
598 void SetClickItemModelEvent(Event *ev);
599 void Archive(Archiver& arc) override;
600};
601
602inline void TriggerClickItem::Archive(Archiver& arc)
603{
604 Trigger::Archive(arc);
605}
606
607//
608// Added in 2.0
609//
610
611class TriggerNoDamage : public TriggerUse
612{
613public:
614 CLASS_PROTOTYPE(TriggerNoDamage);
615
616public:
617 void TakeNoDamage(Event *ev);
618};
619
620//
621// Added in 2.30
622//
623
624class TriggerEntity : public Trigger
625{
626public:
627 CLASS_PROTOTYPE(TriggerEntity);
628
629public:
630 qboolean respondTo(Entity *other) override;
631};
632
633class TriggerLandmine : public TriggerEntity
634{
635public:
636 CLASS_PROTOTYPE(TriggerLandmine);
637
638 TriggerLandmine();
639 void Archive(Archiver& arc) override;
640
641 void EventIsAbandoned(Event *ev);
642 void EventIsImmune(Event *ev);
643 void EventSetDamageable(Event *ev);
644
645 void SetDamageable(qboolean damageable);
646 qboolean IsImmune(Entity *other) const;
647 void SetTeam(int team);
648
649private:
650 int team;
651};
652
653inline void TriggerLandmine::Archive(Archiver& arc)
654{
655 Trigger::Archive(arc);
656
657 arc.ArchiveInteger(&team);
658}
Definition archive.h:86
Definition container.h:85
Definition entity.h:203
Definition listener.h:246
Definition safeptr.h:160
Definition scriptmaster.h:42
Definition gamescript.h:165
Definition trigger.h:132
Definition trigger.h:142
Definition trigger.h:478
Definition trigger.h:559
Definition trigger.h:470
Definition trigger.h:625
Definition trigger.h:612
Definition trigger.h:124
Definition vector.h:61
Definition str.h:77
Definition puff.c:88