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

fix(bukkit): 修复一些问题

This commit is contained in:
jhqwqmc
2025-05-19 13:01:50 +08:00
parent 6070b5184f
commit 924a992921
10 changed files with 142 additions and 30 deletions

View File

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

View File

@@ -0,0 +1,36 @@
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

@@ -52,15 +52,16 @@ public class TestCommand extends BukkitCommandFeature<CommandSender> {
.handler(context -> {
Player player = context.sender();
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());
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());
});
}

View File

@@ -1605,12 +1605,13 @@ public class PacketConsumers {
if (user.visualFurnitureView().getTotalMembers() <= Config.maxVisibleFurniture()) {
user.sendPacket(furniture.spawnPacket(player), false);
}
int[] entityIdsArray = new int[fakeEntityIds.size() + 1];
entityIdsArray[0] = entityId;
int[] entityIdsArray = new int[fakeEntityIds.size() + 2];
entityIdsArray[0] = -114514;
entityIdsArray[1] = entityId;
for (int i = 0; i < fakeEntityIds.size(); i++) {
entityIdsArray[i + 1] = fakeEntityIds.get(i);
entityIdsArray[i + 2] = fakeEntityIds.get(i);
}
double distance = player.getLocation().distance(furniture.location());
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()) {
@@ -1665,12 +1666,24 @@ public class PacketConsumers {
FriendlyByteBuf buf = event.getBuffer();
boolean isChange = false;
IntList intList = buf.readIntIdList();
int first = intList.getFirst();
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;
if (first != -114514) {
EntityPacketHandler handler = user.entityPacketHandlers().remove(entityId);
if (handler != null && handler.handleEntitiesRemove(intList)) {
user.visualFurnitureView().removeByEntityId(entityId);
isChange = true;
}
} else {
if (entityId == first) {
intList.removeFirst();
isChange = true;
}
EntityPacketHandler handler = user.entityPacketHandlers().get(entityId);
if (handler != null && handler.handleEntitiesRemove(intList)) {
isChange = true;
}
}
}
if (isChange) {

View File

@@ -31,16 +31,14 @@ import net.momirealms.craftengine.core.util.VersionHelper;
import net.momirealms.craftengine.core.world.BlockPos;
import net.momirealms.craftengine.core.world.World;
import net.momirealms.craftengine.core.world.WorldEvents;
import org.bukkit.FluidCollisionMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.SoundCategory;
import org.bukkit.*;
import org.bukkit.attribute.Attribute;
import org.bukkit.attribute.AttributeInstance;
import org.bukkit.block.Block;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.persistence.PersistentDataType;
import org.bukkit.util.RayTraceResult;
import org.jetbrains.annotations.Nullable;
@@ -50,6 +48,7 @@ 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;
@@ -98,6 +97,7 @@ 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();
@@ -112,6 +112,9 @@ 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
@@ -348,11 +351,11 @@ public class BukkitServerPlayer extends Player {
}
if (this.gameTicks % 30 == 0) {
this.updateGUI();
this.updateVisualFurnitureView();
}
if (this.isDestroyingBlock) {
this.tickBlockDestroy();
}
this.updateVisualFurnitureView();
if (Config.predictBreaking() && !this.isDestroyingCustomBlock) {
// if it's not destroying blocks, we do predict
if ((gameTicks() + entityID()) % Config.predictBreakingInterval() == 0) {
@@ -379,7 +382,7 @@ public class BukkitServerPlayer extends Player {
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());
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()) {
@@ -768,6 +771,18 @@ public class BukkitServerPlayer extends Player {
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();
}