Пример #1
0
        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);
            }
        }
Пример #3
0
        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);
        }