Ejemplo n.º 1
0
        /// <summary>
        /// Gives the object a unique free ID, registers the object with various managers and collections
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public int PopFreeID()
        {
            int ID;

            if (!_freeIDs.TryPop(out ID))
            {
                //This should never happen, but just in case
                _networkIDSupplier.RequestFreeIDs(_minIDCount, _IDType);

                ConsoleManager.WriteLine("Warning: GalaxyManager ran out of IDs. This should not be possible, except during initialization", ConsoleMessageType.Warning);
                while (_freeIDs.Count == 0)
                {
                    //This will fail if we move to single threaded, but it isn't supposed to happen anyway.....
                    Thread.Sleep(100);
                }
            }



            if (_freeIDs.Count < _minIDCount)
            {
                _networkIDSupplier.RequestFreeIDs(_minIDCount, _IDType);
            }

            return(ID);
        }
Ejemplo n.º 2
0
        /// <summary>
        ///     The message recieved from the client will have the /t, /s, etc removed
        ///     Function handles chat message according to chat type which is sent as a byte by the client
        /// </summary>
        /// <param name="msg"></param>
        /// <param name="server"></param>
        /// <param name="messageConnection"></param>
        public async void HandleMessage(NetworkMessageContainer message, Player player)
        {
            if (message == null)
            {
                ConsoleManager.WriteLine("Invalid chat message handled. Message is null.",
                                         ConsoleMessageType.Error);
            }

            var messageData = message.MessageData as MessageChatMessage;

            var chatMessageData = messageData.ChatMessageData;

            if (player == null)
            {
                ConsoleManager.WriteLine("Player connection not found while handling chat message.",
                                         ConsoleMessageType.Warning);
                return;
            }

            var outboundChats = await _chatCommandHandler.FetchOutboundChats(player, chatMessageData.ChatJson);

            if (outboundChats == null || outboundChats.Count == 0)
            {
                return;
            }

            SendChatList(outboundChats);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Initializes the Lidgren connection, returns a reference to the NetPeer for sending messages
        /// </summary>
        /// <param name="serverName"></param>
        /// <param name="serverPort"></param>
        /// <returns></returns>
        public NetPeer Initialize(ConnectionManagerConfig c)
        {
            _config = c;
            NetPeerConfiguration _myConfig = new NetPeerConfiguration(c.MyConfig.ServerName);

            _myConfig.ConnectionTimeout = 5;
            _myConfig.ReceiveBufferSize = c.MyConfig.ReceiveBufferSize;
            _myConfig.SendBufferSize    = c.MyConfig.SendBufferSize;
            _myConfig.Port = c.MyConfig.Port;
            _myConfig.EnableMessageType(NetIncomingMessageType.DiscoveryRequest);
            _myConfig.EnableMessageType(NetIncomingMessageType.DiscoveryResponse);
            _myConfig.EnableMessageType(NetIncomingMessageType.ConnectionApproval);



            _myConfig.AcceptIncomingConnections = true;

            //ExternalIP = new IPEndPoint(new IPAddress(GetExternalIPAddressIpify().GetAddressBytes()), c.MyConfig.Port);
            //ExternalIP = new IPEndPoint(new IPAddress(GetExternalIPAddressDyndns().GetAddressBytes()), c.MyConfig.Port);
            ExternalIP = new IPEndPoint(new IPAddress(new byte[] { 127, 0, 0, 1 }), c.MyConfig.Port);

            ConsoleManager.WriteLine("Slave using IP Address " + ExternalIP, ConsoleMessageType.NetworkMessage);

            if (_isInit)
            {
                Server.Shutdown("Resetting server...");
                System.Threading.Thread.Sleep(200);
            }
            Server = new NetServer(_myConfig);
            Server.Start();


            _isInit = true;
            return(Server);
        }
Ejemplo n.º 4
0
 public void SendMessageToSimulator(SimulatorBoundMessage message)
 {
     if (_areaIdToSimulatorInterface.ContainsKey(message.TargetAreaId))//Not all areas are simulated currently, e.g. colonies
     {
         _areaIdToSimulatorInterface[message.TargetAreaId].SendMessage(message);
     }
     else
     {
         ConsoleManager.WriteLine("Attempted to send simulator message to a non simulated area.", ConsoleMessageType.Error);
     }
 }
Ejemplo n.º 5
0
        /// <summary>
        /// Creates a projectile, returns projectileID
        /// If there is a projectileID collision, the projectile will simply be discarded
        /// </summary>
        /// <param name="ship"></param>
        /// <returns></returns>
        public int CreateProjectile(ICanFire ship, int projectileID)
        {
            var tempProj = new Projectile(ship, projectileID);

            if (!idToProjectile.TryAdd(tempProj.ID, tempProj))
            {
                ConsoleManager.WriteLine("Proj Collision " + tempProj.ID, ConsoleMessageType.Warning);
            }
            //ConsoleManager.WriteToFreeLine("Projectiles: " + idToProjectile.Count.ToString());

            return(projectileID);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// TODO: clean this nasty mess up.
        /// </summary>
        void _addCargoToArea(object sender, ITransactionRemoveStatefulCargo tr)
        {
            IFloatyAreaObject fa = (IFloatyAreaObject)tr.RemovedCargo;

            List <IFloatyAreaObject> l = new List <IFloatyAreaObject> {
                fa
            };
            IArea a = _areaLocator.GetArea(fa.NextAreaID);

            a.AddFloatyAreaObjects(l);
            ConsoleManager.WriteLine("NPC dropped " + tr.RemovedCargo.GetType().Name, ConsoleMessageType.Notification);
        }
Ejemplo n.º 7
0
 /// <summary>
 /// Returns a clone of the appropriate StructureStats object
 /// </summary>
 /// <param name="s"></param>
 /// <returns></returns>
 public static StructureStats GetStats(StructureTypes s)
 {
     if (_stats.ContainsKey(s))
     {
         return(_stats[s].GetClone());
     }
     else
     {
         ConsoleManager.WriteLine("Error: " + s.ToString() + " not found in StructureStatManager.GetStats.", ConsoleMessageType.Error);
         return(null);
     }
 }
Ejemplo n.º 8
0
        /// <summary>
        /// Checks if the passed clientConnection is currently pending and if the username/password match the expected account
        /// Use this overload for logins
        /// </summary>
        /// <param name="clientConnection"></param>
        /// <returns></returns>
        public bool IsConnectionValid(NetConnection clientConnection, string username, string password, bool removeIfPending, out string message, out Account account)
        {
            byte[] address = clientConnection.RemoteEndPoint.Address.GetAddressBytes();

            //WARNING: Debug, remove before release. Logging in from the same IP as the server causes problems
            byte[] localAddress = ExternalIP.Address.GetAddressBytes();

            PendingLogin foundLogin = null;

            lock (_searchingLoginLock)
            {
                foreach (PendingLogin p in _pendingConnections)
                {
                    if (p.IsAddressEqual(address) || p.IsAddressEqual(localAddress))
                    {
                        foundLogin = p;

                        break;
                    }
                }
                if (removeIfPending && foundLogin != null)
                {
                    bool success = _pendingConnections.Remove(foundLogin);
                    foundLogin.Account.IsLoginPending = false;
                    if (success)
                    {
                        ConsoleManager.WriteLine("Removing pending login. Current count: " + _pendingConnections.Count);
                    }
                    else
                    {
                        ConsoleManager.WriteLine("Failed to remove foundLogin.");
                    }
                }
                else
                {
                    message = "Pending address " + clientConnection.RemoteEndPoint.Address.ToString() + " was not found.";
                    account = null;
                    return(false);
                }
            }

            if (foundLogin.Account.Username != username || foundLogin.Account.Password != password)
            {
                message = "Invalid username or password. Error, or attempted spoofing?";
                account = null;
                return(false);
            }

            message = "success";
            account = foundLogin.Account;
            return(true);
        }
Ejemplo n.º 9
0
        public void AddPendingHandoff(byte[] IPAddress, Account a, int destinationAreaID, int shipID, int?serverGameStateId)
        {
            if (a == null)
            {
                ConsoleManager.WriteLine("Warning: account not found in db in LoginManager.AddPendingHandoff");
                return;
            }

            lock (_addingLoginLock)
            {
                _pendingConnections.Add(new PendingHandoff(_loginTimeout, IPAddress, a, destinationAreaID, shipID, serverGameStateId, TimeKeeper.MsSinceInitialization));
            }
        }
Ejemplo n.º 10
0
        /// <summary>
        /// Call this to complete changing area when recieving client on handoff
        /// </summary>
        /// <param name="newArea"></param>
        /// <param name="ship"></param>
        /// <param name="isWarping"></param>
        public async Task HandoffCompleteAreaChange(int newAreaID, IShip ship, Player player)
        {
            //There's a small chance that setting areas to null won't work properly...we'll find out soon!
            ship.SetArea(null);
            player.SetArea(null);
            await ChangeArea(newAreaID, ship, true);

            //If these collections aren't empty on server startup, a server crashed mid handoff and there could be ships/players which aren't stored in any area and might not be loaded.
            _databaseManager.HandoffDeleteAsync(ship.Id, ModelTypes.ShipModel);
            _databaseManager.HandoffDeleteAsync(player.Id, ModelTypes.PlayerModel);

            ConsoleManager.WriteLine("Completed Handoff.");
        }
Ejemplo n.º 11
0
        public LocalIDManager(INetworkIDSupplier networkIDSupplier, IDTypes IDType)
        {
            _IDType = IDType;

            _networkIDSupplier = networkIDSupplier;
            if (networkIDSupplier != null)
            {
                _networkIDSupplier.RequestFreeIDs(_minIDCount * 2, _IDType);
            }
            else
            {
                ConsoleManager.WriteLine("Warning: networkIDSupplier is null in LocalIDManager constructor. This should only be the case when running DBFiller.", ConsoleMessageType.Warning);
            }
        }
Ejemplo n.º 12
0
 void _handleSimulatorMessage(object sender, NetworkMessageContainer message)
 {
     if (message.MessageType == MessageTypes.Redis_SimulatorConnectionRequest)
     {
         var data = message.MessageData as MessageSimulatorConnectionRequest;
         IsConnected = true;
         var response = new MessageSimulatorConnectionResponse()
         {
             SimulatorID = SimulatorID
         };
         _redisServer.PublishObject(ChannelTypes.ServerToSimulator_Network, SimulatorID, new NetworkMessageContainer(response, MessageTypes.Redis_SlaveConnectionResponse));
         ConsoleManager.WriteLine("Simulator spawn complete, ID " + data.SimulatorID, ConsoleMessageType.Startup);
     }
 }
Ejemplo n.º 13
0
        /// <summary>
        /// Adds a pending login as instructed by the master server, and awaits a connection from IPAddress until timeout
        /// Ensures that Account corresponding to accountID is registered with AccountManager
        /// </summary>
        /// <param name="IPAddress"></param>
        /// <param name="accountNumber"></param>
        public void AddPendingLogin(byte[] IPAddress, Account a)
        {
            if (a == null)
            {
                ConsoleManager.WriteLine("Warning: account not found in db in LoginManager.AddPendingLogin");
                return;
            }

            lock (_addingLoginLock)
            {
                _pendingConnections.Add(new PendingLogin(_loginTimeout, IPAddress, a, TimeKeeper.MsSinceInitialization));
                a.IsLoginPending = true;
                ConsoleManager.WriteLine("Account " + a.Username + " added to pending connections with address " + IPAddress.GetString());
            }
        }
Ejemplo n.º 14
0
        public void LogOut(Player p)
        {
            if (p.PlayerType != PlayerTypes.Human)
            {
                return;
            }

            p.LogOut(_databaseManager);

            Player temp;

            connectionToPlayer.TryRemove(((LidgrenOutgoingMessageService)p.MessageService).Connection, out temp);


            ConsoleManager.WriteLine("Player " + p.Username + " has been logged out.", ConsoleMessageType.Notification);
        }
Ejemplo n.º 15
0
        public Player GetPlayer(NetConnection connection)
        {
            Player p;

            if (connectionToPlayer.ContainsKey(connection))
            {
                p = connectionToPlayer[connection];
            }
            else
            {
                ConsoleManager.WriteLine("Failed to find player using connection");
                p = null;
            }

            return(p);
        }
Ejemplo n.º 16
0
        /// <summary>
        /// Call this to begin changing area when handing off a local client.
        /// </summary>
        /// <param name="newArea"></param>
        /// <param name="ship"></param>
        /// <param name="isWarping"></param>
        async Task HandoffInitiateAreaChange(int destinationAreaID, AreaTypes newAreaType, IShip ship, Player warpingPlayer)
        {
            var shipSaveTask          = _databaseManager.SaveAsync(warpingPlayer);
            var playerSaveTask        = _databaseManager.SaveAsync(ship);
            var shipSaveHandoffTask   = _databaseManager.HandoffSaveAsync(ship);//If these collections aren't empty on server startup, a server crashed mid handoff and there could be ships/players which aren't stored in any area and might not be loaded.
            var playerSaveHandoffTask = _databaseManager.HandoffSaveAsync(warpingPlayer);

            //Ensure that db versions of ship and player are most recent, since they'll be loaded by slave
            List <Task> tasklist = new List <Task>
            {
                shipSaveTask,
                shipSaveHandoffTask,
                playerSaveTask,
                playerSaveHandoffTask,
            };

            await Task.WhenAll(tasklist);

            if (!(shipSaveTask.Result.IsAcknowledged && shipSaveHandoffTask.Result.IsAcknowledged && playerSaveTask.Result.IsAcknowledged && playerSaveHandoffTask.Result.IsAcknowledged))
            {
                throw new InvalidOperationException("Error: db write failed during handoff, handoff aborted.");
            }

            //Send handoff to be handled by server
            NetworkMessageContainer redismsg = new NetworkMessageContainer(new MessageClientHandoff((int)warpingPlayer.AccountID, (int)warpingPlayer.ActiveShipId, destinationAreaID, ((LidgrenOutgoingMessageService)warpingPlayer.MessageService).Connection.RemoteEndPoint.Address.GetAddressBytes()), MessageTypes.Redis_ClientHandoff);

            _redisServer.PublishObject(MessageTypes.Redis_ClientHandoff, redismsg);

            IArea currentArea = null;

            if (ship.CurrentAreaId != null)
            {
                currentArea = _areaLocator.GetArea((int)ship.CurrentAreaId);
            }

            OnAreaExit(ship, currentArea, newAreaType);

            currentArea.RemovePlayer(ship.GetPlayer()); //There doesn't seem to be a convenient way to avoid putting this here
            currentArea.RemoveShip(ship);               //Sends removeship Command to clients in area
            ConsoleManager.WriteLine("Initiated Handoff");
            ship.GetPlayer().IsHandedOff = true;

            _registrationManager.DeRegisterObject(warpingPlayer);
            _registrationManager.DeRegisterObject(ship);
            _accountManager.DeregisterAccount(warpingPlayer.GetAccount());
        }
Ejemplo n.º 17
0
        static private IPAddress GetExternalIPAddressIpify()
        {
            //// Todo: Use Regex here.
            ConsoleManager.WriteLine("Querying https://api.ipify.org/ for external IP...", ConsoleMessageType.NetworkMessage);
            string     url = "https://api.ipify.org/";
            WebRequest req = WebRequest.Create(url);

            req.Method  = "GET";
            req.Proxy   = null;
            req.Timeout = 15000;
            WebResponse  resp     = req.GetResponse();
            StreamReader sr       = new StreamReader(resp.GetResponseStream());
            string       response = sr.ReadToEnd().Trim();


            return(IPAddress.Parse(response));
        }
Ejemplo n.º 18
0
        /// <summary>
        /// Gets an area being handled by this server, null if the area is non-local
        /// NOTE: If ID==null, GetArea returns limbo
        /// </summary>
        /// <param name="ID"></param>
        /// <returns></returns>
        public IArea GetArea(int?ID)
        {
            if (ID == null)
            {
                return(null);
            }

            IArea outArea;

            AllAreas.TryGetValue((int)ID, out outArea);

            if (outArea == null)
            {
                ConsoleManager.WriteLine("Non-local area requested from GetLocalArea", ConsoleMessageType.Warning);
            }
            return(outArea);
        }
Ejemplo n.º 19
0
        /// <summary>
        /// Performs a bunch of checks and returns a created account if succesful
        /// </summary>
        /// <param name="username"></param>
        /// <param name="password"></param>
        /// <param name="persistAccount">If false, account will not be stored in the manager or the db</param>
        /// <returns>Check flags if returned account is null</returns>
        public async Task <Tuple <Account, AccountCreationFailFlags> > CreateAccountAsync(string username, string password, bool persistAccount = true)
        {
            AccountCreationFailFlags failFlags = 0;

            // Checks
            _usernameCharCheck(username, ref failFlags);
            _passwordCheck(password, ref failFlags);
            var res = await _usernameExistsAsync(username, failFlags);

            failFlags = res.Item2;

            Account retAccount = null;

            if (failFlags == 0)
            {
#if DEBUG
                //ConsoleManager.WriteToFreeLine("Creating Account with username " + username);
#endif
                retAccount = new Account(username, password, _accountIDManager.PopFreeID(), false);
                if (persistAccount)
                {
                    await _databaseManager.SaveAsync(retAccount);

                    var writeResult = await _usernameExistsAsync(username, 0);

                    if (writeResult.Item1)
                    {
#if DEBUG
                        ConsoleManager.WriteLine("DB write failed when creating a new account.");
#endif
                        _accountIDManager.PushFreeID(retAccount.Id);
                        retAccount = null;
                        failFlags  = failFlags | AccountCreationFailFlags.DBWriteFailed;
                    }
                }
            }

            if (persistAccount && retAccount != null)
            {
                RegisterAccount(retAccount);
            }

            return(new Tuple <Account, AccountCreationFailFlags>(retAccount, failFlags));
        }
Ejemplo n.º 20
0
        /// <summary>
        /// This function checks if a player has timed out or not.
        /// </summary>
        public void updatesHeartbeats()
        {
            var currentTime = DateTime.Now.Ticks / 10000L;

            foreach (var player in _objects)
            {
                if (player.Value.IsOnline)
                {
                    var elapsedTime = currentTime - player.Value.lastHeartbeat;

                    if (elapsedTime > player.Value.disconnectTime) // Disconnect if true
                    {
                        ConsoleManager.WriteLine(
                            string.Format("Disconnecting Player {0}", player.Value.Username));
                        player.Value.LogOut(_databaseManager);
                    }
                }
            }
        }
Ejemplo n.º 21
0
        /// <summary>
        /// Handles login of a client. Returns true if login succesful
        /// </summary>
        /// <param name="receiveMessage">Incoming Message</param>
        /// <param name="accountManager">Account Manager</param>
        /// <param name="sendMessage">Blank message to write to.</param>
        /// <param name="messageConnection">Peer that is logging in, used to send success/fail.</param>
        public async Task HandleLogin(NetConnection messageConnection, Account a, ChatManager chatManager, SimulatorManager simulationManager, LocatorService ls)
        {
            try
            {
                HumanPlayer tempPlayer = (HumanPlayer)await _playerManager.GetObjectAsync(a.PlayerID, true, ls, true);

                _redisServer.SetHashValue(RedisDBKeyTypes.PlayerIDToCurrentAreaID, tempPlayer.Id, tempPlayer.CurrentAreaID);
                tempPlayer.IsOnline       = true;
                tempPlayer.MessageService = new LidgrenOutgoingMessageService(messageConnection, _connectionManager);
                var currentArea = tempPlayer.GetArea();

                a.connection = messageConnection;

                _playerManager.connectionToPlayer.TryAdd(messageConnection, tempPlayer);

                tempPlayer.GetArea().AddPlayer(tempPlayer, false);

                SendLoginList(currentArea, tempPlayer, chatManager);

                //currentArea.MovePlayerHere(tempPlayer, false);
                currentArea.SendEntryData(tempPlayer, false, tempPlayer.GetActiveShip());

                tempPlayer.lastHeartbeat = DateTime.Now.Ticks / 10000L;


                var SuccessMessage = string.Format("Player {0} has logged in successfully, current area: {1}", new object[2] {
                    a.Username, tempPlayer.CurrentAreaID
                });
                ConsoleManager.WriteLine(SuccessMessage);

                tempPlayer.HackCount = -1;

                simulationManager.SendMessageToSimulator(new SimulatorBoundMessage(new MessageEmptyMessage {
                    Data = currentArea.NumOnlineHumanPlayers
                }, MessageTypes.Redis_NumOnlinePlayersChanged, currentArea.Id));
            }
            catch (Exception e)
            {
                ConsoleManager.WriteLine(e.Message, ConsoleMessageType.Error);
                ConsoleManager.WriteLine(e.StackTrace, ConsoleMessageType.Notification);
            }
        }
Ejemplo n.º 22
0
        /// <summary>
        /// Instantiates a new instance of the given weapon type
        /// </summary>
        /// <param name="weaponType"></param>
        /// <param name="missileType">Used inly if weaponType is MissileLauncher</param>
        /// <returns></returns>
        static public Weapon GetNewWeapon(WeaponTypes weaponType, ProjectileTypes missileType = ProjectileTypes.AmbassadorMissile)
        {
            switch (weaponType)
            {
            case WeaponTypes.Laser:
                return(new Laser());

            case WeaponTypes.AltLaser:
                return(new AltLaser());

            case WeaponTypes.HurrDurr:
                return(new HurrDurr());

            case WeaponTypes.PlasmaCannon:
                return(new PlasmaCannon());

            case WeaponTypes.BC_Laser:
                return(new BC_Laser());

            case WeaponTypes.LaserWave:
                return(new LaserWave());

            case WeaponTypes.MissileLauncher:
                return(new MissileLauncher(missileType));

            case WeaponTypes.GravBomber:
                return(new GravBomber());

            case WeaponTypes.MineWeapon:
                return(new MineWeapon());



            case WeaponTypes.None:
                return(new NullWeapon());

            default:
                ConsoleManager.WriteLine("Error: " + weaponType.ToString() + " flyweight not yet implemented in WeaponManager.cs.", ConsoleMessageType.Error);
                return(new NullWeapon());
            }
        }
Ejemplo n.º 23
0
        SimulatorInterface AttemptSpawn(List <PSystem> areasToSimulate, bool DEBUGSPAWNLOCAL = false) //TODO:Remove DEBUGSPAWNLOCAL Once debugging is complete
        {
            int simulatorID = Rand.Random.Next(-int.MaxValue, int.MaxValue);                          //TODO: remove collision potential

            ConsoleManager.WriteLine("Attempting simulator spawn, ID " + simulatorID, ConsoleMessageType.Startup);

            var newsim = new SimulatorInterface(simulatorID, _config, _redisServer);

            if (!DEBUGSPAWNLOCAL)
            {
                newsim.Spawn(areasToSimulate);
            }

            else
            {
                newsim.DEBUGSpawnLocal(areasToSimulate);
            }


            return(newsim);
        }
Ejemplo n.º 24
0
        /// <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;
        }
Ejemplo n.º 25
0
        /// <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));
        }
Ejemplo n.º 26
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;
        }
Ejemplo n.º 27
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");
            }
        }
Ejemplo n.º 28
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);
        }
Ejemplo n.º 29
0
 private void AdminShipChange(Player player, ShipStats shs)
 {
     ConsoleManager.WriteLine("Warning: AdminShipChange is currently disabled.", ConsoleMessageType.Warning);
 }
Ejemplo n.º 30
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;
             * }
             */
        }