using Content.Server.GameObjects; using Content.Server.GameObjects.Components.Power; 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(); factory.RegisterReference(); factory.Register(); factory.RegisterReference(); factory.Register(); factory.RegisterReference(); factory.Register(); factory.RegisterReference(); factory.Register(); factory.Register(); factory.Register(); factory.Register(); factory.Register(); factory.Register(); factory.Register(); factory.Register(); factory.Register(); factory.Register(); } /// 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; } } }