/// <summary>
        /// Prunes expired pending logins
        /// </summary>
        public void Update()
        {
            List <PendingConnection> toRemove = new List <PendingConnection>();

            lock (_updateLock)
            {
                foreach (PendingConnection p in _pendingConnections)
                {
                    if (TimeKeeper.MsSinceInitialization > p.ExpireTime)
                    {
                        toRemove.Add(p);
                    }
                }

                foreach (PendingConnection p in toRemove)
                {
                    _pendingConnections.Remove(p);
                    p.Account.IsLoginPending = false;
                    ConsoleManager.WriteLine("Warning: Pending Connection for user " + p.Account.Username + " timed out and was removed.");
                }
            }
            PendingConnectionCount = _pendingConnections.Count;
        }
        /// <summary>
        /// Only way to reliably get external IP address, sends request to checkIP.dyndns.org
        /// </summary>
        /// <returns></returns>
        static private IPAddress GetExternalIPAddressDyndns()
        {
            // Todo: Use Regex here.
            ConsoleManager.WriteLine("Querying http://checkip.dyndns.org for external IP...", ConsoleMessageType.NetworkMessage);
            string     url = "http://checkip.dyndns.org/";
            WebRequest req = WebRequest.Create(url);

            req.Method  = "GET";
            req.Proxy   = null;
            req.Timeout = 15000;
            WebResponse  resp = req.GetResponse();//dyndns fails intermittently. Ipify is more reliable, except right now their certificate is expired...
            StreamReader sr   = new StreamReader(resp.GetResponseStream());


            string response = sr.ReadToEnd().Trim();

            string[] a  = response.Split(':');
            string   a2 = a[1].Substring(1);

            string[] a3 = a2.Split('<');
            string   a4 = a3[0];

            return(IPAddress.Parse(a4));
        }
Example #3
0
 private void AdminShipChange(Player player, ShipStats shs)
 {
     ConsoleManager.WriteLine("Warning: AdminShipChange is currently disabled.", ConsoleMessageType.Warning);
 }
Example #4
0
        /// <summary>
        ///     Handles a Command sent by a player with isAdmin = true
        ///
        /// <summary>
        ///     Handles a Command sent by a player with isAdmin = true
        /// </summary>
        /// <param name="msg"></param>
        /// <param name="server"></param>
        /// <param name="messageConnection"></param>
        public void AdminCommand(NetIncomingMessage msg, NetPeer server, NetConnection messageConnection)
        {
            ConsoleManager.WriteLine("Received Admin Command; Admin commands are disabled.", ConsoleMessageType.Warning);
            return;

            /*
             * var player = _playerManager.connectionToPlayer[msg.SenderConnection]; // You can't spoof an admin
             *
             * if (!player.GetAccount().IsAdmin) // If you're not an admin, f**k you
             *  return;
             *
             * var chatType = msg.ReadByte();
             * var chatText = msg.ReadString();
             * //ConsoleManager.WriteToFreeLine(playerID.ToString() + chatType.ToString() + chatText.ToString());
             *
             * //Player tempPlayer = new Player();
             *
             * ConsoleManager.WriteLine("Admin Command " + chatType + " received.");
             * switch ((AdminCommands) chatType) //Chat message type
             * {
             *  case AdminCommands.killPlayer: // Not implemented
             *      _messageManager.SendChatMessage("Killed player Command parsed.", "", ChatTypes.admin, server,
             *          player.Connection);
             *      break;
             *
             *  case AdminCommands.makeNPCs:
             *      var numToMake = int.Parse(chatText);
             *      //SR_connectionManager.Server.Program.createNPCs = numToMake;
             *      //SR_connectionManager.Server.Program.NPCCreatePlayer = player;
             *      ConsoleManager.WriteLine("makeNPCs Command is broken.");
             *      break;
             *
             *  case AdminCommands.setShip:
             *
             *      switch (chatText.ToLower())
             *      {
             *          case "penguin":
             *              AdminShipChange(player, ShipStatManager.TypeToStats[ShipTypes.Penguin]);
             *
             *              _messageManager.SendChatMessage("Set IShip to a Penguin.", "", ChatTypes.admin, server,
             *                  player.Connection);
             *              Logger.log(Log_Type.INFO, player.Username + " switched IShip to Penguin");
             *              break;
             *          case "bc":
             *          case "battlecruiser":
             *              AdminShipChange(player, ShipStatManager.TypeToStats[ShipTypes.BattleCruiser]);
             *
             *              _messageManager.SendChatMessage("Set IShip to a Battlecruiser. Weapon ", "", ChatTypes.admin,
             *                  server, player.Connection);
             *              Logger.log(Log_Type.INFO, player.Username + " switched IShip to Battlecruiser");
             *              break;
             *
             *          case "reaper":
             *          case "jeyth":
             *              AdminShipChange(player, ShipStatManager.TypeToStats[ShipTypes.Reaper]);
             *
             *              _messageManager.SendChatMessage("Set IShip to a Jeyth. Weapon ", "", ChatTypes.admin, server,
             *                  player.Connection);
             *              Logger.log(Log_Type.INFO, player.Username + " switched IShip to Jeyth");
             *              break;
             *          case "zy":
             *          case "barge":
             *              AdminShipChange(player, ShipStatManager.TypeToStats[ShipTypes.Barge]);
             *
             *              _messageManager.SendChatMessage("Set IShip to a ZY Barge. Weapon ", "", ChatTypes.admin,
             *                  server, player.Connection);
             *              Logger.log(Log_Type.INFO, player.Username + " switched IShip to ZY Barge");
             *              break;
             *
             *          case "dread":
             *              AdminShipChange(player, ShipStatManager.TypeToStats[ShipTypes.Dread]);
             *
             *              _messageManager.SendChatMessage("Set IShip to a Dread class fighter. ", "",
             *                  ChatTypes.admin, server, player.Connection);
             *              Logger.log(Log_Type.INFO, player.Username + " switched IShip to a Dread class fighter.");
             *              break;
             *
             *          default:
             *
             *              _messageManager.SendChatMessage("Invalid IShip Type: ", chatText, ChatTypes.admin,
             *                  server, player.Connection);
             *              Logger.log(Log_Type.INFO,
             *                  player.Username + " specified invalid IShip type " + chatText + ".");
             *              break;
             *      }
             *      break;
             *  case AdminCommands.systemStatistics:
             *  {
             *      var p = _playerManager.GetPlayer(messageConnection);
             *      if (p.CurrentAreaId == null)
             *          _messageManager.SendChatMessage("Player's area is currently null.", "", ChatTypes.admin, server,
             *              messageConnection);
             *
             *
             *      var a = _galaxyManager.GetArea(p.CurrentAreaId);
             *      if (a == null)
             *          //a = _galaxyManager.GetNonlocalArea((int)p.CurrentAreaId, _playerManager);//This might be a bad idea, since it registers non-local ships and players, but this is an admin Command, after all
             *          return;
             *
             *      if (a.AreaType == (byte) AreaTypes.System)
             *      {
             *          var pp = (PSystem) a;
             *          _messageManager.SendChatMessage(
             *              "Current System: " + pp.SystemName + ", Is Cluster: " + pp.IsCluster + ", Total Planets: " +
             *              pp.PlanetCount + ", Total Moons: " + pp.MoonCount
             *              , "", ChatTypes.admin, server, messageConnection);
             *          //Logger.log(Log_Type.INFO, player.username + " switched IShip to Penguin"); lol wtf?
             *      }
             *      break;
             *  }
             *  case AdminCommands.whoplayer:
             *      break;
             * }
             */
        }
Example #5
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);
        }
Example #6
0
        /// <summary>
        /// Use this for reported collision, to add for majority resolution
        /// If a collision has already been added, it will automatically be processed (since two clients reported the collision)
        /// </summary>
        /// <param name="projectileID"></param>
        public void CreateCollision(int projectileID, ProjectileTypes projectileType, int hitObjectID, byte pctCharge, byte weaponSlot)
        {
            //If _collidableObjects does not contain hitObjectID, something is probably wrong.
            //If ProjectileManager does not contain projectileID, the collision is probably from a silently denied projectile, which should be rare
            //WARNING: Could optimize by telling client not to report collisions with denied projectiles
            if (!_collidableObjects.ContainsKey(hitObjectID) || !_projectileManager.idToProjectile.ContainsKey(projectileID))//In case a collision is reported right after a kill
            {
                if (!_collidableObjects.ContainsKey(hitObjectID))
                {
                    ConsoleManager.WriteLine("Error: collision reported for an object which was not registered with CollisionManager.", ConsoleMessageType.Error);
                }

                return;
            }
            ICollidable hitObject = _collidableObjects[hitObjectID];

            if (hitObject.CurrentAreaId == null)//Received a collision report while an object was mid warp, ignore.
            {
                return;
            }

            CollisionObject tempCol;

            try
            {
                if (_collisionsToCheck.TryGetValue(projectileID, out tempCol)) //If the collision has been reported
                {
                    tempCol.numReported++;

                    //This means more than one client reported the collision, so always take damage
                    if (!tempCol.isExpired) //If it has not been handled yet
                    {
                        ConsoleManager.WriteLine("Damaging, multiple reports, id  " + projectileID);
                        DamageObject(hitObject, _projectileManager.idToProjectile[projectileID].FiringObject, projectileType, pctCharge, weaponSlot, projectileID);

                        tempCol.isExpired = true;
                    }
                }
                else if (_galaxyManager.GetArea(hitObject.CurrentAreaId).NumOnlinePlayers == 1)
                //If there is only one player in the system (e.g. a player simulating npcs alone)
                {
                    ConsoleManager.WriteLine("Damaging, single user, id  " + projectileID);
                    tempCol = getColObject(projectileID, projectileType, hitObject, pctCharge, weaponSlot);
                    _collisionsToCheck.TryAdd(projectileID, tempCol);
                    DamageObject(hitObject, _projectileManager.idToProjectile[projectileID].FiringObject, projectileType, pctCharge, weaponSlot, projectileID);//Take damage
                    tempCol.isExpired = true;
                }

                else //If the collision has not been reported
                {
                    //Program.numCollided++;

                    tempCol = getColObject(projectileID, projectileType, hitObject, pctCharge, weaponSlot);
                    _collisionsToCheck.TryAdd(projectileID, tempCol);
                }
            }
            catch (Exception e)
            {
                //TODO: figure out a way to deal with hitObject.CurrentAreaID==null, which can happen if a collision is created while the object is warping. Currently not concurrency safe.
                ConsoleManager.WriteLine(e.Message, ConsoleMessageType.Error);
                ConsoleManager.WriteLine(e.StackTrace, ConsoleMessageType.Error);
            }
            hitObject.DoCombatUpdates     = true;
            hitObject.TimeOfLastCollision = TimeKeeper.MsSinceInitialization;
        }
Example #7
0
        protected void handleCollisions(GalaxyRegistrationManager rm, ProjectileManager pm)
        {
            ICollidable hitObj;
            var         keysToRemove = new List <int>();

            foreach (var kvp in _collisionsToCheck)
            {
                hitObj = kvp.Value.hitObject;
                int numOnline = 0;

                try
                {
                    //This line for some reason causes null reference exceptions, although none of the variables are null
                    numOnline = _galaxyManager.GetArea(hitObj.CurrentAreaId).NumOnlinePlayers;
                }
                catch (Exception e)
                {
                    ConsoleManager.WriteLine("Mysterious null error in CollisionManager.HandleCollisions.", ConsoleMessageType.Warning);
                    continue;
                }

                if (kvp.Value.isExpired && (TimeKeeper.MsSinceInitialization - kvp.Value.reportTime) >= 3000)
                {    //If it has been handled and the grace period for further reports has ended
                    keysToRemove.Add(kvp.Value.projectileID);
                }
                else if (kvp.Value.isExpired == false &&
                         (TimeKeeper.MsSinceInitialization - kvp.Value.reportTime) >= 200)
                //Only one collision reported
                {
                    //ConsoleManager.WriteToFreeLine("Single Reported");
                    //Program.numSingleCols++;
                    float probability = (1f / numOnline) * 100; //probability that the collision is valid

                    if (r.Next(0, 100) <= probability)
                    {
                        if (_projectileManager.idToProjectile.ContainsKey(kvp.Value.projectileID))
                        {
                            DamageObject(hitObj, _projectileManager.idToProjectile[kvp.Value.projectileID].FiringObject, kvp.Value.projectileType, kvp.Value.pctCharge, kvp.Value.WeaponSlot, kvp.Value.projectileID);//Collision considered valid
                        }
                        else
                        {
                            ConsoleManager.WriteLine("Error: projectileID not found for projectile collision. Skipping damage...", ConsoleMessageType.Error);
                        }
                    }

                    kvp.Value.isExpired = true;
                }
            }


#if DEBUG
            //TODO: Remove this before release
            for (int i = 0; i < keysToRemove.Count - 1; i++)
            {
                for (int j = i + 1; j < keysToRemove.Count; j++)
                {
                    if (keysToRemove[i] == keysToRemove[j])
                    {
                        ConsoleManager.WriteLine("SAME KEY ADDED TWICE1!!!!");
                        throw new Exception("SAME KEY ADDED TWICE1!!!!");
                    }
                }
            }
#endif
            try
            {
                for (int i = 0; i < keysToRemove.Count; i++)
                {
                    CollisionObject tempCol;
                    //Program.numReports -= _collisionsToCheck[keysToRemove[i]].numReported;
                    recycleCollisionObject(_collisionsToCheck[keysToRemove[i]]);
                    _collisionsToCheck.TryRemove(keysToRemove[i], out tempCol);
                }
            }
            catch
            {
                Console.WriteLine("bsdfjlehliau");
            }
        }
Example #8
0
 /// <summary>
 /// Changes the ship's area appropriately.
 /// Handles associated player, if needed
 /// </summary>
 /// <param name="newAreaID"></param>
 /// <param name="ship"></param>
 /// <param name="databaseManager"></param>
 public void ChangeArea(int?newAreaID, NPCShip ship)
 {
     ConsoleManager.WriteLine("ERROR: ChangeArea not implemented for NPCs!", ConsoleMessageType.Error);
     return;
 }