/// <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)); }
private void AdminShipChange(Player player, ShipStats shs) { ConsoleManager.WriteLine("Warning: AdminShipChange is currently disabled.", ConsoleMessageType.Warning); }
/// <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; * } */ }
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); }
/// <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; }
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"); } }
/// <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; }