diff --git a/build - kopie.gradle b/build - kopie.gradle deleted file mode 100644 index 1686e24..0000000 --- a/build - kopie.gradle +++ /dev/null @@ -1,159 +0,0 @@ -buildscript { - repositories { - // These repositories are only for Gradle plugins, put any other repositories in the repository block further below - maven { url = 'https://maven.minecraftforge.net' } - mavenCentral() - } - dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true - } -} -apply plugin: 'net.minecraftforge.gradle' -// Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. -apply plugin: 'eclipse' -apply plugin: 'maven-publish' - -version = '1.17.1-2.24' -group = 'nl.requios.effortlessbuilding' // http://maven.apache.org/guides/mini/guide-naming-conventions.html -archivesBaseName = 'effortlessbuilding' - -// Mojang ships Java 16 to end users in 1.17+ instead of Java 8 in 1.16 or lower, so your mod should target Java 16. -java.toolchain.languageVersion = JavaLanguageVersion.of(16) - -minecraft { - // The mappings can be changed at any time and must be in the following format. - // Channel: Version: - // snapshot YYYYMMDD Snapshot are built nightly. - // stable # Stables are built at the discretion of the MCP team. - // official MCVersion Official field/method names from Mojang mapping files - // - // You must be aware of the Mojang license when using the 'official' mappings. - // See more information here: https://github.com/MinecraftForge/MCPConfig/blob/master/Mojang.md - // - // Use non-default mappings at your own risk. They may not always work. - // Simply re-run your setup task after changing the mappings to update your workspace. - mappings channel: 'official', version: '1.17.1' - - // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') // Currently, this location cannot be changed from the default. - - // Default run configurations. - // These can be tweaked, removed, or duplicated as needed. - runs { - client { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment (SCAN,REGISTRIES,REGISTRYDUMP) - property 'forge.logging.markers', 'REGISTRIES' - - // Recommended logging level for the console - property 'forge.logging.console.level', 'debug' - - mods { - effortlessbuilding { - source sourceSets.main - } - } - } - - server { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment (SCAN,REGISTRIES,REGISTRYDUMP) - property 'forge.logging.markers', 'REGISTRIES' - - // Recommended logging level for the console - property 'forge.logging.console.level', 'debug' - - mods { - effortlessbuilding { - source sourceSets.main - } - } - } - - data { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment (SCAN,REGISTRIES,REGISTRYDUMP) - property 'forge.logging.markers', 'REGISTRIES' - - // Recommended logging level for the console - property 'forge.logging.console.level', 'debug' - - // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. - args '--mod', 'effortlessbuilding', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') - - mods { - effortlessbuilding { - source sourceSets.main - } - } - } - } -} - -// Include resources generated by data generators. -sourceSets.main.resources { srcDir 'src/generated/resources' } - -repositories { - // Put repositories for dependencies here - // ForgeGradle automatically adds the Forge maven and Maven Central for you - - // If you have mod jar dependencies in ./libs, you can declare them as a repository like so: - // flatDir { - // dir 'libs' - // } -} - -dependencies { - // Specify the version of Minecraft to use. If this is any group other than 'net.minecraft', it is assumed - // that the dep is a ForgeGradle 'patcher' dependency, and its patches will be applied. - // The userdev artifact is a special name and will get all sorts of transformations applied to it. - minecraft 'net.minecraftforge:forge:1.17.1-37.0.50' - - // Real mod deobf dependency examples - these get remapped to your current mappings - // compileOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}:api") // Adds JEI API as a compile dependency - // runtimeOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}") // Adds the full JEI mod as a runtime dependency - // implementation fg.deobf("com.tterrag.registrate:Registrate:MC${mc_version}-${registrate_version}") // Adds registrate as a dependency - - // Examples using mod jars from ./libs - // implementation fg.deobf("blank:coolmod-${mc_version}:${coolmod_version}") - - // For more info... - // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html - // http://www.gradle.org/docs/current/userguide/dependency_management.html -} - -// Example for how to get properties into the manifest for reading by the runtime.. -jar { - manifest { - attributes([ - "Specification-Title": "effortlessbuilding", - "Specification-Vendor": "requios", - "Specification-Version": "1", // We are version 1 of ourselves - "Implementation-Title": project.name, - "Implementation-Version": "${version}", - "Implementation-Vendor" :"requios", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") - ]) - } -} - -// Example configuration to allow publishing using the maven-publish task -// This is the preferred method to reobfuscate your jar file -jar.finalizedBy('reobfJar') -// However if you are in a multi-project build, dev time needs unobfed jar files, so you can delay the obfuscation until publishing by doing -//publish.dependsOn('reobfJar') - -publishing { - publications { - mavenJava(MavenPublication) { - artifact jar - } - } - repositories { - maven { - url "file:///${project.projectDir}/mcmodsrepo" - } - } -} \ No newline at end of file diff --git a/build.gradle b/build.gradle index cb2d8f1..4389b0c 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ apply plugin: 'net.minecraftforge.gradle' apply plugin: 'eclipse' apply plugin: 'maven-publish' -version = '1.17.1-2.24' +version = '1.17.1-2.26' group = 'nl.requios.effortlessbuilding' // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = 'effortlessbuilding' diff --git a/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java b/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java index 5e45fce..fe95ef9 100644 --- a/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java +++ b/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java @@ -6,7 +6,6 @@ import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.Item; import net.minecraft.resources.ResourceLocation; import net.minecraft.network.chat.TextComponent; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.DistExecutor; @@ -18,18 +17,15 @@ import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.fmllegacy.RegistryObject; import net.minecraftforge.fmllegacy.network.IContainerFactory; -import net.minecraftforge.fmlserverevents.FMLServerStartingEvent; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import nl.requios.effortlessbuilding.capability.ModeCapabilityManager; import nl.requios.effortlessbuilding.capability.ModifierCapabilityManager; -import nl.requios.effortlessbuilding.command.CommandReach; import nl.requios.effortlessbuilding.compatibility.CompatHelper; +import nl.requios.effortlessbuilding.gui.DiamondRandomizerBagContainer; +import nl.requios.effortlessbuilding.gui.GoldenRandomizerBagContainer; import nl.requios.effortlessbuilding.gui.RandomizerBagContainer; -import nl.requios.effortlessbuilding.item.RandomizerBagItem; -import nl.requios.effortlessbuilding.item.ReachUpgrade1Item; -import nl.requios.effortlessbuilding.item.ReachUpgrade2Item; -import nl.requios.effortlessbuilding.item.ReachUpgrade3Item; +import nl.requios.effortlessbuilding.item.*; import nl.requios.effortlessbuilding.network.PacketHandler; import nl.requios.effortlessbuilding.proxy.ClientProxy; import nl.requios.effortlessbuilding.proxy.IProxy; @@ -51,13 +47,15 @@ public class EffortlessBuilding { private static final DeferredRegister> CONTAINERS = DeferredRegister.create(ForgeRegistries.CONTAINERS, EffortlessBuilding.MODID); public static final RegistryObject RANDOMIZER_BAG_ITEM = ITEMS.register("randomizer_bag", RandomizerBagItem::new); + public static final RegistryObject GOLDEN_RANDOMIZER_BAG_ITEM = ITEMS.register("golden_randomizer_bag", GoldenRandomizerBagItem::new); + public static final RegistryObject DIAMOND_RANDOMIZER_BAG_ITEM = ITEMS.register("diamond_randomizer_bag", DiamondRandomizerBagItem::new); public static final RegistryObject REACH_UPGRADE_1_ITEM = ITEMS.register("reach_upgrade1", ReachUpgrade1Item::new); public static final RegistryObject REACH_UPGRADE_2_ITEM = ITEMS.register("reach_upgrade2", ReachUpgrade2Item::new); public static final RegistryObject REACH_UPGRADE_3_ITEM = ITEMS.register("reach_upgrade3", ReachUpgrade3Item::new); public static final RegistryObject> RANDOMIZER_BAG_CONTAINER = CONTAINERS.register("randomizer_bag", () -> registerContainer(RandomizerBagContainer::new)); - - public static final ResourceLocation RANDOMIZER_BAG_GUI = new ResourceLocation(EffortlessBuilding.MODID, "randomizer_bag"); + public static final RegistryObject> GOLDEN_RANDOMIZER_BAG_CONTAINER = CONTAINERS.register("golden_randomizer_bag", () -> registerContainer(GoldenRandomizerBagContainer::new)); + public static final RegistryObject> DIAMOND_RANDOMIZER_BAG_CONTAINER = CONTAINERS.register("diamond_randomizer_bag", () -> registerContainer(DiamondRandomizerBagContainer::new)); public EffortlessBuilding() { instance = this; diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Array.java b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Array.java index f34c07b..a90703f 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Array.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Array.java @@ -9,7 +9,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.phys.Vec3; import net.minecraft.core.Vec3i; import net.minecraftforge.items.IItemHandler; -import nl.requios.effortlessbuilding.item.RandomizerBagItem; +import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem; import java.util.ArrayList; import java.util.List; @@ -45,17 +45,19 @@ public class Array { Vec3i offset = new Vec3i(a.offset.getX(), a.offset.getY(), a.offset.getZ()); //Randomizer bag synergy + AbstractRandomizerBagItem randomizerBagItem = null; IItemHandler bagInventory = null; - if (!itemStack.isEmpty() && itemStack.getItem() instanceof RandomizerBagItem) { - bagInventory = RandomizerBagItem.getBagInventory(itemStack); + if (!itemStack.isEmpty() && itemStack.getItem() instanceof AbstractRandomizerBagItem) { + randomizerBagItem = (AbstractRandomizerBagItem) itemStack.getItem() ; + bagInventory = randomizerBagItem.getBagInventory(itemStack); } for (int i = 0; i < a.count; i++) { pos = pos.offset(offset); //Randomizer bag synergy - if (bagInventory != null) { - itemStack = RandomizerBagItem.pickRandomStack(bagInventory); + if (randomizerBagItem != null) { + itemStack = randomizerBagItem.pickRandomStack(bagInventory); blockState = BuildModifiers .getBlockStateFromItem(itemStack, player, startPos, Direction.UP, new Vec3(0, 0, 0), InteractionHand.MAIN_HAND); } diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/BuildModifiers.java b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/BuildModifiers.java index f34602c..2564f42 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/BuildModifiers.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/BuildModifiers.java @@ -17,7 +17,7 @@ import net.minecraft.world.level.Level; import nl.requios.effortlessbuilding.compatibility.CompatHelper; import nl.requios.effortlessbuilding.helper.InventoryHelper; import nl.requios.effortlessbuilding.helper.SurvivalHelper; -import nl.requios.effortlessbuilding.item.RandomizerBagItem; +import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem; import nl.requios.effortlessbuilding.render.BlockPreviewRenderer; import java.util.ArrayList; @@ -29,7 +29,7 @@ public class BuildModifiers { //Called from BuildModes public static void onBlockPlaced(Player player, List startCoordinates, Direction sideHit, Vec3 hitVec, boolean placeStartPos) { Level world = player.level; - RandomizerBagItem.renewRandomness(); + AbstractRandomizerBagItem.renewRandomness(); //Format hitvec to 0.x hitVec = new Vec3(Math.abs(hitVec.x - ((int) hitVec.x)), Math.abs(hitVec.y - ((int) hitVec.y)), Math.abs(hitVec.z - ((int) hitVec.z))); @@ -192,7 +192,7 @@ public class BuildModifiers { ItemStack itemBlock = ItemStack.EMPTY; if (itemStack.getItem() instanceof BlockItem) itemBlock = itemStack; else itemBlock = CompatHelper.getItemBlockFromStack(itemStack); - RandomizerBagItem.resetRandomness(); + AbstractRandomizerBagItem.resetRandomness(); //Add blocks in posList first for (BlockPos blockPos : posList) { diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Mirror.java b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Mirror.java index c764ce9..1e358b1 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Mirror.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Mirror.java @@ -9,7 +9,7 @@ import net.minecraft.world.InteractionHand; import net.minecraft.core.BlockPos; import net.minecraft.world.phys.Vec3; import net.minecraftforge.items.IItemHandler; -import nl.requios.effortlessbuilding.item.RandomizerBagItem; +import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem; import java.util.ArrayList; import java.util.List; @@ -70,9 +70,11 @@ public class Mirror { if (!isEnabled(m, startPos)) return blockStates; //Randomizer bag synergy + AbstractRandomizerBagItem randomizerBagItem = null; IItemHandler bagInventory = null; - if (!itemStack.isEmpty() && itemStack.getItem() instanceof RandomizerBagItem) { - bagInventory = RandomizerBagItem.getBagInventory(itemStack); + if (!itemStack.isEmpty() && itemStack.getItem() instanceof AbstractRandomizerBagItem) { + randomizerBagItem = (AbstractRandomizerBagItem) itemStack.getItem() ; + bagInventory = randomizerBagItem.getBagInventory(itemStack); } if (m.mirrorX) @@ -93,7 +95,7 @@ public class Mirror { //Randomizer bag synergy if (bagInventory != null) { - itemStack = RandomizerBagItem.pickRandomStack(bagInventory); + itemStack = ((AbstractRandomizerBagItem)itemStack.getItem()).pickRandomStack(bagInventory); oldBlockState = BuildModifiers.getBlockStateFromItem(itemStack, player, oldBlockPos, Direction.UP, new Vec3(0, 0, 0), hand); } @@ -118,7 +120,7 @@ public class Mirror { //Randomizer bag synergy if (bagInventory != null) { - itemStack = RandomizerBagItem.pickRandomStack(bagInventory); + itemStack = ((AbstractRandomizerBagItem)itemStack.getItem()).pickRandomStack(bagInventory); oldBlockState = BuildModifiers.getBlockStateFromItem(itemStack, player, oldBlockPos, Direction.UP, new Vec3(0, 0, 0), hand); } @@ -141,7 +143,7 @@ public class Mirror { //Randomizer bag synergy if (bagInventory != null) { - itemStack = RandomizerBagItem.pickRandomStack(bagInventory); + itemStack = ((AbstractRandomizerBagItem)itemStack.getItem()).pickRandomStack(bagInventory); oldBlockState = BuildModifiers.getBlockStateFromItem(itemStack, player, oldBlockPos, Direction.UP, new Vec3(0, 0, 0), hand); } diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/RadialMirror.java b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/RadialMirror.java index 6ae0939..eabe117 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/RadialMirror.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/RadialMirror.java @@ -11,7 +11,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; import net.minecraft.world.phys.Vec3; import net.minecraftforge.items.IItemHandler; -import nl.requios.effortlessbuilding.item.RandomizerBagItem; +import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem; import java.util.ArrayList; import java.util.List; @@ -74,9 +74,11 @@ public class RadialMirror { blockState = rotateOriginalBlockState(startAngleToCenter, blockState); //Randomizer bag synergy + AbstractRandomizerBagItem randomizerBagItem = null; IItemHandler bagInventory = null; - if (!itemStack.isEmpty() && itemStack.getItem() instanceof RandomizerBagItem) { - bagInventory = RandomizerBagItem.getBagInventory(itemStack); + if (!itemStack.isEmpty() && itemStack.getItem() instanceof AbstractRandomizerBagItem) { + randomizerBagItem = (AbstractRandomizerBagItem) itemStack.getItem() ; + bagInventory = randomizerBagItem.getBagInventory(itemStack); } BlockState newBlockState; @@ -95,8 +97,8 @@ public class RadialMirror { coordinates.add(newBlockPos); //Randomizer bag synergy - if (bagInventory != null) { - itemStack = RandomizerBagItem.pickRandomStack(bagInventory); + if (randomizerBagItem != null) { + itemStack = randomizerBagItem.pickRandomStack(bagInventory); newBlockState = BuildModifiers .getBlockStateFromItem(itemStack, player, startPos, Direction.UP, new Vec3(0, 0, 0), InteractionHand.MAIN_HAND); diff --git a/src/main/java/nl/requios/effortlessbuilding/capability/ItemHandlerCapabilityProvider.java b/src/main/java/nl/requios/effortlessbuilding/capability/ItemHandlerCapabilityProvider.java index 0a99d23..9c44516 100644 --- a/src/main/java/nl/requios/effortlessbuilding/capability/ItemHandlerCapabilityProvider.java +++ b/src/main/java/nl/requios/effortlessbuilding/capability/ItemHandlerCapabilityProvider.java @@ -8,13 +8,16 @@ import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemStackHandler; -import nl.requios.effortlessbuilding.item.RandomizerBagItem; import javax.annotation.Nonnull; import javax.annotation.Nullable; public class ItemHandlerCapabilityProvider implements ICapabilitySerializable { - IItemHandler itemHandler = new ItemStackHandler(RandomizerBagItem.INV_SIZE); + IItemHandler itemHandler; + + public ItemHandlerCapabilityProvider(int size) { + itemHandler = new ItemStackHandler(size); + } @Nonnull @Override diff --git a/src/main/java/nl/requios/effortlessbuilding/compatibility/CompatHelper.java b/src/main/java/nl/requios/effortlessbuilding/compatibility/CompatHelper.java index a8a6a3a..ce9a918 100644 --- a/src/main/java/nl/requios/effortlessbuilding/compatibility/CompatHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/compatibility/CompatHelper.java @@ -9,7 +9,7 @@ import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import nl.requios.effortlessbuilding.EffortlessBuilding; -import nl.requios.effortlessbuilding.item.RandomizerBagItem; +import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem; public class CompatHelper { //TODO 1.13 compatibility @@ -40,7 +40,7 @@ public class CompatHelper { Item item = stack.getItem(); if (item instanceof BlockItem) return true; - return item instanceof RandomizerBagItem; + return item instanceof AbstractRandomizerBagItem; //TODO 1.13 compatibility // if (item == dankNullItem) // return true; @@ -55,11 +55,11 @@ public class CompatHelper { return proxy; //Randomizer Bag - if (proxyItem instanceof RandomizerBagItem) { + if (proxyItem instanceof AbstractRandomizerBagItem) { ItemStack itemStack = proxy; while (!(itemStack.getItem() instanceof BlockItem || itemStack.isEmpty())) { - if (itemStack.getItem() instanceof RandomizerBagItem) - itemStack = RandomizerBagItem.pickRandomStack(RandomizerBagItem.getBagInventory(itemStack)); + if (itemStack.getItem() instanceof AbstractRandomizerBagItem randomizerBagItem) + itemStack = randomizerBagItem.pickRandomStack(randomizerBagItem.getBagInventory(itemStack)); } return itemStack; } @@ -82,9 +82,9 @@ public class CompatHelper { Item blockItem = Item.byBlock(state.getBlock()); if (stack.getItem() instanceof BlockItem) return stack; - else if (stack.getItem() instanceof RandomizerBagItem) { - IItemHandler bagInventory = RandomizerBagItem.getBagInventory(stack); - return RandomizerBagItem.findStack(bagInventory, blockItem); + else if (stack.getItem() instanceof AbstractRandomizerBagItem randomizerBagItem) { + IItemHandler bagInventory = randomizerBagItem.getBagInventory(stack); + return randomizerBagItem.findStack(bagInventory, blockItem); } //TODO 1.13 compatibility // else if (stack.getItem() == dankNullItem) { diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/DiamondRandomizerBagContainer.java b/src/main/java/nl/requios/effortlessbuilding/gui/DiamondRandomizerBagContainer.java new file mode 100644 index 0000000..8e4c50c --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/gui/DiamondRandomizerBagContainer.java @@ -0,0 +1,148 @@ +package nl.requios.effortlessbuilding.gui; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ClickType; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.SlotItemHandler; +import nl.requios.effortlessbuilding.EffortlessBuilding; +import nl.requios.effortlessbuilding.item.DiamondRandomizerBagItem; + +public class DiamondRandomizerBagContainer extends AbstractContainerMenu { + + private static final int INV_START = DiamondRandomizerBagItem.INV_SIZE, + INV_END = INV_START + 26, + HOTBAR_START = INV_END + 1, + HOTBAR_END = HOTBAR_START + 8; + private final IItemHandler bagInventory; + + public DiamondRandomizerBagContainer(MenuType type, int id){ + super(type, id); + bagInventory = null; + } + + //Client + public DiamondRandomizerBagContainer(int id, Inventory playerInventory, FriendlyByteBuf packetBuffer) { + this(id, playerInventory); + } + + //Server? + public DiamondRandomizerBagContainer(int containerId, Inventory playerInventory) { + this(containerId, playerInventory, new ItemStackHandler(DiamondRandomizerBagItem.INV_SIZE)); + } + + public DiamondRandomizerBagContainer(int containerId, Inventory playerInventory, IItemHandler inventory) { + super(EffortlessBuilding.DIAMOND_RANDOMIZER_BAG_CONTAINER.get(), containerId); + bagInventory = inventory; + + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlot(new SlotItemHandler(bagInventory, j + i * 9, 8 + j * 18, 18 + i * 18)); + } + } + + // add player inventory slots + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + addSlot(new Slot(playerInventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + } + } + + // add hotbar slots + for (int i = 0; i < 9; ++i) { + addSlot(new Slot(playerInventory, i, 8 + i * 18, 142)); + } + } + + @Override + public boolean stillValid(Player playerIn) { + return true; + } + + @Override + public Slot getSlot(int parSlotIndex) { + if (parSlotIndex >= slots.size()) + parSlotIndex = slots.size() - 1; + return super.getSlot(parSlotIndex); + } + + @Override + public ItemStack quickMoveStack(Player playerIn, int slotIndex) { + ItemStack itemstack = ItemStack.EMPTY; + Slot slot = this.slots.get(slotIndex); + + if (slot != null && slot.hasItem()) { + ItemStack itemstack1 = slot.getItem(); + itemstack = itemstack1.copy(); + + // If item is in our custom inventory + if (slotIndex < INV_START) { + // try to place in player inventory / action bar + if (!this.moveItemStackTo(itemstack1, INV_START, HOTBAR_END + 1, true)) { + return ItemStack.EMPTY; + } + + slot.onQuickCraft(itemstack1, itemstack); + } + // Item is in inventory / hotbar, try to place in custom inventory or armor slots + else { + /** + * Implementation number 1: Shift-click into your custom inventory + */ + if (slotIndex >= INV_START) { + // place in custom inventory + if (!this.moveItemStackTo(itemstack1, 0, INV_START, false)) { + return ItemStack.EMPTY; + } + } + } + + if (itemstack1.getCount() == 0) { + slot.set(ItemStack.EMPTY); + } else { + slot.setChanged(); + } + + if (itemstack1.getCount() == itemstack.getCount()) { + return ItemStack.EMPTY; + } + + slot.onTake(playerIn, itemstack1); + } + + return itemstack; + } + + /** + * You should override this method to prevent the player from moving the stack that + * opened the inventory, otherwise if the player moves it, the inventory will not + * be able to save properly + */ + @Override + public void clicked(int slot, int dragType, ClickType clickTypeIn, Player player) { + // this will prevent the player from interacting with the item that opened the inventory: + if (slot >= 0 && getSlot(slot) != null && getSlot(slot).getItem().equals(player.getItemInHand(InteractionHand.MAIN_HAND))) { + //Do nothing; + return; + } + super.clicked(slot, dragType, clickTypeIn, player); + } + + /** + * Callback for when the crafting gui is closed. + */ + @Override + public void removed(Player player) { + super.removed(player); + if (!player.level.isClientSide) { + broadcastChanges(); + } + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/DiamondRandomizerBagScreen.java b/src/main/java/nl/requios/effortlessbuilding/gui/DiamondRandomizerBagScreen.java new file mode 100644 index 0000000..520623f --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/gui/DiamondRandomizerBagScreen.java @@ -0,0 +1,49 @@ +package nl.requios.effortlessbuilding.gui; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import nl.requios.effortlessbuilding.EffortlessBuilding; + +import javax.annotation.ParametersAreNonnullByDefault; + +@OnlyIn(Dist.CLIENT) +@ParametersAreNonnullByDefault +public class DiamondRandomizerBagScreen extends AbstractContainerScreen { + private Inventory inventory; + + private static final ResourceLocation guiTextures = new ResourceLocation(EffortlessBuilding.MODID, "textures/gui/container/diamondrandomizerbag.png"); + + public DiamondRandomizerBagScreen(DiamondRandomizerBagContainer randomizerBagContainer, Inventory playerInventory, Component title) { + super(randomizerBagContainer, playerInventory, title); + this.inventory = playerInventory; + imageHeight = 167; + } + + @Override + public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) { + renderBackground(ms); + super.render(ms, mouseX, mouseY, partialTicks); + this.renderTooltip(ms, mouseX, mouseY); + } + + @Override + protected void renderLabels(PoseStack ms, int mouseX, int mouseY) { + this.font.draw(ms, this.title, 8, 6, 0x404040); + this.font.draw(ms, this.playerInventoryTitle, 8, imageHeight - 96 + 2, 0x404040); + } + + @Override + protected void renderBg(PoseStack ms, float partialTicks, int mouseX, int mouseY) { + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1f); + RenderSystem.setShaderTexture(0, guiTextures); + int marginHorizontal = (width - imageWidth) / 2; + int marginVertical = (height - imageHeight) / 2; + blit(ms, marginHorizontal, marginVertical, 0, 0, imageWidth, imageHeight); + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/GoldenRandomizerBagContainer.java b/src/main/java/nl/requios/effortlessbuilding/gui/GoldenRandomizerBagContainer.java new file mode 100644 index 0000000..cb0e4ff --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/gui/GoldenRandomizerBagContainer.java @@ -0,0 +1,146 @@ +package nl.requios.effortlessbuilding.gui; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ClickType; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.SlotItemHandler; +import nl.requios.effortlessbuilding.EffortlessBuilding; +import nl.requios.effortlessbuilding.item.GoldenRandomizerBagItem; + +public class GoldenRandomizerBagContainer extends AbstractContainerMenu { + + private static final int INV_START = GoldenRandomizerBagItem.INV_SIZE, + INV_END = INV_START + 26, + HOTBAR_START = INV_END + 1, + HOTBAR_END = HOTBAR_START + 8; + private final IItemHandler bagInventory; + + public GoldenRandomizerBagContainer(MenuType type, int id){ + super(type, id); + bagInventory = null; + } + + //Client + public GoldenRandomizerBagContainer(int id, Inventory playerInventory, FriendlyByteBuf packetBuffer) { + this(id, playerInventory); + } + + //Server? + public GoldenRandomizerBagContainer(int containerId, Inventory playerInventory) { + this(containerId, playerInventory, new ItemStackHandler(GoldenRandomizerBagItem.INV_SIZE)); + } + + public GoldenRandomizerBagContainer(int containerId, Inventory playerInventory, IItemHandler inventory) { + super(EffortlessBuilding.GOLDEN_RANDOMIZER_BAG_CONTAINER.get(), containerId); + bagInventory = inventory; + + for (int i = 0; i < GoldenRandomizerBagItem.INV_SIZE; ++i) { + this.addSlot(new SlotItemHandler(bagInventory, i, 8 + (18 * i), 20)); + } + + // add player inventory slots + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + addSlot(new Slot(playerInventory, j + i * 9 + 9, 8 + j * 18, 51 + i * 18)); + } + } + + // add hotbar slots + for (int i = 0; i < 9; ++i) { + addSlot(new Slot(playerInventory, i, 8 + i * 18, 109)); + } + } + + @Override + public boolean stillValid(Player playerIn) { + return true; + } + + @Override + public Slot getSlot(int parSlotIndex) { + if (parSlotIndex >= slots.size()) + parSlotIndex = slots.size() - 1; + return super.getSlot(parSlotIndex); + } + + @Override + public ItemStack quickMoveStack(Player playerIn, int slotIndex) { + ItemStack itemstack = ItemStack.EMPTY; + Slot slot = this.slots.get(slotIndex); + + if (slot != null && slot.hasItem()) { + ItemStack itemstack1 = slot.getItem(); + itemstack = itemstack1.copy(); + + // If item is in our custom inventory + if (slotIndex < INV_START) { + // try to place in player inventory / action bar + if (!this.moveItemStackTo(itemstack1, INV_START, HOTBAR_END + 1, true)) { + return ItemStack.EMPTY; + } + + slot.onQuickCraft(itemstack1, itemstack); + } + // Item is in inventory / hotbar, try to place in custom inventory or armor slots + else { + /** + * Implementation number 1: Shift-click into your custom inventory + */ + if (slotIndex >= INV_START) { + // place in custom inventory + if (!this.moveItemStackTo(itemstack1, 0, INV_START, false)) { + return ItemStack.EMPTY; + } + } + } + + if (itemstack1.getCount() == 0) { + slot.set(ItemStack.EMPTY); + } else { + slot.setChanged(); + } + + if (itemstack1.getCount() == itemstack.getCount()) { + return ItemStack.EMPTY; + } + + slot.onTake(playerIn, itemstack1); + } + + return itemstack; + } + + /** + * You should override this method to prevent the player from moving the stack that + * opened the inventory, otherwise if the player moves it, the inventory will not + * be able to save properly + */ + @Override + public void clicked(int slot, int dragType, ClickType clickTypeIn, Player player) { + // this will prevent the player from interacting with the item that opened the inventory: + if (slot >= 0 && getSlot(slot) != null && getSlot(slot).getItem().equals(player.getItemInHand(InteractionHand.MAIN_HAND))) { + //Do nothing; + return; + } + super.clicked(slot, dragType, clickTypeIn, player); + } + + /** + * Callback for when the crafting gui is closed. + */ + @Override + public void removed(Player player) { + super.removed(player); + if (!player.level.isClientSide) { + broadcastChanges(); + } + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/GoldenRandomizerBagScreen.java b/src/main/java/nl/requios/effortlessbuilding/gui/GoldenRandomizerBagScreen.java new file mode 100644 index 0000000..45a68b7 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/gui/GoldenRandomizerBagScreen.java @@ -0,0 +1,49 @@ +package nl.requios.effortlessbuilding.gui; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import nl.requios.effortlessbuilding.EffortlessBuilding; + +import javax.annotation.ParametersAreNonnullByDefault; + +@OnlyIn(Dist.CLIENT) +@ParametersAreNonnullByDefault +public class GoldenRandomizerBagScreen extends AbstractContainerScreen { + private Inventory inventory; + + private static final ResourceLocation guiTextures = new ResourceLocation(EffortlessBuilding.MODID, "textures/gui/container/goldenrandomizerbag.png"); + + public GoldenRandomizerBagScreen(GoldenRandomizerBagContainer randomizerBagContainer, Inventory playerInventory, Component title) { + super(randomizerBagContainer, playerInventory, title); + this.inventory = playerInventory; + imageHeight = 134; + } + + @Override + public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) { + renderBackground(ms); + super.render(ms, mouseX, mouseY, partialTicks); + this.renderTooltip(ms, mouseX, mouseY); + } + + @Override + protected void renderLabels(PoseStack ms, int mouseX, int mouseY) { + this.font.draw(ms, this.title, 8, 6, 0x404040); + this.font.draw(ms, this.playerInventoryTitle, 8, imageHeight - 96 + 2, 0x404040); + } + + @Override + protected void renderBg(PoseStack ms, float partialTicks, int mouseX, int mouseY) { + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1f); + RenderSystem.setShaderTexture(0, guiTextures); + int marginHorizontal = (width - imageWidth) / 2; + int marginVertical = (height - imageHeight) / 2; + blit(ms, marginHorizontal, marginVertical, 0, 0, imageWidth, imageHeight); + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagContainer.java b/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagContainer.java index 08fb7b8..32a6dbc 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagContainer.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagContainer.java @@ -17,8 +17,10 @@ import nl.requios.effortlessbuilding.item.RandomizerBagItem; public class RandomizerBagContainer extends AbstractContainerMenu { - private static final int INV_START = RandomizerBagItem.INV_SIZE, INV_END = INV_START + 26, - HOTBAR_START = INV_END + 1, HOTBAR_END = HOTBAR_START + 8; + private static final int INV_START = RandomizerBagItem.INV_SIZE, + INV_END = INV_START + 26, + HOTBAR_START = INV_END + 1, + HOTBAR_END = HOTBAR_START + 8; private final IItemHandler bagInventory; public RandomizerBagContainer(MenuType type, int id){ @@ -45,15 +47,14 @@ public class RandomizerBagContainer extends AbstractContainerMenu { } // add player inventory slots - int i; - for (i = 0; i < 3; ++i) { + for (int i = 0; i < 3; ++i) { for (int j = 0; j < 9; ++j) { addSlot(new Slot(playerInventory, j + i * 9 + 9, 8 + j * 18, 51 + i * 18)); } } // add hotbar slots - for (i = 0; i < 9; ++i) { + for (int i = 0; i < 9; ++i) { addSlot(new Slot(playerInventory, i, 8 + i * 18, 109)); } } @@ -99,7 +100,6 @@ public class RandomizerBagContainer extends AbstractContainerMenu { return ItemStack.EMPTY; } } - } if (itemstack1.getCount() == 0) { @@ -128,6 +128,7 @@ public class RandomizerBagContainer extends AbstractContainerMenu { // this will prevent the player from interacting with the item that opened the inventory: if (slot >= 0 && getSlot(slot) != null && getSlot(slot).getItem().equals(player.getItemInHand(InteractionHand.MAIN_HAND))) { //Do nothing; + return; } super.clicked(slot, dragType, clickTypeIn, player); } diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagScreen.java b/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagScreen.java index 9da4691..44aa710 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagScreen.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagScreen.java @@ -17,11 +17,10 @@ import javax.annotation.ParametersAreNonnullByDefault; public class RandomizerBagScreen extends AbstractContainerScreen { private Inventory inventory; - private static final ResourceLocation guiTextures = - new ResourceLocation(EffortlessBuilding.MODID, "textures/gui/container/randomizerbag.png"); + private static final ResourceLocation guiTextures = new ResourceLocation(EffortlessBuilding.MODID, "textures/gui/container/randomizerbag.png"); public RandomizerBagScreen(RandomizerBagContainer randomizerBagContainer, Inventory playerInventory, Component title) { - super(randomizerBagContainer, playerInventory, title);//new TranslationTextComponent("effortlessbuilding.screen.randomizer_bag")); + super(randomizerBagContainer, playerInventory, title); this.inventory = playerInventory; imageHeight = 134; } diff --git a/src/main/java/nl/requios/effortlessbuilding/item/AbstractRandomizerBagItem.java b/src/main/java/nl/requios/effortlessbuilding/item/AbstractRandomizerBagItem.java new file mode 100644 index 0000000..b5302cd --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/item/AbstractRandomizerBagItem.java @@ -0,0 +1,230 @@ +package nl.requios.effortlessbuilding.item; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.MenuProvider; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.InteractionResult; +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.level.Level; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.fmllegacy.network.NetworkHooks; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; +import nl.requios.effortlessbuilding.buildmode.BuildModes; +import nl.requios.effortlessbuilding.buildmode.ModeSettingsManager; +import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager; +import nl.requios.effortlessbuilding.capability.ItemHandlerCapabilityProvider; +import nl.requios.effortlessbuilding.gui.RandomizerBagContainer; +import nl.requios.effortlessbuilding.helper.SurvivalHelper; + +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; +import java.util.Random; + +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.item.context.UseOnContext; + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +public abstract class AbstractRandomizerBagItem extends Item { + + private static long currentSeed = 1337; + private static final Random rand = new Random(currentSeed); + + public AbstractRandomizerBagItem() { + super(new Item.Properties().tab(CreativeModeTab.TAB_TOOLS).stacksTo(1)); + } + + public abstract int getInventorySize(); + + public abstract MenuProvider getContainerProvider(ItemStack item); + + /** + * Get the inventory of a randomizer bag by checking the capability. + */ + public IItemHandler getBagInventory(ItemStack bag) { + return bag.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null).orElse(null); + } + + /** + * Pick a random slot from the bag. Empty slots will never get chosen. + */ + public ItemStack pickRandomStack(IItemHandler bagInventory) { + //Find how many stacks are non-empty, and save them in a list + int nonempty = 0; + List nonEmptyStacks = new ArrayList<>(); + List originalSlots = new ArrayList<>(getInventorySize()); + for (int i = 0; i < bagInventory.getSlots(); i++) { + ItemStack stack = bagInventory.getStackInSlot(i); + if (!stack.isEmpty()) { + nonempty++; + nonEmptyStacks.add(stack); + originalSlots.add(i); + } + } + + if (nonEmptyStacks.size() != originalSlots.size()) + throw new Error("NonEmptyStacks and OriginalSlots not same size"); + + if (nonempty == 0) return ItemStack.EMPTY; + + //Pick random slot + int randomSlot = rand.nextInt(nonempty); + if (randomSlot < 0 || randomSlot > bagInventory.getSlots()) return ItemStack.EMPTY; + + int originalSlot = originalSlots.get(randomSlot); + if (originalSlot < 0 || originalSlot > bagInventory.getSlots()) return ItemStack.EMPTY; + + return bagInventory.getStackInSlot(originalSlot); + } + + public ItemStack findStack(IItemHandler bagInventory, Item item) { + for (int i = 0; i < bagInventory.getSlots(); i++) { + ItemStack stack = bagInventory.getStackInSlot(i); + if (!stack.isEmpty() && stack.getItem() == item) { + return stack; + } + } + return ItemStack.EMPTY; + } + + public static void resetRandomness() { + rand.setSeed(currentSeed); + } + + public static void renewRandomness() { + currentSeed = Calendar.getInstance().getTimeInMillis(); + rand.setSeed(currentSeed); + } + + @Override + public InteractionResult useOn(UseOnContext ctx) { + Player player = ctx.getPlayer(); + Level world = ctx.getLevel(); + BlockPos pos = ctx.getClickedPos(); + Direction facing = ctx.getClickedFace(); + ItemStack item = ctx.getItemInHand(); + Vec3 hitVec = ctx.getClickLocation(); + + if (player == null) return InteractionResult.FAIL; + + if (ctx.getPlayer() != null && ctx.getPlayer().isShiftKeyDown()) { //ctx.isPlacerSneaking() + if (world.isClientSide) return InteractionResult.SUCCESS; + //Open inventory + NetworkHooks.openGui((ServerPlayer) player, getContainerProvider(item)); + } else { + if (world.isClientSide) return InteractionResult.SUCCESS; + + //Only place manually if in normal vanilla mode + BuildModes.BuildModeEnum buildMode = ModeSettingsManager.getModeSettings(player).getBuildMode(); + ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player); + if (buildMode != BuildModes.BuildModeEnum.NORMAL || modifierSettings.doQuickReplace()) { + return InteractionResult.FAIL; + } + + //Use item + //Get bag inventory + //TODO offhand support + ItemStack bag = player.getItemInHand(InteractionHand.MAIN_HAND); + IItemHandler bagInventory = getBagInventory(bag); + if (bagInventory == null) + return InteractionResult.FAIL; + + ItemStack toPlace = pickRandomStack(bagInventory); + if (toPlace.isEmpty()) return InteractionResult.FAIL; + + //Previously: use onItemUse to place block (no synergy) + //bag.setItemDamage(toPlace.getMetadata()); + //toPlace.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); + + //TODO replaceable + if (!world.getBlockState(pos).getBlock().canBeReplaced(world.getBlockState(pos), Fluids.EMPTY)) { + pos = pos.relative(facing); + } + + BlockPlaceContext blockItemUseContext = new BlockPlaceContext(new UseOnContext(player, InteractionHand.MAIN_HAND, new BlockHitResult(hitVec, facing, pos, false))); + BlockState blockState = Block.byItem(toPlace.getItem()).getStateForPlacement(blockItemUseContext); + + SurvivalHelper.placeBlock(world, player, pos, blockState, toPlace, facing, hitVec, false, false, true); + + //Synergy + //Works without calling +// BlockSnapshot blockSnapshot = new BlockSnapshot(player.world, pos, blockState); +// BlockEvent.PlaceEvent placeEvent = new BlockEvent.PlaceEvent(blockSnapshot, blockState, player, hand); +// Mirror.onBlockPlaced(placeEvent); +// Array.onBlockPlaced(placeEvent); + } + return InteractionResult.SUCCESS; + } + + @Override + public InteractionResultHolder use(Level world, Player player, InteractionHand hand) { + ItemStack bag = player.getItemInHand(hand); + + if (player.isShiftKeyDown()) { + if (world.isClientSide) return new InteractionResultHolder<>(InteractionResult.SUCCESS, bag); + //Open inventory + NetworkHooks.openGui((ServerPlayer) player, getContainerProvider(bag)); + } else { + //Use item + //Get bag inventory + IItemHandler bagInventory = getBagInventory(bag); + if (bagInventory == null) + return new InteractionResultHolder<>(InteractionResult.FAIL, bag); + + ItemStack toUse = pickRandomStack(bagInventory); + if (toUse.isEmpty()) return new InteractionResultHolder<>(InteractionResult.FAIL, bag); + + return toUse.use(world, player, hand); + } + return new InteractionResultHolder<>(InteractionResult.PASS, bag); + } + + @Override + public int getUseDuration(ItemStack p_77626_1_) { + return 1; + } + + @Nullable + @Override + public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundTag nbt) { + return new ItemHandlerCapabilityProvider(getInventorySize()); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag flag) { + tooltip.add(new TextComponent(ChatFormatting.BLUE + "Rightclick" + ChatFormatting.GRAY + " to place a random block")); + tooltip.add(new TextComponent(ChatFormatting.BLUE + "Sneak + rightclick" + ChatFormatting.GRAY + " to open inventory")); + if (world != null && world.players().size() > 1) { + tooltip.add(new TextComponent(ChatFormatting.YELLOW + "Experimental on servers: may lose inventory")); + } + } + + @Override + public String getDescriptionId() { + return this.getRegistryName().toString(); + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/item/DiamondRandomizerBagItem.java b/src/main/java/nl/requios/effortlessbuilding/item/DiamondRandomizerBagItem.java new file mode 100644 index 0000000..af762db --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/item/DiamondRandomizerBagItem.java @@ -0,0 +1,46 @@ +package nl.requios.effortlessbuilding.item; + +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; +import nl.requios.effortlessbuilding.gui.DiamondRandomizerBagContainer; + +import javax.annotation.Nullable; + +public class DiamondRandomizerBagItem extends AbstractRandomizerBagItem{ + public static final int INV_SIZE = 27; + + @Override + public int getInventorySize() { + return 27; + } + + @Override + public MenuProvider getContainerProvider(ItemStack bag) { + return new ContainerProvider(bag); + } + + public static class ContainerProvider implements MenuProvider { + + private final ItemStack bag; + + public ContainerProvider(ItemStack bag) { + this.bag = bag; + } + + @Override + public Component getDisplayName() { + return new TranslatableComponent("effortlessbuilding:diamond_randomizer_bag"); + } + + @Nullable + @Override + public AbstractContainerMenu createMenu(int containerId, Inventory playerInventory, Player player) { + return new DiamondRandomizerBagContainer(containerId, playerInventory, ((AbstractRandomizerBagItem)bag.getItem()).getBagInventory(bag)); + } + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/item/GoldenRandomizerBagItem.java b/src/main/java/nl/requios/effortlessbuilding/item/GoldenRandomizerBagItem.java new file mode 100644 index 0000000..34dea54 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/item/GoldenRandomizerBagItem.java @@ -0,0 +1,46 @@ +package nl.requios.effortlessbuilding.item; + +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; +import nl.requios.effortlessbuilding.gui.GoldenRandomizerBagContainer; + +import javax.annotation.Nullable; + +public class GoldenRandomizerBagItem extends AbstractRandomizerBagItem{ + public static final int INV_SIZE = 9; + + @Override + public int getInventorySize() { + return 9; + } + + @Override + public MenuProvider getContainerProvider(ItemStack bag) { + return new ContainerProvider(bag); + } + + public static class ContainerProvider implements MenuProvider { + + private final ItemStack bag; + + public ContainerProvider(ItemStack bag) { + this.bag = bag; + } + + @Override + public Component getDisplayName() { + return new TranslatableComponent("effortlessbuilding:golden_randomizer_bag"); + } + + @Nullable + @Override + public AbstractContainerMenu createMenu(int containerId, Inventory playerInventory, Player player) { + return new GoldenRandomizerBagContainer(containerId, playerInventory, ((AbstractRandomizerBagItem)bag.getItem()).getBagInventory(bag)); + } + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/item/RandomizerBagItem.java b/src/main/java/nl/requios/effortlessbuilding/item/RandomizerBagItem.java index 9180053..c07c5cd 100644 --- a/src/main/java/nl/requios/effortlessbuilding/item/RandomizerBagItem.java +++ b/src/main/java/nl/requios/effortlessbuilding/item/RandomizerBagItem.java @@ -1,235 +1,27 @@ package nl.requios.effortlessbuilding.item; -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.MenuProvider; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.InteractionResultHolder; -import net.minecraft.world.InteractionResult; -import net.minecraft.core.Direction; -import net.minecraft.world.InteractionHand; -import net.minecraft.core.BlockPos; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.Vec3; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.TextComponent; -import net.minecraft.ChatFormatting; import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.world.level.Level; -import net.minecraftforge.common.capabilities.ICapabilityProvider; -import net.minecraftforge.fmllegacy.network.NetworkHooks; -import net.minecraftforge.items.CapabilityItemHandler; -import net.minecraftforge.items.IItemHandler; -import nl.requios.effortlessbuilding.EffortlessBuilding; -import nl.requios.effortlessbuilding.buildmode.BuildModes; -import nl.requios.effortlessbuilding.buildmode.ModeSettingsManager; -import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager; -import nl.requios.effortlessbuilding.capability.ItemHandlerCapabilityProvider; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; import nl.requios.effortlessbuilding.gui.RandomizerBagContainer; -import nl.requios.effortlessbuilding.helper.SurvivalHelper; import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; -import java.util.Random; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.item.context.UseOnContext; - -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -public class RandomizerBagItem extends Item { +public class RandomizerBagItem extends AbstractRandomizerBagItem { public static final int INV_SIZE = 5; - private static long currentSeed = 1337; - private static final Random rand = new Random(currentSeed); - - public RandomizerBagItem() { - super(new Item.Properties().tab(CreativeModeTab.TAB_TOOLS).stacksTo(1)); - } - - /** - * Get the inventory of a randomizer bag by checking the capability. - * - * @param bag - * @return - */ - public static IItemHandler getBagInventory(ItemStack bag) { - return bag.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null).orElse(null); - } - - /** - * Pick a random slot from the bag. Empty slots will never get chosen. - * - * @param bagInventory - * @return - */ - public static ItemStack pickRandomStack(IItemHandler bagInventory) { - //Find how many stacks are non-empty, and save them in a list - int nonempty = 0; - List nonEmptyStacks = new ArrayList<>(INV_SIZE); - List originalSlots = new ArrayList<>(INV_SIZE); - for (int i = 0; i < bagInventory.getSlots(); i++) { - ItemStack stack = bagInventory.getStackInSlot(i); - if (!stack.isEmpty()) { - nonempty++; - nonEmptyStacks.add(stack); - originalSlots.add(i); - } - } - - if (nonEmptyStacks.size() != originalSlots.size()) - throw new Error("NonEmptyStacks and OriginalSlots not same size"); - - if (nonempty == 0) return ItemStack.EMPTY; - - //Pick random slot - int randomSlot = rand.nextInt(nonempty); - if (randomSlot < 0 || randomSlot > bagInventory.getSlots()) return ItemStack.EMPTY; - - int originalSlot = originalSlots.get(randomSlot); - if (originalSlot < 0 || originalSlot > bagInventory.getSlots()) return ItemStack.EMPTY; - - return bagInventory.getStackInSlot(originalSlot); - } - - public static ItemStack findStack(IItemHandler bagInventory, Item item) { - for (int i = 0; i < bagInventory.getSlots(); i++) { - ItemStack stack = bagInventory.getStackInSlot(i); - if (!stack.isEmpty() && stack.getItem() == item) { - return stack; - } - } - return ItemStack.EMPTY; - } - - public static void resetRandomness() { - rand.setSeed(currentSeed); - } - - public static void renewRandomness() { - currentSeed = Calendar.getInstance().getTimeInMillis(); - rand.setSeed(currentSeed); + @Override + public int getInventorySize() { + return 5; } @Override - public InteractionResult useOn(UseOnContext ctx) { - Player player = ctx.getPlayer(); - Level world = ctx.getLevel(); - BlockPos pos = ctx.getClickedPos(); - Direction facing = ctx.getClickedFace(); - ItemStack item = ctx.getItemInHand(); - Vec3 hitVec = ctx.getClickLocation(); - - if (player == null) return InteractionResult.FAIL; - - if (ctx.getPlayer() != null && ctx.getPlayer().isShiftKeyDown()) { //ctx.isPlacerSneaking() - if (world.isClientSide) return InteractionResult.SUCCESS; - //Open inventory - NetworkHooks.openGui((ServerPlayer) player, new ContainerProvider(item)); - } else { - if (world.isClientSide) return InteractionResult.SUCCESS; - - //Only place manually if in normal vanilla mode - BuildModes.BuildModeEnum buildMode = ModeSettingsManager.getModeSettings(player).getBuildMode(); - ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player); - if (buildMode != BuildModes.BuildModeEnum.NORMAL || modifierSettings.doQuickReplace()) { - return InteractionResult.FAIL; - } - - //Use item - //Get bag inventory - //TODO offhand support - ItemStack bag = player.getItemInHand(InteractionHand.MAIN_HAND); - IItemHandler bagInventory = getBagInventory(bag); - if (bagInventory == null) - return InteractionResult.FAIL; - - ItemStack toPlace = pickRandomStack(bagInventory); - if (toPlace.isEmpty()) return InteractionResult.FAIL; - - //Previously: use onItemUse to place block (no synergy) - //bag.setItemDamage(toPlace.getMetadata()); - //toPlace.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); - - //TODO replaceable - if (!world.getBlockState(pos).getBlock().canBeReplaced(world.getBlockState(pos), Fluids.EMPTY)) { - pos = pos.relative(facing); - } - - BlockPlaceContext blockItemUseContext = new BlockPlaceContext(new UseOnContext(player, InteractionHand.MAIN_HAND, new BlockHitResult(hitVec, facing, pos, false))); - BlockState blockState = Block.byItem(toPlace.getItem()).getStateForPlacement(blockItemUseContext); - - SurvivalHelper.placeBlock(world, player, pos, blockState, toPlace, facing, hitVec, false, false, true); - - //Synergy - //Works without calling -// BlockSnapshot blockSnapshot = new BlockSnapshot(player.world, pos, blockState); -// BlockEvent.PlaceEvent placeEvent = new BlockEvent.PlaceEvent(blockSnapshot, blockState, player, hand); -// Mirror.onBlockPlaced(placeEvent); -// Array.onBlockPlaced(placeEvent); - } - return InteractionResult.SUCCESS; - } - - @Override - public InteractionResultHolder use(Level world, Player player, InteractionHand hand) { - ItemStack bag = player.getItemInHand(hand); - - if (player.isShiftKeyDown()) { - if (world.isClientSide) return new InteractionResultHolder<>(InteractionResult.SUCCESS, bag); - //Open inventory - NetworkHooks.openGui((ServerPlayer) player, new ContainerProvider(bag)); - } else { - //Use item - //Get bag inventory - IItemHandler bagInventory = getBagInventory(bag); - if (bagInventory == null) - return new InteractionResultHolder<>(InteractionResult.FAIL, bag); - - ItemStack toUse = pickRandomStack(bagInventory); - if (toUse.isEmpty()) return new InteractionResultHolder<>(InteractionResult.FAIL, bag); - - return toUse.use(world, player, hand); - } - return new InteractionResultHolder<>(InteractionResult.PASS, bag); - } - - @Override - public int getUseDuration(ItemStack p_77626_1_) { - return 1; - } - - @Nullable - @Override - public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundTag nbt) { - return new ItemHandlerCapabilityProvider(); - } - - @Override - public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag flag) { - tooltip.add(new TextComponent(ChatFormatting.BLUE + "Rightclick" + ChatFormatting.GRAY + " to place a random block")); - tooltip.add(new TextComponent(ChatFormatting.BLUE + "Sneak + rightclick" + ChatFormatting.GRAY + " to open inventory")); - if (world != null && world.players().size() > 1) { - tooltip.add(new TextComponent(ChatFormatting.YELLOW + "Experimental on servers: may lose inventory")); - } - } - - @Override - public String getDescriptionId() { - return this.getRegistryName().toString(); + public MenuProvider getContainerProvider(ItemStack bag) { + return new ContainerProvider(bag); } public static class ContainerProvider implements MenuProvider { @@ -242,13 +34,13 @@ public class RandomizerBagItem extends Item { @Override public Component getDisplayName() { - return new TranslatableComponent("effortlessbuilding.screen.randomizer_bag"); + return new TranslatableComponent("effortlessbuilding:randomizer_bag"); } @Nullable @Override public AbstractContainerMenu createMenu(int containerId, Inventory playerInventory, Player player) { - return new RandomizerBagContainer(containerId, playerInventory, RandomizerBagItem.getBagInventory(bag)); + return new RandomizerBagContainer(containerId, playerInventory, ((AbstractRandomizerBagItem)bag.getItem()).getBagInventory(bag)); } } } diff --git a/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java b/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java index 258ac6b..d4b2d33 100644 --- a/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java +++ b/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java @@ -1,6 +1,5 @@ package nl.requios.effortlessbuilding.proxy; -import com.mojang.blaze3d.platform.ScreenManager; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.gui.screens.MenuScreens; import net.minecraft.world.level.block.state.BlockState; @@ -42,7 +41,8 @@ import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.ModeSettingsManager; import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager; import nl.requios.effortlessbuilding.compatibility.CompatHelper; -import nl.requios.effortlessbuilding.gui.RandomizerBagContainer; +import nl.requios.effortlessbuilding.gui.DiamondRandomizerBagScreen; +import nl.requios.effortlessbuilding.gui.GoldenRandomizerBagScreen; import nl.requios.effortlessbuilding.gui.RandomizerBagScreen; import nl.requios.effortlessbuilding.gui.buildmode.PlayerSettingsGui; import nl.requios.effortlessbuilding.gui.buildmode.RadialMenu; @@ -359,6 +359,8 @@ public class ClientProxy implements IProxy { } MenuScreens.register(EffortlessBuilding.RANDOMIZER_BAG_CONTAINER.get(), RandomizerBagScreen::new); + MenuScreens.register(EffortlessBuilding.GOLDEN_RANDOMIZER_BAG_CONTAINER.get(), GoldenRandomizerBagScreen::new); + MenuScreens.register(EffortlessBuilding.DIAMOND_RANDOMIZER_BAG_CONTAINER.get(), DiamondRandomizerBagScreen::new); } public Player getPlayerEntityFromContext(Supplier ctx) { diff --git a/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviewRenderer.java b/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviewRenderer.java index 232b0ab..be0f083 100644 --- a/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviewRenderer.java +++ b/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviewRenderer.java @@ -32,7 +32,7 @@ import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager.Modif import nl.requios.effortlessbuilding.compatibility.CompatHelper; import nl.requios.effortlessbuilding.helper.ReachHelper; import nl.requios.effortlessbuilding.helper.SurvivalHelper; -import nl.requios.effortlessbuilding.item.RandomizerBagItem; +import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem; import nl.requios.effortlessbuilding.proxy.ClientProxy; import java.util.ArrayList; @@ -168,7 +168,7 @@ public class BlockPreviewRenderer { previousSecondPos = secondPos; //if so, renew randomness of randomizer bag - RandomizerBagItem.renewRandomness(); + AbstractRandomizerBagItem.renewRandomness(); //and play sound (max once every tick) if (newCoordinates.size() > 1 && blockStates.size() > 1 && soundTime < ClientProxy.ticksInGame - 0) { soundTime = ClientProxy.ticksInGame; diff --git a/src/main/resources/assets/effortlessbuilding/lang/en_us.json b/src/main/resources/assets/effortlessbuilding/lang/en_us.json index 3a74bbc..197528f 100644 --- a/src/main/resources/assets/effortlessbuilding/lang/en_us.json +++ b/src/main/resources/assets/effortlessbuilding/lang/en_us.json @@ -1,7 +1,6 @@ { "effortlessbuilding.screen.modifier_settings": "Modifier Settings", "effortlessbuilding.screen.radial_menu": "Build Modes", - "effortlessbuilding.screen.randomizer_bag": "Randomizer Bag", "effortlessbuilding.screen.player_settings": "Player Settings", "key.effortlessbuilding.category": "Effortless Building", @@ -13,7 +12,9 @@ "key.effortlessbuilding.redo.desc": "Redo", "key.effortlessbuilding.altplacement.desc": "Alternative placement", - "effortlessbuilding:randomizer_bag": "Randomizer Bag", + "effortlessbuilding:randomizer_bag": "Leather Randomizer Bag", + "effortlessbuilding:golden_randomizer_bag": "Golden Randomizer Bag", + "effortlessbuilding:diamond_randomizer_bag": "Diamond Randomizer Bag", "effortlessbuilding:reach_upgrade1": "Reach Upgrade 1", "effortlessbuilding:reach_upgrade2": "Reach Upgrade 2", "effortlessbuilding:reach_upgrade3": "Reach Upgrade 3", diff --git a/src/main/resources/assets/effortlessbuilding/models/item/diamond_randomizer_bag.json b/src/main/resources/assets/effortlessbuilding/models/item/diamond_randomizer_bag.json new file mode 100644 index 0000000..73c973c --- /dev/null +++ b/src/main/resources/assets/effortlessbuilding/models/item/diamond_randomizer_bag.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "effortlessbuilding:items/diamondrandomizerbag" + } +} diff --git a/src/main/resources/assets/effortlessbuilding/models/item/golden_randomizer_bag.json b/src/main/resources/assets/effortlessbuilding/models/item/golden_randomizer_bag.json new file mode 100644 index 0000000..ca4e43f --- /dev/null +++ b/src/main/resources/assets/effortlessbuilding/models/item/golden_randomizer_bag.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "effortlessbuilding:items/goldenrandomizerbag" + } +} diff --git a/src/main/resources/assets/effortlessbuilding/textures/gui/container/diamondrandomizerbag.png b/src/main/resources/assets/effortlessbuilding/textures/gui/container/diamondrandomizerbag.png new file mode 100644 index 0000000..5210658 Binary files /dev/null and b/src/main/resources/assets/effortlessbuilding/textures/gui/container/diamondrandomizerbag.png differ diff --git a/src/main/resources/assets/effortlessbuilding/textures/gui/container/goldenrandomizerbag.png b/src/main/resources/assets/effortlessbuilding/textures/gui/container/goldenrandomizerbag.png new file mode 100644 index 0000000..2998356 Binary files /dev/null and b/src/main/resources/assets/effortlessbuilding/textures/gui/container/goldenrandomizerbag.png differ diff --git a/src/main/resources/assets/effortlessbuilding/textures/items/diamondrandomizerbag.png b/src/main/resources/assets/effortlessbuilding/textures/items/diamondrandomizerbag.png new file mode 100644 index 0000000..1338c9f Binary files /dev/null and b/src/main/resources/assets/effortlessbuilding/textures/items/diamondrandomizerbag.png differ diff --git a/src/main/resources/assets/effortlessbuilding/textures/items/goldenrandomizerbag.png b/src/main/resources/assets/effortlessbuilding/textures/items/goldenrandomizerbag.png new file mode 100644 index 0000000..e45327b Binary files /dev/null and b/src/main/resources/assets/effortlessbuilding/textures/items/goldenrandomizerbag.png differ diff --git a/src/main/resources/assets/effortlessbuilding/textures/items/reachupgrade1.png b/src/main/resources/assets/effortlessbuilding/textures/items/reachupgrade1.png index 37a1939..783dde0 100644 Binary files a/src/main/resources/assets/effortlessbuilding/textures/items/reachupgrade1.png and b/src/main/resources/assets/effortlessbuilding/textures/items/reachupgrade1.png differ diff --git a/src/main/resources/assets/effortlessbuilding/textures/items/reachupgrade2.png b/src/main/resources/assets/effortlessbuilding/textures/items/reachupgrade2.png index 783dde0..37a1939 100644 Binary files a/src/main/resources/assets/effortlessbuilding/textures/items/reachupgrade2.png and b/src/main/resources/assets/effortlessbuilding/textures/items/reachupgrade2.png differ diff --git a/src/main/resources/data/effortlessbuilding/recipes/diamond_randomizer_bag.json b/src/main/resources/data/effortlessbuilding/recipes/diamond_randomizer_bag.json new file mode 100644 index 0000000..3caf55b --- /dev/null +++ b/src/main/resources/data/effortlessbuilding/recipes/diamond_randomizer_bag.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "x#x", + "#O#", + "x#x" + ], + "key": { + "O": { + "item": "minecraft:leather" + }, + "#": { + "item": "minecraft:diamond" + }, + "x": { + "item": "minecraft:amethyst_shard" + } + }, + "result": { + "item": "effortlessbuilding:diamond_randomizer_bag" + } +} \ No newline at end of file diff --git a/src/main/resources/data/effortlessbuilding/recipes/golden_randomizer_bag.json b/src/main/resources/data/effortlessbuilding/recipes/golden_randomizer_bag.json new file mode 100644 index 0000000..d5f9676 --- /dev/null +++ b/src/main/resources/data/effortlessbuilding/recipes/golden_randomizer_bag.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "x#x", + "#O#", + "x#x" + ], + "key": { + "O": { + "item": "minecraft:leather" + }, + "#": { + "item": "minecraft:gold_ingot" + }, + "x": { + "item": "minecraft:quartz" + } + }, + "result": { + "item": "effortlessbuilding:golden_randomizer_bag" + } +} \ No newline at end of file diff --git a/src/main/resources/data/effortlessbuilding/recipes/reach_upgrade1.json b/src/main/resources/data/effortlessbuilding/recipes/reach_upgrade1.json index 680ec04..220bcd2 100644 --- a/src/main/resources/data/effortlessbuilding/recipes/reach_upgrade1.json +++ b/src/main/resources/data/effortlessbuilding/recipes/reach_upgrade1.json @@ -1,15 +1,16 @@ { "type": "minecraft:crafting_shaped", "pattern": [ - " S", - "/ " + " # ", + "#O#", + " # " ], "key": { - "S": { - "item": "minecraft:string" + "O": { + "item": "minecraft:ender_pearl" }, - "/": { - "item": "minecraft:stick" + "#": { + "item": "minecraft:prismarine_crystals" } }, "result": { diff --git a/src/main/resources/data/effortlessbuilding/recipes/reach_upgrade2.json b/src/main/resources/data/effortlessbuilding/recipes/reach_upgrade2.json index c70782a..34e8ce2 100644 --- a/src/main/resources/data/effortlessbuilding/recipes/reach_upgrade2.json +++ b/src/main/resources/data/effortlessbuilding/recipes/reach_upgrade2.json @@ -1,16 +1,20 @@ { "type": "minecraft:crafting_shaped", "pattern": [ - " M", - "/ " + "x#x", + "#O#", + "x#x" ], "key": { - "M": { - "item": "minecraft:magma_cream" + "O": { + "item": "minecraft:ender_pearl" }, - "/": { - "item": "minecraft:bone" - } + "#": { + "item": "minecraft:slime_ball" + }, + "x": { + "item": "minecraft:chorus_fruit" + } }, "result": { "item": "effortlessbuilding:reach_upgrade2" diff --git a/src/main/resources/data/effortlessbuilding/recipes/reach_upgrade3.json b/src/main/resources/data/effortlessbuilding/recipes/reach_upgrade3.json index 65bd73a..39a42ae 100644 --- a/src/main/resources/data/effortlessbuilding/recipes/reach_upgrade3.json +++ b/src/main/resources/data/effortlessbuilding/recipes/reach_upgrade3.json @@ -1,20 +1,20 @@ { "type": "minecraft:crafting_shaped", "pattern": [ - " FE", - " /F", - "/ " + "x#x", + "#O#", + "x#x" ], "key": { - "E": { - "item": "minecraft:ender_eye" + "O": { + "item": "minecraft:nether_star" }, - "F": { - "item": "minecraft:feather" + "#": { + "item": "minecraft:diamond" }, - "/": { - "item": "minecraft:blaze_rod" - } + "x": { + "item": "minecraft:amethyst_shard" + } }, "result": { "item": "effortlessbuilding:reach_upgrade3"