using Content.Server.GameObjects; using Content.Server.GameObjects.Components; 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; using Content.Server.GameObjects.Components.Materials; using Content.Server.GameObjects.Components.Stack; using Content.Server.GameObjects.Components.Construction; using Content.Server.GameObjects.Components.Mobs; using Content.Server.GameObjects.EntitySystems; using Content.Server.Mobs; using Content.Server.Players; using Content.Server.GameObjects.Components.Interactable; using Content.Server.GameTicking; using Content.Server.Interfaces; using Content.Server.Interfaces.GameTicking; using Content.Shared.GameObjects.Components.Inventory; using Content.Shared.Interfaces; using SS14.Shared.Timing; namespace Content.Server { public class EntryPoint : GameServer { private IBaseServer _server; private IPlayerManager _players; private IChatManager chatManager; private IGameTicker _gameTicker; /// public override void Init() { base.Init(); _server = IoCManager.Resolve(); _players = IoCManager.Resolve(); chatManager = IoCManager.Resolve(); _players.PlayerStatusChanged += HandlePlayerStatusChanged; 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.RegisterReference(); factory.Register(); factory.RegisterReference(); 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(); factory.RegisterReference(); factory.Register(); factory.Register(); factory.Register(); factory.Register(); factory.Register(); factory.Register(); factory.Register(); factory.Register(); factory.RegisterIgnore("ConstructionGhost"); factory.Register(); IoCManager.Register(); IoCManager.Register(); IoCManager.Register(); IoCManager.BuildGraph(); _gameTicker = IoCManager.Resolve(); IoCManager.Resolve().Initialize(); } public override void PostInit() { base.PostInit(); _gameTicker.Initialize(); } /// protected override void Dispose(bool disposing) { if (disposing) { _players.PlayerStatusChanged -= HandlePlayerStatusChanged; } base.Dispose(disposing); } public override void Update(AssemblyLoader.UpdateLevel level, float frameTime) { base.Update(level, frameTime); _gameTicker.Update(new FrameEventArgs(frameTime)); } private void HandlePlayerStatusChanged(object sender, SessionStatusEventArgs args) { var session = args.Session; switch (args.NewStatus) { case SessionStatus.Connected: { if (session.Data.ContentDataUncast == null) { session.Data.ContentDataUncast = new PlayerData(session.SessionId); } // timer time must be > tick length Timer.Spawn(0, args.Session.JoinGame); chatManager.DispatchMessage(ChatChannel.Server, "Gamemode: Player joined server!", args.Session.SessionId); } break; case SessionStatus.InGame: { //TODO: Check for existing mob and re-attach var data = session.ContentData(); if (data.Mind == null) { // No mind yet (new session), make a new one. data.Mind = new Mind(session.SessionId); var mob = _gameTicker.SpawnPlayerMob(); data.Mind.TransferTo(mob); } else { if (data.Mind.CurrentEntity == null) { var mob = _gameTicker.SpawnPlayerMob(); data.Mind.TransferTo(mob); } session.AttachToEntity(data.Mind.CurrentEntity); } chatManager.DispatchMessage(ChatChannel.Server, "Gamemode: Player joined Game!", args.Session.SessionId); } break; case SessionStatus.Disconnected: { chatManager.DispatchMessage(ChatChannel.Server, "Gamemode: Player left!", args.Session.SessionId); } break; } } } }