Exemplo n.º 1
0
        /// <summary>
        /// Currently, sendRemovalMessage should be false if a structure is killed, as it is removed on kill
        /// </summary>
        /// <param name="ID"></param>
        /// <param name="sendRemovalMessage"></param>
        public virtual void RemoveStructure(int ID, bool sendRemovalMessage)
        {
            var removedStructure = _structures[ID];

            if (removedStructure == null)
            {
                return;
            }

            ISimulatable temp;

            SimulatableObjects.TryRemove(ID, out temp);


            _structures.Remove(ID);
            _model.StructureIDs.Remove(ID);
            if (sendRemovalMessage)
            {
                var msgData = new MessageRemoveKillRevive();
                msgData.ActionType = ActionType.Remove;
                msgData.ObjectIDs.Add(ID);
                msgData.ObjectType = RemovableObjectTypes.Structure;
                BroadcastMessage(new NetworkMessageContainer(msgData, MessageTypes.RemoveKillRevive));
            }
        }
Exemplo n.º 2
0
 public void RemoveFloatyAreaObjects(MessageRemoveKillRevive data)
 {
     foreach (var id in data.ObjectIDs)
     {
         RemoveFloatyAreaObject(id);
     }
 }
Exemplo n.º 3
0
        /// <summary>
        /// Sends a revive Command to the player owning IShip s
        /// </summary>
        /// <param name="s"></param>
        public void SendReviveMessage(IShip s, int health, int shields)
        {
            Player p = s.GetPlayer();

            var data = new MessageRemoveKillRevive();

            data.ActionType = ActionType.Revive;
            data.ObjectType = RemovableObjectTypes.Ship;
            data.ObjectIDs.Add(s.Id);
            p.SendMessage(new NetworkMessageContainer(data, MessageTypes.RemoveKillRevive));
        }
Exemplo n.º 4
0
        public virtual void RemoveShip(IShip s)
        {
            _model.ShipIDs.Remove(s.Id);
            _shipCache.Remove(s.Id);

            MessageRemoveKillRevive msgData = new MessageRemoveKillRevive {
                ActionType = ActionType.Remove, ObjectType = RemovableObjectTypes.Ship
            };

            msgData.ObjectIDs.Add(s.Id);
            BroadcastMessage(new NetworkMessageContainer(msgData, MessageTypes.RemoveKillRevive));
        }
Exemplo n.º 5
0
        public virtual void RemoveShip(NPCShip npc)
        {
            ISimulatable temp;

            _model.ShipIDs.Remove(npc.Id);
            _shipCache.Remove(npc.Id);

            SimulatableObjects.TryRemove(npc.Id, out temp);

            MessageRemoveKillRevive msgData = new MessageRemoveKillRevive {
                ActionType = ActionType.Remove, ObjectType = RemovableObjectTypes.Ship
            };

            msgData.ObjectIDs.Add(npc.Id);
            BroadcastMessage(new NetworkMessageContainer(msgData, MessageTypes.RemoveKillRevive));
        }
Exemplo n.º 6
0
        public void KillTurret(Turret t)
        {
            if (t.IsDead)
            {
                return;
            }

            t.IsDead = true;

            var area = _areaLocator.GetArea(t.CurrentAreaId);

            if (area.NumOnlinePlayers > 0)
            {
                MessageRemoveKillRevive msgData = new MessageRemoveKillRevive();
                msgData.ActionType = ActionType.Kill;
                msgData.ObjectType = RemovableObjectTypes.Structure;
                msgData.ObjectIDs.Add(t.Id);
                area.BroadcastMessage(new NetworkMessageContainer(msgData, MessageTypes.RemoveKillRevive));
            }
        }
Exemplo n.º 7
0
        public virtual void RemoveFloatyAreaObjects(IEnumerable <int> objectIDs)
        {
            HashSet <int> idsRemoved = new HashSet <int>();

            foreach (var obj in objectIDs)
            {
                if (_model.FloatySpaceObjects.ContainsKey(obj))
                {
                    _model.FloatySpaceObjects.Remove(obj);
                    idsRemoved.Add(obj);
                }
            }

            if (_onlinePlayerIDs.Count > 0 && idsRemoved.Count > 0)
            {
                MessageRemoveKillRevive msgData = new MessageRemoveKillRevive {
                    ActionType = ActionType.Remove, ObjectType = RemovableObjectTypes.FloatyAreaObject, ObjectIDs = idsRemoved
                };
                BroadcastMessage(new NetworkMessageContainer(msgData, MessageTypes.RemoveKillRevive));
            }
        }
Exemplo n.º 8
0
        /// <summary>
        /// Checks messages which should only be handled if the state is active. Returns true if a message is processed.
        /// </summary>
        /// <param name="?"></param>
        /// <returns>Returns true if a message is processed.</returns>
        bool _checkActiveMessages(MessagePackSerializableObject msg, MessageTypes messageType)
        {
            // All message cases must return true to signify that a message has been processed.

            switch (messageType)
            {
                #region Change ship location

            case (MessageTypes.ChangeShipLocation):
            {
                var data = msg as MessageChangeShipLocation;

                Ship s = _clientShipManager.GetShip(data.ShipID);

                if (s == null)
                {
                    ConsoleManager.WriteLine("Warning: ShipID not found while processing ChangeShipLocation message.", ConsoleMessageType.Warning);
                    break;
                }
                s.Position       = new Vector2(data.PosX, data.PosY);
                s.LinearVelocity = new Vector2(data.VelX, data.VelY);
                s.Rotation       = data.Rotation;

                return(true);
            }

                #endregion

                #region Receieve Position Update

            case (MessageTypes.PositionUpdateData):
            {
                var data = msg as MessagePositionUpdateData;

                if (data == null)
                {
                    return(true);
                }

                data.UpdateDataObjects
                .Where(p => p.TargetType == PositionUpdateTargetType.Ship)
                .ForEach(UpdateShipPosition);


                return(true);
            }

                #endregion

                #region Add/Remove Ships to/from Team

            case (MessageTypes.AddRemoveShipsTeam):
            {
                MessageAddRemoveShipsTeam data = msg as MessageAddRemoveShipsTeam;

                _targetingService.DisableTargetSetting();
                if (data.AddOrRemove)
                {
                    foreach (var ID in data.IDs)
                    {
                        _teamManager.AddTeamToObject(ID, data.TeamID);
                    }
                }
                else
                {
                    foreach (var ID in data.IDs)
                    {
                        _teamManager.RemoveTeamFromObject(ID, data.TeamID);
                    }
                }
                _targetingService.EnableTargetSetting();
                return(true);
            }

                #endregion

                #region Receive New Ship

            // New connection, got a player ID
            case (MessageTypes.ReceiveNewShips):
            {
                var data = msg as MessageReceiveNewShips;
                foreach (var sd in data.Ships)
                {
                    var s = MessageReader.InstantiateShip(sd, _physicsManager.World, _clientShipManager, false);

                    if (s.Pilot.PilotType == PilotType.Player)
                    {
                        _numPlayerPilots++;
                        if (_numPlayerPilots == 1 && IncreaseUpdateInterval != null)         //Added the first player pilot
                        {
                            IncreaseUpdateInterval(this, MessageHandlerID.Value);
                        }
                    }
                }
                return(true);
            }
                #endregion

                #region NumOnlinePlayersChanged (Redis only)
            case MessageTypes.Redis_NumOnlinePlayersChanged:
            {
                var data = msg as MessageEmptyMessage;
                if (data.Data != null)
                {
                    _numPlayerPilots = (int)data.Data;
                    if (_numPlayerPilots >= 1 && IncreaseUpdateInterval != null)     //Added the first player pilot
                    {
                        IncreaseUpdateInterval(this, MessageHandlerID.Value);
                    }
                    else if (_numPlayerPilots == 0 && DecreaseUpdateInterval != null)
                    {
                        DecreaseUpdateInterval(this, MessageHandlerID.Value);
                    }
                }
                return(true);
            }

                #endregion

                #region Receive New Structure
            case MessageTypes.ReceiveNewStructure:
            {
                var           data = msg as MessageReceiveNewStructure;
                StructureData sd   = data.StructureData;
                InstantiateStructure(sd);

                return(true);
            }
                #endregion

                #region ReceiveFloatyAreaObjects

            case MessageTypes.ReceiveFloatyAreaObjects:
            {
                var data = msg as MessageReceiveFloatyAreaObjects;
                _floatyAreaObjectManager.InstantiateFloatyAreaObjects(data);
                break;
            }

                #endregion

                #region KillOrRemoveObjectsFromArea
            case MessageTypes.RemoveKillRevive:
            {
                MessageRemoveKillRevive data = msg as MessageRemoveKillRevive;

                switch (data.ObjectType)
                {
                case RemovableObjectTypes.FloatyAreaObject:
                {
                    _floatyAreaObjectManager.RemoveFloatyAreaObjects(data);
                    break;
                }

                case RemovableObjectTypes.Ship:
                {
                    List <Ship> ships = new List <Ship>();
                    foreach (var ID in data.ObjectIDs)
                    {
                        Ship s = _clientShipManager.GetShip(ID);
                        if (s == null)
                        {
                            ConsoleManager.WriteLine("Error: ShipID not found in MainNetworkingManager while processing MessageTypes.RemoveKillRevive", ConsoleMessageType.Error);
                        }
                        else
                        {
                            ships.Add(s);
                        }
                    }


                    switch (data.ActionType)
                    {
                    case ActionType.Kill:
                    {
                        foreach (Ship s in ships)
                        {
                            s.Kill();
                            if (s != _clientShipManager.PlayerShip)
                            {
                                Debugging.DisposeStack.Push(this.ToString());
                                s.Body.Enabled = false;
                            }
                            _targetingService.DeRegisterObject(s);
                        }
                        break;
                    }

                    case ActionType.Revive:
                    {
                        float healthMultiplier  = data.HealthMultiplier == null ? 1 : (float)data.HealthMultiplier;
                        float shieldsMultiplier = data.ShieldMultiplier == null ? 1 : (float)data.ShieldMultiplier;
                        foreach (Ship s in ships)
                        {
                            s.Revive((int)(s.MaxHealth * healthMultiplier), (int)(s.MaxShields * shieldsMultiplier));
                            _targetingService.RegisterObject(s);
                        }

                        break;
                    }

                    case ActionType.Remove:
                    {
                        foreach (Ship s in ships)
                        {
                            _clientShipManager.RemoveShip(s.Id);
                            if (s.Pilot.PilotType == PilotType.Player)
                            {
                                _numPlayerPilots--;
                                if (_numPlayerPilots == 0 && DecreaseUpdateInterval != null)
                                //Last player pilot has been removed
                                {
                                    DecreaseUpdateInterval(this, MessageHandlerID.Value);
                                }
                            }
                        }
                        break;
                    }
                    }

                    break;
                }


                case RemovableObjectTypes.Structure:
                {
                    switch (data.ActionType)
                    {
                    case ActionType.Kill:
                    {
                        foreach (var ID in data.ObjectIDs)
                        {
                            KillStructure(ID);
                        }
                        break;
                    }

                    case ActionType.Revive:
                    {
                        ConsoleManager.WriteLine("Error: Revive not implemented for structures.", ConsoleMessageType.Error);
                        break;
                    }

                    case ActionType.Remove:
                    {
                        foreach (var ID in data.ObjectIDs)
                        {
                            RemoveStructure(ID);
                        }
                        break;
                    }
                    }

                    break;
                }
                }
                return(true);
            }

                #endregion

                #region ObjectFired

            case MessageTypes.ObjectFired:
            {
                var data = msg as MessageObjectFired;
                ObjectFired(data);

                return(true);
            }

                #endregion

                #region COMMAND Change Ship Type

            case (MessageTypes.ChangeShipType):
            {
                var data = msg as ShipData;
                //This might not work...yolo
                MessageReader.InstantiateShip(data, _physicsManager.World, _clientShipManager, true);
                return(true);
            }
                #endregion

                #region Fire Denial

            case (MessageTypes.FireRequestResponse):
            {
                var data = msg as MessageFireRequestResponse;
                switch (data.FiringObjectType)
                {
                case FiringObjectTypes.Ship:
                {
                    ShipFireResponse(data);
                    break;
                }


                case FiringObjectTypes.Structure:
                {
                    StructureFireResponse(data);
                    break;
                }
                }



                return(true);
            }

                #endregion

                #region SelectorCommandMessage

            case MessageTypes.SelectorMessageType:
            {
                MessageSelectorCommand data = msg as MessageSelectorCommand;
                _selectionManager.RelayNetworkCommand(data);
                return(true);
            }
                #endregion

                #region Set Health

            case (MessageTypes.SetHealth):
            {
                var setHealthData = msg as MessageSetHealth;
                foreach (var d in setHealthData.HealthData)
                {
                    Ship s = _clientShipManager.GetShip(d.ShipID);

                    if (s == null)
                    {
                        ConsoleManager.WriteLine("Warning: ShipID not found while processing SetHealth message.", ConsoleMessageType.Warning);
                        break;
                    }

                    if (!s.IsAlive)
                    {
                        s.Revive((int)d.Health, (int)d.Shields);
                    }

                    s.CurrentHealth          = d.Health;
                    s.Shields.CurrentShields = d.Shields;
                    s.SetCurrentEnergy(d.Energy);

                    for (int i = 0; i < d.DebuffTypesToAdd.Count; i++)
                    {
                        s.Debuffs.AddDebuff(d.DebuffTypesToAdd[i], d.DebuffCountsToAdd[i], TimeKeeper.MsSinceInitialization);
                    }
                }

                return(true);
            }
                #endregion

                #region AddCargoToShip
            case MessageTypes.AddCargoToShip:
            {
                var data = msg as MessageAddCargoToShip;

                Ship s = _clientShipManager.GetShip(data.ShipID);
                if (s == null)
                {
                    ConsoleManager.WriteLine("Warning: ShipID not found while processing AddStatefulCargoToShip message.", ConsoleMessageType.Warning);
                    break;
                }

                foreach (var cargoData in data.StatefulCargoData)
                {
                    var cargo = MessageReader.InstantiateStatefulCargo(cargoData);

                    s.Cargo.AddStatefulCargo(cargo, true);
                    if (cargo.CargoType == StatefulCargoTypes.Module)
                    {
                        s.AddModule((Module)cargo);
                    }
                }

                foreach (var cargoData in data.StatelessCargoData)
                {
                    s.Cargo.AddStatelessCargo(cargoData.CargoType, cargoData.Quantity, true);
                }

                break;
            }

                #endregion

                #region RemoveCargoFromPlayerShip
            case MessageTypes.RemoveCargoFromShip:
            {
                var data = msg as MessageRemoveCargoFromShip;

                Ship s = _clientShipManager.GetShip(data.ShipID);

                if (s == null)
                {
                    ConsoleManager.WriteLine("Warning: ShipID not found while processing RemoveStatefulCargoFromShip message.", ConsoleMessageType.Warning);
                    break;
                }

                foreach (var cargoID in data.StatefulCargoIDs)
                {
                    var removedCargo = s.Cargo.RemoveStatefulCargo(cargoID);

                    if (removedCargo == null)
                    {
                        ConsoleManager.WriteLine("Error: cargo not found while processing message " + MessageTypes.RemoveCargoFromShip + " for ID " + s.Id, ConsoleMessageType.Error);
                    }
                    else if (removedCargo.CargoType == StatefulCargoTypes.Module)
                    {
                        s.RemoveModule(removedCargo.Id);
                    }


                    foreach (var cargoData in data.StatelessCargoData)
                    {
                        s.Cargo.RemoveStatelessCargo(cargoData.CargoType, cargoData.Quantity);
                    }
                }
                break;
            }

                #endregion
            }

            return(false);//No message processed
        }
Exemplo n.º 9
0
        public IShip KillShip(IShip s, ICanFire killingObject)
        {
            if (s.IsDead)
            {
                ConsoleManager.WriteLine("Killing a ship which was already dead.", ConsoleMessageType.Warning);
                return(s);
            }


            s.IsDead           = true;
            s.KillTimeStamp    = TimeKeeper.MsSinceInitialization;
            s.RespawnTimeDelay = 3000;//TODO: This will be a problem later, if a IShip warps into a new system where a dead IShip is waiting to respawn, the warping IShip will see a live ship. Needs to be fully implemented.
            s.CurrentHealth    = 0;

            if (s.GetPlayer().IsTrading)
            {
                _tradeTerminator.TerminateTrade(s.Id, true);
            }

            var currentArea = s.GetArea();

            if (currentArea.NumOnlinePlayers > 0)
            {
                MessageRemoveKillRevive msgData = new MessageRemoveKillRevive();
                msgData.ActionType = ActionType.Kill;
                msgData.ObjectType = RemovableObjectTypes.Ship;
                msgData.ObjectIDs.Add(s.Id);

                currentArea.BroadcastMessage(new NetworkMessageContainer(msgData, MessageTypes.RemoveKillRevive));

                // Send chat messages
                if (killingObject is IShip)
                {
                    ((IShip)killingObject).GetPlayer().PlayersKilled++;
                    var killingPlayer = ((IShip)killingObject).GetPlayer();

                    killingPlayer.PlayersKilled++;

                    var killText = string.Format("{0} was shot down by {1}!", s.GetPlayer().Username, killingPlayer.Username);

                    _chatManager.BroadcastSimpleChat(s.GetArea(), "", killText, ChatTypes.None);
                }
                else if (killingObject is Turret)
                {
                    _playerLocator.GetPlayerAsync(((Turret)killingObject).OwnerID).Result.PlayersKilled++;

                    var killedPlayer = s.GetPlayer();

                    var defensesOwner = _playerLocator.GetPlayerAsync(((Turret)killingObject).OwnerID).Result.Username;

                    var killText = string.Format("{0} was shot down by defenses of {1}!", killedPlayer.Username, defensesOwner);

                    _chatManager.BroadcastSimpleChat(s.GetArea(), "", killText, ChatTypes.None);
                }
            }

            #region Modules
            //For now, just make the ship drop one mod to space. Later we'll figure out how many to destroy/keep with the ship
            var moduleToRemove = s.Cargo.GetAnyStatefulCargo(StatefulCargoTypes.Module);
            if (moduleToRemove != null)
            {
                var ct = new TransactionRemoveStatefulCargo(s, StatefulCargoTypes.Module, moduleToRemove.Id);
                ct.OnCompletion += s.CargoRemoved;
                ct.OnCompletion += _messageManager.NotifyCargoRemoved;
                ct.OnCompletion += _addCargoToArea;


                var mod = moduleToRemove as Module;
                mod.PosX       = s.PosX;
                mod.PosY       = s.PosY;
                mod.Rotation   = s.Rotation;
                mod.NextAreaID = (int)s.CurrentAreaId;

                _cargoSynchronizer.RequestTransaction(ct);
            }


            #endregion


            s.CurrentHealth = s.ShipStats.MaxHealth;
            //s.IsDead = false;
            float tempx = 0;
            float tempy = 0;
            SpatialOperations.GetRandomPointInRadius(ref tempx, ref tempy, 10, 20);

            s.PosX = tempx;
            s.PosY = tempy;


            return(s);
        }