202 lines
7.9 KiB
Diff
202 lines
7.9 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
From: MrHua269 <wangxyper@163.com>
|
||
Date: Wed, 29 Jan 2025 09:12:07 +0800
|
||
Subject: [PATCH] KioCG Chunk API and display of chunkhot in tpsbar
|
||
|
||
|
||
diff --git a/src/main/java/com/kiocg/ChunkHot.java b/src/main/java/com/kiocg/ChunkHot.java
|
||
new file mode 100644
|
||
index 0000000000000000000000000000000000000000..53b4397997bc9b9b9d88e48304b37a2590161906
|
||
--- /dev/null
|
||
+++ b/src/main/java/com/kiocg/ChunkHot.java
|
||
@@ -0,0 +1,90 @@
|
||
+package com.kiocg;
|
||
+
|
||
+import java.util.Arrays;
|
||
+
|
||
+public class ChunkHot {
|
||
+ // 热度统计总区间数量
|
||
+ private static final int TIMES_LENGTH = 10;
|
||
+ // 当前统计区间下标
|
||
+ private int index = -1;
|
||
+
|
||
+ // 热度统计区间
|
||
+ private final long[] times = new long[TIMES_LENGTH];
|
||
+ // 存放临时的区间数值
|
||
+ // 用于修正正在统计的当前区间热度没有计入总值的问题
|
||
+ private long temp;
|
||
+ // 所有区间的热度总值
|
||
+ private long total;
|
||
+
|
||
+ // 用于每个具体统计的计算
|
||
+ private long nanos;
|
||
+ // 当前统计是否进行中
|
||
+ private volatile boolean started = false;
|
||
+
|
||
+ /**
|
||
+ * 更新区间下标
|
||
+ */
|
||
+ public void nextTick() {
|
||
+ this.index = ++this.index % TIMES_LENGTH;
|
||
+ }
|
||
+
|
||
+ /**
|
||
+ * 开始统计一个新区间
|
||
+ */
|
||
+ public void start() {
|
||
+ started = true;
|
||
+ temp = times[this.index];
|
||
+ times[this.index] = 0L;
|
||
+ }
|
||
+
|
||
+ public boolean isStarted(){
|
||
+ return this.started;
|
||
+ }
|
||
+
|
||
+ /**
|
||
+ * 结束当前区间的统计
|
||
+ * 将统计值更新入热度总值
|
||
+ */
|
||
+ public void stop() {
|
||
+ started = false;
|
||
+ total -= temp;
|
||
+ total += times[this.index];
|
||
+ }
|
||
+
|
||
+ /**
|
||
+ * 开始一个具体统计
|
||
+ */
|
||
+ public void startTicking() {
|
||
+ if (!started) return;
|
||
+ nanos = System.nanoTime();
|
||
+ }
|
||
+
|
||
+ /**
|
||
+ * 结束一个具体统计
|
||
+ * 将统计值计入当前热度区间
|
||
+ */
|
||
+ public void stopTickingAndCount() {
|
||
+ if (!started) return;
|
||
+ // 定义一个具体统计的最大值为 1,000,000
|
||
+ // 有时候某个具体统计的计算值会在某1刻飙升,可能是由于保存数据到磁盘?
|
||
+ times[this.index] += Math.min(System.nanoTime() - nanos, 1000000L);
|
||
+ }
|
||
+
|
||
+ /**
|
||
+ * 清空统计 (当区块卸载时)
|
||
+ */
|
||
+ public void clear() {
|
||
+ started = false;
|
||
+ Arrays.fill(times, 0L);
|
||
+ temp = 0L;
|
||
+ total = 0L;
|
||
+ nanos = 0L;
|
||
+ }
|
||
+
|
||
+ /**
|
||
+ * @return 获取区块热度平均值
|
||
+ */
|
||
+ public long getAverage() {
|
||
+ return total / ((long) TIMES_LENGTH * 20L);
|
||
+ }
|
||
+}
|
||
diff --git a/src/main/java/me/earthme/luminol/config/modules/misc/TpsBarConfig.java b/src/main/java/me/earthme/luminol/config/modules/misc/TpsBarConfig.java
|
||
index aafb2f5052c7c8e5971a47308253badb3027093c..9fe7ac7ba83bbcc9a2a851a5cace47641323f4d2 100644
|
||
--- a/src/main/java/me/earthme/luminol/config/modules/misc/TpsBarConfig.java
|
||
+++ b/src/main/java/me/earthme/luminol/config/modules/misc/TpsBarConfig.java
|
||
@@ -12,11 +12,13 @@ public class TpsBarConfig implements IConfigModule {
|
||
@ConfigInfo(baseName = "enabled")
|
||
public static boolean tpsbarEnabled = false;
|
||
@ConfigInfo(baseName = "format")
|
||
- public static String tpsBarFormat = "<gray>TPS<yellow>:</yellow> <tps> MSPT<yellow>:</yellow> <mspt> Ping<yellow>:</yellow> <ping>ms";
|
||
+ public static String tpsBarFormat = "<gray>TPS<yellow>:</yellow> <tps> MSPT<yellow>:</yellow> <mspt> Ping<yellow>:</yellow> <ping>ms ChunkHot<yellow>:</yellow> <chunkhot>";
|
||
@ConfigInfo(baseName = "tps_color_list")
|
||
public static List<String> tpsColors = List.of("GREEN","YELLOW","RED","PURPLE");
|
||
@ConfigInfo(baseName = "ping_color_list")
|
||
public static List<String> pingColors = List.of("GREEN","YELLOW","RED","PURPLE");
|
||
+ @ConfigInfo(baseName = "chunkhot_color_list")
|
||
+ public static List<String> chunkHotColors = List.of("GREEN","YELLOW","RED","PURPLE");
|
||
@ConfigInfo(baseName = "update_interval_ticks")
|
||
public static int updateInterval = 15;
|
||
|
||
diff --git a/src/main/java/me/earthme/luminol/functions/GlobalServerTpsBar.java b/src/main/java/me/earthme/luminol/functions/GlobalServerTpsBar.java
|
||
index de2f03d6e771c09e8da2da454b7ec4a16c0a17ab..0b7347e8fdf995900221ee4aa4e97a4d260c6f9f 100644
|
||
--- a/src/main/java/me/earthme/luminol/functions/GlobalServerTpsBar.java
|
||
+++ b/src/main/java/me/earthme/luminol/functions/GlobalServerTpsBar.java
|
||
@@ -128,7 +128,8 @@ public class GlobalServerTpsBar {
|
||
TpsBarConfig.tpsBarFormat,
|
||
Placeholder.component("tps",getTpsComponent(tps)),
|
||
Placeholder.component("mspt",getMsptComponent(mspt)),
|
||
- Placeholder.component("ping",getPingComponent(player.getPing()))
|
||
+ Placeholder.component("ping",getPingComponent(player.getPing())),
|
||
+ Placeholder.component("chunkhot",getChunkHotComponent(player.getNearbyChunkHot()))
|
||
));
|
||
bar.color(barColorFromTps(tps));
|
||
bar.progress((float) Math.min((float)1,Math.max(mspt / 50,0)));
|
||
@@ -170,6 +171,32 @@ public class GlobalServerTpsBar {
|
||
return MiniMessage.miniMessage().deserialize(replaced,Placeholder.parsed("text", String.format("%.2f", mspt)));
|
||
}
|
||
|
||
+ private static @NotNull Component getChunkHotComponent(long chunkHot){
|
||
+ final BossBar.Color colorBukkit = barColorFromChunkHot(chunkHot);
|
||
+ final String colorString = colorBukkit.name();
|
||
+
|
||
+ final String content = "<%s><text></%s>";
|
||
+ final String replaced = String.format(content,colorString,colorString);
|
||
+
|
||
+ return MiniMessage.miniMessage().deserialize(replaced,Placeholder.parsed("text", String.valueOf(chunkHot)));
|
||
+ }
|
||
+
|
||
+ private static BossBar.Color barColorFromChunkHot(long chunkHot){
|
||
+ if (chunkHot == -1){
|
||
+ return BossBar.Color.valueOf(TpsBarConfig.chunkHotColors.get(3));
|
||
+ }
|
||
+
|
||
+ if (chunkHot <= 300000L){
|
||
+ return BossBar.Color.valueOf(TpsBarConfig.chunkHotColors.get(0));
|
||
+ }
|
||
+
|
||
+ if (chunkHot <= 500000L){
|
||
+ return BossBar.Color.valueOf(TpsBarConfig.chunkHotColors.get(1));
|
||
+ }
|
||
+
|
||
+ return BossBar.Color.valueOf(TpsBarConfig.chunkHotColors.get(2));
|
||
+ }
|
||
+
|
||
private static BossBar.Color barColorFromMspt(double mspt){
|
||
if (mspt == -1){
|
||
return BossBar.Color.valueOf(TpsBarConfig.tpsColors.get(3));
|
||
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
|
||
index de8b9048c8395c05b8688bc9d984b8ad680f15b3..f42692cd4f0154705c3d5b030d281cfc333803ed 100644
|
||
--- a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
|
||
+++ b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
|
||
@@ -437,4 +437,12 @@ public class CraftChunk implements Chunk {
|
||
static {
|
||
Arrays.fill(FULL_LIGHT, (byte) 0xFF);
|
||
}
|
||
+
|
||
+ // KioCG start - ChunkHot
|
||
+ @Override
|
||
+ public long getChunkHotAvg() {
|
||
+ final net.minecraft.world.level.chunk.LevelChunk target = this.worldServer.getChunkIfLoaded(this.x,this.z);
|
||
+ return target == null ? -1 : target.getChunkHot().getAverage();
|
||
+ }
|
||
+ // KioCG end
|
||
}
|
||
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||
index 7a112a3a0a9411a166666c657dac6b7888105545..8e9190da44839ba62880cf3218b5d5aaf300e34f 100644
|
||
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||
@@ -3605,4 +3605,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
||
handle.containerMenu.broadcastChanges();
|
||
return new PaperPlayerGiveResult(leftovers.build(), drops.build());
|
||
}
|
||
+
|
||
+ // KioCG start - ChunkHot
|
||
+ @Override
|
||
+ public long getNearbyChunkHot() {
|
||
+ return this.getHandle().getNearbyChunkHot();
|
||
+ }
|
||
+ // KioCG end
|
||
}
|