bool CNetClient::OnGameStart(void* context, CFsmEvent* event) { ENSURE(event->GetType() == (uint)NMT_GAME_START); CNetClient* client = (CNetClient*)context; JSContext* cx = client->GetScriptInterface().GetContext(); JSAutoRequest rq(cx); // Find the player assigned to our GUID int player = -1; if (client->m_PlayerAssignments.find(client->m_GUID) != client->m_PlayerAssignments.end()) player = client->m_PlayerAssignments[client->m_GUID].m_PlayerID; client->m_ClientTurnManager = new CNetClientTurnManager( *client->m_Game->GetSimulation2(), *client, client->m_HostID, client->m_Game->GetReplayLogger()); client->m_Game->SetPlayerID(player); client->m_Game->StartGame(&client->m_GameAttributes, ""); JS::RootedValue msg(cx); client->GetScriptInterface().Eval("({'type':'start'})", &msg); client->PushGuiMessage(msg); return true; }
bool CNetClient::OnClientPerformance(void *context, CFsmEvent* event) { // Performance statistics for one or multiple clients ENSURE(event->GetType() == (uint)NMT_CLIENT_PERFORMANCE); CNetClient* client = (CNetClient*)context; JSContext* cx = client->GetScriptInterface().GetContext(); if (client->GetCurrState() == NCS_LOADING) return true; CClientPerformanceMessage* message = (CClientPerformanceMessage*)event->GetParamRef(); std::vector<CClientPerformanceMessage::S_m_Clients> &clients = message->m_Clients; // Display warnings for other clients with bad ping for (size_t i = 0; i < clients.size(); ++i) { if (clients[i].m_MeanRTT < DEFAULT_TURN_LENGTH_MP || clients[i].m_GUID == client->m_GUID) continue; JS::RootedValue msg(cx); client->GetScriptInterface().Eval("({ 'type':'netwarn', 'warntype': 'client-latency' })", &msg); client->GetScriptInterface().SetProperty(msg, "guid", clients[i].m_GUID); client->GetScriptInterface().SetProperty(msg, "meanRTT", clients[i].m_MeanRTT); client->PushGuiMessage(msg); } return true; }
bool CNetClient::OnRejoined(void *context, CFsmEvent* event) { ENSURE(event->GetType() == (uint)NMT_REJOINED); CNetClient* client = (CNetClient*)context; JSContext* cx = client->GetScriptInterface().GetContext(); CRejoinedMessage* message = (CRejoinedMessage*)event->GetParamRef(); JS::RootedValue msg(cx); client->GetScriptInterface().Eval("({'type':'rejoined'})", &msg); client->GetScriptInterface().SetProperty(msg, "guid", std::string(message->m_GUID), false); client->PushGuiMessage(msg); return true; }
bool CNetClient::OnConnect(void* context, CFsmEvent* event) { ENSURE(event->GetType() == (uint)NMT_CONNECT_COMPLETE); CNetClient* client = (CNetClient*)context; JSContext* cx = client->GetScriptInterface().GetContext(); JSAutoRequest rq(cx); JS::RootedValue msg(cx); client->GetScriptInterface().Eval("({'type':'netstatus','status':'connected'})", &msg); client->PushGuiMessage(msg); return true; }
bool CNetClient::OnKicked(void *context, CFsmEvent* event) { ENSURE(event->GetType() == (uint)NMT_KICKED); CNetClient* client = (CNetClient*)context; JSContext* cx = client->GetScriptInterface().GetContext(); CKickedMessage* message = (CKickedMessage*)event->GetParamRef(); JS::RootedValue msg(cx); client->GetScriptInterface().Eval("({})", &msg); client->GetScriptInterface().SetProperty(msg, "username", message->m_Name); client->GetScriptInterface().SetProperty(msg, "type", message->m_Ban ? std::string("banned") : std::string("kicked")); client->PushGuiMessage(msg); return true; }
bool CNetClient::OnLoadedGame(void* context, CFsmEvent* event) { ENSURE(event->GetType() == (uint)NMT_LOADED_GAME); CNetClient* client = (CNetClient*)context; JSContext* cx = client->GetScriptInterface().GetContext(); JSAutoRequest rq(cx); // All players have loaded the game - start running the turn manager // so that the game begins client->m_Game->SetTurnManager(client->m_ClientTurnManager); JS::RootedValue msg(cx); client->GetScriptInterface().Eval("({'type':'netstatus','status':'active'})", &msg); client->PushGuiMessage(msg); return true; }
bool CNetClient::OnChat(void* context, CFsmEvent* event) { ENSURE(event->GetType() == (uint)NMT_CHAT); CNetClient* client = (CNetClient*)context; JSContext* cx = client->GetScriptInterface().GetContext(); JSAutoRequest rq(cx); CChatMessage* message = (CChatMessage*)event->GetParamRef(); JS::RootedValue msg(cx); client->GetScriptInterface().Eval("({'type':'chat'})", &msg); client->GetScriptInterface().SetProperty(msg, "guid", std::string(message->m_GUID), false); client->GetScriptInterface().SetProperty(msg, "text", std::wstring(message->m_Message), false); client->PushGuiMessage(msg); return true; }
bool CNetClient::OnGameSetup(void* context, CFsmEvent* event) { ENSURE(event->GetType() == (uint)NMT_GAME_SETUP); CNetClient* client = (CNetClient*)context; JSContext* cx = client->GetScriptInterface().GetContext(); JSAutoRequest rq(cx); CGameSetupMessage* message = (CGameSetupMessage*)event->GetParamRef(); client->m_GameAttributes = message->m_Data; JS::RootedValue msg(cx); client->GetScriptInterface().Eval("({'type':'gamesetup'})", &msg); client->GetScriptInterface().SetProperty(msg, "data", message->m_Data, false); client->PushGuiMessage(msg); return true; }
bool CNetClient::OnClientTimeout(void *context, CFsmEvent* event) { // Report the timeout of some other client ENSURE(event->GetType() == (uint)NMT_CLIENT_TIMEOUT); CNetClient* client = (CNetClient*)context; JSContext* cx = client->GetScriptInterface().GetContext(); if (client->GetCurrState() == NCS_LOADING) return true; CClientTimeoutMessage* message = (CClientTimeoutMessage*)event->GetParamRef(); JS::RootedValue msg(cx); client->GetScriptInterface().Eval("({ 'type':'netwarn', 'warntype': 'client-timeout' })", &msg); client->GetScriptInterface().SetProperty(msg, "guid", std::string(message->m_GUID)); client->GetScriptInterface().SetProperty(msg, "lastReceivedTime", message->m_LastReceivedTime); client->PushGuiMessage(msg); return true; }
bool CNetClient::OnAuthenticate(void* context, CFsmEvent* event) { ENSURE(event->GetType() == (uint)NMT_AUTHENTICATE_RESULT); CNetClient* client = (CNetClient*)context; JSContext* cx = client->GetScriptInterface().GetContext(); JSAutoRequest rq(cx); CAuthenticateResultMessage* message = (CAuthenticateResultMessage*)event->GetParamRef(); LOGMESSAGE("Net: Authentication result: host=%u, %s", message->m_HostID, utf8_from_wstring(message->m_Message)); bool isRejoining = (message->m_Code == ARC_OK_REJOINING); client->m_HostID = message->m_HostID; JS::RootedValue msg(cx); client->GetScriptInterface().Eval("({'type':'netstatus','status':'authenticated'})", &msg); client->GetScriptInterface().SetProperty(msg, "rejoining", isRejoining); client->PushGuiMessage(msg); return true; }