2010-05-29 07:25:38 +00:00
|
|
|
#ifndef GAME_SERVER_GAMECONTEXT_H
|
|
|
|
#define GAME_SERVER_GAMECONTEXT_H
|
|
|
|
|
|
|
|
#include <engine/server.h>
|
|
|
|
#include <engine/console.h>
|
|
|
|
#include <engine/shared/memheap.h>
|
|
|
|
|
|
|
|
#include <game/layers.h>
|
|
|
|
|
|
|
|
#include "eventhandler.h"
|
|
|
|
#include "gamecontroller.h"
|
|
|
|
#include "gameworld.h"
|
|
|
|
#include "player.h"
|
2010-08-23 19:37:27 +00:00
|
|
|
#include "score.h"
|
2010-08-27 23:30:50 +00:00
|
|
|
#include <game/server/entities/door.h>
|
|
|
|
#include <game/server/entities/trigger.h>
|
2010-05-29 07:25:38 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
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;
|
2010-08-23 19:37:27 +00:00
|
|
|
class IScore *m_pScore;
|
2010-05-29 07:25:38 +00:00
|
|
|
|
2010-09-16 21:22:00 +00:00
|
|
|
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);
|
2010-07-29 05:21:18 +00:00
|
|
|
|
2010-09-16 21:22:00 +00:00
|
|
|
static void ConNinjaMe(IConsole::IResult *pResult, void *pUserData, int ClientId);
|
|
|
|
static void ConNinja(IConsole::IResult *pResult, void *pUserData, int ClientId);
|
2010-07-29 05:21:18 +00:00
|
|
|
|
2010-09-16 21:22:00 +00:00
|
|
|
static void ConHammerMe(IConsole::IResult *pResult, void *pUserData, int ClientId);
|
|
|
|
static void ConHammer(IConsole::IResult *pResult, void *pUserData, int ClientId);
|
2010-07-29 05:21:18 +00:00
|
|
|
|
2010-09-16 21:22:00 +00:00
|
|
|
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);
|
2010-08-27 07:09:47 +00:00
|
|
|
|
2010-09-16 21:22:00 +00:00
|
|
|
static void ConShotgun(IConsole::IResult *pResult, void *pUserData, int ClientId);
|
|
|
|
static void ConShotgunMe(IConsole::IResult *pResult, void *pUserData, int ClientId);
|
2010-08-28 12:14:36 +00:00
|
|
|
|
2010-09-16 21:22:00 +00:00
|
|
|
static void ConGrenade(IConsole::IResult *pResult, void *pUserData, int ClientId);
|
|
|
|
static void ConGrenadeMe(IConsole::IResult *pResult, void *pUserData, int ClientId);
|
2010-08-28 12:14:36 +00:00
|
|
|
|
2010-09-16 21:22:00 +00:00
|
|
|
static void ConRifle(IConsole::IResult *pResult, void *pUserData, int ClientId);
|
|
|
|
static void ConRifleMe(IConsole::IResult *pResult, void *pUserData, int ClientId);
|
2010-08-28 12:14:36 +00:00
|
|
|
|
2010-09-16 21:22:00 +00:00
|
|
|
static void ConLaser(IConsole::IResult *pResult, void *pUserData, int ClientId);
|
|
|
|
static void ConLaserMe(IConsole::IResult *pResult, void *pUserData, int ClientId);
|
2010-08-28 12:14:36 +00:00
|
|
|
|
2010-09-16 21:22:00 +00:00
|
|
|
static void ConWeapons(IConsole::IResult *pResult, void *pUserData, int ClientId);
|
|
|
|
static void ConWeaponsMe(IConsole::IResult *pResult, void *pUserData, int ClientId);
|
2010-07-29 05:21:18 +00:00
|
|
|
|
2010-09-16 21:22:00 +00:00
|
|
|
static void ConTeleport(IConsole::IResult *pResult, void *pUserData, int ClientId);
|
2010-07-29 05:21:18 +00:00
|
|
|
|
2010-09-16 21:22:00 +00:00
|
|
|
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);
|
2010-07-29 05:21:18 +00:00
|
|
|
|
2010-09-16 21:22:00 +00:00
|
|
|
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);
|
|
|
|
|
2010-09-17 09:34:13 +00:00
|
|
|
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);
|
2010-09-16 21:22:00 +00:00
|
|
|
|
|
|
|
static void ConAddVote(IConsole::IResult *pResult, void *pUserData, int ClientId);
|
|
|
|
static void ConVote(IConsole::IResult *pResult, void *pUserData, int ClientId);
|
2010-05-29 07:25:38 +00:00
|
|
|
static void ConchainSpecialMotdupdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
|
|
|
|
|
2010-09-16 21:22:00 +00:00
|
|
|
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);
|
2010-09-14 16:56:28 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
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; }
|
2010-09-06 11:37:20 +00:00
|
|
|
CLayers *Layers() { return &m_Layers; }
|
2010-05-29 07:25:38 +00:00
|
|
|
CTuningParams *Tuning() { return &m_Tuning; }
|
2010-08-23 19:37:27 +00:00
|
|
|
|
|
|
|
class IScore *Score() { return m_pScore; }
|
2010-05-29 07:25:38 +00:00
|
|
|
|
|
|
|
CGameContext();
|
|
|
|
~CGameContext();
|
|
|
|
|
|
|
|
void Clear();
|
|
|
|
|
|
|
|
CEventHandler m_Events;
|
|
|
|
CPlayer *m_apPlayers[MAX_CLIENTS];
|
|
|
|
|
|
|
|
IGameController *m_pController;
|
|
|
|
CGameWorld m_World;
|
2010-09-06 11:37:20 +00:00
|
|
|
CTeleTile *m_pSwitch;
|
2010-05-29 07:25:38 +00:00
|
|
|
// 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);
|
|
|
|
|
2010-09-16 21:22:00 +00:00
|
|
|
bool CheatsAvailable(int ClientId);
|
2010-07-29 05:21:18 +00:00
|
|
|
|
2010-09-08 16:22:11 +00:00
|
|
|
bool m_VoteKick;
|
2010-05-29 07:25:38 +00:00
|
|
|
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
|
2010-09-08 16:22:11 +00:00
|
|
|
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);
|
2010-05-29 07:25:38 +00:00
|
|
|
void CreateSound(vec2 Pos, int Sound, int Mask=-1);
|
|
|
|
void CreateSoundGlobal(int Sound, int Target=-1);
|
|
|
|
|
2010-09-17 09:34:13 +00:00
|
|
|
bool ClientLeave(int ClientId);
|
|
|
|
bool ClientEnter(int ClientId);
|
|
|
|
struct ReconnectInfo
|
|
|
|
{
|
|
|
|
struct PlayerInfo {
|
|
|
|
CCharacterCore m_Core;
|
|
|
|
int m_StartTime;
|
|
|
|
int m_RaceState;
|
|
|
|
//int m_RefreshTime;
|
|
|
|
int m_FreezeTime;
|
|
|
|
bool m_Doored;
|
|
|
|
vec2 m_OldPos;
|
|
|
|
vec2 m_OlderPos;
|
|
|
|
int m_LastAction;
|
|
|
|
int m_Jumped;
|
|
|
|
int m_Health;
|
|
|
|
int m_Armor;
|
|
|
|
int m_PlayerState;
|
|
|
|
int m_LastMove;
|
|
|
|
vec2 m_PrevPos;
|
|
|
|
int m_ActiveWeapon;
|
|
|
|
int m_LastWeapon;
|
|
|
|
bool m_aHasWeapon[NUM_WEAPONS];
|
|
|
|
int m_HammerType;
|
|
|
|
bool m_Super;
|
|
|
|
int m_PauseTime;
|
|
|
|
} m_PlayerInfo;
|
|
|
|
char Ip[64];
|
|
|
|
int m_ClientId;
|
|
|
|
int m_DisconnectTick;
|
|
|
|
}m_pReconnectInfo[MAX_CLIENTS];
|
2010-05-29 07:25:38 +00:00
|
|
|
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);
|
2010-07-29 05:21:18 +00:00
|
|
|
|
2010-08-07 18:49:57 +00:00
|
|
|
virtual void OnSetAuthed(int ClientId,int Level);
|
|
|
|
virtual void OnSetResistent(int ClientId, int Resistent);
|
2010-05-29 07:25:38 +00:00
|
|
|
|
|
|
|
virtual const char *Version();
|
|
|
|
virtual const char *NetVersion();
|
|
|
|
};
|
|
|
|
|
|
|
|
inline int CmaskAll() { return -1; }
|
|
|
|
inline int CmaskOne(int ClientId) { return 1<<ClientId; }
|
|
|
|
inline int CmaskAllExceptOne(int ClientId) { return 0x7fffffff^CmaskOne(ClientId); }
|
|
|
|
inline bool CmaskIsSet(int Mask, int ClientId) { return (Mask&CmaskOne(ClientId)) != 0; }
|
|
|
|
#endif
|