From 05f3ebcb3b6a62f56ab420402e604a222de4a790 Mon Sep 17 00:00:00 2001 From: erocs Date: Sun, 8 Sep 2013 12:06:15 -0700 Subject: [PATCH] Hopper Customisations Allows editing hopper cooldowns and amount transferred per tick. diff --git a/src/main/java/net/minecraft/world/level/block/entity/TileEntityHopper.java b/src/main/java/net/minecraft/world/level/block/entity/TileEntityHopper.java index d2e67cfa4..4c29bf524 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/TileEntityHopper.java +++ b/src/main/java/net/minecraft/world/level/block/entity/TileEntityHopper.java @@ -142,9 +142,14 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper { tileentityhopper.tickedGameTime = world.getTime(); if (!tileentityhopper.j()) { tileentityhopper.setCooldown(0); - a(world, blockposition, iblockdata, tileentityhopper, () -> { + // Spigot start + boolean result = a(world, blockposition, iblockdata, tileentityhopper, () -> { return a(world, (IHopper) tileentityhopper); }); + if (!result && tileentityhopper.level.spigotConfig.hopperCheck > 1) { + tileentityhopper.setCooldown(tileentityhopper.level.spigotConfig.hopperCheck); + } + // Spigot end } } @@ -165,7 +170,7 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper { } if (flag) { - tileentityhopper.setCooldown(8); + tileentityhopper.setCooldown(world.spigotConfig.hopperTransfer); // Spigot a(world, blockposition, iblockdata); return true; } @@ -208,7 +213,7 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper { // ItemStack itemstack1 = addItem(iinventory, iinventory1, iinventory.splitStack(i, 1), enumdirection); // CraftBukkit start - Call event when pushing items into other inventories - CraftItemStack oitemstack = CraftItemStack.asCraftMirror(iinventory.splitStack(i, 1)); + CraftItemStack oitemstack = CraftItemStack.asCraftMirror(iinventory.splitStack(i, world.spigotConfig.hopperAmount)); // Spigot Inventory destinationInventory; // Have to special case large chests as they work oddly @@ -222,9 +227,10 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper { world.getCraftServer().getPluginManager().callEvent(event); if (event.isCancelled()) { hopper.setItem(i, itemstack); - hopper.setCooldown(8); // Delay hopper checks + hopper.setCooldown(world.spigotConfig.hopperTransfer); // Spigot return false; } + int origCount = event.getItem().getAmount(); // Spigot ItemStack itemstack1 = addItem(iinventory, iinventory1, CraftItemStack.asNMSCopy(event.getItem()), enumdirection); // CraftBukkit end @@ -233,6 +239,7 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper { return true; } + itemstack.subtract(origCount - itemstack1.getCount()); // Spigot iinventory.setItem(i, itemstack); } } @@ -267,7 +274,7 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper { EnumDirection enumdirection = EnumDirection.DOWN; return c(iinventory, enumdirection) ? false : a(iinventory, enumdirection).anyMatch((i) -> { - return a(ihopper, iinventory, i, enumdirection); + return a(ihopper, iinventory, i, enumdirection, world); // Spigot }); } else { Iterator iterator = b(world, ihopper).iterator(); @@ -286,14 +293,14 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper { } } - private static boolean a(IHopper ihopper, IInventory iinventory, int i, EnumDirection enumdirection) { + private static boolean a(IHopper ihopper, IInventory iinventory, int i, EnumDirection enumdirection, World world) { // Spigot ItemStack itemstack = iinventory.getItem(i); if (!itemstack.isEmpty() && b(iinventory, itemstack, i, enumdirection)) { ItemStack itemstack1 = itemstack.cloneItemStack(); // ItemStack itemstack2 = addItem(iinventory, ihopper, iinventory.splitStack(i, 1), (EnumDirection) null); // CraftBukkit start - Call event on collection of items from inventories into the hopper - CraftItemStack oitemstack = CraftItemStack.asCraftMirror(iinventory.splitStack(i, 1)); + CraftItemStack oitemstack = CraftItemStack.asCraftMirror(iinventory.splitStack(i, world.spigotConfig.hopperAmount)); // Spigot Inventory sourceInventory; // Have to special case large chests as they work oddly @@ -310,13 +317,13 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper { iinventory.setItem(i, itemstack1); if (ihopper instanceof TileEntityHopper) { - ((TileEntityHopper) ihopper).setCooldown(8); // Delay hopper checks + ((TileEntityHopper) ihopper).setCooldown(world.spigotConfig.hopperTransfer); // Spigot } else if (ihopper instanceof EntityMinecartHopper) { - ((EntityMinecartHopper) ihopper).setCooldown(4); // Delay hopper minecart checks + ((EntityMinecartHopper) ihopper).setCooldown(world.spigotConfig.hopperTransfer / 2); // Spigot } - return false; } + int origCount = event.getItem().getAmount(); // Spigot ItemStack itemstack2 = addItem(iinventory, ihopper, CraftItemStack.asNMSCopy(event.getItem()), null); // CraftBukkit end @@ -325,6 +332,7 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper { return true; } + itemstack1.subtract(origCount - itemstack2.getCount()); // Spigot iinventory.setItem(i, itemstack1); } @@ -388,6 +396,11 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper { boolean flag1 = iinventory1.isEmpty(); if (itemstack1.isEmpty()) { + // Spigot start - SPIGOT-6693, InventorySubcontainer#setItem + if (!itemstack.isEmpty() && itemstack.getCount() > iinventory1.getMaxStackSize()) { + itemstack = itemstack.cloneAndSubtract(iinventory1.getMaxStackSize()); + } + // Spigot end iinventory1.setItem(i, itemstack); itemstack = ItemStack.EMPTY; flag = true; @@ -415,7 +428,7 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper { } } - tileentityhopper.setCooldown(8 - b0); + tileentityhopper.setCooldown(tileentityhopper.level.spigotConfig.hopperTransfer - b0); // Spigot } } diff --git a/src/main/java/org/spigotmc/SpigotWorldConfig.java b/src/main/java/org/spigotmc/SpigotWorldConfig.java index e432ddc50..4d50f803b 100644 --- a/src/main/java/org/spigotmc/SpigotWorldConfig.java +++ b/src/main/java/org/spigotmc/SpigotWorldConfig.java @@ -205,4 +205,20 @@ public class SpigotWorldConfig otherTrackingRange = getInt( "entity-tracking-range.other", otherTrackingRange ); log( "Entity Tracking Range: Pl " + playerTrackingRange + " / An " + animalTrackingRange + " / Mo " + monsterTrackingRange + " / Mi " + miscTrackingRange + " / Other " + otherTrackingRange ); } + + public int hopperTransfer; + public int hopperCheck; + public int hopperAmount; + private void hoppers() + { + // Set the tick delay between hopper item movements + hopperTransfer = getInt( "ticks-per.hopper-transfer", 8 ); + if ( SpigotConfig.version < 11 ) + { + set( "ticks-per.hopper-check", 1 ); + } + hopperCheck = getInt( "ticks-per.hopper-check", 1 ); + hopperAmount = getInt( "hopper-amount", 1 ); + log( "Hopper Transfer: " + hopperTransfer + " Hopper Check: " + hopperCheck + " Hopper Amount: " + hopperAmount ); + } } -- 2.25.1