311 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			311 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| //-----------------------------------------------------------------------------
 | |
| // Torque Game Engine
 | |
| // Copyright (C) GarageGames.com, Inc.
 | |
| //-----------------------------------------------------------------------------
 | |
| 
 | |
| #ifndef _GAMECONNECTION_H_
 | |
| #define _GAMECONNECTION_H_
 | |
| 
 | |
| #ifndef _SIMBASE_H_
 | |
| #include "console/simBase.h"
 | |
| #endif
 | |
| #ifndef _SHAPEBASE_H_
 | |
| #include "game/shapeBase.h"
 | |
| #endif
 | |
| #ifndef _NETCONNECTION_H_
 | |
| #include "sim/netConnection.h"
 | |
| #endif
 | |
| #ifndef _MOVEMANAGER_H_
 | |
| #include "game/moveManager.h"
 | |
| #endif
 | |
| #ifndef _BITVECTOR_H_
 | |
| #include "core/bitVector.h"
 | |
| #endif
 | |
| 
 | |
| enum GameConnectionConstants
 | |
| {
 | |
|    MaxClients = 126,
 | |
|    DataBlockQueueCount = 16
 | |
| };
 | |
| 
 | |
| class AudioProfile;
 | |
| class MatrixF;
 | |
| class MatrixF;
 | |
| class Point3F;
 | |
| class MoveManager;
 | |
| struct Move;
 | |
| struct AuthInfo;
 | |
| 
 | |
| #define GameString "Torque Game Engine Demo"
 | |
| 
 | |
| class GameConnection : public NetConnection
 | |
| {
 | |
| private:
 | |
|    typedef NetConnection Parent;
 | |
| 
 | |
|    enum PrivateConstants {
 | |
|       MoveCountBits = 5,
 | |
|       /// MaxMoveCount should not exceed the MoveManager's
 | |
|       /// own maximum (MaxMoveQueueSize)
 | |
|       MaxMoveCount = 30,
 | |
|    };
 | |
|    typedef Vector<Move> MoveList;
 | |
| 
 | |
|    SimObjectPtr<ShapeBase> mControlObject;
 | |
|    SimObjectPtr<ShapeBase> mCameraObject;
 | |
|    U32 mDataBlockSequence;
 | |
|    char mDisconnectReason[256];
 | |
| 
 | |
|    U32  mMissionCRC;             // crc of the current mission file from the server
 | |
| 
 | |
| private:
 | |
|    U32 mLastControlRequestTime;
 | |
|    S32 mDataBlockModifiedKey;
 | |
|    S32 mMaxDataBlockModifiedKey;
 | |
| 
 | |
|    /// @name Client side first/third person
 | |
|    /// @{
 | |
| 
 | |
|    ///
 | |
|    bool  mFirstPerson;     ///< Are we currently first person or not.
 | |
|    bool  mUpdateFirstPerson; ///< Set to notify client or server of first person change.
 | |
|    bool  mUpdateCameraFov; ///< Set to notify server of camera FOV change.
 | |
|    F32   mCameraFov;       ///< Current camera fov (in degrees).
 | |
|    F32   mCameraPos;       ///< Current camera pos (0-1).
 | |
|    F32   mCameraSpeed;     ///< Camera in/out speed.
 | |
|    /// @}
 | |
| 
 | |
|    /// @name Move Packets
 | |
|    /// Write/read move data to the packet.
 | |
|    /// @{
 | |
| 
 | |
|    ///
 | |
|    void moveWritePacket(BitStream *bstream);
 | |
|    void moveReadPacket(BitStream *bstream);
 | |
|    /// @}
 | |
| public:
 | |
| 
 | |
|    /// @name Protocol Versions
 | |
|    ///
 | |
|    /// Protocol versions are used to indicated changes in network traffic.
 | |
|    /// These could be changes in how any object transmits or processes
 | |
|    /// network information. You can specify backwards compatibility by
 | |
|    /// specifying a MinRequireProtocolVersion.  If the client
 | |
|    /// protocol is >= this min value, the connection is accepted.
 | |
|    ///
 | |
|    /// Torque (V12) SDK 1.0 uses protocol  =  1
 | |
|    ///
 | |
|    /// Torque SDK 1.1 uses protocol = 2
 | |
|    /// Torque SDK 1.4 uses protocol = 12
 | |
|    /// @{
 | |
|    static const U32 CurrentProtocolVersion;
 | |
|    static const U32 MinRequiredProtocolVersion;
 | |
|    /// @}
 | |
| 
 | |
|    /// Configuration
 | |
|    enum Constants {
 | |
|       BlockTypeMove = NetConnectionBlockTypeCount,
 | |
|       GameConnectionBlockTypeCount,
 | |
|       MaxConnectArgs = 16,
 | |
|       DataBlocksDone = NumConnectionMessages,
 | |
|       DataBlocksDownloadDone,
 | |
|    };
 | |
| 
 | |
|    /// Set connection arguments; these are passed to the server when we connect.
 | |
|    void setConnectArgs(U32 argc, const char **argv);
 | |
| 
 | |
|    /// Set the server password to use when we join.
 | |
|    void setJoinPassword(const char *password);
 | |
| 
 | |
|    /// @name Event Handling
 | |
|    /// @{
 | |
| 
 | |
|    virtual void onTimedOut();
 | |
|    virtual void onConnectTimedOut();
 | |
|    virtual void onDisconnect(const char *reason);
 | |
|    virtual void onConnectionRejected(const char *reason);
 | |
|    virtual void onConnectionEstablished(bool isInitiator);
 | |
|    virtual void handleStartupError(const char *errorString);
 | |
|    /// @}
 | |
| 
 | |
|    /// @name Packet I/O
 | |
|    /// @{
 | |
| 
 | |
|    virtual void writeConnectRequest(BitStream *stream);
 | |
|    virtual bool readConnectRequest(BitStream *stream, const char **errorString);
 | |
|    virtual void writeConnectAccept(BitStream *stream);
 | |
|    virtual bool readConnectAccept(BitStream *stream, const char **errorString);
 | |
|    /// @}
 | |
| 
 | |
|    bool canRemoteCreate();
 | |
| 
 | |
| private:
 | |
|    /// @name Connection State
 | |
|    /// This data is set with setConnectArgs() and setJoinPassword(), and
 | |
|    /// sent across the wire when we connect.
 | |
|    /// @{
 | |
| 
 | |
|    U32      mConnectArgc;
 | |
|    char *mConnectArgv[MaxConnectArgs];
 | |
|    char *mJoinPassword;
 | |
|    /// @}
 | |
| 
 | |
| protected:
 | |
|    struct GamePacketNotify : public NetConnection::PacketNotify
 | |
|    {
 | |
|       S32 cameraFov;
 | |
|       GamePacketNotify();
 | |
|    };
 | |
|    PacketNotify *allocNotify();
 | |
| 
 | |
|    U32 mLastMoveAck;
 | |
|    U32 mLastClientMove;
 | |
|    U32 mFirstMoveIndex;
 | |
|    U32 mMoveCredit;
 | |
|    U32 mLastControlObjectChecksum;
 | |
| 
 | |
|    Vector<SimDataBlock *> mDataBlockLoadList;
 | |
| 
 | |
|    MoveList    mMoveList;
 | |
|    bool        mAIControlled;
 | |
|    AuthInfo *  mAuthInfo;
 | |
| 
 | |
|    static S32  mLagThresholdMS;
 | |
|    S32         mLastPacketTime;
 | |
|    bool        mLagging;
 | |
| 
 | |
|    /// @name Flashing
 | |
|    ////
 | |
|    /// Note, these variables are not networked, they are for the local connection only.
 | |
|    /// @{
 | |
|    F32 mDamageFlash;
 | |
|    F32 mWhiteOut;
 | |
| 
 | |
|    F32   mBlackOut;
 | |
|    S32   mBlackOutTimeMS;
 | |
|    S32   mBlackOutStartTimeMS;
 | |
|    bool  mFadeToBlack;
 | |
| 
 | |
|    /// @}
 | |
| 
 | |
|    /// @name Packet I/O
 | |
|    /// @{
 | |
| 
 | |
|    void readPacket      (BitStream *bstream);
 | |
|    void writePacket     (BitStream *bstream, PacketNotify *note);
 | |
|    void packetReceived  (PacketNotify *note);
 | |
|    void packetDropped   (PacketNotify *note);
 | |
|    void connectionError (const char *errorString);
 | |
| 
 | |
|    void writeDemoStartBlock   (ResizeBitStream *stream);
 | |
|    bool readDemoStartBlock    (BitStream *stream);
 | |
|    void handleRecordedBlock   (U32 type, U32 size, void *data);
 | |
|    /// @}
 | |
| 
 | |
| public:
 | |
| 
 | |
|    DECLARE_CONOBJECT(GameConnection);
 | |
|    void handleConnectionMessage(U32 message, U32 sequence, U32 ghostCount);
 | |
|    void preloadDataBlock(SimDataBlock *block);
 | |
|    void fileDownloadSegmentComplete();
 | |
|    void preloadNextDataBlock(bool hadNew);
 | |
|    static void consoleInit();
 | |
| 
 | |
|    void setDisconnectReason(const char *reason);
 | |
|    GameConnection();
 | |
|    ~GameConnection();
 | |
| 
 | |
|    U32 getDataBlockSequence() { return mDataBlockSequence; }
 | |
|    void setDataBlockSequence(U32 seq) { mDataBlockSequence = seq; }
 | |
| 
 | |
|    bool onAdd();
 | |
|    void onRemove();
 | |
| 
 | |
|    static GameConnection *getConnectionToServer() { return dynamic_cast<GameConnection*>((NetConnection *) mServerConnection); }
 | |
|    static GameConnection *getLocalClientConnection() { return dynamic_cast<GameConnection*>((NetConnection *) mLocalClientConnection); }
 | |
| 
 | |
|    /// @name Control object
 | |
|    /// @{
 | |
| 
 | |
|    ///
 | |
|    void setControlObject(ShapeBase *co);
 | |
|    ShapeBase* getControlObject()  { return  mControlObject; }
 | |
|    void setCameraObject(ShapeBase *co);
 | |
|    ShapeBase* getCameraObject();
 | |
|    bool getControlCameraTransform(F32 dt,MatrixF* mat);
 | |
|    bool getControlCameraVelocity(Point3F *vel);
 | |
| 
 | |
|    bool getControlCameraFov(F32 * fov);
 | |
|    bool setControlCameraFov(F32 fov);
 | |
|    bool isValidControlCameraFov(F32 fov);
 | |
|    
 | |
|    void setFirstPerson(bool firstPerson);
 | |
|    
 | |
|    /// @}
 | |
| 
 | |
|    void detectLag();
 | |
| 
 | |
|    /// @name Datablock management
 | |
|    /// @{
 | |
| 
 | |
|    S32  getDataBlockModifiedKey     ()  { return mDataBlockModifiedKey; }
 | |
|    void setDataBlockModifiedKey     (S32 key)  { mDataBlockModifiedKey = key; }
 | |
|    S32  getMaxDataBlockModifiedKey  ()  { return mMaxDataBlockModifiedKey; }
 | |
|    void setMaxDataBlockModifiedKey  (S32 key)  { mMaxDataBlockModifiedKey = key; }
 | |
|    /// @}
 | |
| 
 | |
|    /// @name Fade control
 | |
|    /// @{
 | |
| 
 | |
|    F32 getDamageFlash() { return mDamageFlash; }
 | |
|    F32 getWhiteOut() { return mWhiteOut; }
 | |
| 
 | |
|    void setBlackOut(bool fadeToBlack, S32 timeMS);
 | |
|    F32  getBlackOut();
 | |
|    /// @}
 | |
| 
 | |
|    /// @name Move Management
 | |
|    /// @{
 | |
| 
 | |
|    void           pushMove(const Move &mv);
 | |
|    bool           getNextMove(Move &curMove);
 | |
|    bool           isBacklogged();
 | |
|    virtual void   getMoveList(Move**,U32* numMoves);
 | |
|    virtual void   clearMoves(U32 count);
 | |
|    void           collectMove(U32 simTime);
 | |
|    virtual bool   areMovesPending();
 | |
|    void           incMoveCredit(U32 count);
 | |
|    /// @}
 | |
| 
 | |
|    /// @name Authentication
 | |
|    ///
 | |
|    /// This is remnant code from Tribes 2.
 | |
|    /// @{
 | |
| 
 | |
|    void            setAuthInfo(const AuthInfo *info);
 | |
|    const AuthInfo *getAuthInfo();
 | |
|    /// @}
 | |
| 
 | |
|    /// @name Sound
 | |
|    /// @{
 | |
| 
 | |
|    void play2D(const AudioProfile *profile);
 | |
|    void play3D(const AudioProfile *profile, const MatrixF *transform);
 | |
|    /// @}
 | |
| 
 | |
|    /// @name Misc.
 | |
|    /// @{
 | |
| 
 | |
|    bool isFirstPerson()  { return mCameraPos == 0; }
 | |
|    bool isAIControlled() { return mAIControlled; }
 | |
| 
 | |
|    void doneScopingScene();
 | |
|    void demoPlaybackComplete();
 | |
| 
 | |
|    void setMissionCRC(U32 crc)           { mMissionCRC = crc; }
 | |
|    U32  getMissionCRC()           { return(mMissionCRC); }
 | |
|    /// @}
 | |
| };
 | |
| 
 | |
| #endif
 | 
