diff --git a/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs b/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs index 71c6049167..feb026946f 100644 --- a/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs +++ b/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs @@ -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]; + } } }