Persist the the valid subset of chosen player settings when changing the skirmish map. Patch by Offensive ePeen, refs #3120.

This was SVN commit r18458.
This commit is contained in:
elexis 2016-06-30 10:02:32 +00:00
parent e6e8efec1c
commit b642f0d876
2 changed files with 34 additions and 32 deletions

View file

@ -134,6 +134,7 @@
{"nick": "njm"},
{"nick": "NoMonkey", "name": "John Mena"},
{"nick": "notpete", "name": "Rich Cross"},
{"nick": "Offensive ePeen", "name": "Jared Ryan Bills"},
{"nick": "Ols", "name": "Oliver Whiteman"},
{"nick": "olsner", "name": "Simon Brenner"},
{"nick": "otero"},

View file

@ -1039,6 +1039,34 @@ function onTick()
updateTimers();
}
/**
* Called when the map or the number of players changes.
*/
function resizePlayerData(targetPlayerData, maxPlayers)
{
if (g_IsNetworked)
// Unassign excess players
for (let guid in g_PlayerAssignments)
{
let playerID = g_PlayerAssignments[guid].player;
if (playerID > maxPlayers)
Engine.AssignNetworkPlayer(playerID, "");
}
else if (!g_PlayerAssignments.local ||
g_PlayerAssignments.local.player > maxPlayers)
g_PlayerAssignments = {
"local": {
"name": singleplayerName(),
"player": 1
}
};
let pData = g_GameAttributes.settings.PlayerData;
return maxPlayers > pData.length ?
pData.concat(targetPlayerData.slice(pData.length, maxPlayers)) :
pData.slice(0, maxPlayers);
}
/**
* Called when the host choses the number of players on a random map.
* @param {Number} num
@ -1048,22 +1076,7 @@ function selectNumPlayers(num)
if (g_IsInGuiUpdate || !g_IsController || g_GameAttributes.mapType != "random")
return;
// Unassign players from nonexistent slots
if (g_IsNetworked)
{
for (let i = g_MaxPlayers; i > num; --i)
Engine.AssignNetworkPlayer(i, "");
}
else if (g_PlayerAssignments.local.player > num)
g_PlayerAssignments.local.player = 1;
// Update player data
let pData = g_GameAttributes.settings.PlayerData;
if (num < pData.length)
g_GameAttributes.settings.PlayerData = pData.slice(0, num);
else
for (let i = pData.length; i < num; ++i)
g_GameAttributes.settings.PlayerData.push(g_DefaultPlayerData[i]);
g_GameAttributes.settings.PlayerData = resizePlayerData(g_DefaultPlayerData, num);
updateGameAttributes();
}
@ -1174,6 +1187,10 @@ function selectMap(name)
if (mapSettings.PlayerData)
sanitizePlayerData(mapSettings.PlayerData);
// Persist player data
if (g_GameAttributes.mapType == "skirmish")
mapSettings.PlayerData = resizePlayerData(mapSettings.PlayerData, mapSettings.PlayerData.length);
// Copy any new settings
g_GameAttributes.map = name;
g_GameAttributes.script = mapSettings.Script;
@ -1190,22 +1207,6 @@ function selectMap(name)
g_GameAttributes.settings.PlayerData[i].AIDiff = g_DefaultPlayerData[i].AIDiff;
}
if (g_IsNetworked)
// Unassign excess players
for (let guid in g_PlayerAssignments)
{
let player = g_PlayerAssignments[guid].player;
if (player > g_GameAttributes.settings.PlayerData.length)
Engine.AssignNetworkPlayer(player, "");
}
else
g_PlayerAssignments = {
"local": {
"name": singleplayerName(),
"player": 1
}
};
updateGameAttributes();
}