diff options
Diffstat (limited to 'mp/src/game/shared/env_meteor_shared.h')
| -rw-r--r-- | mp/src/game/shared/env_meteor_shared.h | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/mp/src/game/shared/env_meteor_shared.h b/mp/src/game/shared/env_meteor_shared.h new file mode 100644 index 00000000..bbe24653 --- /dev/null +++ b/mp/src/game/shared/env_meteor_shared.h @@ -0,0 +1,202 @@ +//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#ifndef ENV_METEOR_SHARED_H
+#define ENV_METEOR_SHARED_H
+#pragma once
+
+#include "vstdlib/random.h"
+#include "mathlib/vector.h"
+#include "utlvector.h"
+
+//=============================================================================
+//
+// Shared Meteor Class
+//
+#define METEOR_INVALID_TIME -9999.9f
+#define METEOR_PASSIVE_TIME 0.0f
+#define METEOR_MAX_LIFETIME 60.0f
+#define METEOR_MIN_SIZE Vector( -100, -100, -100 )
+#define METEOR_MAX_SIZE Vector( 100, 100, 100 )
+
+#define METEOR_LOCATION_INVALID -1
+#define METEOR_LOCATION_WORLD 0
+#define METEOR_LOCATION_SKYBOX 1
+
+class CEnvMeteorShared
+{
+public:
+
+ //-------------------------------------------------------------------------
+ // Initialization.
+ //-------------------------------------------------------------------------
+ CEnvMeteorShared();
+ void Init( int nID, float flStartTime, float flPassiveTime,
+ const Vector &vecStartPosition,
+ const Vector &vecDirection, float flSpeed, float flDamageRadius,
+ const Vector &vecTriggerMins, const Vector &vecTriggerMaxs );
+
+ //-------------------------------------------------------------------------
+ // Returns the position of the object at a given time.
+ //-------------------------------------------------------------------------
+ void GetPositionAtTime( float flTime, Vector &vecPosition );
+
+ //-------------------------------------------------------------------------
+ // Changes an objects paramters from "skybox space" to "world space."
+ //-------------------------------------------------------------------------
+ void ConvertFromSkyboxToWorld( void );
+
+ //-------------------------------------------------------------------------
+ // Changes an objects paramters from "world space" to "skybox space."
+ //-------------------------------------------------------------------------
+ void ConvertFromWorldToSkybox( void );
+
+ //-------------------------------------------------------------------------
+ // Returns whether or not the object is the the skybox given the time.
+ //-------------------------------------------------------------------------
+ bool IsInSkybox( float flTime );
+
+ //-------------------------------------------------------------------------
+ // Returns whether or not the object is moving in the skybox (or passive).
+ //-------------------------------------------------------------------------
+ bool IsPassive( float flTime );
+
+ //-------------------------------------------------------------------------
+ // Returns whether or not the object will ever transition from skybox to world.
+ //-------------------------------------------------------------------------
+ bool WillTransition( void );
+
+ //-------------------------------------------------------------------------
+ // Returns the splash damage radius of the object.
+ //-------------------------------------------------------------------------
+ float GetDamageRadius( void );
+
+public:
+
+ int m_nID; // unique identifier
+
+ // The objects initial parametric conditions.
+ Vector m_vecStartPosition;
+ Vector m_vecDirection;
+ float m_flSpeed; // (units/sec), unit = 1 inch
+ float m_flStartTime;
+
+ // NOTE: All times are absolute - ie m_flStartTime has been added in.
+
+ // The time after the starting time in which it object starts to "move."
+ float m_flPassiveTime;
+
+ // The enter and exit times define the times at which the object enters and
+ // exits the world. In other words, m_flEnterTime is the time at which the
+ // object leaves the skybox and enters the world. m_flExitTime is the opposite.
+ float m_flWorldEnterTime;
+ float m_flWorldExitTime;
+
+ float m_flPosTime; // Timer used to find the position of the meteor.
+ Vector m_vecPos;
+
+ //
+ int m_nLocation; // 0 = Skybox, 1 = World
+
+ float m_flDamageRadius; //
+
+private:
+
+ // Calculate the enter/exit times. (called from Init)
+ void CalcEnterAndExitTimes( const Vector &vecTriggerMins, const Vector &vecTriggerMaxs );
+};
+
+//=============================================================================
+//
+// Meteor Factory Interface
+//
+abstract_class IMeteorFactory
+{
+public:
+
+ virtual void CreateMeteor( int nID, int iType,
+ const Vector &vecPosition, const Vector &vecDirection,
+ float flSpeed, float flStartTime, float flDamageRadius,
+ const Vector &vecTriggerMins, const Vector &vecTriggerMaxs ) = 0;
+};
+
+//=============================================================================
+//
+// Shared Meteor Spawner Class
+//
+class CEnvMeteorSpawnerShared
+{
+public:
+ DECLARE_CLASS_NOBASE( CEnvMeteorSpawnerShared );
+ DECLARE_EMBEDDED_NETWORKVAR();
+
+ //-------------------------------------------------------------------------
+ // Initialization.
+ //-------------------------------------------------------------------------
+ CEnvMeteorSpawnerShared();
+ void Init( IMeteorFactory *pFactory, int nRandomSeed, float flTime,
+ const Vector &vecMinBounds, const Vector &vecMaxBounds,
+ const Vector &vecTriggerMins, const Vector &vecTriggerMaxs );
+
+ //-------------------------------------------------------------------------
+ // Method to generate meteors.
+ // Time passed in here is global time, not delta time.
+ // The function returns the time at which it must be called again.
+ //-------------------------------------------------------------------------
+ float MeteorThink( float flTime );
+
+ //-------------------------------------------------------------------------
+ // Add meteor target data, used to determine meteor travel direction.
+ //-------------------------------------------------------------------------
+ void AddToTargetList( const Vector &vecPosition, float flRadius );
+
+ // Debugging!
+ int GetRandomInt( int nMin, int nMax );
+ float GetRandomFloat( float flMin, float flMax );
+
+public:
+
+ // Factory.
+ IMeteorFactory *m_pFactory; // Meteor creation factory.
+
+ int m_nMeteorCount; // Number of meteors created - used as IDs
+
+ // Initial spawner data.
+ CNetworkVar( float, m_flStartTime ); // Start time.
+ CNetworkVar( int, m_nRandomSeed ); // The random number stream seed.
+
+ CNetworkVar( int, m_iMeteorType ); // Type of meteor.
+ float m_flMeteorDamageRadius; // Meteor damage radius.
+ CNetworkVar( bool, m_bSkybox ); // Is the spawner in the skybox?
+
+ CNetworkVar( float, m_flMinSpawnTime ); // Spawn time - Min
+ CNetworkVar( float, m_flMaxSpawnTime ); // Max
+ CNetworkVar( int, m_nMinSpawnCount ); // Number of meteors to spawn - Min
+ CNetworkVar( int, m_nMaxSpawnCount ); // Max
+ CNetworkVector( m_vecMinBounds ); // Spawner volume (space) - Min
+ CNetworkVector( m_vecMaxBounds ); // Max
+ CNetworkVar( float, m_flMinSpeed ); // Meteor speed - Min
+ CNetworkVar( float, m_flMaxSpeed ); // Max
+ CNetworkVector( m_vecTriggerMins ); // World Bounds (Trigger) in 3D Skybox - Min
+ CNetworkVector( m_vecTriggerMaxs ); // Max
+ Vector m_vecTriggerCenter;
+
+ // Generated data.
+ int m_nRandomCallCount; // Debug! Keep track of number steam calls.
+ float m_flNextSpawnTime; // Next meteor spawn time (random).
+ CUniformRandomStream m_NumberStream; // Used to generate random numbers.
+
+ // Use "Targets" to determine meteor direction(s).
+ struct meteortarget_t
+ {
+ Vector m_vecPosition;
+ float m_flRadius;
+ };
+ CUtlVector<meteortarget_t> m_aTargets;
+};
+
+#endif // ENV_METEOR_SHARED_H
|