using Content.Server.GameObjects; using Content.Server.GameObjects.Components.Power; using Content.Server.GameObjects.Components.Interactable.Tools; using Content.Server.Interfaces.GameObjects; using Content.Server.Placement; 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.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 SS14.Shared.Interfaces.Timing; using SS14.Shared.Maths; using Content.Server.GameObjects.Components.Weapon.Ranged.Hitscan; using Content.Server.GameObjects.Components.Weapon.Ranged.Projectile; using Content.Server.GameObjects.Components.Projectiles; using Content.Server.GameObjects.Components.Weapon.Melee; 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.Register(); factory.Register(); factory.RegisterReference(); factory.Register(); factory.RegisterReference(); factory.Register(); factory.Register(); factory.Register(); factory.Register(); //Power Components factory.Register(); factory.Register(); factory.RegisterReference(); factory.Register(); factory.Register(); factory.Register(); factory.Register(); //Tools factory.Register(); factory.Register(); factory.Register(); factory.Register(); factory.Register(); factory.Register(); factory.Register(); factory.Register(); factory.Register(); factory.Register(); factory.Register(); factory.Register(); factory.Register(); } /// protected override void Dispose(bool disposing) { if (disposing) { _server.RunLevelChanged -= HandleRunLevelChanged; _players.PlayerStatusChanged -= HandlePlayerStatusChanged; } base.Dispose(disposing); } private static void HandleRunLevelChanged(object sender, RunLevelChangedEventArgs args) { switch (args.NewLevel) { case ServerRunLevel.PreGame: var timing = IoCManager.Resolve(); IoCManager.Resolve().FallbackSpawnPoint = new LocalCoordinates(0, 0, GridId.DefaultGrid, new MapId(2)); var mapLoader = IoCManager.Resolve(); var mapMan = IoCManager.Resolve(); var startTime = timing.RealTime; { var newMap = mapMan.CreateMap(new MapId(2)); mapLoader.LoadBlueprint(newMap, new GridId(4), "Maps/Demo/DemoGrid.yaml"); var grid = newMap.GetGrid(new GridId(4)); SpawnHelpers.SpawnLightTurret(grid, new Vector2(-15, 15)); } var timeSpan = timing.RealTime - startTime; Logger.Info($"Loaded map in {timeSpan.TotalMilliseconds:N2}ms."); 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; } } } }