using Microsoft.Xna.Framework; using MonogameLibrary.UI.Elements; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Text.Json; using System.Threading.Tasks; using ZoFo.GameCore.GameManagers; using ZoFo.GameCore.GameManagers.CollisionManager; using ZoFo.GameCore.GameManagers.MapManager; using ZoFo.GameCore.GameManagers.NetworkManager; using ZoFo.GameCore.GameManagers.NetworkManager.Updates; using ZoFo.GameCore.GameManagers.NetworkManager.Updates.ServerToClient; using ZoFo.GameCore.GameObjects; using ZoFo.GameCore.GameObjects.Entities; using ZoFo.GameCore.GameObjects.Entities.LivingEntities.Enemies; using ZoFo.GameCore.GameObjects.Entities.LivingEntities.Player; using ZoFo.GameCore.GameObjects.MapObjects; namespace ZoFo.GameCore { public class Server { private ServerNetworkManager networkManager; private int ticks = 0; public IPEndPoint MyIp { get { return networkManager.InfoConnect; } } public Server() { networkManager = new ServerNetworkManager(); networkManager.GetDataSend += OnDataSend; collisionManager = new CollisionManager(); } #region server logic as App #region Net Methods //TODO Comment pls public void OnDataSend(string data) { List updateDatas = JsonSerializer.Deserialize>(data); for (int i = 0; i < updateDatas.Count; i++) { ProcessIUpdateData(updateDatas[i]); } } /// /// Обработка апдейтсов, которые нам прислал клиент /// /// public void ProcessIUpdateData(UpdateData updateData) { //ТУТ Switch case будет честное слово } public void CloseConnection() { networkManager.CloseConnection(); } /// /// Для красоты) Отдел Серверов /// добавляет в лист updates новую data /// /// public void AddData(UpdateData data)//добавляет в лист updates новую data { networkManager.AddData(data); } /// /// Создает комнату и запускает ожидание подключений /// /// public void CreateRoom(int players) { networkManager.Start(players); } #endregion #region Game Methods public CollisionManager collisionManager; /// /// Запуск игры в комнате /// public void StartGame() { //TODO начинает рассылку и обмен пакетами игры //Грузит карту collisionManager = new CollisionManager(); gameObjects = new List(); entities = new List(); //new MapManager().LoadMap(); AppManager.Instance.server.RegisterGameObject(new EntittyForAnimationTests(new Vector2(40, 40))); AppManager.Instance.server.RegisterGameObject(new Player(new Vector2(140, 140))); } /// /// Добавляет UpdateGameEnded и отключает игроков /// public void EndGame() { UpdateGameEnded gameEnded = new UpdateGameEnded(); networkManager.AddData(gameEnded); networkManager.CloseConnection(); } private List gameObjects = new List(); private List entities; //entity public void Update(GameTime gameTime) { if (ticks == 3) //ОБРАБАТЫВАЕТСЯ 20 РАЗ В СЕКУНДУ { foreach (var go in gameObjects) { go.UpdateLogic(); } collisionManager.UpdatePositions(); ticks = 0; networkManager.SendData(); } ticks++; } /// /// Регистрирует игровой объект /// /// public void RegisterGameObject(GameObject gameObject) { gameObjects.Add(gameObject); if (gameObject is MapObject) { AddData(new UpdateTileCreated() { Position = (gameObject as MapObject).position, sourceRectangle = (gameObject as MapObject).sourceRectangle, Size = (gameObject as MapObject).graphicsComponent.ObjectDrawRectangle.Size, tileSetName = (gameObject as MapObject).graphicsComponent.mainTextureName });//TODO return; } if (gameObject is Entity) { AddData(new UpdateGameObjectCreated() { GameObjectType = gameObject.GetType().Name, IdEntity = (gameObject as Entity).Id }); collisionManager.Register((gameObject as Entity).collisionComponent); } else AddData(new UpdateGameObjectCreated() { GameObjectType = gameObject.GetType().Name }); ////var elems = gameObject.GetType().GetProperties(System.Reflection.BindingFlags.Public); ////if (elems.Count()>0) TODO ////{ //// AppManager.Instance.server.collisionManager.Register((elems.First().GetValue(gameObject) as CollisionComponent)); ////} } /// /// Удаляет игровой объект /// /// public void DeleteObject(GameObject gameObject) { gameObjects.Remove(gameObject); AddData(new UpdateGameObjectDeleted() { GameObjectType = gameObject.GetType().Name} ); } } #endregion #endregion }