2021-06-11 14:02:28 +02:00
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
2024-01-25 10:54:46 +01:00
index 9d41c8e93aa97a78da26bef5cfbed8412d4e1451..dde00d50b28928e35e1f95ef3f0eb46828e9d4bc 100644
2021-06-11 14:02:28 +02:00
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
2024-01-25 10:54:46 +01:00
@@ -2068,6 +2068,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
2021-06-11 14:02:28 +02:00
this.getPlayerList().reloadResources();
2022-03-01 06:43:03 +01:00
this.functionManager.replaceLibrary(this.resources.managers.getFunctionLibrary());
2022-06-08 08:06:17 +02:00
this.structureTemplateManager.onResourceManagerReload(this.resources.resourceManager);
2024-01-20 12:50:16 +01:00
+ org.bukkit.craftbukkit.block.data.CraftBlockData.reloadCache(); // Paper - cache block data strings; they can be defined by datapacks so refresh it here
2021-06-11 14:02:28 +02:00
}, this);
if (this.isSameThread()) {
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java
2024-01-20 12:50:16 +01:00
index 85ee8a3d6db6610104f8a10d77d7cad5dc9b667e..d95f56356a8d1fc82f548d93038bd81c57f46f9e 100644
2021-06-11 14:02:28 +02:00
--- a/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java
2024-01-14 10:46:04 +01:00
@@ -154,7 +154,7 @@ public class CraftBlockData implements BlockData {
2024-01-12 17:25:12 +01:00
return exactMatch;
}
- private static final Map<Class<? extends Enum<?>>, Enum<?>[]> ENUM_VALUES = new HashMap<>();
2024-01-20 12:50:16 +01:00
+ private static final Map<Class<? extends Enum<?>>, Enum<?>[]> ENUM_VALUES = new java.util.concurrent.ConcurrentHashMap<>(); // Paper - cache block data strings; make thread safe
2024-01-12 17:25:12 +01:00
/**
* Convert an NMS Enum (usually a BlockStateEnum) to its appropriate Bukkit
2024-01-14 10:46:04 +01:00
@@ -537,9 +537,39 @@ public class CraftBlockData implements BlockData {
2021-06-14 16:41:34 +02:00
Preconditions.checkState(CraftBlockData.MAP.put(nms, bukkit) == null, "Duplicate mapping %s->%s", nms, bukkit);
2021-06-11 14:02:28 +02:00
}
+ // Paper start - cache block data strings
2022-01-02 18:29:21 +01:00
+ private static Map<String, CraftBlockData> stringDataCache = new java.util.concurrent.ConcurrentHashMap<>();
2021-06-11 14:02:28 +02:00
+
+ 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.BLOCK_STATE_REGISTRY.forEach(blockData -> stringDataCache.put(blockData.toString(), blockData.createCraftBlockData()));
+ }
2024-01-20 12:50:16 +01:00
+ // Paper end - cache block data strings
2021-06-11 14:02:28 +02:00
+
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) {
2024-01-14 10:46:04 +01:00
+ Block block = CraftBlockType.bukkitToMinecraft(material);
2021-06-11 14:02:28 +02:00
+ if (block != null) {
2022-12-08 05:24:59 +01:00
+ net.minecraft.resources.ResourceLocation key = BuiltInRegistries.BLOCK.getKey(block);
2021-06-11 14:02:28 +02:00
+ 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
2023-06-16 12:28:31 +02:00
net.minecraft.world.level.block.state.BlockState blockData;
2024-01-14 10:46:04 +01:00
Block block = CraftBlockType.bukkitToMinecraft(material);
2021-06-11 14:02:28 +02:00
Map<Property<?>, Comparable<?>> parsed = null;