mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-28 15:30:19 +01:00
ad9c58e103
Since 1.21.2, vanilla split relative teleportation flags into position and delta/velocity flags into separate enum entries. This highlighted a design flaw in the paper api addition for teleport flags, which just simply mirrored internals while also only being able to apply the delta/velocity part of a flag, given the teleport target is always absolute in the API. This patch proposes to simply no longer expose the non-velocity related flags to the API, instead marking the entire Relative enum as being purely velocity related, as non-velocity related flags are not useful to callers. This was done over simply exposing all internal flags, as another vanilla change to the internal enum would result in the same breakage. The newly proposed API *only* promises that the passed flags prevent the loss of velocity in the specific axis/context, which should be independent enough of vanillas specific implementation of this feature.
54 lines
4 KiB
Diff
54 lines
4 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Tamion <70228790+notTamion@users.noreply.github.com>
|
|
Date: Sun, 26 May 2024 22:20:21 +0200
|
|
Subject: [PATCH] Fix CraftBukkit drag system
|
|
|
|
== AT ==
|
|
public net.minecraft.world.inventory.AbstractContainerMenu quickcraftSlots
|
|
public net.minecraft.world.inventory.AbstractContainerMenu quickcraftStatus
|
|
public net.minecraft.world.inventory.AbstractContainerMenu quickcraftType
|
|
public net.minecraft.world.inventory.AbstractContainerMenu resetQuickCraft()V
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
index bb3d444f7bf2b20a557cd39997f9943c90763432..65ee382684fe2d8dec621ca709880f7349208eae 100644
|
|
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
@@ -3081,6 +3081,25 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
}
|
|
break;
|
|
case QUICK_CRAFT:
|
|
+ // Paper start - Fix CraftBukkit drag system
|
|
+ AbstractContainerMenu containerMenu = this.player.containerMenu;
|
|
+ int currentStatus = this.player.containerMenu.quickcraftStatus;
|
|
+ int newStatus = AbstractContainerMenu.getQuickcraftHeader(packet.getButtonNum());
|
|
+ if ((currentStatus != 1 || newStatus != 2 && currentStatus != newStatus)) {
|
|
+ } else if (containerMenu.getCarried().isEmpty()) {
|
|
+ } else if (newStatus == 0) {
|
|
+ } else if (newStatus == 1) {
|
|
+ } else if (newStatus == 2) {
|
|
+ if (!this.player.containerMenu.quickcraftSlots.isEmpty()) {
|
|
+ if (this.player.containerMenu.quickcraftSlots.size() == 1) {
|
|
+ int index = containerMenu.quickcraftSlots.iterator().next().index;
|
|
+ containerMenu.resetQuickCraft();
|
|
+ this.handleContainerClick(new ServerboundContainerClickPacket(packet.getContainerId(), packet.getStateId(), index, containerMenu.quickcraftType, net.minecraft.world.inventory.ClickType.PICKUP, packet.getCarriedItem(), packet.getChangedSlots()));
|
|
+ return;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ // Paper end - Fix CraftBukkit drag system
|
|
this.player.containerMenu.clicked(packet.getSlotNum(), packet.getButtonNum(), packet.getClickType(), this.player);
|
|
break;
|
|
case PICKUP_ALL:
|
|
diff --git a/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java b/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java
|
|
index 78d0ff45c016e900d87010e8b26b0bb10e63f445..4680f77a275d8d2b226018db89a571ac25998dd8 100644
|
|
--- a/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java
|
|
+++ b/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java
|
|
@@ -468,7 +468,7 @@ public abstract class AbstractContainerMenu {
|
|
}
|
|
} else if (this.quickcraftStatus == 2) {
|
|
if (!this.quickcraftSlots.isEmpty()) {
|
|
- if (false && this.quickcraftSlots.size() == 1) { // CraftBukkit - treat everything as a drag since we are unable to easily call InventoryClickEvent instead
|
|
+ if (this.quickcraftSlots.size() == 1) { // Paper - Fix CraftBukkit drag system
|
|
k = ((Slot) this.quickcraftSlots.iterator().next()).index;
|
|
this.resetQuickCraft();
|
|
this.doClick(k, this.quickcraftType, ClickType.PICKUP, player);
|