mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-11 09:23:42 +01:00
f09fed894f
--- work/Bukkit Submodule work/Bukkit 6a4242cb..337955e3: > SPIGOT-5468: Improve Beehive TileEntity API > #473: Add an API for passing the heightmap to getHighestBlockAt* method --- work/CraftBukkit Submodule work/CraftBukkit 807a677e..708be695: > SPIGOT-5468: Improve Beehive TileEntity API > #624: Add an API for passing the heightmap to getHighestBlockAt* method > MC-135989, SPIGOT-5564: Don't kick players for flight while riptiding This deprecates the Paper getHighestBlockAt HeightMap APIs now that Bukkit has added their own. These methods will stick around long enough for people to migrate. Their API is pretty much the same as ours, migration should be quick and easy.
1852 lines
86 KiB
Diff
1852 lines
86 KiB
Diff
From 3fd06184c267fa162162c17e6e763702234ed2eb Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Thu, 3 Mar 2016 04:00:11 -0600
|
|
Subject: [PATCH] Timings v2
|
|
|
|
|
|
diff --git a/src/main/java/co/aikar/timings/MinecraftTimings.java b/src/main/java/co/aikar/timings/MinecraftTimings.java
|
|
new file mode 100644
|
|
index 000000000..69e26a826
|
|
--- /dev/null
|
|
+++ b/src/main/java/co/aikar/timings/MinecraftTimings.java
|
|
@@ -0,0 +1,141 @@
|
|
+package co.aikar.timings;
|
|
+
|
|
+import com.google.common.collect.MapMaker;
|
|
+import net.minecraft.server.*;
|
|
+import org.bukkit.plugin.Plugin;
|
|
+import org.bukkit.scheduler.BukkitTask;
|
|
+
|
|
+import org.bukkit.craftbukkit.scheduler.CraftTask;
|
|
+
|
|
+import java.util.Map;
|
|
+
|
|
+// TODO: Re-implement missing timers
|
|
+public final class MinecraftTimings {
|
|
+
|
|
+ public static final Timing serverOversleep = Timings.ofSafe("Server Oversleep");
|
|
+ public static final Timing playerListTimer = Timings.ofSafe("Player List");
|
|
+ public static final Timing commandFunctionsTimer = Timings.ofSafe("Command Functions");
|
|
+ public static final Timing connectionTimer = Timings.ofSafe("Connection Handler");
|
|
+ public static final Timing tickablesTimer = Timings.ofSafe("Tickables");
|
|
+ public static final Timing minecraftSchedulerTimer = Timings.ofSafe("Minecraft Scheduler");
|
|
+ public static final Timing bukkitSchedulerTimer = Timings.ofSafe("Bukkit Scheduler");
|
|
+ public static final Timing bukkitSchedulerPendingTimer = Timings.ofSafe("Bukkit Scheduler - Pending");
|
|
+ public static final Timing bukkitSchedulerFinishTimer = Timings.ofSafe("Bukkit Scheduler - Finishing");
|
|
+ public static final Timing chunkIOTickTimer = Timings.ofSafe("ChunkIOTick");
|
|
+ public static final Timing timeUpdateTimer = Timings.ofSafe("Time Update");
|
|
+ public static final Timing serverCommandTimer = Timings.ofSafe("Server Command");
|
|
+ public static final Timing savePlayers = Timings.ofSafe("Save Players");
|
|
+
|
|
+ public static final Timing tickEntityTimer = Timings.ofSafe("## tickEntity");
|
|
+ public static final Timing tickTileEntityTimer = Timings.ofSafe("## tickTileEntity");
|
|
+ public static final Timing packetProcessTimer = Timings.ofSafe("## Packet Processing");
|
|
+ public static final Timing scheduledBlocksTimer = Timings.ofSafe("## Scheduled Blocks");
|
|
+ public static final Timing structureGenerationTimer = Timings.ofSafe("Structure Generation");
|
|
+
|
|
+ public static final Timing processQueueTimer = Timings.ofSafe("processQueue");
|
|
+ public static final Timing processTasksTimer = Timings.ofSafe("processTasks");
|
|
+
|
|
+ public static final Timing playerCommandTimer = Timings.ofSafe("playerCommand");
|
|
+
|
|
+ public static final Timing entityActivationCheckTimer = Timings.ofSafe("entityActivationCheck");
|
|
+
|
|
+ public static final Timing antiXrayUpdateTimer = Timings.ofSafe("anti-xray - update");
|
|
+ public static final Timing antiXrayObfuscateTimer = Timings.ofSafe("anti-xray - obfuscate");
|
|
+
|
|
+ private static final Map<Class<?>, String> taskNameCache = new MapMaker().weakKeys().makeMap();
|
|
+
|
|
+ private MinecraftTimings() {}
|
|
+
|
|
+ /**
|
|
+ * Gets a timer associated with a plugins tasks.
|
|
+ * @param bukkitTask
|
|
+ * @param period
|
|
+ * @return
|
|
+ */
|
|
+ public static Timing getPluginTaskTimings(BukkitTask bukkitTask, long period) {
|
|
+ if (!bukkitTask.isSync()) {
|
|
+ return NullTimingHandler.NULL;
|
|
+ }
|
|
+ Plugin plugin;
|
|
+
|
|
+ CraftTask craftTask = (CraftTask) bukkitTask;
|
|
+
|
|
+ final Class<?> taskClass = craftTask.getTaskClass();
|
|
+ if (bukkitTask.getOwner() != null) {
|
|
+ plugin = bukkitTask.getOwner();
|
|
+ } else {
|
|
+ plugin = TimingsManager.getPluginByClassloader(taskClass);
|
|
+ }
|
|
+
|
|
+ final String taskname = taskNameCache.computeIfAbsent(taskClass, clazz -> {
|
|
+ try {
|
|
+ return clazz.isAnonymousClass() || clazz.isLocalClass()
|
|
+ ? clazz.getName()
|
|
+ : clazz.getCanonicalName();
|
|
+ } catch (Throwable ex) {
|
|
+ new Exception("Error occurred detecting class name", ex).printStackTrace();
|
|
+ return "MangledClassFile";
|
|
+ }
|
|
+ });
|
|
+
|
|
+ StringBuilder name = new StringBuilder(64);
|
|
+ name.append("Task: ").append(taskname);
|
|
+ if (period > 0) {
|
|
+ name.append(" (interval:").append(period).append(")");
|
|
+ } else {
|
|
+ name.append(" (Single)");
|
|
+ }
|
|
+
|
|
+ if (plugin == null) {
|
|
+ return Timings.ofSafe(null, name.toString());
|
|
+ }
|
|
+
|
|
+ return Timings.ofSafe(plugin, name.toString());
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Get a named timer for the specified entity type to track type specific timings.
|
|
+ * @param entity
|
|
+ * @return
|
|
+ */
|
|
+ public static Timing getEntityTimings(Entity entity) {
|
|
+ String entityType = entity.getClass().getName();
|
|
+ return Timings.ofSafe("Minecraft", "## tickEntity - " + entityType, tickEntityTimer);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Get a named timer for the specified tile entity type to track type specific timings.
|
|
+ * @param entity
|
|
+ * @return
|
|
+ */
|
|
+ public static Timing getTileEntityTimings(TileEntity entity) {
|
|
+ String entityType = entity.getClass().getName();
|
|
+ return Timings.ofSafe("Minecraft", "## tickTileEntity - " + entityType, tickTileEntityTimer);
|
|
+ }
|
|
+ public static Timing getCancelTasksTimer() {
|
|
+ return Timings.ofSafe("Cancel Tasks");
|
|
+ }
|
|
+ public static Timing getCancelTasksTimer(Plugin plugin) {
|
|
+ return Timings.ofSafe(plugin, "Cancel Tasks");
|
|
+ }
|
|
+
|
|
+ public static void stopServer() {
|
|
+ TimingsManager.stopServer();
|
|
+ }
|
|
+
|
|
+ public static Timing getBlockTiming(Block block) {
|
|
+ return Timings.ofSafe("## Scheduled Block: " + block.toString(), scheduledBlocksTimer);
|
|
+ }
|
|
+/*
|
|
+ public static Timing getStructureTiming(StructureGenerator structureGenerator) {
|
|
+ return Timings.ofSafe("Structure Generator - " + structureGenerator.getName(), structureGenerationTimer);
|
|
+ }*/
|
|
+
|
|
+ public static Timing getPacketTiming(Packet packet) {
|
|
+ return Timings.ofSafe("## Packet - " + packet.getClass().getSimpleName(), packetProcessTimer);
|
|
+ }
|
|
+
|
|
+ public static Timing getCommandFunctionTiming(CustomFunction function) {
|
|
+ return Timings.ofSafe("Command Function - " + function.getMinecraftKey().toString());
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/co/aikar/timings/WorldTimingsHandler.java b/src/main/java/co/aikar/timings/WorldTimingsHandler.java
|
|
new file mode 100644
|
|
index 000000000..3a79cde59
|
|
--- /dev/null
|
|
+++ b/src/main/java/co/aikar/timings/WorldTimingsHandler.java
|
|
@@ -0,0 +1,130 @@
|
|
+package co.aikar.timings;
|
|
+
|
|
+import net.minecraft.server.World;
|
|
+import net.minecraft.server.WorldServer;
|
|
+
|
|
+/**
|
|
+ * Set of timers per world, to track world specific timings.
|
|
+ */
|
|
+// TODO: Re-implement missing timers
|
|
+public class WorldTimingsHandler {
|
|
+ public final Timing mobSpawn;
|
|
+ public final Timing doChunkUnload;
|
|
+ public final Timing doPortalForcer;
|
|
+ public final Timing scheduledBlocks;
|
|
+ public final Timing scheduledBlocksCleanup;
|
|
+ public final Timing scheduledBlocksTicking;
|
|
+ public final Timing chunkTicks;
|
|
+ public final Timing lightChunk;
|
|
+ public final Timing chunkTicksBlocks;
|
|
+ public final Timing doVillages;
|
|
+ public final Timing doChunkMap;
|
|
+ public final Timing doChunkMapUpdate;
|
|
+ public final Timing doChunkMapToUpdate;
|
|
+ public final Timing doChunkMapSortMissing;
|
|
+ public final Timing doChunkMapSortSendToPlayers;
|
|
+ public final Timing doChunkMapPlayersNeedingChunks;
|
|
+ public final Timing doChunkMapPendingSendToPlayers;
|
|
+ public final Timing doChunkMapUnloadChunks;
|
|
+ public final Timing doChunkGC;
|
|
+ public final Timing doSounds;
|
|
+ public final Timing entityRemoval;
|
|
+ public final Timing entityTick;
|
|
+ public final Timing tileEntityTick;
|
|
+ public final Timing tileEntityPending;
|
|
+ public final Timing tracker1;
|
|
+ public final Timing tracker2;
|
|
+ public final Timing doTick;
|
|
+ public final Timing tickEntities;
|
|
+ public final Timing chunks;
|
|
+ public final Timing newEntities;
|
|
+ public final Timing raids;
|
|
+ public final Timing chunkProviderTick;
|
|
+ public final Timing broadcastChunkUpdates;
|
|
+ public final Timing countNaturalMobs;
|
|
+
|
|
+ public final Timing syncChunkLoadTimer;
|
|
+ public final Timing syncChunkLoadDataTimer;
|
|
+ public final Timing syncChunkLoadStructuresTimer;
|
|
+ public final Timing syncChunkLoadPostTimer;
|
|
+ public final Timing syncChunkLoadPopulateTimer;
|
|
+ public final Timing chunkAwait;
|
|
+ public final Timing chunkLoadLevelTimer;
|
|
+ public final Timing chunkGeneration;
|
|
+ public final Timing chunkIOStage1;
|
|
+ public final Timing chunkIOStage2;
|
|
+ public final Timing worldSave;
|
|
+ public final Timing worldSaveChunks;
|
|
+ public final Timing worldSaveLevel;
|
|
+ public final Timing chunkSaveData;
|
|
+
|
|
+
|
|
+ public final Timing miscMobSpawning;
|
|
+ public final Timing chunkRangeCheckBig;
|
|
+ public final Timing chunkRangeCheckSmall;
|
|
+
|
|
+ public WorldTimingsHandler(World server) {
|
|
+ String name = server.worldData.getName() +" - ";
|
|
+
|
|
+ mobSpawn = Timings.ofSafe(name + "mobSpawn");
|
|
+ doChunkUnload = Timings.ofSafe(name + "doChunkUnload");
|
|
+ scheduledBlocks = Timings.ofSafe(name + "Scheduled Blocks");
|
|
+ scheduledBlocksCleanup = Timings.ofSafe(name + "Scheduled Blocks - Cleanup");
|
|
+ scheduledBlocksTicking = Timings.ofSafe(name + "Scheduled Blocks - Ticking");
|
|
+ chunkTicks = Timings.ofSafe(name + "Chunk Ticks");
|
|
+ lightChunk = Timings.ofSafe(name + "Light Chunk");
|
|
+ chunkTicksBlocks = Timings.ofSafe(name + "Chunk Ticks - Blocks");
|
|
+ doVillages = Timings.ofSafe(name + "doVillages");
|
|
+ doChunkMap = Timings.ofSafe(name + "doChunkMap");
|
|
+ doChunkMapUpdate = Timings.ofSafe(name + "doChunkMap - Update");
|
|
+ doChunkMapToUpdate = Timings.ofSafe(name + "doChunkMap - To Update");
|
|
+ doChunkMapSortMissing = Timings.ofSafe(name + "doChunkMap - Sort Missing");
|
|
+ doChunkMapSortSendToPlayers = Timings.ofSafe(name + "doChunkMap - Sort Send To Players");
|
|
+ doChunkMapPlayersNeedingChunks = Timings.ofSafe(name + "doChunkMap - Players Needing Chunks");
|
|
+ doChunkMapPendingSendToPlayers = Timings.ofSafe(name + "doChunkMap - Pending Send To Players");
|
|
+ doChunkMapUnloadChunks = Timings.ofSafe(name + "doChunkMap - Unload Chunks");
|
|
+ doSounds = Timings.ofSafe(name + "doSounds");
|
|
+ doChunkGC = Timings.ofSafe(name + "doChunkGC");
|
|
+ doPortalForcer = Timings.ofSafe(name + "doPortalForcer");
|
|
+ entityTick = Timings.ofSafe(name + "entityTick");
|
|
+ entityRemoval = Timings.ofSafe(name + "entityRemoval");
|
|
+ tileEntityTick = Timings.ofSafe(name + "tileEntityTick");
|
|
+ tileEntityPending = Timings.ofSafe(name + "tileEntityPending");
|
|
+
|
|
+ syncChunkLoadTimer = Timings.ofSafe(name + "syncChunkLoad");
|
|
+ syncChunkLoadDataTimer = Timings.ofSafe(name + "syncChunkLoad - Data");
|
|
+ syncChunkLoadStructuresTimer = Timings.ofSafe(name + "chunkLoad - recreateStructures");
|
|
+ syncChunkLoadPostTimer = Timings.ofSafe(name + "chunkLoad - Post");
|
|
+ syncChunkLoadPopulateTimer = Timings.ofSafe(name + "chunkLoad - Populate");
|
|
+ chunkAwait = Timings.ofSafe(name + "chunkAwait");
|
|
+ chunkLoadLevelTimer = Timings.ofSafe(name + "chunkLoad - Load Level");
|
|
+ chunkGeneration = Timings.ofSafe(name + "chunkGeneration");
|
|
+ chunkIOStage1 = Timings.ofSafe(name + "ChunkIO Stage 1 - DiskIO");
|
|
+ chunkIOStage2 = Timings.ofSafe(name + "ChunkIO Stage 2 - Post Load");
|
|
+ worldSave = Timings.ofSafe(name + "World Save");
|
|
+ worldSaveLevel = Timings.ofSafe(name + "World Save - Level");
|
|
+ worldSaveChunks = Timings.ofSafe(name + "World Save - Chunks");
|
|
+ chunkSaveData = Timings.ofSafe(name + "Chunk Save - Data");
|
|
+
|
|
+ tracker1 = Timings.ofSafe(name + "tracker stage 1");
|
|
+ tracker2 = Timings.ofSafe(name + "tracker stage 2");
|
|
+ doTick = Timings.ofSafe(name + "doTick");
|
|
+ tickEntities = Timings.ofSafe(name + "tickEntities");
|
|
+
|
|
+ chunks = Timings.ofSafe(name + "Chunks");
|
|
+ newEntities = Timings.ofSafe(name + "New entity registration");
|
|
+ raids = Timings.ofSafe(name + "Raids");
|
|
+ chunkProviderTick = Timings.ofSafe(name + "Chunk provider tick");
|
|
+ broadcastChunkUpdates = Timings.ofSafe(name + "Broadcast chunk updates");
|
|
+ countNaturalMobs = Timings.ofSafe(name + "Count natural mobs");
|
|
+
|
|
+
|
|
+ miscMobSpawning = Timings.ofSafe(name + "Mob spawning - Misc");
|
|
+ chunkRangeCheckBig = Timings.ofSafe(name + "Chunk Tick Range - Big");
|
|
+ chunkRangeCheckSmall = Timings.ofSafe(name + "Chunk Tick Range - Small");
|
|
+ }
|
|
+
|
|
+ public static Timing getTickList(WorldServer worldserver, String timingsType) {
|
|
+ return Timings.ofSafe(worldserver.getWorldData().getName() + " - Scheduled " + timingsType);
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
|
index b6d470e59..f402a29b0 100644
|
|
--- a/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
|
@@ -14,11 +14,14 @@ import java.util.concurrent.TimeUnit;
|
|
import java.util.logging.Level;
|
|
import java.util.regex.Pattern;
|
|
|
|
+import com.google.common.collect.Lists;
|
|
import net.minecraft.server.MinecraftServer;
|
|
import org.bukkit.Bukkit;
|
|
import org.bukkit.command.Command;
|
|
import org.bukkit.configuration.InvalidConfigurationException;
|
|
import org.bukkit.configuration.file.YamlConfiguration;
|
|
+import co.aikar.timings.Timings;
|
|
+import co.aikar.timings.TimingsManager;
|
|
|
|
public class PaperConfig {
|
|
|
|
@@ -187,4 +190,27 @@ public class PaperConfig {
|
|
config.addDefault(path, def);
|
|
return config.getString(path, config.getString(path));
|
|
}
|
|
+
|
|
+ public static String timingsServerName;
|
|
+ private static void timings() {
|
|
+ boolean timings = getBoolean("timings.enabled", true);
|
|
+ boolean verboseTimings = getBoolean("timings.verbose", true);
|
|
+ TimingsManager.privacy = getBoolean("timings.server-name-privacy", false);
|
|
+ TimingsManager.hiddenConfigs = getList("timings.hidden-config-entries", Lists.newArrayList("database", "settings.bungeecord-addresses"));
|
|
+ int timingHistoryInterval = getInt("timings.history-interval", 300);
|
|
+ int timingHistoryLength = getInt("timings.history-length", 3600);
|
|
+ timingsServerName = getString("timings.server-name", "Unknown Server");
|
|
+
|
|
+
|
|
+ Timings.setVerboseTimingsEnabled(verboseTimings);
|
|
+ Timings.setTimingsEnabled(timings);
|
|
+ Timings.setHistoryInterval(timingHistoryInterval * 20);
|
|
+ Timings.setHistoryLength(timingHistoryLength * 20);
|
|
+
|
|
+ log("Timings: " + timings +
|
|
+ " - Verbose: " + verboseTimings +
|
|
+ " - Interval: " + timeSummary(Timings.getHistoryInterval() / 20) +
|
|
+ " - Length: " + timeSummary(Timings.getHistoryLength() / 20) +
|
|
+ " - Server Name: " + timingsServerName);
|
|
+ }
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/Block.java b/src/main/java/net/minecraft/server/Block.java
|
|
index cd72a9c84..5de881371 100644
|
|
--- a/src/main/java/net/minecraft/server/Block.java
|
|
+++ b/src/main/java/net/minecraft/server/Block.java
|
|
@@ -31,6 +31,15 @@ public class Block implements IMaterial {
|
|
protected final boolean q;
|
|
protected final SoundEffectType stepSound;
|
|
protected final Material material;
|
|
+ // Paper start
|
|
+ public co.aikar.timings.Timing timing;
|
|
+ public co.aikar.timings.Timing getTiming() {
|
|
+ if (timing == null) {
|
|
+ timing = co.aikar.timings.MinecraftTimings.getBlockTiming(this);
|
|
+ }
|
|
+ return timing;
|
|
+ }
|
|
+ // Paper end
|
|
protected final MaterialMapColor t;
|
|
private final float frictionFactor;
|
|
private final float f;
|
|
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
|
index e58dd3e6d..0b32179b7 100644
|
|
--- a/src/main/java/net/minecraft/server/Chunk.java
|
|
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
|
@@ -576,6 +576,7 @@ public class Chunk implements IChunkAccess {
|
|
server.getPluginManager().callEvent(new org.bukkit.event.world.ChunkLoadEvent(this.bukkitChunk, this.needsDecoration));
|
|
|
|
if (this.needsDecoration) {
|
|
+ try (co.aikar.timings.Timing ignored = this.world.timings.syncChunkLoadPopulateTimer.startTiming()) { // Paper
|
|
this.needsDecoration = false;
|
|
java.util.Random random = new java.util.Random();
|
|
random.setSeed(world.getSeed());
|
|
@@ -595,6 +596,7 @@ public class Chunk implements IChunkAccess {
|
|
}
|
|
}
|
|
server.getPluginManager().callEvent(new org.bukkit.event.world.ChunkPopulateEvent(bukkitChunk));
|
|
+ } // Paper
|
|
}
|
|
}
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
|
index f558ae441..2107ddc48 100644
|
|
--- a/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
|
+++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
|
@@ -227,11 +227,13 @@ public class ChunkProviderServer extends IChunkProvider {
|
|
}
|
|
|
|
gameprofilerfiller.c("getChunkCacheMiss");
|
|
- world.timings.syncChunkLoadTimer.startTiming(); // Spigot
|
|
CompletableFuture<Either<IChunkAccess, PlayerChunk.Failure>> completablefuture = this.getChunkFutureMainThread(i, j, chunkstatus, flag);
|
|
|
|
+ if (!completablefuture.isDone()) { // Paper
|
|
+ this.world.timings.chunkAwait.startTiming(); // Paper
|
|
this.serverThreadQueue.awaitTasks(completablefuture::isDone);
|
|
- world.timings.syncChunkLoadTimer.stopTiming(); // Spigot
|
|
+ this.world.timings.chunkAwait.stopTiming(); // Paper
|
|
+ } // Paper
|
|
ichunkaccess = (IChunkAccess) ((Either) completablefuture.join()).map((ichunkaccess1) -> {
|
|
return ichunkaccess1;
|
|
}, (playerchunk_failure) -> {
|
|
@@ -424,7 +426,9 @@ public class ChunkProviderServer extends IChunkProvider {
|
|
|
|
public void save(boolean flag) {
|
|
this.tickDistanceManager();
|
|
+ try (co.aikar.timings.Timing timed = world.timings.chunkSaveData.startTiming()) { // Paper - Timings
|
|
this.playerChunkMap.save(flag);
|
|
+ } // Paper - Timings
|
|
}
|
|
|
|
@Override
|
|
@@ -461,7 +465,9 @@ public class ChunkProviderServer extends IChunkProvider {
|
|
this.tickDistanceManager();
|
|
this.world.timings.doChunkMap.stopTiming(); // Spigot
|
|
this.world.getMethodProfiler().exitEnter("chunks");
|
|
+ this.world.timings.chunks.startTiming(); // Paper - timings
|
|
this.tickChunks();
|
|
+ this.world.timings.chunks.stopTiming(); // Paper - timings
|
|
this.world.timings.doChunkUnload.startTiming(); // Spigot
|
|
this.world.getMethodProfiler().exitEnter("unload");
|
|
this.playerChunkMap.unloadChunks(booleansupplier);
|
|
@@ -486,10 +492,12 @@ public class ChunkProviderServer extends IChunkProvider {
|
|
boolean flag2 = world.ticksPerAnimalSpawns != 0L && worlddata.getTime() % world.ticksPerAnimalSpawns == 0L; // CraftBukkit // PAIL: TODO monster ticks
|
|
|
|
this.world.getMethodProfiler().enter("naturalSpawnCount");
|
|
+ this.world.timings.countNaturalMobs.startTiming(); // Paper - timings
|
|
int l = this.chunkMapDistance.b();
|
|
EnumCreatureType[] aenumcreaturetype = EnumCreatureType.values();
|
|
Object2IntMap<EnumCreatureType> object2intmap = this.world.l();
|
|
|
|
+ this.world.timings.countNaturalMobs.stopTiming(); // Paper - timings
|
|
this.world.getMethodProfiler().exit();
|
|
this.playerChunkMap.f().forEach((playerchunk) -> {
|
|
Optional<Chunk> optional = ((Either) playerchunk.b().getNow(PlayerChunk.UNLOADED_CHUNK)).left();
|
|
@@ -498,13 +506,27 @@ public class ChunkProviderServer extends IChunkProvider {
|
|
Chunk chunk = (Chunk) optional.get();
|
|
|
|
this.world.getMethodProfiler().enter("broadcast");
|
|
+ this.world.timings.broadcastChunkUpdates.startTiming(); // Paper - timings
|
|
playerchunk.a(chunk);
|
|
+ this.world.timings.broadcastChunkUpdates.stopTiming(); // Paper - timings
|
|
this.world.getMethodProfiler().exit();
|
|
ChunkCoordIntPair chunkcoordintpair = playerchunk.i();
|
|
|
|
- if (!this.playerChunkMap.isOutsideOfRange(chunkcoordintpair)) {
|
|
+ // Paper start - timings
|
|
+ this.world.timings.chunkRangeCheckBig.startTiming();
|
|
+ // note: this is just a copy of the expression in the if
|
|
+ boolean bigRadiusOutsideRange = !this.playerChunkMap.isOutsideOfRange(chunkcoordintpair);
|
|
+ this.world.timings.chunkRangeCheckBig.stopTiming();
|
|
+ if (bigRadiusOutsideRange) {
|
|
+ // Paper end
|
|
chunk.setInhabitedTime(chunk.getInhabitedTime() + j);
|
|
- if (flag1 && (this.allowMonsters || this.allowAnimals) && this.world.getWorldBorder().isInBounds(chunk.getPos()) && !this.playerChunkMap.isOutsideOfRange(chunkcoordintpair, true)) { // Spigot
|
|
+ // Paper start - timings
|
|
+ this.world.timings.chunkRangeCheckSmall.startTiming();
|
|
+ // note: this is just a copy of the expression in the if
|
|
+ boolean smallRadiusOutsideRange = flag1 && (this.allowMonsters || this.allowAnimals) && this.world.getWorldBorder().isInBounds(chunk.getPos()) && !this.playerChunkMap.isOutsideOfRange(chunkcoordintpair, true);
|
|
+ this.world.timings.chunkRangeCheckSmall.stopTiming();
|
|
+ if (smallRadiusOutsideRange) { // Spigot
|
|
+ // Paper end
|
|
this.world.getMethodProfiler().enter("spawner");
|
|
this.world.timings.mobSpawn.startTiming(); // Spigot
|
|
EnumCreatureType[] aenumcreaturetype1 = aenumcreaturetype;
|
|
@@ -548,24 +570,24 @@ public class ChunkProviderServer extends IChunkProvider {
|
|
this.world.getMethodProfiler().exit();
|
|
}
|
|
|
|
- this.world.timings.doTickTiles.startTiming(); // Spigot
|
|
+ this.world.timings.chunkTicks.startTiming(); // Spigot // Paper
|
|
this.world.a(chunk, k);
|
|
- this.world.timings.doTickTiles.stopTiming(); // Spigot
|
|
+ this.world.timings.chunkTicks.stopTiming(); // Spigot // Paper
|
|
}
|
|
}
|
|
});
|
|
this.world.getMethodProfiler().enter("customSpawners");
|
|
if (flag1) {
|
|
+ try (co.aikar.timings.Timing ignored = this.world.timings.miscMobSpawning.startTiming()) { // Paper - timings
|
|
this.chunkGenerator.doMobSpawning(this.world, this.allowMonsters, this.allowAnimals);
|
|
+ } // Paper - timings
|
|
}
|
|
|
|
this.world.getMethodProfiler().exit();
|
|
this.world.getMethodProfiler().exit();
|
|
}
|
|
|
|
- this.world.timings.tracker.startTiming(); // Spigot
|
|
this.playerChunkMap.g();
|
|
- this.world.timings.tracker.stopTiming(); // Spigot
|
|
}
|
|
|
|
@Override
|
|
diff --git a/src/main/java/net/minecraft/server/ChunkRegionLoader.java b/src/main/java/net/minecraft/server/ChunkRegionLoader.java
|
|
index e16d30f2c..4af5a230b 100644
|
|
--- a/src/main/java/net/minecraft/server/ChunkRegionLoader.java
|
|
+++ b/src/main/java/net/minecraft/server/ChunkRegionLoader.java
|
|
@@ -1,5 +1,6 @@
|
|
package net.minecraft.server;
|
|
|
|
+import co.aikar.timings.Timings;
|
|
import com.google.common.collect.Maps;
|
|
import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
|
|
import it.unimi.dsi.fastutil.longs.LongSet;
|
|
@@ -388,7 +389,7 @@ public class ChunkRegionLoader {
|
|
private static void loadEntities(NBTTagCompound nbttagcompound, Chunk chunk) {
|
|
NBTTagList nbttaglist = nbttagcompound.getList("Entities", 10);
|
|
World world = chunk.getWorld();
|
|
- world.timings.syncChunkLoadEntitiesTimer.startTiming(); // Spigot
|
|
+ world.timings.chunkLoadLevelTimer.startTiming(); // Spigot
|
|
|
|
for (int i = 0; i < nbttaglist.size(); ++i) {
|
|
NBTTagCompound nbttagcompound1 = nbttaglist.getCompound(i);
|
|
@@ -400,8 +401,6 @@ public class ChunkRegionLoader {
|
|
chunk.d(true);
|
|
}
|
|
|
|
- world.timings.syncChunkLoadEntitiesTimer.stopTiming(); // Spigot
|
|
- world.timings.syncChunkLoadTileEntitiesTimer.startTiming(); // Spigot
|
|
NBTTagList nbttaglist1 = nbttagcompound.getList("TileEntities", 10);
|
|
|
|
for (int j = 0; j < nbttaglist1.size(); ++j) {
|
|
@@ -418,7 +417,7 @@ public class ChunkRegionLoader {
|
|
}
|
|
}
|
|
}
|
|
- world.timings.syncChunkLoadTileEntitiesTimer.stopTiming(); // Spigot
|
|
+ world.timings.chunkLoadLevelTimer.stopTiming(); // Paper
|
|
|
|
}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/CustomFunction.java b/src/main/java/net/minecraft/server/CustomFunction.java
|
|
index 8d7a6d240..707bd2600 100644
|
|
--- a/src/main/java/net/minecraft/server/CustomFunction.java
|
|
+++ b/src/main/java/net/minecraft/server/CustomFunction.java
|
|
@@ -13,12 +13,22 @@ public class CustomFunction {
|
|
|
|
private final CustomFunction.c[] a;
|
|
private final MinecraftKey b;
|
|
+ // Paper start
|
|
+ public co.aikar.timings.Timing timing;
|
|
+ public co.aikar.timings.Timing getTiming() {
|
|
+ if (timing == null) {
|
|
+ timing = co.aikar.timings.MinecraftTimings.getCommandFunctionTiming(this);
|
|
+ }
|
|
+ return timing;
|
|
+ }
|
|
+ // Paper end
|
|
|
|
public CustomFunction(MinecraftKey minecraftkey, CustomFunction.c[] acustomfunction_c) {
|
|
this.b = minecraftkey;
|
|
this.a = acustomfunction_c;
|
|
}
|
|
|
|
+ public MinecraftKey getMinecraftKey() { return this.a(); } // Paper - OBFHELPER
|
|
public MinecraftKey a() {
|
|
return this.b;
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/CustomFunctionData.java b/src/main/java/net/minecraft/server/CustomFunctionData.java
|
|
index ba40d5fbb..ee42e1dfa 100644
|
|
--- a/src/main/java/net/minecraft/server/CustomFunctionData.java
|
|
+++ b/src/main/java/net/minecraft/server/CustomFunctionData.java
|
|
@@ -103,7 +103,7 @@ public class CustomFunctionData implements IResourcePackListener {
|
|
} else {
|
|
int j;
|
|
|
|
- try {
|
|
+ try (co.aikar.timings.Timing timing = customfunction.getTiming().startTiming()) { // Paper
|
|
this.h = true;
|
|
int k = 0;
|
|
CustomFunction.c[] acustomfunction_c = customfunction.b();
|
|
diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java
|
|
index 9eed98e37..d6646d7e6 100644
|
|
--- a/src/main/java/net/minecraft/server/DedicatedServer.java
|
|
+++ b/src/main/java/net/minecraft/server/DedicatedServer.java
|
|
@@ -20,6 +20,8 @@ import java.util.List;
|
|
import java.util.Locale;
|
|
import java.util.Optional;
|
|
import java.util.Random;
|
|
+import java.util.concurrent.CompletableFuture;
|
|
+import java.util.concurrent.ExecutionException;
|
|
import java.util.function.BooleanSupplier;
|
|
import java.util.regex.Pattern;
|
|
import javax.annotation.Nullable;
|
|
@@ -32,7 +34,7 @@ import org.apache.logging.log4j.Level;
|
|
|
|
import org.bukkit.command.CommandSender;
|
|
import org.bukkit.craftbukkit.LoggerOutputStream;
|
|
-import org.bukkit.craftbukkit.SpigotTimings; // Spigot
|
|
+import co.aikar.timings.MinecraftTimings; // Paper
|
|
import org.bukkit.event.server.ServerCommandEvent;
|
|
import org.bukkit.craftbukkit.util.Waitable;
|
|
import org.bukkit.event.server.RemoteServerCommandEvent;
|
|
@@ -438,7 +440,7 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer
|
|
}
|
|
|
|
public void handleCommandQueue() {
|
|
- SpigotTimings.serverCommandTimer.startTiming(); // Spigot
|
|
+ MinecraftTimings.serverCommandTimer.startTiming(); // Spigot
|
|
while (!this.serverCommandQueue.isEmpty()) {
|
|
ServerCommand servercommand = (ServerCommand) this.serverCommandQueue.remove(0);
|
|
|
|
@@ -453,7 +455,7 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer
|
|
// CraftBukkit end
|
|
}
|
|
|
|
- SpigotTimings.serverCommandTimer.stopTiming(); // Spigot
|
|
+ MinecraftTimings.serverCommandTimer.stopTiming(); // Spigot
|
|
}
|
|
|
|
@Override
|
|
@@ -679,6 +681,7 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer
|
|
|
|
@Override
|
|
public String executeRemoteCommand(String s) {
|
|
+ Waitable[] waitableArray = new Waitable[1];
|
|
this.remoteControlCommandListener.clearMessages();
|
|
this.executeSync(() -> {
|
|
// CraftBukkit start - fire RemoteServerCommandEvent
|
|
@@ -687,10 +690,39 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer
|
|
if (event.isCancelled()) {
|
|
return;
|
|
}
|
|
+ // Paper start
|
|
+ if (s.toLowerCase().startsWith("timings") && s.toLowerCase().matches("timings (report|paste|get|merged|seperate)")) {
|
|
+ org.bukkit.command.BufferedCommandSender sender = new org.bukkit.command.BufferedCommandSender();
|
|
+ Waitable<String> waitable = new Waitable<String>() {
|
|
+ @Override
|
|
+ protected String evaluate() {
|
|
+ return sender.getBuffer();
|
|
+ }
|
|
+ };
|
|
+ waitableArray[0] = waitable;
|
|
+ co.aikar.timings.Timings.generateReport(new co.aikar.timings.TimingsReportListener(sender, waitable));
|
|
+ } else {
|
|
+ // Paper end
|
|
ServerCommand serverCommand = new ServerCommand(event.getCommand(), remoteControlCommandListener.getWrapper());
|
|
server.dispatchServerCommand(remoteConsole, serverCommand);
|
|
+ } // Paper
|
|
// CraftBukkit end
|
|
});
|
|
+ // Paper start
|
|
+ if (waitableArray[0] != null) {
|
|
+ //noinspection unchecked
|
|
+ Waitable<String> waitable = waitableArray[0];
|
|
+ try {
|
|
+ return waitable.get();
|
|
+ } catch (java.util.concurrent.ExecutionException e) {
|
|
+ throw new RuntimeException("Exception processing rcon command " + s, e.getCause());
|
|
+ } catch (InterruptedException e) {
|
|
+ Thread.currentThread().interrupt(); // Maintain interrupted state
|
|
+ throw new RuntimeException("Interrupted processing rcon command " + s, e);
|
|
+ }
|
|
+
|
|
+ }
|
|
+ // Paper end
|
|
return this.remoteControlCommandListener.getMessages();
|
|
}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
|
|
index 306724e69..5635192f7 100644
|
|
--- a/src/main/java/net/minecraft/server/Entity.java
|
|
+++ b/src/main/java/net/minecraft/server/Entity.java
|
|
@@ -29,7 +29,8 @@ import org.bukkit.command.CommandSender;
|
|
import org.bukkit.entity.Hanging;
|
|
import org.bukkit.entity.LivingEntity;
|
|
import org.bukkit.entity.Vehicle;
|
|
-import org.spigotmc.CustomTimingsHandler; // Spigot
|
|
+import co.aikar.timings.MinecraftTimings; // Paper
|
|
+import co.aikar.timings.Timing; // Paper
|
|
import org.bukkit.event.entity.EntityCombustByEntityEvent;
|
|
import org.bukkit.event.hanging.HangingBreakByEntityEvent;
|
|
import org.bukkit.event.vehicle.VehicleBlockCollisionEvent;
|
|
@@ -165,7 +166,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
|
|
public boolean valid;
|
|
public org.bukkit.projectiles.ProjectileSource projectileSource; // For projectiles only
|
|
public boolean forceExplosionKnockback; // SPIGOT-949
|
|
- public CustomTimingsHandler tickTimer = org.bukkit.craftbukkit.SpigotTimings.getEntityTimings(this); // Spigot
|
|
+ public Timing tickTimer = MinecraftTimings.getEntityTimings(this); // Paper
|
|
// Spigot start
|
|
public final org.spigotmc.ActivationRange.ActivationType activationType = org.spigotmc.ActivationRange.initializeEntityActivationType(this);
|
|
public final boolean defaultActivationState;
|
|
@@ -505,7 +506,6 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
|
|
}
|
|
|
|
public void move(EnumMoveType enummovetype, Vec3D vec3d) {
|
|
- org.bukkit.craftbukkit.SpigotTimings.entityMoveTimer.startTiming(); // Spigot
|
|
if (this.noclip) {
|
|
this.a(this.getBoundingBox().b(vec3d));
|
|
this.recalcPosition();
|
|
@@ -657,7 +657,6 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
|
|
|
|
this.world.getMethodProfiler().exit();
|
|
}
|
|
- org.bukkit.craftbukkit.SpigotTimings.entityMoveTimer.stopTiming(); // Spigot
|
|
}
|
|
|
|
protected BlockPosition ag() {
|
|
diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
|
|
index 1f350e335..35e3f1c78 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityLiving.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
|
|
@@ -37,7 +37,7 @@ import org.bukkit.event.entity.EntityTeleportEvent;
|
|
import org.bukkit.event.player.PlayerItemConsumeEvent;
|
|
// CraftBukkit end
|
|
|
|
-import org.bukkit.craftbukkit.SpigotTimings; // Spigot
|
|
+import co.aikar.timings.MinecraftTimings; // Paper
|
|
|
|
public abstract class EntityLiving extends Entity {
|
|
|
|
@@ -2262,7 +2262,6 @@ public abstract class EntityLiving extends Entity {
|
|
|
|
@Override
|
|
public void tick() {
|
|
- SpigotTimings.timerEntityBaseTick.startTiming(); // Spigot
|
|
super.tick();
|
|
this.o();
|
|
this.r();
|
|
@@ -2350,9 +2349,7 @@ public abstract class EntityLiving extends Entity {
|
|
}
|
|
}
|
|
|
|
- SpigotTimings.timerEntityBaseTick.stopTiming(); // Spigot
|
|
this.movementTick();
|
|
- SpigotTimings.timerEntityTickRest.startTiming(); // Spigot
|
|
double d0 = this.locX() - this.lastX;
|
|
double d1 = this.locZ() - this.lastZ;
|
|
float f = (float) (d0 * d0 + d1 * d1);
|
|
@@ -2432,8 +2429,6 @@ public abstract class EntityLiving extends Entity {
|
|
if (this.isSleeping()) {
|
|
this.pitch = 0.0F;
|
|
}
|
|
-
|
|
- SpigotTimings.timerEntityTickRest.stopTiming(); // Spigot
|
|
}
|
|
|
|
protected float f(float f, float f1) {
|
|
@@ -2512,7 +2507,6 @@ public abstract class EntityLiving extends Entity {
|
|
|
|
this.setMot(d4, d5, d6);
|
|
this.world.getMethodProfiler().enter("ai");
|
|
- SpigotTimings.timerEntityAI.startTiming(); // Spigot
|
|
if (this.isFrozen()) {
|
|
this.jumping = false;
|
|
this.aZ = 0.0F;
|
|
@@ -2522,7 +2516,6 @@ public abstract class EntityLiving extends Entity {
|
|
this.doTick();
|
|
this.world.getMethodProfiler().exit();
|
|
}
|
|
- SpigotTimings.timerEntityAI.stopTiming(); // Spigot
|
|
|
|
this.world.getMethodProfiler().exit();
|
|
this.world.getMethodProfiler().enter("jump");
|
|
@@ -2546,9 +2539,7 @@ public abstract class EntityLiving extends Entity {
|
|
this.n();
|
|
AxisAlignedBB axisalignedbb = this.getBoundingBox();
|
|
|
|
- SpigotTimings.timerEntityAIMove.startTiming(); // Spigot
|
|
this.e(new Vec3D((double) this.aZ, (double) this.ba, (double) this.bb));
|
|
- SpigotTimings.timerEntityAIMove.stopTiming(); // Spigot
|
|
this.world.getMethodProfiler().exit();
|
|
this.world.getMethodProfiler().enter("push");
|
|
if (this.bn > 0) {
|
|
@@ -2556,9 +2547,7 @@ public abstract class EntityLiving extends Entity {
|
|
this.a(axisalignedbb, this.getBoundingBox());
|
|
}
|
|
|
|
- SpigotTimings.timerEntityAICollision.startTiming(); // Spigot
|
|
this.collideNearby();
|
|
- SpigotTimings.timerEntityAICollision.stopTiming(); // Spigot
|
|
this.world.getMethodProfiler().exit();
|
|
}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
index b4a0bd795..4dc691775 100644
|
|
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
@@ -63,7 +63,7 @@ import org.bukkit.craftbukkit.CraftServer;
|
|
import org.bukkit.craftbukkit.Main;
|
|
import org.bukkit.event.server.ServerLoadEvent;
|
|
// CraftBukkit end
|
|
-import org.bukkit.craftbukkit.SpigotTimings; // Spigot
|
|
+import co.aikar.timings.MinecraftTimings; // Paper
|
|
import org.spigotmc.SlackActivityAccountant; // Spigot
|
|
|
|
public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTask> implements IMojangStatistics, ICommandListener, AutoCloseable, Runnable {
|
|
@@ -128,8 +128,8 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
|
|
});
|
|
});
|
|
private long nextTick = SystemUtils.getMonotonicMillis();
|
|
- private long ab;
|
|
- private boolean ac;
|
|
+ private long ab; final long getTickOversleepMaxTime() { return this.ab; } // Paper - OBFHELPER
|
|
+ private boolean ac; final boolean hasExecutedTask() { return this.ac; } // Paper - OBFHELPER
|
|
private final IReloadableResourceManager ae;
|
|
private final ResourcePackRepository<ResourcePackLoader> resourcePackRepository;
|
|
@Nullable
|
|
@@ -694,6 +694,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
|
|
}
|
|
// CraftBukkit end
|
|
MinecraftServer.LOGGER.info("Stopping server");
|
|
+ MinecraftTimings.stopServer(); // Paper
|
|
// CraftBukkit start
|
|
if (this.server != null) {
|
|
this.server.disablePlugins();
|
|
@@ -884,6 +885,16 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
|
|
return this.forceTicks || this.isEntered() || SystemUtils.getMonotonicMillis() < (this.ac ? this.ab : this.nextTick);
|
|
}
|
|
|
|
+ // Paper start
|
|
+ private boolean canOversleep() {
|
|
+ return this.hasExecutedTask() && SystemUtils.getMonotonicMillis() < this.getTickOversleepMaxTime();
|
|
+ }
|
|
+
|
|
+ private boolean canSleepForTickNoOversleep() {
|
|
+ return this.forceTicks || this.isEntered() || SystemUtils.getMonotonicMillis() < this.nextTick;
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
private void executeModerately() {
|
|
this.executeAll();
|
|
java.util.concurrent.locks.LockSupport.parkNanos("executing tasks", 1000L);
|
|
@@ -891,9 +902,9 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
|
|
// CraftBukkit end
|
|
|
|
protected void sleepForTick() {
|
|
- this.executeAll();
|
|
+ //this.executeAll(); // Paper - move this into the tick method for timings
|
|
this.awaitTasks(() -> {
|
|
- return !this.canSleepForTick();
|
|
+ return !this.canSleepForTickNoOversleep(); // Paper - move oversleep into full server tick
|
|
});
|
|
}
|
|
|
|
@@ -976,7 +987,14 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
|
|
protected void exit() {}
|
|
|
|
protected void a(BooleanSupplier booleansupplier) {
|
|
- SpigotTimings.serverTickTimer.startTiming(); // Spigot
|
|
+ co.aikar.timings.TimingsManager.FULL_SERVER_TICK.startTiming(); // Paper
|
|
+ // Paper start - move oversleep into full server tick
|
|
+ MinecraftTimings.serverOversleep.startTiming();
|
|
+ this.awaitTasks(() -> {
|
|
+ return !this.canOversleep();
|
|
+ });
|
|
+ MinecraftTimings.serverOversleep.stopTiming();
|
|
+ // Paper end
|
|
this.slackActivityAccountant.tickStarted(); // Spigot
|
|
long i = SystemUtils.getMonotonicNanos();
|
|
|
|
@@ -997,14 +1015,12 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
|
|
}
|
|
|
|
if (autosavePeriod > 0 && this.ticks % autosavePeriod == 0) { // CraftBukkit
|
|
- SpigotTimings.worldSaveTimer.startTiming(); // Spigot
|
|
MinecraftServer.LOGGER.debug("Autosave started");
|
|
this.methodProfiler.enter("save");
|
|
this.playerList.savePlayers();
|
|
this.saveChunks(true, false, false);
|
|
this.methodProfiler.exit();
|
|
MinecraftServer.LOGGER.debug("Autosave finished");
|
|
- SpigotTimings.worldSaveTimer.stopTiming(); // Spigot
|
|
}
|
|
|
|
this.methodProfiler.enter("snooper");
|
|
@@ -1027,30 +1043,34 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
|
|
this.methodProfiler.exit();
|
|
org.spigotmc.WatchdogThread.tick(); // Spigot
|
|
this.slackActivityAccountant.tickEnded(l); // Spigot
|
|
- SpigotTimings.serverTickTimer.stopTiming(); // Spigot
|
|
- org.spigotmc.CustomTimingsHandler.tick(); // Spigot
|
|
+ // Paper start - move executeAll() into full server tick timing
|
|
+ try (co.aikar.timings.Timing ignored = MinecraftTimings.processTasksTimer.startTiming()) {
|
|
+ this.executeAll();
|
|
+ }
|
|
+ // Paper end
|
|
+ co.aikar.timings.TimingsManager.FULL_SERVER_TICK.stopTiming(); // Paper
|
|
}
|
|
|
|
protected void b(BooleanSupplier booleansupplier) {
|
|
- SpigotTimings.schedulerTimer.startTiming(); // Spigot
|
|
+ MinecraftTimings.bukkitSchedulerTimer.startTiming(); // Spigot // Paper
|
|
this.server.getScheduler().mainThreadHeartbeat(this.ticks); // CraftBukkit
|
|
- SpigotTimings.schedulerTimer.stopTiming(); // Spigot
|
|
+ MinecraftTimings.bukkitSchedulerTimer.stopTiming(); // Spigot // Paper
|
|
this.methodProfiler.enter("commandFunctions");
|
|
- SpigotTimings.commandFunctionsTimer.startTiming(); // Spigot
|
|
+ MinecraftTimings.commandFunctionsTimer.startTiming(); // Spigot // Paper
|
|
this.getFunctionData().tick();
|
|
- SpigotTimings.commandFunctionsTimer.stopTiming(); // Spigot
|
|
+ MinecraftTimings.commandFunctionsTimer.stopTiming(); // Spigot // Paper
|
|
this.methodProfiler.exitEnter("levels");
|
|
Iterator iterator = this.getWorlds().iterator();
|
|
|
|
// CraftBukkit start
|
|
// Run tasks that are waiting on processing
|
|
- SpigotTimings.processQueueTimer.startTiming(); // Spigot
|
|
+ MinecraftTimings.processQueueTimer.startTiming(); // Spigot
|
|
while (!processQueue.isEmpty()) {
|
|
processQueue.remove().run();
|
|
}
|
|
- SpigotTimings.processQueueTimer.stopTiming(); // Spigot
|
|
+ MinecraftTimings.processQueueTimer.stopTiming(); // Spigot
|
|
|
|
- SpigotTimings.timeUpdateTimer.startTiming(); // Spigot
|
|
+ MinecraftTimings.timeUpdateTimer.startTiming(); // Spigot // Paper
|
|
// Send time updates to everyone, it will get the right time from the world the player is in.
|
|
if (this.ticks % 20 == 0) {
|
|
for (int i = 0; i < this.getPlayerList().players.size(); ++i) {
|
|
@@ -1058,7 +1078,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
|
|
entityplayer.playerConnection.sendPacket(new PacketPlayOutUpdateTime(entityplayer.world.getTime(), entityplayer.getPlayerTime(), entityplayer.world.getGameRules().getBoolean(GameRules.DO_DAYLIGHT_CYCLE))); // Add support for per player time
|
|
}
|
|
}
|
|
- SpigotTimings.timeUpdateTimer.stopTiming(); // Spigot
|
|
+ MinecraftTimings.timeUpdateTimer.stopTiming(); // Spigot // Paper
|
|
|
|
while (iterator.hasNext()) {
|
|
WorldServer worldserver = (WorldServer) iterator.next();
|
|
@@ -1101,24 +1121,24 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
|
|
}
|
|
|
|
this.methodProfiler.exitEnter("connection");
|
|
- SpigotTimings.connectionTimer.startTiming(); // Spigot
|
|
+ MinecraftTimings.connectionTimer.startTiming(); // Spigot
|
|
this.getServerConnection().c();
|
|
- SpigotTimings.connectionTimer.stopTiming(); // Spigot
|
|
+ MinecraftTimings.connectionTimer.stopTiming(); // Spigot
|
|
this.methodProfiler.exitEnter("players");
|
|
- SpigotTimings.playerListTimer.startTiming(); // Spigot
|
|
+ MinecraftTimings.playerListTimer.startTiming(); // Spigot // Paper
|
|
this.playerList.tick();
|
|
- SpigotTimings.playerListTimer.stopTiming(); // Spigot
|
|
+ MinecraftTimings.playerListTimer.stopTiming(); // Spigot // Paper
|
|
if (SharedConstants.b) {
|
|
GameTestHarnessTicker.a.b();
|
|
}
|
|
|
|
this.methodProfiler.exitEnter("server gui refresh");
|
|
|
|
- SpigotTimings.tickablesTimer.startTiming(); // Spigot
|
|
+ MinecraftTimings.tickablesTimer.startTiming(); // Spigot // Paper
|
|
for (int i = 0; i < this.tickables.size(); ++i) {
|
|
((Runnable) this.tickables.get(i)).run();
|
|
}
|
|
- SpigotTimings.tickablesTimer.stopTiming(); // Spigot
|
|
+ MinecraftTimings.tickablesTimer.stopTiming(); // Spigot // Paper
|
|
|
|
this.methodProfiler.exit();
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/PlayerChunkMap.java b/src/main/java/net/minecraft/server/PlayerChunkMap.java
|
|
index 93d838ec2..2a6955f85 100644
|
|
--- a/src/main/java/net/minecraft/server/PlayerChunkMap.java
|
|
+++ b/src/main/java/net/minecraft/server/PlayerChunkMap.java
|
|
@@ -1,7 +1,9 @@
|
|
package net.minecraft.server;
|
|
|
|
+import co.aikar.timings.Timing; // Paper
|
|
import com.google.common.collect.ImmutableList;
|
|
import com.google.common.collect.Iterables;
|
|
+import com.google.common.collect.ComparisonChain; // Paper
|
|
import com.google.common.collect.Lists;
|
|
import com.google.common.collect.Queues;
|
|
import com.google.common.collect.Sets;
|
|
@@ -506,9 +508,12 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
|
|
|
|
private CompletableFuture<Either<IChunkAccess, PlayerChunk.Failure>> f(ChunkCoordIntPair chunkcoordintpair) {
|
|
return CompletableFuture.supplyAsync(() -> {
|
|
- try {
|
|
+ try (Timing ignored = this.world.timings.syncChunkLoadTimer.startTimingIfSync()) { // Paper
|
|
this.world.getMethodProfiler().c("chunkLoad");
|
|
- NBTTagCompound nbttagcompound = this.readChunkData(chunkcoordintpair);
|
|
+ NBTTagCompound nbttagcompound; // Paper
|
|
+ try (Timing ignored2 = this.world.timings.chunkIOStage1.startTimingIfSync()) { // Paper start - timings
|
|
+ nbttagcompound = this.readChunkData(chunkcoordintpair);
|
|
+ } // Paper end
|
|
|
|
if (nbttagcompound != null) {
|
|
boolean flag = nbttagcompound.hasKeyOfType("Level", 10) && nbttagcompound.getCompound("Level").hasKeyOfType("Status", 8);
|
|
@@ -548,7 +553,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
|
|
return "chunkGenerate " + chunkstatus.d();
|
|
});
|
|
return completablefuture.thenComposeAsync((either) -> {
|
|
- return (CompletableFuture) either.map((list) -> {
|
|
+ return either.map((list) -> { // Paper - Shut up.
|
|
try {
|
|
CompletableFuture<Either<IChunkAccess, PlayerChunk.Failure>> completablefuture1 = chunkstatus.a(this.world, this.chunkGenerator, this.definedStructureManager, this.lightEngine, (ichunkaccess) -> {
|
|
return this.c(playerchunk);
|
|
@@ -601,6 +606,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
|
|
ChunkStatus chunkstatus = PlayerChunk.getChunkStatus(playerchunk.getTicketLevel());
|
|
|
|
return !chunkstatus.b(ChunkStatus.FULL) ? PlayerChunk.UNLOADED_CHUNK_ACCESS : either.mapLeft((ichunkaccess) -> {
|
|
+ try (Timing ignored = world.timings.chunkIOStage2.startTimingIfSync()) { // Paper
|
|
ChunkCoordIntPair chunkcoordintpair = playerchunk.i();
|
|
Chunk chunk;
|
|
|
|
@@ -652,6 +658,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
|
|
}
|
|
|
|
return chunk;
|
|
+ } // Paper
|
|
});
|
|
}, (runnable) -> {
|
|
Mailbox mailbox = this.mailboxMain;
|
|
@@ -1091,6 +1098,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
|
|
|
|
PlayerChunkMap.EntityTracker playerchunkmap_entitytracker;
|
|
ObjectIterator objectiterator;
|
|
+ world.timings.tracker1.startTiming(); // Paper
|
|
|
|
for (objectiterator = this.trackedEntities.values().iterator(); objectiterator.hasNext(); playerchunkmap_entitytracker.trackerEntry.a()) {
|
|
playerchunkmap_entitytracker = (PlayerChunkMap.EntityTracker) objectiterator.next();
|
|
@@ -1108,16 +1116,20 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
|
|
playerchunkmap_entitytracker.e = sectionposition1;
|
|
}
|
|
}
|
|
+ world.timings.tracker1.stopTiming(); // Paper
|
|
|
|
if (!list.isEmpty()) {
|
|
objectiterator = this.trackedEntities.values().iterator();
|
|
|
|
+ world.timings.tracker2.startTiming(); // Paper
|
|
while (objectiterator.hasNext()) {
|
|
playerchunkmap_entitytracker = (PlayerChunkMap.EntityTracker) objectiterator.next();
|
|
playerchunkmap_entitytracker.track(list);
|
|
}
|
|
+ world.timings.tracker2.stopTiming(); // Paper
|
|
}
|
|
|
|
+
|
|
}
|
|
|
|
protected void broadcast(Entity entity, Packet<?> packet) {
|
|
diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java
|
|
index 6a681d694..914366afc 100644
|
|
--- a/src/main/java/net/minecraft/server/PlayerConnection.java
|
|
+++ b/src/main/java/net/minecraft/server/PlayerConnection.java
|
|
@@ -58,6 +58,7 @@ import org.bukkit.inventory.CraftingInventory;
|
|
import org.bukkit.inventory.EquipmentSlot;
|
|
import org.bukkit.inventory.InventoryView;
|
|
import org.bukkit.util.NumberConversions;
|
|
+import co.aikar.timings.MinecraftTimings; // Paper
|
|
// CraftBukkit end
|
|
|
|
public class PlayerConnection implements PacketListenerPlayIn {
|
|
@@ -135,7 +136,6 @@ public class PlayerConnection implements PacketListenerPlayIn {
|
|
// CraftBukkit end
|
|
|
|
public void tick() {
|
|
- org.bukkit.craftbukkit.SpigotTimings.playerConnectionTimer.startTiming(); // Spigot
|
|
this.syncPosition();
|
|
this.player.lastX = this.player.locX();
|
|
this.player.lastY = this.player.locY();
|
|
@@ -211,7 +211,6 @@ public class PlayerConnection implements PacketListenerPlayIn {
|
|
this.player.resetIdleTimer(); // CraftBukkit - SPIGOT-854
|
|
this.disconnect(new ChatMessage("multiplayer.disconnect.idling", new Object[0]));
|
|
}
|
|
- org.bukkit.craftbukkit.SpigotTimings.playerConnectionTimer.stopTiming(); // Spigot
|
|
|
|
}
|
|
|
|
@@ -1639,7 +1638,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
|
|
// CraftBukkit end
|
|
|
|
private void handleCommand(String s) {
|
|
- org.bukkit.craftbukkit.SpigotTimings.playerCommandTimer.startTiming(); // Spigot
|
|
+ MinecraftTimings.playerCommandTimer.startTiming(); // Paper
|
|
// CraftBukkit start - whole method
|
|
if ( org.spigotmc.SpigotConfig.logCommands ) // Spigot
|
|
this.LOGGER.info(this.player.getName() + " issued server command: " + s);
|
|
@@ -1650,7 +1649,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
|
|
this.server.getPluginManager().callEvent(event);
|
|
|
|
if (event.isCancelled()) {
|
|
- org.bukkit.craftbukkit.SpigotTimings.playerCommandTimer.stopTiming(); // Spigot
|
|
+ MinecraftTimings.playerCommandTimer.stopTiming(); // Paper
|
|
return;
|
|
}
|
|
|
|
@@ -1663,7 +1662,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
|
|
java.util.logging.Logger.getLogger(PlayerConnection.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
|
|
return;
|
|
} finally {
|
|
- org.bukkit.craftbukkit.SpigotTimings.playerCommandTimer.stopTiming(); // Spigot
|
|
+ MinecraftTimings.playerCommandTimer.stopTiming(); // Paper
|
|
}
|
|
// this.minecraftServer.getCommandDispatcher().a(this.player.getCommandListener(), s);
|
|
// CraftBukkit end
|
|
diff --git a/src/main/java/net/minecraft/server/PlayerConnectionUtils.java b/src/main/java/net/minecraft/server/PlayerConnectionUtils.java
|
|
index 2c671629a..eb3269e0e 100644
|
|
--- a/src/main/java/net/minecraft/server/PlayerConnectionUtils.java
|
|
+++ b/src/main/java/net/minecraft/server/PlayerConnectionUtils.java
|
|
@@ -2,6 +2,8 @@ package net.minecraft.server;
|
|
|
|
import org.apache.logging.log4j.LogManager;
|
|
import org.apache.logging.log4j.Logger;
|
|
+import co.aikar.timings.MinecraftTimings; // Paper
|
|
+import co.aikar.timings.Timing; // Paper
|
|
|
|
public class PlayerConnectionUtils {
|
|
|
|
@@ -13,10 +15,13 @@ public class PlayerConnectionUtils {
|
|
|
|
public static <T extends PacketListener> void ensureMainThread(Packet<T> packet, T t0, IAsyncTaskHandler<?> iasynctaskhandler) throws CancelledPacketHandleException {
|
|
if (!iasynctaskhandler.isMainThread()) {
|
|
+ Timing timing = MinecraftTimings.getPacketTiming(packet); // Paper - timings
|
|
iasynctaskhandler.execute(() -> {
|
|
if (MinecraftServer.getServer().hasStopped() || (t0 instanceof PlayerConnection && ((PlayerConnection) t0).processedDisconnect)) return; // CraftBukkit, MC-142590
|
|
if (t0.a().isConnected()) {
|
|
+ try (Timing ignored = timing.startTiming()) { // Paper - timings
|
|
packet.a(t0);
|
|
+ } // Paper - timings
|
|
} else {
|
|
PlayerConnectionUtils.LOGGER.debug("Ignoring packet due to disconnection: " + packet);
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java
|
|
index 0694f4563..1652a57e2 100644
|
|
--- a/src/main/java/net/minecraft/server/PlayerList.java
|
|
+++ b/src/main/java/net/minecraft/server/PlayerList.java
|
|
@@ -1,5 +1,6 @@
|
|
package net.minecraft.server;
|
|
|
|
+import co.aikar.timings.MinecraftTimings;
|
|
import com.google.common.collect.Lists;
|
|
import com.google.common.collect.Maps;
|
|
import com.google.common.collect.Sets;
|
|
@@ -898,10 +899,11 @@ public abstract class PlayerList {
|
|
}
|
|
|
|
public void savePlayers() {
|
|
+ MinecraftTimings.savePlayers.startTiming(); // Paper
|
|
for (int i = 0; i < this.players.size(); ++i) {
|
|
this.savePlayerFile((EntityPlayer) this.players.get(i));
|
|
}
|
|
-
|
|
+ MinecraftTimings.savePlayers.stopTiming(); // Paper
|
|
}
|
|
|
|
public WhiteList getWhitelist() {
|
|
diff --git a/src/main/java/net/minecraft/server/TickListServer.java b/src/main/java/net/minecraft/server/TickListServer.java
|
|
index 00bbd34b6..f533860bb 100644
|
|
--- a/src/main/java/net/minecraft/server/TickListServer.java
|
|
+++ b/src/main/java/net/minecraft/server/TickListServer.java
|
|
@@ -28,13 +28,18 @@ public class TickListServer<T> implements TickList<T> {
|
|
private final List<NextTickListEntry<T>> h = Lists.newArrayList();
|
|
private final Consumer<NextTickListEntry<T>> i;
|
|
|
|
- public TickListServer(WorldServer worldserver, Predicate<T> predicate, Function<T, MinecraftKey> function, Function<MinecraftKey, T> function1, Consumer<NextTickListEntry<T>> consumer) {
|
|
+ public TickListServer(WorldServer worldserver, Predicate<T> predicate, Function<T, MinecraftKey> function, Function<MinecraftKey, T> function1, Consumer<NextTickListEntry<T>> consumer, String timingsType) { // Paper
|
|
this.a = predicate;
|
|
this.b = function;
|
|
this.c = function1;
|
|
this.f = worldserver;
|
|
this.i = consumer;
|
|
+ this.timingCleanup = co.aikar.timings.WorldTimingsHandler.getTickList(worldserver, timingsType + " - Cleanup");
|
|
+ this.timingTicking = co.aikar.timings.WorldTimingsHandler.getTickList(worldserver, timingsType + " - Ticking");
|
|
}
|
|
+ private final co.aikar.timings.Timing timingCleanup; // Paper
|
|
+ private final co.aikar.timings.Timing timingTicking; // Paper
|
|
+ // Paper end
|
|
|
|
public void b() {
|
|
int i = this.nextTickList.size();
|
|
@@ -57,6 +62,7 @@ public class TickListServer<T> implements TickList<T> {
|
|
|
|
this.f.getMethodProfiler().enter("cleaning");
|
|
|
|
+ this.timingCleanup.startTiming(); // Paper
|
|
NextTickListEntry nextticklistentry;
|
|
|
|
while (i > 0 && iterator.hasNext()) {
|
|
@@ -72,7 +78,9 @@ public class TickListServer<T> implements TickList<T> {
|
|
--i;
|
|
}
|
|
}
|
|
+ this.timingCleanup.stopTiming(); // Paper
|
|
|
|
+ this.timingTicking.startTiming(); // Paper
|
|
this.f.getMethodProfiler().exitEnter("ticking");
|
|
|
|
while ((nextticklistentry = (NextTickListEntry) this.g.poll()) != null) {
|
|
@@ -93,6 +101,7 @@ public class TickListServer<T> implements TickList<T> {
|
|
}
|
|
|
|
this.f.getMethodProfiler().exit();
|
|
+ this.timingTicking.stopTiming(); // Paper
|
|
this.h.clear();
|
|
this.g.clear();
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/TileEntity.java b/src/main/java/net/minecraft/server/TileEntity.java
|
|
index 820180ab3..fa6400dcc 100644
|
|
--- a/src/main/java/net/minecraft/server/TileEntity.java
|
|
+++ b/src/main/java/net/minecraft/server/TileEntity.java
|
|
@@ -9,11 +9,12 @@ import org.bukkit.craftbukkit.persistence.CraftPersistentDataContainer;
|
|
import org.bukkit.craftbukkit.persistence.CraftPersistentDataTypeRegistry;
|
|
import org.bukkit.inventory.InventoryHolder;
|
|
// CraftBukkit end
|
|
-import org.spigotmc.CustomTimingsHandler; // Spigot
|
|
+import co.aikar.timings.MinecraftTimings; // Paper
|
|
+import co.aikar.timings.Timing; // Paper
|
|
|
|
public abstract class TileEntity implements KeyedObject { // Paper
|
|
|
|
- public CustomTimingsHandler tickTimer = org.bukkit.craftbukkit.SpigotTimings.getTileEntityTimings(this); // Spigot
|
|
+ public Timing tickTimer = MinecraftTimings.getTileEntityTimings(this); // Paper
|
|
// CraftBukkit start - data containers
|
|
private static final CraftPersistentDataTypeRegistry DATA_TYPE_REGISTRY = new CraftPersistentDataTypeRegistry();
|
|
public CraftPersistentDataContainer persistentDataContainer;
|
|
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
|
index 304dfac06..da3eb20d4 100644
|
|
--- a/src/main/java/net/minecraft/server/World.java
|
|
+++ b/src/main/java/net/minecraft/server/World.java
|
|
@@ -1,5 +1,7 @@
|
|
package net.minecraft.server;
|
|
|
|
+import co.aikar.timings.Timing;
|
|
+import co.aikar.timings.Timings;
|
|
import com.google.common.collect.Lists;
|
|
import java.io.IOException;
|
|
import java.util.Collection;
|
|
@@ -18,7 +20,7 @@ import org.apache.logging.log4j.util.Supplier;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
import org.bukkit.Bukkit;
|
|
-import org.bukkit.craftbukkit.SpigotTimings; // Spigot
|
|
+import org.bukkit.block.BlockState;
|
|
import org.bukkit.craftbukkit.CraftServer;
|
|
import org.bukkit.craftbukkit.CraftWorld;
|
|
import org.bukkit.craftbukkit.block.CapturedBlockState;
|
|
@@ -71,7 +73,7 @@ public abstract class World implements GeneratorAccess, AutoCloseable {
|
|
|
|
public final com.destroystokyo.paper.PaperWorldConfig paperConfig; // Paper
|
|
|
|
- public final SpigotTimings.WorldTimingsHandler timings; // Spigot
|
|
+ public final co.aikar.timings.WorldTimingsHandler timings; // Paper
|
|
public static BlockPosition lastPhysicsProblem; // Spigot
|
|
private org.spigotmc.TickLimiter entityLimiter;
|
|
private org.spigotmc.TickLimiter tileLimiter;
|
|
@@ -134,7 +136,7 @@ public abstract class World implements GeneratorAccess, AutoCloseable {
|
|
public void c(WorldBorder worldborder, double d0) {}
|
|
});
|
|
// CraftBukkit end
|
|
- timings = new SpigotTimings.WorldTimingsHandler(this); // Spigot - code below can generate new world and access timings
|
|
+ timings = new co.aikar.timings.WorldTimingsHandler(this); // Paper - code below can generate new world and access timings
|
|
this.entityLimiter = new org.spigotmc.TickLimiter(spigotConfig.entityMaxTickTime);
|
|
this.tileLimiter = new org.spigotmc.TickLimiter(spigotConfig.tileMaxTickTime);
|
|
}
|
|
@@ -716,15 +718,14 @@ public abstract class World implements GeneratorAccess, AutoCloseable {
|
|
}
|
|
|
|
timings.tileEntityPending.stopTiming(); // Spigot
|
|
+ co.aikar.timings.TimingHistory.tileEntityTicks += this.tileEntityListTick.size(); // Paper
|
|
gameprofilerfiller.exit();
|
|
spigotConfig.currentPrimedTnt = 0; // Spigot
|
|
}
|
|
|
|
public void a(Consumer<Entity> consumer, Entity entity) {
|
|
try {
|
|
- SpigotTimings.tickEntityTimer.startTiming(); // Spigot
|
|
consumer.accept(entity);
|
|
- SpigotTimings.tickEntityTimer.stopTiming(); // Spigot
|
|
} catch (Throwable throwable) {
|
|
CrashReport crashreport = CrashReport.a(throwable, "Ticking entity");
|
|
CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity being ticked");
|
|
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
|
|
index 8a5ac6f69..069898bad 100644
|
|
--- a/src/main/java/net/minecraft/server/WorldServer.java
|
|
+++ b/src/main/java/net/minecraft/server/WorldServer.java
|
|
@@ -1,6 +1,8 @@
|
|
package net.minecraft.server;
|
|
|
|
import com.google.common.annotations.VisibleForTesting;
|
|
+import co.aikar.timings.TimingHistory; // Paper
|
|
+import co.aikar.timings.Timings; // Paper
|
|
import com.google.common.collect.Lists;
|
|
import com.google.common.collect.Maps;
|
|
import com.google.common.collect.Queues;
|
|
@@ -40,7 +42,6 @@ import org.apache.logging.log4j.Logger;
|
|
import java.util.logging.Level;
|
|
import org.bukkit.Bukkit;
|
|
import org.bukkit.WeatherType;
|
|
-import org.bukkit.craftbukkit.SpigotTimings; // Spigot
|
|
import org.bukkit.craftbukkit.event.CraftEventFactory;
|
|
import org.bukkit.event.entity.CreatureSpawnEvent;
|
|
import org.bukkit.event.server.MapInitializeEvent;
|
|
@@ -97,10 +98,10 @@ public class WorldServer extends World {
|
|
// CraftBukkit end
|
|
this.nextTickListBlock = new TickListServer<>(this, (block) -> {
|
|
return block == null || block.getBlockData().isAir();
|
|
- }, IRegistry.BLOCK::getKey, IRegistry.BLOCK::get, this::b);
|
|
+ }, IRegistry.BLOCK::getKey, IRegistry.BLOCK::get, this::b, "Blocks"); // Paper - Timings
|
|
this.nextTickListFluid = new TickListServer<>(this, (fluidtype) -> {
|
|
return fluidtype == null || fluidtype == FluidTypes.EMPTY;
|
|
- }, IRegistry.FLUID::getKey, IRegistry.FLUID::get, this::a);
|
|
+ }, IRegistry.FLUID::getKey, IRegistry.FLUID::get, this::a, "Fluids"); // Paper - Timings
|
|
this.navigators = Sets.newHashSet();
|
|
this.I = new ObjectLinkedOpenHashSet();
|
|
this.dataManager = worldnbtstorage;
|
|
@@ -305,20 +306,24 @@ public class WorldServer extends World {
|
|
this.N();
|
|
this.a();
|
|
gameprofilerfiller.exitEnter("chunkSource");
|
|
+ this.timings.chunkProviderTick.startTiming(); // Paper - timings
|
|
this.getChunkProvider().tick(booleansupplier);
|
|
+ this.timings.chunkProviderTick.stopTiming(); // Paper - timings
|
|
gameprofilerfiller.exitEnter("tickPending");
|
|
- timings.doTickPending.startTiming(); // Spigot
|
|
+ timings.scheduledBlocks.startTiming(); // Spigot
|
|
if (this.worldData.getType() != WorldType.DEBUG_ALL_BLOCK_STATES) {
|
|
this.nextTickListBlock.b();
|
|
this.nextTickListFluid.b();
|
|
}
|
|
- timings.doTickPending.stopTiming(); // Spigot
|
|
+ timings.scheduledBlocks.stopTiming(); // Spigot
|
|
|
|
gameprofilerfiller.exitEnter("raid");
|
|
+ this.timings.raids.startTiming(); // Paper - timings
|
|
this.persistentRaid.a();
|
|
if (this.mobSpawnerTrader != null) {
|
|
this.mobSpawnerTrader.a();
|
|
}
|
|
+ this.timings.raids.stopTiming(); // Paper - timings
|
|
|
|
gameprofilerfiller.exitEnter("blockEvents");
|
|
timings.doSounds.startTiming(); // Spigot
|
|
@@ -361,6 +366,7 @@ public class WorldServer extends World {
|
|
|
|
org.spigotmc.ActivationRange.activateEntities(this); // Spigot
|
|
timings.entityTick.startTiming(); // Spigot
|
|
+ TimingHistory.entityTicks += this.globalEntityList.size(); // Paper
|
|
while (objectiterator.hasNext()) {
|
|
Entry<Entity> entry = (Entry) objectiterator.next();
|
|
Entity entity1 = (Entity) entry.getValue();
|
|
@@ -393,6 +399,7 @@ public class WorldServer extends World {
|
|
gameprofilerfiller.enter("tick");
|
|
if (!entity1.dead && !(entity1 instanceof EntityComplexPart)) {
|
|
this.a(this::entityJoinedWorld, entity1);
|
|
+ ++TimingHistory.entityTicks; // Paper
|
|
}
|
|
|
|
gameprofilerfiller.exit();
|
|
@@ -409,9 +416,11 @@ public class WorldServer extends World {
|
|
|
|
this.tickingEntities = false;
|
|
|
|
+ try (co.aikar.timings.Timing ignored = this.timings.newEntities.startTiming()) { // Paper - timings
|
|
while ((entity = (Entity) this.entitiesToAdd.poll()) != null) {
|
|
this.registerEntity(entity);
|
|
}
|
|
+ } // Paper - timings
|
|
|
|
gameprofilerfiller.exit();
|
|
timings.tickEntities.stopTiming(); // Spigot
|
|
@@ -476,6 +485,7 @@ public class WorldServer extends World {
|
|
}
|
|
|
|
gameprofilerfiller.exitEnter("tickBlocks");
|
|
+ timings.chunkTicksBlocks.startTiming(); // Paper
|
|
if (i > 0) {
|
|
ChunkSection[] achunksection = chunk.getSections();
|
|
int l = achunksection.length;
|
|
@@ -507,7 +517,7 @@ public class WorldServer extends World {
|
|
}
|
|
}
|
|
}
|
|
-
|
|
+ timings.chunkTicksBlocks.stopTiming(); // Paper
|
|
gameprofilerfiller.exit();
|
|
}
|
|
|
|
@@ -799,6 +809,7 @@ public class WorldServer extends World {
|
|
|
|
if (!flag1) {
|
|
org.bukkit.Bukkit.getPluginManager().callEvent(new org.bukkit.event.world.WorldSaveEvent(getWorld())); // CraftBukkit
|
|
+ try (co.aikar.timings.Timing ignored = timings.worldSave.startTiming()) { // Paper
|
|
if (iprogressupdate != null) {
|
|
iprogressupdate.a(new ChatMessage("menu.savingLevel", new Object[0]));
|
|
}
|
|
@@ -808,7 +819,10 @@ public class WorldServer extends World {
|
|
iprogressupdate.c(new ChatMessage("menu.savingChunks", new Object[0]));
|
|
}
|
|
|
|
+ timings.worldSaveChunks.startTiming(); // Paper
|
|
chunkproviderserver.save(flag);
|
|
+ timings.worldSaveChunks.stopTiming(); // Paper
|
|
+ } // Paper
|
|
}
|
|
|
|
// CraftBukkit start - moved from MinecraftServer.saveChunks
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
index 0c9d5d231..49be263ae 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
@@ -1951,12 +1951,31 @@ public final class CraftServer implements Server {
|
|
private final Spigot spigot = new Spigot()
|
|
{
|
|
|
|
+ @Deprecated
|
|
@Override
|
|
public YamlConfiguration getConfig()
|
|
{
|
|
return org.spigotmc.SpigotConfig.config;
|
|
}
|
|
|
|
+ @Override
|
|
+ public YamlConfiguration getBukkitConfig()
|
|
+ {
|
|
+ return configuration;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public YamlConfiguration getSpigotConfig()
|
|
+ {
|
|
+ return org.spigotmc.SpigotConfig.config;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public YamlConfiguration getPaperConfig()
|
|
+ {
|
|
+ return com.destroystokyo.paper.PaperConfig.config;
|
|
+ }
|
|
+
|
|
@Override
|
|
public void restart() {
|
|
org.spigotmc.RestartCommand.restart();
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/SpigotTimings.java b/src/main/java/org/bukkit/craftbukkit/SpigotTimings.java
|
|
deleted file mode 100644
|
|
index 2bd22a369..000000000
|
|
--- a/src/main/java/org/bukkit/craftbukkit/SpigotTimings.java
|
|
+++ /dev/null
|
|
@@ -1,162 +0,0 @@
|
|
-package org.bukkit.craftbukkit;
|
|
-
|
|
-import java.util.HashMap;
|
|
-import net.minecraft.server.Entity;
|
|
-import net.minecraft.server.TileEntity;
|
|
-import net.minecraft.server.World;
|
|
-import org.bukkit.craftbukkit.scheduler.CraftTask;
|
|
-import org.bukkit.plugin.java.JavaPluginLoader;
|
|
-import org.bukkit.scheduler.BukkitTask;
|
|
-import org.spigotmc.CustomTimingsHandler;
|
|
-
|
|
-public class SpigotTimings {
|
|
-
|
|
- public static final CustomTimingsHandler serverTickTimer = new CustomTimingsHandler("** Full Server Tick");
|
|
- public static final CustomTimingsHandler playerListTimer = new CustomTimingsHandler("Player List");
|
|
- public static final CustomTimingsHandler commandFunctionsTimer = new CustomTimingsHandler("Command Functions");
|
|
- public static final CustomTimingsHandler connectionTimer = new CustomTimingsHandler("Connection Handler");
|
|
- public static final CustomTimingsHandler playerConnectionTimer = new CustomTimingsHandler("** PlayerConnection");
|
|
- public static final CustomTimingsHandler tickablesTimer = new CustomTimingsHandler("Tickables");
|
|
- public static final CustomTimingsHandler schedulerTimer = new CustomTimingsHandler("Scheduler");
|
|
- public static final CustomTimingsHandler timeUpdateTimer = new CustomTimingsHandler("Time Update");
|
|
- public static final CustomTimingsHandler serverCommandTimer = new CustomTimingsHandler("Server Command");
|
|
- public static final CustomTimingsHandler worldSaveTimer = new CustomTimingsHandler("World Save");
|
|
-
|
|
- public static final CustomTimingsHandler entityMoveTimer = new CustomTimingsHandler("** entityMove");
|
|
- public static final CustomTimingsHandler tickEntityTimer = new CustomTimingsHandler("** tickEntity");
|
|
- public static final CustomTimingsHandler activatedEntityTimer = new CustomTimingsHandler("** activatedTickEntity");
|
|
- public static final CustomTimingsHandler tickTileEntityTimer = new CustomTimingsHandler("** tickTileEntity");
|
|
-
|
|
- public static final CustomTimingsHandler timerEntityBaseTick = new CustomTimingsHandler("** livingEntityBaseTick");
|
|
- public static final CustomTimingsHandler timerEntityAI = new CustomTimingsHandler("** livingEntityAI");
|
|
- public static final CustomTimingsHandler timerEntityAICollision = new CustomTimingsHandler("** livingEntityAICollision");
|
|
- public static final CustomTimingsHandler timerEntityAIMove = new CustomTimingsHandler("** livingEntityAIMove");
|
|
- public static final CustomTimingsHandler timerEntityTickRest = new CustomTimingsHandler("** livingEntityTickRest");
|
|
-
|
|
- public static final CustomTimingsHandler processQueueTimer = new CustomTimingsHandler("processQueue");
|
|
- public static final CustomTimingsHandler schedulerSyncTimer = new CustomTimingsHandler("** Scheduler - Sync Tasks", JavaPluginLoader.pluginParentTimer);
|
|
-
|
|
- public static final CustomTimingsHandler playerCommandTimer = new CustomTimingsHandler("** playerCommand");
|
|
-
|
|
- public static final CustomTimingsHandler entityActivationCheckTimer = new CustomTimingsHandler("entityActivationCheck");
|
|
- public static final CustomTimingsHandler checkIfActiveTimer = new CustomTimingsHandler("** checkIfActive");
|
|
-
|
|
- public static final HashMap<String, CustomTimingsHandler> entityTypeTimingMap = new HashMap<String, CustomTimingsHandler>();
|
|
- public static final HashMap<String, CustomTimingsHandler> tileEntityTypeTimingMap = new HashMap<String, CustomTimingsHandler>();
|
|
- public static final HashMap<String, CustomTimingsHandler> pluginTaskTimingMap = new HashMap<String, CustomTimingsHandler>();
|
|
-
|
|
- /**
|
|
- * Gets a timer associated with a plugins tasks.
|
|
- * @param task
|
|
- * @param period
|
|
- * @return
|
|
- */
|
|
- public static CustomTimingsHandler getPluginTaskTimings(BukkitTask task, long period) {
|
|
- if (!task.isSync()) {
|
|
- return null;
|
|
- }
|
|
- String plugin;
|
|
- final CraftTask ctask = (CraftTask) task;
|
|
-
|
|
- if (task.getOwner() != null) {
|
|
- plugin = task.getOwner().getDescription().getFullName();
|
|
- } else {
|
|
- plugin = "Unknown";
|
|
- }
|
|
- String taskname = ctask.getTaskName();
|
|
-
|
|
- String name = "Task: " + plugin + " Runnable: " + taskname;
|
|
- if (period > 0) {
|
|
- name += "(interval:" + period +")";
|
|
- } else {
|
|
- name += "(Single)";
|
|
- }
|
|
- CustomTimingsHandler result = pluginTaskTimingMap.get(name);
|
|
- if (result == null) {
|
|
- result = new CustomTimingsHandler(name, SpigotTimings.schedulerSyncTimer);
|
|
- pluginTaskTimingMap.put(name, result);
|
|
- }
|
|
- return result;
|
|
- }
|
|
-
|
|
- /**
|
|
- * Get a named timer for the specified entity type to track type specific timings.
|
|
- * @param entity
|
|
- * @return
|
|
- */
|
|
- public static CustomTimingsHandler getEntityTimings(Entity entity) {
|
|
- String entityType = entity.getClass().getName();
|
|
- CustomTimingsHandler result = entityTypeTimingMap.get(entityType);
|
|
- if (result == null) {
|
|
- result = new CustomTimingsHandler("** tickEntity - " + entity.getClass().getSimpleName(), activatedEntityTimer);
|
|
- entityTypeTimingMap.put(entityType, result);
|
|
- }
|
|
- return result;
|
|
- }
|
|
-
|
|
- /**
|
|
- * Get a named timer for the specified tile entity type to track type specific timings.
|
|
- * @param entity
|
|
- * @return
|
|
- */
|
|
- public static CustomTimingsHandler getTileEntityTimings(TileEntity entity) {
|
|
- String entityType = entity.getClass().getName();
|
|
- CustomTimingsHandler result = tileEntityTypeTimingMap.get(entityType);
|
|
- if (result == null) {
|
|
- result = new CustomTimingsHandler("** tickTileEntity - " + entity.getClass().getSimpleName(), tickTileEntityTimer);
|
|
- tileEntityTypeTimingMap.put(entityType, result);
|
|
- }
|
|
- return result;
|
|
- }
|
|
-
|
|
- /**
|
|
- * Set of timers per world, to track world specific timings.
|
|
- */
|
|
- public static class WorldTimingsHandler {
|
|
- public final CustomTimingsHandler mobSpawn;
|
|
- public final CustomTimingsHandler doChunkUnload;
|
|
- public final CustomTimingsHandler doTickPending;
|
|
- public final CustomTimingsHandler doTickTiles;
|
|
- public final CustomTimingsHandler doChunkMap;
|
|
- public final CustomTimingsHandler doSounds;
|
|
- public final CustomTimingsHandler entityTick;
|
|
- public final CustomTimingsHandler tileEntityTick;
|
|
- public final CustomTimingsHandler tileEntityPending;
|
|
- public final CustomTimingsHandler tracker;
|
|
- public final CustomTimingsHandler doTick;
|
|
- public final CustomTimingsHandler tickEntities;
|
|
-
|
|
- public final CustomTimingsHandler syncChunkLoadTimer;
|
|
- public final CustomTimingsHandler syncChunkLoadStructuresTimer;
|
|
- public final CustomTimingsHandler syncChunkLoadEntitiesTimer;
|
|
- public final CustomTimingsHandler syncChunkLoadTileEntitiesTimer;
|
|
- public final CustomTimingsHandler syncChunkLoadTileTicksTimer;
|
|
- public final CustomTimingsHandler syncChunkLoadPostTimer;
|
|
-
|
|
- public WorldTimingsHandler(World server) {
|
|
- String name = server.worldData.getName() +" - ";
|
|
-
|
|
- mobSpawn = new CustomTimingsHandler("** " + name + "mobSpawn");
|
|
- doChunkUnload = new CustomTimingsHandler("** " + name + "doChunkUnload");
|
|
- doTickPending = new CustomTimingsHandler("** " + name + "doTickPending");
|
|
- doTickTiles = new CustomTimingsHandler("** " + name + "doTickTiles");
|
|
- doChunkMap = new CustomTimingsHandler("** " + name + "doChunkMap");
|
|
- doSounds = new CustomTimingsHandler("** " + name + "doSounds");
|
|
- entityTick = new CustomTimingsHandler("** " + name + "entityTick");
|
|
- tileEntityTick = new CustomTimingsHandler("** " + name + "tileEntityTick");
|
|
- tileEntityPending = new CustomTimingsHandler("** " + name + "tileEntityPending");
|
|
-
|
|
- syncChunkLoadTimer = new CustomTimingsHandler("** " + name + "syncChunkLoad");
|
|
- syncChunkLoadStructuresTimer = new CustomTimingsHandler("** " + name + "chunkLoad - Structures");
|
|
- syncChunkLoadEntitiesTimer = new CustomTimingsHandler("** " + name + "chunkLoad - Entities");
|
|
- syncChunkLoadTileEntitiesTimer = new CustomTimingsHandler("** " + name + "chunkLoad - TileEntities");
|
|
- syncChunkLoadTileTicksTimer = new CustomTimingsHandler("** " + name + "chunkLoad - TileTicks");
|
|
- syncChunkLoadPostTimer = new CustomTimingsHandler("** " + name + "chunkLoad - Post");
|
|
-
|
|
-
|
|
- tracker = new CustomTimingsHandler(name + "tracker");
|
|
- doTick = new CustomTimingsHandler(name + "doTick");
|
|
- tickEntities = new CustomTimingsHandler(name + "tickEntities");
|
|
- }
|
|
- }
|
|
-}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
index 9eba8449e..1094190fd 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
@@ -1753,6 +1753,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
|
packet.components = components;
|
|
getHandle().playerConnection.sendPacket(packet);
|
|
}
|
|
+
|
|
+ // Paper start
|
|
+ @Override
|
|
+ public int getPing()
|
|
+ {
|
|
+ return getHandle().ping;
|
|
+ }
|
|
+ // Paper end
|
|
};
|
|
|
|
public Player.Spigot spigot()
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java
|
|
index b90979c7b..8823f94f7 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java
|
|
@@ -1,5 +1,6 @@
|
|
package org.bukkit.craftbukkit.scheduler;
|
|
|
|
+import co.aikar.timings.MinecraftTimings; // Paper
|
|
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
|
import java.util.ArrayList;
|
|
import java.util.Comparator;
|
|
@@ -248,7 +249,7 @@ public class CraftScheduler implements BukkitScheduler {
|
|
}
|
|
}
|
|
return false;
|
|
- }});
|
|
+ }}){{this.timings=co.aikar.timings.MinecraftTimings.getCancelTasksTimer();}}; // Paper
|
|
handle(task, 0L);
|
|
for (CraftTask taskPending = head.getNext(); taskPending != null; taskPending = taskPending.getNext()) {
|
|
if (taskPending == task) {
|
|
@@ -283,7 +284,7 @@ public class CraftScheduler implements BukkitScheduler {
|
|
}
|
|
}
|
|
}
|
|
- });
|
|
+ }){{this.timings=co.aikar.timings.MinecraftTimings.getCancelTasksTimer(plugin);}}; // Paper
|
|
handle(task, 0L);
|
|
for (CraftTask taskPending = head.getNext(); taskPending != null; taskPending = taskPending.getNext()) {
|
|
if (taskPending == task) {
|
|
@@ -390,9 +391,7 @@ public class CraftScheduler implements BukkitScheduler {
|
|
if (task.isSync()) {
|
|
currentTask = task;
|
|
try {
|
|
- task.timings.startTiming(); // Spigot
|
|
task.run();
|
|
- task.timings.stopTiming(); // Spigot
|
|
} catch (final Throwable throwable) {
|
|
task.getOwner().getLogger().log(
|
|
Level.WARNING,
|
|
@@ -419,8 +418,10 @@ public class CraftScheduler implements BukkitScheduler {
|
|
runners.remove(task.getTaskId());
|
|
}
|
|
}
|
|
+ MinecraftTimings.bukkitSchedulerFinishTimer.startTiming();
|
|
pending.addAll(temp);
|
|
temp.clear();
|
|
+ MinecraftTimings.bukkitSchedulerFinishTimer.stopTiming();
|
|
debugHead = debugHead.getNextHead(currentTick);
|
|
}
|
|
|
|
@@ -453,6 +454,7 @@ public class CraftScheduler implements BukkitScheduler {
|
|
}
|
|
|
|
private void parsePending() {
|
|
+ MinecraftTimings.bukkitSchedulerPendingTimer.startTiming();
|
|
CraftTask head = this.head;
|
|
CraftTask task = head.getNext();
|
|
CraftTask lastTask = head;
|
|
@@ -471,6 +473,7 @@ public class CraftScheduler implements BukkitScheduler {
|
|
task.setNext(null);
|
|
}
|
|
this.head = lastTask;
|
|
+ MinecraftTimings.bukkitSchedulerPendingTimer.stopTiming();
|
|
}
|
|
|
|
private boolean isReady(final int currentTick) {
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftTask.java b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftTask.java
|
|
index 3f55381c1..0d9a46680 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftTask.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftTask.java
|
|
@@ -1,9 +1,11 @@
|
|
package org.bukkit.craftbukkit.scheduler;
|
|
|
|
import java.util.function.Consumer;
|
|
+
|
|
+import co.aikar.timings.NullTimingHandler;
|
|
import org.bukkit.Bukkit;
|
|
-import org.bukkit.craftbukkit.SpigotTimings; // Spigot
|
|
-import org.spigotmc.CustomTimingsHandler; // Spigot
|
|
+import co.aikar.timings.MinecraftTimings; // Paper
|
|
+import co.aikar.timings.Timing; // Paper
|
|
import org.bukkit.plugin.Plugin;
|
|
import org.bukkit.scheduler.BukkitTask;
|
|
|
|
@@ -26,12 +28,12 @@ public class CraftTask implements BukkitTask, Runnable { // Spigot
|
|
*/
|
|
private volatile long period;
|
|
private long nextRun;
|
|
- private final Runnable rTask;
|
|
- private final Consumer<BukkitTask> cTask;
|
|
+ public final Runnable rTask; // Paper
|
|
+ public final Consumer<BukkitTask> cTask; // Paper
|
|
+ public Timing timings; // Paper
|
|
private final Plugin plugin;
|
|
private final int id;
|
|
|
|
- final CustomTimingsHandler timings; // Spigot
|
|
CraftTask() {
|
|
this(null, null, CraftTask.NO_REPEATING, CraftTask.NO_REPEATING);
|
|
}
|
|
@@ -40,7 +42,7 @@ public class CraftTask implements BukkitTask, Runnable { // Spigot
|
|
this(null, task, CraftTask.NO_REPEATING, CraftTask.NO_REPEATING);
|
|
}
|
|
|
|
- CraftTask(final Plugin plugin, final Object task, final int id, final long period) {
|
|
+ CraftTask(final Plugin plugin, final Object task, final int id, final long period) { // Paper
|
|
this.plugin = plugin;
|
|
if (task instanceof Runnable) {
|
|
this.rTask = (Runnable) task;
|
|
@@ -57,7 +59,7 @@ public class CraftTask implements BukkitTask, Runnable { // Spigot
|
|
}
|
|
this.id = id;
|
|
this.period = period;
|
|
- this.timings = this.isSync() ? SpigotTimings.getPluginTaskTimings(this, period) : null; // Spigot
|
|
+ timings = task != null ? MinecraftTimings.getPluginTaskTimings(this, period) : NullTimingHandler.NULL; // Paper
|
|
}
|
|
|
|
@Override
|
|
@@ -77,11 +79,13 @@ public class CraftTask implements BukkitTask, Runnable { // Spigot
|
|
|
|
@Override
|
|
public void run() {
|
|
+ try (Timing ignored = timings.startTiming()) { // Paper
|
|
if (rTask != null) {
|
|
rTask.run();
|
|
} else {
|
|
cTask.accept(this);
|
|
}
|
|
+ } // Paper
|
|
}
|
|
|
|
long getPeriod() {
|
|
@@ -108,7 +112,7 @@ public class CraftTask implements BukkitTask, Runnable { // Spigot
|
|
this.next = next;
|
|
}
|
|
|
|
- Class<?> getTaskClass() {
|
|
+ public Class<?> getTaskClass() {
|
|
return (rTask != null) ? rTask.getClass() : ((cTask != null) ? cTask.getClass() : null);
|
|
}
|
|
|
|
@@ -132,9 +136,4 @@ public class CraftTask implements BukkitTask, Runnable { // Spigot
|
|
return true;
|
|
}
|
|
|
|
- // Spigot start
|
|
- public String getTaskName() {
|
|
- return (getTaskClass() == null) ? "Unknown" : getTaskClass().getName();
|
|
- }
|
|
- // Spigot end
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftIconCache.java b/src/main/java/org/bukkit/craftbukkit/util/CraftIconCache.java
|
|
index e52ef47b7..3d90b3426 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftIconCache.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftIconCache.java
|
|
@@ -5,6 +5,7 @@ import org.bukkit.util.CachedServerIcon;
|
|
public class CraftIconCache implements CachedServerIcon {
|
|
public final String value;
|
|
|
|
+ public String getData() { return value; } // Paper
|
|
public CraftIconCache(final String value) {
|
|
this.value = value;
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
|
|
index 68728b4d8..02f330053 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
|
|
@@ -298,6 +298,13 @@ public final class CraftMagicNumbers implements UnsafeValues {
|
|
return clazz;
|
|
}
|
|
|
|
+ // Paper start
|
|
+ @Override
|
|
+ public String getTimingsServerName() {
|
|
+ return com.destroystokyo.paper.PaperConfig.timingsServerName;
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
/**
|
|
* This helper class represents the different NBT Tags.
|
|
* <p>
|
|
diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java
|
|
index ca7789b5e..442383969 100644
|
|
--- a/src/main/java/org/spigotmc/ActivationRange.java
|
|
+++ b/src/main/java/org/spigotmc/ActivationRange.java
|
|
@@ -31,7 +31,7 @@ import net.minecraft.server.EntityWither;
|
|
import net.minecraft.server.MathHelper;
|
|
import net.minecraft.server.MinecraftServer;
|
|
import net.minecraft.server.World;
|
|
-import org.bukkit.craftbukkit.SpigotTimings;
|
|
+import co.aikar.timings.MinecraftTimings;
|
|
|
|
public class ActivationRange
|
|
{
|
|
@@ -75,8 +75,8 @@ public class ActivationRange
|
|
/**
|
|
* These entities are excluded from Activation range checks.
|
|
*
|
|
- * @param entity
|
|
- * @param config
|
|
+ * @param entity Entity to initialize
|
|
+ * @param config Spigot config to determine ranges
|
|
* @return boolean If it should always tick.
|
|
*/
|
|
public static boolean initializeEntityActivationState(Entity entity, SpigotWorldConfig config)
|
|
@@ -111,7 +111,7 @@ public class ActivationRange
|
|
*/
|
|
public static void activateEntities(World world)
|
|
{
|
|
- SpigotTimings.entityActivationCheckTimer.startTiming();
|
|
+ MinecraftTimings.entityActivationCheckTimer.startTiming();
|
|
final int miscActivationRange = world.spigotConfig.miscActivationRange;
|
|
final int raiderActivationRange = world.spigotConfig.raiderActivationRange;
|
|
final int animalActivationRange = world.spigotConfig.animalActivationRange;
|
|
@@ -148,7 +148,7 @@ public class ActivationRange
|
|
}
|
|
}
|
|
}
|
|
- SpigotTimings.entityActivationCheckTimer.stopTiming();
|
|
+ MinecraftTimings.entityActivationCheckTimer.stopTiming();
|
|
}
|
|
|
|
/**
|
|
@@ -245,10 +245,8 @@ public class ActivationRange
|
|
*/
|
|
public static boolean checkIfActive(Entity entity)
|
|
{
|
|
- SpigotTimings.checkIfActiveTimer.startTiming();
|
|
// Never safe to skip fireworks or entities not yet added to chunk
|
|
if ( !entity.inChunk || entity instanceof EntityFireworks ) {
|
|
- SpigotTimings.checkIfActiveTimer.stopTiming();
|
|
return true;
|
|
}
|
|
|
|
@@ -272,7 +270,6 @@ public class ActivationRange
|
|
{
|
|
isActive = false;
|
|
}
|
|
- SpigotTimings.checkIfActiveTimer.stopTiming();
|
|
return isActive;
|
|
}
|
|
}
|
|
--
|
|
2.25.0
|
|
|