Esempio n. 1
0
        internal Weapon(MyEntity entity, WeaponSystem system, int weaponId, WeaponComponent comp, RecursiveSubparts parts, MyEntity elevationPart, MyEntity azimuthPart, string azimuthPartName, string elevationPartName)
        {
            System            = system;
            Comp              = comp;
            WeaponCreatedTick = System.Session.Tick;

            AnimationsSet = comp.Session.CreateWeaponAnimationSet(system, parts);
            foreach (var set in AnimationsSet)
            {
                foreach (var pa in set.Value)
                {
                    comp.AllAnimations.Add(pa);
                    AnimationLookup.Add(pa.AnimationId, pa);
                }
            }

            ParticleEvents = comp.Session.CreateWeaponParticleEvents(system, parts);

            MyStringHash subtype;

            if (comp.MyCube.DefinitionId.HasValue && comp.Session.VanillaIds.TryGetValue(comp.MyCube.DefinitionId.Value, out subtype))
            {
                if (subtype.String.Contains("Gatling"))
                {
                    _numModelBarrels = 6;
                }
                else
                {
                    _numModelBarrels = System.Barrels.Length;
                }
            }
            else
            {
                _numModelBarrels = System.Barrels.Length;
            }


            bool hitParticle = false;

            foreach (var ammoType in System.AmmoTypes)
            {
                var c = ammoType.AmmoDef.Const;
                if (c.EnergyAmmo)
                {
                    CanUseEnergyAmmo = true;
                }
                if (c.IsHybrid)
                {
                    CanUseHybridAmmo = true;
                }
                if (c.MustCharge)
                {
                    CanUseChargeAmmo = true;
                }
                if (c.IsBeamWeapon)
                {
                    CanUseBeams = true;
                }
                if (c.HitParticle)
                {
                    hitParticle = true;
                }
            }

            comp.HasEnergyWeapon = comp.HasEnergyWeapon || CanUseEnergyAmmo || CanUseHybridAmmo;

            AvCapable = System.HasBarrelShootAv && !Comp.Session.DedicatedServer || hitParticle;

            if (AvCapable && system.FiringSound == WeaponSystem.FiringSoundState.WhenDone)
            {
                FiringEmitter = System.Session.Emitters.Count > 0 ? System.Session.Emitters.Pop() : new MyEntity3DSoundEmitter(null, false, 1f);
                FiringEmitter.CanPlayLoopSounds = true;
                FiringEmitter.Entity            = Comp.MyCube;
                FiringSound = System.FireWhenDonePairs.Count > 0 ? System.FireWhenDonePairs.Pop() : new MySoundPair(System.Values.HardPoint.Audio.FiringSound, false);
            }

            if (AvCapable && system.PreFireSound)
            {
                PreFiringEmitter = System.Session.Emitters.Count > 0 ? System.Session.Emitters.Pop() : new MyEntity3DSoundEmitter(null, false, 1f);
                PreFiringEmitter.CanPlayLoopSounds = true;

                PreFiringEmitter.Entity = Comp.MyCube;
                PreFiringSound          = System.PreFirePairs.Count > 0 ? System.PreFirePairs.Pop() : new MySoundPair(System.Values.HardPoint.Audio.PreFiringSound, false);
            }

            if (AvCapable && system.WeaponReloadSound)
            {
                ReloadEmitter = System.Session.Emitters.Count > 0 ? System.Session.Emitters.Pop() : new MyEntity3DSoundEmitter(null, false, 1f);
                ReloadEmitter.CanPlayLoopSounds = true;

                ReloadEmitter.Entity = Comp.MyCube;
                ReloadSound          = System.ReloadPairs.Count > 0 ? System.ReloadPairs.Pop() : new MySoundPair(System.Values.HardPoint.Audio.ReloadSound, false);
            }

            if (AvCapable && system.BarrelRotationSound)
            {
                RotateEmitter = System.Session.Emitters.Count > 0 ? System.Session.Emitters.Pop() : new MyEntity3DSoundEmitter(null, false, 1f);
                RotateEmitter.CanPlayLoopSounds = true;

                RotateEmitter.Entity = Comp.MyCube;
                RotateSound          = System.RotatePairs.Count > 0 ? System.RotatePairs.Pop() : new MySoundPair(System.Values.HardPoint.Audio.BarrelRotationSound, false);
            }

            if (AvCapable)
            {
                if (System.BarrelEffect1)
                {
                    BarrelEffects1 = new MyParticleEffect[System.Values.Assignments.Barrels.Length];
                }
                if (System.BarrelEffect2)
                {
                    BarrelEffects2 = new MyParticleEffect[System.Values.Assignments.Barrels.Length];
                }
                if (hitParticle && CanUseBeams)
                {
                    HitEffects = new MyParticleEffect[System.Values.Assignments.Barrels.Length];
                }
            }

            if (System.Armor != ArmorState.IsWeapon)
            {
                Comp.HasArmor = true;
            }

            WeaponId           = weaponId;
            PrimaryWeaponGroup = WeaponId % 2 == 0;
            IsTurret           = System.Values.HardPoint.Ai.TurretAttached;
            TurretMode         = System.Values.HardPoint.Ai.TurretController;
            TrackTarget        = System.Values.HardPoint.Ai.TrackTargets;

            if (System.Values.HardPoint.Ai.TurretController)
            {
                AiEnabled = true;
            }

            AimOffset   = System.Values.HardPoint.HardWare.Offset;
            FixedOffset = System.Values.HardPoint.HardWare.FixedOffset;

            HsRate         = System.Values.HardPoint.Loading.HeatSinkRate / 3;
            EnergyPriority = System.Values.HardPoint.Other.EnergyPriority;
            var toleranceInRadians = MathHelperD.ToRadians(System.Values.HardPoint.AimingTolerance);

            AimCone.ConeAngle = toleranceInRadians;
            AimingTolerance   = Math.Cos(toleranceInRadians);

            if (Comp.Platform.Structure.PrimaryWeapon == weaponId)
            {
                comp.TrackingWeapon = this;
            }

            if (IsTurret && !TrackTarget)
            {
                Target = comp.TrackingWeapon.Target;
            }
            else
            {
                Target = new Target(this, true);
            }

            _numOfBarrels = System.Barrels.Length;
            BeamSlot      = new uint[_numOfBarrels];
            Muzzles       = new Muzzle[_numOfBarrels];
            Dummies       = new Dummy[_numOfBarrels];
            WeaponCache   = new WeaponFrameCache(_numOfBarrels);
            NewTarget     = new Target(this);
            RayCallBack   = new ParallelRayCallBack(this);
            Acquire       = new WeaponAcquire(this);
            AzimuthPart   = new PartInfo {
                Entity = azimuthPart
            };
            ElevationPart = new PartInfo {
                Entity = elevationPart
            };
            MuzzlePart = new PartInfo {
                Entity = entity
            };
            MiddleMuzzleIndex = Muzzles.Length > 1 ? Muzzles.Length / 2 - 1 : 0;

            var burstDelay = System.Values.HardPoint.Loading.DelayAfterBurst;

            ShowBurstDelayAsReload = Comp.Session.HandlesInput && System.Values.HardPoint.Loading.ShotsInBurst > 0 && burstDelay > 30 && burstDelay >= TicksPerShot && burstDelay >= System.Values.HardPoint.Loading.ReloadTime;

            ParentIsSubpart   = azimuthPart.Parent is MyEntitySubpart;
            AzimuthInitFwdDir = azimuthPart.PositionComp.LocalMatrixRef.Forward;

            FuckMyLife();

            AiOnlyWeapon = Comp.BaseType != WeaponComponent.BlockType.Turret || (Comp.BaseType == WeaponComponent.BlockType.Turret && (azimuthPartName != "MissileTurretBase1" && elevationPartName != "MissileTurretBarrels" && azimuthPartName != "InteriorTurretBase1" && elevationPartName != "InteriorTurretBase2" && azimuthPartName != "GatlingTurretBase1" && elevationPartName != "GatlingTurretBase2"));
            UniqueId     = comp.Session.UniqueWeaponId;
            ShortLoadId  = comp.Session.ShortLoadAssigner();

            string   ejectorMatch;
            MyEntity ejectorPart;

            if (System.HasEjector && Comp.Platform.Parts.FindFirstDummyByName(System.Values.Assignments.Ejector, System.AltEjectorName, out ejectorPart, out ejectorMatch))
            {
                Ejector = new Dummy(ejectorPart, this, System.Values.Assignments.Ejector);
            }

            string   scopeMatch;
            MyEntity scopePart;

            if (System.HasScope && Comp.Platform.Parts.FindFirstDummyByName(System.Values.Assignments.Scope, System.AltScopeName, out scopePart, out scopeMatch))
            {
                Scope = new Dummy(scopePart, this, scopeMatch);
            }

            Monitors = Comp.Monitors[WeaponId];
        }
        public Weapon(MyEntity entity, WeaponSystem system, int weaponId, WeaponComponent comp, Dictionary <EventTriggers, PartAnimation[]> animationSets)
        {
            LoadId      = comp.Session.LoadAssigner();
            ShortLoadId = comp.Session.ShortLoadAssigner();
            MuzzlePart  = new PartInfo {
                Entity = entity
            };
            AnimationsSet = animationSets;

            if (AnimationsSet != null)
            {
                foreach (var set in AnimationsSet)
                {
                    for (int j = 0; j < set.Value.Length; j++)
                    {
                        var animation = set.Value[j];
                        AnimationLookup.Add(animation.AnimationId, animation);
                    }
                }
            }

            System = system;
            Comp   = comp;

            MyStringHash subtype;

            if (comp.MyCube.DefinitionId.HasValue && comp.Session.VanillaIds.TryGetValue(comp.MyCube.DefinitionId.Value, out subtype))
            {
                if (subtype.String.Contains("Gatling"))
                {
                    _numModelBarrels = 6;
                }
                else
                {
                    _numModelBarrels = System.Barrels.Length;
                }
            }
            else
            {
                _numModelBarrels = System.Barrels.Length;
            }


            bool hitParticle = false;

            foreach (var ammoType in System.WeaponAmmoTypes)
            {
                var c = ammoType.AmmoDef.Const;
                if (c.EnergyAmmo)
                {
                    CanUseEnergyAmmo = true;
                }
                if (c.IsHybrid)
                {
                    CanUseHybridAmmo = true;
                }
                if (c.MustCharge)
                {
                    CanUseChargeAmmo = true;
                }
                if (c.IsBeamWeapon)
                {
                    CanUseBeams = true;
                }
                if (c.HitParticle)
                {
                    hitParticle = true;
                }
            }

            comp.HasEnergyWeapon = comp.HasEnergyWeapon || CanUseEnergyAmmo || CanUseHybridAmmo;

            AvCapable = System.HasBarrelShootAv && !Comp.Session.DedicatedServer;

            if (AvCapable && system.FiringSound == WeaponSystem.FiringSoundState.WhenDone)
            {
                FiringEmitter = new MyEntity3DSoundEmitter(Comp.MyCube, true, 1f);
                FiringSound   = new MySoundPair();
                FiringSound.Init(System.Values.HardPoint.Audio.FiringSound);
            }

            if (AvCapable && system.PreFireSound)
            {
                PreFiringEmitter = new MyEntity3DSoundEmitter(Comp.MyCube, true, 1f);
                PreFiringSound   = new MySoundPair();
                PreFiringSound.Init(System.Values.HardPoint.Audio.PreFiringSound);
            }

            if (AvCapable && system.WeaponReloadSound)
            {
                ReloadEmitter = new MyEntity3DSoundEmitter(Comp.MyCube, true, 1f);
                ReloadSound   = new MySoundPair();
                ReloadSound.Init(System.Values.HardPoint.Audio.ReloadSound);
            }

            if (AvCapable && system.BarrelRotationSound)
            {
                RotateEmitter = new MyEntity3DSoundEmitter(Comp.MyCube, true, 1f);
                RotateSound   = new MySoundPair();
                RotateSound.Init(System.Values.HardPoint.Audio.BarrelRotationSound);
            }

            if (AvCapable)
            {
                if (System.BarrelEffect1)
                {
                    BarrelEffects1 = new MyParticleEffect[System.Values.Assignments.Barrels.Length];
                }
                if (System.BarrelEffect2)
                {
                    BarrelEffects2 = new MyParticleEffect[System.Values.Assignments.Barrels.Length];
                }
                if (hitParticle && CanUseBeams)
                {
                    HitEffects = new MyParticleEffect[System.Values.Assignments.Barrels.Length];
                }
            }

            WeaponId           = weaponId;
            PrimaryWeaponGroup = WeaponId % 2 == 0;
            IsTurret           = System.Values.HardPoint.Ai.TurretAttached;
            TurretMode         = System.Values.HardPoint.Ai.TurretController;
            TrackTarget        = System.Values.HardPoint.Ai.TrackTargets;

            if (System.Values.HardPoint.Ai.TurretController)
            {
                AiEnabled   = true;
                AimOffset   = System.Values.HardPoint.HardWare.Offset;
                FixedOffset = System.Values.HardPoint.HardWare.FixedOffset;
            }

            HsRate         = System.Values.HardPoint.Loading.HeatSinkRate / 3;
            EnergyPriority = System.Values.HardPoint.Other.EnergyPriority;
            var toleranceInRadians = MathHelperD.ToRadians(System.Values.HardPoint.AimingTolerance);

            AimCone.ConeAngle = toleranceInRadians;
            AimingTolerance   = Math.Cos(toleranceInRadians);



            _numOfBarrels    = System.Barrels.Length;
            BeamSlot         = new uint[_numOfBarrels];
            Target           = new Target(comp.MyCube);
            NewTarget        = new Target(comp.MyCube);
            WeaponCache      = new WeaponFrameCache(System.Values.Assignments.Barrels.Length);
            TrackProjectiles = System.TrackProjectile;
        }