From 8b9bdadf53c1123f4707519c6293fc9cb6de88bf Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 6 Mar 2016 11:24:24 +0000 Subject: [PATCH 1/2] Don't propagate locked spawns when changing slots. --- OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs b/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs index 71c6049167..96809e8189 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]); From ccdae033ff4a579282a5ef4d0764241e417917c4 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 6 Mar 2016 11:38:00 +0000 Subject: [PATCH 2/2] Prevent locked spawns from being selected. --- .../ServerTraits/LobbyCommands.cs | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs b/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs index 96809e8189..feb026946f 100644 --- a/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs +++ b/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs @@ -875,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; @@ -1037,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]; + } } }