Reset slot configuration when all players leave a dedicated server.

This commit is contained in:
Paul Chote
2016-12-08 20:56:13 +00:00
parent 7827d50e99
commit 1153cd2f7c
3 changed files with 20 additions and 4 deletions

View File

@@ -590,8 +590,10 @@ namespace OpenRA.Server
DispatchOrders(toDrop, frame, new byte[] { 0xbf }); DispatchOrders(toDrop, frame, new byte[] { 0xbf });
// All clients have left: clean up
if (!Conns.Any()) if (!Conns.Any())
TempBans.Clear(); foreach (var t in serverTraits.WithInterface<INotifyServerEmpty>())
t.ServerEmpty(this);
if (Conns.Any() || Dedicated) if (Conns.Any() || Dedicated)
SyncLobbyClients(); SyncLobbyClients();

View File

@@ -18,6 +18,7 @@ namespace OpenRA.Server
public interface IInterpretCommand { bool InterpretCommand(Server server, Connection conn, Session.Client client, string cmd); } public interface IInterpretCommand { bool InterpretCommand(Server server, Connection conn, Session.Client client, string cmd); }
public interface INotifySyncLobbyInfo { void LobbyInfoSynced(Server server); } public interface INotifySyncLobbyInfo { void LobbyInfoSynced(Server server); }
public interface INotifyServerStart { void ServerStarted(Server server); } public interface INotifyServerStart { void ServerStarted(Server server); }
public interface INotifyServerEmpty { void ServerEmpty(Server server); }
public interface INotifyServerShutdown { void ServerShutdown(Server server); } public interface INotifyServerShutdown { void ServerShutdown(Server server); }
public interface IStartGame { void GameStarted(Server server); } public interface IStartGame { void GameStarted(Server server); }
public interface IClientJoined { void ClientJoined(Server server, Connection conn); } public interface IClientJoined { void ClientJoined(Server server, Connection conn); }

View File

@@ -11,9 +11,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing;
using System.Linq; using System.Linq;
using System.Threading;
using OpenRA.Graphics; using OpenRA.Graphics;
using OpenRA.Mods.Common.Traits; using OpenRA.Mods.Common.Traits;
using OpenRA.Network; using OpenRA.Network;
@@ -23,7 +21,7 @@ using S = OpenRA.Server.Server;
namespace OpenRA.Mods.Common.Server namespace OpenRA.Mods.Common.Server
{ {
public class LobbyCommands : ServerTrait, IInterpretCommand, INotifyServerStart, IClientJoined public class LobbyCommands : ServerTrait, IInterpretCommand, INotifyServerStart, INotifyServerEmpty, IClientJoined
{ {
static bool ValidateSlotCommand(S server, Connection conn, Session.Client client, string arg, bool requiresHost) static bool ValidateSlotCommand(S server, Connection conn, Session.Client client, string arg, bool requiresHost)
{ {
@@ -871,6 +869,21 @@ namespace OpenRA.Mods.Common.Server
server.SendOrderTo(conn, "Message", briefing); server.SendOrderTo(conn, "Message", briefing);
} }
void INotifyServerEmpty.ServerEmpty(S server)
{
// Expire any temporary bans
server.TempBans.Clear();
// Re-enable spectators
server.LobbyInfo.GlobalSettings.AllowSpectators = true;
// Reset player slots
server.LobbyInfo.Slots = server.Map.Players.Players
.Select(p => MakeSlotFromPlayerReference(p.Value))
.Where(ss => ss != null)
.ToDictionary(ss => ss.PlayerReference, ss => ss);
}
public PlayerReference PlayerReferenceForSlot(S server, Session.Slot slot) public PlayerReference PlayerReferenceForSlot(S server, Session.Slot slot)
{ {
if (slot == null) if (slot == null)