From 88a5346feafd9517adb9347be6233460dbf45744 Mon Sep 17 00:00:00 2001 From: Senmori Date: Fri, 21 Sep 2018 08:49:54 -0400 Subject: [PATCH] Add API to locate structures. --- nms-patches/WorldGenFactory.patch | 11 +++++ .../org/bukkit/craftbukkit/CraftWorld.java | 8 ++++ .../java/org/bukkit/StructureTypeTest.java | 45 +++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 nms-patches/WorldGenFactory.patch create mode 100644 src/test/java/org/bukkit/StructureTypeTest.java diff --git a/nms-patches/WorldGenFactory.patch b/nms-patches/WorldGenFactory.patch new file mode 100644 index 0000000000..ff6105677d --- /dev/null +++ b/nms-patches/WorldGenFactory.patch @@ -0,0 +1,11 @@ +--- a/net/minecraft/server/WorldGenFactory.java ++++ b/net/minecraft/server/WorldGenFactory.java +@@ -9,7 +9,7 @@ + public class WorldGenFactory { + + private static final Logger a = LogManager.getLogger(); +- private static final Map> b = Maps.newHashMap(); ++ public static final Map> b = Maps.newHashMap(); // CraftBukkit private -> public + private static final Map, String> c = Maps.newHashMap(); + private static final Map> d = Maps.newHashMap(); + private static final Map, String> e = Maps.newHashMap(); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index 90451598ba..adf232ea50 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -26,6 +26,7 @@ import org.bukkit.GameRule; import org.bukkit.Location; import org.bukkit.Particle; import org.bukkit.Sound; +import org.bukkit.StructureType; import org.bukkit.TreeType; import org.bukkit.World; import org.bukkit.WorldBorder; @@ -1591,6 +1592,13 @@ public class CraftWorld implements World { } + @Override + public Location locateNearestStructure(Location origin, StructureType structureType, int radius, boolean findUnexplored) { + BlockPosition originPos = new BlockPosition(origin.getX(), origin.getY(), origin.getZ()); + BlockPosition nearest = getHandle().getChunkProviderServer().getChunkGenerator().findNearestMapFeature(getHandle(), structureType.getName(), originPos, radius, findUnexplored); + return (nearest == null) ? null : new Location(this, nearest.getX(), nearest.getY(), nearest.getZ()); + } + public void processChunkGC() { chunkGCTickCount++; diff --git a/src/test/java/org/bukkit/StructureTypeTest.java b/src/test/java/org/bukkit/StructureTypeTest.java new file mode 100644 index 0000000000..57f68761a8 --- /dev/null +++ b/src/test/java/org/bukkit/StructureTypeTest.java @@ -0,0 +1,45 @@ +package org.bukkit; + +import java.util.Map; +import net.minecraft.server.WorldGenFactory; +import org.bukkit.support.AbstractTestingBase; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +/** + * This test makes sure that Bukkit always has Minecraft structure types up to + * date. + */ +public class StructureTypeTest extends AbstractTestingBase { + + private static Map structures; + + @BeforeClass + public static void setUp() { + structures = StructureType.getStructureTypes(); + } + + @Test + public void testMinecraftToBukkit() { + for (String key : WorldGenFactory.b.keySet()) { // PAIL rename structureStartMap + Assert.assertNotNull(structures.get(key)); + } + } + + @Test + public void testBukkit() { + for (Map.Entry entry : structures.entrySet()) { + Assert.assertNotNull(StructureType.getStructureTypes().get(entry.getKey())); + Assert.assertNotNull(StructureType.getStructureTypes().get(entry.getValue().getName())); + } + } + + @Test + public void testBukkitToMinecraft() { + for (Map.Entry entry : structures.entrySet()) { + Assert.assertNotNull(WorldGenFactory.b.get(entry.getKey())); + Assert.assertNotNull(WorldGenFactory.b.get(entry.getValue().getName())); + } + } +}