9
0
mirror of https://github.com/BX-Team/DivineMC.git synced 2025-12-19 14:59:25 +00:00
Files
DivineMC/patches/server/0016-Paper-PR-BoneMeal-API.patch
2023-03-21 20:54:44 +03:00

89 lines
4.8 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Owen1212055 <23108066+Owen1212055@users.noreply.github.com>
Date: Sun, 17 Oct 2021 14:53:35 -0400
Subject: [PATCH] Paper PR - BoneMeal API
diff --git a/src/main/java/net/minecraft/world/item/BoneMealItem.java b/src/main/java/net/minecraft/world/item/BoneMealItem.java
index c26665bc59c18c4da467fb6ae33e51a65ecf1de6..db31b8e00f63f3fa265dcc669816a5a250ee4910 100644
--- a/src/main/java/net/minecraft/world/item/BoneMealItem.java
+++ b/src/main/java/net/minecraft/world/item/BoneMealItem.java
@@ -36,15 +36,17 @@ public class BoneMealItem extends Item {
// CraftBukkit start - extract bonemeal application logic to separate, static method
return BoneMealItem.applyBonemeal(context);
}
-
- public static InteractionResult applyBonemeal(UseOnContext itemactioncontext) {
+ // Paper start - BoneMeal API
+ public static InteractionResult applyBonemeal(UseOnContext itemactioncontext) { return applyBonemeal(itemactioncontext, true); }
+ public static InteractionResult applyBonemeal(UseOnContext itemactioncontext, boolean showParticles) {
+ // Paper end - BoneMeal API
// CraftBukkit end
Level world = itemactioncontext.getLevel();
BlockPos blockposition = itemactioncontext.getClickedPos();
BlockPos blockposition1 = blockposition.relative(itemactioncontext.getClickedFace());
if (BoneMealItem.growCrop(itemactioncontext.getItemInHand(), world, blockposition)) {
- if (!world.isClientSide) {
+ if (showParticles && !world.isClientSide) { // Paper - BoneMeal API
world.levelEvent(1505, blockposition, 0);
}
@@ -54,7 +56,7 @@ public class BoneMealItem extends Item {
boolean flag = iblockdata.isFaceSturdy(world, blockposition, itemactioncontext.getClickedFace());
if (flag && BoneMealItem.growWaterPlant(itemactioncontext.getItemInHand(), world, blockposition1, itemactioncontext.getClickedFace())) {
- if (!world.isClientSide) {
+ if (showParticles && !world.isClientSide) { // Paper - BoneMeal API
world.levelEvent(1505, blockposition1, 0);
}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
index 5e9055fdf411029ea2fed91acd6b981f79156418..d3ceb6925c86640663439a9dc413df1d9126cc5f 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
@@ -2394,5 +2394,43 @@ public class CraftWorld extends CraftRegionAccessor implements World {
return this.adventure$pointers;
}
+
+ @Override
+ public boolean applyBoneMeal(@org.jetbrains.annotations.NotNull Location location, org.bukkit.block.BlockFace face, boolean showParticles, @org.jetbrains.annotations.Nullable Predicate<BlockState> predicate) {
+ BlockPos pos = new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ());
+ net.minecraft.world.item.context.UseOnContext context = new net.minecraft.world.item.context.UseOnContext(this.getHandle(), null, net.minecraft.world.InteractionHand.MAIN_HAND, net.minecraft.world.item.Items.BONE_MEAL.getDefaultInstance(), new net.minecraft.world.phys.BlockHitResult(Vec3.ZERO, CraftBlock.blockFaceToNotch(face), pos, false));
+
+ // Save old capturing state
+ boolean wasCapturingTrees = world.captureTreeGeneration;
+ boolean wasCapturingBlockStates = world.captureBlockStates;
+
+ Map<BlockPos, org.bukkit.craftbukkit.block.CraftBlockState> capturedBlocks = world.capturedBlockStates;
+ Map<BlockPos, net.minecraft.world.level.block.entity.BlockEntity> capturedTileEntities = world.capturedTileEntities;
+
+ // Create new state, capture everything
+ world.capturedBlockStates = new java.util.LinkedHashMap<>();
+ world.capturedTileEntities = new java.util.LinkedHashMap<>();
+
+ world.captureTreeGeneration = true;
+ world.captureBlockStates = true;
+
+ net.minecraft.world.InteractionResult result = net.minecraft.world.item.BoneMealItem.applyBonemeal(context, showParticles);
+
+ // Revert back booleans
+ world.captureTreeGeneration = wasCapturingTrees;
+ world.captureBlockStates = wasCapturingBlockStates;
+
+ for (BlockState blockState : world.capturedBlockStates.values()) {
+ if (predicate != null && predicate.test(blockState)) {
+ blockState.update(true);
+ }
+ }
+
+ // Revertback maps
+ world.capturedBlockStates = capturedBlocks;
+ world.capturedTileEntities = capturedTileEntities;
+
+ return result == net.minecraft.world.InteractionResult.CONSUME;
+ }
// Paper end
}