From 96ae21d4b3daff037e0d465c16aed4509a05f1f8 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sun, 23 Mar 2025 04:34:43 +0800 Subject: [PATCH] fixed the weird furniture behavior on 1.20 --- .../furniture/BukkitFurnitureManager.java | 31 +------------------ .../entity/furniture/LoadedFurniture.java | 18 ++++------- .../plugin/network/PacketConsumers.java | 7 ++--- .../plugin/user/BukkitServerPlayer.java | 10 ++++++ .../entity/furniture/FurnitureManager.java | 4 --- .../core/plugin/network/NetWorkUser.java | 5 +++ 6 files changed, 25 insertions(+), 50 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java index b7cf50a44..60ec4845f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java @@ -1,7 +1,5 @@ package net.momirealms.craftengine.bukkit.entity.furniture; -import it.unimi.dsi.fastutil.ints.IntOpenHashSet; -import it.unimi.dsi.fastutil.ints.IntSet; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.util.EntityUtils; import net.momirealms.craftengine.core.entity.furniture.*; @@ -37,11 +35,6 @@ public class BukkitFurnitureManager implements FurnitureManager { private final Map furnitureByBaseEntityId = new ConcurrentHashMap<>(256, 0.5f); private final Map furnitureByInteractionEntityId = new ConcurrentHashMap<>(512, 0.5f); - private final Map baseEntity2SubEntities = new ConcurrentHashMap<>(256, 0.5f); - - // Delay furniture cache remove for about 4-5 ticks - private static final int DELAYED_TICK = 5; - private final IntSet[] delayedRemove = new IntSet[DELAYED_TICK]; // Event listeners private final Listener dismountListener; private final FurnitureEventListener furnitureEventListener; @@ -56,9 +49,6 @@ public class BukkitFurnitureManager implements FurnitureManager { this.plugin = plugin; this.furnitureEventListener = new FurnitureEventListener(this); this.dismountListener = VersionHelper.isVersionNewerThan1_20_3() ? new DismountListener1_20_3(this) : new DismountListener1_20(this::handleDismount); - for (int i = 0; i < DELAYED_TICK; i++) { - this.delayedRemove[i] = new IntOpenHashSet(); - } instance = this; } @@ -171,18 +161,6 @@ public class BukkitFurnitureManager implements FurnitureManager { } public void tick() { - IntSet first = this.delayedRemove[0]; - for (int i : first) { - // unloaded furniture might be loaded again - LoadedFurniture furniture = getLoadedFurnitureByBaseEntityId(i); - if (furniture == null) - this.baseEntity2SubEntities.remove(i); - } - first.clear(); - for (int i = 1; i < DELAYED_TICK; i++) { - this.delayedRemove[i - 1] = this.delayedRemove[i]; - } - this.delayedRemove[DELAYED_TICK-1] = first; } @Override @@ -224,12 +202,6 @@ public class BukkitFurnitureManager implements FurnitureManager { return Optional.ofNullable(this.byId.get(id)); } - @Nullable - @Override - public int[] getSubEntityIdsByBaseEntityId(int entityId) { - return this.baseEntity2SubEntities.get(entityId); - } - @Override public boolean isFurnitureBaseEntity(int entityId) { return this.furnitureByBaseEntityId.containsKey(entityId); @@ -253,7 +225,6 @@ public class BukkitFurnitureManager implements FurnitureManager { for (int sub : furniture.interactionEntityIds()) { this.furnitureByInteractionEntityId.remove(sub); } - this.delayedRemove[DELAYED_TICK-1].add(id); } } @@ -270,6 +241,7 @@ public class BukkitFurnitureManager implements FurnitureManager { if (previous != null) return; LoadedFurniture furniture = addNewFurniture(display, customFurniture, getAnchorType(entity, customFurniture)); for (Player player : display.getTrackedPlayers()) { + this.plugin.adapt(player).furnitureView().computeIfAbsent(furniture.baseEntityId(), k -> new ArrayList<>()).addAll(furniture.subEntityIds()); this.plugin.networkManager().sendPacket(player, furniture.spawnPacket()); } } @@ -316,7 +288,6 @@ public class BukkitFurnitureManager implements FurnitureManager { private synchronized LoadedFurniture addNewFurniture(ItemDisplay display, CustomFurniture furniture, AnchorType anchorType) { LoadedFurniture loadedFurniture = new LoadedFurniture(display, furniture, anchorType); this.furnitureByBaseEntityId.put(loadedFurniture.baseEntityId(), loadedFurniture); - this.baseEntity2SubEntities.put(loadedFurniture.baseEntityId(), loadedFurniture.subEntityIds()); for (int entityId : loadedFurniture.interactionEntityIds()) { this.furnitureByInteractionEntityId.put(entityId, loadedFurniture); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java index e4e8071ab..564769812 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java @@ -41,9 +41,9 @@ public class LoadedFurniture { private final WeakReference baseEntity; private final int baseEntityId; // includes elements + interactions - private final int[] subEntityIds; + private final List subEntityIds; // interactions - private final int[] interactionEntityIds; + private final List interactionEntityIds; // seats private final Set occupiedSeats = Collections.synchronizedSet(new HashSet<>()); private final Vector seats = new Vector<>(); @@ -73,14 +73,8 @@ public class LoadedFurniture { interactionEntityIds.add(entityId); this.hitBoxes.put(entityId, hitBox); } - this.subEntityIds = new int[entityIds.size()]; - for (int i = 0; i < entityIds.size(); ++i) { - this.subEntityIds[i] = entityIds.get(i); - } - this.interactionEntityIds = new int[interactionEntityIds.size()]; - for (int i = 0; i < interactionEntityIds.size(); ++i) { - this.interactionEntityIds[i] = interactionEntityIds.get(i); - } + this.subEntityIds = entityIds; + this.interactionEntityIds = interactionEntityIds; this.resetSpawnPackets(); } @@ -229,11 +223,11 @@ public class LoadedFurniture { return baseEntityId; } - public int[] interactionEntityIds() { + public List interactionEntityIds() { return interactionEntityIds; } - public int[] subEntityIds() { + public List subEntityIds() { return this.subEntityIds; } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index 2d75e74ba..7d8048590 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -33,9 +33,7 @@ import org.bukkit.util.RayTraceResult; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -534,6 +532,7 @@ public class PacketConsumers { int entityId = (int) Reflections.field$ClientboundAddEntityPacket$entityId.get(packet); LoadedFurniture furniture = BukkitFurnitureManager.instance().getLoadedFurnitureByBaseEntityId(entityId); if (furniture != null) { + user.furnitureView().computeIfAbsent(furniture.baseEntityId(), k -> new ArrayList<>()).addAll(furniture.subEntityIds()); user.sendPacket(furniture.spawnPacket(), false); } } @@ -568,7 +567,7 @@ public class PacketConsumers { try { IntList intList = (IntList) Reflections.field$ClientboundRemoveEntitiesPacket$entityIds.get(packet); for (int i = 0, size = intList.size(); i < size; i++) { - int[] entities = BukkitFurnitureManager.instance().getSubEntityIdsByBaseEntityId(intList.getInt(i)); + List entities = user.furnitureView().remove(intList.getInt(i)); if (entities == null) continue; for (int entityId : entities) { intList.add(entityId); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index 1c292d9e3..07e3fccad 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -29,7 +29,10 @@ import org.jetbrains.annotations.Nullable; import java.lang.ref.Reference; import java.lang.ref.WeakReference; +import java.util.List; +import java.util.Map; import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; public class BukkitServerPlayer extends Player { private final Channel channel; @@ -60,6 +63,8 @@ public class BukkitServerPlayer extends Player { private Key lastUsedRecipe = null; + private Map> furnitureView = new ConcurrentHashMap<>(); + public BukkitServerPlayer(BukkitCraftEngine plugin, Channel channel) { this.channel = channel; this.plugin = plugin; @@ -583,6 +588,11 @@ public class BukkitServerPlayer extends Player { return playerRef.get(); } + @Override + public Map> furnitureView() { + return this.furnitureView; + } + public void setResendSound() { resentSoundTick = gameTicks(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureManager.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureManager.java index 639a61bcf..ada46b3c4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureManager.java @@ -5,7 +5,6 @@ import net.momirealms.craftengine.core.plugin.Reloadable; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; import net.momirealms.craftengine.core.util.Key; -import javax.annotation.Nullable; import java.util.Optional; public interface FurnitureManager extends Reloadable, ConfigSectionParser { @@ -25,8 +24,5 @@ public interface FurnitureManager extends Reloadable, ConfigSectionParser { Optional getFurniture(Key id); - @Nullable - int[] getSubEntityIdsByBaseEntityId(int entityId); - boolean isFurnitureBaseEntity(int entityId); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java index 3f9c1f21a..c70b49362 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java @@ -5,6 +5,9 @@ import net.momirealms.craftengine.core.plugin.Plugin; import net.momirealms.craftengine.core.util.Key; import org.jetbrains.annotations.ApiStatus; +import java.util.List; +import java.util.Map; + public interface NetWorkUser { boolean isOnline(); @@ -31,4 +34,6 @@ public interface NetWorkUser { Object serverPlayer(); Object platformPlayer(); + + Map> furnitureView(); }