From a31dc90741ed9c121a13a3c124c9ebf5bafd0da7 Mon Sep 17 00:00:00 2001 From: Jake Potrebic Date: Wed, 29 May 2024 13:58:57 -0700 Subject: Several fixes and new api for experience merging/stacking (#9242) --- ...ons-and-timings-for-sensors-and-behaviors.patch | 134 +++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 patches/server/0577-Rate-options-and-timings-for-sensors-and-behaviors.patch (limited to 'patches/server/0577-Rate-options-and-timings-for-sensors-and-behaviors.patch') diff --git a/patches/server/0577-Rate-options-and-timings-for-sensors-and-behaviors.patch b/patches/server/0577-Rate-options-and-timings-for-sensors-and-behaviors.patch new file mode 100644 index 0000000000..d74af14524 --- /dev/null +++ b/patches/server/0577-Rate-options-and-timings-for-sensors-and-behaviors.patch @@ -0,0 +1,134 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Phoenix616 +Date: Mon, 28 Jun 2021 22:38:29 +0100 +Subject: [PATCH] Rate options and timings for sensors and behaviors + +This adds config options to specify the tick rate for sensors + and behaviors of different entity types as well as timings + for those in order to be able to have some metrics as to which + ones might need tweaking. + +diff --git a/src/main/java/co/aikar/timings/MinecraftTimings.java b/src/main/java/co/aikar/timings/MinecraftTimings.java +index 4bd813161a5d76a83cdbd0a9209b9ea9e60ffe1b..e2764186bd6b838ed5cd86c15597a08d079ef984 100644 +--- a/src/main/java/co/aikar/timings/MinecraftTimings.java ++++ b/src/main/java/co/aikar/timings/MinecraftTimings.java +@@ -115,6 +115,14 @@ public final class MinecraftTimings { + return Timings.ofSafe("Minecraft", "## tickEntity - " + entityType + " - " + type, tickEntityTimer); + } + ++ public static Timing getBehaviorTimings(String type) { ++ return Timings.ofSafe("## Behavior - " + type); ++ } ++ ++ public static Timing getSensorTimings(String type, int rate) { ++ return Timings.ofSafe("## Sensor - " + type + " (Default rate: " + rate + ")"); ++ } ++ + /** + * Get a named timer for the specified tile entity type to track type specific timings. + * @param entity +diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/Behavior.java b/src/main/java/net/minecraft/world/entity/ai/behavior/Behavior.java +index f639cafa64d98a001e622882c647701547f5c3ac..9379dd4056018b52c93ed4888dcdc94579bd9691 100644 +--- a/src/main/java/net/minecraft/world/entity/ai/behavior/Behavior.java ++++ b/src/main/java/net/minecraft/world/entity/ai/behavior/Behavior.java +@@ -14,6 +14,10 @@ public abstract class Behavior implements BehaviorContro + private long endTimestamp; + private final int minDuration; + private final int maxDuration; ++ // Paper start - configurable behavior tick rate and timings ++ private final String configKey; ++ private final co.aikar.timings.Timing timing; ++ // Paper end - configurable behavior tick rate and timings + + public Behavior(Map, MemoryStatus> requiredMemoryState) { + this(requiredMemoryState, 60); +@@ -27,6 +31,15 @@ public abstract class Behavior implements BehaviorContro + this.minDuration = minRunTime; + this.maxDuration = maxRunTime; + this.entryCondition = requiredMemoryState; ++ // Paper start - configurable behavior tick rate and timings ++ String key = io.papermc.paper.util.MappingEnvironment.reobf() ? io.papermc.paper.util.ObfHelper.INSTANCE.deobfClassName(this.getClass().getName()) : this.getClass().getName(); ++ int lastSeparator = key.lastIndexOf('.'); ++ if (lastSeparator != -1) { ++ key = key.substring(lastSeparator + 1); ++ } ++ this.configKey = key.toLowerCase(java.util.Locale.ROOT); ++ this.timing = co.aikar.timings.MinecraftTimings.getBehaviorTimings(configKey); ++ // Paper end - configurable behavior tick rate and timings + } + + @Override +@@ -36,11 +49,19 @@ public abstract class Behavior implements BehaviorContro + + @Override + public final boolean tryStart(ServerLevel world, E entity, long time) { ++ // Paper start - configurable behavior tick rate and timings ++ int tickRate = java.util.Objects.requireNonNullElse(world.paperConfig().tickRates.behavior.get(entity.getType(), this.configKey), -1); ++ if (tickRate > -1 && time < this.endTimestamp + tickRate) { ++ return false; ++ } ++ // Paper end - configurable behavior tick rate and timings + if (this.hasRequiredMemories(entity) && this.checkExtraStartConditions(world, entity)) { + this.status = Behavior.Status.RUNNING; + int i = this.minDuration + world.getRandom().nextInt(this.maxDuration + 1 - this.minDuration); + this.endTimestamp = time + (long)i; ++ this.timing.startTiming(); // Paper - behavior timings + this.start(world, entity, time); ++ this.timing.stopTiming(); // Paper - behavior timings + return true; + } else { + return false; +@@ -52,11 +73,13 @@ public abstract class Behavior implements BehaviorContro + + @Override + public final void tickOrStop(ServerLevel world, E entity, long time) { ++ this.timing.startTiming(); // Paper - behavior timings + if (!this.timedOut(time) && this.canStillUse(world, entity, time)) { + this.tick(world, entity, time); + } else { + this.doStop(world, entity, time); + } ++ this.timing.stopTiming(); // Paper - behavior timings + } + + protected void tick(ServerLevel world, E entity, long time) { +diff --git a/src/main/java/net/minecraft/world/entity/ai/sensing/Sensor.java b/src/main/java/net/minecraft/world/entity/ai/sensing/Sensor.java +index 671fc7725d7c801a2ba009da5bd1bc1a9530f187..85b4b24361e785acf75571ff98f924c00ae80748 100644 +--- a/src/main/java/net/minecraft/world/entity/ai/sensing/Sensor.java ++++ b/src/main/java/net/minecraft/world/entity/ai/sensing/Sensor.java +@@ -26,8 +26,21 @@ public abstract class Sensor { + .ignoreInvisibilityTesting(); + private final int scanRate; + private long timeToTick; ++ // Paper start - configurable sensor tick rate and timings ++ private final String configKey; ++ private final co.aikar.timings.Timing timing; ++ // Paper end + + public Sensor(int senseInterval) { ++ // Paper start - configurable sensor tick rate and timings ++ String key = io.papermc.paper.util.MappingEnvironment.reobf() ? io.papermc.paper.util.ObfHelper.INSTANCE.deobfClassName(this.getClass().getName()) : this.getClass().getName(); ++ int lastSeparator = key.lastIndexOf('.'); ++ if (lastSeparator != -1) { ++ key = key.substring(lastSeparator + 1); ++ } ++ this.configKey = key.toLowerCase(java.util.Locale.ROOT); ++ this.timing = co.aikar.timings.MinecraftTimings.getSensorTimings(configKey, senseInterval); ++ // Paper end + this.scanRate = senseInterval; + this.timeToTick = (long)RANDOM.nextInt(senseInterval); + } +@@ -38,8 +51,12 @@ public abstract class Sensor { + + public final void tick(ServerLevel world, E entity) { + if (--this.timeToTick <= 0L) { +- this.timeToTick = (long)this.scanRate; ++ // Paper start - configurable sensor tick rate and timings ++ this.timeToTick = java.util.Objects.requireNonNullElse(world.paperConfig().tickRates.sensor.get(entity.getType(), this.configKey), this.scanRate); ++ this.timing.startTiming(); ++ // Paper end + this.doTick(world, entity); ++ this.timing.stopTiming(); // Paper - sensor timings + } + } + -- cgit v1.2.3