geforkt von Mirrors/Paper
2873869bb1
Signs no longer have a specific isEdiable state, the entire API in this regard needs updating/deprecation. The boolean field is completely gone, replaced by a uuid (which will need a new setEditingPlayer(UUID) method on the Sign interface), and the current upstream implementation of setEdiable simply flips the is_waxed state. This patch is hence not needed as it neither allows editing (which will be redone in a later patch) nor is required to copy the is_waxed boolean flag as it lives in the signs compound tag and is covered by applyTo.
61 Zeilen
3.6 KiB
Diff
61 Zeilen
3.6 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Jake Potrebic <jake.m.potrebic@gmail.com>
|
|
Date: Thu, 16 Jun 2022 21:57:02 -0700
|
|
Subject: [PATCH] Correctly handle interactions with items on cooldown
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
|
|
index 25c289b737f6cd7ede94725d86fbbf8d9ae1d70d..bb7ad618fad7f11a02d7e088e2c05bfffaf0b41d 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
|
|
@@ -519,6 +519,7 @@ public class ServerPlayerGameMode {
|
|
BlockState iblockdata = world.getBlockState(blockposition);
|
|
InteractionResult enuminteractionresult = InteractionResult.PASS;
|
|
boolean cancelledBlock = false;
|
|
+ boolean cancelledItem = false; // Paper - correctly handle items on cooldown
|
|
|
|
if (!iblockdata.getBlock().isEnabled(world.enabledFeatures())) {
|
|
return InteractionResult.FAIL;
|
|
@@ -528,10 +529,10 @@ public class ServerPlayerGameMode {
|
|
}
|
|
|
|
if (player.getCooldowns().isOnCooldown(stack.getItem())) {
|
|
- cancelledBlock = true;
|
|
+ cancelledItem = true; // Paper - correctly handle items on cooldown
|
|
}
|
|
|
|
- PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(player, Action.RIGHT_CLICK_BLOCK, blockposition, hitResult.getDirection(), stack, cancelledBlock, hand, hitResult.getLocation()); // Paper
|
|
+ PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(player, Action.RIGHT_CLICK_BLOCK, blockposition, hitResult.getDirection(), stack, cancelledBlock, cancelledItem, hand, hitResult.getLocation()); // Paper
|
|
this.firedInteract = true;
|
|
this.interactResult = event.useItemInHand() == Event.Result.DENY;
|
|
this.interactPosition = blockposition.immutable();
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
index 20e1efcadd4a11bab8a0db48410229e4a4d5ce57..86b0fe7b6feeef0e085e577954f869e020cc0f04 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
@@ -517,6 +517,12 @@ public class CraftEventFactory {
|
|
}
|
|
|
|
public static PlayerInteractEvent callPlayerInteractEvent(net.minecraft.world.entity.player.Player who, Action action, BlockPos position, Direction direction, ItemStack itemstack, boolean cancelledBlock, InteractionHand hand, Vec3 hitVec) {
|
|
+ // Paper start - correctly handle items on cooldown
|
|
+ return callPlayerInteractEvent(who, action, position, direction, itemstack, cancelledBlock, false, hand, hitVec);
|
|
+ }
|
|
+
|
|
+ public static PlayerInteractEvent callPlayerInteractEvent(net.minecraft.world.entity.player.Player who, Action action, BlockPos position, Direction direction, ItemStack itemstack, boolean cancelledBlock, boolean cancelledItem, InteractionHand hand, Vec3 hitVec) {
|
|
+ // Paper end - correctly handle items on cooldown
|
|
// Paper end
|
|
Player player = (who == null) ? null : (Player) who.getBukkitEntity();
|
|
CraftItemStack itemInHand = CraftItemStack.asCraftMirror(itemstack);
|
|
@@ -550,6 +556,11 @@ public class CraftEventFactory {
|
|
if (cancelledBlock) {
|
|
event.setUseInteractedBlock(Event.Result.DENY);
|
|
}
|
|
+ // Paper start
|
|
+ if (cancelledItem) {
|
|
+ event.setUseItemInHand(Result.DENY);
|
|
+ }
|
|
+ // Paper end
|
|
craftServer.getPluginManager().callEvent(event);
|
|
|
|
return event;
|