Files
Purpur/patches/server/0143-Sneak-to-bulk-process-composter.patch
granny 4f12f5d3d0 Updated Upstream (Paper)
Upstream has released updates that appear to apply and compile correctly

Paper Changes:
PaperMC/Paper@4d111a3 Un-experimentalize Entity TP APIs (#9964)
PaperMC/Paper@2182d47 Update mapping-io (#9975)
PaperMC/Paper@9993eb9 Updates documentation in EntityEquipment.java (#9992)
PaperMC/Paper@2184fbc Log correct recipes and advancement count on server start (#9978)
PaperMC/Paper@8bda1f7 Remove unnecessary durability check in ItemStack#isSimilar (#9979)
PaperMC/Paper@977a729 [ci skip] Correct Windows requiring path to gradlew (#9976)
PaperMC/Paper@3766afa [ci skip] Add mention of FQ imports (#9994)
PaperMC/Paper@40872ec Fix CraftMetaItem#addAttributeModifier duplication check (#9995)
PaperMC/Paper@ffa4115 Configurable Dry and Wet Farmland Tick Rates (#9968)
PaperMC/Paper@37bee09 Restore vanilla entity drops behavior (#7650)
PaperMC/Paper@5cbd535 Fix Mushroom cow stew api (#9934)
PaperMC/Paper@8e061ce Add Structure check API (#9062)
PaperMC/Paper@9271ee7 Dont resend blocks on interactions (#9413)
PaperMC/Paper@931781c [ci skip] rebuild patches
2023-12-06 16:18:27 -08:00

108 lines
5.4 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Sun, 7 May 2023 22:26:59 -0700
Subject: [PATCH] Sneak to bulk process composter
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
index 3706e94108f68a16fea63e734f3e3b6871dcb0b8..3b557c41fc21591fa06ead5d7d1eae871172ffa4 100644
--- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
+++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
@@ -579,7 +579,7 @@ public class ServerPlayerGameMode {
boolean flag1 = player.isSecondaryUseActive() && flag;
ItemStack itemstack1 = stack.copy();
- if (!flag1) {
+ if (!flag1 || (player.level().purpurConfig.composterBulkProcess && iblockdata.is(Blocks.COMPOSTER))) { // Purpur
enuminteractionresult = iblockdata.use(world, player, hand, hitResult);
if (enuminteractionresult.consumesAction()) {
diff --git a/src/main/java/net/minecraft/world/level/block/ComposterBlock.java b/src/main/java/net/minecraft/world/level/block/ComposterBlock.java
index 10d3912ef043eefdf89105332e29b0d2bf4a5539..596b77306f690a2298835f0f0fea1abee2a7c85d 100644
--- a/src/main/java/net/minecraft/world/level/block/ComposterBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/ComposterBlock.java
@@ -229,20 +229,28 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder {
ItemStack itemstack = player.getItemInHand(hand);
if (i < 8 && ComposterBlock.COMPOSTABLES.containsKey(itemstack.getItem())) {
- if (i < 7 && !world.isClientSide) {
- BlockState iblockdata1 = ComposterBlock.addItem(player, state, world, pos, itemstack);
- // Paper start - handle cancelled events
- if (iblockdata1 == null) {
- return InteractionResult.PASS;
- }
- // Paper end
+ // Purpur start
+ BlockState newState = process(i, state, world, itemstack, pos, player);
+ if (newState == null) {
+ return InteractionResult.PASS;
+ }
- world.levelEvent(1500, pos, state != iblockdata1 ? 1 : 0);
- player.awardStat(Stats.ITEM_USED.get(itemstack.getItem()));
- if (!player.getAbilities().instabuild) {
- itemstack.shrink(1);
- }
+ if (world.purpurConfig.composterBulkProcess && player.isShiftKeyDown() && newState != state) {
+ BlockState oldState;
+ int oldCount, newCount, oldLevel, newLevel;
+ do {
+ oldState = newState;
+ oldCount = itemstack.getCount();
+ oldLevel = oldState.getValue(ComposterBlock.LEVEL);
+ newState = process(oldLevel, oldState, world, itemstack, pos, player);
+ if (newState == null) {
+ return InteractionResult.PASS;
+ }
+ newCount = itemstack.getCount();
+ newLevel = newState.getValue(ComposterBlock.LEVEL);
+ } while (newCount > 0 && (newCount != oldCount || newLevel != oldLevel || newState != oldState));
}
+ // Purpur end
return InteractionResult.sidedSuccess(world.isClientSide);
} else if (i == 8) {
@@ -253,6 +261,26 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder {
}
}
+ private static BlockState process(int level, BlockState state, Level world, ItemStack itemstack, BlockPos pos, Player player) {
+ if (level < 7 && !world.isClientSide) {
+ BlockState iblockdata1 = ComposterBlock.addItem(player, state, world, pos, itemstack);
+ // Paper start - handle cancelled events
+ if (iblockdata1 == null) {
+ return iblockdata1;
+ }
+ // Paper end
+
+ world.levelEvent(1500, pos, state != iblockdata1 ? 1 : 0);
+ player.awardStat(Stats.ITEM_USED.get(itemstack.getItem()));
+ if (!player.getAbilities().instabuild) {
+ itemstack.shrink(1);
+ }
+ return iblockdata1;
+ }
+ return state;
+ }
+ // Purpur end
+
public static BlockState insertItem(Entity user, BlockState state, ServerLevel world, ItemStack stack, BlockPos pos) {
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 a855bb2e4f04a64e47611b20342e1eb484f6bf22..71d472912a2c8dda6102357f6ed619e543e3b534 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -479,6 +479,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() {