OpenMoHAA 0.82.0
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{
373 Entity::Archive(arc);
374
375 arc.ArchiveFloat(&dir);
376}
377
378class HorizontalPipe : public Entity
379{
380public:
381 float dir;
382
383 CLASS_PROTOTYPE(HorizontalPipe);
384
385 HorizontalPipe();
386 void SetAngleEvent(Event *ev);
387
388 void Archive(Archiver& arc) override;
389};
390
391inline void HorizontalPipe::Archive(Archiver& arc)
392
393{
394 Entity::Archive(arc);
395
396 arc.ArchiveFloat(&dir);
397}
398
399class TossObject : public Animate
400{
401private:
402 str bouncesound;
403 float bouncesoundchance;
404 void Stop(Event *ev);
405 void Touch(Event *ev);
406 void SetBounceSound(Event *ev);
407 void SetBounceSoundChance(Event *ev);
408
409public:
410 CLASS_PROTOTYPE(TossObject);
411
412 TossObject();
413 TossObject(str modelname);
414 void SetBounceSound(str bounce);
415 void SetBounceSoundChance(float chance);
416 void SetVelocity(float severity);
417 void Archive(Archiver& arc) override;
418};
419
420inline void TossObject::Archive(Archiver& arc)
421
422{
423 Animate::Archive(arc);
424
425 arc.ArchiveString(&bouncesound);
426 arc.ArchiveFloat(&bouncesoundchance);
427}
428
429class PushObject : public Entity
430{
431private:
432 EntityPtr owner;
433 float attack_finished;
434 int dmg;
435 str pushsound;
436
437public:
438 CLASS_PROTOTYPE(PushObject);
439
440 PushObject();
441 void Start(Event *ev);
442 void SetDamage(Event *ev);
443 void BlockFunc(Event *ev);
444 void SetPushSound(Event *ev);
445 qboolean Push(Entity *pusher, Vector move);
446 qboolean canPush(Vector dir);
447
448 Entity *getOwner(void);
449
450 void Archive(Archiver& arc) override;
451};
452
453inline void PushObject::Archive(Archiver& arc)
454{
455 Entity::Archive(arc);
456
457 arc.ArchiveSafePointer(&owner);
458 arc.ArchiveFloat(&attack_finished);
459 arc.ArchiveInteger(&dmg);
460 arc.ArchiveString(&pushsound);
461}
462
463class FallingRock : public Entity
464{
465private:
466 int active;
467 Vector start_origin;
468 Vector last_bounce_origin;
469 Entity *current;
470 Entity *activator;
471 Vector bounce_dir;
472 Vector rotateaxis;
473 float attack_finished;
474 float wait;
475 float speed;
476 int dmg;
477 str bouncesound;
478
479 void Touch(Event *ev);
480 void Bounce(Event *ev);
481 void Rotate(Event *ev);
482 void Activate(Event *ev);
483 void NextBounce(void);
484 void StartFalling(Event *ev);
485 void SetWait(Event *ev);
486 void SetSpeed(Event *ev);
487 void SetDmg(Event *ev);
488 Entity *SetNextBounceDir(void);
489 void SetBounceSound(str sound);
490 void SetBounceSound(Event *ev);
491 void Archive(Archiver& arc) override;
492
493public:
494 CLASS_PROTOTYPE(FallingRock);
495
496 FallingRock();
497};
498
499inline void FallingRock::Archive(Archiver& arc)
500
501{
502 Entity::Archive(arc);
503
504 arc.ArchiveInteger(&active);
505 arc.ArchiveVector(&start_origin);
506 arc.ArchiveVector(&last_bounce_origin);
507 arc.ArchiveObjectPointer((Class **)&current);
508 arc.ArchiveObjectPointer((Class **)&activator);
509 arc.ArchiveVector(&bounce_dir);
510 arc.ArchiveVector(&rotateaxis);
511 arc.ArchiveFloat(&attack_finished);
512 arc.ArchiveFloat(&wait);
513 arc.ArchiveFloat(&speed);
514 arc.ArchiveInteger(&dmg);
515 arc.ArchiveString(&bouncesound);
516 if (arc.Loading()) {
517 SetBounceSound(bouncesound);
518 }
519}
520
521class SupplyWater : public Trigger
522{
523private:
524 int maxwater;
525 int amount;
526
527public:
528 CLASS_PROTOTYPE(SupplyWater);
529
530 SupplyWater();
531 void Activate(Event *ev);
532 void MaxWater(Event *ev);
533 void ChargeOff(Event *ev);
534 void Archive(Archiver& arc) override;
535};
536
537inline void SupplyWater::Archive(Archiver& arc)
538
539{
540 Trigger::Archive(arc);
541
542 arc.ArchiveInteger(&amount);
543 arc.ArchiveInteger(&maxwater);
544}
545
546class FuncLadder : public Entity
547{
548private:
549 Vector m_vFacingAngles;
550 Vector m_vFacingDir;
551
552public:
553 CLASS_PROTOTYPE(FuncLadder);
554
555 FuncLadder();
556
557 void LadderSetup(Event *ev);
558
559 qboolean CanUseLadder(Entity *pUser);
560 void PositionOnLadder(Entity *pUser);
561
562 void SetLadderFacing(Event *ev);
563 void AdjustPositionOnLadder(Entity *pUser);
564
565 void EnsureOverLadder(Entity *pUser);
566 void EnsureForwardOffLadder(Entity *pUser);
567
568 const Vector& getFacingAngles() const;
569 const Vector& getFacingDir() const;
570
571 void Archive(Archiver& arc) override;
572};
573
574inline void FuncLadder::Archive(Archiver& arc)
575{
576 Entity::Archive(arc);
577
578 arc.ArchiveVector(&m_vFacingAngles);
579 arc.ArchiveVector(&m_vFacingDir);
580}
581
582class InfoLandmark : public Listener
583{
584private:
585 str m_sName;
586 Vector m_vOrigin;
587 bool m_bNameSet;
588 bool m_bOriginSet;
589
590public:
591 CLASS_PROTOTYPE(InfoLandmark);
592
593 InfoLandmark();
594 void SetLandmarkName(Event *ev);
595 void SetOrigin(Event *ev);
596};
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