From f9f880f249c118eab825ed2c539c1fbe12c9eda2 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 11 Jan 2025 17:19:27 -0800 Subject: [PATCH] Sneak to bulk process composter --- ...0137-Sneak-to-bulk-process-composter.patch | 104 ------------------ .../level/ServerPlayerGameMode.java.patch | 11 ++ .../level/block/ComposterBlock.java.patch | 66 +++++++++++ .../purpurmc/purpur/PurpurWorldConfig.java | 5 + 4 files changed, 82 insertions(+), 104 deletions(-) delete mode 100644 patches/server/0137-Sneak-to-bulk-process-composter.patch create mode 100644 purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayerGameMode.java.patch create mode 100644 purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/ComposterBlock.java.patch diff --git a/patches/server/0137-Sneak-to-bulk-process-composter.patch b/patches/server/0137-Sneak-to-bulk-process-composter.patch deleted file mode 100644 index 48d0573ec..000000000 --- a/patches/server/0137-Sneak-to-bulk-process-composter.patch +++ /dev/null @@ -1,104 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Sun, 7 May 2023 22:26:59 -0700 -Subject: [PATCH] Sneak to bulk process composter - - -diff --git a/net/minecraft/server/level/ServerPlayerGameMode.java b/net/minecraft/server/level/ServerPlayerGameMode.java -index a96f859a5d0c6ec692d4627a69f3c9ee49199dbc..adecb4915a0428b71e8c1e59b11f94dd1776697d 100644 ---- a/net/minecraft/server/level/ServerPlayerGameMode.java -+++ b/net/minecraft/server/level/ServerPlayerGameMode.java -@@ -583,7 +583,7 @@ public class ServerPlayerGameMode { - ItemStack itemstack1 = stack.copy(); - InteractionResult enuminteractionresult; - -- if (!flag1) { -+ if (!flag1 || (player.level().purpurConfig.composterBulkProcess && iblockdata.is(Blocks.COMPOSTER))) { // Purpur - InteractionResult enuminteractionresult1 = iblockdata.useItemOn(player.getItemInHand(hand), world, player, hand, hitResult); - - if (enuminteractionresult1.consumesAction()) { -diff --git a/net/minecraft/world/level/block/ComposterBlock.java b/net/minecraft/world/level/block/ComposterBlock.java -index 9264ba58188a7a682eeb8eb449b89ff8e60f91d6..809a820dd8eec3e48dd3263335c62fbea4cd4f2c 100644 ---- a/net/minecraft/world/level/block/ComposterBlock.java -+++ b/net/minecraft/world/level/block/ComposterBlock.java -@@ -243,18 +243,27 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { - int i = (Integer) state.getValue(ComposterBlock.LEVEL); - - if (i < 8 && ComposterBlock.COMPOSTABLES.containsKey(stack.getItem())) { -- if (i < 7 && !world.isClientSide) { -- BlockState iblockdata1 = ComposterBlock.addItem(player, state, world, pos, stack); -- // Paper start - handle cancelled events -- if (iblockdata1 == null) { -- return InteractionResult.PASS; -- } -- // Paper end -- -- world.levelEvent(1500, pos, state != iblockdata1 ? 1 : 0); -- player.awardStat(Stats.ITEM_USED.get(stack.getItem())); -- stack.consume(1, player); -+ // Purpur start - sneak to bulk process composter -+ BlockState newState = process(i, player, state, world, pos, stack); -+ if (newState == null) { -+ return InteractionResult.PASS; - } -+ if (world.purpurConfig.composterBulkProcess && player.isShiftKeyDown() && newState != state) { -+ BlockState oldState; -+ int oldCount, newCount, oldLevel, newLevel; -+ do { -+ oldState = newState; -+ oldCount = stack.getCount(); -+ oldLevel = oldState.getValue(ComposterBlock.LEVEL); -+ newState = process(oldLevel, player, oldState, world, pos, stack); -+ if (newState == null) { -+ return InteractionResult.PASS; -+ } -+ newCount = stack.getCount(); -+ newLevel = newState.getValue(ComposterBlock.LEVEL); -+ } while (newCount > 0 && (newCount != oldCount || newLevel != oldLevel || newState != oldState)); -+ } -+ // Purpur end - - return InteractionResult.SUCCESS; - } else { -@@ -262,6 +271,25 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { - } - } - -+ // Purpur start - sneak to bulk process composter -+ private static @Nullable BlockState process(int level, Player player, BlockState state, Level world, BlockPos pos, ItemStack stack) { -+ if (level < 7 && !world.isClientSide) { -+ BlockState iblockdata1 = ComposterBlock.addItem(player, state, world, pos, stack); -+ // Paper start - handle cancelled events -+ if (iblockdata1 == null) { -+ return null; -+ } -+ // Paper end -+ -+ world.levelEvent(1500, pos, state != iblockdata1 ? 1 : 0); -+ player.awardStat(Stats.ITEM_USED.get(stack.getItem())); -+ stack.consume(1, player); -+ return iblockdata1; -+ } -+ return state; -+ } -+ // Purpur end -+ - @Override - protected InteractionResult useWithoutItem(BlockState state, Level world, BlockPos pos, Player player, BlockHitResult hit) { - int i = (Integer) state.getValue(ComposterBlock.LEVEL); -diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 99a1c69938be124ad6fd1ae9a96024cc9fafd62c..09fa9a18dc1bb6a3df80cb2237dc0d55affc0453 100644 ---- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -441,6 +441,11 @@ public class PurpurWorldConfig { - chestOpenWithBlockOnTop = getBoolean("blocks.chest.open-with-solid-block-on-top", chestOpenWithBlockOnTop); - } - -+ public boolean composterBulkProcess = false; -+ private void composterSettings() { -+ composterBulkProcess = getBoolean("blocks.composter.sneak-to-bulk-process", composterBulkProcess); -+ } -+ - public boolean dispenserApplyCursedArmor = true; - public boolean dispenserPlaceAnvils = false; - private void dispenserSettings() { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayerGameMode.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayerGameMode.java.patch new file mode 100644 index 000000000..5c8937e1a --- /dev/null +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayerGameMode.java.patch @@ -0,0 +1,11 @@ +--- a/net/minecraft/server/level/ServerPlayerGameMode.java ++++ b/net/minecraft/server/level/ServerPlayerGameMode.java +@@ -506,7 +_,7 @@ + boolean flag = !player.getMainHandItem().isEmpty() || !player.getOffhandItem().isEmpty(); + boolean flag1 = player.isSecondaryUseActive() && flag; + ItemStack itemStack = stack.copy(); +- if (!flag1) { ++ if (!flag1 || (player.level().purpurConfig.composterBulkProcess && blockState.is(net.minecraft.world.level.block.Blocks.COMPOSTER))) { // Purpur - Sneak to bulk process composter + InteractionResult interactionResult = blockState.useItemOn(player.getItemInHand(hand), level, player, hand, hitResult); + if (interactionResult.consumesAction()) { + CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger(player, blockPos, itemStack); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/ComposterBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/ComposterBlock.java.patch new file mode 100644 index 000000000..2be94eb48 --- /dev/null +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/ComposterBlock.java.patch @@ -0,0 +1,66 @@ +--- a/net/minecraft/world/level/block/ComposterBlock.java ++++ b/net/minecraft/world/level/block/ComposterBlock.java +@@ -241,23 +_,52 @@ + ) { + int levelValue = state.getValue(LEVEL); + if (levelValue < 8 && COMPOSTABLES.containsKey(stack.getItem())) { +- if (levelValue < 7 && !level.isClientSide) { +- BlockState blockState = addItem(player, state, level, pos, stack); +- // Paper start - handle cancelled events +- if (blockState == null) { +- return InteractionResult.PASS; +- } +- // Paper end +- level.levelEvent(1500, pos, state != blockState ? 1 : 0); +- player.awardStat(Stats.ITEM_USED.get(stack.getItem())); +- stack.consume(1, player); +- } ++ // Purpur start - sneak to bulk process composter ++ BlockState newState = process(levelValue, player, state, level, pos, stack); ++ if (newState == null) { ++ return InteractionResult.PASS; ++ } ++ if (level.purpurConfig.composterBulkProcess && player.isShiftKeyDown() && newState != state) { ++ BlockState oldState; ++ int oldCount, newCount, oldLevel, newLevel; ++ do { ++ oldState = newState; ++ oldCount = stack.getCount(); ++ oldLevel = oldState.getValue(ComposterBlock.LEVEL); ++ newState = process(oldLevel, player, oldState, level, pos, stack); ++ if (newState == null) { ++ return InteractionResult.PASS; ++ } ++ newCount = stack.getCount(); ++ newLevel = newState.getValue(ComposterBlock.LEVEL); ++ } while (newCount > 0 && (newCount != oldCount || newLevel != oldLevel || newState != oldState)); ++ } ++ // Purpur end - Sneak to bulk process composter + + return InteractionResult.SUCCESS; + } else { + return super.useItemOn(stack, state, level, pos, player, hand, hitResult); + } + } ++ ++ // Purpur start - sneak to bulk process composter ++ private static @Nullable BlockState process(int levelValue, Player player, BlockState state, Level level, BlockPos pos, ItemStack stack) { ++ if (levelValue < 7 && !level.isClientSide) { ++ BlockState iblockdata1 = ComposterBlock.addItem(player, state, level, pos, stack); ++ // Paper start - handle cancelled events ++ if (iblockdata1 == null) { ++ return null; ++ } ++ // Paper end ++ ++ level.levelEvent(1500, pos, state != iblockdata1 ? 1 : 0); ++ player.awardStat(Stats.ITEM_USED.get(stack.getItem())); ++ stack.consume(1, player); ++ return iblockdata1; ++ } ++ return state; ++ } ++ // Purpur end - Sneak to bulk process composter + + @Override + protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) { diff --git a/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java index 8cea3712e..2b9f37456 100644 --- a/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -433,6 +433,11 @@ public class PurpurWorldConfig { chestOpenWithBlockOnTop = getBoolean("blocks.chest.open-with-solid-block-on-top", chestOpenWithBlockOnTop); } + public boolean composterBulkProcess = false; + private void composterSettings() { + composterBulkProcess = getBoolean("blocks.composter.sneak-to-bulk-process", composterBulkProcess); + } + public boolean dispenserApplyCursedArmor = true; public boolean dispenserPlaceAnvils = false; private void dispenserSettings() {