public static void Add()
        {
            Gun gun = ETGMod.Databases.Items.NewGun("Riot Gun", "riotgun");

            Game.Items.Rename("outdated_gun_mods:riot_gun", "nn:riot_gun");
            gun.gameObject.AddComponent <RiotGun>();
            gun.SetShortDescription("Definitely Humane");
            gun.SetLongDescription("Fires elastic rubber bullets." + "\n\nWhile rubber bullets are generally considered non-lethal, a more accurate term would be 'less-lethal'." + "\nThese bullets can still cause damage.");

            gun.SetupSprite(null, "riotgun_idle_001", 8);

            gun.SetAnimationFPS(gun.shootAnimation, 12);
            gun.SetAnimationFPS(gun.reloadAnimation, 1);
            gun.gunSwitchGroup = (PickupObjectDatabase.GetById(150) as Gun).gunSwitchGroup;

            gun.AddProjectileModuleFrom(PickupObjectDatabase.GetById(86) as Gun, true, false);

            //GUN STATS
            gun.DefaultModule.ammoCost      = 1;
            gun.DefaultModule.shootStyle    = ProjectileModule.ShootStyle.Automatic;
            gun.DefaultModule.sequenceStyle = ProjectileModule.ProjectileSequenceStyle.Random;
            gun.reloadTime = 1f;
            gun.DefaultModule.cooldownTime           = 0.5f;
            gun.DefaultModule.numberOfShotsInClip    = 5;
            gun.barrelOffset.transform.localPosition = new Vector3(2.06f, 0.75f, 0f);
            gun.SetBaseMaxAmmo(200);
            gun.gunClass = GunClass.RIFLE;
            //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       = 7f;
            projectile.baseData.force       *= 5f;
            projectile.baseData.speed       *= 1f;
            projectile.baseData.range       *= 1f;
            BounceProjModifier Bouncing = projectile.gameObject.GetOrAddComponent <BounceProjModifier>();

            Bouncing.numberOfBounces       = 1;
            projectile.AppliesStun         = true;
            projectile.StunApplyChance     = 0.2f;
            projectile.AppliedStunDuration = 2f;
            projectile.SetProjectileSpriteRight("riotgun_projectile", 12, 12, true, tk2dBaseSprite.Anchor.MiddleCenter, 10, 10);


            projectile.pierceMinorBreakables = true;
            gun.DefaultModule.ammoType       = GameUIAmmoType.AmmoType.CUSTOM;
            gun.DefaultModule.customAmmoType = CustomClipAmmoTypeToolbox.AddCustomAmmoType("RiotGun Bullets", "NevernamedsItems/Resources/CustomGunAmmoTypes/riotgun_clipfull", "NevernamedsItems/Resources/CustomGunAmmoTypes/riotgun_clipempty");

            gun.quality = PickupObject.ItemQuality.D;
            ETGMod.Databases.Items.Add(gun, null, "ANY");

            gun.AddToSubShop(ItemBuilder.ShopType.Trorc);

            RiotGunID = gun.PickupObjectId;
            gun.SetupUnlockOnCustomFlag(CustomDungeonFlags.PURCHASED_RIOTGUN, true);
            gun.AddItemToTrorcMetaShop(10);
        }
Beispiel #2
0
        public static void Add()
        {
            Gun gun = ETGMod.Databases.Items.NewGun("Grenade Shotgun", "grenadeshotgun");

            Game.Items.Rename("outdated_gun_mods:grenade_shotgun", "nn:grenade_shotgun");
            gun.gameObject.AddComponent <GrenadeShotgun>();
            gun.SetShortDescription("Sit Down");
            gun.SetLongDescription("The product of combining two of the most entertaining classes of weaponry- Shotguns, and the ones that explode.");

            gun.SetupSprite(null, "grenadeshotgun_idle_001", 8);

            gun.SetAnimationFPS(gun.shootAnimation, 13);

            for (int i = 0; i < 4; i++)
            {
                gun.AddProjectileModuleFrom(PickupObjectDatabase.GetById(19) as Gun, true, false);
            }

            //GUN STATS
            foreach (ProjectileModule mod in gun.Volley.projectiles)
            {
                mod.ammoCost            = 1;
                mod.shootStyle          = ProjectileModule.ShootStyle.SemiAutomatic;
                mod.sequenceStyle       = ProjectileModule.ProjectileSequenceStyle.Random;
                mod.cooldownTime        = 1f;
                mod.angleVariance       = 15f;
                mod.numberOfShotsInClip = 1;
                Projectile projectile = UnityEngine.Object.Instantiate <Projectile>(mod.projectiles[0]);
                mod.projectiles[0] = projectile;
                projectile.gameObject.SetActive(false);
                FakePrefab.MarkAsFakePrefab(projectile.gameObject);
                UnityEngine.Object.DontDestroyOnLoad(projectile);
                projectile.baseData.range = 7;
                BounceProjModifier Bouncing = projectile.gameObject.GetOrAddComponent <BounceProjModifier>();
                Bouncing.numberOfBounces = 1;
                if (mod != gun.DefaultModule)
                {
                    mod.ammoCost = 0;
                }
                projectile.transform.parent = gun.barrelOffset;
            }

            gun.reloadTime = 2f;
            gun.barrelOffset.transform.localPosition = new Vector3(2.18f, 0.68f, 0f);
            gun.SetBaseMaxAmmo(40);
            gun.gunClass           = GunClass.EXPLOSIVE;
            gun.gunSwitchGroup     = (PickupObjectDatabase.GetById(150) as Gun).gunSwitchGroup;
            gun.muzzleFlashEffects = (PickupObjectDatabase.GetById(37) as Gun).muzzleFlashEffects;

            gun.quality = PickupObject.ItemQuality.A;
            ETGMod.Databases.Items.Add(gun, null, "ANY");

            gun.Volley.UsesShotgunStyleVelocityRandomizer = true;
            gun.AddToSubShop(ItemBuilder.ShopType.Trorc);

            GrenadeShotgunID = gun.PickupObjectId;
            gun.SetupUnlockOnCustomFlag(CustomDungeonFlags.PURCHASED_GRENADESHOTGUN, true);
            gun.AddItemToTrorcMetaShop(40);
        }
Beispiel #3
0
        public static void Add()
        {
            Gun gun = ETGMod.Databases.Items.NewGun("Bazooka", "bazooka");

            Game.Items.Rename("outdated_gun_mods:bazooka", "nn:bazooka");
            gun.gameObject.AddComponent <NNBazooka>();
            gun.SetShortDescription("Boom Boom Boom Boom");
            gun.SetLongDescription("It takes a lunatic to be a legend." + "\n\nThis powerful explosive weapon has one major drawback; it is capable of damaging it's bearer. You'd think more bombs would do that, but the Gungeon forgives.");

            gun.SetupSprite(null, "bazooka_idle_001", 8);

            gun.SetAnimationFPS(gun.shootAnimation, 12);

            gun.AddProjectileModuleFrom(PickupObjectDatabase.GetById(39) as Gun, true, false);

            //GUN STATS
            gun.DefaultModule.ammoCost      = 1;
            gun.DefaultModule.shootStyle    = ProjectileModule.ShootStyle.SemiAutomatic;
            gun.DefaultModule.sequenceStyle = ProjectileModule.ProjectileSequenceStyle.Random;
            gun.reloadTime = 4f;
            gun.DefaultModule.cooldownTime           = 2f;
            gun.muzzleFlashEffects.type              = VFXPoolType.None;
            gun.DefaultModule.numberOfShotsInClip    = 3;
            gun.barrelOffset.transform.localPosition = new Vector3(2.5f, 0.68f, 0f);
            gun.SetBaseMaxAmmo(100);
            gun.gunClass = GunClass.EXPLOSIVE;
            //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      *= 3f;
            projectile.baseData.speed       *= 1.2f;
            projectile.ignoreDamageCaps      = true;
            projectile.pierceMinorBreakables = true;

            if (projectile.GetComponent <ExplosiveModifier>())
            {
                Destroy(projectile.GetComponent <ExplosiveModifier>());
            }
            FuckingExplodeYouCunt explosiveModifier = projectile.gameObject.AddComponent <FuckingExplodeYouCunt>();

            projectile.SetProjectileSpriteRight("bazooka_projectile", 26, 7, false, tk2dBaseSprite.Anchor.MiddleCenter, 26, 7);

            projectile.transform.parent = gun.barrelOffset;

            // Here we just set the quality of the gun and the "EncounterGuid", which is used by Gungeon to identify the gun.
            gun.quality = PickupObject.ItemQuality.B;
            gun.encounterTrackable.EncounterGuid = "this is the Bazooka";
            ETGMod.Databases.Items.Add(gun, null, "ANY");

            gun.AddToSubShop(ItemBuilder.ShopType.Trorc);
            BazookaID = gun.PickupObjectId;

            gun.SetupUnlockOnCustomFlag(CustomDungeonFlags.PURCHASED_BAZOOKA, true);
            gun.AddItemToTrorcMetaShop(20);
        }
Beispiel #4
0
        public static void Add()
        {
            Gun gun = ETGMod.Databases.Items.NewGun("Antimateriel Rifle", "antimaterielrifle");

            Game.Items.Rename("outdated_gun_mods:antimateriel_rifle", "nn:antimateriel_rifle");
            gun.gameObject.AddComponent <AntimaterielRifle>();
            gun.SetShortDescription("Shreddin' Vapours");
            gun.SetLongDescription("Used in rebel attacks on remote Hegemony of Man outposts, this high-tech tool of destruction is geared to take out heavy targets." + "\n\nIgnores boss DPS cap.");

            gun.SetupSprite(null, "antimaterielrifle_idle_001", 8);

            gun.SetAnimationFPS(gun.shootAnimation, 15);

            gun.AddProjectileModuleFrom(PickupObjectDatabase.GetById(56) as Gun, true, false);
            gun.muzzleFlashEffects = (PickupObjectDatabase.GetById(334) as Gun).muzzleFlashEffects;

            //GUN STATS
            gun.DefaultModule.ammoCost      = 1;
            gun.DefaultModule.shootStyle    = ProjectileModule.ShootStyle.Automatic;
            gun.DefaultModule.sequenceStyle = ProjectileModule.ProjectileSequenceStyle.Random;
            gun.reloadTime = 2f;
            gun.DefaultModule.cooldownTime           = 0.04f;
            gun.muzzleFlashEffects.type              = VFXPoolType.None;
            gun.DefaultModule.numberOfShotsInClip    = 55;
            gun.barrelOffset.transform.localPosition = new Vector3(2.75f, 0.56f, 0f);
            gun.SetBaseMaxAmmo(720);
            gun.gunClass = GunClass.FULLAUTO;
            //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      *= 1f;
            projectile.baseData.speed       *= 1.2f;
            projectile.ignoreDamageCaps      = true;
            projectile.pierceMinorBreakables = true;
            PierceProjModifier orAddComponent = projectile.gameObject.GetOrAddComponent <PierceProjModifier>();

            orAddComponent.penetratesBreakables = true;
            orAddComponent.penetration++;
            projectile.SetProjectileSpriteRight("antimaterielrifle_projectile", 15, 7, true, tk2dBaseSprite.Anchor.MiddleCenter, 15, 7);

            gun.DefaultModule.ammoType       = GameUIAmmoType.AmmoType.CUSTOM;
            gun.DefaultModule.customAmmoType = "Thinline Bullets";

            gun.quality = PickupObject.ItemQuality.S;
            ETGMod.Databases.Items.Add(gun, null, "ANY");
            gun.AddToSubShop(ItemBuilder.ShopType.Trorc);
            AntimaterielRifleID = gun.PickupObjectId;
            gun.SetupUnlockOnCustomFlag(CustomDungeonFlags.PURCHASED_ANTIMATERIELRIFLE, true);
            gun.AddItemToTrorcMetaShop(28);
        }
Beispiel #5
0
        // Token: 0x06000036 RID: 54 RVA: 0x000037D8 File Offset: 0x000019D8
        public static void Add()
        {
            Gun gun = ETGMod.Databases.Items.NewGun("Matter Translocator", "mattertranslocator");

            Game.Items.Rename("outdated_gun_mods:matter_translocator", "bny:matter_translocator");
            gun.gameObject.AddComponent <MatterTranslocator>();
            GunExt.SetShortDescription(gun, "Tele-Tech");
            GunExt.SetLongDescription(gun, "The most stable and well-calibrated portable teleporter available for use. As with all things, it's weaponized.");
            GunExt.SetupSprite(gun, null, "mattertranslocator_idle_001", 11);
            GunExt.SetAnimationFPS(gun, gun.shootAnimation, 15);
            GunExt.SetAnimationFPS(gun, gun.reloadAnimation, 12);
            GunExt.SetAnimationFPS(gun, gun.idleAnimation, 5);
            GunExt.AddProjectileModuleFrom(gun, "magnum", true, false);
            gun.barrelOffset.transform.localPosition = new Vector3(2.3125f, 0.625f, 0f);
            gun.DefaultModule.ammoCost      = 1;
            gun.DefaultModule.shootStyle    = ProjectileModule.ShootStyle.SemiAutomatic;
            gun.DefaultModule.sequenceStyle = ProjectileModule.ProjectileSequenceStyle.Random;
            gun.reloadTime = 3f;
            gun.DefaultModule.cooldownTime        = .1f;
            gun.DefaultModule.numberOfShotsInClip = 1;
            gun.SetBaseMaxAmmo(30);
            gun.quality = PickupObject.ItemQuality.A;
            gun.DefaultModule.angleVariance  = 0f;
            gun.DefaultModule.burstShotCount = 1;
            //gun.SetupUnlockOnCustomFlag(CustomDungeonFlags.EXAMPLE_BLUEPRINTTRUCK, true);
            gun.AddItemToTrorcMetaShop(50, null);
            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           = 60f;
            projectile.baseData.speed           *= .35f;
            projectile.AdditionalScaleMultiplier = 0.85f;
            projectile.shouldRotate          = true;
            projectile.pierceMinorBreakables = true;
            projectile.baseData.range        = 9f;
            projectile.SetProjectileSpriteRight("mattertranslocator_projectile_001", 22, 22, true, tk2dBaseSprite.Anchor.MiddleCenter, new int?(30), new int?(30), null, null, null);
            BounceProjModifier bouncy = projectile.gameObject.AddComponent <BounceProjModifier>();

            bouncy.numberOfBounces = 100;
            PierceProjModifier spook = projectile.gameObject.AddComponent <PierceProjModifier>();

            spook.penetration = 100;
            gun.encounterTrackable.EncounterGuid = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
            ETGMod.Databases.Items.Add(gun, null, "ANY");
            gun.AddToSubShop(ItemBuilder.ShopType.Trorc, 1f);
            gun.AddToSubShop(ItemBuilder.ShopType.Goopton, 1f);
        }
Beispiel #6
0
        public static void Add()
        {
            Gun boomrevolver = ETGMod.Databases.Items.NewGun("Time-Zoner", "timezoner");

            Game.Items.Rename("outdated_gun_mods:time-zoner", "bny:time-zoner");
            boomrevolver.gameObject.AddComponent <TimeZoner>();
            GunExt.SetShortDescription(boomrevolver, "Time travel, Yeah!");
            GunExt.SetLongDescription(boomrevolver, "A test-version revolver made for spies to adapt to sudden time-zone switches. On its first experiment, it slipped through a crack in time and ended up here.");
            GunExt.SetupSprite(boomrevolver, null, "timezoner_idle_001", 19);
            GunExt.SetAnimationFPS(boomrevolver, boomrevolver.shootAnimation, 24);
            GunExt.SetAnimationFPS(boomrevolver, boomrevolver.reloadAnimation, 10);
            GunExt.SetAnimationFPS(boomrevolver, boomrevolver.idleAnimation, 5);
            GunExt.AddProjectileModuleFrom(boomrevolver, "magnum", true, false);
            boomrevolver.gunSwitchGroup              = (PickupObjectDatabase.GetById(577) as Gun).gunSwitchGroup;
            boomrevolver.DefaultModule.ammoCost      = 1;
            boomrevolver.DefaultModule.shootStyle    = ProjectileModule.ShootStyle.SemiAutomatic;
            boomrevolver.DefaultModule.sequenceStyle = ProjectileModule.ProjectileSequenceStyle.Random;
            boomrevolver.reloadTime = 2.2f;
            boomrevolver.DefaultModule.cooldownTime        = .2f;
            boomrevolver.DefaultModule.numberOfShotsInClip = 20;
            boomrevolver.SetBaseMaxAmmo(400);
            boomrevolver.quality = PickupObject.ItemQuality.C;
            boomrevolver.DefaultModule.angleVariance      = 3f;
            boomrevolver.encounterTrackable.EncounterGuid = "ZA WARUDO *BFPPFPFPFPFPFPFPFPFPFPFPFPT T TT T T *";
            Projectile projectile = UnityEngine.Object.Instantiate <Projectile>(boomrevolver.DefaultModule.projectiles[0]);

            projectile.gameObject.SetActive(false);
            projectile.SetProjectileSpriteRight("timezoner_projectile_001", 11, 5, true, tk2dBaseSprite.Anchor.MiddleCenter, new int?(5), new int?(2), null, null, null);
            FakePrefab.MarkAsFakePrefab(projectile.gameObject);
            UnityEngine.Object.DontDestroyOnLoad(projectile);
            boomrevolver.DefaultModule.projectiles[0] = projectile;
            projectile.shouldRotate              = true;
            projectile.baseData.damage           = 7f;
            projectile.baseData.speed           *= 1.2f;
            projectile.AdditionalScaleMultiplier = 1.2f;
            projectile.transform.parent          = boomrevolver.barrelOffset;
            ETGMod.Databases.Items.Add(boomrevolver, null, "ANY");
            boomrevolver.AddToSubShop(ItemBuilder.ShopType.Goopton, 1f);
            boomrevolver.AddToSubShop(ItemBuilder.ShopType.Trorc, 1f);
            boomrevolver.SetupUnlockOnCustomFlag(CustomDungeonFlags.ZONER_TRORC_FLAG, true);
            boomrevolver.AddItemToTrorcMetaShop(18, null);
        }
Beispiel #7
0
        public static void Add()
        {
            // Get yourself a new gun "base" first.
            // Let's just call it "Basic Gun", and use "jpxfrd" for all sprites and as "codename" All sprites must begin with the same word as the codename. For example, your firing sprite would be named "jpxfrd_fire_001".
            Gun gun = ETGMod.Databases.Items.NewGun("Sydney Sleeper", "piss");

            // "kp:basic_gun determines how you spawn in your gun through the console. You can change this command to whatever you want, as long as it follows the "name:itemname" template.
            Game.Items.Rename("outdated_gun_mods:sydney_sleeper", "cak:sydney_sleeper");
            gun.gameObject.AddComponent <SydneySleeper>();
            //These two lines determines the description of your gun, ".SetShortDescription" being the description that appears when you pick up the gun and ".SetLongDescription" being the description in the Ammonomicon entry.
            gun.SetShortDescription("Jarate");
            gun.SetLongDescription("Professionals have standards. Unfortunatly, whoever made this gun did not.");
            // This is required, unless you want to use the sprites of the base gun.
            // That, by default, is the pea shooter.
            // SetupSprite sets up the default gun sprite for the ammonomicon and the "gun get" popup.
            // WARNING: Add a copy of your default sprite to Ammonomicon Encounter Icon Collection!
            // That means, "sprites/Ammonomicon Encounter Icon Collection/defaultsprite.png" in your mod .zip. You can see an example of this with inside the mod folder.
            gun.SetupSprite(null, "piss_idle_001", 8);
            // ETGMod automatically checks which animations are available.
            // The numbers next to "shootAnimation" determine the animation fps. You can also tweak the animation fps of the reload animation and idle animation using this method.
            gun.SetAnimationFPS(gun.shootAnimation, 20);
            gun.SetAnimationFPS(gun.reloadAnimation, 3);
            // Every modded gun has base projectile it works with that is borrowed from other guns in the game.
            // The gun names are the names from the JSON dump! While most are the same, some guns named completely different things. If you need help finding gun names, ask a modder on the Gungeon discord.
            gun.AddProjectileModuleFrom(PickupObjectDatabase.GetById(12) as Gun, true, false);
            // Here we just take the default projectile module and change its settings how we want it to be.
            gun.DefaultModule.ammoCost      = 1;
            gun.DefaultModule.shootStyle    = ProjectileModule.ShootStyle.SemiAutomatic;
            gun.DefaultModule.sequenceStyle = ProjectileModule.ProjectileSequenceStyle.Random;
            gun.reloadTime                        = 0.7f;
            gun.ForceLaserSight                   = true;
            gun.LaserSightIsGreen                 = true;
            gun.CriticalChance                    = 0.05f;
            gun.DefaultModule.cooldownTime        = 0.3f;
            gun.DefaultModule.numberOfShotsInClip = 1;
            gun.SetBaseMaxAmmo(50);

            gun.ForceLaserSight             = true;
            gun.DefaultModule.angleVariance = 0f;
            gun.barrelOffset.localPosition += new Vector3(0.5f, -0.4f, 0f);
            gun.gunSwitchGroup     = (PickupObjectDatabase.GetById(5) as Gun).gunSwitchGroup;
            gun.muzzleFlashEffects = (PickupObjectDatabase.GetById(5) as Gun).muzzleFlashEffects;
            // Here we just set the quality of the gun and the "EncounterGuid", which is used by Gungeon to identify the gun.
            gun.quality = PickupObject.ItemQuality.B;
            gun.encounterTrackable.EncounterGuid = "iampissgun";
            //This block of code helps clone our projectile. Basically it makes it so things like Shadow Clone and Hip Holster keep the stats/sprite of your custom gun's projectiles.
            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;
            gun.CriticalChance = 0.1f;
            //projectile.baseData allows you to modify the base properties of your projectile module.
            //In our case, our gun uses modified projectiles from the ak-47.
            //Setting static values for a custom gun's projectile stats prevents them from scaling with player stats and bullet modifiers (damage, shotspeed, knockback)
            //You have to multiply the value of the original projectile you're using instead so they scale accordingly. For example if the projectile you're using as a base has 10 damage and you want it to be 6 you use this
            //In our case, our projectile has a base damage of 5.5, so we multiply it by 1.1 so it does 10% more damage from the ak-47.
            projectile.baseData.damage *= 0.5f;
            projectile.baseData.speed  *= 1f;
            projectile.transform.parent = gun.barrelOffset;
            //This determines what sprite you want your projectile to use. Note this isn't necessary if you don't want to have a custom projectile sprite.
            //The x and y values determine the size of your custom projectile
            projectile.SetProjectileSpriteRight("piss_projectile", 14, 5, null, null);
            ETGMod.Databases.Items.Add(gun, null, "ANY");
            gun.AddItemToTrorcMetaShop(100, 100);
            gun.SetupUnlockOnCustomFlag(CustomDungeonFlags.EXAMPLE_BLUEPRINTTRUCK, true);
            gun.AddToSubShop(ItemBuilder.ShopType.Trorc, 1f);
            CakeIDs.PissGun = gun.PickupObjectId;
        }