Ticket #3806: 3556_dedServer_v1.2.1.patch
File 3556_dedServer_v1.2.1.patch, 15.6 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 93 addChatMessage({ 94 94 "type": "system", 95 95 "text": sprintf(ban ? translate("Could not ban %(name)s.") : translate("Could not kick %(name)s."), { … … 96 96 "name": username 97 97 }) 98 98 }); 99 else 100 Engine.KickPlayer(username, ban); 99 101 } 100 102 101 103 /** -
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_Net Server)408 return false;407 if (!g_NetClient) 408 return; 409 409 410 return g_NetServer->KickPlayer(playerName, ban); 410 g_NetClient->SendKickPlayerMessage(playerName, ban); 411 return; 411 412 } 412 413 413 414 JS::Value PollNetworkClient(ScriptInterface::CxPrivate* pCxPrivate) … … 425 426 426 427 void AssignNetworkPlayer(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), int playerID, const std::string& guid) 427 428 { 428 ENSURE(g_Net Server);429 ENSURE(g_NetClient); 429 430 430 g_Net Server->AssignPlayer(playerID, guid);431 g_NetClient->SendAssignPlayerMessage(playerID, guid); 431 432 } 432 433 433 434 void SetNetworkPlayerStatus(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const std::string& guid, int ready) 434 435 { 435 ENSURE(g_Net Server);436 ENSURE(g_NetClient); 436 437 437 g_Net Server->SetPlayerReady(guid, ready);438 g_NetClient->SendSetPlayerStatusMessage(guid, ready); 438 439 } 439 440 440 441 void ClearAllPlayerReady (ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) 441 442 { 442 ENSURE(g_Net Server);443 ENSURE(g_NetClient); 443 444 444 g_Net Server->ClearAllPlayerReady();445 g_NetClient->ClearAllPlayerReady(); 445 446 } 446 447 447 448 void SendNetworkChat(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const std::wstring& message) … … 655 656 return g_Game->GetSimRate(); 656 657 } 657 658 658 void SetTurnLength(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), int length)659 {660 if (g_NetServer)661 g_NetServer->SetTurnLength(length);662 else663 LOGERROR("Only network host can change turn length");664 }665 666 659 // Focus the game camera on a given position. 667 660 void SetCameraTarget(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), float x, float y, float z) 668 661 { … … 1040 1033 scriptInterface.RegisterFunction<void, std::wstring, std::string, &StartNetworkJoin>("StartNetworkJoin"); 1041 1034 scriptInterface.RegisterFunction<void, &DisconnectNetworkGame>("DisconnectNetworkGame"); 1042 1035 scriptInterface.RegisterFunction<std::string, &GetPlayerGUID>("GetPlayerGUID"); 1043 scriptInterface.RegisterFunction< bool, CStrW, bool, &KickPlayer>("KickPlayer");1036 scriptInterface.RegisterFunction<void, CStrW, bool, &KickPlayer>("KickPlayer"); 1044 1037 scriptInterface.RegisterFunction<JS::Value, &PollNetworkClient>("PollNetworkClient"); 1045 1038 scriptInterface.RegisterFunction<void, JS::HandleValue, &SetNetworkGameAttributes>("SetNetworkGameAttributes"); 1046 1039 scriptInterface.RegisterFunction<void, int, std::string, &AssignNetworkPlayer>("AssignNetworkPlayer"); … … 1106 1099 scriptInterface.RegisterFunction<void, unsigned int, &StopJsTimer>("StopXTimer"); 1107 1100 scriptInterface.RegisterFunction<void, float, &SetSimRate>("SetSimRate"); 1108 1101 scriptInterface.RegisterFunction<float, &GetSimRate>("GetSimRate"); 1109 scriptInterface.RegisterFunction<void, int, &SetTurnLength>("SetTurnLength");1110 1102 scriptInterface.RegisterFunction<void, float, float, float, &SetCameraTarget>("SetCameraTarget"); 1111 1103 scriptInterface.RegisterFunction<int, &Crash>("Crash"); 1112 1104 scriptInterface.RegisterFunction<void, &DebugWarn>("DebugWarn"); -
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 654 659 session->AddTransition(NSS_JOIN_SYNCING, (uint)NMT_CONNECTION_LOST, NSS_UNCONNECTED, (void*)&OnDisconnect, context); … … 655 660 session->AddTransition(NSS_JOIN_SYNCING, (uint)NMT_LOADED_GAME, NSS_INGAME, (void*)&OnJoinSyncingLoadedGame, context); 656 661 657 662 session->AddTransition(NSS_INGAME, (uint)NMT_REJOINED, NSS_INGAME, (void*)&OnRejoined, context); 663 session->AddTransition(NSS_INGAME, (uint)NMT_KICKED, NSS_INGAME, (void*)&OnKickPlayer, context); 658 664 session->AddTransition(NSS_INGAME, (uint)NMT_CLIENT_PAUSED, NSS_INGAME, (void*)&OnClientPaused, context); 659 665 session->AddTransition(NSS_INGAME, (uint)NMT_CONNECTION_LOST, NSS_UNCONNECTED, (void*)&OnDisconnect, context); 660 666 session->AddTransition(NSS_INGAME, (uint)NMT_CHAT, NSS_INGAME, (void*)&OnChat, context); … … 792 798 793 799 // and return if no one or the host has that name 794 800 if (it == m_Sessions.end() || (*it)->GetGUID() == m_HostGUID) 801 { 802 LOGERROR("Couldn't %s player", ban ? "ban" : "kick"); 795 803 return false; 804 } 796 805 797 806 if (ban) 798 807 { … … 1111 1120 return true; 1112 1121 } 1113 1122 1123 bool CNetServerWorker::OnSetPlayerStatus(void* context, CFsmEvent* event) 1124 { 1125 ENSURE(event->GetType() == (uint)NMT_SET_PLAYER_STATUS); 1126 1127 CNetServerSession* session = (CNetServerSession*)context; 1128 CNetServerWorker& server = session->GetServer(); 1129 1130 if (session->GetGUID() != server.m_HostGUID) 1131 return true; 1132 1133 CSetPlayerStatusMessage* message = (CSetPlayerStatusMessage*)event->GetParamRef(); 1134 1135 server.SetPlayerReady(message->m_GUID, message->m_Ready); 1136 return true; 1137 } 1138 1139 bool CNetServerWorker::OnGameSetup(void* context, CFsmEvent* event) 1140 { 1141 ENSURE(event->GetType() == (uint)NMT_GAME_SETUP); 1142 1143 CNetServerSession* session = (CNetServerSession*)context; 1144 CNetServerWorker& server = session->GetServer(); 1145 1146 if (session->GetGUID() != server.m_HostGUID) 1147 return true; 1148 1149 CGameSetupMessage* message = (CGameSetupMessage*)event->GetParamRef(); 1150 1151 server.UpdateGameAttributes(&(message->m_Data)); 1152 return true; 1153 } 1154 1155 bool CNetServerWorker::OnAssignPlayer(void* context, CFsmEvent* event) 1156 { 1157 ENSURE(event->GetType() == (uint)NMT_ASSIGN_PLAYER); 1158 CNetServerSession* session = (CNetServerSession*)context; 1159 CNetServerWorker& server = session->GetServer(); 1160 1161 if (session->GetGUID() != server.m_HostGUID) 1162 return true; 1163 1164 CAssignPlayerMessage* message = (CAssignPlayerMessage*)event->GetParamRef(); 1165 server.m_AssignPlayerQueue.emplace_back(message->m_PlayerID, message->m_GUIDToAssign); 1166 return true; 1167 } 1168 1169 bool CNetServerWorker::OnStartGame(void* context, CFsmEvent* event) 1170 { 1171 ENSURE(event->GetType() == (uint)NMT_GAME_START); 1172 CNetServerSession* session = (CNetServerSession*)context; 1173 CNetServerWorker& server = session->GetServer(); 1174 1175 if (session->GetGUID() != server.m_HostGUID) 1176 return true; 1177 1178 server.StartGame(); 1179 return true; 1180 } 1181 1114 1182 bool CNetServerWorker::OnLoadedGame(void* context, CFsmEvent* event) 1115 1183 { 1116 1184 ENSURE(event->GetType() == (uint)NMT_LOADED_GAME); … … 1203 1271 return true; 1204 1272 } 1205 1273 1274 bool CNetServerWorker::OnKickPlayer(void* context, CFsmEvent* event) 1275 { 1276 ENSURE(event->GetType() == (uint)NMT_KICKED); 1277 1278 CNetServerSession* session = (CNetServerSession*)context; 1279 CNetServerWorker& server = session->GetServer(); 1280 1281 if (session->GetGUID() != server.m_HostGUID) 1282 return true; 1283 1284 CKickedMessage* message = (CKickedMessage*)event->GetParamRef(); 1285 server.KickPlayer(message->m_Name, message->m_Ban); 1286 return true; 1287 } 1288 1206 1289 bool CNetServerWorker::OnDisconnect(void* context, CFsmEvent* event) 1207 1290 { 1208 1291 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