Index: binaries/data/mods/public/gui/gamesetup/gamesetup.js =================================================================== --- binaries/data/mods/public/gui/gamesetup/gamesetup.js +++ binaries/data/mods/public/gui/gamesetup/gamesetup.js @@ -1059,7 +1059,7 @@ "lobbyButton": { "onPress": () => function() { if (Engine.HasXmppClient()) - Engine.PushGuiPage("page_lobby.xml", { "dialog": true }); + Engine.PushGuiPage("page_lobby.xml", { "dialog": true , "hosting" : g_IsController ,"gameStanza": g_LastGameStanza }); }, "hidden": () => !Engine.HasXmppClient() }, @@ -1542,7 +1542,8 @@ Engine.SwitchGuiPage("page_loading.xml", { "attribs": g_GameAttributes, - "playerAssignments": g_PlayerAssignments + "playerAssignments": g_PlayerAssignments, + "gameStanza" : g_LastGameStanza }); } @@ -2285,7 +2286,8 @@ Engine.StartGame(g_GameAttributes, playerID); Engine.SwitchGuiPage("page_loading.xml", { "attribs": g_GameAttributes, - "playerAssignments": g_PlayerAssignments + "playerAssignments": g_PlayerAssignments, + "gameStanza" : g_LastGameStanza }); } } @@ -2713,6 +2715,7 @@ return; g_LastGameStanza = stanza; + Engine.SendRegisterGame(stanza); } Index: binaries/data/mods/public/gui/lobby/lobby.js =================================================================== --- binaries/data/mods/public/gui/lobby/lobby.js +++ binaries/data/mods/public/gui/lobby/lobby.js @@ -128,6 +128,26 @@ var g_AskedReconnect = false; /** + * Used to check if user current user is hosting a game. + */ +var g_UserHosting = false; + +/** + * Contains the lastGameSatnza of current user if g_UserHosting is true. + */ +var g_LastGameStanza = {}; + +/** + * Whether the current user is playing a multiplayer game or not. + */ +var g_IsUserPlayingGame = false; + +/** + * Contains getLobbyPlayerlistUpdate update data if g_IsUserPlayingGame is true. + */ +var g_LobbyPlayerlistUpdate = {}; + +/** * Processing of notifications sent by XmppClient.cpp. * * @returns true if the playerlist GUI must be updated. @@ -399,6 +419,13 @@ { g_Dialog = attribs && attribs.dialog; + g_UserHosting = attribs && attribs.hosting; + g_LastGameStanza = attribs && attribs.gameStanza; + + g_IsUserPlayingGame = attribs && attribs.playingGame; + g_LobbyPlayerlistUpdate = attribs && attribs.sessionInGameData; + + if (!g_Settings) { leaveLobby(); @@ -431,6 +458,26 @@ reconnectMessageBox(); } +function reconnect() +{ + Engine.ConnectXmppClient(); + + if (!g_UserHosting) return; + + setTimeout(function() + { + Engine.SendRegisterGame(g_LastGameStanza); + + if (!g_IsUserPlayingGame) return; + + setTimeout(function() + { + Engine.SendChangeStateGame(g_LobbyPlayerlistUpdate["connectedPlayers"], playerDataToStringifiedTeamList(g_LobbyPlayerlistUpdate["minPlayerData"])); + }, 1000) + + }, 1000); +} + function reconnectMessageBox() { if (g_AskedReconnect) @@ -441,12 +488,10 @@ messageBox( 400, 200, translate("You have been disconnected from the lobby. Do you want to reconnect?"), - translate("Confirmation"), - [translate("No"), translate("Yes")], - [null, Engine.ConnectXmppClient]); + translate("Confirmation"), [translate("No"), translate("Yes")], [null, reconnect] + ); } - -/** +/* * Set style of GUI elements and the window style. */ function initDialogStyle() Index: binaries/data/mods/public/gui/session/menu.js =================================================================== --- binaries/data/mods/public/gui/session/menu.js +++ binaries/data/mods/public/gui/session/menu.js @@ -131,7 +131,13 @@ return; closeOpenDialogs(); - Engine.PushGuiPage("page_lobby.xml", { "dialog": true }); + Engine.PushGuiPage("page_lobby.xml",{ + "dialog": true , + "hosting" : g_IsController , + "gameStanza": g_GameStanza, + "playingGame" : true, + "sessionInGameData": getLobbyPlayerlistUpdate() + }); } function chatMenuButton() Index: binaries/data/mods/public/gui/session/session.js =================================================================== --- binaries/data/mods/public/gui/session/session.js +++ binaries/data/mods/public/gui/session/session.js @@ -195,6 +195,12 @@ */ var g_MilitaryTypes = ["Melee", "Ranged"]; + +/** + * Game stanza from gamsetup. + */ +var g_GameStanza = {}; + function GetSimState() { if (!g_SimState) @@ -260,8 +266,13 @@ return; } + if( "gameStanza" in initData) + { + g_GameStanza = initData.gameStanza; + } // Fallback used by atlas g_PlayerAssignments = initData ? initData.playerAssignments : { "local": { "player": 1 } }; + // Fallback used by atlas and autostart games if (g_PlayerAssignments.local && !g_PlayerAssignments.local.name) @@ -853,6 +864,7 @@ }); } + function onSimulationUpdate() { // Templates change depending on technologies and auras, so they have to be reloaded after such a change. @@ -1506,14 +1518,7 @@ g_ResearchListTop = 4 + 14 * counters.length; } -/** - * Send the current list of players, teams, AIs, observers and defeated/won and offline states to the lobby. - * The playerData format from g_GameAttributes is kept to reuse the GUI function presenting the data. - */ -function sendLobbyPlayerlistUpdate() -{ - if (!g_IsController || !Engine.HasXmppClient()) - return; +function getLobbyPlayerlistUpdate(){ // Extract the relevant player data and minimize packet load let minPlayerData = []; @@ -1562,10 +1567,25 @@ }); } - Engine.SendChangeStateGame(connectedPlayers, playerDataToStringifiedTeamList(minPlayerData)); + return { "connectedPlayers":connectedPlayers, "minPlayerData":minPlayerData } } /** + * Send the current list of players, teams, AIs, observers and defeated/won and offline states to the lobby. + * The playerData format from g_GameAttributes is kept to reuse the GUI function presenting the data. + */ +function sendLobbyPlayerlistUpdate() +{ + if (!g_IsController || !Engine.HasXmppClient()) + return; + + let data = getLobbyPlayerlistUpdate(); + + Engine.SendChangeStateGame(data.connectedPlayers, playerDataToStringifiedTeamList(data.minPlayerData)); + +} + +/** * Send a report on the gamestatus to the lobby. */ function reportGame()