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:
@@ -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());
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user