source-engine/game/server/portal/prop_portal.h
2022-04-16 12:05:19 +03:00

167 lines
6.4 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//===========================================================================//
#ifndef PROP_PORTAL_H
#define PROP_PORTAL_H
#ifdef _WIN32
#pragma once
#endif
#include "baseanimating.h"
#include "PortalSimulation.h"
// FIX ME
#include "portal_shareddefs.h"
static const char *s_pDelayedPlacementContext = "DelayedPlacementContext";
static const char *s_pTestRestingSurfaceContext = "TestRestingSurfaceContext";
static const char *s_pFizzleThink = "FizzleThink";
class CPhysicsCloneArea;
class CProp_Portal : public CBaseAnimating, public CPortalSimulatorEventCallbacks
{
public:
DECLARE_CLASS( CProp_Portal, CBaseAnimating );
DECLARE_SERVERCLASS();
DECLARE_DATADESC();
CProp_Portal( void );
virtual ~CProp_Portal( void );
CNetworkHandle( CProp_Portal, m_hLinkedPortal ); //the portal this portal is linked to
VMatrix m_matrixThisToLinked; //the matrix that will transform a point relative to this portal, to a point relative to the linked portal
CNetworkVar( bool, m_bActivated ); //a portal can exist and not be active
CNetworkVar( bool, m_bIsPortal2 ); //For teleportation, this doesn't matter, but for drawing and moving, it matters
Vector m_vPrevForward; //used for the indecisive push in find closest passable spaces when portal is moved
bool m_bSharedEnvironmentConfiguration; //this will be set by an instance of CPortal_Environment when two environments are in close proximity
EHANDLE m_hMicrophone; //the microphone for teleporting sound
EHANDLE m_hSpeaker; //the speaker for teleported sound
CSoundPatch *m_pAmbientSound;
Vector m_vAudioOrigin;
Vector m_vDelayedPosition;
QAngle m_qDelayedAngles;
int m_iDelayedFailure;
EHANDLE m_hPlacedBy;
COutputEvent m_OnPlacedSuccessfully; // Output in hammer for when this portal was successfully placed (not attempted and fizzed).
cplane_t m_plane_Origin; //a portal plane on the entity origin
CPhysicsCloneArea *m_pAttachedCloningArea;
bool IsPortal2() const;
void SetIsPortal2( bool bIsPortal2 );
const VMatrix& MatrixThisToLinked() const;
virtual int UpdateTransmitState( void ) // set transmit filter to transmit always
{
return SetTransmitState( FL_EDICT_ALWAYS );
}
virtual void Precache( void );
virtual void CreateSounds( void );
virtual void StopLoopingSounds( void );
virtual void Spawn( void );
virtual void Activate( void );
virtual void OnRestore( void );
virtual void UpdateOnRemove( void );
void DelayedPlacementThink( void );
void TestRestingSurfaceThink ( void );
void FizzleThink( void );
bool IsActivedAndLinked( void ) const;
void WakeNearbyEntities( void ); //wakes all nearby entities in-case there's been a significant change in how they can rest near a portal
void ForceEntityToFitInPortalWall( CBaseEntity *pEntity ); //projects an object's center into the middle of the portal wall hall, and traces back to where it wants to be
void PlacePortal( const Vector &vOrigin, const QAngle &qAngles, float fPlacementSuccess, bool bDelay = false );
void NewLocation( const Vector &vOrigin, const QAngle &qAngles );
void ResetModel( void ); //sets the model and bounding box
void DoFizzleEffect( int iEffect, bool bDelayedPos = true ); //display cool visual effect
void Fizzle( void ); //go inactive
void PunchPenetratingPlayer( CBaseEntity *pPlayer ); // adds outward force to player intersecting the portal plane
void PunchAllPenetratingPlayers( void ); // adds outward force to player intersecting the portal plane
virtual void StartTouch( CBaseEntity *pOther );
virtual void Touch( CBaseEntity *pOther );
virtual void EndTouch( CBaseEntity *pOther );
bool ShouldTeleportTouchingEntity( CBaseEntity *pOther ); //assuming the entity is or was just touching the portal, check for teleportation conditions
void TeleportTouchingEntity( CBaseEntity *pOther );
void InputSetActivatedState( inputdata_t &inputdata );
void InputFizzle( inputdata_t &inputdata );
void InputNewLocation( inputdata_t &inputdata );
void UpdatePortalLinkage( void );
void UpdatePortalTeleportMatrix( void ); //computes the transformation from this portal to the linked portal, and will update the remote matrix as well
//void SendInteractionMessage( CBaseEntity *pEntity, bool bEntering ); //informs clients that the entity is interacting with a portal (mostly used for clip planes)
bool SharedEnvironmentCheck( CBaseEntity *pEntity ); //does all testing to verify that the object is better handled with this portal instead of the other
// The four corners of the portal in worldspace, updated on placement. The four points will be coplanar on the portal plane.
Vector m_vPortalCorners[4];
CPortalSimulator m_PortalSimulator;
//virtual bool CreateVPhysics( void );
//virtual void VPhysicsDestroyObject( void );
virtual bool TestCollision( const Ray_t &ray, unsigned int fContentsMask, trace_t& tr );
virtual void PortalSimulator_TookOwnershipOfEntity( CBaseEntity *pEntity );
virtual void PortalSimulator_ReleasedOwnershipOfEntity( CBaseEntity *pEntity );
private:
unsigned char m_iLinkageGroupID; //a group ID specifying which portals this one can possibly link to
CPhysCollide *m_pCollisionShape;
void RemovePortalMicAndSpeaker(); // Cleans up the portal's internal audio members
void UpdateCorners( void ); // Updates the four corners of this portal on spawn and placement
public:
inline unsigned char GetLinkageGroup( void ) const { return m_iLinkageGroupID; };
void ChangeLinkageGroup( unsigned char iLinkageGroupID );
//find a portal with the designated attributes, or creates one with them, favors active portals over inactive
static CProp_Portal *FindPortal( unsigned char iLinkageGroupID, bool bPortal2, bool bCreateIfNothingFound = false );
static const CUtlVector<CProp_Portal *> *GetPortalLinkageGroup( unsigned char iLinkageGroupID );
};
//-----------------------------------------------------------------------------
// inline state querying methods
//-----------------------------------------------------------------------------
inline bool CProp_Portal::IsPortal2() const
{
return m_bIsPortal2;
}
inline void CProp_Portal::SetIsPortal2( bool bIsPortal2 )
{
m_bIsPortal2 = bIsPortal2;
}
inline const VMatrix& CProp_Portal::MatrixThisToLinked() const
{
return m_matrixThisToLinked;
}
#endif //#ifndef PROP_PORTAL_H