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,27 +100,37 @@ 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(
BlockEntity be = player.level().getBlockEntity(pos); player.level(),
CompoundTag nbt = be != null ? be.saveWithFullMetadata(player.registryAccess()) : new CompoundTag(); ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkX(player.position()),
ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkZ(player.position()),
() -> {
BlockEntity be = player.level().getBlockEntity(pos);
CompoundTag nbt = be != null ? be.saveWithFullMetadata(player.registryAccess()) : new CompoundTag();
EntityDataPayload payload = new EntityDataPayload(EntityDataPayloadType.PACKET_S2C_BLOCK_NBT_RESPONSE_SIMPLE); EntityDataPayload payload = new EntityDataPayload(EntityDataPayloadType.PACKET_S2C_BLOCK_NBT_RESPONSE_SIMPLE);
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(
Entity entity = player.level().getEntity(entityId); player.level(),
CompoundTag nbt = TagUtil.saveEntityWithoutId(entity); ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkX(player.position()),
ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkZ(player.position()),
() -> {
Entity entity = player.level().getEntity(entityId);
CompoundTag nbt = TagUtil.saveEntityWithoutId(entity);
EntityDataPayload payload = new EntityDataPayload(EntityDataPayloadType.PACKET_S2C_ENTITY_NBT_RESPONSE_SIMPLE); EntityDataPayload payload = new EntityDataPayload(EntityDataPayloadType.PACKET_S2C_ENTITY_NBT_RESPONSE_SIMPLE);
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,35 +146,49 @@ public class ServuxLitematicsProtocol implements LeavesProtocol {
if (!hasPermission(player)) { if (!hasPermission(player)) {
return; return;
} }
BlockEntity be = player.level().getBlockEntity(pos); io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueTickTaskQueue(
CompoundTag tag = be != null ? be.saveWithFullMetadata(MinecraftServer.getServer().registryAccess()) : new CompoundTag(); player.level(),
ServuxLitematicaPayload payload = new ServuxLitematicaPayload(ServuxLitematicaPayloadType.PACKET_S2C_BLOCK_NBT_RESPONSE_SIMPLE); ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkX(player.position()),
payload.pos = pos; ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkZ(player.position()),
payload.nbt = tag; () -> {
encodeServerData(player, payload); BlockEntity be = player.level().getBlockEntity(pos);
CompoundTag tag = be != null ? be.saveWithFullMetadata(MinecraftServer.getServer().registryAccess()) : new CompoundTag();
ServuxLitematicaPayload payload = new ServuxLitematicaPayload(ServuxLitematicaPayloadType.PACKET_S2C_BLOCK_NBT_RESPONSE_SIMPLE);
payload.pos = pos;
payload.nbt = tag;
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;
} }
Entity entity = player.level().getEntity(entityId); io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueTickTaskQueue(
if (entity == null) { player.level(),
return; ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkX(player.position()),
} ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkZ(player.position()),
CompoundTag tag = new CompoundTag(); () -> {
ServuxLitematicaPayload payload = new ServuxLitematicaPayload(ServuxLitematicaPayloadType.PACKET_S2C_ENTITY_NBT_RESPONSE_SIMPLE); Entity entity = player.level().getEntity(entityId);
payload.entityId = entityId; if (entity == null) {
if (entity instanceof net.minecraft.world.entity.player.Player) { return;
ResourceLocation loc = EntityType.getKey(entity.getType()); }
tag = TagUtil.saveEntity(entity); CompoundTag tag = new CompoundTag();
tag.putString("id", loc.toString()); ServuxLitematicaPayload payload = new ServuxLitematicaPayload(ServuxLitematicaPayloadType.PACKET_S2C_ENTITY_NBT_RESPONSE_SIMPLE);
payload.nbt = tag; payload.entityId = entityId;
encodeServerData(player, payload); if (entity instanceof net.minecraft.world.entity.player.Player) {
} else if (TagUtil.saveEntityAsPassenger(entity, tag)) { ResourceLocation loc = EntityType.getKey(entity.getType());
payload.nbt = tag; tag = TagUtil.saveEntity(entity);
encodeServerData(player, payload); tag.putString("id", loc.toString());
} payload.nbt = tag;
encodeServerData(player, payload);
} else if (TagUtil.saveEntityAsPassenger(entity, tag)) {
payload.nbt = tag;
encodeServerData(player, payload);
}
}
);
} }
public static void onBulkEntityRequest(ServerPlayer player, ChunkPos chunkPos, CompoundTag req) { public static void onBulkEntityRequest(ServerPlayer player, ChunkPos chunkPos, CompoundTag req) {
@@ -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) {
ServerTickRateManager tickManager = server.tickRateManager(); io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueTickTaskQueue(
boolean frozen = tickManager.isFrozen(); player.level(),
boolean sprinting = tickManager.isSprinting(); ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkX(player.position()),
final double mspt = server.tickTimes5s.getAverage(); ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkZ(player.position()),
double tps = 1000.0D / Math.max(sprinting ? 0.0 : tickManager.millisecondsPerTick(), mspt); () -> {
ServerTickRateManager tickManager = server.tickRateManager();
boolean frozen = tickManager.isFrozen();
boolean sprinting = tickManager.isSprinting();
io.papermc.paper.threadedregions.TickData.TickReportData tickData = TickRegionScheduler.getCurrentRegion().getData().getRegionSchedulingHandle().getTickReport5s(System.nanoTime());
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; mspt, tps,
} tickManager.getRemainingSprintTicks(),
frozen, sprinting,
return new TickData( tickManager.isSteppingForward()
mspt, tps, );
tickManager.getRemainingSprintTicks(), Tag ret = TickData.CODEC.encodeStart(server.registryAccess().createSerializationContext(NbtOps.INSTANCE), tk).getOrThrow();
frozen, sprinting, protocol.applyData(Type.TPS, player, ret);
tickManager.isSteppingForward() }
); );
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()) {