#ifndef GAME_SERVER_GAMECONTEXT_H #define GAME_SERVER_GAMECONTEXT_H #include #include #include #include #include "eventhandler.h" #include "gamecontroller.h" #include "gameworld.h" #include "player.h" #include "score.h" #include #include /* Tick Game Context (CGameContext::tick) Game World (GAMEWORLD::tick) Reset world if requested (GAMEWORLD::reset) All entities in the world (ENTITY::tick) All entities in the world (ENTITY::tick_defered) Remove entities marked for deletion (GAMEWORLD::remove_entities) Game Controller (GAMECONTROLLER::tick) All players (CPlayer::tick) Snap Game Context (CGameContext::snap) Game World (GAMEWORLD::snap) All entities in the world (ENTITY::snap) Game Controller (GAMECONTROLLER::snap) Events handler (EVENT_HANDLER::snap) All players (CPlayer::snap) */ class CGameContext : public IGameServer { IServer *m_pServer; class IConsole *m_pConsole; CLayers m_Layers; CCollision m_Collision; CNetObjHandler m_NetObjHandler; CTuningParams m_Tuning; class IScore *m_pScore; static void ConMute(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConSetlvl(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConKillPlayer(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConNinjaMe(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConNinja(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConHammerMe(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConHammer(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConUnSuperMe(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConUnSuper(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConSuper(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConSuperMe(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConShotgun(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConShotgunMe(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConGrenade(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConGrenadeMe(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConRifle(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConRifleMe(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConLaser(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConLaserMe(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConWeapons(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConWeaponsMe(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConTeleport(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConTuneParam(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConTuneReset(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConTuneDump(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConPhook(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConFreeze(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConUnFreeze(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConTimerStop(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConTimerStart(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConTimerReStart(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConTimerZero(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConChangeMap(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConRestart(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConBroadcast(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConSay(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConSetTeam(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConGoLeft(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConGoRight(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConGoUp(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConGoDown(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConAddVote(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConVote(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConchainSpecialMotdupdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); static void ConInvisMe(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConVisMe(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConInvis(IConsole::IResult *pResult, void *pUserData, int ClientId); static void ConVis(IConsole::IResult *pResult, void *pUserData, int ClientId); CGameContext(int Resetting); void Construct(int Resetting); bool m_Resetting; public: IServer *Server() const { return m_pServer; } class IConsole *Console() { return m_pConsole; } CCollision *Collision() { return &m_Collision; } CLayers *Layers() { return &m_Layers; } CTuningParams *Tuning() { return &m_Tuning; } class IScore *Score() { return m_pScore; } CGameContext(); ~CGameContext(); void Clear(); CEventHandler m_Events; CPlayer *m_apPlayers[MAX_CLIENTS]; IGameController *m_pController; CGameWorld m_World; CTeleTile *m_pSwitch; // helper functions class CCharacter *GetPlayerChar(int ClientId); // voting void StartVote(const char *pDesc, const char *pCommand); void EndVote(); void SendVoteSet(int ClientId); void SendVoteStatus(int ClientId, int Total, int Yes, int No); void AbortVoteKickOnDisconnect(int ClientId); bool CheatsAvailable(int ClientId); bool m_VoteKick; int m_VoteCreator; int64 m_VoteCloseTime; bool m_VoteUpdate; int m_VotePos; char m_aVoteDescription[512]; char m_aVoteCommand[512]; int m_VoteEnforce; enum { VOTE_ENFORCE_UNKNOWN=0, VOTE_ENFORCE_NO, VOTE_ENFORCE_YES, }; struct CVoteOption { CVoteOption *m_pNext; CVoteOption *m_pPrev; char m_aCommand[1]; }; CHeap *m_pVoteOptionHeap; CVoteOption *m_pVoteOptionFirst; CVoteOption *m_pVoteOptionLast; // helper functions void CreateDamageInd(vec2 Pos, float AngleMod, int Amount, int Mask=-1); void CreateExplosion(vec2 Pos, int Owner, int Weapon, bool NoDamage, int Mask=-1); void CreateSmoke(vec2 Pos, int Mask=-1); void CreateHammerHit(vec2 Pos, int Mask=-1); void CreatePlayerSpawn(vec2 Pos, int Mask=-1); void CreateDeath(vec2 Pos, int Who, int Mask=-1); void CreateSound(vec2 Pos, int Sound, int Mask=-1); void CreateSoundGlobal(int Sound, int Target=-1); enum { CHAT_ALL=-2, CHAT_SPEC=-1, CHAT_RED=0, CHAT_BLUE=1 }; // network void SendChatTarget(int To, const char *pText); void SendChat(int ClientId, int Team, const char *pText); void SendEmoticon(int ClientId, int Emoticon); void SendWeaponPickup(int ClientId, int Weapon); void SendBroadcast(const char *pText, int ClientId); // void CheckPureTuning(); void SendTuningParams(int ClientId); // engine events virtual void OnInit(); virtual void OnConsoleInit(); virtual void OnShutdown(); virtual void OnTick(); virtual void OnPreSnap(); virtual void OnSnap(int ClientId); virtual void OnPostSnap(); virtual void OnMessage(int MsgId, CUnpacker *pUnpacker, int ClientId); virtual void OnClientConnected(int ClientId); virtual void OnClientEnter(int ClientId); virtual void OnClientDrop(int ClientId); virtual void OnClientDirectInput(int ClientId, void *pInput); virtual void OnClientPredictedInput(int ClientId, void *pInput); virtual void OnSetAuthed(int ClientId,int Level); virtual void OnSetResistent(int ClientId, int Resistent); virtual const char *Version(); virtual const char *NetVersion(); }; inline int CmaskAll() { return -1; } inline int CmaskOne(int ClientId) { return 1<