split NMS away from core bukkit code

This commit is contained in:
dfsek 2022-05-31 22:31:40 -07:00
parent 8e933a1bb4
commit 839013d89a
52 changed files with 135 additions and 80 deletions

View File

@ -39,7 +39,7 @@ allprojects {
} }
afterEvaluate { afterEvaluate {
forSubProjects(":platforms") { forImmediateSubProjects(":platforms") {
configureDistribution() configureDistribution()
} }
forSubProjects(":common:addons") { forSubProjects(":common:addons") {

View File

@ -29,6 +29,12 @@ fun Project.forSubProjects(project: String, action: Action<Project>) {
} }
} }
fun Project.forImmediateSubProjects(project: String, action: Action<Project>) {
project(project).childProjects.forEach {
action.execute(it.value)
}
}
fun preRelease(preRelease: Boolean) { fun preRelease(preRelease: Boolean) {
isPrerelease = preRelease isPrerelease = preRelease
} }

View File

@ -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" val purpurURL = "https://api.purpurmc.org/v2/purpur/%version%/latest/download"
dependencies { dependencies {
shadedApi(project(":common:implementation:base")) shaded(project(":platforms:bukkit:common"))
shaded(project(":platforms:bukkit:nms:v1_18_R2"))
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)
} }
val throttleCoreCount = 0 val throttleCoreCount = 0

View File

@ -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)
}

View File

@ -21,10 +21,6 @@ import cloud.commandframework.brigadier.CloudBrigadierManager;
import cloud.commandframework.bukkit.CloudBukkitCapabilities; import cloud.commandframework.bukkit.CloudBukkitCapabilities;
import cloud.commandframework.execution.CommandExecutionCoordinator; import cloud.commandframework.execution.CommandExecutionCoordinator;
import cloud.commandframework.paper.PaperCommandManager; 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.Bukkit;
import org.bukkit.generator.ChunkGenerator; import org.bukkit.generator.ChunkGenerator;
import org.bukkit.plugin.java.JavaPlugin; 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.api.event.events.platform.PlatformInitializationEvent;
import com.dfsek.terra.bukkit.generator.BukkitChunkGeneratorWrapper; import com.dfsek.terra.bukkit.generator.BukkitChunkGeneratorWrapper;
import com.dfsek.terra.bukkit.listeners.CommonListener; 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.PaperUtil;
import com.dfsek.terra.bukkit.util.VersionUtil; import com.dfsek.terra.bukkit.util.VersionUtil;
import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.bukkit.world.BukkitAdapter;
@ -60,7 +57,6 @@ public class TerraBukkitPlugin extends JavaPlugin {
} }
platform.getEventManager().callEvent(new PlatformInitializationEvent()); platform.getEventManager().callEvent(new PlatformInitializationEvent());
NMSBiomeInjector.registerBiomes(platform.getRawConfigRegistry());
try { try {
@ -94,8 +90,13 @@ public class TerraBukkitPlugin extends JavaPlugin {
} }
Bukkit.getPluginManager().registerEvents(new CommonListener(), this); // Register master event listener Bukkit.getPluginManager().registerEvents(new CommonListener(), this); // Register master event listener
Bukkit.getPluginManager().registerEvents(new NMSInjectListener(), this); // Register master event listener
PaperUtil.checkPaper(this); PaperUtil.checkPaper(this);
Initializer.init(platform);
}
public PlatformImpl getPlatform() {
return platform;
} }
@SuppressWarnings({ "deprecation", "AccessOfSystemProperties" }) @SuppressWarnings({ "deprecation", "AccessOfSystemProperties" })

View File

@ -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);
}
}
}

View File

@ -1,5 +1,7 @@
package com.dfsek.terra.bukkit.util; package com.dfsek.terra.bukkit.util;
import ca.solostudios.strata.Versions;
import ca.solostudios.strata.version.Version;
import io.papermc.lib.PaperLib; import io.papermc.lib.PaperLib;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.slf4j.Logger; import org.slf4j.Logger;

View File

@ -17,31 +17,26 @@
package com.dfsek.terra.bukkit.world; 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 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, PropertyHolder {
public class BukkitPlatformBiome implements PlatformBiome {
private final org.bukkit.block.Biome biome; private final org.bukkit.block.Biome biome;
private ResourceKey<BiomeBase> resourceKey; private final Context context = new Context();
public BukkitPlatformBiome(org.bukkit.block.Biome biome) { public BukkitPlatformBiome(org.bukkit.block.Biome biome) {
this.biome = biome; this.biome = biome;
} }
public void setResourceKey(ResourceKey<BiomeBase> resourceKey) {
this.resourceKey = resourceKey;
}
public ResourceKey<BiomeBase> getResourceKey() {
return resourceKey;
}
@Override @Override
public org.bukkit.block.Biome getHandle() { public org.bukkit.block.Biome getHandle() {
return biome; return biome;
} }
@Override
public Context getContext() {
return context;
}
} }

View File

@ -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")
}

View File

@ -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<BiomeBase> biomeKey) implements Properties {
}

View File

@ -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.google.common.collect.ImmutableMap;
import com.mojang.serialization.Lifecycle; import com.mojang.serialization.Lifecycle;
@ -9,16 +9,13 @@ import net.minecraft.core.RegistryMaterials;
import net.minecraft.data.RegistryGeneration; import net.minecraft.data.RegistryGeneration;
import net.minecraft.resources.MinecraftKey; import net.minecraft.resources.MinecraftKey;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.server.dedicated.DedicatedServer;
import net.minecraft.tags.TagKey; import net.minecraft.tags.TagKey;
import net.minecraft.world.level.biome.BiomeBase; import net.minecraft.world.level.biome.BiomeBase;
import net.minecraft.world.level.biome.BiomeFog; import net.minecraft.world.level.biome.BiomeFog;
import net.minecraft.world.level.biome.BiomeFog.GrassColor; import net.minecraft.world.level.biome.BiomeFog.GrassColor;
import net.minecraft.world.level.biome.BiomeSettingsGeneration; import net.minecraft.world.level.biome.BiomeSettingsGeneration;
import net.minecraft.world.level.biome.BiomeSettingsMobs; import net.minecraft.world.level.biome.BiomeSettingsMobs;
import org.bukkit.Bukkit;
import org.bukkit.NamespacedKey; import org.bukkit.NamespacedKey;
import org.bukkit.craftbukkit.v1_18_R2.CraftServer;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -65,7 +62,7 @@ public class NMSBiomeInjector {
RegistryGeneration.a(RegistryGeneration.i, delegateKey, platform); RegistryGeneration.a(RegistryGeneration.i, delegateKey, platform);
biomeRegistry.a(delegateKey, platform, Lifecycle.stable()); biomeRegistry.a(delegateKey, platform, Lifecycle.stable());
platformBiome.setResourceKey(delegateKey); platformBiome.getContext().put(new NMSBiomeInfo(delegateKey));
terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.a()); terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.a());

View File

@ -1,9 +1,4 @@
package com.dfsek.terra.bukkit.nms; package com.dfsek.terra.bukkit.nms.v1_18_R2;
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 com.mojang.serialization.Codec;
import net.minecraft.core.Holder; 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 net.minecraft.world.level.biome.WorldChunkManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_18_R2.CraftServer; 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 { public class NMSBiomeProvider extends WorldChunkManager {
@ -28,7 +26,7 @@ public class NMSBiomeProvider extends WorldChunkManager {
}); });
public NMSBiomeProvider(BiomeProvider delegate, WorldChunkManager vanilla, long seed) { 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.delegate = delegate;
this.vanilla = vanilla; this.vanilla = vanilla;
this.seed = seed; this.seed = seed;
@ -51,6 +49,6 @@ public class NMSBiomeProvider extends WorldChunkManager {
@Override @Override
public Holder<BiomeBase> getNoiseBiome(int x, int y, int z, Sampler sampler) { public Holder<BiomeBase> 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 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());
} }
} }

View File

@ -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.datafixers.util.Pair;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
import net.minecraft.core.BlockPosition; import net.minecraft.core.BlockPosition;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.IRegistry;
import net.minecraft.core.IRegistryCustom; import net.minecraft.core.IRegistryCustom;
import net.minecraft.core.SectionPosition; import net.minecraft.core.SectionPosition;
import net.minecraft.server.dedicated.DedicatedServer;
import net.minecraft.server.level.RegionLimitedWorldAccess; import net.minecraft.server.level.RegionLimitedWorldAccess;
import net.minecraft.world.level.BlockColumn; import net.minecraft.world.level.BlockColumn;
import net.minecraft.world.level.ChunkCoordIntPair; 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.ConcentricRingsStructurePlacement;
import net.minecraft.world.level.levelgen.structure.placement.StructurePlacement; import net.minecraft.world.level.levelgen.structure.placement.StructurePlacement;
import net.minecraft.world.level.levelgen.structure.templatesystem.DefinedStructureManager; 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.bukkit.craftbukkit.v1_18_R2.block.data.CraftBlockData;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.ArrayList; import java.util.*;
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.CompletableFuture;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.stream.Collectors; 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 { public class NMSChunkGeneratorDelegate extends ChunkGenerator {
private static final Logger LOGGER = LoggerFactory.getLogger(NMSChunkGeneratorDelegate.class); private static final Logger LOGGER = LoggerFactory.getLogger(NMSChunkGeneratorDelegate.class);

View File

@ -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());
}
}

View File

@ -1,6 +1,4 @@
package com.dfsek.terra.bukkit.nms; package com.dfsek.terra.bukkit.nms.v1_18_R2;
import com.dfsek.terra.api.util.generic.Construct;
import net.minecraft.server.level.WorldServer; import net.minecraft.server.level.WorldServer;
import net.minecraft.world.level.chunk.ChunkGenerator; 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.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.world.WorldInitEvent; import org.bukkit.event.world.WorldInitEvent;
import org.bukkit.event.world.WorldLoadEvent;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.lang.reflect.Field;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigPack;

View File

@ -1,9 +1,9 @@
package com.dfsek.terra.bukkit.nms; package com.dfsek.terra.bukkit.nms.v1_18_R2;
import com.dfsek.terra.api.world.info.WorldProperties;
import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.LevelHeightAccessor;
import com.dfsek.terra.api.world.info.WorldProperties;
public class NMSWorldProperties implements WorldProperties { public class NMSWorldProperties implements WorldProperties {
private final long seed; private final long seed;

View File

@ -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.IRegistry;
import net.minecraft.core.IRegistryWritable;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.server.dedicated.DedicatedServer; import net.minecraft.server.dedicated.DedicatedServer;
import net.minecraft.world.level.biome.BiomeBase; import net.minecraft.world.level.biome.BiomeBase;

View File

@ -48,6 +48,7 @@ tasks.getByName<ShadowJar>("shadowJar") {
} }
val remapped = tasks.register<RemapJarTask>("remapShadedJar") { val remapped = tasks.register<RemapJarTask>("remapShadedJar") {
dependsOn("installAddons")
group = "fabric" group = "fabric"
val shadowJar = tasks.getByName<ShadowJar>("shadowJar") val shadowJar = tasks.getByName<ShadowJar>("shadowJar")
dependsOn(shadowJar) dependsOn(shadowJar)

View File

@ -18,6 +18,10 @@ includeImmediateChildren(file("common/addons"), "addon")
includeImmediateChildren(file("platforms"), "platform") includeImmediateChildren(file("platforms"), "platform")
includeImmediateChildren(file("platforms/bukkit/nms"), "Bukkit NMS")
include(":platforms:bukkit:common")
pluginManagement { pluginManagement {
repositories { repositories {
maven(url = "https://maven.fabricmc.net") { maven(url = "https://maven.fabricmc.net") {