mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-01 12:41:50 +01:00
e886d8118e
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing
62 lines
3.1 KiB
Diff
62 lines
3.1 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: miclebrick <miclebrick@outlook.com>
|
|
Date: Thu, 6 Dec 2018 19:52:50 -0500
|
|
Subject: [PATCH] Cache block data strings
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
index 69fcfff3f21168f334fd526cb65e63e086d32a70..1c59c40693359224004ed1ae19fa1d32a8053970 100644
|
|
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
@@ -1831,6 +1831,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
|
|
this.getPlayerList().reload();
|
|
this.customFunctionData.a(this.dataPackResources.a());
|
|
this.ak.a(this.dataPackResources.h());
|
|
+ org.bukkit.craftbukkit.block.data.CraftBlockData.reloadCache(); // Paper - cache block data strings, they can be defined by datapacks so refresh it here
|
|
}, this);
|
|
|
|
if (this.isMainThread()) {
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java
|
|
index 41a32f2c77f2e7b79a067a0ce15c894e53ed8709..590236ccc6c15f8c4ad15913fb3ac36d28414318 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java
|
|
@@ -476,9 +476,39 @@ public class CraftBlockData implements BlockData {
|
|
Preconditions.checkState(MAP.put(nms, bukkit) == null, "Duplicate mapping %s->%s", nms, bukkit);
|
|
}
|
|
|
|
+ // Paper start - cache block data strings
|
|
+ private static Map<String, CraftBlockData> stringDataCache = new HashMap<>();
|
|
+
|
|
+ static {
|
|
+ // cache all of the default states at startup, will not cache ones with the custom states inside of the
|
|
+ // brackets in a different order, though
|
|
+ reloadCache();
|
|
+ }
|
|
+
|
|
+ public static void reloadCache() {
|
|
+ stringDataCache.clear();
|
|
+ Block.REGISTRY_ID.forEach(blockData -> stringDataCache.put(blockData.toString(), blockData.createCraftBlockData()));
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
public static CraftBlockData newData(Material material, String data) {
|
|
Preconditions.checkArgument(material == null || material.isBlock(), "Cannot get data for not block %s", material);
|
|
|
|
+ // Paper start - cache block data strings
|
|
+ if (material != null) {
|
|
+ Block block = CraftMagicNumbers.getBlock(material);
|
|
+ if (block != null) {
|
|
+ net.minecraft.server.MinecraftKey key = IRegistry.BLOCK.getKey(block);
|
|
+ data = data == null ? key.toString() : key + data;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ CraftBlockData cached = stringDataCache.computeIfAbsent(data, s -> createNewData(null, s));
|
|
+ return (CraftBlockData) cached.clone();
|
|
+ }
|
|
+
|
|
+ private static CraftBlockData createNewData(Material material, String data) {
|
|
+ // Paper end - cache block data strings
|
|
IBlockData blockData;
|
|
Block block = CraftMagicNumbers.getBlock(material);
|
|
Map<IBlockState<?>, Comparable<?>> parsed = null;
|