mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-05-19 16:20:46 +00:00
Merge pull request #461 from OakLoaf/dev/1.21/bukkit
Updated Bukkit to 1.21/1.21.1
This commit is contained in:
@@ -18,10 +18,10 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
|
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
|
||||||
- name: Set up JDK 17
|
- name: Set up JDK 21
|
||||||
uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93
|
uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93
|
||||||
with:
|
with:
|
||||||
java-version: '17'
|
java-version: '21'
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
|
server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
|
||||||
settings-path: ${{ github.workspace }} # location for the settings.xml file
|
settings-path: ${{ github.workspace }} # location for the settings.xml file
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ repositories {
|
|||||||
maven("https://repo.codemc.org/repository/maven-public") {
|
maven("https://repo.codemc.org/repository/maven-public") {
|
||||||
name = "CodeMC"
|
name = "CodeMC"
|
||||||
}
|
}
|
||||||
maven("https://papermc.io/repo/repository/maven-public/") {
|
maven("https://repo.papermc.io/repository/maven-public/") {
|
||||||
name = "PaperMC"
|
name = "PaperMC"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -17,7 +17,7 @@ repositories {
|
|||||||
dependencies {
|
dependencies {
|
||||||
//TODO Allow pulling from Versions.kt
|
//TODO Allow pulling from Versions.kt
|
||||||
implementation("com.github.johnrengelman", "shadow", "8.1.1")
|
implementation("com.github.johnrengelman", "shadow", "8.1.1")
|
||||||
implementation("io.papermc.paperweight.userdev", "io.papermc.paperweight.userdev.gradle.plugin", "1.7.0")
|
implementation("io.papermc.paperweight.userdev", "io.papermc.paperweight.userdev.gradle.plugin", "1.7.1")
|
||||||
|
|
||||||
implementation("org.ow2.asm", "asm", "9.7")
|
implementation("org.ow2.asm", "asm", "9.7")
|
||||||
implementation("org.ow2.asm", "asm-tree", "9.7")
|
implementation("org.ow2.asm", "asm-tree", "9.7")
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ fun Project.configureCompilation() {
|
|||||||
apply<TectonicDocPlugin>()
|
apply<TectonicDocPlugin>()
|
||||||
|
|
||||||
configure<JavaPluginExtension> {
|
configure<JavaPluginExtension> {
|
||||||
sourceCompatibility = JavaVersion.VERSION_17
|
sourceCompatibility = JavaVersion.VERSION_21
|
||||||
targetCompatibility = JavaVersion.VERSION_17
|
targetCompatibility = JavaVersion.VERSION_21
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.withType<JavaCompile> {
|
tasks.withType<JavaCompile> {
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ fun Project.configureDependencies() {
|
|||||||
maven("https://repo.codemc.org/repository/maven-public") {
|
maven("https://repo.codemc.org/repository/maven-public") {
|
||||||
name = "CodeMC"
|
name = "CodeMC"
|
||||||
}
|
}
|
||||||
maven("https://papermc.io/repo/repository/maven-public/") {
|
maven("https://repo.papermc.io/repository/maven-public/") {
|
||||||
name = "PaperMC"
|
name = "PaperMC"
|
||||||
}
|
}
|
||||||
maven("https://files.minecraftforge.net/maven/") {
|
maven("https://files.minecraftforge.net/maven/") {
|
||||||
|
|||||||
@@ -8,7 +8,9 @@ object Versions {
|
|||||||
const val paralithic = "0.7.1"
|
const val paralithic = "0.7.1"
|
||||||
const val strata = "1.3.2"
|
const val strata = "1.3.2"
|
||||||
|
|
||||||
const val cloud = "1.8.4"
|
const val cloud = "2.0.0-rc.2"
|
||||||
|
const val cloudPaper = "2.0.0-beta.9"
|
||||||
|
const val cloudFabric = "2.0.0-beta.7"
|
||||||
|
|
||||||
const val caffeine = "3.1.8"
|
const val caffeine = "3.1.8"
|
||||||
|
|
||||||
@@ -52,14 +54,14 @@ object Versions {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
object Bukkit {
|
object Bukkit {
|
||||||
const val minecraft = "1.20.6"
|
const val minecraft = "1.21"
|
||||||
const val paperBuild = "$minecraft-R0.1-20240501.172135-12"
|
const val paperBuild = "$minecraft-R0.1-SNAPSHOT"
|
||||||
const val paper = paperBuild
|
const val paper = paperBuild
|
||||||
const val paperLib = "1.0.8"
|
const val paperLib = "1.0.8"
|
||||||
const val reflectionRemapper = "0.1.1"
|
const val reflectionRemapper = "0.1.1"
|
||||||
const val paperDevBundle = paperBuild
|
const val paperDevBundle = paperBuild
|
||||||
const val runPaper = "2.3.0"
|
const val runPaper = "2.3.0"
|
||||||
const val paperWeight = "1.7.0"
|
const val paperWeight = "1.7.1"
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
+6
-6
@@ -1,8 +1,5 @@
|
|||||||
package com.dfsek.terra.addons.commands.addons;
|
package com.dfsek.terra.addons.commands.addons;
|
||||||
|
|
||||||
import cloud.commandframework.ArgumentDescription;
|
|
||||||
import cloud.commandframework.CommandManager;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
|
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
|
||||||
import com.dfsek.terra.api.Platform;
|
import com.dfsek.terra.api.Platform;
|
||||||
import com.dfsek.terra.api.addon.BaseAddon;
|
import com.dfsek.terra.api.addon.BaseAddon;
|
||||||
@@ -12,6 +9,9 @@ import com.dfsek.terra.api.event.events.platform.CommandRegistrationEvent;
|
|||||||
import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
|
import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
|
||||||
import com.dfsek.terra.api.inject.annotations.Inject;
|
import com.dfsek.terra.api.inject.annotations.Inject;
|
||||||
|
|
||||||
|
import org.incendo.cloud.CommandManager;
|
||||||
|
import org.incendo.cloud.description.Description;
|
||||||
|
|
||||||
|
|
||||||
public class AddonsCommandAddon implements AddonInitializer {
|
public class AddonsCommandAddon implements AddonInitializer {
|
||||||
@Inject
|
@Inject
|
||||||
@@ -30,7 +30,7 @@ public class AddonsCommandAddon implements AddonInitializer {
|
|||||||
CommandManager<CommandSender> manager = event.getCommandManager();
|
CommandManager<CommandSender> manager = event.getCommandManager();
|
||||||
|
|
||||||
manager.command(
|
manager.command(
|
||||||
manager.commandBuilder("addons", ArgumentDescription.of("List installed Terra addons"))
|
manager.commandBuilder("addons", Description.of("List installed Terra addons"))
|
||||||
.permission("terra.addons")
|
.permission("terra.addons")
|
||||||
.handler(context -> {
|
.handler(context -> {
|
||||||
StringBuilder addons = new StringBuilder("Installed addons:\n");
|
StringBuilder addons = new StringBuilder("Installed addons:\n");
|
||||||
@@ -41,7 +41,7 @@ public class AddonsCommandAddon implements AddonInitializer {
|
|||||||
.append('@')
|
.append('@')
|
||||||
.append(addon.getVersion().getFormatted())
|
.append(addon.getVersion().getFormatted())
|
||||||
.append('\n'));
|
.append('\n'));
|
||||||
context.getSender().sendMessage(addons.toString());
|
context.sender().sendMessage(addons.toString());
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
.command(
|
.command(
|
||||||
@@ -61,7 +61,7 @@ public class AddonsCommandAddon implements AddonInitializer {
|
|||||||
.append('@')
|
.append('@')
|
||||||
.append(versions.getFormatted())
|
.append(versions.getFormatted())
|
||||||
.append('\n'));
|
.append('\n'));
|
||||||
context.getSender().sendMessage(addonInfo.toString());
|
context.sender().sendMessage(addonInfo.toString());
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
+10
-10
@@ -1,7 +1,7 @@
|
|||||||
package com.dfsek.terra.addons.commands.packs;
|
package com.dfsek.terra.addons.commands.packs;
|
||||||
|
|
||||||
import cloud.commandframework.ArgumentDescription;
|
import org.incendo.cloud.CommandManager;
|
||||||
import cloud.commandframework.CommandManager;
|
import org.incendo.cloud.description.Description;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@@ -35,7 +35,7 @@ public class PacksCommandAddon implements AddonInitializer {
|
|||||||
CommandManager<CommandSender> manager = event.getCommandManager();
|
CommandManager<CommandSender> manager = event.getCommandManager();
|
||||||
|
|
||||||
manager.command(
|
manager.command(
|
||||||
manager.commandBuilder("packs", ArgumentDescription.of("List installed config packs"))
|
manager.commandBuilder("packs", Description.of("List installed config packs"))
|
||||||
.permission("terra.packs")
|
.permission("terra.packs")
|
||||||
.handler(context -> {
|
.handler(context -> {
|
||||||
StringBuilder packs = new StringBuilder("Installed packs:\n");
|
StringBuilder packs = new StringBuilder("Installed packs:\n");
|
||||||
@@ -43,12 +43,12 @@ public class PacksCommandAddon implements AddonInitializer {
|
|||||||
.append(pack.getID())
|
.append(pack.getID())
|
||||||
.append('@')
|
.append('@')
|
||||||
.append(pack.getVersion().getFormatted()));
|
.append(pack.getVersion().getFormatted()));
|
||||||
context.getSender().sendMessage(packs.toString());
|
context.sender().sendMessage(packs.toString());
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
.command(
|
.command(
|
||||||
manager.commandBuilder("packs")
|
manager.commandBuilder("packs")
|
||||||
.literal("info", ArgumentDescription.of("Get information about a pack"))
|
.literal("info", Description.of("Get information about a pack"))
|
||||||
.permission("terra.packs.info")
|
.permission("terra.packs.info")
|
||||||
.argument(RegistryArgument.of("pack", platform.getConfigRegistry()))
|
.argument(RegistryArgument.of("pack", platform.getConfigRegistry()))
|
||||||
.handler(context -> {
|
.handler(context -> {
|
||||||
@@ -65,21 +65,21 @@ public class PacksCommandAddon implements AddonInitializer {
|
|||||||
.append('@')
|
.append('@')
|
||||||
.append(versions.getFormatted())
|
.append(versions.getFormatted())
|
||||||
.append('\n'));
|
.append('\n'));
|
||||||
context.getSender().sendMessage(packInfo.toString());
|
context.sender().sendMessage(packInfo.toString());
|
||||||
}))
|
}))
|
||||||
.command(
|
.command(
|
||||||
manager.commandBuilder("packs")
|
manager.commandBuilder("packs")
|
||||||
.literal("reload", ArgumentDescription.of("Reload config packs"))
|
.literal("reload", Description.of("Reload config packs"))
|
||||||
.permission("terra.packs.reload")
|
.permission("terra.packs.reload")
|
||||||
.handler(context -> {
|
.handler(context -> {
|
||||||
context.getSender().sendMessage("Reloading Terra...");
|
context.sender().sendMessage("Reloading Terra...");
|
||||||
logger.info("Reloading Terra...");
|
logger.info("Reloading Terra...");
|
||||||
if(platform.reload()) {
|
if(platform.reload()) {
|
||||||
logger.info("Terra reloaded successfully.");
|
logger.info("Terra reloaded successfully.");
|
||||||
context.getSender().sendMessage("Terra reloaded successfully.");
|
context.sender().sendMessage("Terra reloaded successfully.");
|
||||||
} else {
|
} else {
|
||||||
logger.error("Terra failed to reload.");
|
logger.error("Terra failed to reload.");
|
||||||
context.getSender().sendMessage(
|
context.sender().sendMessage(
|
||||||
"Terra failed to reload. See logs for more information.");
|
"Terra failed to reload. See logs for more information.");
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|||||||
+14
-14
@@ -1,7 +1,7 @@
|
|||||||
package com.dfsek.terra.addons.commands.profiler;
|
package com.dfsek.terra.addons.commands.profiler;
|
||||||
|
|
||||||
import cloud.commandframework.ArgumentDescription;
|
import org.incendo.cloud.CommandManager;
|
||||||
import cloud.commandframework.CommandManager;
|
import org.incendo.cloud.description.Description;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@@ -33,24 +33,24 @@ public class ProfilerCommandAddon implements AddonInitializer {
|
|||||||
CommandManager<CommandSender> manager = event.getCommandManager();
|
CommandManager<CommandSender> manager = event.getCommandManager();
|
||||||
manager
|
manager
|
||||||
.command(
|
.command(
|
||||||
manager.commandBuilder("profiler", ArgumentDescription.of("Access the profiler"))
|
manager.commandBuilder("profiler", Description.of("Access the profiler"))
|
||||||
.literal("start", ArgumentDescription.of("Start profiling"), "st")
|
.literal("start", Description.of("Start profiling"), "st")
|
||||||
.permission("terra.profiler.start")
|
.permission("terra.profiler.start")
|
||||||
.handler(context -> {
|
.handler(context -> {
|
||||||
platform.getProfiler().start();
|
platform.getProfiler().start();
|
||||||
context.getSender().sendMessage("Profiling started.");
|
context.sender().sendMessage("Profiling started.");
|
||||||
}))
|
}))
|
||||||
.command(
|
.command(
|
||||||
manager.commandBuilder("profiler", ArgumentDescription.of("Access the profiler"))
|
manager.commandBuilder("profiler", Description.of("Access the profiler"))
|
||||||
.literal("stop", ArgumentDescription.of("Stop profiling"), "s")
|
.literal("stop", Description.of("Stop profiling"), "s")
|
||||||
.permission("terra.profiler.stop")
|
.permission("terra.profiler.stop")
|
||||||
.handler(context -> {
|
.handler(context -> {
|
||||||
platform.getProfiler().stop();
|
platform.getProfiler().stop();
|
||||||
context.getSender().sendMessage("Profiling stopped.");
|
context.sender().sendMessage("Profiling stopped.");
|
||||||
}))
|
}))
|
||||||
.command(
|
.command(
|
||||||
manager.commandBuilder("profiler", ArgumentDescription.of("Access the profiler"))
|
manager.commandBuilder("profiler", Description.of("Access the profiler"))
|
||||||
.literal("query", ArgumentDescription.of("Query profiler results"), "q")
|
.literal("query", Description.of("Query profiler results"), "q")
|
||||||
.permission("terra.profiler.query")
|
.permission("terra.profiler.query")
|
||||||
.handler(context -> {
|
.handler(context -> {
|
||||||
StringBuilder data = new StringBuilder("Terra Profiler data: \n");
|
StringBuilder data = new StringBuilder("Terra Profiler data: \n");
|
||||||
@@ -59,15 +59,15 @@ public class ProfilerCommandAddon implements AddonInitializer {
|
|||||||
.append(timings.toString())
|
.append(timings.toString())
|
||||||
.append('\n'));
|
.append('\n'));
|
||||||
logger.info(data.toString());
|
logger.info(data.toString());
|
||||||
context.getSender().sendMessage("Profiling data dumped to console.");
|
context.sender().sendMessage("Profiling data dumped to console.");
|
||||||
}))
|
}))
|
||||||
.command(
|
.command(
|
||||||
manager.commandBuilder("profiler", ArgumentDescription.of("Access the profiler"))
|
manager.commandBuilder("profiler", Description.of("Access the profiler"))
|
||||||
.literal("reset", ArgumentDescription.of("Reset the profiler"), "r")
|
.literal("reset", Description.of("Reset the profiler"), "r")
|
||||||
.permission("terra.profiler.reset")
|
.permission("terra.profiler.reset")
|
||||||
.handler(context -> {
|
.handler(context -> {
|
||||||
platform.getProfiler().reset();
|
platform.getProfiler().reset();
|
||||||
context.getSender().sendMessage("Profiler reset.");
|
context.sender().sendMessage("Profiler reset.");
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-12
@@ -1,11 +1,5 @@
|
|||||||
package com.dfsek.terra.addons.commands.structure;
|
package com.dfsek.terra.addons.commands.structure;
|
||||||
|
|
||||||
import cloud.commandframework.ArgumentDescription;
|
|
||||||
import cloud.commandframework.CommandManager;
|
|
||||||
import cloud.commandframework.arguments.standard.EnumArgument;
|
|
||||||
import cloud.commandframework.arguments.standard.LongArgument;
|
|
||||||
import cloud.commandframework.context.CommandContext;
|
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
|
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
|
||||||
@@ -22,6 +16,13 @@ import com.dfsek.terra.api.structure.Structure;
|
|||||||
import com.dfsek.terra.api.util.Rotation;
|
import com.dfsek.terra.api.util.Rotation;
|
||||||
import com.dfsek.terra.api.util.reflection.TypeKey;
|
import com.dfsek.terra.api.util.reflection.TypeKey;
|
||||||
|
|
||||||
|
import org.incendo.cloud.CommandManager;
|
||||||
|
import org.incendo.cloud.component.DefaultValue;
|
||||||
|
import org.incendo.cloud.context.CommandContext;
|
||||||
|
import org.incendo.cloud.description.Description;
|
||||||
|
import org.incendo.cloud.parser.standard.EnumParser;
|
||||||
|
import org.incendo.cloud.parser.standard.LongParser;
|
||||||
|
|
||||||
|
|
||||||
public class StructureCommandAddon implements AddonInitializer {
|
public class StructureCommandAddon implements AddonInitializer {
|
||||||
@Inject
|
@Inject
|
||||||
@@ -31,7 +32,7 @@ public class StructureCommandAddon implements AddonInitializer {
|
|||||||
private BaseAddon addon;
|
private BaseAddon addon;
|
||||||
|
|
||||||
private static Registry<Structure> getStructureRegistry(CommandContext<CommandSender> sender) {
|
private static Registry<Structure> getStructureRegistry(CommandContext<CommandSender> sender) {
|
||||||
return sender.getSender().getEntity().orElseThrow().world().getPack().getRegistry(Structure.class);
|
return sender.sender().getEntity().orElseThrow().world().getPack().getRegistry(Structure.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -43,16 +44,16 @@ public class StructureCommandAddon implements AddonInitializer {
|
|||||||
CommandManager<CommandSender> manager = event.getCommandManager();
|
CommandManager<CommandSender> manager = event.getCommandManager();
|
||||||
|
|
||||||
manager.command(
|
manager.command(
|
||||||
manager.commandBuilder("structures", ArgumentDescription.of("Manage or generate structures"))
|
manager.commandBuilder("structures", Description.of("Manage or generate structures"))
|
||||||
.literal("generate")
|
.literal("generate")
|
||||||
.argument(RegistryArgument.builder("structure",
|
.optional(RegistryArgument.builder("structure",
|
||||||
StructureCommandAddon::getStructureRegistry,
|
StructureCommandAddon::getStructureRegistry,
|
||||||
TypeKey.of(Structure.class)))
|
TypeKey.of(Structure.class)))
|
||||||
.argument(LongArgument.optional("seed", 0))
|
.optional("seed", LongParser.longParser(), DefaultValue.constant(0L))
|
||||||
.argument(EnumArgument.optional(Rotation.class, "rotation", Rotation.NONE))
|
.optional("rotation", EnumParser.enumParser(Rotation.class), DefaultValue.constant(Rotation.NONE))
|
||||||
.handler(context -> {
|
.handler(context -> {
|
||||||
Structure structure = context.get("structure");
|
Structure structure = context.get("structure");
|
||||||
Entity sender = context.getSender().getEntity().orElseThrow();
|
Entity sender = context.sender().getEntity().orElseThrow();
|
||||||
structure.generate(
|
structure.generate(
|
||||||
sender.position().toInt(),
|
sender.position().toInt(),
|
||||||
sender.world(),
|
sender.world(),
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ dependencies {
|
|||||||
api("ca.solo-studios", "strata", Versions.Libraries.strata)
|
api("ca.solo-studios", "strata", Versions.Libraries.strata)
|
||||||
compileOnlyApi("org.slf4j", "slf4j-api", Versions.Libraries.slf4j)
|
compileOnlyApi("org.slf4j", "slf4j-api", Versions.Libraries.slf4j)
|
||||||
testImplementation("org.slf4j", "slf4j-api", Versions.Libraries.slf4j)
|
testImplementation("org.slf4j", "slf4j-api", Versions.Libraries.slf4j)
|
||||||
api("cloud.commandframework", "cloud-core", Versions.Libraries.cloud)
|
api("org.incendo", "cloud-core", Versions.Libraries.cloud)
|
||||||
|
|
||||||
api("com.dfsek.tectonic", "common", Versions.Libraries.tectonic)
|
api("com.dfsek.tectonic", "common", Versions.Libraries.tectonic)
|
||||||
|
|
||||||
|
|||||||
+49
-68
@@ -1,18 +1,10 @@
|
|||||||
package com.dfsek.terra.api.command.arguments;
|
package com.dfsek.terra.api.command.arguments;
|
||||||
|
|
||||||
import cloud.commandframework.ArgumentDescription;
|
|
||||||
import cloud.commandframework.arguments.CommandArgument;
|
|
||||||
import cloud.commandframework.arguments.parser.ArgumentParseResult;
|
|
||||||
import cloud.commandframework.arguments.parser.ArgumentParser;
|
|
||||||
import cloud.commandframework.context.CommandContext;
|
|
||||||
import io.leangen.geantyref.TypeToken;
|
import io.leangen.geantyref.TypeToken;
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Queue;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.function.BiFunction;
|
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@@ -21,40 +13,33 @@ import com.dfsek.terra.api.registry.exception.NoSuchEntryException;
|
|||||||
import com.dfsek.terra.api.registry.key.RegistryKey;
|
import com.dfsek.terra.api.registry.key.RegistryKey;
|
||||||
import com.dfsek.terra.api.util.reflection.TypeKey;
|
import com.dfsek.terra.api.util.reflection.TypeKey;
|
||||||
|
|
||||||
|
import org.incendo.cloud.component.CommandComponent;
|
||||||
|
import org.incendo.cloud.component.DefaultValue;
|
||||||
|
import org.incendo.cloud.context.CommandContext;
|
||||||
|
import org.incendo.cloud.context.CommandInput;
|
||||||
|
import org.incendo.cloud.parser.ArgumentParseResult;
|
||||||
|
import org.incendo.cloud.parser.ArgumentParser;
|
||||||
|
import org.incendo.cloud.parser.ParserDescriptor;
|
||||||
|
import org.incendo.cloud.suggestion.Suggestion;
|
||||||
|
import org.incendo.cloud.suggestion.SuggestionProvider;
|
||||||
|
|
||||||
public class RegistryArgument<T, R> extends CommandArgument<T, R> {
|
|
||||||
private RegistryArgument(
|
public class RegistryArgument {
|
||||||
boolean required,
|
|
||||||
@NonNull String name,
|
|
||||||
Function<CommandContext<T>, Registry<R>> registryFunction,
|
|
||||||
TypeToken<R> typeToken,
|
|
||||||
@NonNull String defaultValue,
|
|
||||||
@Nullable BiFunction<CommandContext<T>, String, List<String>> suggestionsProvider,
|
|
||||||
@NonNull ArgumentDescription description
|
|
||||||
) {
|
|
||||||
super(required,
|
|
||||||
name,
|
|
||||||
new RegistryArgumentParser<>(registryFunction),
|
|
||||||
defaultValue,
|
|
||||||
typeToken,
|
|
||||||
suggestionsProvider,
|
|
||||||
description);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T, R> Builder<T, R> builder(String name, Registry<R> registry) {
|
public static <T, R> Builder<T, R> builder(String name, Registry<R> registry) {
|
||||||
return new Builder<>(name, registry);
|
return new Builder<>(name, registry);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T, R> CommandArgument<T, R> of(String name, Registry<R> registry) {
|
public static <T, R> CommandComponent<T> of(String name, Registry<R> registry) {
|
||||||
return RegistryArgument.<T, R>builder(name, registry).build();
|
return RegistryArgument.<T, R>builder(name, registry).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T, R> CommandArgument<T, R> optional(String name, Registry<R> registry) {
|
public static <T, R> CommandComponent<T> optional(String name, Registry<R> registry) {
|
||||||
return RegistryArgument.<T, R>builder(name, registry).asOptional().build();
|
return RegistryArgument.<T, R>builder(name, registry).optional().build();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T, R> CommandArgument<T, R> optional(String name, Registry<R> registry, String defaultKey) {
|
public static <T, R> CommandComponent<T> optional(String name, Registry<R> registry, DefaultValue<T, R> defaultKey) {
|
||||||
return RegistryArgument.<T, R>builder(name, registry).asOptionalWithDefault(defaultKey).build();
|
return RegistryArgument.<T, R>builder(name, registry).optional(defaultKey).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@@ -63,49 +48,36 @@ public class RegistryArgument<T, R> extends CommandArgument<T, R> {
|
|||||||
return new Builder<>(name, registryFunction, (TypeToken<R>) TypeToken.get(registryType.getType()));
|
return new Builder<>(name, registryFunction, (TypeToken<R>) TypeToken.get(registryType.getType()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T, R> CommandArgument<T, R> of(String name, Function<CommandContext<T>, Registry<R>> registryFunction,
|
public static <T, R> CommandComponent<T> of(String name, Function<CommandContext<T>, Registry<R>> registryFunction,
|
||||||
TypeKey<R> registryType) {
|
TypeKey<R> registryType) {
|
||||||
return RegistryArgument.<T, R>builder(name, registryFunction, registryType).build();
|
return RegistryArgument.<T, R>builder(name, registryFunction, registryType).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T, R> CommandArgument<T, R> optional(String name, Function<CommandContext<T>, Registry<R>> registryFunction,
|
public static <T, R> CommandComponent<T> optional(String name, Function<CommandContext<T>, Registry<R>> registryFunction,
|
||||||
TypeKey<R> registryType) {
|
TypeKey<R> registryType) {
|
||||||
return RegistryArgument.builder(name, registryFunction, registryType).asOptional().build();
|
return RegistryArgument.builder(name, registryFunction, registryType).optional().build();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T, R> CommandArgument<T, R> optional(String name, Function<CommandContext<T>, Registry<R>> registryFunction,
|
public static <T, R> CommandComponent<T> optional(String name, Function<CommandContext<T>, Registry<R>> registryFunction,
|
||||||
TypeKey<R> registryType, String defaultKey) {
|
TypeKey<R> registryType, DefaultValue<T, R> defaultKey) {
|
||||||
return RegistryArgument.builder(name, registryFunction, registryType).asOptionalWithDefault(defaultKey).build();
|
return RegistryArgument.builder(name, registryFunction, registryType).optional(defaultKey).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final class Builder<T, R> extends CommandArgument.Builder<T, R> {
|
public static final class Builder<T, R> extends CommandComponent.Builder<T, R> {
|
||||||
private final Function<CommandContext<T>, Registry<R>> registryFunction;
|
|
||||||
private final TypeToken<R> typeToken;
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private Builder(@NonNull String name, Registry<R> registry) {
|
private Builder(@NonNull String name, Registry<R> registry) {
|
||||||
super((TypeToken<R>) TypeToken.get(registry.getType().getType()), name);
|
super();
|
||||||
this.registryFunction = commandContext -> registry;
|
this.name(name);
|
||||||
this.typeToken = (TypeToken<R>) TypeToken.get(registry.getType().getType());
|
this.parser(ParserDescriptor.of(
|
||||||
|
new RegistryArgumentParser<>(commandContext -> registry),
|
||||||
|
(TypeToken<R>) TypeToken.get(registry.getType().getType())));
|
||||||
}
|
}
|
||||||
|
|
||||||
private Builder(@NonNull String name, Function<CommandContext<T>, Registry<R>> registryFunction, TypeToken<R> typeToken) {
|
private Builder(@NonNull String name, Function<CommandContext<T>, Registry<R>> registryFunction, TypeToken<R> typeToken) {
|
||||||
super(typeToken, name);
|
super();
|
||||||
this.typeToken = typeToken;
|
this.name(name);
|
||||||
this.registryFunction = registryFunction;
|
this.parser(ParserDescriptor.of(new RegistryArgumentParser<>(registryFunction), typeToken));
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NonNull RegistryArgument<T, R> build() {
|
|
||||||
return new RegistryArgument<>(
|
|
||||||
isRequired(),
|
|
||||||
getName(),
|
|
||||||
registryFunction,
|
|
||||||
typeToken,
|
|
||||||
getDefaultValue(),
|
|
||||||
getSuggestionsProvider(),
|
|
||||||
getDefaultDescription()
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -119,12 +91,12 @@ public class RegistryArgument<T, R> extends CommandArgument<T, R> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NonNull ArgumentParseResult<@NonNull R> parse(@NonNull CommandContext<@NonNull T> commandContext,
|
public @NonNull ArgumentParseResult<@NonNull R> parse(@NonNull CommandContext<@NonNull T> commandContext,
|
||||||
@NonNull Queue<@NonNull String> inputQueue) {
|
@NonNull CommandInput commandInput) {
|
||||||
String input = inputQueue.remove();
|
String input = commandInput.readString();
|
||||||
String next = inputQueue.peek();
|
String next = commandInput.peekString();
|
||||||
if(next != null && next.equals(":")) {
|
if(next.equals(":")) {
|
||||||
input += inputQueue.remove();
|
input += commandInput.readString();
|
||||||
input += inputQueue.remove();
|
input += commandInput.readString();
|
||||||
}
|
}
|
||||||
|
|
||||||
Registry<R> registry = registryFunction.apply(commandContext);
|
Registry<R> registry = registryFunction.apply(commandContext);
|
||||||
@@ -146,8 +118,17 @@ public class RegistryArgument<T, R> extends CommandArgument<T, R> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NonNull List<@NonNull String> suggestions(@NonNull CommandContext<T> commandContext, @NonNull String input) {
|
public @NonNull SuggestionProvider<T> suggestionProvider() {
|
||||||
return registryFunction.apply(commandContext).keys().stream().map(RegistryKey::toString).sorted().collect(Collectors.toList());
|
return new SuggestionProvider<>() {
|
||||||
|
@Override
|
||||||
|
public @NonNull CompletableFuture<? extends @NonNull Iterable<? extends @NonNull Suggestion>> suggestionsFuture(
|
||||||
|
@NonNull CommandContext<T> context, @NonNull CommandInput input) {
|
||||||
|
|
||||||
|
// TODO: Verify whether this is correct
|
||||||
|
return CompletableFuture.completedFuture(registryFunction.apply(context).keys().stream().map(
|
||||||
|
registryKey -> Suggestion.suggestion(registryKey.toString())).sorted().collect(Collectors.toList()));
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -1,10 +1,10 @@
|
|||||||
package com.dfsek.terra.api.event.events.platform;
|
package com.dfsek.terra.api.event.events.platform;
|
||||||
|
|
||||||
import cloud.commandframework.CommandManager;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.command.CommandSender;
|
import com.dfsek.terra.api.command.CommandSender;
|
||||||
import com.dfsek.terra.api.event.events.Event;
|
import com.dfsek.terra.api.event.events.Event;
|
||||||
|
|
||||||
|
import org.incendo.cloud.CommandManager;
|
||||||
|
|
||||||
|
|
||||||
public class CommandRegistrationEvent implements Event {
|
public class CommandRegistrationEvent implements Event {
|
||||||
private final CommandManager<CommandSender> commandManager;
|
private final CommandManager<CommandSender> commandManager;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
package com.dfsek.terra.api.util.reflection;
|
package com.dfsek.terra.api.util.reflection;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import sun.misc.Unsafe;
|
||||||
|
|
||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
import java.lang.reflect.AnnotatedElement;
|
import java.lang.reflect.AnnotatedElement;
|
||||||
@@ -26,6 +27,18 @@ import java.util.stream.Stream;
|
|||||||
|
|
||||||
|
|
||||||
public final class ReflectionUtil {
|
public final class ReflectionUtil {
|
||||||
|
private static final Unsafe UNSAFE;
|
||||||
|
|
||||||
|
static {
|
||||||
|
try{
|
||||||
|
final Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
|
||||||
|
unsafeField.setAccessible(true);
|
||||||
|
UNSAFE = (Unsafe) unsafeField.get(null);
|
||||||
|
} catch(NoSuchFieldException | IllegalAccessException e){
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static Field[] getFields(@NotNull Class<?> type) {
|
public static Field[] getFields(@NotNull Class<?> type) {
|
||||||
Field[] result = type.getDeclaredFields();
|
Field[] result = type.getDeclaredFields();
|
||||||
Class<?> parentClass = type.getSuperclass();
|
Class<?> parentClass = type.getSuperclass();
|
||||||
@@ -35,6 +48,14 @@ public final class ReflectionUtil {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void setFinalField(Object obj, String fieldName, Object value) throws NoSuchFieldException {
|
||||||
|
Field field = obj.getClass().getDeclaredField(fieldName);
|
||||||
|
field.setAccessible(true);
|
||||||
|
long fieldOffset = UNSAFE.objectFieldOffset(field);
|
||||||
|
|
||||||
|
UNSAFE.putObject(obj, fieldOffset, value);
|
||||||
|
}
|
||||||
|
|
||||||
public static Method[] getMethods(@NotNull Class<?> type) {
|
public static Method[] getMethods(@NotNull Class<?> type) {
|
||||||
Method[] result = type.getDeclaredMethods();
|
Method[] result = type.getDeclaredMethods();
|
||||||
Class<?> parentClass = type.getSuperclass();
|
Class<?> parentClass = type.getSuperclass();
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ repositories {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
shaded(project(":platforms:bukkit:common"))
|
shaded(project(":platforms:bukkit:common"))
|
||||||
shaded(project(":platforms:bukkit:nms:v1_20_R3", configuration = "reobf"))
|
shaded(project(":platforms:bukkit:nms:v1_21", configuration = "reobf"))
|
||||||
shaded("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper)
|
shaded("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,5 +11,5 @@ dependencies {
|
|||||||
|
|
||||||
shadedApi("com.google.guava", "guava", Versions.Libraries.Internal.guava)
|
shadedApi("com.google.guava", "guava", Versions.Libraries.Internal.guava)
|
||||||
|
|
||||||
shadedApi("cloud.commandframework", "cloud-paper", Versions.Libraries.cloud)
|
shadedApi("org.incendo", "cloud-paper", Versions.Libraries.cloudPaper)
|
||||||
}
|
}
|
||||||
|
|||||||
+19
-14
@@ -17,15 +17,16 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.bukkit;
|
package com.dfsek.terra.bukkit;
|
||||||
|
|
||||||
import cloud.commandframework.brigadier.CloudBrigadierManager;
|
|
||||||
import cloud.commandframework.bukkit.CloudBukkitCapabilities;
|
|
||||||
import cloud.commandframework.execution.CommandExecutionCoordinator;
|
|
||||||
import cloud.commandframework.paper.PaperCommandManager;
|
|
||||||
import io.papermc.paper.threadedregions.scheduler.AsyncScheduler;
|
import io.papermc.paper.threadedregions.scheduler.AsyncScheduler;
|
||||||
import io.papermc.paper.threadedregions.scheduler.GlobalRegionScheduler;
|
import io.papermc.paper.threadedregions.scheduler.GlobalRegionScheduler;
|
||||||
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;
|
||||||
|
import org.incendo.cloud.SenderMapper;
|
||||||
|
import org.incendo.cloud.brigadier.CloudBrigadierManager;
|
||||||
|
import org.incendo.cloud.bukkit.CloudBukkitCapabilities;
|
||||||
|
import org.incendo.cloud.execution.ExecutionCoordinator;
|
||||||
|
import org.incendo.cloud.paper.LegacyPaperCommandManager;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@@ -71,7 +72,7 @@ public class TerraBukkitPlugin extends JavaPlugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
PaperCommandManager<CommandSender> commandManager = getCommandSenderPaperCommandManager();
|
LegacyPaperCommandManager<CommandSender> commandManager = getCommandSenderPaperCommandManager();
|
||||||
|
|
||||||
platform.getEventManager().callEvent(new CommandRegistrationEvent(commandManager));
|
platform.getEventManager().callEvent(new CommandRegistrationEvent(commandManager));
|
||||||
|
|
||||||
@@ -91,22 +92,26 @@ public class TerraBukkitPlugin extends JavaPlugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private PaperCommandManager<CommandSender> getCommandSenderPaperCommandManager() throws Exception {
|
private LegacyPaperCommandManager<CommandSender> getCommandSenderPaperCommandManager() throws Exception {
|
||||||
PaperCommandManager<CommandSender> commandManager = new PaperCommandManager<>(this,
|
// TODO: Update to PaperCommandManager
|
||||||
CommandExecutionCoordinator.simpleCoordinator(),
|
LegacyPaperCommandManager<CommandSender> commandManager = new LegacyPaperCommandManager<>(
|
||||||
BukkitAdapter::adapt,
|
this,
|
||||||
BukkitAdapter::adapt);
|
ExecutionCoordinator.simpleCoordinator(),
|
||||||
if(commandManager.hasCapability(CloudBukkitCapabilities.NATIVE_BRIGADIER)) {
|
SenderMapper.create(
|
||||||
|
BukkitAdapter::adapt,
|
||||||
|
BukkitAdapter::adapt
|
||||||
|
));
|
||||||
|
|
||||||
|
if (commandManager.hasCapability(CloudBukkitCapabilities.NATIVE_BRIGADIER)) {
|
||||||
commandManager.registerBrigadier();
|
commandManager.registerBrigadier();
|
||||||
final CloudBrigadierManager<?, ?> brigManager = commandManager.brigadierManager();
|
final CloudBrigadierManager<?, ?> brigManager = commandManager.brigadierManager();
|
||||||
if(brigManager != null) {
|
if(brigManager != null) {
|
||||||
brigManager.setNativeNumberSuggestions(false);
|
brigManager.setNativeNumberSuggestions(false);
|
||||||
}
|
}
|
||||||
}
|
} else if (commandManager.hasCapability(CloudBukkitCapabilities.ASYNCHRONOUS_COMPLETION)) {
|
||||||
|
|
||||||
if(commandManager.hasCapability(CloudBukkitCapabilities.ASYNCHRONOUS_COMPLETION)) {
|
|
||||||
commandManager.registerAsynchronousCompletions();
|
commandManager.registerAsynchronousCompletions();
|
||||||
}
|
}
|
||||||
|
|
||||||
return commandManager;
|
return commandManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -72,7 +72,7 @@ public class BukkitWorldHandle implements WorldHandle {
|
|||||||
String entityID = id.toUpperCase(Locale.ROOT).substring(10);
|
String entityID = id.toUpperCase(Locale.ROOT).substring(10);
|
||||||
|
|
||||||
return new BukkitEntityType(switch(entityID) {
|
return new BukkitEntityType(switch(entityID) {
|
||||||
case "END_CRYSTAL" -> org.bukkit.entity.EntityType.ENDER_CRYSTAL;
|
case "END_CRYSTAL" -> org.bukkit.entity.EntityType.END_CRYSTAL;
|
||||||
case "ENDER_CRYSTAL" -> throw new IllegalArgumentException(
|
case "ENDER_CRYSTAL" -> throw new IllegalArgumentException(
|
||||||
"Invalid entity identifier " + id); // make sure this issue can't happen the other way around.
|
"Invalid entity identifier " + id); // make sure this issue can't happen the other way around.
|
||||||
default -> org.bukkit.entity.EntityType.valueOf(entityID);
|
default -> org.bukkit.entity.EntityType.valueOf(entityID);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.dfsek.terra.bukkit.nms;
|
package com.dfsek.terra.bukkit.nms;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import com.dfsek.terra.bukkit.util.VersionUtil;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@@ -8,13 +9,18 @@ import com.dfsek.terra.bukkit.PlatformImpl;
|
|||||||
|
|
||||||
|
|
||||||
public interface Initializer {
|
public interface Initializer {
|
||||||
String NMS = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3];
|
String NMS = VersionUtil.getMinecraftVersionInfo().toString().replace(".", "_");
|
||||||
String TERRA_PACKAGE = Initializer.class.getPackageName();
|
String TERRA_PACKAGE = Initializer.class.getPackageName();
|
||||||
|
|
||||||
static boolean init(PlatformImpl platform) {
|
static boolean init(PlatformImpl platform) {
|
||||||
Logger logger = LoggerFactory.getLogger(Initializer.class);
|
Logger logger = LoggerFactory.getLogger(Initializer.class);
|
||||||
try {
|
try {
|
||||||
Class<?> initializerClass = Class.forName(TERRA_PACKAGE + "." + NMS + ".NMSInitializer");
|
String packageVersion = NMS;
|
||||||
|
if (NMS.equals("v1_21_1")) {
|
||||||
|
packageVersion = "v1_21";
|
||||||
|
}
|
||||||
|
|
||||||
|
Class<?> initializerClass = Class.forName(TERRA_PACKAGE + "." + packageVersion + ".NMSInitializer");
|
||||||
try {
|
try {
|
||||||
Initializer initializer = (Initializer) initializerClass.getConstructor().newInstance();
|
Initializer initializer = (Initializer) initializerClass.getConstructor().newInstance();
|
||||||
initializer.initialize(platform);
|
initializer.initialize(platform);
|
||||||
|
|||||||
@@ -77,13 +77,13 @@ public final class VersionUtil {
|
|||||||
public static final class MinecraftVersionInfo {
|
public static final class MinecraftVersionInfo {
|
||||||
private static final Logger logger = LoggerFactory.getLogger(MinecraftVersionInfo.class);
|
private static final Logger logger = LoggerFactory.getLogger(MinecraftVersionInfo.class);
|
||||||
|
|
||||||
private static final Pattern VERSION_PATTERN = Pattern.compile("v?(\\d+)_(\\d+)_R(\\d+)");
|
private static final Pattern VERSION_PATTERN = Pattern.compile("(\\d+)\\.(\\d+)(?:\\.(\\d+))?");
|
||||||
private final int major;
|
private final int major;
|
||||||
private final int minor;
|
private final int minor;
|
||||||
private final int patch;
|
private final int patch;
|
||||||
|
|
||||||
private MinecraftVersionInfo() {
|
private MinecraftVersionInfo() {
|
||||||
this(Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]);
|
this(Bukkit.getServer().getBukkitVersion().split("-")[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
private MinecraftVersionInfo(int major, int minor, int patch) {
|
private MinecraftVersionInfo(int major, int minor, int patch) {
|
||||||
@@ -97,7 +97,7 @@ public final class VersionUtil {
|
|||||||
if(versionMatcher.find()) {
|
if(versionMatcher.find()) {
|
||||||
major = Integer.parseInt(versionMatcher.group(1));
|
major = Integer.parseInt(versionMatcher.group(1));
|
||||||
minor = Integer.parseInt(versionMatcher.group(2));
|
minor = Integer.parseInt(versionMatcher.group(2));
|
||||||
patch = Integer.parseInt(versionMatcher.group(3));
|
patch = versionMatcher.group(3) != null ? Integer.parseInt(versionMatcher.group(3)) : -1;
|
||||||
} else {
|
} else {
|
||||||
logger.warn("Error while parsing minecraft version info. Continuing launch, but setting all versions to -1.");
|
logger.warn("Error while parsing minecraft version info. Continuing launch, but setting all versions to -1.");
|
||||||
|
|
||||||
@@ -112,7 +112,11 @@ public final class VersionUtil {
|
|||||||
if(major == -1 && minor == -1 && patch == -1)
|
if(major == -1 && minor == -1 && patch == -1)
|
||||||
return "Unknown";
|
return "Unknown";
|
||||||
|
|
||||||
return String.format("v%d.%d.%d", major, minor, patch);
|
if (patch >= 0) {
|
||||||
|
return String.format("v%d.%d.%d", major, minor, patch);
|
||||||
|
} else {
|
||||||
|
return String.format("v%d.%d", major, minor);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getMajor() {
|
public int getMajor() {
|
||||||
|
|||||||
+5
-5
@@ -1,10 +1,10 @@
|
|||||||
package com.dfsek.terra.bukkit.nms.v1_20_R3;
|
package com.dfsek.terra.bukkit.nms.v1_21;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.mojang.serialization.Lifecycle;
|
|
||||||
import net.minecraft.core.Holder;
|
import net.minecraft.core.Holder;
|
||||||
import net.minecraft.core.Holder.Reference;
|
import net.minecraft.core.Holder.Reference;
|
||||||
import net.minecraft.core.MappedRegistry;
|
import net.minecraft.core.MappedRegistry;
|
||||||
|
import net.minecraft.core.RegistrationInfo;
|
||||||
import net.minecraft.core.WritableRegistry;
|
import net.minecraft.core.WritableRegistry;
|
||||||
import net.minecraft.core.registries.Registries;
|
import net.minecraft.core.registries.Registries;
|
||||||
import net.minecraft.resources.ResourceKey;
|
import net.minecraft.resources.ResourceKey;
|
||||||
@@ -41,15 +41,15 @@ public class AwfulBukkitHacks {
|
|||||||
try {
|
try {
|
||||||
BukkitPlatformBiome platformBiome = (BukkitPlatformBiome) biome.getPlatformBiome();
|
BukkitPlatformBiome platformBiome = (BukkitPlatformBiome) biome.getPlatformBiome();
|
||||||
NamespacedKey vanillaBukkitKey = platformBiome.getHandle().getKey();
|
NamespacedKey vanillaBukkitKey = platformBiome.getHandle().getKey();
|
||||||
ResourceLocation vanillaMinecraftKey = new ResourceLocation(vanillaBukkitKey.getNamespace(), vanillaBukkitKey.getKey());
|
ResourceLocation vanillaMinecraftKey = ResourceLocation.fromNamespaceAndPath(vanillaBukkitKey.getNamespace(), vanillaBukkitKey.getKey());
|
||||||
Biome platform = NMSBiomeInjector.createBiome(biome, Objects.requireNonNull(biomeRegistry.get(vanillaMinecraftKey)));
|
Biome platform = NMSBiomeInjector.createBiome(biome, Objects.requireNonNull(biomeRegistry.get(vanillaMinecraftKey)));
|
||||||
|
|
||||||
ResourceKey<Biome> delegateKey = ResourceKey.create(
|
ResourceKey<Biome> delegateKey = ResourceKey.create(
|
||||||
Registries.BIOME,
|
Registries.BIOME,
|
||||||
new ResourceLocation("terra", NMSBiomeInjector.createBiomeID(pack, key))
|
ResourceLocation.fromNamespaceAndPath("terra", NMSBiomeInjector.createBiomeID(pack, key))
|
||||||
);
|
);
|
||||||
|
|
||||||
Reference<Biome> holder = biomeRegistry.register(delegateKey, platform, Lifecycle.stable());
|
Reference<Biome> holder = biomeRegistry.register(delegateKey, platform, RegistrationInfo.BUILT_IN);
|
||||||
Reflection.REFERENCE.invokeBindValue(holder, platform); // IMPORTANT: bind holder.
|
Reflection.REFERENCE.invokeBindValue(holder, platform); // IMPORTANT: bind holder.
|
||||||
|
|
||||||
platformBiome.getContext().put(new NMSBiomeInfo(delegateKey));
|
platformBiome.getContext().put(new NMSBiomeInfo(delegateKey));
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package com.dfsek.terra.bukkit.nms.v1_20_R3;
|
package com.dfsek.terra.bukkit.nms.v1_21;
|
||||||
|
|
||||||
import net.minecraft.resources.ResourceKey;
|
import net.minecraft.resources.ResourceKey;
|
||||||
import net.minecraft.world.level.biome.Biome;
|
import net.minecraft.world.level.biome.Biome;
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package com.dfsek.terra.bukkit.nms.v1_20_R3;
|
package com.dfsek.terra.bukkit.nms.v1_21;
|
||||||
|
|
||||||
import net.minecraft.core.Holder;
|
import net.minecraft.core.Holder;
|
||||||
import net.minecraft.core.Registry;
|
import net.minecraft.core.Registry;
|
||||||
+8
-4
@@ -1,6 +1,6 @@
|
|||||||
package com.dfsek.terra.bukkit.nms.v1_20_R3;
|
package com.dfsek.terra.bukkit.nms.v1_21;
|
||||||
|
|
||||||
import com.mojang.serialization.Codec;
|
import com.mojang.serialization.MapCodec;
|
||||||
import net.minecraft.core.Holder;
|
import net.minecraft.core.Holder;
|
||||||
import net.minecraft.core.Registry;
|
import net.minecraft.core.Registry;
|
||||||
import net.minecraft.world.level.biome.Biome;
|
import net.minecraft.world.level.biome.Biome;
|
||||||
@@ -35,8 +35,12 @@ public class NMSBiomeProvider extends BiomeSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected @NotNull Codec<? extends BiomeSource> codec() {
|
protected @NotNull MapCodec<? extends BiomeSource> codec() {
|
||||||
return BiomeSource.CODEC;
|
return MapCodec.assumeMapUnsafe(BiomeSource.CODEC);
|
||||||
|
// return MapCodec.unit(null);
|
||||||
|
// BuiltInRegistries.BIOME_SOURCE.byNameCodec().dispatchMap(this::codec, Function.identity());
|
||||||
|
// BuiltInRegistries.BIOME_SOURCE.byNameCodec().dispatchStable(BiomeSource::codec, Function.identity());
|
||||||
|
// return BiomeSource.CODEC;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
+9
-10
@@ -1,6 +1,6 @@
|
|||||||
package com.dfsek.terra.bukkit.nms.v1_20_R3;
|
package com.dfsek.terra.bukkit.nms.v1_21;
|
||||||
|
|
||||||
import com.mojang.serialization.Codec;
|
import com.mojang.serialization.MapCodec;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.server.level.WorldGenRegion;
|
import net.minecraft.server.level.WorldGenRegion;
|
||||||
import net.minecraft.world.level.LevelAccessor;
|
import net.minecraft.world.level.LevelAccessor;
|
||||||
@@ -19,14 +19,13 @@ import net.minecraft.world.level.levelgen.GenerationStep.Carving;
|
|||||||
import net.minecraft.world.level.levelgen.Heightmap.Types;
|
import net.minecraft.world.level.levelgen.Heightmap.Types;
|
||||||
import net.minecraft.world.level.levelgen.RandomState;
|
import net.minecraft.world.level.levelgen.RandomState;
|
||||||
import net.minecraft.world.level.levelgen.blending.Blender;
|
import net.minecraft.world.level.levelgen.blending.Blender;
|
||||||
import org.bukkit.craftbukkit.v1_20_R3.block.data.CraftBlockData;
|
import org.bukkit.craftbukkit.block.data.CraftBlockData;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.Executor;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.config.ConfigPack;
|
import com.dfsek.terra.api.config.ConfigPack;
|
||||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
@@ -54,8 +53,8 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected @NotNull Codec<? extends ChunkGenerator> codec() {
|
protected @NotNull MapCodec<? extends ChunkGenerator> codec() {
|
||||||
return ChunkGenerator.CODEC;
|
return MapCodec.assumeMapUnsafe(ChunkGenerator.CODEC);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -87,10 +86,10 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull CompletableFuture<ChunkAccess> fillFromNoise(@NotNull Executor executor, @NotNull Blender blender,
|
public CompletableFuture<ChunkAccess> fillFromNoise(@NotNull Blender blender,
|
||||||
@NotNull RandomState noiseConfig,
|
@NotNull RandomState noiseConfig,
|
||||||
@NotNull StructureManager structureAccessor, @NotNull ChunkAccess chunk) {
|
@NotNull StructureManager structureAccessor, @NotNull ChunkAccess chunk) {
|
||||||
return vanilla.fillFromNoise(executor, blender, noiseConfig, structureAccessor, chunk)
|
return vanilla.fillFromNoise(blender, noiseConfig, structureAccessor, chunk)
|
||||||
.thenApply(c -> {
|
.thenApply(c -> {
|
||||||
LevelAccessor level = Reflection.STRUCTURE_MANAGER.getLevel(structureAccessor);
|
LevelAccessor level = Reflection.STRUCTURE_MANAGER.getLevel(structureAccessor);
|
||||||
BiomeProvider biomeProvider = pack.getBiomeProvider();
|
BiomeProvider biomeProvider = pack.getBiomeProvider();
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package com.dfsek.terra.bukkit.nms.v1_20_R3;
|
package com.dfsek.terra.bukkit.nms.v1_21;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
|
||||||
+20
-3
@@ -1,9 +1,14 @@
|
|||||||
package com.dfsek.terra.bukkit.nms.v1_20_R3;
|
package com.dfsek.terra.bukkit.nms.v1_21;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.util.reflection.ReflectionUtil;
|
||||||
|
|
||||||
|
import net.minecraft.server.level.ChunkMap;
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.world.level.chunk.ChunkGenerator;
|
import net.minecraft.world.level.chunk.ChunkGenerator;
|
||||||
|
import net.minecraft.world.level.chunk.status.WorldGenContext;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.craftbukkit.v1_20_R3.CraftWorld;
|
import org.bukkit.craftbukkit.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;
|
||||||
@@ -37,8 +42,20 @@ public class NMSInjectListener implements Listener {
|
|||||||
|
|
||||||
ChunkGenerator vanilla = serverWorld.getChunkSource().getGenerator();
|
ChunkGenerator vanilla = serverWorld.getChunkSource().getGenerator();
|
||||||
NMSBiomeProvider provider = new NMSBiomeProvider(pack.getBiomeProvider(), craftWorld.getSeed());
|
NMSBiomeProvider provider = new NMSBiomeProvider(pack.getBiomeProvider(), craftWorld.getSeed());
|
||||||
|
ChunkMap chunkMap = serverWorld.getChunkSource().chunkMap;
|
||||||
|
WorldGenContext worldGenContext = chunkMap.worldGenContext;
|
||||||
|
|
||||||
serverWorld.getChunkSource().chunkMap.generator = new NMSChunkGeneratorDelegate(vanilla, pack, provider, craftWorld.getSeed());
|
try {
|
||||||
|
ReflectionUtil.setFinalField(chunkMap, "worldGenContext", new WorldGenContext(
|
||||||
|
worldGenContext.level(),
|
||||||
|
new NMSChunkGeneratorDelegate(vanilla, pack, provider, craftWorld.getSeed()),
|
||||||
|
worldGenContext.structureManager(),
|
||||||
|
worldGenContext.lightEngine(),
|
||||||
|
worldGenContext.mainThreadMailBox()
|
||||||
|
));
|
||||||
|
} catch(NoSuchFieldException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
|
||||||
LOGGER.info("Successfully injected into world.");
|
LOGGER.info("Successfully injected into world.");
|
||||||
|
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package com.dfsek.terra.bukkit.nms.v1_20_R3;
|
package com.dfsek.terra.bukkit.nms.v1_21;
|
||||||
|
|
||||||
import net.minecraft.world.level.LevelHeightAccessor;
|
import net.minecraft.world.level.LevelHeightAccessor;
|
||||||
|
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package com.dfsek.terra.bukkit.nms.v1_20_R3;
|
package com.dfsek.terra.bukkit.nms.v1_21;
|
||||||
|
|
||||||
import net.minecraft.core.Holder;
|
import net.minecraft.core.Holder;
|
||||||
import net.minecraft.core.Holder.Reference;
|
import net.minecraft.core.Holder.Reference;
|
||||||
+2
-2
@@ -1,4 +1,4 @@
|
|||||||
package com.dfsek.terra.bukkit.nms.v1_20_R3;
|
package com.dfsek.terra.bukkit.nms.v1_21;
|
||||||
|
|
||||||
import net.minecraft.core.Registry;
|
import net.minecraft.core.Registry;
|
||||||
import net.minecraft.core.registries.Registries;
|
import net.minecraft.core.registries.Registries;
|
||||||
@@ -6,7 +6,7 @@ import net.minecraft.resources.ResourceKey;
|
|||||||
import net.minecraft.server.dedicated.DedicatedServer;
|
import net.minecraft.server.dedicated.DedicatedServer;
|
||||||
import net.minecraft.world.level.biome.Biome;
|
import net.minecraft.world.level.biome.Biome;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
|
import org.bukkit.craftbukkit.CraftServer;
|
||||||
|
|
||||||
|
|
||||||
public class RegistryFetcher {
|
public class RegistryFetcher {
|
||||||
@@ -10,6 +10,12 @@ architectury {
|
|||||||
loader("fabric")
|
loader("fabric")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") {
|
||||||
|
name = "Sonatype Snapshots"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
shadedApi(project(":common:implementation:base"))
|
shadedApi(project(":common:implementation:base"))
|
||||||
|
|
||||||
@@ -26,8 +32,8 @@ dependencies {
|
|||||||
|
|
||||||
modImplementation("net.fabricmc:fabric-loader:${Versions.Mod.fabricLoader}")
|
modImplementation("net.fabricmc:fabric-loader:${Versions.Mod.fabricLoader}")
|
||||||
|
|
||||||
modImplementation("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud)
|
modImplementation("org.incendo", "cloud-fabric", Versions.Libraries.cloudFabric)
|
||||||
include("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud)
|
include("org.incendo", "cloud-fabric", Versions.Libraries.cloudFabric)
|
||||||
|
|
||||||
modRuntimeOnly("net.fabricmc.fabric-api", "fabric-api", Versions.Fabric.fabricAPI)
|
modRuntimeOnly("net.fabricmc.fabric-api", "fabric-api", Versions.Fabric.fabricAPI)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ dependencies {
|
|||||||
minecraft("com.mojang:minecraft:${Versions.Mod.minecraft}")
|
minecraft("com.mojang:minecraft:${Versions.Mod.minecraft}")
|
||||||
mappings("net.fabricmc:yarn:${Versions.Mod.yarn}:v2")
|
mappings("net.fabricmc:yarn:${Versions.Mod.yarn}:v2")
|
||||||
|
|
||||||
modImplementation("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud) {
|
modImplementation("org.incendo", "cloud-fabric", Versions.Libraries.cloudFabric) {
|
||||||
exclude("net.fabricmc")
|
exclude("net.fabricmc")
|
||||||
exclude("net.fabricmc.fabric-api")
|
exclude("net.fabricmc.fabric-api")
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-2
@@ -1,8 +1,7 @@
|
|||||||
package com.dfsek.terra.lifecycle;
|
package com.dfsek.terra.lifecycle;
|
||||||
|
|
||||||
import cloud.commandframework.execution.CommandExecutionCoordinator;
|
|
||||||
import cloud.commandframework.fabric.FabricServerCommandManager;
|
|
||||||
import net.minecraft.server.command.ServerCommandSource;
|
import net.minecraft.server.command.ServerCommandSource;
|
||||||
|
import org.incendo.cloud.fabric.FabricServerCommandManager;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user