//========= 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 *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