179 lines
6.4 KiB
C++
179 lines
6.4 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//=============================================================================//
|
|
|
|
#ifndef DOORS_H
|
|
#define DOORS_H
|
|
#pragma once
|
|
|
|
#include "entityoutput.h"
|
|
#include "locksounds.h"
|
|
|
|
// Since I'm here, might as well explain how these work. Base.fgd is the file
|
|
// that connects flags to entities. It is full of lines with this number, a
|
|
// label, and a default value. Voila, dynamicly generated checkboxes on the Flags
|
|
// tab of Entity Properties.
|
|
|
|
// doors
|
|
#define SF_DOOR_ROTATE_YAW 0 // yaw by default
|
|
#define SF_DOOR_START_OPEN_OBSOLETE 1
|
|
#define SF_DOOR_ROTATE_BACKWARDS 2
|
|
#define SF_DOOR_NONSOLID_TO_PLAYER 4
|
|
#define SF_DOOR_PASSABLE 8
|
|
#define SF_DOOR_ONEWAY 16
|
|
#define SF_DOOR_NO_AUTO_RETURN 32
|
|
#define SF_DOOR_ROTATE_ROLL 64
|
|
#define SF_DOOR_ROTATE_PITCH 128
|
|
#define SF_DOOR_PUSE 256 // door can be opened by player's use button.
|
|
#define SF_DOOR_NONPCS 512 // NPC can't open
|
|
#define SF_DOOR_PTOUCH 1024 // player touch opens
|
|
#define SF_DOOR_LOCKED 2048 // Door is initially locked
|
|
#define SF_DOOR_SILENT \
|
|
4096 // Door plays no audible sound, and does not alert NPCs when opened
|
|
#define SF_DOOR_USE_CLOSES \
|
|
8192 // Door can be +used to close before its autoreturn delay has expired.
|
|
#define SF_DOOR_SILENT_TO_NPCS 16384 // Does not alert NPC's when opened.
|
|
#define SF_DOOR_IGNORE_USE 32768 // Completely ignores player +use commands.
|
|
#define SF_DOOR_NEW_USE_RULES \
|
|
65536 // For func_door entities, behave more like prop_door_rotating with
|
|
// respect to +USE (changelist 242482)
|
|
|
|
enum FuncDoorSpawnPos_t {
|
|
FUNC_DOOR_SPAWN_CLOSED = 0,
|
|
FUNC_DOOR_SPAWN_OPEN,
|
|
};
|
|
|
|
class CBaseDoor : public CBaseToggle {
|
|
public:
|
|
DECLARE_CLASS(CBaseDoor, CBaseToggle);
|
|
|
|
DECLARE_SERVERCLASS();
|
|
|
|
void Spawn(void);
|
|
void Precache(void);
|
|
bool CreateVPhysics();
|
|
bool KeyValue(const char *szKeyName, const char *szValue);
|
|
virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller,
|
|
USE_TYPE useType, float value);
|
|
|
|
virtual void StartBlocked(CBaseEntity *pOther);
|
|
virtual void Blocked(CBaseEntity *pOther);
|
|
virtual void EndBlocked(void);
|
|
|
|
void Activate(void);
|
|
|
|
virtual int ObjectCaps(void) {
|
|
int flags = BaseClass::ObjectCaps();
|
|
if (HasSpawnFlags(SF_DOOR_PUSE))
|
|
return flags | FCAP_IMPULSE_USE | FCAP_USE_IN_RADIUS;
|
|
|
|
return flags;
|
|
};
|
|
|
|
DECLARE_DATADESC();
|
|
|
|
// This is ONLY used by the node graph to test movement through a door
|
|
void InputSetToggleState(inputdata_t &inputdata);
|
|
virtual void SetToggleState(int state);
|
|
|
|
virtual bool IsRotatingDoor() { return false; }
|
|
virtual bool ShouldSavePhysics();
|
|
// used to selectivly override defaults
|
|
void DoorTouch(CBaseEntity *pOther);
|
|
|
|
// local functions
|
|
int DoorActivate();
|
|
void DoorGoUp(void);
|
|
void DoorGoDown(void);
|
|
void DoorHitTop(void);
|
|
void DoorHitBottom(void);
|
|
void UpdateAreaPortals(bool isOpen);
|
|
void Unlock(void);
|
|
void Lock(void);
|
|
int GetDoorMovementGroup(CBaseDoor *pDoorList[], int listMax);
|
|
|
|
// Input handlers
|
|
void InputClose(inputdata_t &inputdata);
|
|
void InputLock(inputdata_t &inputdata);
|
|
void InputOpen(inputdata_t &inputdata);
|
|
void InputToggle(inputdata_t &inputdata);
|
|
void InputUnlock(inputdata_t &inputdata);
|
|
void InputSetSpeed(inputdata_t &inputdata);
|
|
|
|
Vector m_vecMoveDir; // The direction of motion for linear moving doors.
|
|
|
|
locksound_t m_ls; // door lock sounds
|
|
|
|
byte m_bLockedSentence;
|
|
byte m_bUnlockedSentence;
|
|
|
|
bool m_bForceClosed; // If set, always close, even if we're blocked.
|
|
bool m_bDoorGroup;
|
|
bool m_bLocked; // Whether the door is locked
|
|
bool m_bIgnoreDebris;
|
|
bool m_bIgnoreNonPlayerEntsOnBlock; // Non-player entities should never
|
|
// block. This variable needs more
|
|
// letters.
|
|
|
|
FuncDoorSpawnPos_t m_eSpawnPosition;
|
|
|
|
float m_flBlockDamage; // Damage inflicted when blocked.
|
|
string_t m_NoiseMoving; // Start/Looping sound
|
|
string_t m_NoiseArrived; // End sound
|
|
string_t m_NoiseMovingClosed; // Start/Looping sound
|
|
string_t m_NoiseArrivedClosed; // End sound
|
|
string_t m_ChainTarget; ///< Entity name to pass Touch and Use events to
|
|
|
|
CNetworkVar(float, m_flWaveHeight);
|
|
|
|
// Outputs
|
|
COutputEvent m_OnBlockedClosing; // Triggered when the door becomes blocked
|
|
// while closing.
|
|
COutputEvent m_OnBlockedOpening; // Triggered when the door becomes blocked
|
|
// while opening.
|
|
COutputEvent m_OnUnblockedClosing; // Triggered when the door becomes
|
|
// unblocked while closing.
|
|
COutputEvent m_OnUnblockedOpening; // Triggered when the door becomes
|
|
// unblocked while opening.
|
|
COutputEvent m_OnFullyClosed; // Triggered when the door reaches the fully
|
|
// closed position.
|
|
COutputEvent m_OnFullyOpen; // Triggered when the door reaches the fully
|
|
// open position.
|
|
COutputEvent m_OnClose; // Triggered when the door is told to close.
|
|
COutputEvent m_OnOpen; // Triggered when the door is told to open.
|
|
COutputEvent
|
|
m_OnLockedUse; // Triggered when the user tries to open a locked door.
|
|
|
|
void StartMovingSound(void);
|
|
virtual void StopMovingSound(void);
|
|
void MovingSoundThink(void);
|
|
#ifdef HL1_DLL
|
|
bool PassesBlockTouchFilter(CBaseEntity *pOther);
|
|
string_t m_iBlockFilterName;
|
|
EHANDLE m_hBlockFilter;
|
|
#endif
|
|
|
|
bool ShouldLoopMoveSound(void) { return m_bLoopMoveSound; }
|
|
bool m_bLoopMoveSound; // Move sound loops until stopped
|
|
|
|
virtual bool ShouldBlockNav() const OVERRIDE { return false; }
|
|
|
|
private:
|
|
void ChainUse(void); ///< Chains +use on through to m_ChainTarget
|
|
void ChainTouch(
|
|
CBaseEntity *pOther); ///< Chains touch on through to m_ChainTarget
|
|
void SetChaining(bool chaining) {
|
|
m_isChaining = chaining;
|
|
} ///< Latch to prevent recursion
|
|
bool m_isChaining;
|
|
|
|
void CloseAreaPortalsThink(
|
|
void); ///< Delays turning off area portals when closing doors to
|
|
///< prevent visual artifacts
|
|
};
|
|
|
|
#endif // DOORS_H
|