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-10-25 13:19:23 +02:00
index 4af87078b6d7fd733d0e4094af2e7cce029c19d3..e5836c5bd66166e478fe8c930025db30a98d78a4 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-10-23 16:55:24 +02:00
@@ -2227,6 +2227,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
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-10-23 16:55:24 +02:00
this.fuelValues = FuelValues.vanillaBurnTimes(this.registries.compositeAccess(), this.worldData.enabledFeatures());
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-10-23 16:55:24 +02:00
index c53dbcfde62ae8e2f019e854c336ce4a60346dc9..f73858663162cb594db382d584b6500bb03e74b1 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-10-23 16:55:24 +02:00
@@ -156,7 +156,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-10-23 16:55:24 +02:00
@@ -543,7 +543,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;