openmohaa/code/fgame/misc.h

584 lines
13 KiB
C
Raw Normal View History

2016-03-27 11:49:47 +02:00
/*
===========================================================================
2023-10-24 20:27:18 +02:00
Copyright (C) 2023 the OpenMoHAA team
2016-03-27 11:49:47 +02:00
This file is part of OpenMoHAA source code.
OpenMoHAA source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.
OpenMoHAA source code is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenMoHAA source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
// misc.h:
// Basically the big stew pot of the DLLs, or maybe a garbage bin, whichever
// metaphore you prefer. This really should be cleaned up. Anyway, this
// should contain utility functions that could be used by any entity.
// Right now it contains everything from entities that could be in their
// own file to my mother pot roast recipes.
2023-10-24 20:27:18 +02:00
//
2016-03-27 11:49:47 +02:00
2023-11-03 22:10:14 +01:00
#pragma once
2016-03-27 11:49:47 +02:00
#include "g_local.h"
#include "entity.h"
#include "mover.h"
#include "animate.h"
class InfoNull : public Entity
2023-10-24 20:27:18 +02:00
{
public:
CLASS_PROTOTYPE(InfoNull);
InfoNull();
};
2016-03-27 11:49:47 +02:00
class FuncRemove : public Entity
2023-10-24 20:27:18 +02:00
{
public:
CLASS_PROTOTYPE(FuncRemove);
FuncRemove();
};
2016-03-27 11:49:47 +02:00
class MiscModel : public Entity
2023-10-24 20:27:18 +02:00
{
public:
CLASS_PROTOTYPE(MiscModel);
MiscModel();
};
2016-03-27 11:49:47 +02:00
class InfoNotNull : public Entity
2023-10-24 20:27:18 +02:00
{
public:
CLASS_PROTOTYPE(InfoNotNull);
};
2016-03-27 11:49:47 +02:00
class ExplodingWall : public Trigger
2023-10-24 20:27:18 +02:00
{
protected:
int dmg;
int explosions;
float attack_finished;
Vector land_angles;
float land_radius;
float angle_speed;
int state;
Vector base_velocity;
Vector random_velocity;
Vector orig_mins, orig_maxs;
qboolean on_ground;
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
public:
CLASS_PROTOTYPE(ExplodingWall);
ExplodingWall();
void Setup(Event *ev);
void AngleSpeed(Event *ev);
void LandRadius(Event *ev);
void LandAngles(Event *ev);
void BaseVelocity(Event *ev);
void RandomVelocity(Event *ev);
void SetDmg(Event *ev);
void SetExplosions(Event *ev);
void SetupSecondStage(void);
void Explode(Event *ev);
void DamageEvent(Event *ev) override;
void GroundDamage(Event *ev);
void TouchFunc(Event *ev);
void StopRotating(Event *ev);
void CheckOnGround(Event *ev);
void Archive(Archiver& arc) override;
};
inline void ExplodingWall::Archive(Archiver& arc)
{
Trigger::Archive(arc);
arc.ArchiveInteger(&dmg);
arc.ArchiveInteger(&explosions);
arc.ArchiveFloat(&attack_finished);
arc.ArchiveVector(&land_angles);
arc.ArchiveFloat(&land_radius);
arc.ArchiveFloat(&angle_speed);
arc.ArchiveInteger(&state);
arc.ArchiveVector(&base_velocity);
arc.ArchiveVector(&random_velocity);
arc.ArchiveVector(&orig_mins);
arc.ArchiveVector(&orig_maxs);
arc.ArchiveBoolean(&on_ground);
}
2016-03-27 11:49:47 +02:00
class Teleporter : public Trigger
2023-10-24 20:27:18 +02:00
{
public:
ScriptThreadLabel teleport_label;
qboolean in_use;
CLASS_PROTOTYPE(Teleporter);
Teleporter();
virtual void StartTeleport(Event *ev);
virtual void Teleport(Event *ev);
virtual void StopTeleport(Event *ev);
void SetThread(Event *ev);
void Archive(Archiver &arc) override;
};
inline void Teleporter::Archive(Archiver& arc)
{
Trigger::Archive(arc);
arc.ArchiveBoolean(&in_use);
}
2016-03-27 11:49:47 +02:00
class TeleporterDestination : public Entity
2023-10-24 20:27:18 +02:00
{
public:
Vector movedir;
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
CLASS_PROTOTYPE(TeleporterDestination);
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
TeleporterDestination();
void SetMoveDir(Event *ev);
void Archive(Archiver& arc) override;
};
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
inline void TeleporterDestination::Archive(Archiver& arc)
{
Entity::Archive(arc);
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
arc.ArchiveVector(&movedir);
}
2016-03-27 11:49:47 +02:00
class UseAnim : public Entity
2023-10-24 20:27:18 +02:00
{
public:
int count;
qboolean active;
ScriptThreadLabel thread;
str triggertarget;
int num_loops;
str state;
str camera;
str anim;
str key;
float delay;
float last_active_time;
CLASS_PROTOTYPE(UseAnim);
UseAnim();
virtual void Touched(Event *ev);
void Reset(Event *ev);
void SetThread(Event *ev);
void SetTriggerTarget(Event *ev);
void SetCount(Event *ev);
void SetAnim(Event *ev);
void SetState(Event *ev);
void SetKey(Event *ev);
void SetCamera(Event *ev);
void SetNumLoops(Event *ev);
void SetDelay(Event *ev);
bool canBeUsed(Entity *activator);
bool GetInformation(
Entity *activator, Vector *org, Vector *angles, str *animatoin, int *loopcount, str *state, str *camera
);
void TriggerTargets(Entity *activator);
void Archive(Archiver& arc) override;
};
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
inline void UseAnim::Archive(Archiver& arc)
{
Entity::Archive(arc);
arc.ArchiveInteger(&count);
arc.ArchiveBoolean(&active);
arc.ArchiveString(&triggertarget);
arc.ArchiveInteger(&num_loops);
arc.ArchiveString(&state);
arc.ArchiveString(&camera);
arc.ArchiveString(&anim);
arc.ArchiveString(&key);
arc.ArchiveFloat(&delay);
arc.ArchiveFloat(&last_active_time);
}
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
class TouchAnim : public UseAnim
{
public:
CLASS_PROTOTYPE(TouchAnim);
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
TouchAnim();
};
2016-03-27 11:49:47 +02:00
class UseAnimDestination : public Entity
2023-10-24 20:27:18 +02:00
{
public:
int num_loops;
str state;
str anim;
CLASS_PROTOTYPE(UseAnimDestination);
UseAnimDestination();
void SetAnim(Event *ev);
void SetState(Event *ev);
void SetNumLoops(Event *ev);
int GetNumLoops(void);
str GetAnim(void);
str GetState(void);
void Archive(Archiver& arc) override;
};
inline void UseAnimDestination::Archive(Archiver& arc)
{
Entity::Archive(arc);
arc.ArchiveInteger(&num_loops);
arc.ArchiveString(&state);
arc.ArchiveString(&anim);
}
2016-03-27 11:49:47 +02:00
class UseObject : public Animate
2023-10-24 20:27:18 +02:00
{
public:
ScriptThreadLabel move_thread;
ScriptThreadLabel stop_thread;
ScriptThreadLabel reset_thread;
str triggertarget;
Vector offset;
float yaw_offset;
int count;
float cone;
str state;
str state_backwards;
str useMaterial;
int objectState;
float reset_time;
qboolean active;
CLASS_PROTOTYPE(UseObject);
UseObject();
void SetMoveThread(Event *ev);
void SetStopThread(Event *ev);
void SetResetThread(Event *ev);
void SetTriggerTarget(Event *ev);
void SetOffset(Event *ev);
void SetYawOffset(Event *ev);
void SetCount(Event *ev);
void SetCone(Event *ev);
void SetState(Event *ev);
void SetBackwardsState(Event *ev);
void SetResetTime(Event *ev);
void Reset(Event *ev);
void Resetting(Event *ev);
void DamageTriggered(Event *ev);
void DamageFunc(Event *ev);
bool canBeUsed(Vector org, Vector dir);
void Setup(Entity *activator, Vector *org, Vector *ang, str *newstate);
void Start(Event *ev = NULL);
bool Loop(void);
void SetActiveState(Event *ev);
void Stop(Entity *activator);
void ActivateEvent(Event *ev);
void DeactivateEvent(Event *ev);
void UseMaterialEvent(Event *ev);
void Archive(Archiver& arc) override;
};
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
inline void UseObject::Archive(Archiver& arc)
{
Animate::Archive(arc);
arc.ArchiveString(&triggertarget);
arc.ArchiveVector(&offset);
arc.ArchiveFloat(&yaw_offset);
arc.ArchiveInteger(&count);
arc.ArchiveFloat(&cone);
arc.ArchiveString(&state);
arc.ArchiveString(&state_backwards);
arc.ArchiveString(&useMaterial);
arc.ArchiveInteger(&objectState);
arc.ArchiveFloat(&reset_time);
arc.ArchiveBoolean(&active);
}
2016-03-27 11:49:47 +02:00
class Waypoint : public SimpleArchivedEntity
{
public:
2023-10-24 20:27:18 +02:00
CLASS_PROTOTYPE(Waypoint);
public:
Waypoint();
2016-03-27 11:49:47 +02:00
};
class TempWaypoint : public SimpleArchivedEntity
{
public:
2023-10-24 20:27:18 +02:00
CLASS_PROTOTYPE(TempWaypoint);
public:
TempWaypoint();
2016-03-27 11:49:47 +02:00
};
class VehiclePoint : public Waypoint
{
public:
2023-10-24 20:27:18 +02:00
unsigned int spawnflags;
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
CLASS_PROTOTYPE(VehiclePoint);
2016-03-27 11:49:47 +02:00
VehiclePoint();
2023-10-24 20:27:18 +02:00
void SetSpawnFlags(Event *ev);
void Archive(Archiver& arc) override;
2016-03-27 11:49:47 +02:00
};
2023-10-24 20:27:18 +02:00
inline void VehiclePoint::Archive(Archiver& arc)
2016-03-27 11:49:47 +02:00
{
2023-10-24 20:27:18 +02:00
SimpleArchivedEntity::Archive(arc);
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
arc.ArchiveUnsigned(&spawnflags);
2016-03-27 11:49:47 +02:00
}
class MonkeyBars : public Entity
2023-10-24 20:27:18 +02:00
{
public:
float dir;
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
CLASS_PROTOTYPE(MonkeyBars);
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
MonkeyBars();
void SetAngleEvent(Event *ev);
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
void Archive(Archiver& arc) override;
};
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
inline void MonkeyBars::Archive(Archiver& arc)
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
{
Entity::Archive(arc);
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
arc.ArchiveFloat(&dir);
}
2016-03-27 11:49:47 +02:00
class HorizontalPipe : public Entity
2023-10-24 20:27:18 +02:00
{
public:
float dir;
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
CLASS_PROTOTYPE(HorizontalPipe);
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
HorizontalPipe();
void SetAngleEvent(Event *ev);
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
void Archive(Archiver& arc) override;
};
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
inline void HorizontalPipe::Archive(Archiver& arc)
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
{
Entity::Archive(arc);
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
arc.ArchiveFloat(&dir);
}
2016-03-27 11:49:47 +02:00
class TossObject : public Animate
2023-10-24 20:27:18 +02:00
{
private:
str bouncesound;
float bouncesoundchance;
void Stop(Event *ev);
void Touch(Event *ev);
void SetBounceSound(Event *ev);
void SetBounceSoundChance(Event *ev);
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
public:
CLASS_PROTOTYPE(TossObject);
TossObject();
TossObject(str modelname);
void SetBounceSound(str bounce);
void SetBounceSoundChance(float chance);
void SetVelocity(float severity);
void Archive(Archiver& arc) override;
};
inline void TossObject::Archive(Archiver& arc)
{
Animate::Archive(arc);
arc.ArchiveString(&bouncesound);
arc.ArchiveFloat(&bouncesoundchance);
}
2016-03-27 11:49:47 +02:00
class PushObject : public Entity
2023-10-24 20:27:18 +02:00
{
private:
EntityPtr owner;
float attack_finished;
int dmg;
str pushsound;
public:
CLASS_PROTOTYPE(PushObject);
PushObject();
void Start(Event *ev);
void SetDamage(Event *ev);
void BlockFunc(Event *ev);
void SetPushSound(Event *ev);
qboolean Push(Entity *pusher, Vector move);
qboolean canPush(Vector dir);
Entity *getOwner(void);
void Archive(Archiver& arc) override;
};
inline void PushObject::Archive(Archiver& arc)
{
Entity::Archive(arc);
arc.ArchiveSafePointer(&owner);
arc.ArchiveFloat(&attack_finished);
arc.ArchiveInteger(&dmg);
arc.ArchiveString(&pushsound);
}
2016-03-27 11:49:47 +02:00
class FallingRock : public Entity
2023-10-24 20:27:18 +02:00
{
private:
int active;
Vector start_origin;
Vector last_bounce_origin;
Entity *current;
Entity *activator;
Vector bounce_dir;
Vector rotateaxis;
float attack_finished;
float wait;
float speed;
int dmg;
str bouncesound;
void Touch(Event *ev);
void Bounce(Event *ev);
void Rotate(Event *ev);
void Activate(Event *ev);
void NextBounce(void);
void StartFalling(Event *ev);
void SetWait(Event *ev);
void SetSpeed(Event *ev);
void SetDmg(Event *ev);
Entity *SetNextBounceDir(void);
void SetBounceSound(str sound);
void SetBounceSound(Event *ev);
void Archive(Archiver &arc) override;
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
public:
CLASS_PROTOTYPE(FallingRock);
FallingRock();
};
inline void FallingRock::Archive(Archiver& arc)
{
Entity::Archive(arc);
arc.ArchiveInteger(&active);
arc.ArchiveVector(&start_origin);
arc.ArchiveVector(&last_bounce_origin);
arc.ArchiveObjectPointer((Class **)&current);
arc.ArchiveObjectPointer((Class **)&activator);
arc.ArchiveVector(&bounce_dir);
arc.ArchiveVector(&rotateaxis);
arc.ArchiveFloat(&attack_finished);
arc.ArchiveFloat(&wait);
arc.ArchiveFloat(&speed);
arc.ArchiveInteger(&dmg);
arc.ArchiveString(&bouncesound);
if (arc.Loading()) {
SetBounceSound(bouncesound);
}
}
2016-03-27 11:49:47 +02:00
class SupplyWater : public Trigger
2023-10-24 20:27:18 +02:00
{
private:
int maxwater;
int amount;
public:
CLASS_PROTOTYPE(SupplyWater);
SupplyWater();
void Activate(Event *ev);
void MaxWater(Event *ev);
void ChargeOff(Event *ev);
void Archive(Archiver& arc) override;
};
inline void SupplyWater::Archive(Archiver& arc)
{
Trigger::Archive(arc);
arc.ArchiveInteger(&amount);
arc.ArchiveInteger(&maxwater);
}
class FuncLadder : public Entity
{
2016-03-27 11:49:47 +02:00
private:
2023-10-24 20:27:18 +02:00
Vector m_vFacingAngles;
Vector m_vFacingDir;
2016-03-27 11:49:47 +02:00
public:
2023-10-24 20:27:18 +02:00
CLASS_PROTOTYPE(FuncLadder);
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
FuncLadder();
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
void LadderSetup(Event *ev);
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
qboolean CanUseLadder(Entity *pUser);
void PositionOnLadder(Entity *pUser);
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
void SetLadderFacing(Event *ev);
void AdjustPositionOnLadder(Entity *pUser);
2016-03-27 11:49:47 +02:00
2023-10-24 20:27:18 +02:00
void EnsureOverLadder(Entity *pUser);
void EnsureForwardOffLadder(Entity *pUser);
2016-03-27 11:49:47 +02:00
};
2023-11-03 22:10:14 +01:00
class InfoLandmark : public Listener
{
private:
str m_sName;
Vector m_vOrigin;
bool m_bNameSet;
bool m_bOriginSet;
public:
CLASS_PROTOTYPE(InfoLandmark);
InfoLandmark();
void SetLandmarkName(Event *ev);
void SetOrigin(Event *ev);
};