From 0ebbc2bbe5e7ddec38754ee43c5129cd69fcb6e2 Mon Sep 17 00:00:00 2001 From: mastermc05 Date: Sat, 22 Oct 2022 14:24:49 +0300 Subject: [PATCH] Support for 1.16.5 --- .../BukkitVersionHelperSpigot116_4.java | 34 +++++++++++++++++-- .../helper/v116_4/MapChunkCache116_4.java | 24 +++++++++++++ 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/bukkit-helper-116-4/src/main/java/org/dynmap/bukkit/helper/v116_4/BukkitVersionHelperSpigot116_4.java b/bukkit-helper-116-4/src/main/java/org/dynmap/bukkit/helper/v116_4/BukkitVersionHelperSpigot116_4.java index 26b87b2f..7407ab7b 100644 --- a/bukkit-helper-116-4/src/main/java/org/dynmap/bukkit/helper/v116_4/BukkitVersionHelperSpigot116_4.java +++ b/bukkit-helper-116-4/src/main/java/org/dynmap/bukkit/helper/v116_4/BukkitVersionHelperSpigot116_4.java @@ -20,6 +20,7 @@ import java.lang.reflect.Method; import java.util.HashMap; import java.util.IdentityHashMap; import java.util.List; +import java.util.Optional; /** @@ -28,10 +29,16 @@ import java.util.List; public class BukkitVersionHelperSpigot116_4 extends BukkitVersionHelperGeneric { private final boolean unsafeAsync; private Field watercolorfield; + private static Field grassColorField; + private static Field foliageColorField; + private static Field grassColorModifierField; public BukkitVersionHelperSpigot116_4() { Class biomefog = getNMSClass("net.minecraft.server.BiomeFog"); watercolorfield = getPrivateField(biomefog, new String[] { "c" }, int.class); + grassColorField = getPrivateField(biomefog, new String[] { "g" }, Optional.class); + foliageColorField = getPrivateField(biomefog, new String[] { "f" }, Optional.class); + grassColorModifierField = getPrivateField(biomefog, new String[] { "h" }, BiomeFog.GrassColor.class); this.unsafeAsync = true; } @@ -50,9 +57,9 @@ public class BukkitVersionHelperSpigot116_4 extends BukkitVersionHelperGeneric { return names; } - private IRegistry reg = null; + private static IRegistry reg = null; - private IRegistry getBiomeReg() { + public static IRegistry getBiomeReg() { if (reg == null) { reg = MinecraftServer.getServer().getCustomRegistry().b(IRegistry.ay); } @@ -160,6 +167,29 @@ public class BukkitVersionHelperSpigot116_4 extends BukkitVersionHelperGeneric { } return 0xFFFFFF; } + @SuppressWarnings("unchecked") + public static Optional getBiomeBaseGrassMult(BiomeBase bb) { + if (bb == null) return Optional.empty(); + try { + return (Optional) grassColorField.get(bb.l()); + } catch (IllegalArgumentException | IllegalAccessException ignored) {} + return Optional.empty(); + } + @SuppressWarnings("unchecked") + public static Optional getBiomeBaseFoliageMult(BiomeBase bb) { + if (bb == null) return Optional.empty(); + try { + return (Optional) foliageColorField.get(bb.l()); + } catch (IllegalArgumentException | IllegalAccessException ignored) {} + return Optional.empty(); + } + public static BiomeFog.GrassColor getBiomeBaseGrassModifier(BiomeBase bb) { + if (bb == null) return BiomeFog.GrassColor.NONE; + try { + return (BiomeFog.GrassColor) grassColorModifierField.get(bb.l()); + } catch (IllegalArgumentException | IllegalAccessException ignored) {} + return BiomeFog.GrassColor.NONE; + } /** Get temperature from biomebase */ @Override diff --git a/bukkit-helper-116-4/src/main/java/org/dynmap/bukkit/helper/v116_4/MapChunkCache116_4.java b/bukkit-helper-116-4/src/main/java/org/dynmap/bukkit/helper/v116_4/MapChunkCache116_4.java index e046e4fd..6863c085 100644 --- a/bukkit-helper-116-4/src/main/java/org/dynmap/bukkit/helper/v116_4/MapChunkCache116_4.java +++ b/bukkit-helper-116-4/src/main/java/org/dynmap/bukkit/helper/v116_4/MapChunkCache116_4.java @@ -6,12 +6,14 @@ import org.bukkit.World; import org.bukkit.craftbukkit.v1_16_R3.CraftWorld; import org.dynmap.DynmapChunk; import org.dynmap.bukkit.helper.BukkitWorld; +import org.dynmap.common.BiomeMap; import org.dynmap.common.chunk.GenericChunk; import org.dynmap.common.chunk.GenericChunkCache; import org.dynmap.common.chunk.GenericMapChunkCache; import java.io.IOException; import java.util.List; +import java.util.Optional; /** * Container for managing chunks - dependent upon using chunk snapshots, since rendering is off server thread @@ -62,5 +64,27 @@ public class MapChunkCache116_4 extends GenericMapChunkCache { this.w = dw.getWorld(); super.setChunks(dw, chunks); } + @Override + public int getFoliageColor(BiomeMap bm, int[] colormap, int x, int z) { + if (bm.getResourcelocation() == null) return colormap[bm.biomeLookup()]; + BiomeBase base = BukkitVersionHelperSpigot116_4.getBiomeReg().get(MinecraftKey.a(bm.getResourcelocation())); + return BukkitVersionHelperSpigot116_4.getBiomeBaseFoliageMult(base).orElse(colormap[bm.biomeLookup()]); + } + + @Override + public int getGrassColor(BiomeMap bm, int[] colormap, int x, int z) { + if (bm.getResourcelocation() == null) return colormap[bm.biomeLookup()]; + BiomeBase base = BukkitVersionHelperSpigot116_4.getBiomeReg().get(MinecraftKey.a(bm.getResourcelocation())); + int grassMult = BukkitVersionHelperSpigot116_4.getBiomeBaseGrassMult(base).orElse(colormap[bm.biomeLookup()]); + BiomeFog.GrassColor modifier = BukkitVersionHelperSpigot116_4.getBiomeBaseGrassModifier(base); + if (modifier == BiomeFog.GrassColor.DARK_FOREST) { + return ((grassMult & 0xfefefe) + 0x28340a) >> 1; + } else if (modifier == BiomeFog.GrassColor.SWAMP) { + double var5 = BiomeBase.f.a(x * 0.0225, z * 0.0225, false); + return var5 < -0.1 ? 0x4c763c : 0x6a7039; + } else { + return grassMult; + } + } }