some cleanup on gecko's stuff
This commit is contained in:
@@ -59,17 +59,23 @@ namespace OpenRA.Server
|
|||||||
{
|
{
|
||||||
conns.Clear();
|
conns.Clear();
|
||||||
GameStarted = false;
|
GameStarted = false;
|
||||||
try
|
try { listener.Stop(); }
|
||||||
{
|
catch { }
|
||||||
listener.Stop();
|
|
||||||
}catch(Exception)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
E(e => e.OnServerStop(true));
|
||||||
if (Game.Settings.Server.Extension != null)
|
|
||||||
Game.Settings.Server.Extension.OnServerStop(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void E(Action<IServerExtension> f)
|
||||||
|
{
|
||||||
|
E(g => { f(g); return true; });
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool E(Func<IServerExtension, bool> f)
|
||||||
|
{
|
||||||
|
return Game.Settings.Server.Extension == null ||
|
||||||
|
f(Game.Settings.Server.Extension);
|
||||||
|
}
|
||||||
|
|
||||||
public static void ServerMain(ModData modData, Settings settings, string map)
|
public static void ServerMain(ModData modData, Settings settings, string map)
|
||||||
{
|
{
|
||||||
Log.AddChannel("server", "server.log");
|
Log.AddChannel("server", "server.log");
|
||||||
@@ -107,8 +113,7 @@ namespace OpenRA.Server
|
|||||||
throw new InvalidOperationException( "Unable to start server: port is already in use" );
|
throw new InvalidOperationException( "Unable to start server: port is already in use" );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Game.Settings.Server.Extension != null)
|
E(e => e.OnServerStart());
|
||||||
Game.Settings.Server.Extension.OnServerStart();
|
|
||||||
|
|
||||||
new Thread( _ =>
|
new Thread( _ =>
|
||||||
{
|
{
|
||||||
@@ -135,9 +140,7 @@ namespace OpenRA.Server
|
|||||||
{
|
{
|
||||||
listener.Stop();
|
listener.Stop();
|
||||||
GameStarted = false;
|
GameStarted = false;
|
||||||
|
E(e => e.OnServerStop(false));
|
||||||
if (Game.Settings.Server.Extension != null)
|
|
||||||
Game.Settings.Server.Extension.OnServerStop(false);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -166,37 +169,27 @@ namespace OpenRA.Server
|
|||||||
.Select((s, i) => { s.Index = i; return s; })
|
.Select((s, i) => { s.Index = i; return s; })
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
if (Game.Settings.Server.Extension != null)
|
E(e => e.OnLoadMap(Map));
|
||||||
Game.Settings.Server.Extension.OnLoadMap(Map);
|
|
||||||
|
|
||||||
// Generate slots for spectators
|
// Generate slots for spectators
|
||||||
for (int i = 0; i < MaxSpectators; i++)
|
for (int i = 0; i < MaxSpectators; i++)
|
||||||
{
|
lobbyInfo.Slots.Add(new Session.Slot
|
||||||
lobbyInfo.Slots.Add(new Session.Slot { Spectator = true, Index = lobbyInfo.Slots.Count(), MapPlayer = null, Bot = null});
|
{
|
||||||
}
|
Spectator = true,
|
||||||
|
Index = lobbyInfo.Slots.Count(),
|
||||||
|
MapPlayer = null,
|
||||||
|
Bot = null
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/* lobby rework todo:
|
/* lobby rework todo:
|
||||||
*
|
|
||||||
* - auto-assign players to slots
|
|
||||||
* - show all the slots in the lobby ui.
|
|
||||||
* - rework the game start so we actually use the slots.
|
|
||||||
* - all players should be able to click an empty slot to move to it
|
|
||||||
* - host should be able to choose whether a slot is open/closed/bot, with
|
|
||||||
* potentially more than one choice of bot class.
|
|
||||||
* - host should be able to kick a client from the lobby by closing its slot.
|
|
||||||
* - change lobby commands so the host can configure bots, rather than
|
|
||||||
* just configuring itself.
|
|
||||||
* - "teams together" option for team games -- will eliminate most need
|
* - "teams together" option for team games -- will eliminate most need
|
||||||
* for manual spawnpoint choosing.
|
* for manual spawnpoint choosing.
|
||||||
* - pick sensible non-conflicting colors for bots.
|
* - 256 max players is a dirty hack
|
||||||
*/
|
*/
|
||||||
/// <summary>
|
|
||||||
/// @todo The 256 is a big hack, need to look @ amount of available slots instead?
|
|
||||||
/// </summary>
|
|
||||||
static int ChooseFreePlayerIndex()
|
static int ChooseFreePlayerIndex()
|
||||||
{
|
{
|
||||||
for (var i = 0; i < 256; i++) // 256 was 8, but thats bit low
|
for (var i = 0; i < 256; i++)
|
||||||
if (conns.All(c => c.PlayerIndex != i))
|
if (conns.All(c => c.PlayerIndex != i))
|
||||||
return i;
|
return i;
|
||||||
|
|
||||||
@@ -228,7 +221,7 @@ namespace OpenRA.Server
|
|||||||
var newConn = new Connection { socket = newSocket };
|
var newConn = new Connection { socket = newSocket };
|
||||||
|
|
||||||
|
|
||||||
if (Game.Settings.Server.Extension != null && !Game.Settings.Server.Extension.OnValidateConnection(GameStarted, newConn))
|
if (!E(e => e.OnValidateConnection(GameStarted, newConn)))
|
||||||
{
|
{
|
||||||
DropClient(newConn, new Exception() );
|
DropClient(newConn, new Exception() );
|
||||||
|
|
||||||
@@ -397,7 +390,7 @@ namespace OpenRA.Server
|
|||||||
DispatchOrders(null, 0,
|
DispatchOrders(null, 0,
|
||||||
new ServerOrder("StartGame", "").Serialize());
|
new ServerOrder("StartGame", "").Serialize());
|
||||||
|
|
||||||
if (Game.Settings.Server.Extension != null) Game.Settings.Server.Extension.OnStartGame();
|
E(e => e.OnStartGame());
|
||||||
|
|
||||||
PingMasterServer();
|
PingMasterServer();
|
||||||
return true;
|
return true;
|
||||||
@@ -407,10 +400,9 @@ namespace OpenRA.Server
|
|||||||
{
|
{
|
||||||
Log.Write("server", "Player@{0} is now known as {1}", conn.socket.RemoteEndPoint, s);
|
Log.Write("server", "Player@{0} is now known as {1}", conn.socket.RemoteEndPoint, s);
|
||||||
|
|
||||||
if (Game.Settings.Server.Extension == null || Game.Settings.Server.Extension.OnNickChange(conn, GetClient(conn), s))
|
if (E(e => e.OnNickChange(conn, GetClient(conn), s)))
|
||||||
GetClient(conn).Name = s;
|
GetClient(conn).Name = s;
|
||||||
|
|
||||||
|
|
||||||
SyncLobbyInfo();
|
SyncLobbyInfo();
|
||||||
return true;
|
return true;
|
||||||
}},
|
}},
|
||||||
@@ -429,7 +421,7 @@ namespace OpenRA.Server
|
|||||||
{ "race",
|
{ "race",
|
||||||
s =>
|
s =>
|
||||||
{
|
{
|
||||||
if (Game.Settings.Server.Extension == null || Game.Settings.Server.Extension.OnRaceChange(conn, GetClient(conn), s))
|
if (E(e => e.OnRaceChange(conn, GetClient(conn), s)))
|
||||||
GetClient(conn).Country = s;
|
GetClient(conn).Country = s;
|
||||||
|
|
||||||
SyncLobbyInfo();
|
SyncLobbyInfo();
|
||||||
@@ -444,11 +436,11 @@ namespace OpenRA.Server
|
|||||||
|
|
||||||
var cl = GetClient(conn);
|
var cl = GetClient(conn);
|
||||||
|
|
||||||
if (Game.Settings.Server.Extension == null || Game.Settings.Server.Extension.OnSlotChange(conn, cl, slotData, Map))
|
if (E(e => e.OnSlotChange(conn, cl, slotData, Map)))
|
||||||
{
|
{
|
||||||
cl.Slot = slotData.Index;
|
cl.Slot = slotData.Index;
|
||||||
|
SyncClientToPlayerReference(cl, slotData.MapPlayer != null
|
||||||
SyncClientToPlayerReference(cl, slotData.MapPlayer != null ? Map.Players[slotData.MapPlayer] : null);
|
? Map.Players[slotData.MapPlayer] : null);
|
||||||
}
|
}
|
||||||
|
|
||||||
SyncLobbyInfo();
|
SyncLobbyInfo();
|
||||||
@@ -459,7 +451,7 @@ namespace OpenRA.Server
|
|||||||
{
|
{
|
||||||
int team;
|
int team;
|
||||||
if (!int.TryParse(s, out team)) { Log.Write("server", "Invalid team: {0}", s ); return false; }
|
if (!int.TryParse(s, out team)) { Log.Write("server", "Invalid team: {0}", s ); return false; }
|
||||||
if (Game.Settings.Server.Extension == null || Game.Settings.Server.Extension.OnTeamChange(conn, GetClient(conn), team))
|
if (E(e => e.OnTeamChange(conn, GetClient(conn), team)))
|
||||||
{
|
{
|
||||||
GetClient(conn).Team = team;
|
GetClient(conn).Team = team;
|
||||||
}
|
}
|
||||||
@@ -481,7 +473,7 @@ namespace OpenRA.Server
|
|||||||
SendChatTo( conn, "You can't be at the same spawn point as another player" );
|
SendChatTo( conn, "You can't be at the same spawn point as another player" );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (Game.Settings.Server.Extension == null || Game.Settings.Server.Extension.OnSpawnpointChange(conn, GetClient(conn), spawnPoint))
|
if (E(e => e.OnSpawnpointChange(conn, GetClient(conn), spawnPoint)))
|
||||||
{
|
{
|
||||||
GetClient(conn).SpawnPoint = spawnPoint;
|
GetClient(conn).SpawnPoint = spawnPoint;
|
||||||
}
|
}
|
||||||
@@ -492,11 +484,13 @@ namespace OpenRA.Server
|
|||||||
s =>
|
s =>
|
||||||
{
|
{
|
||||||
var c = s.Split(',').Select(cc => int.Parse(cc)).ToArray();
|
var c = s.Split(',').Select(cc => int.Parse(cc)).ToArray();
|
||||||
|
var c1 = Color.FromArgb(c[0], c[1], c[2]);
|
||||||
|
var c2 = Color.FromArgb(c[3], c[4], c[5]);
|
||||||
|
|
||||||
if (Game.Settings.Server.Extension == null || Game.Settings.Server.Extension.OnColorChange(conn, GetClient(conn), Color.FromArgb(c[0], c[1], c[2]), Color.FromArgb(c[3], c[4], c[5])))
|
if (E(e => e.OnColorChange(conn, GetClient(conn), c1, c2)))
|
||||||
{
|
{
|
||||||
GetClient(conn).Color1 = Color.FromArgb(c[0], c[1], c[2]);
|
GetClient(conn).Color1 = c1;
|
||||||
GetClient(conn).Color2 = Color.FromArgb(c[3], c[4], c[5]);
|
GetClient(conn).Color2 = c2;
|
||||||
}
|
}
|
||||||
SyncLobbyInfo();
|
SyncLobbyInfo();
|
||||||
return true;
|
return true;
|
||||||
@@ -514,11 +508,11 @@ namespace OpenRA.Server
|
|||||||
|
|
||||||
var cl = GetClient(conn);
|
var cl = GetClient(conn);
|
||||||
|
|
||||||
if (Game.Settings.Server.Extension == null || Game.Settings.Server.Extension.OnSlotChange(conn, cl, slotData, Map))
|
if (E(e => e.OnSlotChange(conn, cl, slotData, Map)))
|
||||||
{
|
{
|
||||||
cl.Slot = slot;
|
cl.Slot = slot;
|
||||||
|
SyncClientToPlayerReference(cl, slotData.MapPlayer != null
|
||||||
SyncClientToPlayerReference(cl, slotData.MapPlayer != null ? Map.Players[slotData.MapPlayer] : null);
|
? Map.Players[slotData.MapPlayer] : null);
|
||||||
}
|
}
|
||||||
|
|
||||||
SyncLobbyInfo();
|
SyncLobbyInfo();
|
||||||
@@ -627,15 +621,6 @@ namespace OpenRA.Server
|
|||||||
client.State = Session.ClientState.NotReady;
|
client.State = Session.ClientState.NotReady;
|
||||||
}
|
}
|
||||||
|
|
||||||
SyncLobbyInfo();
|
|
||||||
return true;
|
|
||||||
}},
|
|
||||||
{ "mods",
|
|
||||||
s =>
|
|
||||||
{
|
|
||||||
var args = s.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();
|
|
||||||
lobbyInfo.GlobalSettings.Mods = args.GetRange(0,args.Count - 1).ToArray();
|
|
||||||
lobbyInfo.GlobalSettings.Map = args.Last();
|
|
||||||
SyncLobbyInfo();
|
SyncLobbyInfo();
|
||||||
return true;
|
return true;
|
||||||
}},
|
}},
|
||||||
@@ -696,7 +681,7 @@ namespace OpenRA.Server
|
|||||||
|
|
||||||
case "Chat":
|
case "Chat":
|
||||||
case "TeamChat":
|
case "TeamChat":
|
||||||
if (Game.Settings.Server.Extension == null || Game.Settings.Server.Extension.OnChat(conn, so.Data, so.Name == "TeamChat"))
|
if (E(e => e.OnChat(conn, so.Data, so.Name == "TeamChat")))
|
||||||
foreach (var c in conns.Except(conn).ToArray())
|
foreach (var c in conns.Except(conn).ToArray())
|
||||||
DispatchOrdersToClient(c, GetClient(conn).Index, 0, so.Serialize());
|
DispatchOrdersToClient(c, GetClient(conn).Index, 0, so.Serialize());
|
||||||
break;
|
break;
|
||||||
@@ -723,8 +708,7 @@ namespace OpenRA.Server
|
|||||||
|
|
||||||
static void SyncLobbyInfo()
|
static void SyncLobbyInfo()
|
||||||
{
|
{
|
||||||
if (Game.Settings.Server.Extension != null)
|
E(e => e.OnLobbySync(lobbyInfo, GameStarted));
|
||||||
Game.Settings.Server.Extension.OnLobbySync(lobbyInfo, GameStarted);
|
|
||||||
|
|
||||||
if (!GameStarted) /* don't do this while the game is running, it breaks things. */
|
if (!GameStarted) /* don't do this while the game is running, it breaks things. */
|
||||||
DispatchOrders(null, 0,
|
DispatchOrders(null, 0,
|
||||||
@@ -739,7 +723,7 @@ namespace OpenRA.Server
|
|||||||
{
|
{
|
||||||
if (isBusy || !isInternetServer) return;
|
if (isBusy || !isInternetServer) return;
|
||||||
|
|
||||||
if (Game.Settings.Server.Extension != null && !Game.Settings.Server.Extension.OnPingMasterServer(lobbyInfo, GameStarted))
|
if (!E(e => e.OnPingMasterServer(lobbyInfo, GameStarted)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
lastPing = Environment.TickCount;
|
lastPing = Environment.TickCount;
|
||||||
|
|||||||
Reference in New Issue
Block a user