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:
@@ -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);
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
}
|
||||
@@ -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("结束测试");
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user