From 2d7389aa03f9a6bad7b5e7b81456acb5f9d358e9 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sat, 20 Jul 2024 18:39:18 +0900 Subject: Check slots before modification --- src/main/java/me/shedaniel/rei/server/DumpHandler.java | 2 +- .../java/me/shedaniel/rei/server/GridCleanHandler.java | 4 ++++ .../java/me/shedaniel/rei/server/InputSlotCrafter.java | 15 ++++++++++++++- .../java/me/shedaniel/rei/server/SlotStackAccessor.java | 11 +++++++++++ src/main/java/me/shedaniel/rei/server/StackAccessor.java | 9 +++++++++ 5 files changed, 39 insertions(+), 2 deletions(-) (limited to 'src/main/java/me') diff --git a/src/main/java/me/shedaniel/rei/server/DumpHandler.java b/src/main/java/me/shedaniel/rei/server/DumpHandler.java index c5e04e12b..8f7a2d94d 100644 --- a/src/main/java/me/shedaniel/rei/server/DumpHandler.java +++ b/src/main/java/me/shedaniel/rei/server/DumpHandler.java @@ -34,7 +34,7 @@ public interface DumpHandler { static StackAccessor getOccupiedSlotWithRoomForStack(ItemStack stack, List inventoryStacks) { for (StackAccessor inventoryStack : inventoryStacks) { - if (canStackAddMore(inventoryStack.getItemStack(), stack)) { + if (canStackAddMore(inventoryStack.getItemStack(), stack) && inventoryStack.canPlace(stack)) { return inventoryStack; } } diff --git a/src/main/java/me/shedaniel/rei/server/GridCleanHandler.java b/src/main/java/me/shedaniel/rei/server/GridCleanHandler.java index 557675533..4eeb95b79 100644 --- a/src/main/java/me/shedaniel/rei/server/GridCleanHandler.java +++ b/src/main/java/me/shedaniel/rei/server/GridCleanHandler.java @@ -38,6 +38,10 @@ public interface GridCleanHandler { DumpHandler dumpHandler = context.getContainerInfo().getDumpHandler(); ItemStack stackToReturn = stackAccessor.getItemStack(); if (!stackToReturn.isEmpty()) { + if (!stackAccessor.allowModification(context.getPlayerEntity())) { + error("rei.rei.no.slot.in.inv"); + } + for (; stackToReturn.getCount() > 0; stackAccessor.takeStack(1)) { ItemStack stackToInsert = stackToReturn.copy(); stackToInsert.setCount(1); diff --git a/src/main/java/me/shedaniel/rei/server/InputSlotCrafter.java b/src/main/java/me/shedaniel/rei/server/InputSlotCrafter.java index 4447256e2..ed7ffa2d9 100644 --- a/src/main/java/me/shedaniel/rei/server/InputSlotCrafter.java +++ b/src/main/java/me/shedaniel/rei/server/InputSlotCrafter.java @@ -106,6 +106,10 @@ public class InputSlotCrafter implements RecipeGridAligner< } takenStack.setCount(1); + if (!slot.canPlace(takenStack)) { + return; + } + if (slot.getItemStack().isEmpty()) { slot.setItemStack(takenStack); } else { @@ -158,13 +162,22 @@ public class InputSlotCrafter implements RecipeGridAligner< } public int method_7371(ItemStack itemStack) { + boolean rejectedModification = false; for (int i = 0; i < inventoryStacks.size(); i++) { ItemStack itemStack1 = this.inventoryStacks.get(i).getItemStack(); if (!itemStack1.isEmpty() && areItemsEqual(itemStack, itemStack1) && !itemStack1.isDamaged() && !itemStack1.hasEnchantments() && !itemStack1.hasCustomName()) { - return i; + if (!this.inventoryStacks.get(i).allowModification(player)) { + rejectedModification = true; + } else { + return i; + } } } + if (rejectedModification) { + throw new IllegalStateException("Unable to take item from inventory due to slot not allowing modification! Item requested: " + itemStack); + } + return -1; } diff --git a/src/main/java/me/shedaniel/rei/server/SlotStackAccessor.java b/src/main/java/me/shedaniel/rei/server/SlotStackAccessor.java index 46b4d7b8b..f0d0e361e 100644 --- a/src/main/java/me/shedaniel/rei/server/SlotStackAccessor.java +++ b/src/main/java/me/shedaniel/rei/server/SlotStackAccessor.java @@ -23,6 +23,7 @@ package me.shedaniel.rei.server; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.screen.slot.Slot; @@ -47,4 +48,14 @@ public class SlotStackAccessor implements StackAccessor { public ItemStack takeStack(int amount) { return slot.takeStack(amount); } + + @Override + public boolean allowModification(PlayerEntity player) { + return slot.canTakeItems(player); + } + + @Override + public boolean canPlace(ItemStack stack) { + return slot.canInsert(stack); + } } diff --git a/src/main/java/me/shedaniel/rei/server/StackAccessor.java b/src/main/java/me/shedaniel/rei/server/StackAccessor.java index 65b722a9e..278a75baa 100644 --- a/src/main/java/me/shedaniel/rei/server/StackAccessor.java +++ b/src/main/java/me/shedaniel/rei/server/StackAccessor.java @@ -23,6 +23,7 @@ package me.shedaniel.rei.server; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; public interface StackAccessor { @@ -31,4 +32,12 @@ public interface StackAccessor { void setItemStack(ItemStack stack); ItemStack takeStack(int amount); + + default boolean allowModification(PlayerEntity player) { + return true; + } + + default boolean canPlace(ItemStack stack) { + return true; + } } -- cgit