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; }