fix: try fix shulker box clear bug(#5)

This commit is contained in:
Helvetica Volubi
2025-06-17 14:51:51 +08:00
parent 24d4ebdc7c
commit 16f2258eed
5 changed files with 71 additions and 69 deletions
+1 -1
View File
@@ -2,7 +2,7 @@ group=me.earthme.lophine
version=1.21.5-R0.1-SNAPSHOT version=1.21.5-R0.1-SNAPSHOT
mcVersion=1.21.5 mcVersion=1.21.5
luminolRef=784ce10986c214df322a9289e8ddb0b700759596 luminolRef=cd8a4e11dce2e85cdef873648e615ae7ca79fd99
org.gradle.configuration-cache=true org.gradle.configuration-cache=true
org.gradle.caching=true org.gradle.caching=true
+1 -1
View File
@@ -51,7 +51,7 @@
implementation("com.electronwill.night-config:toml:3.8.2") // Luminol - Night config implementation("com.electronwill.night-config:toml:3.8.2") // Luminol - Night config
// Abomination start // Abomination start
implementation("com.github.luben:zstd-jni:1.5.4-1") implementation("com.github.luben:zstd-jni:1.5.4-1")
@@ -264,14 +_,14 @@ @@ -265,14 +_,14 @@
val gitBranch = git.exec(providers, "rev-parse", "--abbrev-ref", "HEAD").get().trim() val gitBranch = git.exec(providers, "rev-parse", "--abbrev-ref", "HEAD").get().trim()
attributes( attributes(
"Main-Class" to "org.bukkit.craftbukkit.Main", "Main-Class" to "org.bukkit.craftbukkit.Main",
@@ -44,7 +44,7 @@ index 8e91ec81128bdbd5f78e1f04fe17bcbd6e5dc280..6b4a33189b4dcd4979fb421248f72530
world.setDayTime(world.levelData.getDayTime() + (long)tickCount); world.setDayTime(world.levelData.getDayTime() + (long)tickCount);
} }
diff --git a/io/papermc/paper/threadedregions/TickRegionScheduler.java b/io/papermc/paper/threadedregions/TickRegionScheduler.java diff --git a/io/papermc/paper/threadedregions/TickRegionScheduler.java b/io/papermc/paper/threadedregions/TickRegionScheduler.java
index fa6b8d756195c1b430cc11214a901bd42eebc98d..1d79465c9b04c5cdfd299278786916cb10e49522 100644 index 0357792de0ed8ec9058d1847c8b45c33ff365af6..0bb3752d361bda347646dab5dc83bcf6bd5e717f 100644
--- a/io/papermc/paper/threadedregions/TickRegionScheduler.java --- a/io/papermc/paper/threadedregions/TickRegionScheduler.java
+++ b/io/papermc/paper/threadedregions/TickRegionScheduler.java +++ b/io/papermc/paper/threadedregions/TickRegionScheduler.java
@@ -31,8 +31,8 @@ public final class TickRegionScheduler { @@ -31,8 +31,8 @@ public final class TickRegionScheduler {
@@ -58,7 +58,7 @@ index fa6b8d756195c1b430cc11214a901bd42eebc98d..1d79465c9b04c5cdfd299278786916cb
// Folia start - watchdog // Folia start - watchdog
public static final FoliaWatchdogThread WATCHDOG_THREAD = new FoliaWatchdogThread(); public static final FoliaWatchdogThread WATCHDOG_THREAD = new FoliaWatchdogThread();
@@ -375,8 +375,23 @@ public final class TickRegionScheduler { @@ -394,8 +394,23 @@ public final class TickRegionScheduler {
final long cpuStart = MEASURE_CPU_TIME ? THREAD_MX_BEAN.getCurrentThreadCpuTime() : 0L; final long cpuStart = MEASURE_CPU_TIME ? THREAD_MX_BEAN.getCurrentThreadCpuTime() : 0L;
final long tickStart = System.nanoTime(); final long tickStart = System.nanoTime();
@@ -84,7 +84,7 @@ index fa6b8d756195c1b430cc11214a901bd42eebc98d..1d79465c9b04c5cdfd299278786916cb
if (!this.tryMarkTicking()) { if (!this.tryMarkTicking()) {
if (!this.cancelled.get()) { if (!this.cancelled.get()) {
@@ -416,6 +431,11 @@ public final class TickRegionScheduler { @@ -435,6 +450,11 @@ public final class TickRegionScheduler {
try { try {
// next start isn't updated until the end of this tick // next start isn't updated until the end of this tick
this.tickRegion(tickCount, tickStart, scheduledEnd); this.tickRegion(tickCount, tickStart, scheduledEnd);
@@ -6,28 +6,27 @@ Subject: [PATCH] Better ShulkerBox
You can open shulker box with shift & right click You can open shulker box with shift & right click
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
index 1764875b9024569671bf2be537afb8b492f79102..0ae350d7e4b63abad1666c84df6925c71b73a013 100644 index 1764875b9024569671bf2be537afb8b492f79102..b395482c6b5609c3b878f4e1ed17861b3b3fe9f7 100644
--- a/net/minecraft/server/level/ServerPlayer.java --- a/net/minecraft/server/level/ServerPlayer.java
+++ b/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java
@@ -2351,6 +2351,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc @@ -2351,6 +2351,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
this.containerMenu.removed(this); this.containerMenu.removed(this);
this.inventoryMenu.transferState(this.containerMenu); this.inventoryMenu.transferState(this.containerMenu);
this.containerMenu = this.inventoryMenu; this.containerMenu = this.inventoryMenu;
+ this.shulkerOpen = false; + me.earthme.lophine.utils.ShulkerBoxesUtil.clearMap(this); // Lophine - better shulker box
} }
@Override @Override
diff --git a/net/minecraft/world/entity/player/Inventory.java b/net/minecraft/world/entity/player/Inventory.java diff --git a/net/minecraft/world/entity/player/Inventory.java b/net/minecraft/world/entity/player/Inventory.java
index 9fbd605df26d388c01d2ed9ca6a6138651e7f9a7..e8141cb25d6b9a433890e2cded188c2eb5bcf755 100644 index 9fbd605df26d388c01d2ed9ca6a6138651e7f9a7..075526ce459cee3b157d5338ec079ad1515c6640 100644
--- a/net/minecraft/world/entity/player/Inventory.java --- a/net/minecraft/world/entity/player/Inventory.java
+++ b/net/minecraft/world/entity/player/Inventory.java +++ b/net/minecraft/world/entity/player/Inventory.java
@@ -470,6 +470,16 @@ public class Inventory implements Container, Nameable { @@ -470,6 +470,15 @@ public class Inventory implements Container, Nameable {
if (equipmentSlot != null) { if (equipmentSlot != null) {
this.equipment.set(equipmentSlot, stack); this.equipment.set(equipmentSlot, stack);
} }
+
+ // Lophine start - better shulker box + // Lophine start - better shulker box
+ if (me.earthme.lophine.config.modules.misc.ContainerExpansionConfig.betterShulker && !this.player.pendingClosingShulker) { + if (me.earthme.lophine.config.modules.misc.ContainerExpansionConfig.betterShulker) {
+ boolean isMainHand = index == selected; + boolean isMainHand = index == selected;
+ boolean isOffHand = index == 40; + boolean isOffHand = index == 40;
+ if (isMainHand || isOffHand) { + if (isMainHand || isOffHand) {
@@ -39,50 +38,25 @@ index 9fbd605df26d388c01d2ed9ca6a6138651e7f9a7..e8141cb25d6b9a433890e2cded188c2e
public ListTag save(ListTag listTag) { public ListTag save(ListTag listTag) {
diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java
index 27e335e01d8f09f05a4fea5f15407dbe3a4555cb..fbb9fee8223cc27125e4c0c94a7eb8acab5e9a13 100644 index 27e335e01d8f09f05a4fea5f15407dbe3a4555cb..b1389af2c04527fbc8f62577fad4bc679506a0e9 100644
--- a/net/minecraft/world/entity/player/Player.java --- a/net/minecraft/world/entity/player/Player.java
+++ b/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java
@@ -211,6 +211,11 @@ public abstract class Player extends LivingEntity { @@ -595,11 +595,13 @@ public abstract class Player extends LivingEntity {
public boolean affectsSpawning = true; // Paper - Affects Spawning API
public net.kyori.adventure.util.TriState flyingFallDamage = net.kyori.adventure.util.TriState.NOT_SET; // Paper - flying fall damage
public int enderChestSlotCount = -1; // Purpur - Barrels and enderchests 6 rows
+ // Lophine start - better shulker box
+ public net.minecraft.world.InteractionHand shulkerHand;
+ public boolean pendingClosingShulker = false;
+ public boolean shulkerOpen = false;
+ // Lophine end - better shulker box
// CraftBukkit start
public boolean fauxSleeping;
@@ -595,11 +600,13 @@ public abstract class Player extends LivingEntity {
// Paper start - special close for unloaded inventory // Paper start - special close for unloaded inventory
public void closeUnloadedInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason reason) { public void closeUnloadedInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason reason) {
this.containerMenu = this.inventoryMenu; this.containerMenu = this.inventoryMenu;
+ this.shulkerOpen = false; + me.earthme.lophine.utils.ShulkerBoxesUtil.clearMap(this); // Lophine - better shulker box
} }
// Paper end - special close for unloaded inventory // Paper end - special close for unloaded inventory
public void closeContainer() { public void closeContainer() {
this.containerMenu = this.inventoryMenu; this.containerMenu = this.inventoryMenu;
+ this.shulkerOpen = false; + me.earthme.lophine.utils.ShulkerBoxesUtil.clearMap(this); // Lophine - better shulker box
} }
protected void doCloseContainer() { protected void doCloseContainer() {
diff --git a/net/minecraft/world/inventory/AbstractContainerMenu.java b/net/minecraft/world/inventory/AbstractContainerMenu.java
index 6c5a01b065c7daa37219a8ab2a471d93e882e756..7b49b35e7a0b9872daceb620cf83b06ae61c3df9 100644
--- a/net/minecraft/world/inventory/AbstractContainerMenu.java
+++ b/net/minecraft/world/inventory/AbstractContainerMenu.java
@@ -697,7 +697,7 @@ public abstract class AbstractContainerMenu {
}
}
- private static void dropOrPlaceInInventory(Player player, ItemStack stack) {
+ public static void dropOrPlaceInInventory(Player player, ItemStack stack) { // Lophine - better shulker box
boolean flag = !player.isAlive(); //player.isRemoved() && player.getRemovalReason() != Entity.RemovalReason.CHANGED_DIMENSION; // Luminol - Fix uncorrected death check of folia
boolean flag1 = player instanceof ServerPlayer serverPlayer && serverPlayer.hasDisconnected();
if (flag || flag1) {
diff --git a/net/minecraft/world/inventory/ShulkerBoxMenu.java b/net/minecraft/world/inventory/ShulkerBoxMenu.java diff --git a/net/minecraft/world/inventory/ShulkerBoxMenu.java b/net/minecraft/world/inventory/ShulkerBoxMenu.java
index 903025c659e6a9423224fe65973696405c69ec6a..545fc46416932db922dc1476b983ac8b9b9f3c7b 100644 index 903025c659e6a9423224fe65973696405c69ec6a..e850b533d89f95d01a3b9d265a70845793e37bd7 100644
--- a/net/minecraft/world/inventory/ShulkerBoxMenu.java --- a/net/minecraft/world/inventory/ShulkerBoxMenu.java
+++ b/net/minecraft/world/inventory/ShulkerBoxMenu.java +++ b/net/minecraft/world/inventory/ShulkerBoxMenu.java
@@ -53,7 +53,7 @@ public class ShulkerBoxMenu extends AbstractContainerMenu { @@ -53,7 +53,7 @@ public class ShulkerBoxMenu extends AbstractContainerMenu {
@@ -90,7 +64,7 @@ index 903025c659e6a9423224fe65973696405c69ec6a..545fc46416932db922dc1476b983ac8b
@Override @Override
public boolean stillValid(Player player) { public boolean stillValid(Player player) {
- if (!this.checkReachable) return true; // CraftBukkit - if (!this.checkReachable) return true; // CraftBukkit
+ if (!this.checkReachable || player.shulkerOpen) return true; // CraftBukkit // Lophine - better shulker box + if (!this.checkReachable || me.earthme.lophine.utils.ShulkerBoxesUtil.checkIfValid(player)) return true; // CraftBukkit // Lophine - better shulker box
return this.container.stillValid(player); return this.container.stillValid(player);
} }
@@ -126,7 +100,7 @@ index ecf794f94177fc7b6df483516d920719fbc6fa43..4fda59a4c17009a0009f3d3c13258f4f
throw new IllegalArgumentException("Got " + items.size() + " items, but maximum is 256"); throw new IllegalArgumentException("Got " + items.size() + " items, but maximum is 256");
} else { } else {
diff --git a/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java b/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java diff --git a/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java b/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java
index 87ebdb6deb66662a38b3eec0dae27eaf859ecabb..e22114dbfbfd1619260a45929397c11c9356b8a0 100644 index 87ebdb6deb66662a38b3eec0dae27eaf859ecabb..7e97f0e200e7fd83aa9504a5fced83d2d00e0319 100644
--- a/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java --- a/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java
+++ b/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java +++ b/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java
@@ -46,6 +46,11 @@ public class ShulkerBoxBlockEntity extends RandomizableContainerBlockEntity impl @@ -46,6 +46,11 @@ public class ShulkerBoxBlockEntity extends RandomizableContainerBlockEntity impl
@@ -135,8 +109,8 @@ index 87ebdb6deb66662a38b3eec0dae27eaf859ecabb..e22114dbfbfd1619260a45929397c11c
private float progressOld; private float progressOld;
+ // Lophine start - better shulker box + // Lophine start - better shulker box
+ public boolean haveRealBlock = true; + public boolean haveRealBlock = true;
+ public Player createPlayer; + public net.minecraft.world.InteractionHand shulkerHand;
+ public ItemStack item; + public ItemStack finalItem;
+ // Lophine end - better shulker box + // Lophine end - better shulker box
@Nullable @Nullable
private final DyeColor color; private final DyeColor color;
@@ -148,7 +122,7 @@ index 87ebdb6deb66662a38b3eec0dae27eaf859ecabb..e22114dbfbfd1619260a45929397c11c
+ // Lophine start - better shulker box + // Lophine start - better shulker box
+ public void setItem(int index, ItemStack stack) { + public void setItem(int index, ItemStack stack) {
+ super.setItem(index, stack); + super.setItem(index, stack);
+ if (!createPlayer.pendingClosingShulker && !haveRealBlock && me.earthme.lophine.config.modules.misc.ContainerExpansionConfig.betterShulker) { + if (me.earthme.lophine.config.modules.misc.ContainerExpansionConfig.betterShulker && !haveRealBlock) {
+ me.earthme.lophine.utils.ShulkerBoxesUtil.shulkerBoxEntityCallBack(this); + me.earthme.lophine.utils.ShulkerBoxesUtil.shulkerBoxEntityCallBack(this);
+ } + }
+ } + }
@@ -1,6 +1,6 @@
--- /dev/null --- /dev/null
+++ b/src/main/java/me/earthme/lophine/utils/ShulkerBoxesUtil.java +++ b/src/main/java/me/earthme/lophine/utils/ShulkerBoxesUtil.java
@@ -1,0 +_,153 @@ @@ -1,0 +_,181 @@
+package me.earthme.lophine.utils; +package me.earthme.lophine.utils;
+ +
+import me.earthme.lophine.config.modules.misc.ContainerExpansionConfig; +import me.earthme.lophine.config.modules.misc.ContainerExpansionConfig;
@@ -19,12 +19,15 @@
+import net.minecraft.world.level.block.entity.ShulkerBoxBlockEntity; +import net.minecraft.world.level.block.entity.ShulkerBoxBlockEntity;
+import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.NotNull;
+ +
+import java.util.HashMap;
+import java.util.Objects; +import java.util.Objects;
+import java.util.Optional; +import java.util.Optional;
+ +
+import static net.minecraft.world.inventory.AbstractContainerMenu.dropOrPlaceInInventory;
+
+public class ShulkerBoxesUtil { +public class ShulkerBoxesUtil {
+ // Better ShulkerBoxes used
+ public static HashMap<Player, ShulkerBoxBlockEntity> shulkerMap = new HashMap<>();
+ public static HashMap<ShulkerBoxBlockEntity, Player> playerMap = new HashMap<>();
+
+ // Stackable ShulkerBoxes part + // Stackable ShulkerBoxes part
+ public static boolean shouldCheck() { + public static boolean shouldCheck() {
+ return ContainerExpansionConfig.shulkerCount > 1 && ContainerExpansionConfig.shulkerCount <= 64; + return ContainerExpansionConfig.shulkerCount > 1 && ContainerExpansionConfig.shulkerCount <= 64;
@@ -94,7 +97,12 @@
+ return checkIsShulkerBox(itemStack) && itemStack.getCount() == 1; + return checkIsShulkerBox(itemStack) && itemStack.getCount() == 1;
+ } + }
+ +
+ public static void openShulkerBox(Player player, ItemStack itemInHand, InteractionHand hand) { + public static boolean checkIfValid(Player player) {
+ return shulkerMap.get(player) != null;
+ }
+
+ public static void openShulkerBox(Player player, ItemStack item, InteractionHand hand) {
+ ItemStack itemInHand = item.copy();
+ ShulkerBoxBlockEntity shulkerBoxEntity = new ShulkerBoxBlockEntity( + ShulkerBoxBlockEntity shulkerBoxEntity = new ShulkerBoxBlockEntity(
+ player.blockPosition(), + player.blockPosition(),
+ ((BlockItem) itemInHand.getItem()).getBlock().defaultBlockState() + ((BlockItem) itemInHand.getItem()).getBlock().defaultBlockState()
@@ -111,11 +119,13 @@
+ +
+ shulkerBoxEntity.setItems(items); + shulkerBoxEntity.setItems(items);
+ +
+ shulkerBoxEntity.setLevel(player.level());
+ shulkerBoxEntity.haveRealBlock = false; + shulkerBoxEntity.haveRealBlock = false;
+ shulkerBoxEntity.createPlayer = player; + shulkerBoxEntity.shulkerHand = hand;
+ player.shulkerHand = hand; + shulkerBoxEntity.finalItem = itemInHand;
+ player.shulkerOpen = true; + shulkerBoxEntity.setLevel(player.level());
+
+ shulkerMap.put(player, shulkerBoxEntity);
+ playerMap.put(shulkerBoxEntity, player);
+ +
+ if (player.openMenu(shulkerBoxEntity).isPresent()) { + if (player.openMenu(shulkerBoxEntity).isPresent()) {
+ player.awardStat(Stats.OPEN_SHULKER_BOX); + player.awardStat(Stats.OPEN_SHULKER_BOX);
@@ -123,34 +133,52 @@
+ } + }
+ +
+ public static void shulkerBoxEntityCallBack(ShulkerBoxBlockEntity shulkerBoxEntity) { + public static void shulkerBoxEntityCallBack(ShulkerBoxBlockEntity shulkerBoxEntity) {
+ Player player = shulkerBoxEntity.createPlayer; + Player player = playerMap.get(shulkerBoxEntity);
+ if (player.shulkerOpen) { + if (player != null) {
+ InteractionHand hand = player.shulkerHand; + InteractionHand hand = shulkerBoxEntity.shulkerHand;
+ ItemStack currentItem = player.getItemInHand(hand); + ItemStack currentItem = player.getItemInHand(hand);
+ ItemStack copy = currentItem.copy();
+ +
+ currentItem.set(DataComponents.CONTAINER, ItemContainerContents.fromItems(shulkerBoxEntity.getItems())); + copy.set(DataComponents.CONTAINER, ItemContainerContents.fromItems(shulkerBoxEntity.getItems()));
+ +
+ player.setItemInHand(hand, currentItem); + player.setItemInHand(hand, copy);
+
+ shulkerBoxEntity.finalItem = copy;
+ } + }
+ } + }
+ +
+ public static void inventoryCallBack(boolean isMainHand, Player player) { + public static void inventoryCallBack(boolean isMainHand, Player player) {
+ if (player.shulkerOpen) { + ShulkerBoxBlockEntity entity = shulkerMap.get(player);
+ if (isMainHand == Objects.equals(player.shulkerHand, InteractionHand.MAIN_HAND)) { + if (entity != null && isMainHand == Objects.equals(entity.shulkerHand, InteractionHand.MAIN_HAND)) {
+ player.pendingClosingShulker = true; + closeScreen(entity, player);
+ closeScreen(player);
+ player.pendingClosingShulker = false;
+ }
+ } + }
+ } + }
+ +
+ public static void closeScreen(Player player) { + public static void closeScreen(ShulkerBoxBlockEntity entity, Player player) {
+ if (player instanceof ServerPlayer) { + if (player instanceof ServerPlayer serverPlayer) {
+ ItemStack stack = player.containerMenu.getCarried(); + ItemStack stack1 = entity.finalItem;
+ ItemStack stack2 = player.containerMenu.getCarried();
+ ItemStack stack = stack2.isEmpty() ? stack1 : stack2;
+ if (!stack.isEmpty()) { + if (!stack.isEmpty()) {
+ dropOrPlaceInInventory(player, stack); + if (!player.isAlive() || serverPlayer.hasDisconnected()) {
+ player.drop(stack, false);
+ } else {
+ player.getInventory().placeItemBackInInventory(stack);
+ }
+ } + }
+ } + }
+ player.closeContainer(); + player.closeContainer();
+ } + }
+
+ public static void clearMap(Player p) {
+ ShulkerBoxBlockEntity e = shulkerMap.get(p);
+ if (e != null) playerMap.remove(e);
+ shulkerMap.remove(p);
+ }
+
+ public static void clearMap(ShulkerBoxBlockEntity e) {
+ Player p = playerMap.get(e);
+ if (p != null) shulkerMap.remove(p);
+ playerMap.remove(e);
+ }
+} +}