internal Dictionary <EventTriggers, PartAnimation[]> CreateWeaponAnimationSet(WeaponSystem system, RecursiveSubparts parts)
        {
            if (!system.AnimationsInited)
            {
                var allAnimationSet = new Dictionary <EventTriggers, PartAnimation[]>();
                foreach (var animationSet in system.WeaponAnimationSet)
                {
                    allAnimationSet[animationSet.Key] = new PartAnimation[animationSet.Value.Length];

                    for (int i = 0; i < animationSet.Value.Length; i++)
                    {
                        var      animation = animationSet.Value[i];
                        MyEntity part;
                        parts.NameToEntity.TryGetValue(animation.SubpartId, out part);
                        var subpart = part as MyEntitySubpart;
                        if (subpart == null)
                        {
                            continue;
                        }

                        var rotations  = new Matrix[animation.RotationSet.Length];
                        var rotCenters = new Matrix[animation.RotCenterSet.Length];
                        animation.RotationSet.CopyTo(rotations, 0);
                        animation.RotCenterSet.CopyTo(rotCenters, 0);

                        var rotCenterNames = animation.RotCenterNameSet;

                        var partCenter = GetPartLocation("subpart_" + animation.SubpartId, subpart.Parent.Model);


                        for (int j = 0; j < rotations.Length; j++)
                        {
                            if (rotations[j] != Matrix.Zero)
                            {
                                rotations[j] = Matrix.CreateTranslation(-partCenter) * rotations[j] * Matrix.CreateTranslation(partCenter);
                            }
                        }

                        for (int j = 0; j < rotCenters.Length; j++)
                        {
                            if (rotCenters[j] != Matrix.Zero && rotCenterNames != null)
                            {
                                var dummyCenter = GetPartLocation(rotCenterNames[j], subpart.Model);
                                rotCenters[j] = Matrix.CreateTranslation(-(partCenter + dummyCenter)) * rotCenters[j] * Matrix.CreateTranslation((partCenter + dummyCenter));
                            }
                        }

                        allAnimationSet[animationSet.Key][i] = new PartAnimation(animation.EventTrigger, animation.AnimationId, rotations, rotCenters,
                                                                                 animation.TypeSet, animation.EmissiveIds, animation.CurrentEmissivePart, animation.MoveToSetIndexer, animation.SubpartId, subpart, parts.Entity,
                                                                                 animation.Muzzle, animation.MotionDelay, system, animation.DoesLoop,
                                                                                 animation.DoesReverse, animation.TriggerOnce, animation.ResetEmissives);
                    }
                }

                system.WeaponAnimationSet.Clear();

                foreach (var animationKv in allAnimationSet)
                {
                    system.WeaponAnimationSet[animationKv.Key] = new PartAnimation[animationKv.Value.Length];
                    animationKv.Value.CopyTo(system.WeaponAnimationSet[animationKv.Key], 0);
                }

                system.AnimationsInited = true;
                return(allAnimationSet);
            }

            var returnAnimations = new Dictionary <EventTriggers, PartAnimation[]>();

            foreach (var animationKv in system.WeaponAnimationSet)
            {
                returnAnimations[animationKv.Key] = new PartAnimation[animationKv.Value.Length];
                for (int i = 0; i < animationKv.Value.Length; i++)
                {
                    var      animation = animationKv.Value[i];
                    MyEntity part;
                    parts.NameToEntity.TryGetValue(animation.SubpartId, out part);
                    var subpart = part as MyEntitySubpart;
                    if (subpart == null)
                    {
                        continue;
                    }
                    returnAnimations[animationKv.Key][i] = new PartAnimation(animation)
                    {
                        Part    = subpart,
                        MainEnt = parts.Entity,
                    };
                }
            }
            //Log.Line("Copying Animations");
            return(returnAnimations);
        }
Пример #2
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];
        }