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-09-19 16:36:07 +02:00
index dd5f74fe4c8ca81b1d1102805ea8acb9087ba91e..d2866b9f7e6c8f0ca30d451c93c56caefb2c1b5c 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-09-19 16:36:07 +02:00
@@ -2145,6 +2145,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-05-11 23:48:37 +02:00
index c1c5750dd2e4a9af1a115996a87eaaa1ea552c74..67ff2241aa8869b41abb0a93467b8694618264e2 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-05-11 23:48:37 +02: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-05-11 23:48:37 +02:00
@@ -539,7 +539,38 @@ 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
+
2024-05-11 23:48:37 +02:00
public static CraftBlockData newData(BlockType blockType, String data) {
+
2021-06-11 14:02:28 +02:00
+ // Paper start - cache block data strings
2024-05-11 23:48:37 +02:00
+ if (blockType != null) {
+ Block block = CraftBlockType.bukkitToMinecraftNew(blockType);
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();
+ }
+
2024-05-11 23:48:37 +02:00
+ private static CraftBlockData createNewData(BlockType blockType, String data) {
2021-06-11 14:02:28 +02:00
+ // Paper end - cache block data strings
2023-06-16 12:28:31 +02:00
net.minecraft.world.level.block.state.BlockState blockData;
2024-05-11 23:48:37 +02:00
Block block = blockType == null ? null : ((CraftBlockType<?>) blockType).getHandle();
2021-06-11 14:02:28 +02:00
Map<Property<?>, Comparable<?>> parsed = null;