Merge pull request #10885 from pchote/fix-partially-locked-slots
Prevent locked spawns from being selected by other players.
This commit is contained in:
@@ -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];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user