Pyrogenesis HEAD
Pyrogenesis, a RTS Engine
|
Network client. More...
#include <NetClient.h>
Public Member Functions | |
CNetClient (CGame *game) | |
Construct a client associated with the given game object. More... | |
virtual | ~CNetClient () |
void | TraceMember (JSTracer *trc) |
void | SetUserName (const CStrW &username) |
Set the user's name that will be displayed to all players. More... | |
void | SetHostJID (const CStr &jid) |
Store the JID of the host. More... | |
void | SetControllerSecret (const std::string &secret) |
bool | IsController () const |
void | SetGamePassword (const CStr &hashedPassword) |
Set the game password. More... | |
CStr | GetGUID () const |
Returns the GUID of the local client. More... | |
void | SetupServerData (CStr address, u16 port, bool stun) |
Set connection data to the remote networked server. More... | |
bool | SetupConnection (ENetHost *enetClient) |
Set up a connection to the remote networked server. More... | |
void | SetupConnectionViaLobby () |
Request connection information over the lobby. More... | |
bool | TryToConnect (const CStr &hostJID, bool localNetwork) |
Connect to the remote networked server using lobby. More... | |
void | DestroyConnection () |
Destroy the connection to the server. More... | |
void | Poll () |
Poll the connection for messages from the server and process them, and send any queued messages. More... | |
void | CheckServerConnection () |
Locally triggers a GUI message if the connection to the server is being lost or has bad latency. More... | |
void | GuiPoll (JS::MutableHandleValue) |
Retrieves the next queued GUI message, and removes it from the queue. More... | |
template<typename... Args> | |
void | PushGuiMessage (Args const &... args) |
Add a message to the queue, to be read by GuiPoll. More... | |
std::string | TestReadGuiMessages () |
Return a concatenation of all messages in the GUI queue, for test cases to easily verify the queue contents. More... | |
const ScriptInterface & | GetScriptInterface () |
Get the script interface associated with this network client, which is equivalent to the one used by the CGame in the constructor. More... | |
bool | SendMessage (const CNetMessage *message) |
Send a message to the server. More... | |
void | HandleConnect () |
Call when the network connection has been successfully initiated. More... | |
void | HandleDisconnect (u32 reason) |
Call when the network connection has been lost. More... | |
bool | HandleMessage (CNetMessage *message) |
Call when a message has been received from the network. More... | |
void | LoadFinished () |
Call when the game has started and all data files have been loaded, to signal to the server that we are ready to begin the game. More... | |
void | SendGameSetupMessage (JS::MutableHandleValue attrs, const ScriptInterface &scriptInterface) |
void | SendAssignPlayerMessage (const int playerID, const CStr &guid) |
void | SendChatMessage (const std::wstring &text) |
void | SendReadyMessage (const int status) |
void | SendClearAllReadyMessage () |
void | SendStartGameMessage (const CStr &initAttribs) |
void | SendRejoinedMessage () |
Call when the client has rejoined a running match and finished the loading screen. More... | |
void | SendKickPlayerMessage (const CStrW &playerName, bool ban) |
Call to kick/ban a client. More... | |
void | SendPausedMessage (bool pause) |
Call when the client has paused or unpaused the game. More... | |
bool | ShouldShutdown () const |
void | HandleGetServerDataFailed (const CStr &error) |
Called when fetching connection data from the host failed, to inform JS code. More... | |
Public Member Functions inherited from CFsm< CNetClient > | |
void | AddTransition (unsigned int state, unsigned int eventType, unsigned int nextState, Action *pAction=nullptr, CNetClient *pContext=nullptr) |
Adds a new transistion to the state machine. More... | |
void | SetFirstState (unsigned int firstState) |
Sets the initial state for FSM. More... | |
void | SetCurrState (unsigned int state) |
Sets the current state and update the last state to the current state. More... | |
unsigned int | GetCurrState () const |
void | SetNextState (unsigned int nextState) |
unsigned int | GetNextState () const |
bool | Update (unsigned int eventType, void *pEventData) |
Updates the FSM and retrieves next state. More... | |
bool | IsDone () const |
Tests whether the state machine has finished its work. More... | |
Static Public Member Functions | |
static void | Trace (JSTracer *trc, void *data) |
We assume that adding a tracing function that's only called during GC is better for performance than using a PersistentRooted<T> where each value needs to be added to the root set. More... | |
Private Member Functions | |
NONCOPYABLE (CNetClient) | |
void | SendAuthenticateMessage () |
void | SetAndOwnSession (CNetClientSession *session) |
Take ownership of a session object, and use it for all network communication. More... | |
void | PostPlayerAssignmentsToScript () |
Push a message onto the GUI queue listing the current player assignments. More... | |
Static Private Member Functions | |
static bool | OnConnect (CNetClient *client, CFsmEvent *event) |
static bool | OnHandshake (CNetClient *client, CFsmEvent *event) |
static bool | OnHandshakeResponse (CNetClient *client, CFsmEvent *event) |
static bool | OnAuthenticateRequest (CNetClient *client, CFsmEvent *event) |
static bool | OnAuthenticate (CNetClient *client, CFsmEvent *event) |
static bool | OnChat (CNetClient *client, CFsmEvent *event) |
static bool | OnReady (CNetClient *client, CFsmEvent *event) |
static bool | OnGameSetup (CNetClient *client, CFsmEvent *event) |
static bool | OnPlayerAssignment (CNetClient *client, CFsmEvent *event) |
static bool | OnInGame (CNetClient *client, CFsmEvent *event) |
static bool | OnGameStart (CNetClient *client, CFsmEvent *event) |
static bool | OnJoinSyncStart (CNetClient *client, CFsmEvent *event) |
static bool | OnJoinSyncEndCommandBatch (CNetClient *client, CFsmEvent *event) |
static bool | OnRejoined (CNetClient *client, CFsmEvent *event) |
static bool | OnKicked (CNetClient *client, CFsmEvent *event) |
static bool | OnClientTimeout (CNetClient *client, CFsmEvent *event) |
static bool | OnClientPerformance (CNetClient *client, CFsmEvent *event) |
static bool | OnClientsLoading (CNetClient *client, CFsmEvent *event) |
static bool | OnClientPaused (CNetClient *client, CFsmEvent *event) |
static bool | OnLoadedGame (CNetClient *client, CFsmEvent *event) |
Private Attributes | |
CGame * | m_Game |
CStrW | m_UserName |
CStr | m_HostJID |
CStr | m_ServerAddress |
u16 | m_ServerPort |
bool | m_UseSTUN |
CStr | m_Password |
Password to join the game. More... | |
std::string | m_ControllerSecret |
The 'secret' used to identify the controller of the game. More... | |
bool | m_IsController = false |
Note that this is just a "gui hint" with no actual impact on being controller. More... | |
CNetClientSession * | m_Session |
Current network session (or NULL if not connected) More... | |
std::thread | m_PollingThread |
CNetClientTurnManager * | m_ClientTurnManager |
Turn manager associated with the current game (or NULL if we haven't started the game yet) More... | |
u32 | m_HostID |
Unique-per-game identifier of this client, used to identify the sender of simulation commands. More... | |
bool | m_Rejoin |
True if the player is currently rejoining or has already rejoined the game. More... | |
PlayerAssignmentMap | m_PlayerAssignments |
Latest copy of player assignments heard from the server. More... | |
CStr | m_GUID |
Globally unique identifier to distinguish users beyond the lifetime of a single network session. More... | |
std::deque< JS::Heap< JS::Value > > | m_GuiMessageQueue |
Queue of messages for GuiPoll. More... | |
std::string | m_JoinSyncBuffer |
Serialized game state received when joining an in-progress game. More... | |
std::time_t | m_LastConnectionCheck |
Time when the server was last checked for timeouts and bad latency. More... | |
Network client.
This code is run by every player (including the host, if they are not a dedicated server). It provides an interface between the GUI, the network (via CNetClientSession), and the game (via CGame and CNetClientTurnManager).
CNetClient::CNetClient | ( | CGame * | game | ) |
Construct a client associated with the given game object.
The game must exist for the lifetime of this object.
|
virtual |
void CNetClient::CheckServerConnection | ( | ) |
Locally triggers a GUI message if the connection to the server is being lost or has bad latency.
void CNetClient::DestroyConnection | ( | ) |
Destroy the connection to the server.
This client probably cannot be used again.
|
inline |
Returns the GUID of the local client.
Used for distinguishing observers.
const ScriptInterface & CNetClient::GetScriptInterface | ( | ) |
Get the script interface associated with this network client, which is equivalent to the one used by the CGame in the constructor.
void CNetClient::GuiPoll | ( | JS::MutableHandleValue | ret | ) |
Retrieves the next queued GUI message, and removes it from the queue.
The returned value is in the GetScriptInterface() JS context.
This is the only mechanism for the networking code to send messages to the GUI - it is pull-based (instead of push) so the engine code does not need to know anything about the code structure of the GUI scripts.
The structure of the messages is { "type": "...", ... }
. The exact types and associated data are not specified anywhere - the implementation and GUI scripts must make the same assumptions.
void CNetClient::HandleConnect | ( | ) |
Call when the network connection has been successfully initiated.
void CNetClient::HandleDisconnect | ( | u32 | reason | ) |
Call when the network connection has been lost.
void CNetClient::HandleGetServerDataFailed | ( | const CStr & | error | ) |
Called when fetching connection data from the host failed, to inform JS code.
bool CNetClient::HandleMessage | ( | CNetMessage * | message | ) |
Call when a message has been received from the network.
|
inline |
void CNetClient::LoadFinished | ( | ) |
Call when the game has started and all data files have been loaded, to signal to the server that we are ready to begin the game.
|
private |
|
staticprivate |
|
staticprivate |
|
staticprivate |
|
staticprivate |
|
staticprivate |
|
staticprivate |
|
staticprivate |
|
staticprivate |
|
staticprivate |
|
staticprivate |
|
staticprivate |
|
staticprivate |
|
staticprivate |
|
staticprivate |
|
staticprivate |
|
staticprivate |
|
staticprivate |
|
staticprivate |
|
staticprivate |
|
staticprivate |
void CNetClient::Poll | ( | ) |
Poll the connection for messages from the server and process them, and send any queued messages.
This must be called frequently (i.e. once per frame).
|
private |
Push a message onto the GUI queue listing the current player assignments.
|
inline |
Add a message to the queue, to be read by GuiPoll.
The script value must be in the GetScriptInterface() JS context.
void CNetClient::SendAssignPlayerMessage | ( | const int | playerID, |
const CStr & | guid | ||
) |
|
private |
void CNetClient::SendChatMessage | ( | const std::wstring & | text | ) |
void CNetClient::SendClearAllReadyMessage | ( | ) |
void CNetClient::SendGameSetupMessage | ( | JS::MutableHandleValue | attrs, |
const ScriptInterface & | scriptInterface | ||
) |
void CNetClient::SendKickPlayerMessage | ( | const CStrW & | playerName, |
bool | ban | ||
) |
Call to kick/ban a client.
bool CNetClient::SendMessage | ( | const CNetMessage * | message | ) |
Send a message to the server.
message | message to send |
void CNetClient::SendPausedMessage | ( | bool | pause | ) |
Call when the client has paused or unpaused the game.
void CNetClient::SendReadyMessage | ( | const int | status | ) |
void CNetClient::SendRejoinedMessage | ( | ) |
Call when the client has rejoined a running match and finished the loading screen.
void CNetClient::SendStartGameMessage | ( | const CStr & | initAttribs | ) |
|
private |
Take ownership of a session object, and use it for all network communication.
void CNetClient::SetControllerSecret | ( | const std::string & | secret | ) |
void CNetClient::SetGamePassword | ( | const CStr & | hashedPassword | ) |
Set the game password.
Must be called after SetUserName, as that is used to hash further.
void CNetClient::SetHostJID | ( | const CStr & | jid | ) |
Store the JID of the host.
This is needed for the secure lobby authentication.
bool CNetClient::SetupConnection | ( | ENetHost * | enetClient | ) |
Set up a connection to the remote networked server.
Must call SetupServerData first.
void CNetClient::SetupConnectionViaLobby | ( | ) |
Request connection information over the lobby.
void CNetClient::SetupServerData | ( | CStr | address, |
u16 | port, | ||
bool | stun | ||
) |
Set connection data to the remote networked server.
address | IP address or host name to connect to |
void CNetClient::SetUserName | ( | const CStrW & | username | ) |
Set the user's name that will be displayed to all players.
This must not be called after the connection setup.
bool CNetClient::ShouldShutdown | ( | ) | const |
std::string CNetClient::TestReadGuiMessages | ( | ) |
Return a concatenation of all messages in the GUI queue, for test cases to easily verify the queue contents.
|
inlinestatic |
We assume that adding a tracing function that's only called during GC is better for performance than using a PersistentRooted<T> where each value needs to be added to the root set.
void CNetClient::TraceMember | ( | JSTracer * | trc | ) |
bool CNetClient::TryToConnect | ( | const CStr & | hostJID, |
bool | localNetwork | ||
) |
Connect to the remote networked server using lobby.
Push netstatus messages on failure.
localNetwork | - if true, assume we are trying to connect on the local network. |
|
private |
Turn manager associated with the current game (or NULL if we haven't started the game yet)
|
private |
The 'secret' used to identify the controller of the game.
|
private |
|
private |
Globally unique identifier to distinguish users beyond the lifetime of a single network session.
|
private |
Queue of messages for GuiPoll.
|
private |
Unique-per-game identifier of this client, used to identify the sender of simulation commands.
|
private |
|
private |
Note that this is just a "gui hint" with no actual impact on being controller.
|
private |
Serialized game state received when joining an in-progress game.
|
private |
Time when the server was last checked for timeouts and bad latency.
|
private |
Password to join the game.
|
private |
Latest copy of player assignments heard from the server.
|
private |
|
private |
True if the player is currently rejoining or has already rejoined the game.
|
private |
|
private |
|
private |
Current network session (or NULL if not connected)
|
private |
|
private |