9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-30 20:39:10 +00:00

refactor(bukkit): 移除最大可见家具数量的限制功能

This commit is contained in:
jhqwqmc
2025-05-23 04:49:42 +08:00
parent 768b5de5ba
commit 35c4e22f20
12 changed files with 20 additions and 379 deletions

View File

@@ -52,8 +52,7 @@ public class BukkitCommandManager extends AbstractCommandManager<CommandSender>
new DisableResourceCommand(this, plugin),
new ListResourceCommand(this, plugin),
new UploadPackCommand(this, plugin),
new SendResourcePackCommand(this, plugin),
new SetMaxVisibleFurnitureCommand(this, plugin)
new SendResourcePackCommand(this, plugin)
));
final LegacyPaperCommandManager<CommandSender> manager = (LegacyPaperCommandManager<CommandSender>) getCommandManager();
manager.settings().set(ManagerSetting.ALLOW_UNSAFE_REGISTRATION, true);

View File

@@ -1,36 +0,0 @@
package net.momirealms.craftengine.bukkit.plugin.command.feature;
import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature;
import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.incendo.cloud.Command;
import org.incendo.cloud.CommandManager;
import org.incendo.cloud.parser.standard.IntegerParser;
public class SetMaxVisibleFurnitureCommand extends BukkitCommandFeature<CommandSender> {
public SetMaxVisibleFurnitureCommand(CraftEngineCommandManager<CommandSender> commandManager, CraftEngine plugin) {
super(commandManager, plugin);
}
@Override
public Command.Builder<? extends CommandSender> assembleCommand(CommandManager<CommandSender> manager, Command.Builder<CommandSender> builder) {
return builder
.senderType(Player.class)
.required("max", IntegerParser.integerParser(1))
.handler(context -> {
// 需要找一个更好的存储方案去兼容跨服和在初始化的时候加载
BukkitServerPlayer cePlayer = plugin().adapt(context.sender());
Integer max = context.get("max");
cePlayer.setMaxVisibleFurniture(max, true);
});
}
@Override
public String getFeatureID() {
return "set_max_visible_furniture";
}
}

View File

@@ -1,8 +1,6 @@
package net.momirealms.craftengine.bukkit.plugin.command.feature;
import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager;
import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature;
import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager;
import org.bukkit.Material;
@@ -40,27 +38,19 @@ public class TestCommand extends BukkitCommandFeature<CommandSender> {
public Command.Builder<? extends CommandSender> assembleCommand(org.incendo.cloud.CommandManager<CommandSender> manager, Command.Builder<CommandSender> builder) {
return builder
.senderType(Player.class)
// .required("reset", BooleanParser.booleanParser())
// .required("setTag", NamespacedKeyParser.namespacedKeyParser())
// .required("targetBlock", StringParser.stringComponent(StringParser.StringMode.GREEDY_FLAG_YIELDING).suggestionProvider(new SuggestionProvider<>() {
// @Override
// public @NonNull CompletableFuture<? extends @NonNull Iterable<? extends @NonNull Suggestion>> suggestionsFuture(@NonNull CommandContext<Object> context, @NonNull CommandInput input) {
// return CompletableFuture.completedFuture(TARGET_BLOCK_SUGGESTIONS);
// }
// }))
.required("reset", BooleanParser.booleanParser())
.required("setTag", NamespacedKeyParser.namespacedKeyParser())
.required("targetBlock", StringParser.stringComponent(StringParser.StringMode.GREEDY_FLAG_YIELDING).suggestionProvider(new SuggestionProvider<>() {
@Override
public @NonNull CompletableFuture<? extends @NonNull Iterable<? extends @NonNull Suggestion>> suggestionsFuture(@NonNull CommandContext<Object> context, @NonNull CommandInput input) {
return CompletableFuture.completedFuture(TARGET_BLOCK_SUGGESTIONS);
}
}))
.handler(context -> {
Player player = context.sender();
BukkitServerPlayer cePlayer = plugin().adapt(player);
player.sendMessage("visualFurnitureView: " + cePlayer.visualFurnitureView().getTotalMembers());
player.sendMessage(cePlayer.visualFurnitureView() + "\n===============================");
// cePlayer.visualFurnitureView().getAllElements().forEach(element -> {
// LoadedFurniture furniture = BukkitFurnitureManager.instance().loadedFurnitureByRealEntityId(element.entityId());
// if (furniture == null || !player.canSee(furniture.baseEntity())) {
// cePlayer.visualFurnitureView().removeByEntityId(element.entityId());
// player.sendMessage("remove: " + element.entityId());
// }
// });
// player.sendMessage("visualFurnitureView2: " + cePlayer.visualFurnitureView().getTotalMembers());
player.sendMessage("开始测试");
NamespacedKey key = context.get("setTag");
player.sendMessage("结束测试");
});
}

View File

@@ -1600,33 +1600,8 @@ public class PacketConsumers {
// Furniture
BukkitFurniture furniture = BukkitFurnitureManager.instance().loadedFurnitureByRealEntityId(entityId);
if (furniture != null) {
Player player = (Player) user.platformPlayer();
List<Integer> fakeEntityIds = furniture.fakeEntityIds();
user.entityPacketHandlers().computeIfAbsent(entityId, k -> new FurniturePacketHandler(fakeEntityIds));
if (Config.enableMaxVisibleFurniture()) {
if (user.visualFurnitureView().getTotalMembers() <= Config.maxVisibleFurniture()) {
user.sendPacket(furniture.spawnPacket(player), false);
}
int[] entityIdsArray = new int[fakeEntityIds.size() + 2];
entityIdsArray[0] = -114514;
entityIdsArray[1] = entityId;
for (int i = 0; i < fakeEntityIds.size(); i++) {
entityIdsArray[i + 2] = fakeEntityIds.get(i);
}
double distance = furniture.location().distanceSquared(player.getLocation());
Object removePacket = Reflections.constructor$ClientboundRemoveEntitiesPacket.newInstance(entityIdsArray);
DynamicPriorityTracker.UpdateResult result = user.visualFurnitureView().addOrUpdateElement(new DynamicPriorityTracker.Element(entityId, distance, removePacket));
for (DynamicPriorityTracker.Element element : result.getEntered()) {
BukkitFurniture updateFurniture = BukkitFurnitureManager.instance().loadedFurnitureByRealEntityId(element.entityId());
if (updateFurniture == null || !updateFurniture.isValid()) continue;
user.sendPacket(updateFurniture.spawnPacket(player), false);
}
for (DynamicPriorityTracker.Element element : result.getExited()) {
user.sendPacket(element.removePacket(), false);
}
} else {
user.sendPacket(furniture.spawnPacket(player), false);
}
user.entityPacketHandlers().computeIfAbsent(entityId, k -> new FurniturePacketHandler(furniture.fakeEntityIds()));
user.sendPacket(furniture.spawnPacket((Player) user.platformPlayer()), false);
if (Config.hideBaseEntity() && !furniture.hasExternalModel()) {
event.setCancelled(true);
}
@@ -1668,25 +1643,11 @@ public class PacketConsumers {
FriendlyByteBuf buf = event.getBuffer();
boolean isChange = false;
IntList intList = buf.readIntIdList();
int first = intList.getFirst();
if (first != -114514) {
for (int i = 0, size = intList.size(); i < size; i++) {
int entityId = intList.getInt(i);
EntityPacketHandler handler = user.entityPacketHandlers().remove(entityId);
if (handler != null && handler.handleEntitiesRemove(intList)) {
user.visualFurnitureView().removeByEntityId(entityId);
isChange = true;
}
}
} else {
intList.removeFirst();
isChange = true;
for (int i = 0, size = intList.size(); i < size; i++) {
int entityId = intList.getInt(i);
EntityPacketHandler handler = user.entityPacketHandlers().get(entityId);
if (handler != null) {
handler.handleEntitiesRemove(intList);
}
for (int i = 0, size = intList.size(); i < size; i++) {
int entityId = intList.getInt(i);
EntityPacketHandler handler = user.entityPacketHandlers().remove(entityId);
if (handler != null && handler.handleEntitiesRemove(intList)) {
isChange = true;
}
}
if (isChange) {

View File

@@ -4,8 +4,6 @@ import com.google.common.collect.Lists;
import io.netty.channel.Channel;
import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.bukkit.block.BukkitBlockManager;
import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurniture;
import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager;
import net.momirealms.craftengine.bukkit.item.BukkitItemManager;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
@@ -25,7 +23,6 @@ import net.momirealms.craftengine.core.plugin.network.ConnectionState;
import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler;
import net.momirealms.craftengine.core.plugin.network.ProtocolVersion;
import net.momirealms.craftengine.core.util.Direction;
import net.momirealms.craftengine.core.util.DynamicPriorityTracker;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.VersionHelper;
import net.momirealms.craftengine.core.world.BlockPos;
@@ -40,7 +37,6 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.persistence.PersistentDataType;
import org.bukkit.util.RayTraceResult;
import org.jetbrains.annotations.Nullable;
@@ -50,7 +46,6 @@ import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public class BukkitServerPlayer extends Player {
public static final NamespacedKey MAX_VISIBLE_FURNITURE_KEY = Objects.requireNonNull(NamespacedKey.fromString("craftengine:max_visible_furniture"));
private final BukkitCraftEngine plugin;
// handshake
private ProtocolVersion protocolVersion = ProtocolVersion.UNKNOWN;
@@ -99,10 +94,8 @@ public class BukkitServerPlayer extends Player {
// cache interaction range here
private int lastUpdateInteractionRangeTick;
private double cachedInteractionRange;
private Integer maxVisibleFurniture = -1;
private final Map<Integer, EntityPacketHandler> entityTypeView = new ConcurrentHashMap<>();
private final DynamicPriorityTracker visualFurnitureView = new DynamicPriorityTracker();
public BukkitServerPlayer(BukkitCraftEngine plugin, Channel channel) {
this.channel = channel;
@@ -114,9 +107,6 @@ public class BukkitServerPlayer extends Player {
this.serverPlayerRef = new WeakReference<>(FastNMS.INSTANCE.method$CraftPlayer$getHandle(player));
this.uuid = player.getUniqueId();
this.name = player.getName();
this.maxVisibleFurniture = player.getPersistentDataContainer()
.getOrDefault(MAX_VISIBLE_FURNITURE_KEY, PersistentDataType.INTEGER, -1);
this.visualFurnitureView.setMaxVisibleFurniture(this.maxVisibleFurniture);
}
@Override
@@ -353,7 +343,6 @@ public class BukkitServerPlayer extends Player {
}
if (this.gameTicks % 30 == 0) {
this.updateGUI();
this.updateVisualFurnitureView();
}
if (this.isDestroyingBlock) {
this.tickBlockDestroy();
@@ -378,26 +367,6 @@ public class BukkitServerPlayer extends Player {
}
}
private void updateVisualFurnitureView() {
if (!Config.enableMaxVisibleFurniture()) return;
if (visualFurnitureView().getTotalMembers() <= Config.maxVisibleFurniture()) return;
for (DynamicPriorityTracker.Element element : visualFurnitureView().getAllElements()) {
BukkitFurniture furniture = BukkitFurnitureManager.instance().loadedFurnitureByRealEntityId(element.entityId());
if (furniture == null || !furniture.isValid()) continue;
double distance = furniture.location().distanceSquared(platformPlayer().getLocation());
DynamicPriorityTracker.Element newElement = new DynamicPriorityTracker.Element(element.entityId(), distance, element.removePacket());
DynamicPriorityTracker.UpdateResult result = visualFurnitureView().addOrUpdateElement(newElement);
for (DynamicPriorityTracker.Element resultElement : result.getEntered()) {
BukkitFurniture updateFurniture = BukkitFurnitureManager.instance().loadedFurnitureByRealEntityId(resultElement.entityId());
if (updateFurniture == null || !updateFurniture.isValid()) continue;
sendPacket(updateFurniture.spawnPacket(platformPlayer()), false);
}
for (DynamicPriorityTracker.Element resultElement : result.getExited()) {
sendPacket(resultElement.removePacket(), false);
}
}
}
@Override
public float getDestroyProgress(Object blockState, BlockPos pos) {
return FastNMS.INSTANCE.method$BlockStateBase$getDestroyProgress(blockState, serverPlayer(), FastNMS.INSTANCE.field$CraftWorld$ServerLevel(platformPlayer().getWorld()), LocationUtils.toBlockPos(pos));
@@ -773,23 +742,6 @@ public class BukkitServerPlayer extends Player {
return this.entityTypeView;
}
@Override
public DynamicPriorityTracker visualFurnitureView() {
return this.visualFurnitureView;
}
@Override
public void setMaxVisibleFurniture(int maxVisibleFurniture, boolean fromCommand) {
if (fromCommand) {
platformPlayer().getPersistentDataContainer()
.set(MAX_VISIBLE_FURNITURE_KEY, PersistentDataType.INTEGER, maxVisibleFurniture);
this.maxVisibleFurniture = maxVisibleFurniture;
}
this.visualFurnitureView.setMaxVisibleFurniture(
this.maxVisibleFurniture == -1 ? maxVisibleFurniture : this.maxVisibleFurniture
);
}
public void setResendSound() {
resentSoundTick = gameTicks();
}