Merge pull request #10885 from pchote/fix-partially-locked-slots

Prevent locked spawns from being selected by other players.
This commit is contained in:
abcdefg30
2016-03-07 21:23:28 +01:00

View File

@@ -146,6 +146,11 @@ namespace OpenRA.Mods.Common.Server
if (slot.Closed || server.LobbyInfo.ClientInSlot(s) != null)
return false;
// If the previous slot had a locked spawn then we must not carry that to the new slot
var oldSlot = client.Slot != null ? server.LobbyInfo.Slots[client.Slot] : null;
if (oldSlot != null && oldSlot.LockSpawn)
client.SpawnPoint = 0;
client.Slot = s;
S.SyncClientToPlayerReference(client, server.MapPlayers.Players[s]);
@@ -870,6 +875,22 @@ namespace OpenRA.Mods.Common.Server
return true;
}
// Check if any other slot has locked the requested spawn
if (spawnPoint > 0)
{
var spawnLockedByAnotherSlot = server.LobbyInfo.Slots.Where(ss => ss.Value.LockSpawn).Any(ss =>
{
var pr = PlayerReferenceForSlot(server, ss.Value);
return pr != null && pr.Spawn == spawnPoint;
});
if (spawnLockedByAnotherSlot)
{
server.SendOrderTo(conn, "Message", "The spawn point is locked to another player slot.");
return true;
}
}
targetClient.SpawnPoint = spawnPoint;
server.SyncLobbyClients();
return true;
@@ -1032,5 +1053,13 @@ namespace OpenRA.Mods.Common.Server
if (client.Slot == null || !server.LobbyInfo.Slots[client.Slot].LockColor)
client.Color = SanitizePlayerColor(server, client.Color, client.Index);
}
public PlayerReference PlayerReferenceForSlot(S server, Session.Slot slot)
{
if (slot == null)
return null;
return server.MapPlayers.Players[slot.PlayerReference];
}
}
}