diff --git a/.gitmodules b/.gitmodules index c35f42dd32..fbe168edb7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "engine"] path = engine url = https://github.com/space-wizards/space-station-14.git - branch = 054fcd931d165889c0979c4c1f849f38719883b5 \ No newline at end of file + branch = 3ccb252a968e1ded9310bdf9c1805d3364b81adb \ No newline at end of file diff --git a/Content.Client/UserInterface/HandsGui.cs b/Content.Client/UserInterface/HandsGui.cs index f786c044bf..6b1728fdd0 100644 --- a/Content.Client/UserInterface/HandsGui.cs +++ b/Content.Client/UserInterface/HandsGui.cs @@ -55,12 +55,12 @@ namespace Content.Client.UserInterface protected override void DrawContents() { - if (_playerManager?.ControlledEntity == null) + if (_playerManager?.LocalPlayer.ControlledEntity == null) { return; } - IEntity entity = _playerManager.ControlledEntity; + IEntity entity = _playerManager.LocalPlayer.ControlledEntity; if (!entity.TryGetComponent(out var hands)) { return; @@ -99,12 +99,12 @@ namespace Content.Client.UserInterface public void UpdateHandIcons() { - if (_playerManager?.ControlledEntity == null) + if (_playerManager?.LocalPlayer.ControlledEntity == null) { return; } - IEntity entity = _playerManager.ControlledEntity; + IEntity entity = _playerManager.LocalPlayer.ControlledEntity; if (!entity.TryGetComponent(out var hands)) { return; @@ -144,7 +144,7 @@ namespace Content.Client.UserInterface private void SendSwitchHandTo(string index) { - IEntity entity = _playerManager.ControlledEntity; + IEntity entity = _playerManager.LocalPlayer.ControlledEntity; if (!entity.TryGetComponent(out var hands)) { return; diff --git a/Content.Server/EntryPoint.cs b/Content.Server/EntryPoint.cs index 2be573d8ce..1463a8508c 100644 --- a/Content.Server/EntryPoint.cs +++ b/Content.Server/EntryPoint.cs @@ -1,16 +1,46 @@ -using Content.Server.GameObjects; + +using Content.Server.GameObjects; using Content.Server.Interfaces.GameObjects; +using SS14.Server; +using SS14.Server.Interfaces; +using SS14.Server.Interfaces.Chat; +using SS14.Server.Interfaces.Maps; using SS14.Server.Interfaces.Player; +using SS14.Server.Player; +using SS14.Shared; +using SS14.Shared.Console; using SS14.Shared.ContentPack; +using SS14.Shared.Enums; using SS14.Shared.Interfaces.GameObjects; +using SS14.Shared.Interfaces.Map; +using SS14.Shared.Interfaces.Timers; using SS14.Shared.IoC; +using SS14.Shared.Log; +using SS14.Shared.Map; +using SS14.Shared.Timers; +using System.Diagnostics; namespace Content.Server { public class EntryPoint : GameServer { + private IBaseServer _server; + private IPlayerManager _players; + + private bool _countdownStarted; + + /// public override void Init() { + base.Init(); + + _server = IoCManager.Resolve(); + _players = IoCManager.Resolve(); + + _server.RunLevelChanged += HandleRunLevelChanged; + _players.PlayerStatusChanged += HandlePlayerStatusChanged; + _players.PlayerPrototypeName = "HumanMob_Content"; + var factory = IoCManager.Resolve(); factory.Register(); @@ -29,9 +59,118 @@ namespace Content.Server factory.Register(); factory.Register(); factory.Register(); - - var playerManager = IoCManager.Resolve(); - playerManager.PlayerPrototypeName = "HumanMob_Content"; } + + /// + public override void Dispose() + { + _server.RunLevelChanged -= HandleRunLevelChanged; + _players.PlayerStatusChanged -= HandlePlayerStatusChanged; + + base.Dispose(); + } + + private void HandleRunLevelChanged(object sender, RunLevelChangedEventArgs args) + { + switch (args.NewLevel) + { + case ServerRunLevel.PreGame: + IoCManager.Resolve().FallbackSpawnPoint = new LocalCoordinates(0, 0, GridId.DefaultGrid, new MapId(1)); + NewDemoGrid(new GridId(1), new MapId(1)); + + IoCManager.Resolve().DispatchMessage(ChatChannel.Server, "Gamemode: Round loaded!"); + break; + case ServerRunLevel.Game: + IoCManager.Resolve().SendJoinGameToAll(); + IoCManager.Resolve().DispatchMessage(ChatChannel.Server, "Gamemode: Round started!"); + break; + case ServerRunLevel.PostGame: + IoCManager.Resolve().DispatchMessage(ChatChannel.Server, "Gamemode: Round over!"); + break; + } + } + + private void HandlePlayerStatusChanged(object sender, SessionStatusEventArgs args) + { + switch (args.NewStatus) + { + case SessionStatus.Connected: + { + // timer time must be > tick length + IoCManager.Resolve().AddTimer(new Timer(250, false, () => + { + args.Session.JoinLobby(); + })); + IoCManager.Resolve().DispatchMessage(ChatChannel.Server, "Gamemode: Player joined server!", args.Session.Index); + } + break; + + case SessionStatus.InLobby: + { + // auto start game when first player joins + if (_server.RunLevel == ServerRunLevel.PreGame && !_countdownStarted) + { + _countdownStarted = true; + IoCManager.Resolve().AddTimer(new Timer(2000, false, () => + { + _server.RunLevel = ServerRunLevel.Game; + _countdownStarted = false; + })); + } + + IoCManager.Resolve().DispatchMessage(ChatChannel.Server, "Gamemode: Player joined Lobby!", args.Session.Index); + } + break; + + case SessionStatus.InGame: + { + //TODO: Check for existing mob and re-attach + IoCManager.Resolve().SpawnPlayerMob(args.Session); + + IoCManager.Resolve().DispatchMessage(ChatChannel.Server, "Gamemode: Player joined Game!", args.Session.Index); + } + break; + + case SessionStatus.Disconnected: + { + IoCManager.Resolve().DispatchMessage(ChatChannel.Server, "Gamemode: Player left!", args.Session.Index); + } + break; + } + } + + //TODO: This whole method should be removed once file loading/saving works, and replaced with a 'Demo' map. + /// + /// Generates 'Demo' grid and inserts it into the map manager. + /// + private void NewDemoGrid(GridId gridId, MapId mapId) + { + var mapManager = IoCManager.Resolve(); + var defManager = IoCManager.Resolve(); + + mapManager.SuppressOnTileChanged = true; + + Logger.Log("Cannot find map. Generating blank map.", LogLevel.Warning); + var floor = defManager["Floor"].TileId; + + Debug.Assert(floor > 0); + + var map = mapManager.CreateMap(mapId); + var grid = map.CreateGrid(gridId); + + for (var y = -32; y <= 32; ++y) + { + for (var x = -32; x <= 32; ++x) + { + grid.SetTile(new LocalCoordinates(x, y, gridId, mapId), new Tile(floor)); + } + } + + // load entities + IoCManager.Resolve().Load(_server.MapName, map); + + mapManager.SuppressOnTileChanged = false; + } + } } diff --git a/Content.Server/GameObjects/Components/Items/ServerHandsComponent.cs b/Content.Server/GameObjects/Components/Items/ServerHandsComponent.cs index 6c5e3b8447..b60b8e4897 100644 --- a/Content.Server/GameObjects/Components/Items/ServerHandsComponent.cs +++ b/Content.Server/GameObjects/Components/Items/ServerHandsComponent.cs @@ -9,6 +9,7 @@ using System; using System.Collections.Generic; using YamlDotNet.RepresentationModel; using Lidgren.Network; +using SS14.Shared.Enums; namespace Content.Server.GameObjects { @@ -257,7 +258,7 @@ namespace Content.Server.GameObjects ActiveIndex = orderedHands[index]; } - public override void HandleNetworkMessage(IncomingEntityComponentMessage message, NetConnection sender) + public override void HandleNetworkMessage(IncomingEntityComponentMessage message) { if (message.MessageParameters.Count != 1) { @@ -268,7 +269,7 @@ namespace Content.Server.GameObjects { ActiveIndex = newIndex; } - base.HandleNetworkMessage(message, sender); + base.HandleNetworkMessage(message); } } } diff --git a/engine b/engine index 59b2df97d8..3ccb252a96 160000 --- a/engine +++ b/engine @@ -1 +1 @@ -Subproject commit 59b2df97d8c11d54733ad461ec2036eaf35d6eae +Subproject commit 3ccb252a968e1ded9310bdf9c1805d3364b81adb