/// <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)); } }
public void RemoveFloatyAreaObjects(MessageRemoveKillRevive data) { foreach (var id in data.ObjectIDs) { RemoveFloatyAreaObject(id); } }
/// <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)); }
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)); }
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)); }
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)); } }
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)); } }
/// <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 }
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); }