예제 #1
0
        public override void SetEntryPosition(IHasPosition warpingObject, IArea oldArea)
        {
            //TODO: Replace with starport style safe zone
            float xpos = Warpholes[0].PosX;
            float ypos = Warpholes[0].PosY;

            SpatialOperations.GetRandomPointInRadius(ref xpos, ref ypos, .5f, 3);
            warpingObject.PosX = xpos;
            warpingObject.PosY = ypos;
        }
예제 #2
0
        public void SetShipPosition(IShip s)
        {
            float tempx = 0;
            float tempy = 0;

            SpatialOperations.GetRandomPointInRadius(ref tempx, ref tempy, Size, Size + 1);

            s.PosX = tempx;
            s.PosY = tempy;
            s.VelX = 0;
            s.VelY = 0;
        }
예제 #3
0
        public override void SetEntryPosition(IHasPosition warpingObject, IArea oldArea)
        {
            if (oldArea == null)
            {
                warpingObject.PosX = 0;
                warpingObject.PosY = 0;
                warpingObject.SetRandomPointInRadius(Star.Radius + .1f, Star.Radius + 1f);
            }
            else
            {
                switch (oldArea.AreaType)
                {
                case AreaTypes.System:
                {
                    SetEntryPositionFromSystem(warpingObject);
                    break;
                }

                case AreaTypes.Planet:
                case AreaTypes.Port:
                case AreaTypes.StarBase:
                {
                    warpingObject.PosX = oldArea.PosX;
                    warpingObject.PosY = oldArea.PosY;
                    warpingObject.SetRandomPointInRadius(oldArea.AreaSize / 100f + .1f, oldArea.AreaSize / 100f + 1.5f);
                    break;
                }

                case AreaTypes.Colony:
                {
                    var   pa         = oldArea.GetParentArea();
                    float parentPosX = pa.PosX;
                    float parentPosY = pa.PosY;
                    SpatialOperations.GetRandomPointInRadius(ref parentPosX, ref parentPosY, pa.AreaSize / 100f + .1f, pa.AreaSize / 100f + 1.5f);
                    warpingObject.PosX = parentPosX;
                    warpingObject.PosY = parentPosY;
                    break;
                }
                }
            }
        }
예제 #4
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);
        }