Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-12-16 03:20:07 +01:00
0ddd20c6f7
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 CraftBukkit Changes: ead719a65 SPIGOT-7136: Cancelling PlayerInteractEntityEvent with the Allay desyncs 8468e167e SPIGOT-7137: StructureGrowEvent isFromBonemeal and getPlayer have incorrect values d45057c59 SPIGOT-7089: Crash when command blocks attempt to load worlds Spigot Changes: 450dcaa8 Rebuild patches
63 Zeilen
3.3 KiB
Diff
63 Zeilen
3.3 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 48650bc1c09b18f1b57d9828dfe27f51c74c4a75..dbe70160ac703e74613ac65bd62950a5cc951d4c 100644
|
|
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
@@ -2032,6 +2032,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
|
this.getPlayerList().reloadResources();
|
|
this.functionManager.replaceLibrary(this.resources.managers.getFunctionLibrary());
|
|
this.structureTemplateManager.onResourceManagerReload(this.resources.resourceManager);
|
|
+ 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.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
|
|
index 514e1ab74cd24cfcf1dd031e69a8ebfaddf9d3dc..d02a5e383190fc4713141d953efc111bb2f7f89c 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java
|
|
@@ -506,9 +506,39 @@ public class CraftBlockData implements BlockData {
|
|
Preconditions.checkState(CraftBlockData.MAP.put(nms, bukkit) == null, "Duplicate mapping %s->%s", nms, bukkit);
|
|
}
|
|
|
|
+ // Paper start - cache block data strings
|
|
+ private static Map<String, CraftBlockData> stringDataCache = new java.util.concurrent.ConcurrentHashMap<>();
|
|
+
|
|
+ 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()));
|
|
+ }
|
|
+ // 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.resources.ResourceLocation key = Registry.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
|
|
BlockState blockData;
|
|
Block block = CraftMagicNumbers.getBlock(material);
|
|
Map<Property<?>, Comparable<?>> parsed = null;
|