OpenMoHAA 0.82.1
Loading...
Searching...
No Matches
misc.h
1/*
2===========================================================================
3Copyright (C) 2025 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// misc.h:
24// Basically the big stew pot of the DLLs, or maybe a garbage bin, whichever
25// metaphore you prefer. This really should be cleaned up. Anyway, this
26// should contain utility functions that could be used by any entity.
27// Right now it contains everything from entities that could be in their
28// own file to my mother pot roast recipes.
29//
30
31#pragma once
32
33#include "g_local.h"
34#include "entity.h"
35#include "mover.h"
36#include "animate.h"
37
38class InfoNull : public Listener
39{
40public:
41 CLASS_PROTOTYPE(InfoNull);
42
43 InfoNull();
44};
45
46class FuncRemove : public Entity
47{
48public:
49 CLASS_PROTOTYPE(FuncRemove);
50
51 FuncRemove();
52};
53
54class MiscModel : public Entity
55{
56public:
57 CLASS_PROTOTYPE(MiscModel);
58
59 MiscModel();
60};
61
62class InfoNotNull : public Entity
63{
64public:
65 CLASS_PROTOTYPE(InfoNotNull);
66};
67
68class ExplodingWall : public Trigger
69{
70protected:
71 int dmg;
72 int explosions;
73 float attack_finished;
74 Vector land_angles;
75 float land_radius;
76 float angle_speed;
77 int state;
78 Vector base_velocity;
79 Vector random_velocity;
80 Vector orig_mins, orig_maxs;
81 qboolean on_ground;
82
83public:
84 CLASS_PROTOTYPE(ExplodingWall);
85
86 ExplodingWall();
87 void Setup(Event *ev);
88 void AngleSpeed(Event *ev);
89 void LandRadius(Event *ev);
90 void LandAngles(Event *ev);
91 void BaseVelocity(Event *ev);
92 void RandomVelocity(Event *ev);
93 void SetDmg(Event *ev);
94 void SetExplosions(Event *ev);
95 void SetupSecondStage(void);
96 void Explode(Event *ev);
97 void DamageEvent(Event *ev) override;
98 void GroundDamage(Event *ev);
99 void TouchFunc(Event *ev);
100 void StopRotating(Event *ev);
101 void CheckOnGround(Event *ev);
102 void Archive(Archiver& arc) override;
103};
104
105inline void ExplodingWall::Archive(Archiver& arc)
106{
107 Trigger::Archive(arc);
108
109 arc.ArchiveInteger(&dmg);
110 arc.ArchiveInteger(&explosions);
111 arc.ArchiveFloat(&attack_finished);
112 arc.ArchiveVector(&land_angles);
113 arc.ArchiveFloat(&land_radius);
114 arc.ArchiveFloat(&angle_speed);
115 arc.ArchiveInteger(&state);
116 arc.ArchiveVector(&base_velocity);
117 arc.ArchiveVector(&random_velocity);
118 arc.ArchiveVector(&orig_mins);
119 arc.ArchiveVector(&orig_maxs);
120 arc.ArchiveBoolean(&on_ground);
121}
122
123class Teleporter : public Trigger
124{
125public:
126 ScriptThreadLabel teleport_label;
127 qboolean in_use;
128
129 CLASS_PROTOTYPE(Teleporter);
130
131 Teleporter();
132 virtual void StartTeleport(Event *ev);
133 virtual void Teleport(Event *ev);
134 virtual void StopTeleport(Event *ev);
135 void SetThread(Event *ev);
136 void Archive(Archiver& arc) override;
137};
138
139inline void Teleporter::Archive(Archiver& arc)
140{
141 Trigger::Archive(arc);
142
143 arc.ArchiveBoolean(&in_use);
144}
145
146class TeleporterDestination : public Entity
147{
148public:
149 Vector movedir;
150
151 CLASS_PROTOTYPE(TeleporterDestination);
152
153 TeleporterDestination();
154 void SetMoveDir(Event *ev);
155 void Archive(Archiver& arc) override;
156};
157
158inline void TeleporterDestination::Archive(Archiver& arc)
159{
160 Entity::Archive(arc);
161
162 arc.ArchiveVector(&movedir);
163}
164
165class UseAnim : public Entity
166{
167public:
168 int count;
169 qboolean active;
170 ScriptThreadLabel thread;
171 str triggertarget;
172 int num_loops;
173 str state;
174 str camera;
175 str anim;
176 str key;
177 float delay;
178 float last_active_time;
179
180 CLASS_PROTOTYPE(UseAnim);
181
182 UseAnim();
183 virtual void Touched(Event *ev);
184 void Reset(Event *ev);
185 void SetThread(Event *ev);
186 void SetTriggerTarget(Event *ev);
187 void SetCount(Event *ev);
188 void SetAnim(Event *ev);
189 void SetState(Event *ev);
190 void SetKey(Event *ev);
191 void SetCamera(Event *ev);
192 void SetNumLoops(Event *ev);
193 void SetDelay(Event *ev);
194 bool canBeUsed(Entity *activator);
195 bool GetInformation(
196 Entity *activator, Vector *org, Vector *angles, str *animatoin, int *loopcount, str *state, str *camera
197 );
198 void TriggerTargets(Entity *activator);
199 void Archive(Archiver& arc) override;
200};
201
202inline void UseAnim::Archive(Archiver& arc)
203{
204 Entity::Archive(arc);
205
206 arc.ArchiveInteger(&count);
207 arc.ArchiveBoolean(&active);
208 arc.ArchiveString(&triggertarget);
209 arc.ArchiveInteger(&num_loops);
210 arc.ArchiveString(&state);
211 arc.ArchiveString(&camera);
212 arc.ArchiveString(&anim);
213 arc.ArchiveString(&key);
214 arc.ArchiveFloat(&delay);
215 arc.ArchiveFloat(&last_active_time);
216}
217
218class TouchAnim : public UseAnim
219{
220public:
221 CLASS_PROTOTYPE(TouchAnim);
222
223 TouchAnim();
224};
225
226class UseAnimDestination : public Entity
227{
228public:
229 int num_loops;
230 str state;
231 str anim;
232
233 CLASS_PROTOTYPE(UseAnimDestination);
234
235 UseAnimDestination();
236 void SetAnim(Event *ev);
237 void SetState(Event *ev);
238 void SetNumLoops(Event *ev);
239 int GetNumLoops(void);
240 str GetAnim(void);
241 str GetState(void);
242 void Archive(Archiver& arc) override;
243};
244
245inline void UseAnimDestination::Archive(Archiver& arc)
246{
247 Entity::Archive(arc);
248
249 arc.ArchiveInteger(&num_loops);
250 arc.ArchiveString(&state);
251 arc.ArchiveString(&anim);
252}
253
254class UseObject : public Animate
255{
256public:
257 ScriptThreadLabel move_thread;
258 ScriptThreadLabel stop_thread;
259 ScriptThreadLabel reset_thread;
260 str triggertarget;
261 Vector offset;
262 float yaw_offset;
263 int count;
264 float cone;
265 str state;
266 str state_backwards;
267 str useMaterial;
268 int objectState;
269 float reset_time;
270 qboolean active;
271
272 CLASS_PROTOTYPE(UseObject);
273
274 UseObject();
275 void SetMoveThread(Event *ev);
276 void SetStopThread(Event *ev);
277 void SetResetThread(Event *ev);
278 void SetTriggerTarget(Event *ev);
279 void SetOffset(Event *ev);
280 void SetYawOffset(Event *ev);
281 void SetCount(Event *ev);
282 void SetCone(Event *ev);
283 void SetState(Event *ev);
284 void SetBackwardsState(Event *ev);
285 void SetResetTime(Event *ev);
286 void Reset(Event *ev);
287 void Resetting(Event *ev);
288 void DamageTriggered(Event *ev);
289 void DamageFunc(Event *ev);
290 bool canBeUsed(Vector org, Vector dir);
291 void Setup(Entity *activator, Vector *org, Vector *ang, str *newstate);
292 void Start(Event *ev = NULL);
293 bool Loop(void);
294 void SetActiveState(Event *ev);
295 void Stop(Entity *activator);
296 void ActivateEvent(Event *ev);
297 void DeactivateEvent(Event *ev);
298 void UseMaterialEvent(Event *ev);
299 void Archive(Archiver& arc) override;
300};
301
302inline void UseObject::Archive(Archiver& arc)
303{
304 Animate::Archive(arc);
305
306 arc.ArchiveString(&triggertarget);
307 arc.ArchiveVector(&offset);
308 arc.ArchiveFloat(&yaw_offset);
309 arc.ArchiveInteger(&count);
310 arc.ArchiveFloat(&cone);
311 arc.ArchiveString(&state);
312 arc.ArchiveString(&state_backwards);
313 arc.ArchiveString(&useMaterial);
314 arc.ArchiveInteger(&objectState);
315 arc.ArchiveFloat(&reset_time);
316 arc.ArchiveBoolean(&active);
317}
318
319class Waypoint : public SimpleArchivedEntity
320{
321public:
322 CLASS_PROTOTYPE(Waypoint);
323
324public:
325 Waypoint();
326};
327
328class TempWaypoint : public SimpleArchivedEntity
329{
330public:
331 CLASS_PROTOTYPE(TempWaypoint);
332
333public:
334 TempWaypoint();
335};
336
337class VehiclePoint : public Waypoint
338{
339public:
340 unsigned int spawnflags;
341
342 CLASS_PROTOTYPE(VehiclePoint);
343
344 VehiclePoint();
345
346 void SetSpawnFlags(Event *ev);
347 void Archive(Archiver& arc) override;
348};
349
350inline void VehiclePoint::Archive(Archiver& arc)
351{
352 SimpleArchivedEntity::Archive(arc);
353
354 arc.ArchiveUnsigned(&spawnflags);
355}
356
357class MonkeyBars : public Entity
358{
359public:
360 float dir;
361
362 CLASS_PROTOTYPE(MonkeyBars);
363
364 MonkeyBars();
365 void SetAngleEvent(Event *ev);
366
367 void Archive(Archiver& arc) override;
368};
369
370inline void MonkeyBars::Archive(Archiver& arc)
371{
372 Entity::Archive(arc);
373
374 arc.ArchiveFloat(&dir);
375}
376
377class HorizontalPipe : public Entity
378{
379public:
380 float dir;
381
382 CLASS_PROTOTYPE(HorizontalPipe);
383
384 HorizontalPipe();
385 void SetAngleEvent(Event *ev);
386
387 void Archive(Archiver& arc) override;
388};
389
390inline void HorizontalPipe::Archive(Archiver& arc)
391{
392 Entity::Archive(arc);
393
394 arc.ArchiveFloat(&dir);
395}
396
397class TossObject : public Animate
398{
399private:
400 str bouncesound;
401 float bouncesoundchance;
402 void Stop(Event *ev);
403 void Touch(Event *ev);
404 void SetBounceSound(Event *ev);
405 void SetBounceSoundChance(Event *ev);
406
407public:
408 CLASS_PROTOTYPE(TossObject);
409
410 TossObject();
411 TossObject(str modelname);
412 void SetBounceSound(str bounce);
413 void SetBounceSoundChance(float chance);
414 void SetVelocity(float severity);
415 void Archive(Archiver& arc) override;
416};
417
418inline void TossObject::Archive(Archiver& arc)
419{
420 Animate::Archive(arc);
421
422 arc.ArchiveString(&bouncesound);
423 arc.ArchiveFloat(&bouncesoundchance);
424}
425
426class PushObject : public Entity
427{
428private:
429 EntityPtr owner;
430 float attack_finished;
431 int dmg;
432 str pushsound;
433
434public:
435 CLASS_PROTOTYPE(PushObject);
436
437 PushObject();
438 void Start(Event *ev);
439 void SetDamage(Event *ev);
440 void BlockFunc(Event *ev);
441 void SetPushSound(Event *ev);
442 qboolean Push(Entity *pusher, Vector move);
443 qboolean canPush(Vector dir);
444
445 Entity *getOwner(void);
446
447 void Archive(Archiver& arc) override;
448};
449
450inline void PushObject::Archive(Archiver& arc)
451{
452 Entity::Archive(arc);
453
454 arc.ArchiveSafePointer(&owner);
455 arc.ArchiveFloat(&attack_finished);
456 arc.ArchiveInteger(&dmg);
457 arc.ArchiveString(&pushsound);
458}
459
460class FallingRock : public Entity
461{
462private:
463 int active;
464 Vector start_origin;
465 Vector last_bounce_origin;
466 Entity *current;
467 Entity *activator;
468 Vector bounce_dir;
469 Vector rotateaxis;
470 float attack_finished;
471 float wait;
472 float speed;
473 int dmg;
474 str bouncesound;
475
476 void Touch(Event *ev);
477 void Bounce(Event *ev);
478 void Rotate(Event *ev);
479 void Activate(Event *ev);
480 void NextBounce(void);
481 void StartFalling(Event *ev);
482 void SetWait(Event *ev);
483 void SetSpeed(Event *ev);
484 void SetDmg(Event *ev);
485 Entity *SetNextBounceDir(void);
486 void SetBounceSound(str sound);
487 void SetBounceSound(Event *ev);
488 void Archive(Archiver& arc) override;
489
490public:
491 CLASS_PROTOTYPE(FallingRock);
492
493 FallingRock();
494};
495
496inline void FallingRock::Archive(Archiver& arc)
497{
498 Entity::Archive(arc);
499
500 arc.ArchiveInteger(&active);
501 arc.ArchiveVector(&start_origin);
502 arc.ArchiveVector(&last_bounce_origin);
503 arc.ArchiveObjectPointer((Class **)&current);
504 arc.ArchiveObjectPointer((Class **)&activator);
505 arc.ArchiveVector(&bounce_dir);
506 arc.ArchiveVector(&rotateaxis);
507 arc.ArchiveFloat(&attack_finished);
508 arc.ArchiveFloat(&wait);
509 arc.ArchiveFloat(&speed);
510 arc.ArchiveInteger(&dmg);
511 arc.ArchiveString(&bouncesound);
512 if (arc.Loading()) {
513 SetBounceSound(bouncesound);
514 }
515}
516
517class SupplyWater : public Trigger
518{
519private:
520 int maxwater;
521 int amount;
522
523public:
524 CLASS_PROTOTYPE(SupplyWater);
525
526 SupplyWater();
527 void Activate(Event *ev);
528 void MaxWater(Event *ev);
529 void ChargeOff(Event *ev);
530 void Archive(Archiver& arc) override;
531};
532
533inline void SupplyWater::Archive(Archiver& arc)
534{
535 Trigger::Archive(arc);
536
537 arc.ArchiveInteger(&amount);
538 arc.ArchiveInteger(&maxwater);
539}
540
541class FuncLadder : public Entity
542{
543private:
544 Vector m_vFacingAngles;
545 Vector m_vFacingDir;
546
547public:
548 CLASS_PROTOTYPE(FuncLadder);
549
550 FuncLadder();
551
552 void LadderSetup(Event *ev);
553
554 qboolean CanUseLadder(Entity *pUser);
555 void PositionOnLadder(Entity *pUser);
556
557 void SetLadderFacing(Event *ev);
558 void AdjustPositionOnLadder(Entity *pUser);
559
560 void EnsureOverLadder(Entity *pUser);
561 void EnsureForwardOffLadder(Entity *pUser);
562
563 const Vector& getFacingAngles() const;
564 const Vector& getFacingDir() const;
565
566 void Archive(Archiver& arc) override;
567};
568
569inline void FuncLadder::Archive(Archiver& arc)
570{
571 Entity::Archive(arc);
572
573 arc.ArchiveVector(&m_vFacingAngles);
574 arc.ArchiveVector(&m_vFacingDir);
575}
576
577class InfoLandmark : public Listener
578{
579private:
580 str m_sName;
581 Vector m_vOrigin;
582 bool m_bNameSet;
583 bool m_bOriginSet;
584
585public:
586 CLASS_PROTOTYPE(InfoLandmark);
587
588 InfoLandmark();
589 void SetLandmarkName(Event *ev);
590 void SetOrigin(Event *ev);
591};
Definition archive.h:86
Definition class.h:276
Definition listener.h:246
Definition misc.h:63
Definition gamescript.h:165
Definition vector.h:61
Definition str.h:77
Definition puff.c:88