Ticket #3806: 3556_dedServer_v1.3.1.patch
File 3556_dedServer_v1.3.1.patch, 14.7 KB (added by , 8 years ago) |
---|
-
binaries/data/mods/public/gui/common/network.js
89 89 90 90 function kickPlayer(username, ban) 91 91 { 92 if (!Engine.KickPlayer(username, ban)) 92 if (g_IsController) 93 Engine.KickPlayer(username, ban); 94 else 93 95 addChatMessage({ 94 96 "type": "system", 95 97 "text": sprintf(ban ? translate("Could not ban %(name)s.") : translate("Could not kick %(name)s."), { -
source/gui/scripting/ScriptFunctions.cpp
248 248 249 249 void StartNetworkGame(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) 250 250 { 251 ENSURE(g_Net Server);252 g_Net Server->StartGame();251 ENSURE(g_NetClient); 252 g_NetClient->SendStartGameMessage(); 253 253 } 254 254 255 255 void StartGame(ScriptInterface::CxPrivate* pCxPrivate, JS::HandleValue attribs, int playerID) … … 332 332 333 333 void SetNetworkGameAttributes(ScriptInterface::CxPrivate* pCxPrivate, JS::HandleValue attribs1) 334 334 { 335 ENSURE(g_Net Server);335 ENSURE(g_NetClient); 336 336 //TODO: This is a workaround because we need to pass a MutableHandle to a JSAPI functions somewhere 337 337 // (with no obvious reason). 338 338 JSContext* cx = pCxPrivate->pScriptInterface->GetContext(); … … 339 339 JSAutoRequest rq(cx); 340 340 JS::RootedValue attribs(cx, attribs1); 341 341 342 g_Net Server->UpdateGameAttributes(&attribs, *(pCxPrivate->pScriptInterface));342 g_NetClient->SendGameSetupMessage(&attribs, *(pCxPrivate->pScriptInterface)); 343 343 } 344 344 345 345 void StartNetworkHost(ScriptInterface::CxPrivate* pCxPrivate, const std::wstring& playerName) … … 402 402 return g_NetClient->GetGUID(); 403 403 } 404 404 405 boolKickPlayer(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const CStrW& playerName, bool ban)405 void KickPlayer(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const CStrW& playerName, bool ban) 406 406 { 407 if (!g_NetServer) 408 return false; 409 410 return g_NetServer->KickPlayer(playerName, ban); 407 if (g_NetClient) 408 g_NetClient->SendKickPlayerMessage(playerName, ban); 411 409 } 412 410 413 411 JS::Value PollNetworkClient(ScriptInterface::CxPrivate* pCxPrivate) … … 425 423 426 424 void AssignNetworkPlayer(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), int playerID, const std::string& guid) 427 425 { 428 ENSURE(g_Net Server);426 ENSURE(g_NetClient); 429 427 430 g_Net Server->AssignPlayer(playerID, guid);428 g_NetClient->SendAssignPlayerMessage(playerID, guid); 431 429 } 432 430 433 431 void SetNetworkPlayerStatus(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const std::string& guid, int ready) 434 432 { 435 ENSURE(g_Net Server);433 ENSURE(g_NetClient); 436 434 437 g_Net Server->SetPlayerReady(guid, ready);435 g_NetClient->SendSetPlayerStatusMessage(guid, ready); 438 436 } 439 437 440 438 void ClearAllPlayerReady (ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) 441 439 { 442 ENSURE(g_Net Server);440 ENSURE(g_NetClient); 443 441 444 g_Net Server->ClearAllPlayerReady();442 g_NetClient->ClearAllPlayerReady(); 445 443 } 446 444 447 445 void SendNetworkChat(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const std::wstring& message) … … 1040 1038 scriptInterface.RegisterFunction<void, std::wstring, std::string, &StartNetworkJoin>("StartNetworkJoin"); 1041 1039 scriptInterface.RegisterFunction<void, &DisconnectNetworkGame>("DisconnectNetworkGame"); 1042 1040 scriptInterface.RegisterFunction<std::string, &GetPlayerGUID>("GetPlayerGUID"); 1043 scriptInterface.RegisterFunction< bool, CStrW, bool, &KickPlayer>("KickPlayer");1041 scriptInterface.RegisterFunction<void, CStrW, bool, &KickPlayer>("KickPlayer"); 1044 1042 scriptInterface.RegisterFunction<JS::Value, &PollNetworkClient>("PollNetworkClient"); 1045 1043 scriptInterface.RegisterFunction<void, JS::HandleValue, &SetNetworkGameAttributes>("SetNetworkGameAttributes"); 1046 1044 scriptInterface.RegisterFunction<void, int, std::string, &AssignNetworkPlayer>("AssignNetworkPlayer"); -
source/network/NetClient.cpp
323 323 SetCurrState(NCS_UNCONNECTED); 324 324 } 325 325 326 void CNetClient::SendGameSetupMessage(JS::MutableHandleValue attrs, ScriptInterface& scriptInterface) 327 { 328 JSContext* cx = scriptInterface.GetContext(); 329 JS::RootedValue attrsRooted(cx); 330 attrsRooted = attrs; 331 332 CGameSetupMessage gameSetup(scriptInterface); 333 gameSetup.m_Data = attrsRooted; 334 SendMessage(&gameSetup); 335 } 336 337 void CNetClient::SendAssignPlayerMessage(const int playerID, const std::string& guid) 338 { 339 CAssignPlayerMessage assignPlayer; 340 assignPlayer.m_PlayerID = playerID; 341 assignPlayer.m_GUIDToAssign = guid; 342 SendMessage(&assignPlayer); 343 } 344 326 345 void CNetClient::SendChatMessage(const std::wstring& text) 327 346 { 328 347 CChatMessage chat; … … 337 356 SendMessage(&readyStatus); 338 357 } 339 358 359 void CNetClient::SendSetPlayerStatusMessage(const std::string& guid, const int ready) 360 { 361 CSetPlayerStatusMessage setStatus; 362 setStatus.m_GUID = guid; 363 setStatus.m_Ready = ready; 364 SendMessage(&setStatus); 365 } 366 367 void CNetClient::SendStartGameMessage() 368 { 369 CGameStartMessage gameStart; 370 SendMessage(&gameStart); 371 } 372 340 373 void CNetClient::SendRejoinedMessage() 341 374 { 342 375 CRejoinedMessage rejoinedMessage; … … 343 376 SendMessage(&rejoinedMessage); 344 377 } 345 378 379 void CNetClient::SendKickPlayerMessage(const CStrW& playerName, bool ban) 380 { 381 CKickedMessage kickPlayer; 382 kickPlayer.m_Name = playerName; 383 kickPlayer.m_Ban = ban; 384 SendMessage(&kickPlayer); 385 } 386 346 387 void CNetClient::SendPausedMessage(bool pause) 347 388 { 348 389 CClientPausedMessage pausedMessage; … … 350 391 SendMessage(&pausedMessage); 351 392 } 352 393 394 void CNetClient::ClearAllPlayerReady() 395 { 396 for (PlayerAssignmentMap::iterator it = m_PlayerAssignments.begin(); it != m_PlayerAssignments.end(); ++it) 397 SendSetPlayerStatusMessage(it->first, 0); 398 } 399 353 400 bool CNetClient::HandleMessage(CNetMessage* message) 354 401 { 355 402 // Handle non-FSM messages first -
source/network/NetClient.h
187 187 */ 188 188 void LoadFinished(); 189 189 190 void SendGameSetupMessage(JS::MutableHandleValue attrs, ScriptInterface& scriptInterface); 191 192 void SendAssignPlayerMessage(const int playerID, const std::string& guid); 193 190 194 void SendChatMessage(const std::wstring& text); 191 195 192 196 void SendReadyMessage(const int status); 193 197 198 void SendSetPlayerStatusMessage(const std::string& guid, const int ready); 199 200 void SendStartGameMessage(); 201 194 202 /** 195 203 * Call when the client has rejoined a running match and finished 196 204 * the loading screen. … … 198 206 void SendRejoinedMessage(); 199 207 200 208 /** 209 * Call when a client kicks/ban a player 210 */ 211 void SendKickPlayerMessage(const CStrW& playerName, bool ban); 212 213 /** 201 214 * Call when the client has paused or unpaused the game. 202 215 */ 203 216 void SendPausedMessage(bool pause); 204 217 218 /** 219 * 220 */ 221 void ClearAllPlayerReady(); 222 205 223 private: 206 224 // Net message / FSM transition handlers 207 225 static bool OnConnect(void* context, CFsmEvent* event); -
source/network/NetMessage.cpp
203 203 pNewMessage = new CSimulationMessage(scriptInterface); 204 204 break; 205 205 206 case NMT_ASSIGN_PLAYER: 207 pNewMessage = new CAssignPlayerMessage; 208 break; 209 210 case NMT_SET_PLAYER_STATUS: 211 pNewMessage = new CSetPlayerStatusMessage; 212 break; 213 206 214 default: 207 215 LOGERROR("CNetMessageFactory::CreateMessage(): Unknown message type '%d' received", header.GetType()); 208 216 break; -
source/network/NetMessages.h
28 28 29 29 #define PS_PROTOCOL_MAGIC 0x5073013f // 'P', 's', 0x01, '?' 30 30 #define PS_PROTOCOL_MAGIC_RESPONSE 0x50630121 // 'P', 'c', 0x01, '!' 31 #define PS_PROTOCOL_VERSION 0x0101001 3// Arbitrary protocol31 #define PS_PROTOCOL_VERSION 0x01010014 // Arbitrary protocol 32 32 #define PS_DEFAULT_PORT 0x5073 // 'P', 's' 33 33 34 34 // Defines the list of message types. The order of the list must not change. … … 51 51 NMT_CHAT, 52 52 NMT_READY, 53 53 NMT_GAME_SETUP, 54 NMT_ASSIGN_PLAYER, 54 55 NMT_PLAYER_ASSIGNMENT, 56 NMT_SET_PLAYER_STATUS, 55 57 56 58 NMT_FILE_TRANSFER_REQUEST, 57 59 NMT_FILE_TRANSFER_RESPONSE, … … 145 147 NMT_END_ARRAY() 146 148 END_NMT_CLASS() 147 149 150 START_NMT_CLASS_(SetPlayerStatus, NMT_SET_PLAYER_STATUS) 151 NMT_FIELD(CStr, m_GUID) 152 NMT_FIELD_INT(m_Ready, u8, 1) 153 END_NMT_CLASS() 154 148 155 START_NMT_CLASS_(FileTransferRequest, NMT_FILE_TRANSFER_REQUEST) 149 156 NMT_FIELD_INT(m_RequestID, u32, 4) 150 157 END_NMT_CLASS() … … 218 225 NMT_END_ARRAY() 219 226 END_NMT_CLASS() 220 227 228 START_NMT_CLASS_(AssignPlayer, NMT_ASSIGN_PLAYER) 229 NMT_FIELD_INT(m_PlayerID, i8, 1) 230 NMT_FIELD(CStr, m_GUIDToAssign) 231 END_NMT_CLASS() 232 221 233 END_NMTS() 222 234 223 235 #else -
source/network/NetServer.cpp
649 649 session->AddTransition(NSS_PREGAME, (uint)NMT_CONNECTION_LOST, NSS_UNCONNECTED, (void*)&OnDisconnect, context); 650 650 session->AddTransition(NSS_PREGAME, (uint)NMT_CHAT, NSS_PREGAME, (void*)&OnChat, context); 651 651 session->AddTransition(NSS_PREGAME, (uint)NMT_READY, NSS_PREGAME, (void*)&OnReady, context); 652 session->AddTransition(NSS_PREGAME, (uint)NMT_SET_PLAYER_STATUS, NSS_PREGAME, (void*)&OnSetPlayerStatus, context); 653 session->AddTransition(NSS_PREGAME, (uint)NMT_GAME_SETUP, NSS_PREGAME, (void*)&OnGameSetup, context); 654 session->AddTransition(NSS_PREGAME, (uint)NMT_ASSIGN_PLAYER, NSS_PREGAME, (void*)&OnAssignPlayer, context); 655 session->AddTransition(NSS_PREGAME, (uint)NMT_KICKED, NSS_PREGAME, (void*)&OnKickPlayer, context); 656 session->AddTransition(NSS_PREGAME, (uint)NMT_GAME_START, NSS_PREGAME, (void*)&OnStartGame, context); 652 657 session->AddTransition(NSS_PREGAME, (uint)NMT_LOADED_GAME, NSS_INGAME, (void*)&OnLoadedGame, context); 653 658 659 session->AddTransition(NSS_JOIN_SYNCING, (uint)NMT_KICKED, NSS_JOIN_SYNCING, (void*)&OnKickPlayer, context); 654 660 session->AddTransition(NSS_JOIN_SYNCING, (uint)NMT_CONNECTION_LOST, NSS_UNCONNECTED, (void*)&OnDisconnect, context); 655 661 session->AddTransition(NSS_JOIN_SYNCING, (uint)NMT_LOADED_GAME, NSS_INGAME, (void*)&OnJoinSyncingLoadedGame, context); 656 662 657 663 session->AddTransition(NSS_INGAME, (uint)NMT_REJOINED, NSS_INGAME, (void*)&OnRejoined, context); 664 session->AddTransition(NSS_INGAME, (uint)NMT_KICKED, NSS_INGAME, (void*)&OnKickPlayer, context); 658 665 session->AddTransition(NSS_INGAME, (uint)NMT_CLIENT_PAUSED, NSS_INGAME, (void*)&OnClientPaused, context); 659 666 session->AddTransition(NSS_INGAME, (uint)NMT_CONNECTION_LOST, NSS_UNCONNECTED, (void*)&OnDisconnect, context); 660 667 session->AddTransition(NSS_INGAME, (uint)NMT_CHAT, NSS_INGAME, (void*)&OnChat, context); … … 792 799 793 800 // and return if no one or the host has that name 794 801 if (it == m_Sessions.end() || (*it)->GetGUID() == m_HostGUID) 802 { 803 LOGERROR("Couldn't %s player", ban ? "ban" : "kick"); 795 804 return false; 805 } 796 806 797 807 if (ban) 798 808 { … … 1111 1121 return true; 1112 1122 } 1113 1123 1124 bool CNetServerWorker::OnSetPlayerStatus(void* context, CFsmEvent* event) 1125 { 1126 ENSURE(event->GetType() == (uint)NMT_SET_PLAYER_STATUS); 1127 1128 CNetServerSession* session = (CNetServerSession*)context; 1129 CNetServerWorker& server = session->GetServer(); 1130 1131 if (session->GetGUID() != server.m_HostGUID) 1132 return true; 1133 1134 CSetPlayerStatusMessage* message = (CSetPlayerStatusMessage*)event->GetParamRef(); 1135 1136 server.SetPlayerReady(message->m_GUID, message->m_Ready); 1137 return true; 1138 } 1139 1140 bool CNetServerWorker::OnGameSetup(void* context, CFsmEvent* event) 1141 { 1142 ENSURE(event->GetType() == (uint)NMT_GAME_SETUP); 1143 1144 CNetServerSession* session = (CNetServerSession*)context; 1145 CNetServerWorker& server = session->GetServer(); 1146 1147 if (session->GetGUID() != server.m_HostGUID) 1148 return true; 1149 1150 CGameSetupMessage* message = (CGameSetupMessage*)event->GetParamRef(); 1151 1152 server.UpdateGameAttributes(&(message->m_Data)); 1153 return true; 1154 } 1155 1156 bool CNetServerWorker::OnAssignPlayer(void* context, CFsmEvent* event) 1157 { 1158 ENSURE(event->GetType() == (uint)NMT_ASSIGN_PLAYER); 1159 CNetServerSession* session = (CNetServerSession*)context; 1160 CNetServerWorker& server = session->GetServer(); 1161 1162 if (session->GetGUID() != server.m_HostGUID) 1163 return true; 1164 1165 CAssignPlayerMessage* message = (CAssignPlayerMessage*)event->GetParamRef(); 1166 server.m_AssignPlayerQueue.emplace_back(message->m_PlayerID, message->m_GUIDToAssign); 1167 return true; 1168 } 1169 1170 bool CNetServerWorker::OnStartGame(void* context, CFsmEvent* event) 1171 { 1172 ENSURE(event->GetType() == (uint)NMT_GAME_START); 1173 CNetServerSession* session = (CNetServerSession*)context; 1174 CNetServerWorker& server = session->GetServer(); 1175 1176 if (session->GetGUID() != server.m_HostGUID) 1177 return true; 1178 1179 server.StartGame(); 1180 return true; 1181 } 1182 1114 1183 bool CNetServerWorker::OnLoadedGame(void* context, CFsmEvent* event) 1115 1184 { 1116 1185 ENSURE(event->GetType() == (uint)NMT_LOADED_GAME); … … 1203 1272 return true; 1204 1273 } 1205 1274 1275 bool CNetServerWorker::OnKickPlayer(void* context, CFsmEvent* event) 1276 { 1277 ENSURE(event->GetType() == (uint)NMT_KICKED); 1278 1279 CNetServerSession* session = (CNetServerSession*)context; 1280 CNetServerWorker& server = session->GetServer(); 1281 1282 if (session->GetGUID() != server.m_HostGUID) 1283 return true; 1284 1285 CKickedMessage* message = (CKickedMessage*)event->GetParamRef(); 1286 server.KickPlayer(message->m_Name, message->m_Ban); 1287 return true; 1288 } 1289 1206 1290 bool CNetServerWorker::OnDisconnect(void* context, CFsmEvent* event) 1207 1291 { 1208 1292 ENSURE(event->GetType() == (uint)NMT_CONNECTION_LOST); -
source/network/NetServer.h
270 270 static bool OnInGame(void* context, CFsmEvent* event); 271 271 static bool OnChat(void* context, CFsmEvent* event); 272 272 static bool OnReady(void* context, CFsmEvent* event); 273 static bool OnSetPlayerStatus(void* context, CFsmEvent* event); 274 static bool OnGameSetup(void* context, CFsmEvent* event); 275 static bool OnAssignPlayer(void* context, CFsmEvent* event); 276 static bool OnStartGame(void* context, CFsmEvent* event); 273 277 static bool OnLoadedGame(void* context, CFsmEvent* event); 274 278 static bool OnJoinSyncingLoadedGame(void* context, CFsmEvent* event); 275 279 static bool OnRejoined(void* context, CFsmEvent* event); 280 static bool OnKickPlayer(void* context, CFsmEvent* event); 276 281 static bool OnDisconnect(void* context, CFsmEvent* event); 277 282 static bool OnClientPaused(void* context, CFsmEvent* event); 278 283