fix: fix some bugs

fix crash in contain view (#44)

fix tps and mspt send in servux
This commit is contained in:
Helvetica Volubi
2025-08-08 00:59:22 +08:00
parent f3334ae6ec
commit 682029a451
4 changed files with 111 additions and 69 deletions
@@ -29,8 +29,6 @@ import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
import org.bukkit.Bukkit;
import org.leavesmc.leaves.plugin.MinecraftInternalPlugin;
import org.leavesmc.leaves.protocol.core.LeavesCustomPayload; import org.leavesmc.leaves.protocol.core.LeavesCustomPayload;
import org.leavesmc.leaves.protocol.core.LeavesProtocol; import org.leavesmc.leaves.protocol.core.LeavesProtocol;
import org.leavesmc.leaves.protocol.core.ProtocolHandler; import org.leavesmc.leaves.protocol.core.ProtocolHandler;
@@ -102,7 +100,11 @@ public class ServuxEntityDataProtocol implements LeavesProtocol {
} }
public static void onBlockEntityRequest(ServerPlayer player, BlockPos pos) { public static void onBlockEntityRequest(ServerPlayer player, BlockPos pos) {
Bukkit.getGlobalRegionScheduler().run(MinecraftInternalPlugin.INSTANCE, (task) -> { io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueTickTaskQueue(
player.level(),
ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkX(player.position()),
ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkZ(player.position()),
() -> {
BlockEntity be = player.level().getBlockEntity(pos); BlockEntity be = player.level().getBlockEntity(pos);
CompoundTag nbt = be != null ? be.saveWithFullMetadata(player.registryAccess()) : new CompoundTag(); CompoundTag nbt = be != null ? be.saveWithFullMetadata(player.registryAccess()) : new CompoundTag();
@@ -110,11 +112,16 @@ public class ServuxEntityDataProtocol implements LeavesProtocol {
payload.pos = pos.immutable(); payload.pos = pos.immutable();
payload.nbt.merge(nbt); payload.nbt.merge(nbt);
sendPacket(player, payload); sendPacket(player, payload);
}); }
);
} }
public static void onEntityRequest(ServerPlayer player, int entityId) { public static void onEntityRequest(ServerPlayer player, int entityId) {
Bukkit.getGlobalRegionScheduler().run(MinecraftInternalPlugin.INSTANCE, (task) -> { io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueTickTaskQueue(
player.level(),
ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkX(player.position()),
ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkZ(player.position()),
() -> {
Entity entity = player.level().getEntity(entityId); Entity entity = player.level().getEntity(entityId);
CompoundTag nbt = TagUtil.saveEntityWithoutId(entity); CompoundTag nbt = TagUtil.saveEntityWithoutId(entity);
@@ -122,7 +129,8 @@ public class ServuxEntityDataProtocol implements LeavesProtocol {
payload.entityId = entityId; payload.entityId = entityId;
payload.nbt.merge(nbt); payload.nbt.merge(nbt);
sendPacket(player, payload); sendPacket(player, payload);
}); }
);
} }
public static void sendPacket(ServerPlayer player, EntityDataPayload payload) { public static void sendPacket(ServerPlayer player, EntityDataPayload payload) {
@@ -17,6 +17,8 @@
package org.leavesmc.leaves.protocol.servux; package org.leavesmc.leaves.protocol.servux;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import com.mojang.serialization.DataResult; import com.mojang.serialization.DataResult;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
@@ -54,7 +56,7 @@ public class ServuxHudDataProtocol implements LeavesProtocol {
private static final HashMap<ServerPlayer, List<DataLogger.Type>> loggerPlayers = new HashMap<>(); private static final HashMap<ServerPlayer, List<DataLogger.Type>> loggerPlayers = new HashMap<>();
private static final HashMap<DataLogger.Type, DataLogger<?>> LOGGERS = new HashMap<>(); private static final HashMap<DataLogger.Type, DataLogger<?>> LOGGERS = new HashMap<>();
private static final HashMap<DataLogger.Type, Tag> DATA = new HashMap<>(); private static final Table<DataLogger.Type, ServerPlayer, Tag> DATA = HashBasedTable.create();
public static boolean refreshSpawnMetadata = false; public static boolean refreshSpawnMetadata = false;
@@ -237,12 +239,16 @@ public class ServuxHudDataProtocol implements LeavesProtocol {
MinecraftServer server = MinecraftServer.getServer(); MinecraftServer server = MinecraftServer.getServer();
if (server.getTickCount() % fun.bm.lophine.config.modules.misc.SurvuxProtocolConfig.hudUpdateInterval == 0) { if (server.getTickCount() % fun.bm.lophine.config.modules.misc.SurvuxProtocolConfig.hudUpdateInterval == 0) {
DATA.clear();
LOGGERS.forEach((type, logger) -> { LOGGERS.forEach((type, logger) -> {
if (!isLoggerTypeEnabled(type)) { if (!isLoggerTypeEnabled(type)) {
return; return;
} }
DATA.put(type, logger.getResult(server)); for (ServerPlayer player : players) {
Tag ret = logger.getResult(server, this, player);
if (ret != null) {
DATA.put(type, player, ret);
}
}
}); });
} }
@@ -254,14 +260,20 @@ public class ServuxHudDataProtocol implements LeavesProtocol {
CompoundTag nbt = new CompoundTag(); CompoundTag nbt = new CompoundTag();
for (DataLogger.Type type : list) { for (DataLogger.Type type : list) {
if (DATA.containsKey(type)) { Tag data = DATA.get(type, player);
nbt.put(type.getSerializedName(), DATA.get(type)); if (data != null) {
nbt.put(type.getSerializedName(), data);
DATA.remove(type, player);
} }
} }
sendPacket(player, new HudDataPayload(HudDataPayloadType.PACKET_S2C_DATA_LOGGER_TICK, nbt)); sendPacket(player, new HudDataPayload(HudDataPayloadType.PACKET_S2C_DATA_LOGGER_TICK, nbt));
} }
} }
public void applyData(DataLogger.Type type, ServerPlayer player, Tag tag) {
DATA.put(type, player, tag);
}
@Override @Override
public boolean isActive() { public boolean isActive() {
return fun.bm.lophine.config.modules.misc.SurvuxProtocolConfig.hudMetadataProtocol; return fun.bm.lophine.config.modules.misc.SurvuxProtocolConfig.hudMetadataProtocol;
@@ -146,6 +146,11 @@ public class ServuxLitematicsProtocol implements LeavesProtocol {
if (!hasPermission(player)) { if (!hasPermission(player)) {
return; return;
} }
io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueTickTaskQueue(
player.level(),
ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkX(player.position()),
ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkZ(player.position()),
() -> {
BlockEntity be = player.level().getBlockEntity(pos); BlockEntity be = player.level().getBlockEntity(pos);
CompoundTag tag = be != null ? be.saveWithFullMetadata(MinecraftServer.getServer().registryAccess()) : new CompoundTag(); CompoundTag tag = be != null ? be.saveWithFullMetadata(MinecraftServer.getServer().registryAccess()) : new CompoundTag();
ServuxLitematicaPayload payload = new ServuxLitematicaPayload(ServuxLitematicaPayloadType.PACKET_S2C_BLOCK_NBT_RESPONSE_SIMPLE); ServuxLitematicaPayload payload = new ServuxLitematicaPayload(ServuxLitematicaPayloadType.PACKET_S2C_BLOCK_NBT_RESPONSE_SIMPLE);
@@ -153,11 +158,18 @@ public class ServuxLitematicsProtocol implements LeavesProtocol {
payload.nbt = tag; payload.nbt = tag;
encodeServerData(player, payload); encodeServerData(player, payload);
} }
);
}
public static void onEntityRequest(ServerPlayer player, int entityId) { public static void onEntityRequest(ServerPlayer player, int entityId) {
if (!hasPermission(player)) { if (!hasPermission(player)) {
return; return;
} }
io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueTickTaskQueue(
player.level(),
ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkX(player.position()),
ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkZ(player.position()),
() -> {
Entity entity = player.level().getEntity(entityId); Entity entity = player.level().getEntity(entityId);
if (entity == null) { if (entity == null) {
return; return;
@@ -176,6 +188,8 @@ public class ServuxLitematicsProtocol implements LeavesProtocol {
encodeServerData(player, payload); encodeServerData(player, payload);
} }
} }
);
}
public static void onBulkEntityRequest(ServerPlayer player, ChunkPos chunkPos, CompoundTag req) { public static void onBulkEntityRequest(ServerPlayer player, ChunkPos chunkPos, CompoundTag req) {
if (req == null || req.isEmpty()) { if (req == null || req.isEmpty()) {
@@ -19,6 +19,7 @@ package org.leavesmc.leaves.protocol.servux.logger;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import io.papermc.paper.threadedregions.TickRegionScheduler;
import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntMap;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.NbtOps;
@@ -26,11 +27,13 @@ import net.minecraft.nbt.Tag;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.ServerTickRateManager; import net.minecraft.server.ServerTickRateManager;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.StringRepresentable; import net.minecraft.util.StringRepresentable;
import net.minecraft.world.entity.MobCategory; import net.minecraft.world.entity.MobCategory;
import net.minecraft.world.level.NaturalSpawner; import net.minecraft.world.level.NaturalSpawner;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.leavesmc.leaves.protocol.servux.ServuxHudDataProtocol;
import org.leavesmc.leaves.protocol.servux.logger.data.MobCapData; import org.leavesmc.leaves.protocol.servux.logger.data.MobCapData;
import org.leavesmc.leaves.protocol.servux.logger.data.TickData; import org.leavesmc.leaves.protocol.servux.logger.data.TickData;
@@ -49,7 +52,7 @@ public abstract class DataLogger<T extends Tag> {
return this.type; return this.type;
} }
public abstract T getResult(MinecraftServer server); public abstract T getResult(MinecraftServer server, ServuxHudDataProtocol protocol, ServerPlayer player);
public enum Type implements StringRepresentable { public enum Type implements StringRepresentable {
TPS("tps", Tps::new, Tps.CODEC), TPS("tps", Tps::new, Tps.CODEC),
@@ -105,31 +108,36 @@ public abstract class DataLogger<T extends Tag> {
} }
@Override @Override
public CompoundTag getResult(MinecraftServer server) { public CompoundTag getResult(MinecraftServer server, ServuxHudDataProtocol protocol, ServerPlayer player) {
try { this.build(server, protocol, player);
return (CompoundTag) TickData.CODEC.encodeStart(server.registryAccess().createSerializationContext(NbtOps.INSTANCE), this.build(server)).getOrThrow(); return null;
} catch (Exception e) {
return new CompoundTag();
}
} }
private TickData build(MinecraftServer server) { private TickData build(MinecraftServer server, ServuxHudDataProtocol protocol, ServerPlayer player) {
io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueTickTaskQueue(
player.level(),
ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkX(player.position()),
ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkZ(player.position()),
() -> {
ServerTickRateManager tickManager = server.tickRateManager(); ServerTickRateManager tickManager = server.tickRateManager();
boolean frozen = tickManager.isFrozen(); boolean frozen = tickManager.isFrozen();
boolean sprinting = tickManager.isSprinting(); boolean sprinting = tickManager.isSprinting();
final double mspt = server.tickTimes5s.getAverage(); io.papermc.paper.threadedregions.TickData.TickReportData tickData = TickRegionScheduler.getCurrentRegion().getData().getRegionSchedulingHandle().getTickReport5s(System.nanoTime());
double tps = 1000.0D / Math.max(sprinting ? 0.0 : tickManager.millisecondsPerTick(), mspt); final double tps = tickData.tpsData().segmentAll().average();
final double mspt = tickData.timePerTickData().segmentAll().average() / 1.0E6;
if (frozen) { TickData tk = new TickData(
tps = 0.0d;
}
return new TickData(
mspt, tps, mspt, tps,
tickManager.getRemainingSprintTicks(), tickManager.getRemainingSprintTicks(),
frozen, sprinting, frozen, sprinting,
tickManager.isSteppingForward() tickManager.isSteppingForward()
); );
Tag ret = TickData.CODEC.encodeStart(server.registryAccess().createSerializationContext(NbtOps.INSTANCE), tk).getOrThrow();
protocol.applyData(Type.TPS, player, ret);
}
);
return null;
} }
} }
@@ -142,7 +150,7 @@ public abstract class DataLogger<T extends Tag> {
} }
@Override @Override
public CompoundTag getResult(MinecraftServer server) { public CompoundTag getResult(MinecraftServer server, ServuxHudDataProtocol protocol, ServerPlayer player) {
CompoundTag nbt = new CompoundTag(); CompoundTag nbt = new CompoundTag();
for (ServerLevel world : server.getAllLevels()) { for (ServerLevel world : server.getAllLevels()) {