This is generated by calude As it's only change the display, no tests and review are required
131 lines
6.4 KiB
Diff
131 lines
6.4 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: MrHua269 <mrhua269@gmail.com>
|
|
Date: Thu, 9 Jul 2026 10:17:22 +0800
|
|
Subject: [PATCH] Add portal rate limiter
|
|
|
|
|
|
diff --git a/io/papermc/paper/threadedregions/RegionizedWorldData.java b/io/papermc/paper/threadedregions/RegionizedWorldData.java
|
|
index f32d118e1e925b2155cef3fcdcb1e194c541e242..fe17157c4c6fc9ec745c5c11f6837e715d7949ab 100644
|
|
--- a/io/papermc/paper/threadedregions/RegionizedWorldData.java
|
|
+++ b/io/papermc/paper/threadedregions/RegionizedWorldData.java
|
|
@@ -157,6 +157,10 @@ public final class RegionizedWorldData {
|
|
for (final ChunkHolder chunkHolder : from.chunkHoldersToBroadcast) {
|
|
into.chunkHoldersToBroadcast.add(chunkHolder);
|
|
}
|
|
+ // Camellia start - Add portal rate limiter
|
|
+ into.portalRateThrottler.mergeWith(from.portalRateThrottler);
|
|
+ from.portalRateThrottler.destroy();
|
|
+ // Camellia end
|
|
}
|
|
|
|
@Override
|
|
@@ -322,6 +326,12 @@ public final class RegionizedWorldData {
|
|
into.chunkHoldersToBroadcast.add(chunkHolder);
|
|
}
|
|
}
|
|
+ // Camellia start - Add portal rate limiter
|
|
+ for (var worldData : dataSet) {
|
|
+ from.portalRateThrottler.splitInto(worldData.portalRateThrottler);
|
|
+ }
|
|
+ from.portalRateThrottler.destroy();
|
|
+ // Camellia end
|
|
}
|
|
};
|
|
|
|
@@ -343,6 +353,35 @@ public final class RegionizedWorldData {
|
|
return this.isHandlingTick;
|
|
}
|
|
|
|
+ // Camellia start - Add portal rate limiter
|
|
+ public final moe.monnairealms.camellia.utils.RateThrottler portalRateThrottler = new moe.monnairealms.camellia.utils.RateThrottler();
|
|
+ public final net.objecthunter.exp4j.Expression portalRateCapExpression = moe.monnairealms.camellia.config.modules.function.PortalRateLimiterConfig.getExpressionIfConfigured();
|
|
+
|
|
+ private int computePortalRateCap() {
|
|
+ // expression mode is disabled
|
|
+ if (this.portalRateCapExpression == null) {
|
|
+ return moe.monnairealms.camellia.config.modules.function.PortalRateLimiterConfig.maxPortalTeleportsPerTick;
|
|
+ }
|
|
+
|
|
+ final int tickingEntityCount = this.entityTickList.size();
|
|
+ final int tickingChunkCount = this.tickingChunks.size();
|
|
+ final int playerCount = this.localPlayers.size();
|
|
+
|
|
+ return moe.monnairealms.camellia.config.modules.function.PortalRateLimiterConfig.computeExpression(
|
|
+ this.portalRateCapExpression,
|
|
+ tickingEntityCount,
|
|
+ tickingChunkCount,
|
|
+ playerCount
|
|
+ );
|
|
+ }
|
|
+ public boolean isPortalTeleportationOutOfRate() {
|
|
+ if (!moe.monnairealms.camellia.config.modules.function.PortalRateLimiterConfig.enabled) {
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ return this.portalRateThrottler.isOutOfRate(this.computePortalRateCap());
|
|
+ }
|
|
+ // Camellia end
|
|
// entities
|
|
// this is copy on write to allow packet processing to iterate safely
|
|
private final CopyOnWriteArrayList<ServerPlayer> localPlayers = new CopyOnWriteArrayList<>();
|
|
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
|
|
index cdb1647146f526dc80b15a09d3a936b5dbc54ba3..4ce5bdd16b04f76c2e98a5465343a82ed5f28ab7 100644
|
|
--- a/net/minecraft/server/MinecraftServer.java
|
|
+++ b/net/minecraft/server/MinecraftServer.java
|
|
@@ -1922,6 +1922,9 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
|
//net.minecraft.world.level.block.entity.HopperBlockEntity.skipHopperEvents = level.paperConfig().hopper.disableMoveEvent || org.bukkit.event.inventory.InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0; // Paper - Perf: Optimize Hoppers // Folia - region threading
|
|
profiler.push(() -> level + " " + level.dimension().identifier());
|
|
profiler.push("tick");
|
|
+ // Camellia start - Add portal rate limiter
|
|
+ regionizedWorldData.portalRateThrottler.begin();
|
|
+ // Camellia end
|
|
|
|
try {
|
|
foliaProfiler.startTimer(level.tickTimerId); try { // Folia - profiler
|
|
@@ -1936,6 +1939,9 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
|
profiler.pop();
|
|
profiler.pop();
|
|
regionizedWorldData.explosionDensityCache.clear(); // Paper - Optimize explosions // Folia - region threading
|
|
+ // Camellia start - Add portal rate limiter
|
|
+ regionizedWorldData.portalRateThrottler.done();
|
|
+ // Camellia end
|
|
}
|
|
//this.isIteratingOverLevels = false; // Paper - Throw exception on world create while being ticked // Folia - region threading
|
|
|
|
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
|
|
index 0097c55adf5578f425b476b3498db1c701189e4b..1a0e5fbc823c328d16f48f2df4507bf240915c79 100644
|
|
--- a/net/minecraft/server/level/ServerLevel.java
|
|
+++ b/net/minecraft/server/level/ServerLevel.java
|
|
@@ -1535,8 +1535,15 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
|
|
// removed from region while ticking
|
|
return;
|
|
}
|
|
+ // Camellia start - Add portal rate limiter
|
|
+ var worldData = entity.level().getCurrentWorldData();
|
|
+ if (entity.portalProcess != null && worldData.isPortalTeleportationOutOfRate()) {
|
|
+ return;
|
|
+ }
|
|
+ // Camellia end
|
|
if (entity.handlePortal()) {
|
|
// portalled
|
|
+ worldData.portalRateThrottler.increase(); // Camellia - Add portal rate limiter
|
|
return;
|
|
}
|
|
}
|
|
@@ -1580,8 +1587,15 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
|
|
// removed from region while ticking
|
|
return;
|
|
}
|
|
+ // Camellia start - Add portal rate limiter
|
|
+ var worldData = entity.level().getCurrentWorldData();
|
|
+ if (entity.portalProcess != null && worldData.isPortalTeleportationOutOfRate()) {
|
|
+ return;
|
|
+ }
|
|
+ // Camellia end
|
|
if (entity.handlePortal()) {
|
|
// portalled
|
|
+ worldData.portalRateThrottler.increase(); // Camellia - Add portal rate limiter
|
|
return;
|
|
}
|
|
// Folia end - region threading
|