9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-31 04:46:37 +00:00

feat(bukkit): 添加限制可视家具数量

This commit is contained in:
jhqwqmc
2025-05-18 00:18:22 +08:00
parent ee10b56090
commit df86e822db
5 changed files with 238 additions and 14 deletions

View File

@@ -1,6 +1,9 @@
package net.momirealms.craftengine.bukkit.plugin.command.feature;
import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager;
import net.momirealms.craftengine.bukkit.entity.furniture.LoadedFurniture;
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;
@@ -38,19 +41,26 @@ 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();
player.sendMessage("开始测试");
NamespacedKey key = context.get("setTag");
player.sendMessage("结束测试");
BukkitServerPlayer cePlayer = plugin().adapt(player);
player.sendMessage("visualFurnitureView1: " + cePlayer.visualFurnitureView().getTotalMembers());
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());
});
}

View File

@@ -1598,8 +1598,28 @@ public class PacketConsumers {
// Furniture
LoadedFurniture furniture = BukkitFurnitureManager.instance().loadedFurnitureByRealEntityId(entityId);
if (furniture != null) {
user.entityPacketHandlers().computeIfAbsent(entityId, k -> new FurniturePacketHandler(furniture.fakeEntityIds()));
user.sendPacket(furniture.spawnPacket((Player) user.platformPlayer()), false);
Player player = (Player) user.platformPlayer();
List<Integer> fakeEntityIds = furniture.fakeEntityIds();
user.entityPacketHandlers().computeIfAbsent(entityId, k -> new FurniturePacketHandler(fakeEntityIds));
if (user.visualFurnitureView().getTotalMembers() <= 100) {
user.sendPacket(furniture.spawnPacket(player), false);
}
int[] entityIdsArray = new int[fakeEntityIds.size() + 1];
entityIdsArray[0] = entityId;
for (int i = 0; i < fakeEntityIds.size(); i++) {
entityIdsArray[i + 1] = fakeEntityIds.get(i);
}
double distance = player.getLocation().distance(furniture.location());
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()) {
LoadedFurniture 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);
}
if (Config.hideBaseEntity() && !furniture.hasExternalModel()) {
event.setCancelled(true);
}
@@ -1645,6 +1665,7 @@ public class PacketConsumers {
int entityId = intList.getInt(i);
EntityPacketHandler handler = user.entityPacketHandlers().remove(entityId);
if (handler != null && handler.handleEntitiesRemove(intList)) {
// user.visualFurnitureView().removeByEntityId(entityId);
isChange = true;
}
}
@@ -1726,7 +1747,7 @@ public class PacketConsumers {
.withParameter(DirectContextParameters.FURNITURE, furniture)
.withParameter(DirectContextParameters.POSITION, new WorldPosition(furniture.world(), furniture.position()))
);
furniture.config().execute(context, EventTrigger.RIGHT_CLICK);;
furniture.config().execute(context, EventTrigger.RIGHT_CLICK);
if (player.isSneaking()) {
// try placing another furniture above it

View File

@@ -4,6 +4,8 @@ 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.BukkitFurnitureManager;
import net.momirealms.craftengine.bukkit.entity.furniture.LoadedFurniture;
import net.momirealms.craftengine.bukkit.item.BukkitItemManager;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
@@ -23,6 +25,7 @@ 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;
@@ -97,6 +100,7 @@ public class BukkitServerPlayer extends Player {
private double cachedInteractionRange;
private final Map<Integer, EntityPacketHandler> entityTypeView = new ConcurrentHashMap<>();
private final DynamicPriorityTracker visualFurnitureView = new DynamicPriorityTracker(100);
public BukkitServerPlayer(BukkitCraftEngine plugin, Channel channel) {
this.channel = channel;
@@ -344,6 +348,7 @@ public class BukkitServerPlayer extends Player {
}
if (this.gameTicks % 30 == 0) {
this.updateGUI();
this.updateVisualFurnitureView();
}
if (this.isDestroyingBlock) {
this.tickBlockDestroy();
@@ -368,6 +373,25 @@ public class BukkitServerPlayer extends Player {
}
}
private void updateVisualFurnitureView() {
if (visualFurnitureView().getTotalMembers() <= 100) return;
for (DynamicPriorityTracker.Element element : visualFurnitureView().getAllElements()) {
LoadedFurniture furniture = BukkitFurnitureManager.instance().loadedFurnitureByRealEntityId(element.entityId());
if (furniture == null || !furniture.isValid()) continue;
double distance = platformPlayer().getLocation().distance(furniture.location());
DynamicPriorityTracker.Element newElement = new DynamicPriorityTracker.Element(element.entityId(), distance, element.removePacket());
DynamicPriorityTracker.UpdateResult result = visualFurnitureView().addOrUpdateElement(newElement);
for (DynamicPriorityTracker.Element resultElement : result.getEntered()) {
LoadedFurniture 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));
@@ -738,6 +762,11 @@ public class BukkitServerPlayer extends Player {
return this.entityTypeView;
}
@Override
public DynamicPriorityTracker visualFurnitureView() {
return this.visualFurnitureView;
}
public void setResendSound() {
resentSoundTick = gameTicks();
}