diff options
author | NotNite <hi@notnite.com> | 2024-02-15 22:09:15 -0500 |
---|---|---|
committer | NotNite <hi@notnite.com> | 2024-02-15 22:09:15 -0500 |
commit | 40c0e869ad1edd5524b409d50d8733003c4d0c31 (patch) | |
tree | 74af1fded8b56fad2a6243af12d2d676732b1002 /src | |
parent | 4cbe83614ad0d035c1d0ce11385335cec63a0ed8 (diff) | |
download | gloppers-40c0e869ad1edd5524b409d50d8733003c4d0c31.tar.gz gloppers-40c0e869ad1edd5524b409d50d8733003c4d0c31.tar.bz2 gloppers-40c0e869ad1edd5524b409d50d8733003c4d0c31.zip |
1.0.2
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/com/notnite/gloppers/mixin/HopperBlockEntityMixin.java | 57 | ||||
-rw-r--r-- | src/main/kotlin/com/notnite/gloppers/Gloppers.kt | 38 | ||||
-rw-r--r-- | src/main/resources/fabric.mod.json | 4 |
3 files changed, 53 insertions, 46 deletions
diff --git a/src/main/java/com/notnite/gloppers/mixin/HopperBlockEntityMixin.java b/src/main/java/com/notnite/gloppers/mixin/HopperBlockEntityMixin.java index ce463a3..7637cc8 100644 --- a/src/main/java/com/notnite/gloppers/mixin/HopperBlockEntityMixin.java +++ b/src/main/java/com/notnite/gloppers/mixin/HopperBlockEntityMixin.java @@ -1,21 +1,57 @@ package com.notnite.gloppers.mixin; -import com.notnite.gloppers.Gloppers; import net.minecraft.block.entity.Hopper; import net.minecraft.block.entity.HopperBlockEntity; +import net.minecraft.entity.ItemEntity; import net.minecraft.inventory.Inventory; import net.minecraft.item.ItemStack; +import net.minecraft.util.collection.DefaultedList; import net.minecraft.util.math.Direction; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(HopperBlockEntity.class) -public class HopperBlockEntityMixin { +public abstract class HopperBlockEntityMixin { + @Unique private static int dirtySlotState = 0; + @Shadow + private DefaultedList<ItemStack> inventory; + + @Unique + private static boolean canTransfer(Inventory to, ItemStack stack) { + try { + if (to instanceof HopperBlockEntity) { + var hopperName = ((HopperBlockEntity) to).getName().copyContentOnly().getString(); + var itemRegistryEntry = stack.getRegistryEntry().getKey(); + if (itemRegistryEntry.isEmpty()) return false; + var itemName = itemRegistryEntry.get().getValue().getPath(); + + if (hopperName.startsWith("!")) { + var globs = hopperName.substring(1).split(","); + for (var glob : globs) { + var strippedGlob = glob.replaceAll("[^a-zA-Z0-9_*?]", ""); + var regex = strippedGlob.replace(".", "\\.").replace("*", ".*").replace("?", "."); + if (itemName.matches(regex)) return true; + } + + // No globs matched, so don't transfer + return false; + } + } + } catch (Exception e) { + // ignored + } + + // Doesn't have a glob (or exception), so transfer + return true; + } + // We can't decrement the item stack before it gets passed to transfer, because we may not be allowed to transfer, // eating an item. We know removeStack will get called immediately before transfer, so while it's messy, we can use // a static variable to keep track of what slot we're removing from. @@ -38,7 +74,7 @@ public class HopperBlockEntityMixin { private static ItemStack insert$gloppersTransfer( Inventory from, Inventory to, ItemStack stack, Direction side ) { - if (!Gloppers.INSTANCE.canTransfer(to, stack)) { + if (!canTransfer(to, stack)) { // The return value of this is only used to check if it's empty, and if so, returns that it succeeded. // We can just return the item stack we were given, as we didn't remove from it. return stack; @@ -55,8 +91,19 @@ public class HopperBlockEntityMixin { at = @At("HEAD"), cancellable = true ) - private static void extract(Hopper hopper, Inventory inventory, int slot, Direction side, CallbackInfoReturnable<Boolean> cir) { + private static void extract(Hopper hopper, Inventory inventory, int slot, Direction + side, CallbackInfoReturnable<Boolean> cir) { var item = inventory.getStack(slot); - if (!Gloppers.INSTANCE.canTransfer(hopper, item)) cir.setReturnValue(false); + if (!canTransfer(hopper, item)) cir.setReturnValue(false); + } + + // This handles the case where an item entity is dropped onto the hopper from above. + @Inject( + method = "extract(Lnet/minecraft/inventory/Inventory;Lnet/minecraft/entity/ItemEntity;)Z", + at = @At("HEAD"), + cancellable = true + ) + private static void extract(Inventory inventory, ItemEntity itemEntity, CallbackInfoReturnable<Boolean> cir) { + if (!canTransfer(inventory, itemEntity.getStack())) cir.setReturnValue(false); } } diff --git a/src/main/kotlin/com/notnite/gloppers/Gloppers.kt b/src/main/kotlin/com/notnite/gloppers/Gloppers.kt deleted file mode 100644 index 95596c0..0000000 --- a/src/main/kotlin/com/notnite/gloppers/Gloppers.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.notnite.gloppers - -import net.minecraft.block.entity.HopperBlockEntity -import net.minecraft.inventory.Inventory -import net.minecraft.item.ItemStack - -object Gloppers { - private fun matchesGlob(glob: String, str: String): Boolean { - val regex = glob - .replace(".", "\\.") - .replace("*", ".*") - .replace("?", ".") - return str.matches(regex.toRegex()) - } - - fun canTransfer(to: Inventory, stack: ItemStack): Boolean { - if (to is HopperBlockEntity) { - val hopperName = to.name.copyContentOnly().string - val itemName = stack.registryEntry.key.get().value.path - - if (hopperName.startsWith("!")) { - val globs = hopperName.substring(1).split(",") - for (glob in globs) { - if (matchesGlob(glob, itemName)) { - // Glob matched, transfer - return true - } - } - - // No globs matched, so don't transfer - return false - } - } - - // Doesn't have a glob, so transfer - return true - } -} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index eebc2a7..b75428f 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -19,8 +19,6 @@ "depends": { "fabricloader": ">=0.14.19", "minecraft": "~1.20", - "java": ">=17", - "fabric-api": "*", - "fabric-language-kotlin": ">=1.8.22" + "java": ">=17" } } |