/// <summary> /// Removes an returns an action from this queue. /// </summary> /// <returns>Removed Action</returns> public Core.Models.Action Dequeue() { try { m_lock.WaitOne(); var action = m_queue.Dequeue(); action.ActionTime = DateTime.Now; var actionC = (Core.Controllers.Actions.Action)action.Control; var actionPosition = new Core.Models.Position(actionC.GetRegionPosition()); var newAverageX = (m_average.X * (m_queue.Count + 1)) - actionPosition.X; var newAverageY = (m_average.Y * (m_queue.Count + 1)) - actionPosition.Y; if (!IsEmpty()) { m_average = new Core.Models.Position(newAverageX / m_queue.Count, newAverageY / m_queue.Count); } return action; } finally { m_lock.ReleaseMutex(); } }
/// <summary> /// Initializes a new instance of the <see cref="Server.Models.AveragePositionQueue"/> class. /// </summary> public AveragePositionQueue() { m_average = new Core.Models.Position(0, 0); m_lock = new Mutex(); m_queue = new Queue<Core.Models.Action>(); }
/// <summary> /// Initializes a new instance of the <see cref="Core.Connections.LoginRequest"/> class. /// </summary> /// <param name="position">Position where the user is standing (converted GPS information).</param> /// <param name="username">User Name.</param> /// <param name="password">Password of the user.</param> public LoginRequest(Core.Models.Position position, string username, string password) : base(Guid.Empty, position) { Username = username; Password = password; }
/// <summary> /// Do somthing for tests. /// </summary> public void DeveloperFunction() { GameAppDelegate.Account.Scrap.MaximumValue = 1000; GameAppDelegate.Account.Plutonium.MaximumValue = 1000; GameAppDelegate.Account.Population.MaximumValue = 1000; GameAppDelegate.Account.Technology.MaximumValue = 1000; GameAppDelegate.Account.Energy.MaximumValue = 1000; GameAppDelegate.Account.Scrap.Set(DateTime.Now, 1000, 0); GameAppDelegate.Account.Plutonium.Set(DateTime.Now, 1000, 0); GameAppDelegate.Account.Population.Value = 1000; GameAppDelegate.Account.Technology.Set(DateTime.Now, 1000, 0); GameAppDelegate.Account.Energy.Value = 1000; var account = new Core.Models.Account(GameAppDelegate.Account.ID + 1); new Core.Models.AccountManager().AddAccount(account); var pos = Models.Geolocation.Instance.CurrentGamePosition; // var posI = new Core.Models.PositionI(pos.RegionPosition, pos.CellPosition); var actionCreate = Helper.ActionHelper.CreateEntity( new Core.Models.PositionI(pos), Core.Models.World.Instance.DefinitionManager.GetDefinition(Core.Models.Definitions.EntityType.Headquarter), account); m_gameScene.WorldLayerHex.DoAction(actionCreate); account.Scrap.MaximumValue = 10000; account.Plutonium.MaximumValue = 10000; account.Population.MaximumValue = 10000; account.Technology.MaximumValue = 10000; account.Energy.MaximumValue = 10000; account.Scrap.Set(DateTime.Now, 10000, 0); account.Plutonium.Set(DateTime.Now, 10000, 0); account.Population.Value = 10000; account.Technology.Set(DateTime.Now, 10000, 0); account.Energy.Value = 10000; var newPos = new Core.Models.Position(pos.RegionPosition, new Core.Models.CellPosition((int)pos.X + 2, (int)pos.Y + 2)); var actioncreate2 = Helper.ActionHelper.CreateEntity( new Core.Models.PositionI(newPos), Core.Models.World.Instance.DefinitionManager.GetDefinition(Core.Models.Definitions.EntityType.Barracks), account); m_gameScene.WorldLayerHex.DoAction(actioncreate2); var actioncr = Helper.ActionHelper.CreateEntity( new Core.Models.PositionI(newPos), new Core.Models.Definitions.Definition((int)Core.Models.Definitions.EntityType.Archer), account); var actioncr2 = Helper.ActionHelper.CreateEntity( new Core.Models.PositionI(newPos), new Core.Models.Definitions.Definition((int)Core.Models.Definitions.EntityType.Fencer), account); m_gameScene.WorldLayerHex.DoAction(actioncr); m_gameScene.WorldLayerHex.DoAction(actioncr2); var newBorderpos = new Core.Models.Position(pos.RegionPosition, new Core.Models.CellPosition((int)pos.X - 4, (int)pos.Y)); var newBorderpos2 = new Core.Models.Position(pos.RegionPosition, new Core.Models.CellPosition((int)pos.X, (int)pos.Y - 4)); var actioncreate3 = Helper.ActionHelper.CreateEntity( new Core.Models.PositionI(newBorderpos), Core.Models.World.Instance.DefinitionManager.GetDefinition(Core.Models.Definitions.EntityType.GuardTower), account); m_gameScene.WorldLayerHex.DoAction(actioncreate3); var actioncreate4 = Helper.ActionHelper.CreateEntity( new Core.Models.PositionI(newBorderpos2), Core.Models.World.Instance.DefinitionManager.GetDefinition(Core.Models.Definitions.EntityType.GuardTower), account); m_gameScene.WorldLayerHex.DoAction(actioncreate4); var newLabpos = new Core.Models.Position(pos.RegionPosition, new Core.Models.CellPosition((int)newBorderpos.X - 1, (int)newBorderpos.Y)); var actioncreate5 = Helper.ActionHelper.CreateEntity( new Core.Models.PositionI(newLabpos), Core.Models.World.Instance.DefinitionManager.GetDefinition(Core.Models.Definitions.EntityType.Lab), account); m_gameScene.WorldLayerHex.DoAction(actioncreate5); }
/// <summary> /// Enqueue the specified action. /// </summary> /// <param name="action">Action which should be executed.</param> public void Enqueue(Core.Models.Action action) { try { var actionC = (Core.Controllers.Actions.Action)action.Control; var actionPosition = new Core.Models.Position(actionC.GetRegionPosition()); m_lock.WaitOne(); var newAverageX = (m_average.X * m_queue.Count) + actionPosition.X; var newAverageY = (m_average.Y * m_queue.Count) + actionPosition.Y; m_queue.Enqueue(action); m_average = new Core.Models.Position(newAverageX / m_queue.Count, newAverageY / m_queue.Count); } finally { m_lock.ReleaseMutex(); } }
/// <summary> /// Initializes a new instance of the <see cref="Core.Connections.LoadRegionsRequest"/> class. /// </summary> /// <param name="sessionID">Session ID of the user.</param> /// <param name="position">Position where the user is standing (converted GPS information).</param> /// <param name="regionPositions">Region positions.</param> public LoadRegionsRequest(Guid sessionID, Core.Models.Position position, Core.Models.RegionPosition[] regionPositions) : base(sessionID, position) { RegionPositions = regionPositions; }
/// <summary> /// Send Actions the server so they will be executed. /// (but first, the actions have to wait in a queue) /// </summary> /// <param name="account">Account who wants the actions executed.</param> /// <param name="actions">Array of Actions which should be executed.</param> public void DoAction(Core.Models.Account account, Core.Models.Action[] actions) { foreach (var action in actions) { var bestThread = m_threads[0]; action.Account = account; action.ActionTime = DateTime.Now; var actionC = (Core.Controllers.Actions.Action)action.Control; var actionPosition = new Core.Models.Position(actionC.GetRegionPosition()); for (int queueNr = 0; queueNr < Models.ServerConstants.ACTION_THREADS; ++queueNr) { var thread = m_threads[queueNr]; if (thread.IsEmpty()) { bestThread = thread; break; } else if (thread.Distance(actionPosition) < bestThread.Distance(actionPosition)) { bestThread = thread; } } bestThread.Enqueue(action); } }
/// <summary> /// Initializes a new instance of the <see cref="Core.Connections.DoActionsRequest"/> class. /// </summary> /// <param name="sessionID">Session ID of the user.</param> /// <param name="position">Position where the user is standing (converted GPS information).</param> /// <param name="actions">Actions which should be executed.</param> public DoActionsRequest(Guid sessionID, Core.Models.Position position, Core.Models.Action[] actions) : base(sessionID, position) { Actions = actions; }
/// <summary> /// Initializes a new instance of the <see cref="Core.Connections.Request"/> class. /// </summary> /// <param name="sessionID">Session ID of the user.</param> /// <param name="position">Position where the user is standing (converted GPS information).</param> public Request(Guid sessionID, Core.Models.Position position) { Position = position; SessionID = sessionID; }