public virtual void StructureFired(ICanFire firingStructure, float rotation, List <int> projectileIDs, IProjectileManager pm, byte percentCharge, byte weaponSlot) { foreach (var id in projectileIDs) { pm.CreateProjectile(firingStructure, id); } var messageData = new MessageObjectFired { ObjectType = FiringObjectTypes.Structure, FiringObjectID = firingStructure.Id, PercentCharge = percentCharge, Rotation = rotation, WeaponSlot = weaponSlot, ProjectileIDs = projectileIDs }; BroadcastMessage(new NetworkMessageContainer(messageData, MessageTypes.ObjectFired), null); }
/// <summary> /// Creates projectiles and notifies other clients of firing ship /// </summary> /// <param name="firingPlayer"></param> /// <param name="weaponSlot"></param> public virtual void ShipFired(IShip firingShip, float rotation, byte weaponSlot, List <int> projectileIDs, IProjectileManager pm, byte percentCharge = 0) { foreach (var id in projectileIDs) { pm.CreateProjectile(firingShip, id); } MessageObjectFired messageData = new MessageObjectFired { FiringObjectID = firingShip.Id, ObjectType = FiringObjectTypes.Ship, PercentCharge = percentCharge, Rotation = rotation, WeaponSlot = weaponSlot, ProjectileIDs = projectileIDs }; BroadcastMessage(new NetworkMessageContainer(messageData, MessageTypes.ObjectFired), firingShip.Id, firingShip.PilotType == PilotTypes.NPC);//If NPC, simulator doesn't need to get spammed with ship fired notifications }
public void ObjectFired(MessageObjectFired data) { switch (data.ObjectType) { case FiringObjectTypes.Structure: { var structure = GetStructureByID(data.FiringObjectID); if (structure != null) // In case we get a fire message after a kill { if (structure.Weapon.Stats.NumProjectiles != data.ProjectileIDs.Count) { ConsoleManager.WriteLine("Error: MessageObjectFired received with different number of projectileIDs than expected. Weapons for this object are not synced between server and client.", ConsoleMessageType.Error); return; } structure.Weapon.Fire_ServerOrigin(data.ProjectileIDs, structure.Rotation, data.PercentCharge, true); if (structure.StructureType == StructureTypes.DefensiveMine) { structure.Kill(); RemoveStructure(structure); } } break; } case FiringObjectTypes.Ship: { Ship tempShip = _clientShipManager.GetShip(data.FiringObjectID); if (tempShip != null) { Weapon w = tempShip.GetWeapon(data.WeaponSlot); if (w != null) { if (w.Stats.NumProjectiles != data.ProjectileIDs.Count) { ConsoleManager.WriteLine("Error: MessageObjectFired received with different number of projectileIDs than expected. Weapons for this object are not synced between server and client.", ConsoleMessageType.Error); return; } w.Fire_ServerOrigin(data.ProjectileIDs, data.Rotation, data.PercentCharge, true); } } break; } } }