521 lines
26 KiB
Diff
521 lines
26 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
From: MrHua269 <wangxyper@163.com>
|
||
Date: Sat, 30 Nov 2024 12:28:45 +0800
|
||
Subject: [PATCH] KioCG Chunk API and display of chunkhot in tpsbar
|
||
|
||
|
||
diff --git a/src/main/java/ca/spottedleaf/moonrise/common/util/ChunkSystem.java b/src/main/java/ca/spottedleaf/moonrise/common/util/ChunkSystem.java
|
||
index e1aba122e1c3d8b28ca16137fb15bcee07cdf0e7..af4bb03fda9ee9a8081e2a6345ebe86d18cdaacc 100644
|
||
--- a/src/main/java/ca/spottedleaf/moonrise/common/util/ChunkSystem.java
|
||
+++ b/src/main/java/ca/spottedleaf/moonrise/common/util/ChunkSystem.java
|
||
@@ -127,6 +127,7 @@ public final class ChunkSystem {
|
||
}
|
||
|
||
public static void onChunkNotTicking(final LevelChunk chunk, final ChunkHolder holder) {
|
||
+ chunk.getChunkHot().clear(); // KioCG
|
||
chunk.getLevel().getCurrentWorldData().removeTickingChunk(chunk.moonrise$getChunkAndHolder()); // Folia - region threading
|
||
((ChunkTickServerLevel)(ServerLevel)chunk.getLevel()).moonrise$removeChunkForPlayerTicking(chunk); // Moonrise - chunk tick iteration
|
||
}
|
||
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 026807e0851d67c6d57e81f573ac1bf8fedc6109..c45f6bd60d1cf7a915aa6ceea07c0929507b86e2 100644
|
||
--- a/src/main/java/me/earthme/luminol/functions/GlobalServerTpsBar.java
|
||
+++ b/src/main/java/me/earthme/luminol/functions/GlobalServerTpsBar.java
|
||
@@ -138,7 +138,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)));
|
||
@@ -180,6 +181,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/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||
index d54b5a0c4efd25d2792ab0ff69985eab663ab253..90f4e67daa58088d06f61f005acf2a67e8f41da3 100644
|
||
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
||
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||
@@ -1800,6 +1800,29 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||
} finally { foliaProfiler.stopTimer(ca.spottedleaf.leafprofiler.LProfilerRegistry.ENTITY_SCHEDULER_TICK); } // Folia - profiler
|
||
}
|
||
// Folia end - region threading
|
||
+ // KioCG start - ChunkHot
|
||
+ final ca.spottedleaf.moonrise.common.list.IteratorSafeOrderedReferenceSet<net.minecraft.world.level.chunk.LevelChunk> chunks = new ca.spottedleaf.moonrise.common.list.IteratorSafeOrderedReferenceSet<>();
|
||
+ if (region != null){
|
||
+ for (net.minecraft.server.level.ServerChunkCache.ChunkAndHolder chunkAndHolder : region.world.getCurrentWorldData().getTickingChunks()){
|
||
+ final net.minecraft.world.level.chunk.LevelChunk chunk = chunkAndHolder.chunk();
|
||
+
|
||
+ if (!ca.spottedleaf.moonrise.common.util.TickThread.isTickThreadFor(region.world, chunk.locX, chunk.locZ)){
|
||
+ continue;
|
||
+ }
|
||
+
|
||
+ chunks.add(chunk);
|
||
+ }
|
||
+ }
|
||
+ if (region != null && io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick() % 20 == 0){
|
||
+ final Iterator<net.minecraft.world.level.chunk.LevelChunk> chunkIterator = chunks.unsafeIterator();
|
||
+ while (chunkIterator.hasNext()){
|
||
+ final net.minecraft.world.level.chunk.LevelChunk targetChunk = chunkIterator.next();
|
||
+
|
||
+ targetChunk.getChunkHot().nextTick();
|
||
+ targetChunk.getChunkHot().start();
|
||
+ }
|
||
+ }
|
||
+ //KioCG end
|
||
if (region == null) this.tickRateManager.tick(); // Folia - region threading
|
||
this.tickChildren(shouldKeepTicking, region); // Folia - region threading
|
||
if (region == null && i - this.lastServerStatus >= MinecraftServer.STATUS_EXPIRE_TIME_NANOS) { // Folia - region threading
|
||
@@ -1808,6 +1831,20 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||
}
|
||
|
||
// Folia - region threading
|
||
+ // KioCG start - ChunkHot
|
||
+ if (region != null && io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick() % 20 == 0){
|
||
+ final Iterator<net.minecraft.world.level.chunk.LevelChunk> chunkIterator = chunks.unsafeIterator();
|
||
+ while (chunkIterator.hasNext()){
|
||
+ final net.minecraft.world.level.chunk.LevelChunk targetChunk = chunkIterator.next();
|
||
+
|
||
+ if (!targetChunk.getChunkHot().isStarted()){
|
||
+ continue;
|
||
+ }
|
||
+
|
||
+ targetChunk.getChunkHot().stop();
|
||
+ }
|
||
+ }
|
||
+ //KioCG end
|
||
// Paper start - Incremental chunk and player saving
|
||
final ProfilerFiller profiler = Profiler.get();
|
||
int playerSaveInterval = io.papermc.paper.configuration.GlobalConfiguration.get().playerAutoSave.rate;
|
||
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||
index 230b448d8dd5c49e2cd45d9f06a439912402d914..0eba44f94da54716e94f00b919124eedbed53514 100644
|
||
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||
@@ -1381,6 +1381,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||
final int timerId = isActive ? entity.getType().tickTimerId : entity.getType().inactiveTickTimerId;
|
||
final ca.spottedleaf.leafprofiler.RegionizedProfiler.Handle profiler = io.papermc.paper.threadedregions.TickRegionScheduler.getProfiler();
|
||
profiler.startTimer(timerId);
|
||
+ LevelChunk levelChunk = entity.shouldTickHot() ? this.getChunkIfLoaded(entity.moonrise$getSectionX(),entity.moonrise$getSectionZ()) : null; // KioCG
|
||
+ if (levelChunk != null) levelChunk.getChunkHot().startTicking(); try { // KioCG
|
||
try {
|
||
// Folia end - profiler
|
||
if (isActive) { // Paper - EAR 2
|
||
@@ -1398,6 +1400,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||
} else { entity.inactiveTick(); } // Paper - EAR 2
|
||
gameprofilerfiller.pop();
|
||
} finally { profiler.stopTimer(timerId); } // Folia - timer
|
||
+ } finally { if (levelChunk != null) levelChunk.getChunkHot().stopTickingAndCount(); } // KioCG
|
||
Iterator iterator = entity.getPassengers().iterator();
|
||
|
||
while (iterator.hasNext()) {
|
||
@@ -1420,6 +1423,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||
final int timerId = isActive ? passenger.getType().tickTimerId : passenger.getType().inactiveTickTimerId;
|
||
final ca.spottedleaf.leafprofiler.RegionizedProfiler.Handle profiler = io.papermc.paper.threadedregions.TickRegionScheduler.getProfiler();
|
||
profiler.startTimer(timerId);
|
||
+ LevelChunk levelChunk = !(passenger instanceof Player) ? this.getChunkIfLoaded(passenger.blockPosition()) : null; // KioCG
|
||
+ if (levelChunk != null) levelChunk.getChunkHot().startTicking(); try { // KioCG
|
||
try {
|
||
// Folia end - profiler
|
||
passenger.setOldPosAndRot();
|
||
@@ -1460,6 +1465,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||
}
|
||
|
||
} finally { profiler.stopTimer(timerId); } // Folia - profiler
|
||
+ } finally { if (levelChunk != null) levelChunk.getChunkHot().stopTickingAndCount(); } // KioCG
|
||
}
|
||
} else {
|
||
passenger.stopRiding();
|
||
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||
index 225617af39a5ae5f2c0078aa030fb0a42250e9db..824c27f7626c0e12da060286b90c920ad84ae5ff 100644
|
||
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||
@@ -361,6 +361,26 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple
|
||
}
|
||
// Paper end - rewrite chunk system
|
||
|
||
+ // KioCG start - ChunkHot
|
||
+ private volatile long nearbyChunkHot = 0;
|
||
+
|
||
+ public long getNearbyChunkHot() { return this.nearbyChunkHot; }
|
||
+
|
||
+ private long refreshNearbyChunkHot() {
|
||
+ long total = 0L;
|
||
+ int searchRadius = ((ServerLevel) this.level()).moonrise$getViewDistanceHolder().getViewDistances().tickViewDistance();
|
||
+ for (int i = this.moonrise$getSectionX() - searchRadius; i <= this.moonrise$getSectionX() + searchRadius; ++i) {
|
||
+ for (int j = this.moonrise$getSectionZ() - searchRadius; j <= this.moonrise$getSectionZ() + searchRadius; ++j) {
|
||
+ net.minecraft.world.level.chunk.LevelChunk targetChunk = this.level().getChunkIfLoaded(i, j);
|
||
+ if (targetChunk != null) {
|
||
+ total += targetChunk.getChunkHot().getAverage();
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ return total;
|
||
+ }
|
||
+ // KioCG end
|
||
+
|
||
public ServerPlayer(MinecraftServer server, ServerLevel world, GameProfile profile, ClientInformation clientOptions) {
|
||
super(world, world.getSharedSpawnPos(), world.getSharedSpawnAngle(), profile);
|
||
this.chatVisibility = ChatVisiblity.FULL;
|
||
@@ -1205,6 +1225,12 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple
|
||
this.trackEnteredOrExitedLavaOnVehicle();
|
||
this.updatePlayerAttributes();
|
||
this.advancements.flushDirty(this);
|
||
+
|
||
+ // KioCG start - ChunkHot
|
||
+ if (this.tickCount % 20 == 0){
|
||
+ this.nearbyChunkHot = this.refreshNearbyChunkHot();
|
||
+ }
|
||
+ // KioCG end
|
||
}
|
||
|
||
private void updatePlayerAttributes() {
|
||
diff --git a/src/main/java/net/minecraft/world/entity/AreaEffectCloud.java b/src/main/java/net/minecraft/world/entity/AreaEffectCloud.java
|
||
index 7eba7c0e7b8d2795abbe96b3d86a9c1a3b6b74a6..9187de83c6639a34b5725ec5c0cb8d6c30b913eb 100644
|
||
--- a/src/main/java/net/minecraft/world/entity/AreaEffectCloud.java
|
||
+++ b/src/main/java/net/minecraft/world/entity/AreaEffectCloud.java
|
||
@@ -465,4 +465,11 @@ public class AreaEffectCloud extends Entity implements TraceableEntity {
|
||
public final boolean hurtServer(ServerLevel world, DamageSource source, float amount) {
|
||
return false;
|
||
}
|
||
+
|
||
+ // KioCG start
|
||
+ @Override
|
||
+ public boolean shouldTickHot() {
|
||
+ return false;
|
||
+ }
|
||
+ // KioCG end
|
||
}
|
||
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
||
index 75182b1f12ed5ad0ff541aee28b40a72b783230d..e2b7daa6a9af849b49e75a4329b53cca559d1ea9 100644
|
||
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
||
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
||
@@ -6202,4 +6202,6 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
||
return ((net.minecraft.server.level.ServerLevel) this.level).isPositionEntityTicking(this.blockPosition());
|
||
}
|
||
// Paper end - Expose entity id counter
|
||
+
|
||
+ public boolean shouldTickHot() { return this.tickCount > 20 * 10 && this.isAlive(); } // KioCG
|
||
}
|
||
diff --git a/src/main/java/net/minecraft/world/entity/LightningBolt.java b/src/main/java/net/minecraft/world/entity/LightningBolt.java
|
||
index 12127b14babf646711d3a118416453c4f1ac1460..5929cd58066b1a8f305b411af8ac4abc688a5cc6 100644
|
||
--- a/src/main/java/net/minecraft/world/entity/LightningBolt.java
|
||
+++ b/src/main/java/net/minecraft/world/entity/LightningBolt.java
|
||
@@ -302,4 +302,11 @@ public class LightningBolt extends Entity {
|
||
public final boolean hurtServer(ServerLevel world, DamageSource source, float amount) {
|
||
return false;
|
||
}
|
||
+
|
||
+ // KioCG start
|
||
+ @Override
|
||
+ public boolean shouldTickHot() {
|
||
+ return false;
|
||
+ }
|
||
+ // KioCG end
|
||
}
|
||
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
|
||
index 0e0b971c93cdfd8cfae8019c4710f72fdd096c6a..983f5c4188db04b98a60a43f9d890335551ab39b 100644
|
||
--- a/src/main/java/net/minecraft/world/entity/Mob.java
|
||
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
|
||
@@ -1861,4 +1861,11 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab
|
||
public float[] getArmorDropChances() {
|
||
return this.armorDropChances;
|
||
}
|
||
+
|
||
+ // KioCG start
|
||
+ @Override
|
||
+ public boolean shouldTickHot() {
|
||
+ return super.shouldTickHot() && (!this.removeWhenFarAway(0.0) || this.isPersistenceRequired() || this.requiresCustomPersistence());
|
||
+ }
|
||
+ // KioCG end
|
||
}
|
||
diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java b/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java
|
||
index 7b43fcf86984cc200f34c189e7a547996416f379..b4918895a3530836410b56124d9b2ca9091111ba 100644
|
||
--- a/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java
|
||
+++ b/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java
|
||
@@ -173,4 +173,11 @@ public class TraderLlama extends Llama {
|
||
super.start();
|
||
}
|
||
}
|
||
+
|
||
+ // KioCG start
|
||
+ @Override
|
||
+ public boolean shouldTickHot() {
|
||
+ return super.shouldTickHot() && !this.canDespawn();
|
||
+ }
|
||
+ // KioCG end
|
||
}
|
||
diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
|
||
index 1e77cce428d9e53142aaa2cf780b7f862d536eca..f5bad1a9f274cb5a1bdf54a4c575afaa4ab7328f 100644
|
||
--- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
|
||
+++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
|
||
@@ -327,4 +327,12 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill
|
||
return !pos.closerToCenterThan(this.trader.position(), proximityDistance);
|
||
}
|
||
}
|
||
+
|
||
+
|
||
+ // KioCG start
|
||
+ @Override
|
||
+ public boolean shouldTickHot() {
|
||
+ return false;
|
||
+ }
|
||
+ // KioCG end
|
||
}
|
||
diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java
|
||
index e00bcd424d500aa4b76d0fd88eb4b9558d3aece5..d8db54d4f7bbffac216d702cb50f066c7a9b89c2 100644
|
||
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
|
||
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
|
||
@@ -2420,6 +2420,13 @@ public abstract class Player extends LivingEntity {
|
||
return true;
|
||
}
|
||
|
||
+ // KioCG start
|
||
+ @Override
|
||
+ public boolean shouldTickHot() {
|
||
+ return false;
|
||
+ }
|
||
+ // KioCG end
|
||
+
|
||
public static enum BedSleepingProblem {
|
||
|
||
NOT_POSSIBLE_HERE, NOT_POSSIBLE_NOW(Component.translatable("block.minecraft.bed.no_sleep")), TOO_FAR_AWAY(Component.translatable("block.minecraft.bed.too_far_away")), OBSTRUCTED(Component.translatable("block.minecraft.bed.obstructed")), OTHER_PROBLEM, NOT_SAFE(Component.translatable("block.minecraft.bed.not_safe"));
|
||
diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
|
||
index 3a832be7d14276f38f1a35ca9f9a540be7b7d1b4..c26253fee6eeaca010f9232f387c77e17dd79a9f 100644
|
||
--- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
|
||
+++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
|
||
@@ -578,4 +578,11 @@ public abstract class Projectile extends Entity implements TraceableEntity {
|
||
|
||
T create(ServerLevel world, LivingEntity shooter, ItemStack stack);
|
||
}
|
||
+
|
||
+ // KioCG start
|
||
+ @Override
|
||
+ public boolean shouldTickHot() {
|
||
+ return false;
|
||
+ }
|
||
+ // KioCG end
|
||
}
|
||
diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
|
||
index 4bccb94cf953ebd4dfd4f1620ad1784ef235356f..38308b3b25ef421d6379b18506764819aa14ca1d 100644
|
||
--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
|
||
+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
|
||
@@ -94,6 +94,7 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p
|
||
private final LevelChunkTicks<Block> blockTicks;
|
||
private final LevelChunkTicks<Fluid> fluidTicks;
|
||
private LevelChunk.UnsavedListener unsavedListener;
|
||
+ private final com.kiocg.ChunkHot chunkHot = new com.kiocg.ChunkHot(); public com.kiocg.ChunkHot getChunkHot() { return this.chunkHot; } // KioCG
|
||
|
||
public LevelChunk(Level world, ChunkPos pos) {
|
||
this(world, pos, UpgradeData.EMPTY, new LevelChunkTicks<>(), new LevelChunkTicks<>(), 0L, (LevelChunkSection[]) null, (LevelChunk.PostLoadProcessor) null, (BlendingData) null);
|
||
@@ -1080,6 +1081,7 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p
|
||
ProfilerFiller gameprofilerfiller = Profiler.get();
|
||
|
||
gameprofilerfiller.push(this::getType);
|
||
+ LevelChunk.this.chunkHot.startTicking(); // KioCG
|
||
profiler.startTimer(timerId); try { // Folia - profiler
|
||
BlockState iblockdata = LevelChunk.this.getBlockState(blockposition);
|
||
|
||
@@ -1095,7 +1097,7 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p
|
||
}
|
||
// Paper end - Remove the Block Entity if it's invalid
|
||
}
|
||
- } finally { profiler.stopTimer(timerId); } // Folia - profiler
|
||
+ } finally { profiler.stopTimer(timerId); LevelChunk.this.chunkHot.stopTickingAndCount(); } // Folia - profiler // KioCG
|
||
|
||
gameprofilerfiller.pop();
|
||
} catch (Throwable throwable) {
|
||
diff --git a/src/main/java/net/minecraft/world/level/redstone/NeighborUpdater.java b/src/main/java/net/minecraft/world/level/redstone/NeighborUpdater.java
|
||
index e414da8a51bb9b49c28a74eca166046cbee44835..ac22bb47836e97904729bad91ff75ce7abfb30b6 100644
|
||
--- a/src/main/java/net/minecraft/world/level/redstone/NeighborUpdater.java
|
||
+++ b/src/main/java/net/minecraft/world/level/redstone/NeighborUpdater.java
|
||
@@ -73,7 +73,10 @@ public interface NeighborUpdater {
|
||
}
|
||
}
|
||
// CraftBukkit end
|
||
+ net.minecraft.world.level.chunk.LevelChunk levelChunk = world.getChunkIfLoaded(pos); // KioCG
|
||
+ if (levelChunk != null) levelChunk.getChunkHot().startTicking(); try { // KioCG
|
||
state.handleNeighborChanged(world, pos, sourceBlock, orientation, notify);
|
||
+ } finally { if (levelChunk != null) levelChunk.getChunkHot().stopTickingAndCount(); } // KioCG
|
||
// Spigot Start
|
||
} catch (StackOverflowError ex) {
|
||
world.lastPhysicsProblem = new BlockPos(pos);
|
||
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
|
||
index 0074bc0e7147dc3a8c538e796f14ac9bf8725896..90b2bfd12236fce24ddcc48b00e0121f40676d88 100644
|
||
--- a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
|
||
+++ b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
|
||
@@ -436,4 +436,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 611caf02205a7a97aa1175ab6250124d547bd071..f37d75af2f70727090d9efadbe3fd1108cd7e50f 100644
|
||
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||
@@ -3611,4 +3611,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
||
this.getHandle().connection.send(new net.minecraft.network.protocol.game.ClientboundEntityEventPacket(((CraftEntity) target).getHandle(), effect.getData()));
|
||
}
|
||
// Paper end - entity effect API
|
||
+
|
||
+ // KioCG start - ChunkHot
|
||
+ @Override
|
||
+ public long getNearbyChunkHot() {
|
||
+ return this.getHandle().getNearbyChunkHot();
|
||
+ }
|
||
+ // KioCG end
|
||
}
|