From 2acfada4f86836b0b30311cf9038117d77dfd754 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 30 May 2022 22:32:17 -0700 Subject: [PATCH 01/16] add core count throttling option to bukkit buildscript --- platforms/bukkit/build.gradle.kts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index e8f1683b4..493f81392 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -32,7 +32,9 @@ dependencies { shadedApi("cloud.commandframework", "cloud-paper", Versions.Libraries.cloud) } -val jvmFlags = listOf( +val throttleCoreCount = 0 + +val jvmFlags = mutableListOf( "-XX:+UseG1GC", "-XX:+ParallelRefProcEnabled", "-XX:MaxGCPauseMillis=200", "-XX:+UnlockExperimentalVMOptions", "-XX:+DisableExplicitGC", "-XX:+AlwaysPreTouch", "-XX:G1NewSizePercent=30", "-XX:G1MaxNewSizePercent=40", "-XX:G1HeapRegionSize=8M", @@ -42,6 +44,10 @@ val jvmFlags = listOf( "-XX:MaxTenuringThreshold=1", "-Dusing.aikars.flags=https://mcflags.emc.gs", "-Daikars.new.flags=true", "-DIReallyKnowWhatIAmDoingISwear", /*"-javaagent:paperclip.jar"*/ ) +if(throttleCoreCount > 0) { + jvmFlags.add("-XX:ActiveProcessorCount=$throttleCoreCount") +} + fun downloadPaperclip(url: String, dir: String) { val clip = URL(url.replace("%version%", mcVersion)) From 00e9ab4263e936f7137bc504aa7e7b72b17d1672 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 31 May 2022 00:26:05 -0700 Subject: [PATCH 02/16] pass seed into NMSChunkGeneratorDelegate --- .../com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java index 7a09d7756..fae81ebc3 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java @@ -43,7 +43,7 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { public NMSChunkGeneratorDelegate(ChunkGenerator vanilla, ConfigPack pack, NMSBiomeProvider biomeProvider, CraftWorld world) { - super(vanilla.b, vanilla.e, biomeProvider); + super(vanilla.b, vanilla.e, biomeProvider, biomeProvider, world.getSeed()); this.delegate = pack.getGeneratorProvider().newInstance(pack); this.vanilla = vanilla; this.biomeSource = biomeProvider; From 688315180962ee8d17169003b3e62c31ff18d1b2 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 31 May 2022 13:21:55 -0700 Subject: [PATCH 03/16] implement hacky Bukkit structure workaround --- .../bukkit/nms/NMSChunkGeneratorDelegate.java | 21 ++++++++++++++----- .../terra/bukkit/nms/NMSInjectListener.java | 13 ++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java index fae81ebc3..a334dc717 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java @@ -3,9 +3,7 @@ package com.dfsek.terra.bukkit.nms; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.info.WorldProperties; -import com.dfsek.terra.bukkit.generator.BukkitProtoChunk; import com.dfsek.terra.bukkit.world.BukkitAdapter; -import com.dfsek.terra.bukkit.world.BukkitServerWorld; import com.mojang.serialization.Codec; import net.minecraft.core.BlockPosition; @@ -25,7 +23,8 @@ import net.minecraft.world.level.levelgen.WorldGenStage; import net.minecraft.world.level.levelgen.blending.Blender; import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; import org.bukkit.craftbukkit.v1_18_R2.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_18_R2.generator.CraftChunkData; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -33,7 +32,7 @@ import java.util.concurrent.Executor; public class NMSChunkGeneratorDelegate extends ChunkGenerator { - + private static final Logger LOGGER = LoggerFactory.getLogger(ChunkGenerator.class); private final NMSBiomeProvider biomeSource; private final com.dfsek.terra.api.world.chunk.generation.ChunkGenerator delegate; @@ -41,6 +40,8 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { private final ConfigPack pack; private final CraftWorld world; + private volatile boolean structures = false; + public NMSChunkGeneratorDelegate(ChunkGenerator vanilla, ConfigPack pack, NMSBiomeProvider biomeProvider, CraftWorld world) { super(vanilla.b, vanilla.e, biomeProvider, biomeProvider, world.getSeed()); @@ -51,6 +52,14 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { this.world = world; } + public void enableStructures() { + if(structures) { + throw new IllegalStateException("Structures have already been enabled!"); + } + LOGGER.info("Enabling structure generation..."); + this.structures = true; + } + @Override //applyCarvers public void a(RegionLimitedWorldAccess regionlimitedworldaccess, long var2, BiomeManager var4, StructureManager var5, IChunkAccess ichunkaccess, WorldGenStage.Features var7) { @@ -76,7 +85,9 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { @Override public void a(GeneratorAccessSeed gas, StructureManager manager, IChunkAccess ica) { - vanilla.a(gas, manager, ica); + if(structures) { + vanilla.a(gas, manager, ica); + } } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java index e748972f2..3b4dfd573 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java @@ -7,6 +7,7 @@ import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.world.WorldInitEvent; +import org.bukkit.event.world.WorldLoadEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,4 +47,16 @@ public class NMSInjectListener implements Listener { INJECT_LOCK.unlock(); } } + + @EventHandler + public void onWorldLoad(WorldLoadEvent event) { + if (INJECTED.contains(event.getWorld()) && event.getWorld().getGenerator() instanceof BukkitChunkGeneratorWrapper bukkitChunkGeneratorWrapper) { + LOGGER.info("Enabling structure deadlock workaround on world {}.", event.getWorld().getName()); + CraftWorld craftWorld = (CraftWorld) event.getWorld(); + WorldServer serverWorld = craftWorld.getHandle(); + + ((NMSChunkGeneratorDelegate) serverWorld.k().a.u).enableStructures(); + LOGGER.info("Thank you Bukkit."); + } + } } From 7da0580eda730cfb43f17b9461b2d09307e5a88c Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 31 May 2022 14:22:36 -0700 Subject: [PATCH 04/16] Revert "implement hacky Bukkit structure workaround" This reverts commit 688315180962ee8d17169003b3e62c31ff18d1b2. --- .../bukkit/nms/NMSChunkGeneratorDelegate.java | 21 +++++-------------- .../terra/bukkit/nms/NMSInjectListener.java | 13 ------------ 2 files changed, 5 insertions(+), 29 deletions(-) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java index a334dc717..fae81ebc3 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java @@ -3,7 +3,9 @@ package com.dfsek.terra.bukkit.nms; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.info.WorldProperties; +import com.dfsek.terra.bukkit.generator.BukkitProtoChunk; import com.dfsek.terra.bukkit.world.BukkitAdapter; +import com.dfsek.terra.bukkit.world.BukkitServerWorld; import com.mojang.serialization.Codec; import net.minecraft.core.BlockPosition; @@ -23,8 +25,7 @@ import net.minecraft.world.level.levelgen.WorldGenStage; import net.minecraft.world.level.levelgen.blending.Blender; import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; import org.bukkit.craftbukkit.v1_18_R2.block.data.CraftBlockData; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.bukkit.craftbukkit.v1_18_R2.generator.CraftChunkData; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -32,7 +33,7 @@ import java.util.concurrent.Executor; public class NMSChunkGeneratorDelegate extends ChunkGenerator { - private static final Logger LOGGER = LoggerFactory.getLogger(ChunkGenerator.class); + private final NMSBiomeProvider biomeSource; private final com.dfsek.terra.api.world.chunk.generation.ChunkGenerator delegate; @@ -40,8 +41,6 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { private final ConfigPack pack; private final CraftWorld world; - private volatile boolean structures = false; - public NMSChunkGeneratorDelegate(ChunkGenerator vanilla, ConfigPack pack, NMSBiomeProvider biomeProvider, CraftWorld world) { super(vanilla.b, vanilla.e, biomeProvider, biomeProvider, world.getSeed()); @@ -52,14 +51,6 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { this.world = world; } - public void enableStructures() { - if(structures) { - throw new IllegalStateException("Structures have already been enabled!"); - } - LOGGER.info("Enabling structure generation..."); - this.structures = true; - } - @Override //applyCarvers public void a(RegionLimitedWorldAccess regionlimitedworldaccess, long var2, BiomeManager var4, StructureManager var5, IChunkAccess ichunkaccess, WorldGenStage.Features var7) { @@ -85,9 +76,7 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { @Override public void a(GeneratorAccessSeed gas, StructureManager manager, IChunkAccess ica) { - if(structures) { - vanilla.a(gas, manager, ica); - } + vanilla.a(gas, manager, ica); } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java index 3b4dfd573..e748972f2 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java @@ -7,7 +7,6 @@ import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.world.WorldInitEvent; -import org.bukkit.event.world.WorldLoadEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -47,16 +46,4 @@ public class NMSInjectListener implements Listener { INJECT_LOCK.unlock(); } } - - @EventHandler - public void onWorldLoad(WorldLoadEvent event) { - if (INJECTED.contains(event.getWorld()) && event.getWorld().getGenerator() instanceof BukkitChunkGeneratorWrapper bukkitChunkGeneratorWrapper) { - LOGGER.info("Enabling structure deadlock workaround on world {}.", event.getWorld().getName()); - CraftWorld craftWorld = (CraftWorld) event.getWorld(); - WorldServer serverWorld = craftWorld.getHandle(); - - ((NMSChunkGeneratorDelegate) serverWorld.k().a.u).enableStructures(); - LOGGER.info("Thank you Bukkit."); - } - } } From 75b72a500de16bc486b1caef15cfa29720c5ed29 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 31 May 2022 14:37:30 -0700 Subject: [PATCH 05/16] remove unneeded chunkgenerator overrides --- .../terra/bukkit/nms/NMSChunkGeneratorDelegate.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java index fae81ebc3..bc75839fe 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java @@ -115,17 +115,6 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { return vanilla.h(); } - @Override //getFirstFreeHeight - public int b(int i, int j, HeightMap.Type heightmap_type, LevelHeightAccessor levelheightaccessor) { - return this.a(i, j, heightmap_type, levelheightaccessor); - } - - - @Override //getFirstOccupiedHeight - public int c(int i, int j, HeightMap.Type heightmap_type, LevelHeightAccessor levelheightaccessor) { - return this.a(i, j, heightmap_type, levelheightaccessor) - 1; - } - @Override // getBaseHeight public int a(int x, int z, HeightMap.Type heightmap, LevelHeightAccessor height) { int y = world.getMaxHeight(); From de2d37cdf5225d2b70a0ae84796528bc467bb46b Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 31 May 2022 14:54:41 -0700 Subject: [PATCH 06/16] implement more vanilla methods in NMSChunkGeneratorDelegate --- .../bukkit/nms/NMSChunkGeneratorDelegate.java | 31 +++++++++------- .../terra/bukkit/nms/NMSInjectListener.java | 2 +- .../terra/bukkit/nms/NMSWorldProperties.java | 36 +++++++++++++++++++ 3 files changed, 56 insertions(+), 13 deletions(-) create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSWorldProperties.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java index bc75839fe..29a821e30 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java @@ -3,9 +3,9 @@ package com.dfsek.terra.bukkit.nms; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.info.WorldProperties; -import com.dfsek.terra.bukkit.generator.BukkitProtoChunk; import com.dfsek.terra.bukkit.world.BukkitAdapter; -import com.dfsek.terra.bukkit.world.BukkitServerWorld; + +import com.dfsek.terra.bukkit.world.block.data.BukkitBlockState; import com.mojang.serialization.Codec; import net.minecraft.core.BlockPosition; @@ -17,6 +17,7 @@ import net.minecraft.world.level.StructureManager; import net.minecraft.world.level.biome.BiomeManager; import net.minecraft.world.level.biome.Climate; import net.minecraft.world.level.biome.Climate.Sampler; +import net.minecraft.world.level.block.state.IBlockData; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.chunk.IChunkAccess; import net.minecraft.world.level.levelgen.ChunkGeneratorAbstract; @@ -25,7 +26,6 @@ import net.minecraft.world.level.levelgen.WorldGenStage; import net.minecraft.world.level.levelgen.blending.Blender; import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; import org.bukkit.craftbukkit.v1_18_R2.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_18_R2.generator.CraftChunkData; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -39,16 +39,17 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { private final ChunkGenerator vanilla; private final ConfigPack pack; - private final CraftWorld world; + + private final long seed; - public NMSChunkGeneratorDelegate(ChunkGenerator vanilla, ConfigPack pack, NMSBiomeProvider biomeProvider, CraftWorld world) { - super(vanilla.b, vanilla.e, biomeProvider, biomeProvider, world.getSeed()); + public NMSChunkGeneratorDelegate(ChunkGenerator vanilla, ConfigPack pack, NMSBiomeProvider biomeProvider, long seed) { + super(vanilla.b, vanilla.e, biomeProvider, biomeProvider, seed); this.delegate = pack.getGeneratorProvider().newInstance(pack); this.vanilla = vanilla; this.biomeSource = biomeProvider; this.pack = pack; - this.world = world; + this.seed = seed; } @Override //applyCarvers @@ -85,13 +86,19 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { } @Override // getColumn - public BlockColumn a(int var0, int var1, LevelHeightAccessor var2) { - return vanilla.a(var0, var1, var2); + public BlockColumn a(int x, int z, LevelHeightAccessor height) { + IBlockData[] array = new IBlockData[height.v_()]; + WorldProperties properties = new NMSWorldProperties(seed, height); + BiomeProvider biomeProvider = pack.getBiomeProvider().caching(properties); + for(int y = properties.getMaxHeight() - 1; y >= properties.getMinHeight(); y--) { + array[y - properties.getMinHeight()] = ((CraftBlockData) delegate.getBlock(properties, x, y, z, biomeProvider).getHandle()).getState(); + } + return new BlockColumn(getMinimumY(), array); } @Override // withSeed public ChunkGenerator a(long seed) { - return new NMSChunkGeneratorDelegate(vanilla, pack, biomeSource, world); + return new NMSChunkGeneratorDelegate(vanilla, pack, biomeSource, seed); } //spawnOriginalMobs @@ -117,8 +124,8 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { @Override // getBaseHeight public int a(int x, int z, HeightMap.Type heightmap, LevelHeightAccessor height) { - int y = world.getMaxHeight(); - WorldProperties properties = BukkitAdapter.adapt(world); + WorldProperties properties = new NMSWorldProperties(seed, height); + int y = properties.getMaxHeight(); BiomeProvider biomeProvider = pack.getBiomeProvider().caching(properties); while(y >= getMinimumY() && !heightmap.e().test( ((CraftBlockData) delegate.getBlock(properties, x, y - 1, z, biomeProvider).getHandle()).getState())) { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java index e748972f2..33c159b0b 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java @@ -36,7 +36,7 @@ public class NMSInjectListener implements Listener { ChunkGenerator vanilla = serverWorld.k().g(); NMSBiomeProvider provider = new NMSBiomeProvider(pack.getBiomeProvider(), vanilla.e(), craftWorld.getSeed()); - NMSChunkGeneratorDelegate custom = new NMSChunkGeneratorDelegate(vanilla, pack, provider, craftWorld); + NMSChunkGeneratorDelegate custom = new NMSChunkGeneratorDelegate(vanilla, pack, provider, craftWorld.getSeed()); custom.conf = vanilla.conf; // world config from Spigot diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSWorldProperties.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSWorldProperties.java new file mode 100644 index 000000000..198a23a3e --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSWorldProperties.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.bukkit.nms; + +import com.dfsek.terra.api.world.info.WorldProperties; + +import net.minecraft.world.level.LevelHeightAccessor; + + +public class NMSWorldProperties implements WorldProperties { + private final long seed; + private final LevelHeightAccessor height; + + public NMSWorldProperties(long seed, LevelHeightAccessor height) { + this.seed = seed; + this.height = height; + } + + @Override + public Object getHandle() { + return height; + } + + @Override + public long getSeed() { + return seed; + } + + @Override + public int getMaxHeight() { + return height.ag(); + } + + @Override + public int getMinHeight() { + return height.u_(); + } +} From a54b48f68a3bc91dccbdff92ee2f5973be342616 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 31 May 2022 15:12:14 -0700 Subject: [PATCH 07/16] fix NMSBiomeProvider --- .../dfsek/terra/bukkit/nms/NMSBiomeInjector.java | 7 +++++-- .../dfsek/terra/bukkit/nms/NMSBiomeProvider.java | 16 ++++++++++++++-- .../terra/bukkit/nms/NMSInjectListener.java | 1 + .../terra/bukkit/world/BukkitPlatformBiome.java | 7 ++++--- 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java index a40b68439..f9db6aa15 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java @@ -74,8 +74,8 @@ public class NMSBiomeInjector { ResourceKey delegateKey = ResourceKey.a(IRegistry.aP, new MinecraftKey("terra", createBiomeID(pack, key))); RegistryGeneration.a(RegistryGeneration.i, delegateKey, platform); - Holder resourceKey = biomeRegistry.a(delegateKey, platform, Lifecycle.stable()); - platformBiome.setResourceKey(resourceKey); + biomeRegistry.a(delegateKey, platform, Lifecycle.stable()); + platformBiome.setResourceKey(delegateKey); terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.a()); @@ -87,6 +87,7 @@ public class NMSBiomeInjector { frozen.set(biomeRegistry, true); // freeze registry again :) + /* LOGGER.info("Doing tag garbage...."); Map, List>> collect = biomeRegistry .g() // streamKeysAndEntries @@ -130,6 +131,8 @@ public class NMSBiomeInjector { biomeRegistry.k(); // clearTags biomeRegistry.a(ImmutableMap.copyOf(collect)); // populateTags + + */ } catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException exception) { throw new RuntimeException(exception); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeProvider.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeProvider.java index 2d061e5e2..811dd09a5 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeProvider.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeProvider.java @@ -1,14 +1,20 @@ package com.dfsek.terra.bukkit.nms; +import com.dfsek.terra.api.util.generic.Lazy; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; import com.mojang.serialization.Codec; import net.minecraft.core.Holder; +import net.minecraft.core.IRegistry; +import net.minecraft.server.dedicated.DedicatedServer; import net.minecraft.world.level.biome.BiomeBase; import net.minecraft.world.level.biome.Climate.Sampler; import net.minecraft.world.level.biome.WorldChunkManager; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_18_R2.CraftServer; +import org.bukkit.craftbukkit.v1_18_R2.block.CraftBlock; public class NMSBiomeProvider extends WorldChunkManager { @@ -16,8 +22,13 @@ public class NMSBiomeProvider extends WorldChunkManager { private final WorldChunkManager vanilla; private final long seed; + private static final Lazy> biomeRegistry = Lazy.lazy(() -> { + DedicatedServer dedicatedserver = ((CraftServer) Bukkit.getServer()).getServer(); + return dedicatedserver.aU().b(IRegistry.aP); + }); + public NMSBiomeProvider(BiomeProvider delegate, WorldChunkManager vanilla, long seed) { - super(vanilla.b().stream()); + super(delegate.stream().map(biome -> biomeRegistry.value().g(((BukkitPlatformBiome) biome.getPlatformBiome()).getResourceKey()))); this.delegate = delegate; this.vanilla = vanilla; this.seed = seed; @@ -39,6 +50,7 @@ public class NMSBiomeProvider extends WorldChunkManager { @Override public Holder getNoiseBiome(int x, int y, int z, Sampler sampler) { - return ((BukkitPlatformBiome) delegate.getBiome(x << 2, y << 2, z << 2, seed).getPlatformBiome()).getResourceKey(); + //return CraftBlock.biomeToBiomeBase(biomeRegistry.value(), ((BukkitPlatformBiome) delegate.getBiome(x << 2, y << 2, z << 2, seed).getPlatformBiome()).getHandle()); + return biomeRegistry.value().g(((BukkitPlatformBiome) delegate.getBiome(x << 2, y << 2, z << 2, seed).getPlatformBiome()).getResourceKey()); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java index 33c159b0b..3f0ebfe87 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java @@ -41,6 +41,7 @@ public class NMSInjectListener implements Listener { custom.conf = vanilla.conf; // world config from Spigot serverWorld.k().a.u = custom; + serverWorld.generator = null; LOGGER.info("Successfully injected into world."); INJECT_LOCK.unlock(); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitPlatformBiome.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitPlatformBiome.java index 3bfc93d8f..8c30076e4 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitPlatformBiome.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitPlatformBiome.java @@ -20,22 +20,23 @@ package com.dfsek.terra.bukkit.world; import com.dfsek.terra.api.world.biome.PlatformBiome; import net.minecraft.core.Holder; +import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.biome.BiomeBase; public class BukkitPlatformBiome implements PlatformBiome { private final org.bukkit.block.Biome biome; - private Holder resourceKey; + private ResourceKey resourceKey; public BukkitPlatformBiome(org.bukkit.block.Biome biome) { this.biome = biome; } - public void setResourceKey(Holder resourceKey) { + public void setResourceKey(ResourceKey resourceKey) { this.resourceKey = resourceKey; } - public Holder getResourceKey() { + public ResourceKey getResourceKey() { return resourceKey; } From e3dd42c85623060ec93c5abf25ff161498471bc6 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 31 May 2022 15:20:23 -0700 Subject: [PATCH 08/16] fix deadlock --- .../terra/bukkit/nms/NMSBiomeInjector.java | 122 ++++++++++-------- .../terra/bukkit/nms/NMSInjectListener.java | 12 ++ 2 files changed, 77 insertions(+), 57 deletions(-) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java index f9db6aa15..cda50042f 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java @@ -1,18 +1,10 @@ package com.dfsek.terra.bukkit.nms; -import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.world.biome.Biome; -import com.dfsek.terra.bukkit.config.VanillaBiomeProperties; -import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; -import com.dfsek.terra.registry.master.ConfigRegistry; - import com.google.common.collect.ImmutableMap; import com.mojang.serialization.Lifecycle; import net.minecraft.core.Holder; -import net.minecraft.core.HolderSet.Named; import net.minecraft.core.IRegistry; import net.minecraft.core.IRegistryWritable; -import net.minecraft.core.Registry; import net.minecraft.core.RegistryMaterials; import net.minecraft.data.RegistryGeneration; import net.minecraft.resources.MinecraftKey; @@ -39,27 +31,39 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.bukkit.config.VanillaBiomeProperties; +import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; +import com.dfsek.terra.registry.master.ConfigRegistry; + public class NMSBiomeInjector { private static final Logger LOGGER = LoggerFactory.getLogger(NMSBiomeInjector.class); + private static final Map> terraBiomeMap = new HashMap<>(); - public static void registerBiomes(ConfigRegistry configRegistry) { + public static IRegistryWritable getBiomeRegistry() { CraftServer craftserver = (CraftServer) Bukkit.getServer(); DedicatedServer dedicatedserver = craftserver.getServer(); - - IRegistryWritable biomeRegistry = (IRegistryWritable) dedicatedserver + + return (IRegistryWritable) dedicatedserver .aU() // getRegistryManager .b( // getRegistry IRegistry.aP // biome registry key ); + } + + public static void registerBiomes(ConfigRegistry configRegistry) { + try { LOGGER.info("Hacking biome registry..."); + IRegistryWritable biomeRegistry = getBiomeRegistry(); Field frozen = RegistryMaterials.class.getDeclaredField("bL"); // registry frozen field frozen.setAccessible(true); frozen.set(biomeRegistry, false); - Map> terraBiomeMap = new HashMap<>(); + configRegistry.forEach(pack -> pack.getRegistry(Biome.class).forEach((key, biome) -> { try { @@ -87,57 +91,61 @@ public class NMSBiomeInjector { frozen.set(biomeRegistry, true); // freeze registry again :) - /* - LOGGER.info("Doing tag garbage...."); - Map, List>> collect = biomeRegistry - .g() // streamKeysAndEntries - .collect(HashMap::new, - (map, pair) -> - map.put(pair.getFirst(), new ArrayList<>(pair.getSecond().a().toList())), - HashMap::putAll); - - terraBiomeMap - .forEach((vb, terraBiomes) -> - getEntry(biomeRegistry, vb) - .ifPresentOrElse(vanilla -> terraBiomes - .forEach(tb -> - getEntry(biomeRegistry, tb) - .ifPresentOrElse( - terra -> { - LOGGER.debug( - vanilla.e() - .orElseThrow() - .a() + - " (vanilla for " + - terra.e() - .orElseThrow() - .a() + - ": " + - vanilla.c() - .toList()); - - vanilla.c() - .forEach( - tag -> collect - .computeIfAbsent( - tag, - t -> new ArrayList<>()) - .add(terra)); - }, - () -> LOGGER.error( - "No such biome: {}", - tb))), - () -> LOGGER.error("No vanilla biome: {}", vb))); - - biomeRegistry.k(); // clearTags - biomeRegistry.a(ImmutableMap.copyOf(collect)); // populateTags - */ + } catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException exception) { throw new RuntimeException(exception); } } + public static void injectTags() { + LOGGER.info("Doing tag garbage...."); + IRegistryWritable biomeRegistry = getBiomeRegistry(); + Map, List>> collect = biomeRegistry + .g() // streamKeysAndEntries + .collect(HashMap::new, + (map, pair) -> + map.put(pair.getFirst(), new ArrayList<>(pair.getSecond().a().toList())), + HashMap::putAll); + + terraBiomeMap + .forEach((vb, terraBiomes) -> + getEntry(biomeRegistry, vb) + .ifPresentOrElse(vanilla -> terraBiomes + .forEach(tb -> + getEntry(biomeRegistry, tb) + .ifPresentOrElse( + terra -> { + LOGGER.debug( + vanilla.e() + .orElseThrow() + .a() + + " (vanilla for " + + terra.e() + .orElseThrow() + .a() + + ": " + + vanilla.c() + .toList()); + + vanilla.c() + .forEach( + tag -> collect + .computeIfAbsent( + tag, + t -> new ArrayList<>()) + .add(terra)); + }, + () -> LOGGER.error( + "No such biome: {}", + tb))), + () -> LOGGER.error("No vanilla biome: {}", vb))); + + biomeRegistry.k(); // clearTags + biomeRegistry.a(ImmutableMap.copyOf(collect)); // populateTags + + } + public static Optional> getEntry(IRegistry registry, MinecraftKey identifier) { return registry.b(identifier) .flatMap(registry::c) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java index 3f0ebfe87..3f5d27d15 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java @@ -7,6 +7,7 @@ import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.world.WorldInitEvent; +import org.bukkit.event.world.WorldLoadEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,6 +24,8 @@ public class NMSInjectListener implements Listener { private static final Set INJECTED = new HashSet<>(); private static final ReentrantLock INJECT_LOCK = new ReentrantLock(); + private volatile boolean tags = false; + @EventHandler public void onWorldInit(WorldInitEvent event) { if (!INJECTED.contains(event.getWorld()) && event.getWorld().getGenerator() instanceof BukkitChunkGeneratorWrapper bukkitChunkGeneratorWrapper) { @@ -47,4 +50,13 @@ public class NMSInjectListener implements Listener { INJECT_LOCK.unlock(); } } + + @EventHandler + public void onWorldLoad(WorldLoadEvent load) { + if(!tags) { + System.out.println("Injecting tags late to prevent deadlock. Thank you Bukkit."); + tags = true; + NMSBiomeInjector.injectTags(); + } + } } From 285367f61645e6b9603d84b3723c733ee65e040f Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 31 May 2022 15:43:24 -0700 Subject: [PATCH 09/16] dont inject vanilla gen settings in bukkit biome delegate --- .../java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java index cda50042f..0d240007e 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java @@ -167,10 +167,9 @@ public class NMSBiomeInjector { BiomeSettingsMobs biomeSettingMobs = (BiomeSettingsMobs) biomeSettingMobsField.get(vanilla); builder.a(biomeSettingMobs); - Field biomeSettingGenField = BiomeBase.class.getDeclaredField("j"); - biomeSettingGenField.setAccessible(true); - BiomeSettingsGeneration biomeSettingGen = (BiomeSettingsGeneration) biomeSettingGenField.get(vanilla); - builder.a(biomeSettingGen) + + BiomeSettingsGeneration.a generationBuilder = new BiomeSettingsGeneration.a(); // builder + builder.a(generationBuilder.a()) .a(vanilla.c()) .b(vanilla.h()) // precipitation .a(vanilla.i()); // temp From b93ff99b2e18d929e9fc9dba2189130bc29149a0 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 31 May 2022 15:51:58 -0700 Subject: [PATCH 10/16] use server structure registry --- .../bukkit/nms/NMSChunkGeneratorDelegate.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java index 29a821e30..3ba22039a 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java @@ -9,11 +9,15 @@ import com.dfsek.terra.bukkit.world.block.data.BukkitBlockState; import com.mojang.serialization.Codec; import net.minecraft.core.BlockPosition; +import net.minecraft.core.IRegistry; +import net.minecraft.core.IRegistryWritable; +import net.minecraft.server.dedicated.DedicatedServer; import net.minecraft.server.level.RegionLimitedWorldAccess; import net.minecraft.world.level.BlockColumn; import net.minecraft.world.level.GeneratorAccessSeed; import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.biome.BiomeBase; import net.minecraft.world.level.biome.BiomeManager; import net.minecraft.world.level.biome.Climate; import net.minecraft.world.level.biome.Climate.Sampler; @@ -24,10 +28,14 @@ import net.minecraft.world.level.levelgen.ChunkGeneratorAbstract; import net.minecraft.world.level.levelgen.HeightMap; import net.minecraft.world.level.levelgen.WorldGenStage; import net.minecraft.world.level.levelgen.blending.Blender; +import net.minecraft.world.level.levelgen.structure.StructureSet; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_18_R2.CraftServer; import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; import org.bukkit.craftbukkit.v1_18_R2.block.data.CraftBlockData; import java.util.List; +import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; @@ -42,9 +50,20 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { private final long seed; + public static IRegistry getStructureRegistry() { + CraftServer craftserver = (CraftServer) Bukkit.getServer(); + DedicatedServer dedicatedserver = craftserver.getServer(); + + return dedicatedserver + .aU() // getRegistryManager + .b( // getRegistry + IRegistry.aM // biome registry key + ); + } + public NMSChunkGeneratorDelegate(ChunkGenerator vanilla, ConfigPack pack, NMSBiomeProvider biomeProvider, long seed) { - super(vanilla.b, vanilla.e, biomeProvider, biomeProvider, seed); + super(getStructureRegistry(), Optional.empty(), biomeProvider, biomeProvider, seed); this.delegate = pack.getGeneratorProvider().newInstance(pack); this.vanilla = vanilla; this.biomeSource = biomeProvider; From 68ac277471f8ac9579dcd830512f576352380a24 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 31 May 2022 16:43:43 -0700 Subject: [PATCH 11/16] clean up --- .../BukkitChunkGeneratorWrapper.java | 2 +- .../terra/bukkit/nms/NMSBiomeInjector.java | 71 ++++++++----------- .../bukkit/nms/NMSChunkGeneratorDelegate.java | 26 ++----- 3 files changed, 39 insertions(+), 60 deletions(-) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java index 30ae9d96e..ac7444da2 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java @@ -93,7 +93,7 @@ public class BukkitChunkGeneratorWrapper extends org.bukkit.generator.ChunkGener @Override public boolean shouldGenerateDecorations() { - return false; + return true; } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java index 0d240007e..357c262c8 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java @@ -45,8 +45,8 @@ public class NMSBiomeInjector { public static IRegistryWritable getBiomeRegistry() { CraftServer craftserver = (CraftServer) Bukkit.getServer(); DedicatedServer dedicatedserver = craftserver.getServer(); - - return (IRegistryWritable) dedicatedserver + + return (IRegistryWritable) dedicatedserver .aU() // getRegistryManager .b( // getRegistry IRegistry.aP // biome registry key @@ -62,7 +62,6 @@ public class NMSBiomeInjector { Field frozen = RegistryMaterials.class.getDeclaredField("bL"); // registry frozen field frozen.setAccessible(true); frozen.set(biomeRegistry, false); - configRegistry.forEach(pack -> pack.getRegistry(Biome.class).forEach((key, biome) -> { @@ -80,7 +79,7 @@ public class NMSBiomeInjector { RegistryGeneration.a(RegistryGeneration.i, delegateKey, platform); biomeRegistry.a(delegateKey, platform, Lifecycle.stable()); platformBiome.setResourceKey(delegateKey); - + terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.a()); LOGGER.debug("Registered biome: " + delegateKey); @@ -90,7 +89,6 @@ public class NMSBiomeInjector { })); frozen.set(biomeRegistry, true); // freeze registry again :) - } catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException exception) { @@ -107,43 +105,36 @@ public class NMSBiomeInjector { (map, pair) -> map.put(pair.getFirst(), new ArrayList<>(pair.getSecond().a().toList())), HashMap::putAll); - + terraBiomeMap .forEach((vb, terraBiomes) -> getEntry(biomeRegistry, vb) - .ifPresentOrElse(vanilla -> terraBiomes - .forEach(tb -> - getEntry(biomeRegistry, tb) - .ifPresentOrElse( - terra -> { - LOGGER.debug( - vanilla.e() - .orElseThrow() - .a() + - " (vanilla for " + - terra.e() - .orElseThrow() - .a() + - ": " + - vanilla.c() - .toList()); - - vanilla.c() - .forEach( - tag -> collect - .computeIfAbsent( - tag, - t -> new ArrayList<>()) - .add(terra)); - }, - () -> LOGGER.error( - "No such biome: {}", - tb))), - () -> LOGGER.error("No vanilla biome: {}", vb))); - + .ifPresentOrElse( + vanilla -> terraBiomes + .forEach(tb -> getEntry(biomeRegistry, tb) + .ifPresentOrElse( + terra -> { + LOGGER.debug(vanilla.e().orElseThrow().a() + + " (vanilla for " + + terra.e().orElseThrow().a() + + ": " + + vanilla.c().toList()); + + vanilla.c() + .forEach( + tag -> collect + .computeIfAbsent(tag, + t -> new ArrayList<>()) + .add(terra)); + }, + () -> LOGGER.error( + "No such biome: {}", + tb))), + () -> LOGGER.error("No vanilla biome: {}", vb))); + biomeRegistry.k(); // clearTags biomeRegistry.a(ImmutableMap.copyOf(collect)); // populateTags - + } public static Optional> getEntry(IRegistry registry, MinecraftKey identifier) { @@ -170,9 +161,9 @@ public class NMSBiomeInjector { BiomeSettingsGeneration.a generationBuilder = new BiomeSettingsGeneration.a(); // builder builder.a(generationBuilder.a()) - .a(vanilla.c()) - .b(vanilla.h()) // precipitation - .a(vanilla.i()); // temp + .a(vanilla.c()) + .b(vanilla.h()) // precipitation + .a(vanilla.i()); // temp BiomeFog.a effects = new BiomeFog.a(); // Builder diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java index 3ba22039a..017c97045 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java @@ -1,23 +1,13 @@ package com.dfsek.terra.bukkit.nms; -import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -import com.dfsek.terra.api.world.info.WorldProperties; -import com.dfsek.terra.bukkit.world.BukkitAdapter; - -import com.dfsek.terra.bukkit.world.block.data.BukkitBlockState; - import com.mojang.serialization.Codec; import net.minecraft.core.BlockPosition; import net.minecraft.core.IRegistry; -import net.minecraft.core.IRegistryWritable; import net.minecraft.server.dedicated.DedicatedServer; import net.minecraft.server.level.RegionLimitedWorldAccess; import net.minecraft.world.level.BlockColumn; -import net.minecraft.world.level.GeneratorAccessSeed; import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.StructureManager; -import net.minecraft.world.level.biome.BiomeBase; import net.minecraft.world.level.biome.BiomeManager; import net.minecraft.world.level.biome.Climate; import net.minecraft.world.level.biome.Climate.Sampler; @@ -31,7 +21,6 @@ import net.minecraft.world.level.levelgen.blending.Blender; import net.minecraft.world.level.levelgen.structure.StructureSet; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_18_R2.CraftServer; -import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; import org.bukkit.craftbukkit.v1_18_R2.block.data.CraftBlockData; import java.util.List; @@ -39,9 +28,12 @@ import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; + public class NMSChunkGeneratorDelegate extends ChunkGenerator { - private final NMSBiomeProvider biomeSource; private final com.dfsek.terra.api.world.chunk.generation.ChunkGenerator delegate; @@ -54,7 +46,7 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { CraftServer craftserver = (CraftServer) Bukkit.getServer(); DedicatedServer dedicatedserver = craftserver.getServer(); - return dedicatedserver + return dedicatedserver .aU() // getRegistryManager .b( // getRegistry IRegistry.aM // biome registry key @@ -94,11 +86,6 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { } - @Override - public void a(GeneratorAccessSeed gas, StructureManager manager, IChunkAccess ica) { - vanilla.a(gas, manager, ica); - } - @Override protected Codec b() { return ChunkGeneratorAbstract.a; @@ -110,7 +97,8 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { WorldProperties properties = new NMSWorldProperties(seed, height); BiomeProvider biomeProvider = pack.getBiomeProvider().caching(properties); for(int y = properties.getMaxHeight() - 1; y >= properties.getMinHeight(); y--) { - array[y - properties.getMinHeight()] = ((CraftBlockData) delegate.getBlock(properties, x, y, z, biomeProvider).getHandle()).getState(); + array[y - properties.getMinHeight()] = ((CraftBlockData) delegate.getBlock(properties, x, y, z, biomeProvider) + .getHandle()).getState(); } return new BlockColumn(getMinimumY(), array); } From 10308959a14368fcdb6074cc0dc21574fd70772d Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 31 May 2022 18:33:39 -0700 Subject: [PATCH 12/16] fix stronghold deadlock --- .../terra/bukkit/nms/NMSBiomeInjector.java | 92 ++++++-------- .../bukkit/nms/NMSChunkGeneratorDelegate.java | 120 ++++++++++++++++-- .../terra/bukkit/nms/NMSInjectListener.java | 22 ++-- .../dfsek/terra/bukkit/nms/Registries.java | 31 +++++ 4 files changed, 186 insertions(+), 79 deletions(-) create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/Registries.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java index 357c262c8..843cf8430 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java @@ -42,28 +42,15 @@ public class NMSBiomeInjector { private static final Logger LOGGER = LoggerFactory.getLogger(NMSBiomeInjector.class); private static final Map> terraBiomeMap = new HashMap<>(); - public static IRegistryWritable getBiomeRegistry() { - CraftServer craftserver = (CraftServer) Bukkit.getServer(); - DedicatedServer dedicatedserver = craftserver.getServer(); - - return (IRegistryWritable) dedicatedserver - .aU() // getRegistryManager - .b( // getRegistry - IRegistry.aP // biome registry key - ); - } public static void registerBiomes(ConfigRegistry configRegistry) { - - try { LOGGER.info("Hacking biome registry..."); - IRegistryWritable biomeRegistry = getBiomeRegistry(); + IRegistryWritable biomeRegistry = (IRegistryWritable) Registries.biomeRegistry(); Field frozen = RegistryMaterials.class.getDeclaredField("bL"); // registry frozen field frozen.setAccessible(true); frozen.set(biomeRegistry, false); - configRegistry.forEach(pack -> pack.getRegistry(Biome.class).forEach((key, biome) -> { try { BukkitPlatformBiome platformBiome = (BukkitPlatformBiome) biome.getPlatformBiome(); @@ -90,53 +77,48 @@ public class NMSBiomeInjector { frozen.set(biomeRegistry, true); // freeze registry again :) + LOGGER.info("Doing tag garbage...."); + Map, List>> collect = biomeRegistry + .g() // streamKeysAndEntries + .collect(HashMap::new, + (map, pair) -> + map.put(pair.getFirst(), new ArrayList<>(pair.getSecond().a().toList())), + HashMap::putAll); + + terraBiomeMap + .forEach((vb, terraBiomes) -> + getEntry(biomeRegistry, vb) + .ifPresentOrElse( + vanilla -> terraBiomes + .forEach(tb -> getEntry(biomeRegistry, tb) + .ifPresentOrElse( + terra -> { + LOGGER.debug(vanilla.e().orElseThrow().a() + + " (vanilla for " + + terra.e().orElseThrow().a() + + ": " + + vanilla.c().toList()); + + vanilla.c() + .forEach( + tag -> collect + .computeIfAbsent(tag, + t -> new ArrayList<>()) + .add(terra)); + }, + () -> LOGGER.error( + "No such biome: {}", + tb))), + () -> LOGGER.error("No vanilla biome: {}", vb))); + + biomeRegistry.k(); // clearTags + biomeRegistry.a(ImmutableMap.copyOf(collect)); // populateTags } catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException exception) { throw new RuntimeException(exception); } } - public static void injectTags() { - LOGGER.info("Doing tag garbage...."); - IRegistryWritable biomeRegistry = getBiomeRegistry(); - Map, List>> collect = biomeRegistry - .g() // streamKeysAndEntries - .collect(HashMap::new, - (map, pair) -> - map.put(pair.getFirst(), new ArrayList<>(pair.getSecond().a().toList())), - HashMap::putAll); - - terraBiomeMap - .forEach((vb, terraBiomes) -> - getEntry(biomeRegistry, vb) - .ifPresentOrElse( - vanilla -> terraBiomes - .forEach(tb -> getEntry(biomeRegistry, tb) - .ifPresentOrElse( - terra -> { - LOGGER.debug(vanilla.e().orElseThrow().a() + - " (vanilla for " + - terra.e().orElseThrow().a() + - ": " + - vanilla.c().toList()); - - vanilla.c() - .forEach( - tag -> collect - .computeIfAbsent(tag, - t -> new ArrayList<>()) - .add(terra)); - }, - () -> LOGGER.error( - "No such biome: {}", - tb))), - () -> LOGGER.error("No vanilla biome: {}", vb))); - - biomeRegistry.k(); // clearTags - biomeRegistry.a(ImmutableMap.copyOf(collect)); // populateTags - - } - public static Optional> getEntry(IRegistry registry, MinecraftKey identifier) { return registry.b(identifier) .flatMap(registry::c) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java index 017c97045..9105caa8d 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java @@ -1,13 +1,20 @@ package com.dfsek.terra.bukkit.nms; +import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Codec; +import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import net.minecraft.core.BlockPosition; +import net.minecraft.core.Holder; import net.minecraft.core.IRegistry; +import net.minecraft.core.IRegistryCustom; +import net.minecraft.core.SectionPosition; import net.minecraft.server.dedicated.DedicatedServer; import net.minecraft.server.level.RegionLimitedWorldAccess; import net.minecraft.world.level.BlockColumn; +import net.minecraft.world.level.ChunkCoordIntPair; import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.biome.BiomeBase; import net.minecraft.world.level.biome.BiomeManager; import net.minecraft.world.level.biome.Climate; import net.minecraft.world.level.biome.Climate.Sampler; @@ -19,21 +26,35 @@ import net.minecraft.world.level.levelgen.HeightMap; import net.minecraft.world.level.levelgen.WorldGenStage; import net.minecraft.world.level.levelgen.blending.Blender; import net.minecraft.world.level.levelgen.structure.StructureSet; +import net.minecraft.world.level.levelgen.structure.placement.ConcentricRingsStructurePlacement; +import net.minecraft.world.level.levelgen.structure.placement.StructurePlacement; +import net.minecraft.world.level.levelgen.structure.templatesystem.DefinedStructureManager; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_18_R2.CraftServer; import org.bukkit.craftbukkit.v1_18_R2.block.data.CraftBlockData; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import javax.annotation.Nullable; +import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.Random; +import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; +import java.util.stream.Collectors; import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.util.generic.Lazy; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.info.WorldProperties; public class NMSChunkGeneratorDelegate extends ChunkGenerator { + private static final Logger LOGGER = LoggerFactory.getLogger(NMSChunkGeneratorDelegate.class); private final NMSBiomeProvider biomeSource; private final com.dfsek.terra.api.world.chunk.generation.ChunkGenerator delegate; @@ -42,20 +63,12 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { private final long seed; - public static IRegistry getStructureRegistry() { - CraftServer craftserver = (CraftServer) Bukkit.getServer(); - DedicatedServer dedicatedserver = craftserver.getServer(); - - return dedicatedserver - .aU() // getRegistryManager - .b( // getRegistry - IRegistry.aM // biome registry key - ); - } + private final Map>> h = new Object2ObjectArrayMap<>(); + public NMSChunkGeneratorDelegate(ChunkGenerator vanilla, ConfigPack pack, NMSBiomeProvider biomeProvider, long seed) { - super(getStructureRegistry(), Optional.empty(), biomeProvider, biomeProvider, seed); + super(Registries.structureSet(), Optional.empty(), biomeProvider, biomeProvider, seed); this.delegate = pack.getGeneratorProvider().newInstance(pack); this.vanilla = vanilla; this.biomeSource = biomeProvider; @@ -141,6 +154,91 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { return y; } + @Override + public void a(IRegistryCustom iregistrycustom, StructureManager structuremanager, IChunkAccess ichunkaccess, + DefinedStructureManager definedstructuremanager, long i) { + super.a(iregistrycustom, structuremanager, ichunkaccess, definedstructuremanager, i); + } + + @Nullable + @Override + public List a(ConcentricRingsStructurePlacement concentricringsstructureplacement) { + this.i(); + return this.h.get(concentricringsstructureplacement).value(); + } + + private volatile boolean rings = false; + + @Override + public synchronized void i() { + if(!this.rings) { + super.i(); + this.populateStrongholdData(); + this.rings = true; + } + } + + private void populateStrongholdData() { + LOGGER.info("Generating safe stronghold data. This may take up to a minute."); + Set> set = this.d.b(); + a().map(h -> h.a()).forEach((holder) -> { // we dont need the spigot crap because it doesnt touch concentric. + StructurePlacement structureplacement = holder.b(); + if(structureplacement instanceof ConcentricRingsStructurePlacement concentricringsstructureplacement) { + if(holder.a().stream().anyMatch((structureset_a1) -> structureset_a1.a(set::contains))) { + this.h.put(concentricringsstructureplacement, + Lazy.lazy(() -> this.generateRingPositions(holder, concentricringsstructureplacement))); + } + } + }); + } + + private List generateRingPositions(StructureSet holder, + ConcentricRingsStructurePlacement concentricringsstructureplacement) { + if(concentricringsstructureplacement.d() == 0) { + return List.of(); + } + List list = new ArrayList<>(); + Set> set = holder.a().stream().flatMap((structureset_a) -> (structureset_a.a().a()).a().a()).collect( + Collectors.toSet()); + int i = concentricringsstructureplacement.b(); + int j = concentricringsstructureplacement.d(); + int k = concentricringsstructureplacement.c(); + Random random = new Random(); + random.setSeed(this.j); + double d0 = random.nextDouble() * Math.PI * 2.0; + int l = 0; + int i1 = 0; + + for(int j1 = 0; j1 < j; ++j1) { + double d1 = (double) (4 * i + i * i1 * 6) + (random.nextDouble() - 0.5) * (double) i * 2.5; + int k1 = (int) Math.round(Math.cos(d0) * d1); + int l1 = (int) Math.round(Math.sin(d0) * d1); + int i2 = SectionPosition.a(k1, 8); + int j2 = SectionPosition.a(l1, 8); + Objects.requireNonNull(set); + Pair> pair = this.c.a(i2, 0, j2, 112, set::contains, random, this.d()); + if(pair != null) { + BlockPosition blockposition = pair.getFirst(); + k1 = SectionPosition.a(blockposition.u()); + l1 = SectionPosition.a(blockposition.w()); + } + + list.add(new ChunkCoordIntPair(k1, l1)); + d0 += 6.283185307179586 / (double) k; + ++l; + if(l == k) { + ++i1; + l = 0; + k += 2 * k / (i1 + 1); + k = Math.min(k, j - j1); + d0 += random.nextDouble() * Math.PI * 2.0; + } + } + System.out.println(list); + return list; + + } + public int getMinimumY() { return h(); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java index 3f5d27d15..48dffc3bd 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java @@ -1,5 +1,7 @@ package com.dfsek.terra.bukkit.nms; +import com.dfsek.terra.api.util.generic.Construct; + import net.minecraft.server.level.WorldServer; import net.minecraft.world.level.chunk.ChunkGenerator; import org.bukkit.World; @@ -11,8 +13,11 @@ import org.bukkit.event.world.WorldLoadEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.lang.reflect.Field; import java.util.HashSet; import java.util.Set; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; import java.util.concurrent.locks.ReentrantLock; import com.dfsek.terra.api.config.ConfigPack; @@ -24,8 +29,6 @@ public class NMSInjectListener implements Listener { private static final Set INJECTED = new HashSet<>(); private static final ReentrantLock INJECT_LOCK = new ReentrantLock(); - private volatile boolean tags = false; - @EventHandler public void onWorldInit(WorldInitEvent event) { if (!INJECTED.contains(event.getWorld()) && event.getWorld().getGenerator() instanceof BukkitChunkGeneratorWrapper bukkitChunkGeneratorWrapper) { @@ -44,19 +47,12 @@ public class NMSInjectListener implements Listener { custom.conf = vanilla.conf; // world config from Spigot serverWorld.k().a.u = custom; - serverWorld.generator = null; - + LOGGER.info("Successfully injected into world."); + + serverWorld.k().a.u.i(); // generate stronghold data now + INJECT_LOCK.unlock(); } } - - @EventHandler - public void onWorldLoad(WorldLoadEvent load) { - if(!tags) { - System.out.println("Injecting tags late to prevent deadlock. Thank you Bukkit."); - tags = true; - NMSBiomeInjector.injectTags(); - } - } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/Registries.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/Registries.java new file mode 100644 index 000000000..e9c110cc5 --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/Registries.java @@ -0,0 +1,31 @@ +package com.dfsek.terra.bukkit.nms; + +import net.minecraft.core.IRegistry; +import net.minecraft.core.IRegistryWritable; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.dedicated.DedicatedServer; +import net.minecraft.world.level.biome.BiomeBase; +import net.minecraft.world.level.levelgen.structure.StructureSet; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_18_R2.CraftServer; + + +public class Registries { + private static IRegistry getRegistry(ResourceKey> key) { + CraftServer craftserver = (CraftServer) Bukkit.getServer(); + DedicatedServer dedicatedserver = craftserver.getServer(); + return dedicatedserver + .aU() // getRegistryManager + .b( // getRegistry + key + ); + } + + public static IRegistry biomeRegistry() { + return getRegistry(IRegistry.aP); + } + + public static IRegistry structureSet() { + return getRegistry(IRegistry.aM); + } +} From 8e933a1bb48c39c6de5bfb4a37316ff47c7fdd24 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 31 May 2022 18:41:39 -0700 Subject: [PATCH 13/16] remove println --- .../com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java | 1 - 1 file changed, 1 deletion(-) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java index 9105caa8d..234d8be56 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java @@ -234,7 +234,6 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { d0 += random.nextDouble() * Math.PI * 2.0; } } - System.out.println(list); return list; } From 839013d89a56f4078bca0549ac1d6846d2a8fcd3 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 31 May 2022 22:31:40 -0700 Subject: [PATCH 14/16] split NMS away from core bukkit code --- build.gradle.kts | 2 +- buildSrc/src/main/kotlin/Utils.kt | 6 ++++ platforms/bukkit/build.gradle.kts | 18 ++-------- platforms/bukkit/common/build.gradle.kts | 18 ++++++++++ .../com/dfsek/terra/bukkit/BukkitAddon.java | 0 .../terra/bukkit/BukkitCommandSender.java | 0 .../com/dfsek/terra/bukkit/BukkitEntity.java | 0 .../com/dfsek/terra/bukkit/BukkitPlayer.java | 0 .../com/dfsek/terra/bukkit/PlatformImpl.java | 0 .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 13 ++++---- .../bukkit/config/VanillaBiomeProperties.java | 0 .../bukkit/generator/BukkitBiomeProvider.java | 0 .../BukkitChunkGeneratorWrapper.java | 0 .../bukkit/generator/BukkitProtoChunk.java | 0 .../bukkit/handles/BukkitItemHandle.java | 0 .../bukkit/handles/BukkitWorldHandle.java | 0 .../bukkit/listeners/CommonListener.java | 0 .../bukkit/listeners/SpigotListener.java | 0 .../dfsek/terra/bukkit/nms/Initializer.java | 33 +++++++++++++++++++ .../terra/bukkit/util/MinecraftUtils.java | 0 .../dfsek/terra/bukkit/util/PaperUtil.java | 0 .../dfsek/terra/bukkit/util/VersionUtil.java | 2 ++ .../terra/bukkit/world/BukkitAdapter.java | 0 .../dfsek/terra/bukkit/world/BukkitChunk.java | 0 .../bukkit/world/BukkitPlatformBiome.java | 23 +++++-------- .../terra/bukkit/world/BukkitProtoWorld.java | 0 .../terra/bukkit/world/BukkitServerWorld.java | 0 .../bukkit/world/BukkitWorldProperties.java | 0 .../world/block/BukkitBlockTypeAndItem.java | 0 .../world/block/data/BukkitBlockState.java | 0 .../world/block/state/BukkitBlockEntity.java | 0 .../world/block/state/BukkitContainer.java | 0 .../world/block/state/BukkitMobSpawner.java | 0 .../bukkit/world/block/state/BukkitSign.java | 0 .../bukkit/world/entity/BukkitEntityType.java | 0 .../world/inventory/BukkitInventory.java | 0 .../world/inventory/BukkitItemMeta.java | 0 .../world/inventory/BukkitItemStack.java | 0 .../inventory/meta/BukkitDamageable.java | 0 .../inventory/meta/BukkitEnchantment.java | 0 .../src/main/resources/plugin.yml | 0 .../bukkit/nms/v1_18_R2/build.gradle.kts | 6 ++++ .../bukkit/nms/v1_18_R2/NMSBiomeInfo.java | 10 ++++++ .../nms/v1_18_R2}/NMSBiomeInjector.java | 7 ++-- .../nms/v1_18_R2}/NMSBiomeProvider.java | 16 ++++----- .../v1_18_R2}/NMSChunkGeneratorDelegate.java | 24 ++++---------- .../bukkit/nms/v1_18_R2/NMSInitializer.java | 15 +++++++++ .../nms/v1_18_R2}/NMSInjectListener.java | 8 +---- .../nms/v1_18_R2}/NMSWorldProperties.java | 6 ++-- .../bukkit/nms/v1_18_R2}/Registries.java | 3 +- platforms/fabric/build.gradle.kts | 1 + settings.gradle.kts | 4 +++ 52 files changed, 135 insertions(+), 80 deletions(-) create mode 100644 platforms/bukkit/common/build.gradle.kts rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/BukkitAddon.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/BukkitCommandSender.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java (97%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/config/VanillaBiomeProperties.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/generator/BukkitBiomeProvider.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/generator/BukkitProtoChunk.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/handles/BukkitItemHandle.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java (100%) create mode 100644 platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/util/MinecraftUtils.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/util/PaperUtil.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/util/VersionUtil.java (97%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/world/BukkitChunk.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/world/BukkitPlatformBiome.java (69%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/world/BukkitProtoWorld.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/world/BukkitServerWorld.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorldProperties.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockTypeAndItem.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockState.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockEntity.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitContainer.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitMobSpawner.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitSign.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/world/entity/BukkitEntityType.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitInventory.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitItemMeta.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitItemStack.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/world/inventory/meta/BukkitDamageable.java (100%) rename platforms/bukkit/{ => common}/src/main/java/com/dfsek/terra/bukkit/world/inventory/meta/BukkitEnchantment.java (100%) rename platforms/bukkit/{ => common}/src/main/resources/plugin.yml (100%) create mode 100644 platforms/bukkit/nms/v1_18_R2/build.gradle.kts create mode 100644 platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInfo.java rename platforms/bukkit/{src/main/java/com/dfsek/terra/bukkit/nms => nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2}/NMSBiomeInjector.java (97%) rename platforms/bukkit/{src/main/java/com/dfsek/terra/bukkit/nms => nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2}/NMSBiomeProvider.java (90%) rename platforms/bukkit/{src/main/java/com/dfsek/terra/bukkit/nms => nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2}/NMSChunkGeneratorDelegate.java (96%) create mode 100644 platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSInitializer.java rename platforms/bukkit/{src/main/java/com/dfsek/terra/bukkit/nms => nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2}/NMSInjectListener.java (89%) rename platforms/bukkit/{src/main/java/com/dfsek/terra/bukkit/nms => nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2}/NMSWorldProperties.java (94%) rename platforms/bukkit/{src/main/java/com/dfsek/terra/bukkit/nms => nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2}/Registries.java (92%) diff --git a/build.gradle.kts b/build.gradle.kts index 283bab8b1..1bfd4a707 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -39,7 +39,7 @@ allprojects { } afterEvaluate { - forSubProjects(":platforms") { + forImmediateSubProjects(":platforms") { configureDistribution() } forSubProjects(":common:addons") { diff --git a/buildSrc/src/main/kotlin/Utils.kt b/buildSrc/src/main/kotlin/Utils.kt index 35b68e86e..b775871b0 100644 --- a/buildSrc/src/main/kotlin/Utils.kt +++ b/buildSrc/src/main/kotlin/Utils.kt @@ -29,6 +29,12 @@ fun Project.forSubProjects(project: String, action: Action) { } } +fun Project.forImmediateSubProjects(project: String, action: Action) { + project(project).childProjects.forEach { + action.execute(it.value) + } +} + fun preRelease(preRelease: Boolean) { isPrerelease = preRelease } diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index 493f81392..97ca84242 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -14,22 +14,8 @@ val paperURL = "https://papermc.io/api/v2/projects/paper/versions/%version%/buil val purpurURL = "https://api.purpurmc.org/v2/purpur/%version%/latest/download" dependencies { - shadedApi(project(":common:implementation:base")) - - api("org.slf4j:slf4j-api:1.8.0-beta4") { - because("Minecraft 1.17+ includes slf4j 1.8.0-beta4, so we need to shade it for other versions.") - } - implementation("org.apache.logging.log4j", "log4j-slf4j18-impl", Versions.Libraries.log4j_slf4j_impl) { - because("Minecraft 1.17+ includes slf4j 1.8.0-beta4, so we need to shade it for other versions.") - } - - compileOnly("io.papermc.paper:paper-api:1.18.2-R0.1-20220519.005047-123") - compileOnly(group = "org.spigotmc", name = "spigot", version = "1.18.2-R0.1-SNAPSHOT") - shadedApi("io.papermc", "paperlib", Versions.Bukkit.paperLib) - - shadedApi("com.google.guava:guava:30.0-jre") - - shadedApi("cloud.commandframework", "cloud-paper", Versions.Libraries.cloud) + shaded(project(":platforms:bukkit:common")) + shaded(project(":platforms:bukkit:nms:v1_18_R2")) } val throttleCoreCount = 0 diff --git a/platforms/bukkit/common/build.gradle.kts b/platforms/bukkit/common/build.gradle.kts new file mode 100644 index 000000000..b29891d4d --- /dev/null +++ b/platforms/bukkit/common/build.gradle.kts @@ -0,0 +1,18 @@ +repositories { + +} + +dependencies { + shadedApi(project(":common:implementation:base")) + + api("org.slf4j:slf4j-api:1.8.0-beta4") { + because("Minecraft 1.17+ includes slf4j 1.8.0-beta4, so we need to shade it for other versions.") + } + + compileOnly("io.papermc.paper:paper-api:1.18.2-R0.1-SNAPSHOT") + + shadedApi("io.papermc", "paperlib", Versions.Bukkit.paperLib) + shadedApi("com.google.guava:guava:30.0-jre") + + shadedApi("cloud.commandframework", "cloud-paper", Versions.Libraries.cloud) +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitAddon.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitAddon.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitAddon.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitAddon.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitCommandSender.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitCommandSender.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitCommandSender.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitCommandSender.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java similarity index 97% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 3379e3067..8c0b226ef 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -21,10 +21,6 @@ import cloud.commandframework.brigadier.CloudBrigadierManager; import cloud.commandframework.bukkit.CloudBukkitCapabilities; import cloud.commandframework.execution.CommandExecutionCoordinator; import cloud.commandframework.paper.PaperCommandManager; - -import com.dfsek.terra.bukkit.nms.NMSBiomeInjector; -import com.dfsek.terra.bukkit.nms.NMSInjectListener; - import org.bukkit.Bukkit; import org.bukkit.generator.ChunkGenerator; import org.bukkit.plugin.java.JavaPlugin; @@ -42,6 +38,7 @@ import com.dfsek.terra.api.event.events.platform.CommandRegistrationEvent; import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; import com.dfsek.terra.bukkit.generator.BukkitChunkGeneratorWrapper; import com.dfsek.terra.bukkit.listeners.CommonListener; +import com.dfsek.terra.bukkit.nms.Initializer; import com.dfsek.terra.bukkit.util.PaperUtil; import com.dfsek.terra.bukkit.util.VersionUtil; import com.dfsek.terra.bukkit.world.BukkitAdapter; @@ -60,7 +57,6 @@ public class TerraBukkitPlugin extends JavaPlugin { } platform.getEventManager().callEvent(new PlatformInitializationEvent()); - NMSBiomeInjector.registerBiomes(platform.getRawConfigRegistry()); try { @@ -94,8 +90,13 @@ public class TerraBukkitPlugin extends JavaPlugin { } Bukkit.getPluginManager().registerEvents(new CommonListener(), this); // Register master event listener - Bukkit.getPluginManager().registerEvents(new NMSInjectListener(), this); // Register master event listener PaperUtil.checkPaper(this); + + Initializer.init(platform); + } + + public PlatformImpl getPlatform() { + return platform; } @SuppressWarnings({ "deprecation", "AccessOfSystemProperties" }) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/config/VanillaBiomeProperties.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/config/VanillaBiomeProperties.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/config/VanillaBiomeProperties.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/config/VanillaBiomeProperties.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitBiomeProvider.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/generator/BukkitBiomeProvider.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitBiomeProvider.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/generator/BukkitBiomeProvider.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitProtoChunk.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/generator/BukkitProtoChunk.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitProtoChunk.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/generator/BukkitProtoChunk.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitItemHandle.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/handles/BukkitItemHandle.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitItemHandle.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/handles/BukkitItemHandle.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java new file mode 100644 index 000000000..e50c1b215 --- /dev/null +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java @@ -0,0 +1,33 @@ +package com.dfsek.terra.bukkit.nms; + +import com.dfsek.terra.bukkit.PlatformImpl; +import com.dfsek.terra.bukkit.TerraBukkitPlugin; + +import org.bukkit.Bukkit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.InvocationTargetException; + + +public interface Initializer { + String NMS = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; + String TERRA_PACKAGE = Initializer.class.getPackageName(); + + void initialize(PlatformImpl plugin); + + static void init(PlatformImpl platform) { + Logger logger = LoggerFactory.getLogger(Initializer.class); + try { + Class initializerClass = Class.forName(TERRA_PACKAGE + "." + NMS + ".NMSInitializer"); + try { + Initializer initializer = (Initializer) initializerClass.getConstructor().newInstance(); + initializer.initialize(platform); + } catch(ReflectiveOperationException e) { + throw new RuntimeException("Error initializing NMS bindings. Report this to Terra.", e); + } + } catch(ClassNotFoundException e) { + logger.warn("NMS bindings for version {} do not exist. Support for this version is limited.", NMS); + } + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/MinecraftUtils.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/MinecraftUtils.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/MinecraftUtils.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/MinecraftUtils.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/PaperUtil.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/PaperUtil.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/PaperUtil.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/PaperUtil.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/VersionUtil.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/VersionUtil.java similarity index 97% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/VersionUtil.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/VersionUtil.java index 469582bf2..08e9b4864 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/VersionUtil.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/VersionUtil.java @@ -1,5 +1,7 @@ package com.dfsek.terra.bukkit.util; +import ca.solostudios.strata.Versions; +import ca.solostudios.strata.version.Version; import io.papermc.lib.PaperLib; import org.bukkit.Bukkit; import org.slf4j.Logger; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitChunk.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitChunk.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitChunk.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitChunk.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitPlatformBiome.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitPlatformBiome.java similarity index 69% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitPlatformBiome.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitPlatformBiome.java index 8c30076e4..aff5773fa 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitPlatformBiome.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitPlatformBiome.java @@ -17,31 +17,26 @@ package com.dfsek.terra.bukkit.world; +import com.dfsek.terra.api.properties.Context; +import com.dfsek.terra.api.properties.PropertyHolder; import com.dfsek.terra.api.world.biome.PlatformBiome; -import net.minecraft.core.Holder; -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.level.biome.BiomeBase; - -public class BukkitPlatformBiome implements PlatformBiome { +public class BukkitPlatformBiome implements PlatformBiome, PropertyHolder { private final org.bukkit.block.Biome biome; - private ResourceKey resourceKey; + private final Context context = new Context(); public BukkitPlatformBiome(org.bukkit.block.Biome biome) { this.biome = biome; } - public void setResourceKey(ResourceKey resourceKey) { - this.resourceKey = resourceKey; - } - - public ResourceKey getResourceKey() { - return resourceKey; - } - @Override public org.bukkit.block.Biome getHandle() { return biome; } + + @Override + public Context getContext() { + return context; + } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitProtoWorld.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitProtoWorld.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitProtoWorld.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitProtoWorld.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitServerWorld.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitServerWorld.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitServerWorld.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitServerWorld.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorldProperties.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorldProperties.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorldProperties.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorldProperties.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockTypeAndItem.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockTypeAndItem.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockTypeAndItem.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockTypeAndItem.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockState.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockState.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockState.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockState.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockEntity.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockEntity.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockEntity.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockEntity.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitContainer.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitContainer.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitContainer.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitContainer.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitMobSpawner.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitMobSpawner.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitMobSpawner.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitMobSpawner.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitSign.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitSign.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitSign.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitSign.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/entity/BukkitEntityType.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/entity/BukkitEntityType.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/entity/BukkitEntityType.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/entity/BukkitEntityType.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitInventory.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitInventory.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitInventory.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitInventory.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitItemMeta.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitItemMeta.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitItemMeta.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitItemMeta.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitItemStack.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitItemStack.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitItemStack.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitItemStack.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/meta/BukkitDamageable.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/inventory/meta/BukkitDamageable.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/meta/BukkitDamageable.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/inventory/meta/BukkitDamageable.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/meta/BukkitEnchantment.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/inventory/meta/BukkitEnchantment.java similarity index 100% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/meta/BukkitEnchantment.java rename to platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/inventory/meta/BukkitEnchantment.java diff --git a/platforms/bukkit/src/main/resources/plugin.yml b/platforms/bukkit/common/src/main/resources/plugin.yml similarity index 100% rename from platforms/bukkit/src/main/resources/plugin.yml rename to platforms/bukkit/common/src/main/resources/plugin.yml diff --git a/platforms/bukkit/nms/v1_18_R2/build.gradle.kts b/platforms/bukkit/nms/v1_18_R2/build.gradle.kts new file mode 100644 index 000000000..f3cb6a90a --- /dev/null +++ b/platforms/bukkit/nms/v1_18_R2/build.gradle.kts @@ -0,0 +1,6 @@ +dependencies { + api(project(":platforms:bukkit:common")) + + compileOnly("io.papermc.paper:paper-api:1.18.2-R0.1-20220519.005047-123") + compileOnly(group = "org.spigotmc", name = "spigot", version = "1.18.2-R0.1-SNAPSHOT") +} \ No newline at end of file diff --git a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInfo.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInfo.java new file mode 100644 index 000000000..2cba0bfe2 --- /dev/null +++ b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInfo.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.bukkit.nms.v1_18_R2; + +import com.dfsek.terra.api.properties.Properties; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.BiomeBase; + + +public record NMSBiomeInfo(ResourceKey biomeKey) implements Properties { +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInjector.java similarity index 97% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java rename to platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInjector.java index 843cf8430..cbd8ab74b 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java +++ b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInjector.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.nms; +package com.dfsek.terra.bukkit.nms.v1_18_R2; import com.google.common.collect.ImmutableMap; import com.mojang.serialization.Lifecycle; @@ -9,16 +9,13 @@ import net.minecraft.core.RegistryMaterials; import net.minecraft.data.RegistryGeneration; import net.minecraft.resources.MinecraftKey; import net.minecraft.resources.ResourceKey; -import net.minecraft.server.dedicated.DedicatedServer; import net.minecraft.tags.TagKey; import net.minecraft.world.level.biome.BiomeBase; import net.minecraft.world.level.biome.BiomeFog; import net.minecraft.world.level.biome.BiomeFog.GrassColor; import net.minecraft.world.level.biome.BiomeSettingsGeneration; import net.minecraft.world.level.biome.BiomeSettingsMobs; -import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; -import org.bukkit.craftbukkit.v1_18_R2.CraftServer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -65,7 +62,7 @@ public class NMSBiomeInjector { RegistryGeneration.a(RegistryGeneration.i, delegateKey, platform); biomeRegistry.a(delegateKey, platform, Lifecycle.stable()); - platformBiome.setResourceKey(delegateKey); + platformBiome.getContext().put(new NMSBiomeInfo(delegateKey)); terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.a()); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeProvider.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeProvider.java similarity index 90% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeProvider.java rename to platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeProvider.java index 811dd09a5..c4fc62749 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeProvider.java +++ b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeProvider.java @@ -1,9 +1,4 @@ -package com.dfsek.terra.bukkit.nms; - -import com.dfsek.terra.api.util.generic.Lazy; -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; - -import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; +package com.dfsek.terra.bukkit.nms.v1_18_R2; import com.mojang.serialization.Codec; import net.minecraft.core.Holder; @@ -14,7 +9,10 @@ import net.minecraft.world.level.biome.Climate.Sampler; import net.minecraft.world.level.biome.WorldChunkManager; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_18_R2.CraftServer; -import org.bukkit.craftbukkit.v1_18_R2.block.CraftBlock; + +import com.dfsek.terra.api.util.generic.Lazy; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; public class NMSBiomeProvider extends WorldChunkManager { @@ -28,7 +26,7 @@ public class NMSBiomeProvider extends WorldChunkManager { }); public NMSBiomeProvider(BiomeProvider delegate, WorldChunkManager vanilla, long seed) { - super(delegate.stream().map(biome -> biomeRegistry.value().g(((BukkitPlatformBiome) biome.getPlatformBiome()).getResourceKey()))); + super(delegate.stream().map(biome -> biomeRegistry.value().g(((BukkitPlatformBiome) biome.getPlatformBiome()).getContext().get(NMSBiomeInfo.class).biomeKey()))); this.delegate = delegate; this.vanilla = vanilla; this.seed = seed; @@ -51,6 +49,6 @@ public class NMSBiomeProvider extends WorldChunkManager { @Override public Holder getNoiseBiome(int x, int y, int z, Sampler sampler) { //return CraftBlock.biomeToBiomeBase(biomeRegistry.value(), ((BukkitPlatformBiome) delegate.getBiome(x << 2, y << 2, z << 2, seed).getPlatformBiome()).getHandle()); - return biomeRegistry.value().g(((BukkitPlatformBiome) delegate.getBiome(x << 2, y << 2, z << 2, seed).getPlatformBiome()).getResourceKey()); + return biomeRegistry.value().g(((BukkitPlatformBiome) delegate.getBiome(x << 2, y << 2, z << 2, seed).getPlatformBiome()).getContext().get(NMSBiomeInfo.class).biomeKey()); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSChunkGeneratorDelegate.java similarity index 96% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java rename to platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSChunkGeneratorDelegate.java index 234d8be56..fc68790e3 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSChunkGeneratorDelegate.java @@ -1,14 +1,17 @@ -package com.dfsek.terra.bukkit.nms; +package com.dfsek.terra.bukkit.nms.v1_18_R2; + +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.util.generic.Lazy; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Codec; import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import net.minecraft.core.BlockPosition; import net.minecraft.core.Holder; -import net.minecraft.core.IRegistry; import net.minecraft.core.IRegistryCustom; import net.minecraft.core.SectionPosition; -import net.minecraft.server.dedicated.DedicatedServer; import net.minecraft.server.level.RegionLimitedWorldAccess; import net.minecraft.world.level.BlockColumn; import net.minecraft.world.level.ChunkCoordIntPair; @@ -29,29 +32,16 @@ import net.minecraft.world.level.levelgen.structure.StructureSet; import net.minecraft.world.level.levelgen.structure.placement.ConcentricRingsStructurePlacement; import net.minecraft.world.level.levelgen.structure.placement.StructurePlacement; import net.minecraft.world.level.levelgen.structure.templatesystem.DefinedStructureManager; -import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_18_R2.CraftServer; import org.bukkit.craftbukkit.v1_18_R2.block.data.CraftBlockData; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Random; -import java.util.Set; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; import java.util.stream.Collectors; -import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.util.generic.Lazy; -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -import com.dfsek.terra.api.world.info.WorldProperties; - public class NMSChunkGeneratorDelegate extends ChunkGenerator { private static final Logger LOGGER = LoggerFactory.getLogger(NMSChunkGeneratorDelegate.class); diff --git a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSInitializer.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSInitializer.java new file mode 100644 index 000000000..60c7e1c1d --- /dev/null +++ b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSInitializer.java @@ -0,0 +1,15 @@ +package com.dfsek.terra.bukkit.nms.v1_18_R2; + +import org.bukkit.Bukkit; + +import com.dfsek.terra.bukkit.PlatformImpl; +import com.dfsek.terra.bukkit.nms.Initializer; + + +public class NMSInitializer implements Initializer { + @Override + public void initialize(PlatformImpl platform) { + NMSBiomeInjector.registerBiomes(platform.getRawConfigRegistry()); + Bukkit.getPluginManager().registerEvents(new NMSInjectListener(), platform.getPlugin()); + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSInjectListener.java similarity index 89% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java rename to platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSInjectListener.java index 48dffc3bd..7402c1463 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java +++ b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSInjectListener.java @@ -1,6 +1,4 @@ -package com.dfsek.terra.bukkit.nms; - -import com.dfsek.terra.api.util.generic.Construct; +package com.dfsek.terra.bukkit.nms.v1_18_R2; import net.minecraft.server.level.WorldServer; import net.minecraft.world.level.chunk.ChunkGenerator; @@ -9,15 +7,11 @@ import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.world.WorldInitEvent; -import org.bukkit.event.world.WorldLoadEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.lang.reflect.Field; import java.util.HashSet; import java.util.Set; -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; import java.util.concurrent.locks.ReentrantLock; import com.dfsek.terra.api.config.ConfigPack; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSWorldProperties.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSWorldProperties.java similarity index 94% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSWorldProperties.java rename to platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSWorldProperties.java index 198a23a3e..97dd66167 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSWorldProperties.java +++ b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSWorldProperties.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.bukkit.nms; - -import com.dfsek.terra.api.world.info.WorldProperties; +package com.dfsek.terra.bukkit.nms.v1_18_R2; import net.minecraft.world.level.LevelHeightAccessor; +import com.dfsek.terra.api.world.info.WorldProperties; + public class NMSWorldProperties implements WorldProperties { private final long seed; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/Registries.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/Registries.java similarity index 92% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/Registries.java rename to platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/Registries.java index e9c110cc5..0702b25c9 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/Registries.java +++ b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/Registries.java @@ -1,7 +1,6 @@ -package com.dfsek.terra.bukkit.nms; +package com.dfsek.terra.bukkit.nms.v1_18_R2; import net.minecraft.core.IRegistry; -import net.minecraft.core.IRegistryWritable; import net.minecraft.resources.ResourceKey; import net.minecraft.server.dedicated.DedicatedServer; import net.minecraft.world.level.biome.BiomeBase; diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index ab993acda..610606dc1 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -48,6 +48,7 @@ tasks.getByName("shadowJar") { } val remapped = tasks.register("remapShadedJar") { + dependsOn("installAddons") group = "fabric" val shadowJar = tasks.getByName("shadowJar") dependsOn(shadowJar) diff --git a/settings.gradle.kts b/settings.gradle.kts index 564b24132..f0612e154 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -18,6 +18,10 @@ includeImmediateChildren(file("common/addons"), "addon") includeImmediateChildren(file("platforms"), "platform") +includeImmediateChildren(file("platforms/bukkit/nms"), "Bukkit NMS") + +include(":platforms:bukkit:common") + pluginManagement { repositories { maven(url = "https://maven.fabricmc.net") { From 675a4465d796e4b94af78ff7fd8e0700a51b559c Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 31 May 2022 22:31:51 -0700 Subject: [PATCH 15/16] redo addon bundling --- .../src/main/kotlin/DistributionConfig.kt | 51 ++++++++----------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/buildSrc/src/main/kotlin/DistributionConfig.kt b/buildSrc/src/main/kotlin/DistributionConfig.kt index e02ac376c..b03af16f8 100644 --- a/buildSrc/src/main/kotlin/DistributionConfig.kt +++ b/buildSrc/src/main/kotlin/DistributionConfig.kt @@ -1,11 +1,10 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import java.io.File -import java.io.FileInputStream -import java.io.FileOutputStream import java.io.FileWriter import java.net.URL -import java.util.zip.ZipEntry -import java.util.zip.ZipOutputStream +import java.nio.file.FileSystems +import java.nio.file.Files +import java.nio.file.StandardCopyOption import org.gradle.api.DefaultTask import org.gradle.api.Project import org.gradle.api.plugins.BasePluginExtension @@ -39,41 +38,32 @@ fun Project.configureDistribution() { } doLast { - // The addons are copied into a JAR because of a ShadowJar bug - // which expands *all* JARs, even resource ones, into the fat JAR. - // To get around this, we copy all addon JARs into a *new* JAR, - // then, ShadowJar expands the newly created JAR, putting the original - // JARs where they should go. - // // https://github.com/johnrengelman/shadow/issues/111 - val dest = File(buildDir, "/resources/main/addons.jar") - dest.parentFile.mkdirs() + val dest = tasks.named("shadowJar").get().archiveFile.get().asFile.toPath() - val zip = ZipOutputStream(FileOutputStream(dest)) - - forSubProjects(":common:addons") { - val jar = getJarTask() - - println("Packaging addon ${jar.archiveFileName.get()} to ${dest.absolutePath}. size: ${jar.archiveFile.get().asFile.length() / 1024}KB") - - val boot = if (extra.has("bootstrap") && extra.get("bootstrap") as Boolean) "bootstrap/" else "" - - val entry = ZipEntry("addons/$boot${jar.archiveFileName.get()}") - zip.putNextEntry(entry) - FileInputStream(jar.archiveFile.get().asFile).run { - copyTo(zip) - close() + FileSystems.newFileSystem(dest, mapOf("create" to "false"), null).use { fs -> + forSubProjects(":common:addons") { + val jar = getJarTask() + + println("Packaging addon ${jar.archiveFileName.get()} to $dest. size: ${jar.archiveFile.get().asFile.length() / 1024}KB") + + val boot = if (extra.has("bootstrap") && extra.get("bootstrap") as Boolean) "bootstrap/" else "" + val addonPath = fs.getPath("/addons/$boot${jar.archiveFileName.get()}"); + + if(!Files.exists(addonPath)) { + Files.createDirectories(addonPath.parent) + Files.createFile(addonPath) + Files.copy(jar.archiveFile.get().asFile.toPath(), addonPath, StandardCopyOption.REPLACE_EXISTING) + } + } - zip.closeEntry() } - zip.close() } } val generateResourceManifest = tasks.create("generateResourceManifest") { group = "terra" dependsOn(downloadDefaultPacks) - dependsOn(installAddons) doLast { val resources = HashMap>() val packsDir = File("${project.buildDir}/resources/main/packs/") @@ -118,6 +108,7 @@ fun Project.configureDistribution() { tasks["processResources"].dependsOn(generateResourceManifest) + tasks.named("shadowJar") { // Tell shadow to download the packs dependsOn(downloadDefaultPacks) @@ -129,6 +120,8 @@ fun Project.configureDistribution() { relocate("com.dfsek.paralithic", "com.dfsek.terra.lib.paralithic") relocate("org.json", "com.dfsek.terra.lib.json") relocate("org.yaml", "com.dfsek.terra.lib.yaml") + + finalizedBy(installAddons) } configure { From b4cdb7f16cdb81c218664878e5a40cf441ded74a Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 31 May 2022 22:56:55 -0700 Subject: [PATCH 16/16] yell very loudly if NMS bindings fail to initialize --- .../java/com/dfsek/terra/bukkit/nms/Initializer.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java index e50c1b215..b86a37f89 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java @@ -27,7 +27,17 @@ public interface Initializer { throw new RuntimeException("Error initializing NMS bindings. Report this to Terra.", e); } } catch(ClassNotFoundException e) { - logger.warn("NMS bindings for version {} do not exist. Support for this version is limited.", NMS); + logger.error("NMS bindings for version {} do not exist. Support for this version is limited.", NMS); + logger.error("This is usually due to running Terra on an unsupported Minecraft version."); + logger.error(""); + logger.error(""); + for(int i = 0; i < 20; i++) { + logger.error("PROCEEDING WITH AN EXISTING TERRA WORLD WILL RESULT IN CORRUPTION!!!"); + } + logger.error(""); + logger.error(""); + logger.error("NMS bindings for version {} do not exist. Support for this version is limited.", NMS); + logger.error("This is usually due to running Terra on an unsupported Minecraft version."); } } }