diff options
Diffstat (limited to 'game/server/portal/prop_portal.h')
| -rw-r--r-- | game/server/portal/prop_portal.h | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/game/server/portal/prop_portal.h b/game/server/portal/prop_portal.h new file mode 100644 index 0000000..a866e9b --- /dev/null +++ b/game/server/portal/prop_portal.h @@ -0,0 +1,166 @@ +//========= 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 |