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