Beispiel #1
0
        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);
        }
Beispiel #2
0
        /// <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;
            }
            }
        }