public static void DuplicateAIShooterAndAIBulletBank(GameObject targetObject, AIShooter sourceShooter, AIBulletBank sourceBulletBank, int startingGunOverrideID = 0, Transform gunAttachPointOverride = null, Transform bulletScriptAttachPointOverride = null, PlayerHandController overrideHandObject = null) { if (targetObject.GetComponent <AIShooter>() && targetObject.GetComponent <AIBulletBank>()) { return; } if (!targetObject.GetComponent <AIBulletBank>()) { AIBulletBank aibulletBank = targetObject.AddComponent <AIBulletBank>(); aibulletBank.Bullets = new List <AIBulletBank.Entry>(0); if (sourceBulletBank.Bullets.Count > 0) { foreach (AIBulletBank.Entry entry in sourceBulletBank.Bullets) { aibulletBank.Bullets.Add(new AIBulletBank.Entry { Name = entry.Name, BulletObject = entry.BulletObject, OverrideProjectile = entry.OverrideProjectile, ProjectileData = new ProjectileData { damage = entry.ProjectileData.damage, speed = entry.ProjectileData.speed, range = entry.ProjectileData.range, force = entry.ProjectileData.force, damping = entry.ProjectileData.damping, UsesCustomAccelerationCurve = entry.ProjectileData.UsesCustomAccelerationCurve, AccelerationCurve = entry.ProjectileData.AccelerationCurve, CustomAccelerationCurveDuration = entry.ProjectileData.CustomAccelerationCurveDuration, onDestroyBulletScript = entry.ProjectileData.onDestroyBulletScript, IgnoreAccelCurveTime = entry.ProjectileData.IgnoreAccelCurveTime }, PlayAudio = entry.PlayAudio, AudioSwitch = entry.AudioSwitch, AudioEvent = entry.AudioEvent, AudioLimitOncePerFrame = entry.AudioLimitOncePerFrame, AudioLimitOncePerAttack = entry.AudioLimitOncePerAttack, MuzzleFlashEffects = new VFXPool { effects = entry.MuzzleFlashEffects.effects, type = entry.MuzzleFlashEffects.type }, MuzzleLimitOncePerFrame = entry.MuzzleLimitOncePerFrame, MuzzleInheritsTransformDirection = entry.MuzzleInheritsTransformDirection, ShellTransform = entry.ShellTransform, ShellPrefab = entry.ShellPrefab, ShellForce = entry.ShellForce, ShellForceVariance = entry.ShellForceVariance, DontRotateShell = entry.DontRotateShell, ShellGroundOffset = entry.ShellGroundOffset, ShellsLimitOncePerFrame = entry.ShellsLimitOncePerFrame, rampBullets = entry.rampBullets, conditionalMinDegFromNorth = entry.conditionalMinDegFromNorth, forceCanHitEnemies = entry.forceCanHitEnemies, suppressHitEffectsIfOffscreen = entry.suppressHitEffectsIfOffscreen, preloadCount = entry.preloadCount }); } } aibulletBank.useDefaultBulletIfMissing = true; aibulletBank.transforms = new List <Transform>(); if (sourceBulletBank.transforms != null && sourceBulletBank.transforms.Count > 0) { foreach (Transform item in sourceBulletBank.transforms) { aibulletBank.transforms.Add(item); } } aibulletBank.RegenerateCache(); } if (!targetObject.GetComponent <AIShooter>()) { AIShooter aishooter = targetObject.AddComponent <AIShooter>(); aishooter.volley = sourceShooter.volley; if (startingGunOverrideID != 0) { aishooter.equippedGunId = startingGunOverrideID; } else { aishooter.equippedGunId = sourceShooter.equippedGunId; } aishooter.shouldUseGunReload = true; aishooter.volleyShootPosition = sourceShooter.volleyShootPosition; aishooter.volleyShellCasing = sourceShooter.volleyShellCasing; aishooter.volleyShellTransform = sourceShooter.volleyShellTransform; aishooter.volleyShootVfx = sourceShooter.volleyShootVfx; aishooter.usesOctantShootVFX = sourceShooter.usesOctantShootVFX; aishooter.bulletName = sourceShooter.bulletName; aishooter.customShootCooldownPeriod = sourceShooter.customShootCooldownPeriod; aishooter.doesScreenShake = sourceShooter.doesScreenShake; aishooter.rampBullets = sourceShooter.rampBullets; aishooter.rampStartHeight = sourceShooter.rampStartHeight; aishooter.rampTime = sourceShooter.rampTime; if (gunAttachPointOverride) { aishooter.gunAttachPoint = gunAttachPointOverride; } else { aishooter.gunAttachPoint = sourceShooter.gunAttachPoint; } if (bulletScriptAttachPointOverride) { aishooter.bulletScriptAttachPoint = bulletScriptAttachPointOverride; } else { aishooter.bulletScriptAttachPoint = sourceShooter.bulletScriptAttachPoint; } aishooter.overallGunAttachOffset = sourceShooter.overallGunAttachOffset; aishooter.flippedGunAttachOffset = sourceShooter.flippedGunAttachOffset; if (overrideHandObject) { aishooter.handObject = overrideHandObject; } else { aishooter.handObject = sourceShooter.handObject; } aishooter.AllowTwoHands = sourceShooter.AllowTwoHands; aishooter.ForceGunOnTop = sourceShooter.ForceGunOnTop; aishooter.IsReallyBigBoy = sourceShooter.IsReallyBigBoy; aishooter.BackupAimInMoveDirection = sourceShooter.BackupAimInMoveDirection; aishooter.RegenerateCache(); } }