From 80fdcbb486d2fd7dbf2241db200e569e358ccf2d Mon Sep 17 00:00:00 2001 From: P3pp3rF1y Date: Wed, 26 Jul 2023 21:20:47 +0200 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=F0=9F=90=9B=20Fix=20spawn=20egg=20c?= =?UTF-8?q?rafting=20recipe=20to=20be=20able=20to=20get=20spawn=20eggs=20f?= =?UTF-8?q?or=20modded=20entities=20properly?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + gradle.properties | 2 +- .../reliquary/crafting/FragmentRecipeHelper.java | 12 ++---------- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/build.gradle b/build.gradle index 8c8fba82..912d35da 100755 --- a/build.gradle +++ b/build.gradle @@ -110,6 +110,7 @@ dependencies { runtimeOnly fg.deobf("top.theillusivec4.curios:curios-forge:${curios_version}") compileOnly fg.deobf("curse.maven:jade-324717:${jade_cf_file_id}") runtimeOnly fg.deobf("curse.maven:jade-324717:${jade_cf_file_id}") + runtimeOnly fg.deobf("curse.maven:twilightforest-227639:4337394") // compileOnly fg.deobf("curse.maven:tinkers-74072:3576393") // runtimeOnly fg.deobf("curse.maven:tinkers-74072:3576393") diff --git a/gradle.properties b/gradle.properties index 8f5bd600..8da18326 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ org.gradle.jvmargs=-Xmx2048m minecraft_version=1.20.1 forge_version=47.1.42 -mod_version=2.0.34 +mod_version=2.0.35 jei_mc_version=1.20.1-forge jei_version=15.1.0.19 curios_version=5.2.0-beta.3+1.20.1 diff --git a/src/main/java/reliquary/crafting/FragmentRecipeHelper.java b/src/main/java/reliquary/crafting/FragmentRecipeHelper.java index 777c6cde..d56beb8e 100644 --- a/src/main/java/reliquary/crafting/FragmentRecipeHelper.java +++ b/src/main/java/reliquary/crafting/FragmentRecipeHelper.java @@ -1,18 +1,16 @@ package reliquary.crafting; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EntityType; import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.SpawnEggItem; -import net.minecraftforge.fml.util.ObfuscationReflectionHelper; +import net.minecraftforge.common.ForgeSpawnEggItem; import net.minecraftforge.registries.ForgeRegistries; import reliquary.init.ModItems; import reliquary.items.MobCharmFragmentItem; -import java.util.Map; import java.util.Optional; public class FragmentRecipeHelper { @@ -51,13 +49,7 @@ public static Optional getRegistryName(CraftingContainer inv) { } public static ItemStack getSpawnEggStack(String regName) { - Map, SpawnEggItem> spawnEggs = ObfuscationReflectionHelper.getPrivateValue(SpawnEggItem.class, null, "f_43201_"); - - if (spawnEggs == null) { - return new ItemStack(FALL_BACK_SPAWN_EGG); - } - - SpawnEggItem spawnEggItem = spawnEggs.get(ForgeRegistries.ENTITY_TYPES.getValue(new ResourceLocation(regName))); + SpawnEggItem spawnEggItem = ForgeSpawnEggItem.fromEntityType(ForgeRegistries.ENTITY_TYPES.getValue(new ResourceLocation(regName))); return new ItemStack(spawnEggItem == null ? FALL_BACK_SPAWN_EGG : spawnEggItem); } } From 7607a0bbdda7e821061081f60518731bab486dcb Mon Sep 17 00:00:00 2001 From: P3pp3rF1y Date: Wed, 26 Jul 2023 21:56:28 +0200 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=F0=9F=90=9B=20Fix=20void=20tear=20i?= =?UTF-8?q?n=20pedestal=20to=20accept=20items=20even=20when=20it=20already?= =?UTF-8?q?=20contains=20the=20default=20max=20stack=20size=20or=20more=20?= =?UTF-8?q?up=20to=20its=20max=20int=20size=20limit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle.properties | 2 +- .../blocks/tile/PedestalBlockEntity.java | 98 +++++------------- .../reliquary/util/CombinedItemHandler.java | 99 +++++++++++++++++++ 3 files changed, 123 insertions(+), 76 deletions(-) create mode 100644 src/main/java/reliquary/util/CombinedItemHandler.java diff --git a/gradle.properties b/gradle.properties index 8da18326..b8044258 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ org.gradle.jvmargs=-Xmx2048m minecraft_version=1.20.1 forge_version=47.1.42 -mod_version=2.0.35 +mod_version=2.0.36 jei_mc_version=1.20.1-forge jei_version=15.1.0.19 curios_version=5.2.0-beta.3+1.20.1 diff --git a/src/main/java/reliquary/blocks/tile/PedestalBlockEntity.java b/src/main/java/reliquary/blocks/tile/PedestalBlockEntity.java index f87ee356..aee359ee 100644 --- a/src/main/java/reliquary/blocks/tile/PedestalBlockEntity.java +++ b/src/main/java/reliquary/blocks/tile/PedestalBlockEntity.java @@ -18,7 +18,6 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.ItemHandlerHelper; import reliquary.api.IPedestal; import reliquary.api.IPedestalActionItem; import reliquary.api.IPedestalRedstoneItem; @@ -27,6 +26,7 @@ import reliquary.init.ModBlocks; import reliquary.items.util.FilteredItemStackHandler; import reliquary.pedestal.PedestalRegistry; +import reliquary.util.CombinedItemHandler; import reliquary.util.InventoryHelper; import reliquary.util.WorldHelper; import reliquary.util.XRFakePlayerFactory; @@ -37,7 +37,6 @@ import java.util.List; import java.util.Optional; import java.util.function.Consumer; -import java.util.function.Function; public class PedestalBlockEntity extends PassivePedestalBlockEntity implements IPedestal { private boolean tickable = false; @@ -48,6 +47,8 @@ public class PedestalBlockEntity extends PassivePedestalBlockEntity implements I private IPedestalRedstoneItem redstoneItem = null; @Nullable private IItemHandler itemHandler = null; + @Nullable + private LazyOptional combinedHandler = null; private ItemStack fluidContainer = ItemStack.EMPTY; private boolean switchedOn = false; private final List onSwitches = new ArrayList<>(); @@ -128,6 +129,13 @@ public LazyOptional getCapability(Capability cap, @Nullable Direction pedestalFluidHandler = new PedestalFluidHandler(this); } return ForgeCapabilities.FLUID_HANDLER.orEmpty(cap, LazyOptional.of(() -> pedestalFluidHandler)); + } else if (cap == ForgeCapabilities.ITEM_HANDLER && itemHandler != null) { + if (combinedHandler == null) { + combinedHandler = LazyOptional.of(() -> super.getCapability(ForgeCapabilities.ITEM_HANDLER, side) + .map(superHandler -> (IItemHandler) new CombinedItemHandler(superHandler, itemHandler)) + .orElse(itemHandler)); + } + return combinedHandler.cast(); } return super.getCapability(cap, side); @@ -185,6 +193,10 @@ private void resetSpecialItems() { actionItem = null; redstoneItem = null; itemHandler = null; + if (combinedHandler != null) { + combinedHandler.invalidate(); + } + combinedHandler = null; } public void serverTick(Level level) { @@ -304,6 +316,13 @@ public void setItem(ItemStack stack) { updateItemsAndBlock(); } + @Override + public void setItem(int slot, ItemStack stack) { + if (slot == 0) { + setItem(stack); + } + } + @Override public List getPedestalsInRange(Level level, int range) { return PedestalRegistry.getPositionsInRange(level.dimension().registry(), worldPosition, range); @@ -395,41 +414,13 @@ public void removeAndSpawnItem(Level level) { super.removeAndSpawnItem(level); } - @Override - public int getContainerSize() { - return applyToItemHandler(IItemHandler::getSlots).orElse(0) + 1; - } - - private Optional applyToItemHandler(Function function) { - return itemHandler != null ? Optional.of(function.apply(itemHandler)) : Optional.empty(); - } - - private void runOnItemHandler(Consumer consumer) { - if (itemHandler != null) { - consumer.accept(itemHandler); - } - } - - @Override - public ItemStack getItem(int slot) { - if (slot == 0) { - return item; - } - - return applyToItemHandler(ih -> ih.getStackInSlot(getInternalItemHandlerSlot(slot))).orElse(ItemStack.EMPTY); - } - - private int getInternalItemHandlerSlot(int slot) { - return slot - 1; - } - @Override public ItemStack removeItem(int slot, int count) { if (slot == 0) { return decrStack(count); } - return applyToItemHandler(ih -> ih.extractItem(getInternalItemHandlerSlot(slot), count, false)).orElse(ItemStack.EMPTY); + return ItemStack.EMPTY; } private ItemStack decrStack(int count) { @@ -478,50 +469,7 @@ public ItemStack removeItemNoUpdate(int slot) { return stack; } - return applyToItemHandler(ih -> { - int s = getInternalItemHandlerSlot(slot); - ItemStack stack = ih.getStackInSlot(s); - return ih.extractItem(s, stack.getCount(), false); - }).orElse(ItemStack.EMPTY); - } - - @Override - public void setItem(int slot, ItemStack stack) { - if (slot == 0) { - setItem(stack); - return; - } - - runOnItemHandler(ih -> setItemHandlerSlotContents(slot, stack, ih)); - } - - private void setItemHandlerSlotContents(int slot, ItemStack stack, IItemHandler ih) { - int adjustedSlot = getInternalItemHandlerSlot(slot); - ItemStack stackInSlot = ih.getStackInSlot(adjustedSlot); - - if (!stackInSlot.isEmpty() && !stack.isEmpty() && !ItemHandlerHelper.canItemStacksStack(stack, stackInSlot)) { - return; - } - - if (!stackInSlot.isEmpty() && (stack.isEmpty() || stack.getCount() < stackInSlot.getCount())) { - int amount = stackInSlot.getCount() - (stack.isEmpty() ? 0 : stack.getCount()); - ih.extractItem(adjustedSlot, amount, false); - } else if (!stack.isEmpty() && (stackInSlot.isEmpty() || stack.getCount() > stackInSlot.getCount())) { - stack.shrink(stackInSlot.isEmpty() ? 0 : stackInSlot.getCount()); - ih.insertItem(adjustedSlot, stack, false); - } - } - - @Override - public boolean canPlaceItem(int index, ItemStack stack) { - if (super.canPlaceItem(index, stack)) { - return true; - } - - return applyToItemHandler(ih -> { - ItemStack returnedStack = ih.insertItem(getInternalItemHandlerSlot(index), stack, true); - return returnedStack.isEmpty() || returnedStack.getCount() != stack.getCount(); - }).orElse(false); + return ItemStack.EMPTY; } public void toggleSwitch(Level level) { diff --git a/src/main/java/reliquary/util/CombinedItemHandler.java b/src/main/java/reliquary/util/CombinedItemHandler.java new file mode 100644 index 00000000..18154deb --- /dev/null +++ b/src/main/java/reliquary/util/CombinedItemHandler.java @@ -0,0 +1,99 @@ +package reliquary.util; + +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.wrapper.EmptyHandler; +import org.jetbrains.annotations.NotNull; + +// combines multiple IItemHandler into one interface +public class CombinedItemHandler implements IItemHandler { + + protected final IItemHandler[] itemHandler; // the handlers + protected final int[] baseIndex; // index-offsets of the different handlers + protected final int slotCount; // number of total slots + + public CombinedItemHandler(IItemHandler... itemHandler) { + this.itemHandler = itemHandler; + baseIndex = new int[itemHandler.length]; + int index = 0; + for (int i = 0; i < itemHandler.length; i++) { + index += itemHandler[i].getSlots(); + baseIndex[i] = index; + } + slotCount = index; + } + + // returns the handler index for the slot + protected int getIndexForSlot(int slot) { + if (slot < 0) {return -1;} + + for (int i = 0; i < baseIndex.length; i++) { + if (slot - baseIndex[i] < 0) { + return i; + } + } + return -1; + } + + protected IItemHandler getHandlerFromIndex(int index) { + if (index < 0 || index >= itemHandler.length) { + return EmptyHandler.INSTANCE; + } + return itemHandler[index]; + } + + protected int getSlotFromIndex(int slot, int index) { + if (index <= 0 || index >= baseIndex.length) { + return slot; + } + return slot - baseIndex[index - 1]; + } + + @Override + public int getSlots() { + return slotCount; + } + + @Override + @NotNull + public ItemStack getStackInSlot(int slot) { + int index = getIndexForSlot(slot); + IItemHandler handler = getHandlerFromIndex(index); + slot = getSlotFromIndex(slot, index); + return handler.getStackInSlot(slot); + } + + @Override + @NotNull + public ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { + int index = getIndexForSlot(slot); + IItemHandler handler = getHandlerFromIndex(index); + slot = getSlotFromIndex(slot, index); + return handler.insertItem(slot, stack, simulate); + } + + @Override + @NotNull + public ItemStack extractItem(int slot, int amount, boolean simulate) { + int index = getIndexForSlot(slot); + IItemHandler handler = getHandlerFromIndex(index); + slot = getSlotFromIndex(slot, index); + return handler.extractItem(slot, amount, simulate); + } + + @Override + public int getSlotLimit(int slot) { + int index = getIndexForSlot(slot); + IItemHandler handler = getHandlerFromIndex(index); + int localSlot = getSlotFromIndex(slot, index); + return handler.getSlotLimit(localSlot); + } + + @Override + public boolean isItemValid(int slot, @NotNull ItemStack stack) { + int index = getIndexForSlot(slot); + IItemHandler handler = getHandlerFromIndex(index); + int localSlot = getSlotFromIndex(slot, index); + return handler.isItemValid(localSlot, stack); + } +}