public static void Add() { Gun gun = ETGMod.Databases.Items.NewGun("Blankannon", "blankannon"); Game.Items.Rename("outdated_gun_mods:blankannon", "nn:blankannon"); gun.gameObject.AddComponent <Blankannon>(); gun.SetShortDescription("Fires Blanks"); gun.SetLongDescription("It takes a very delicate pin to fire blanks instead of simply destroying them." + "\n\nThis elaborate device was put together from the scrapped parts of a laser-accurate surgical machine."); gun.SetupSprite(null, "blankannon_idle_001", 8); gun.SetAnimationFPS(gun.shootAnimation, 12); gun.AddPassiveStatModifier(PlayerStats.StatType.AdditionalBlanksPerFloor, 2f, StatModifier.ModifyMethod.ADDITIVE); gun.AddProjectileModuleFrom(PickupObjectDatabase.GetById(56) as Gun, true, false); //GUN STATS gun.DefaultModule.ammoCost = 0; gun.DefaultModule.shootStyle = ProjectileModule.ShootStyle.SemiAutomatic; gun.DefaultModule.sequenceStyle = ProjectileModule.ProjectileSequenceStyle.Random; gun.reloadTime = 0.8f; gun.DefaultModule.angleVariance = 0f; gun.DefaultModule.cooldownTime = 0.5f; gun.DefaultModule.numberOfShotsInClip = 10; gun.barrelOffset.transform.localPosition = new Vector3(1.98f, 0.75f, 0f); gun.SetBaseMaxAmmo(0); gun.gunClass = GunClass.SHITTY; //HEART BULLET STATS Projectile projectile = UnityEngine.Object.Instantiate <Projectile>(gun.DefaultModule.projectiles[0]); projectile.gameObject.SetActive(false); FakePrefab.MarkAsFakePrefab(projectile.gameObject); UnityEngine.Object.DontDestroyOnLoad(projectile); gun.DefaultModule.projectiles[0] = projectile; projectile.baseData.damage *= 20f; projectile.pierceMinorBreakables = true; projectile.baseData.speed *= 1f; projectile.ignoreDamageCaps = true; projectile.baseData.range *= 10f; BlankOnHitModifier blankingArmour = projectile.gameObject.GetOrAddComponent <BlankOnHitModifier>(); blankingArmour.useTinyBlank = false; projectile.SetProjectileSpriteRight("blankannon_projectile", 10, 7, false, tk2dBaseSprite.Anchor.MiddleCenter, 10, 7); gun.DefaultModule.ammoType = GameUIAmmoType.AmmoType.CUSTOM; gun.DefaultModule.customAmmoType = CustomClipAmmoTypeToolbox.AddCustomAmmoType("Blank UI Bullets", "NevernamedsItems/Resources/CustomGunAmmoTypes/blankannon_clipfull", "NevernamedsItems/Resources/CustomGunAmmoTypes/blankannon_clipempty"); projectile.transform.parent = gun.barrelOffset; gun.quality = PickupObject.ItemQuality.C; //C ETGMod.Databases.Items.Add(gun, null, "ANY"); BlankannonId = gun.PickupObjectId; }
private void PostProcessProjectile(Projectile sourceProjectile, float effectChanceScalar) { try { if (sourceProjectile.GetComponent <HasBeenBulletShuffled>() == null) { int num = UnityEngine.Random.Range(1, 55); //VFXToolbox.DoStringSquirt(num.ToString(), sourceProjectile.ProjectilePlayerOwner().specRigidbody.UnitCenter, Color.red); switch (num) { case 1: //+1 Bullets ------------------------------- WORKS sourceProjectile.baseData.damage *= 1.25f; break; case 2: //Rocket Powered Bullets ------------------------------- WORKS sourceProjectile.baseData.damage *= 1.1f; sourceProjectile.baseData.speed *= 1.5f; sourceProjectile.UpdateSpeed(); break; case 3: //Devolver Bullets ------------------------------- WORKS AdvancedTransmogrifyComponent advancedTransmog = sourceProjectile.gameObject.AddComponent <AdvancedTransmogrifyComponent>(); advancedTransmog.TransmogDataList = new List <AdvancedTransmogrifyComponent.TransmogData>() { new AdvancedTransmogrifyComponent.TransmogData() { identifier = "BulletShuffle", maintainHPPercent = false, TargetGuid = "05891b158cd542b1a5f3df30fb67a7ff", TransmogChance = 1, } }; break; case 4: //Vorpal Bullets StartCoroutine(EraseAndReplace(sourceProjectile, PickupObjectDatabase.GetById(640).GetComponent <ComplexProjectileModifier>().CriticalProjectile)); break; case 5: //Katana Bullets ------------------------------- WORKS sourceProjectile.OnHitEnemy += DoKatana; break; case 6: //Hungry Bullets ------------------------------- WORKS HungryProjectileModifier hungry = sourceProjectile.gameObject.GetOrAddComponent <HungryProjectileModifier>(); hungry.HungryRadius = 1.5f; hungry.DamagePercentGainPerSnack = 0.25f; hungry.MaxMultiplier = 3f; hungry.MaximumBulletsEaten = 10; sourceProjectile.AdjustPlayerProjectileTint(ExtendedColours.purple, 1); break; case 7: //Heavy Bullets ------------------------------- WORKS sourceProjectile.baseData.damage *= 1.25f; sourceProjectile.baseData.speed *= 0.5f; sourceProjectile.baseData.force *= 2f; sourceProjectile.RuntimeUpdateScale(1.25f); sourceProjectile.UpdateSpeed(); break; case 8: //Bouncy Bullets ------------------------------- WORKS BounceProjModifier bounce = sourceProjectile.gameObject.GetOrAddComponent <BounceProjModifier>(); bounce.numberOfBounces++; break; case 9: //Explosive Rounds ------------------------------- WORKS ExplosiveModifier explosion = sourceProjectile.gameObject.AddComponent <ExplosiveModifier>(); explosion.doExplosion = true; explosion.explosionData = StaticExplosionDatas.explosiveRoundsExplosion; break; case 10: //Ghost Bullets ------------------------------- WORKS PierceProjModifier piercing = sourceProjectile.gameObject.AddComponent <PierceProjModifier>(); piercing.penetration++; break; case 11: //Irradiated Lead ------------------------------- WORKS sourceProjectile.statusEffectsToApply.Add(StaticStatusEffects.irradiatedLeadEffect); sourceProjectile.AdjustPlayerProjectileTint(ExtendedColours.poisonGreen, 1); break; case 12: //Hot Lead ------------------------------- WORKS sourceProjectile.statusEffectsToApply.Add(StaticStatusEffects.hotLeadEffect); sourceProjectile.AdjustPlayerProjectileTint(Color.red, 1); break; case 13: //Battery Bullets ------------------------------- WORKS sourceProjectile.damageTypes |= CoreDamageTypes.Electric; break; case 14: //Frost Bullets (Actully just insta freeze but whatever) sourceProjectile.statusEffectsToApply.Add(StaticStatusEffects.chaosBulletsFreeze); sourceProjectile.AdjustPlayerProjectileTint(ExtendedColours.freezeBlue, 1); break; case 15: //Charming Rounds ------------------------------- WORKS sourceProjectile.statusEffectsToApply.Add(StaticStatusEffects.charmingRoundsEffect); sourceProjectile.AdjustPlayerProjectileTint(ExtendedColours.charmPink, 1); break; case 16: //Magic Bullets ------------------------------- WORKS AdvancedTransmogrifyComponent advancedTransmog2 = sourceProjectile.gameObject.AddComponent <AdvancedTransmogrifyComponent>(); advancedTransmog2.TransmogDataList = new List <AdvancedTransmogrifyComponent.TransmogData>() { new AdvancedTransmogrifyComponent.TransmogData() { identifier = "BulletShuffle", maintainHPPercent = false, TargetGuid = "76bc43539fc24648bff4568c75c686d1", TransmogChance = 1, } }; break; case 17: //Fat Bullets ------------------------------- WORKS sourceProjectile.baseData.force *= 2f; sourceProjectile.RuntimeUpdateScale(2f); sourceProjectile.baseData.damage *= 1.3f; break; case 18: //Angry Bullets ------------------------------- WORKS AngryBulletsProjectileBehaviour angry = sourceProjectile.gameObject.AddComponent <AngryBulletsProjectileBehaviour>(); break; case 19: //Blank Bullets BlankOnHitModifier blanking = sourceProjectile.gameObject.GetOrAddComponent <BlankOnHitModifier>(); blanking.useTinyBlank = true; break; case 20: //Orbital Bullets Behaviour ------------------------------- WORKS OrbitalBulletsBehaviour orbiting = sourceProjectile.gameObject.GetOrAddComponent <OrbitalBulletsBehaviour>(); break; case 21: //Shadow Bullets ------------------------------- WORKS sourceProjectile.SpawnChainedShadowBullets(1, 0.05f, 1, null, true); break; case 22: //Stout Bullets ------------------------------- WORKS sourceProjectile.RuntimeUpdateScale(1.5f); sourceProjectile.gameObject.GetOrAddComponent <StoutBulletsProjectileBehaviour>(); break; case 23: //Snowballets ------------------------------- WORKS ScalingProjectileModifier scalingProjectileModifier = sourceProjectile.gameObject.AddComponent <ScalingProjectileModifier>(); scalingProjectileModifier.ScaleToDamageRatio = 2.5f / 10f; scalingProjectileModifier.MaximumDamageMultiplier = 2.5f; scalingProjectileModifier.IsSynergyContingent = false; scalingProjectileModifier.PercentGainPerUnit = 10f; break; case 24: //Remote Bullets ------------------------------- WORKS sourceProjectile.gameObject.GetOrAddComponent <RemoteBulletsProjectileBehaviour>(); break; case 25: //Zombie Bullets ------------------------------- WORKS sourceProjectile.OnDestruction += HandleZombieEffect; break; case 26: //Flak Bullets ------------------------------- WORKS sourceProjectile.gameObject.GetOrAddComponent <FlakBulletsProjectileBehaviour>(); break; case 27: //Silver Bullets ------------------------------- WORKS sourceProjectile.BossDamageMultiplier *= 1.25f; sourceProjectile.BlackPhantomDamageMultiplier *= 2.25f; sourceProjectile.AdjustPlayerProjectileTint(ExtendedColours.silvedBulletsSilver, 1); break; case 28: //Gilded Bullets ------------------------------- WORKS float gildnum = 0f; ScalingStatBoostItem gildedbullets = PickupObjectDatabase.GetById(532).GetComponent <ScalingStatBoostItem>(); gildnum = Mathf.Clamp01(Mathf.InverseLerp(gildedbullets.ScalingTargetMin, gildedbullets.ScalingTargetMax, sourceProjectile.ProjectilePlayerOwner().carriedConsumables.Currency)); gildnum = gildedbullets.ScalingCurve.Evaluate(gildnum); float gildnum2 = Mathf.Lerp(gildedbullets.MinScaling, gildedbullets.MaxScaling, gildnum); sourceProjectile.baseData.damage *= gildnum2; sourceProjectile.AdjustPlayerProjectileTint(gildedbullets.TintColor, gildedbullets.TintPriority, 0f); break; case 29: //Cursed Bullets ------------------------------- WORKS float cursenum = 0f; ScalingStatBoostItem cursedBullets = PickupObjectDatabase.GetById(571).GetComponent <ScalingStatBoostItem>(); cursenum = Mathf.Clamp01(Mathf.InverseLerp(cursedBullets.ScalingTargetMin, cursedBullets.ScalingTargetMax, sourceProjectile.ProjectilePlayerOwner().stats.GetStatValue(PlayerStats.StatType.Curse))); cursenum = cursedBullets.ScalingCurve.Evaluate(cursenum); float cursenum2 = Mathf.Lerp(cursedBullets.MinScaling, cursedBullets.MaxScaling, cursenum); sourceProjectile.baseData.damage *= cursenum2; sourceProjectile.AdjustPlayerProjectileTint(cursedBullets.TintColor, cursedBullets.TintPriority, 0f); sourceProjectile.CurseSparks = true; break; case 30: //Chance Bullets DoChanceBulletsEffect(sourceProjectile); break; case 31: //Bumbullets StartCoroutine(SpawnAdditionalProjectile(sourceProjectile, (PickupObjectDatabase.GetById(14) as Gun).DefaultModule.projectiles[0], 0)); break; case 32: //Bloody 9mm StartCoroutine(EraseAndReplace(sourceProjectile, PickupObjectDatabase.GetById(524).GetComponent <RandomProjectileReplacementItem>().ReplacementProjectile)); break; case 33: //Slow ------------------------------- WORKS sourceProjectile.statusEffectsToApply.Add(StaticStatusEffects.tripleCrossbowSlowEffect); sourceProjectile.AdjustPlayerProjectileTint(Color.yellow, 1); break; case 34: //Wallpierce sourceProjectile.pierceMinorBreakables = true; sourceProjectile.PenetratesInternalWalls = true; break; case 35: //Ignore DPS Cap sourceProjectile.ignoreDamageCaps = true; break; case 36: //Scattershot sourceProjectile.baseData.damage *= 0.55f; StartCoroutine(DoAdditionalShot(sourceProjectile, 0, 30f)); StartCoroutine(DoAdditionalShot(sourceProjectile, 0, 30f)); break; case 37: //Backup Gun StartCoroutine(DoAdditionalShot(sourceProjectile, 180, 5f)); break; case 38: //Helix StartCoroutine(DoAdditionalShot(sourceProjectile, 0, 0f, true)); sourceProjectile.ConvertToHelixMotion(false); break; case 39: //Killed enemies become projectiles (Casey) sourceProjectile.baseData.force *= 3f; KilledEnemiesBecomeProjectileModifier caseymode = sourceProjectile.gameObject.AddComponent <KilledEnemiesBecomeProjectileModifier>(); caseymode.CompletelyBecomeProjectile = (PickupObjectDatabase.GetById(541) as Gun).DefaultModule.chargeProjectiles[0].Projectile.GetComponent <KilledEnemiesBecomeProjectileModifier>().CompletelyBecomeProjectile; caseymode.BaseProjectile = (PickupObjectDatabase.GetById(541) as Gun).DefaultModule.chargeProjectiles[0].Projectile.GetComponent <KilledEnemiesBecomeProjectileModifier>().BaseProjectile; break; case 40: //Instant Cheese sourceProjectile.statusEffectsToApply.Add(StaticStatusEffects.instantCheese); sourceProjectile.AdjustPlayerProjectileTint(ExtendedColours.honeyYellow, 1); break; case 41: //Stun sourceProjectile.StunApplyChance = 1; sourceProjectile.AppliedStunDuration = 2; sourceProjectile.AppliesStun = true; break; case 42: //High Kaliber Effect sourceProjectile.OnHitEnemy += KaliberShit; break; case 43: //Tangler Squarify sourceProjectile.ApplyClonedShaderProjModifier((PickupObjectDatabase.GetById(175) as Gun).DefaultModule.projectiles[0].GetComponent <ShaderProjModifier>()); break; case 44: //Akey47 sourceProjectile.gameObject.AddComponent <KeyProjModifier>(); break; case 45: //Combine Vapourise sourceProjectile.baseData.damage *= 2f; CombineEvaporateEffect origEvap = (PickupObjectDatabase.GetById(519) as Gun).alternateVolley.projectiles[0].projectiles[0].GetComponent <CombineEvaporateEffect>(); CombineEvaporateEffect newEvap = sourceProjectile.gameObject.AddComponent <CombineEvaporateEffect>(); newEvap.FallbackShader = origEvap.FallbackShader; newEvap.ParticleSystemToSpawn = origEvap.ParticleSystemToSpawn; break; case 46: //Snakemaker Snakify AdvancedTransmogrifyComponent advancedTransmogSnek = sourceProjectile.gameObject.AddComponent <AdvancedTransmogrifyComponent>(); advancedTransmogSnek.TransmogDataList = new List <AdvancedTransmogrifyComponent.TransmogData>() { new AdvancedTransmogrifyComponent.TransmogData() { identifier = "BulletShuffle", maintainHPPercent = false, TargetGuid = "1386da0f42fb4bcabc5be8feb16a7c38", TransmogChance = 1, } }; break; case 47: //Sunlight Burn sourceProjectile.statusEffectsToApply.Add(StaticStatusEffects.SunlightBurn); break; case 48: //Tiger SummonTigerModifier tigerness = sourceProjectile.gameObject.AddComponent <SummonTigerModifier>(); tigerness.TigerProjectilePrefab = (PickupObjectDatabase.GetById(369) as Gun).DefaultModule.chargeProjectiles[0].Projectile.GetComponent <SummonTigerModifier>().TigerProjectilePrefab; break; case 49: //Shield on Destroy sourceProjectile.OnDestruction += SpawnShieldOnDestroy; break; case 50: //Glitter sourceProjectile.ApplyClonedShaderProjModifier((PickupObjectDatabase.GetById(28) as Gun).modifiedFinalVolley.projectiles[0].projectiles[1].GetComponent <ShaderProjModifier>()); break; case 51: //Finished Effect sourceProjectile.gameObject.AddComponent <BlackRevolverModifier>(); break; case 52: //Mimic Gun Effect sourceProjectile.gameObject.AddComponent <EnemyBulletsBecomeJammedModifier>(); break; case 53: //Green Fire sourceProjectile.statusEffectsToApply.Add(StaticStatusEffects.greenFireEffect); sourceProjectile.AdjustPlayerProjectileTint(Color.green, 1); break; case 54: //Encircler sourceProjectile.ApplyClonedShaderProjModifier((PickupObjectDatabase.GetById(648) as Gun).DefaultModule.projectiles[0].GetComponent <ShaderProjModifier>()); break; } sourceProjectile.gameObject.AddComponent <HasBeenBulletShuffled>(); } } catch (Exception e) { ETGModConsole.Log(e.Message); } }
public static void Add() { Gun gun = ETGMod.Databases.Items.NewGun("Viscerifle", "viscerifle"); Game.Items.Rename("outdated_gun_mods:viscerifle", "nn:viscerifle"); gun.gameObject.AddComponent <Viscerifle>(); gun.SetShortDescription("Bloody Stream"); gun.SetLongDescription("Fires hearts and armour as ammunition." + "\n\nThis, by definition, is not a rifle. The name is purely marketing." + "\n\nFires nothing if fired while invincible."); gun.SetupSprite(null, "viscerifle_idle_001", 8); gun.SetAnimationFPS(gun.shootAnimation, 12); gun.AddProjectileModuleFrom(PickupObjectDatabase.GetById(56) as Gun, true, false); //GUN STATS gun.DefaultModule.ammoCost = 0; gun.DefaultModule.shootStyle = ProjectileModule.ShootStyle.SemiAutomatic; gun.DefaultModule.sequenceStyle = ProjectileModule.ProjectileSequenceStyle.Random; gun.reloadTime = 0.8f; gun.DefaultModule.angleVariance = 0f; gun.DefaultModule.cooldownTime = 0.5f; gun.DefaultModule.numberOfShotsInClip = 10; gun.CanGainAmmo = false; gun.barrelOffset.transform.localPosition = new Vector3(1.5f, 0.81f, 0f); gun.SetBaseMaxAmmo(0); gun.gunClass = GunClass.SHITTY; //HEART BULLET STATS Projectile projectile = UnityEngine.Object.Instantiate <Projectile>(gun.DefaultModule.projectiles[0]); projectile.gameObject.SetActive(false); FakePrefab.MarkAsFakePrefab(projectile.gameObject); UnityEngine.Object.DontDestroyOnLoad(projectile); gun.DefaultModule.projectiles[0] = projectile; projectile.baseData.damage *= 20f; projectile.pierceMinorBreakables = true; projectile.baseData.speed *= 1f; projectile.ignoreDamageCaps = true; projectile.baseData.range *= 10f; projectile.SetProjectileSpriteRight("viscerifle_heart_projectile", 16, 7, false, tk2dBaseSprite.Anchor.MiddleCenter, 16, 7); GoopModifier blood = projectile.gameObject.AddComponent <GoopModifier>(); blood.goopDefinition = EasyGoopDefinitions.BlobulonGoopDef; blood.SpawnGoopInFlight = true; blood.InFlightSpawnFrequency = 0.05f; blood.InFlightSpawnRadius = 1f; blood.SpawnGoopOnCollision = true; blood.CollisionSpawnRadius = 2f; //SHADE BULLETS shadeProjectile = ProjectileSetupUtility.MakeProjectile(56, 20, 35, 23); shadeProjectile.SetProjectileSpriteRight("shadeviscerifle_proj", 16, 7, false, tk2dBaseSprite.Anchor.MiddleCenter, 16, 7); //ARMOUR armourProjectile = UnityEngine.Object.Instantiate <Projectile>((PickupObjectDatabase.GetById(56) as Gun).DefaultModule.projectiles[0]); armourProjectile.gameObject.SetActive(false); FakePrefab.MarkAsFakePrefab(armourProjectile.gameObject); UnityEngine.Object.DontDestroyOnLoad(armourProjectile); armourProjectile.baseData.damage *= 24f; armourProjectile.ignoreDamageCaps = true; armourProjectile.baseData.speed *= 1f; armourProjectile.baseData.range *= 10; armourProjectile.pierceMinorBreakables = true; armourProjectile.SetProjectileSpriteRight("viscerifle_armour_projectile", 12, 8, false, tk2dBaseSprite.Anchor.MiddleCenter, 12, 8); armourProjectile.transform.parent = gun.barrelOffset; BlankOnHitModifier blankingArmour = armourProjectile.gameObject.GetOrAddComponent <BlankOnHitModifier>(); blankingArmour.useTinyBlank = false; //CREST crestProjectile = UnityEngine.Object.Instantiate <Projectile>((PickupObjectDatabase.GetById(56) as Gun).DefaultModule.projectiles[0]); crestProjectile.gameObject.SetActive(false); FakePrefab.MarkAsFakePrefab(crestProjectile.gameObject); UnityEngine.Object.DontDestroyOnLoad(crestProjectile); crestProjectile.ignoreDamageCaps = true; crestProjectile.baseData.damage *= 1000f; crestProjectile.baseData.speed *= 1f; crestProjectile.baseData.range *= 10; crestProjectile.pierceMinorBreakables = true; crestProjectile.SetProjectileSpriteRight("viscerifle_crest_projectile", 12, 9, false, tk2dBaseSprite.Anchor.MiddleCenter, 12, 9); crestProjectile.transform.parent = gun.barrelOffset; BlankOnHitModifier blankingCrest = crestProjectile.gameObject.GetOrAddComponent <BlankOnHitModifier>(); blankingCrest.useTinyBlank = false; BounceProjModifier Bouncing = crestProjectile.gameObject.GetOrAddComponent <BounceProjModifier>(); Bouncing.numberOfBounces = 1; //FUCKYOUPROJECTILE fuckyouprojectile = UnityEngine.Object.Instantiate <Projectile>((PickupObjectDatabase.GetById(56) as Gun).DefaultModule.projectiles[0]); fuckyouprojectile.gameObject.SetActive(false); FakePrefab.MarkAsFakePrefab(fuckyouprojectile.gameObject); UnityEngine.Object.DontDestroyOnLoad(fuckyouprojectile); fuckyouprojectile.baseData.damage *= 0f; fuckyouprojectile.baseData.speed *= 0f; fuckyouprojectile.baseData.range *= 0; DieFuckYou fuckingdie = fuckyouprojectile.gameObject.GetOrAddComponent <DieFuckYou>(); fuckyouprojectile.sprite.renderer.enabled = false; fuckyouprojectile.transform.parent = gun.barrelOffset; projectile.transform.parent = gun.barrelOffset; gun.quality = PickupObject.ItemQuality.C; gun.encounterTrackable.EncounterGuid = "this is the Viscerifle"; ETGMod.Databases.Items.Add(gun, null, "ANY"); gun.SetupUnlockOnCustomFlag(CustomDungeonFlags.PURCHASED_VISCERIFLE, true); gun.AddItemToGooptonMetaShop(23); }