You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
6.4 KiB
166 lines
6.4 KiB
//========= 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
|
|
|