9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-19 15:09:15 +00:00

添加paper loader模块

This commit is contained in:
XiaoMoMi
2025-06-01 02:10:17 +08:00
parent 8a02864eea
commit 01f169183f
31 changed files with 361 additions and 134 deletions

View File

@@ -141,7 +141,7 @@ public class BukkitCompatibilityManager implements CompatibilityManager {
}
private void initLuckPermsHook() {
new LuckPermsEventListeners(plugin.bootstrap(), (uuid) -> {
new LuckPermsEventListeners(plugin.javaPlugin(), (uuid) -> {
BukkitFontManager fontManager = (BukkitFontManager) plugin.fontManager();
fontManager.refreshEmojiSuggestions(uuid);
});
@@ -154,7 +154,7 @@ public class BukkitCompatibilityManager implements CompatibilityManager {
Class.forName("com.infernalsuite.asp.api.AdvancedSlimePaperAPI");
SlimeFormatStorageAdaptor adaptor = new SlimeFormatStorageAdaptor(worldManager);
worldManager.setStorageAdaptor(adaptor);
Bukkit.getPluginManager().registerEvents(adaptor, plugin.bootstrap());
Bukkit.getPluginManager().registerEvents(adaptor, plugin.javaPlugin());
logHook("AdvancedSlimePaper");
} catch (ClassNotFoundException ignored) {
}
@@ -163,13 +163,13 @@ public class BukkitCompatibilityManager implements CompatibilityManager {
Class.forName("com.infernalsuite.aswm.api.SlimePlugin");
LegacySlimeFormatStorageAdaptor adaptor = new LegacySlimeFormatStorageAdaptor(worldManager, 1);
worldManager.setStorageAdaptor(adaptor);
Bukkit.getPluginManager().registerEvents(adaptor, plugin.bootstrap());
Bukkit.getPluginManager().registerEvents(adaptor, plugin.javaPlugin());
logHook("AdvancedSlimePaper");
} catch (ClassNotFoundException ignored) {
if (Bukkit.getPluginManager().isPluginEnabled("SlimeWorldPlugin")) {
LegacySlimeFormatStorageAdaptor adaptor = new LegacySlimeFormatStorageAdaptor(worldManager, 2);
worldManager.setStorageAdaptor(adaptor);
Bukkit.getPluginManager().registerEvents(adaptor, plugin.bootstrap());
Bukkit.getPluginManager().registerEvents(adaptor, plugin.javaPlugin());
logHook("AdvancedSlimePaper");
}
}

View File

@@ -25,7 +25,7 @@ dependencies {
implementation("com.saicone.rtag:rtag-item:${rootProject.properties["rtag_version"]}")
implementation("net.momirealms:sparrow-util:${rootProject.properties["sparrow_util_version"]}")
implementation("net.momirealms:antigrieflib:${rootProject.properties["anti_grief_version"]}")
implementation("net.momirealms:craft-engine-nms-helper-mojmap:${rootProject.properties["nms_helper_version"]}")
implementation("net.momirealms:craft-engine-nms-helper:${rootProject.properties["nms_helper_version"]}")
}
java {
@@ -44,7 +44,7 @@ tasks.withType<JavaCompile> {
bukkit {
load = net.minecrell.pluginyml.bukkit.BukkitPluginDescription.PluginLoadOrder.POSTWORLD
main = "net.momirealms.craftengine.bukkit.BukkitBootstrap"
main = "net.momirealms.craftengine.bukkit.BukkitCraftEnginePlugin"
version = rootProject.properties["project_version"] as String
name = "CraftEngine"
apiVersion = "1.20"
@@ -60,9 +60,6 @@ artifacts {
tasks {
shadowJar {
manifest {
attributes["paperweight-mappings-namespace"] = "mojang"
}
archiveFileName = "${rootProject.name}-bukkit-plugin-${rootProject.properties["project_version"]}.jar"
destinationDirectory.set(file("$rootDir/target"))
relocate("net.kyori", "net.momirealms.craftengine.libraries")

View File

@@ -3,10 +3,10 @@ package net.momirealms.craftengine.bukkit;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import org.bukkit.plugin.java.JavaPlugin;
public class BukkitBootstrap extends JavaPlugin {
public class BukkitCraftEnginePlugin extends JavaPlugin {
private final BukkitCraftEngine plugin;
public BukkitBootstrap() {
public BukkitCraftEnginePlugin() {
this.plugin = new BukkitCraftEngine(this);
}

View File

@@ -0,0 +1,128 @@
import net.minecrell.pluginyml.paper.PaperPluginDescription
plugins {
id("com.gradleup.shadow") version "9.0.0-beta13"
id("de.eldoria.plugin-yml.paper") version "0.7.1"
}
repositories {
maven("https://jitpack.io/")
maven("https://repo.papermc.io/repository/maven-public/")
maven("https://repo.momirealms.net/releases/")
mavenCentral()
}
dependencies {
// Platform
compileOnly("io.papermc.paper:paper-api:${rootProject.properties["paper_version"]}-R0.1-SNAPSHOT")
implementation(project(":shared"))
implementation(project(":core"))
implementation(project(":bukkit"))
implementation(project(":bukkit:legacy"))
implementation(project(":bukkit:compatibility"))
implementation(project(":bukkit:compatibility:legacy"))
implementation(project(":common-files"))
implementation("com.saicone.rtag:rtag-item:${rootProject.properties["rtag_version"]}")
implementation("net.momirealms:sparrow-util:${rootProject.properties["sparrow_util_version"]}")
implementation("net.momirealms:antigrieflib:${rootProject.properties["anti_grief_version"]}")
implementation("net.momirealms:craft-engine-nms-helper-mojmap:${rootProject.properties["nms_helper_version"]}")
}
java {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}
tasks.withType<JavaCompile> {
options.encoding = "UTF-8"
options.release.set(21)
dependsOn(tasks.clean)
}
paper {
load = net.minecrell.pluginyml.bukkit.BukkitPluginDescription.PluginLoadOrder.POSTWORLD
main = "net.momirealms.craftengine.bukkit.PaperCraftEnginePlugin"
bootstrapper = "net.momirealms.craftengine.bukkit.PaperCraftEngineBootstrap"
version = rootProject.properties["project_version"] as String
name = "CraftEngine"
apiVersion = "1.20"
authors = listOf("XiaoMoMi")
contributors = listOf("jhqwqmc", "iqtesterrr")
foliaSupported = true
serverDependencies {
register("PlaceholderAPI") {
required = false
load = PaperPluginDescription.RelativeLoadOrder.BEFORE
}
register("WorldEdit") {
required = false
load = PaperPluginDescription.RelativeLoadOrder.BEFORE
}
register("FastAsyncWorldEdit") {
required = false
load = PaperPluginDescription.RelativeLoadOrder.BEFORE
joinClasspath = false
}
register("Skript") {
required = false
load = PaperPluginDescription.RelativeLoadOrder.BEFORE
}
register("NeigeItems") {
required = false
}
register("MMOItems") {
required = false
}
register("ModelEngine") {
required = false
}
register("BetterModel") {
required = false
}
register("AuraSkills") {
required = false
}
register("LuckPerms") {
required = false
}
register("ViaVersion") {
required = false
}
}
}
artifacts {
archives(tasks.shadowJar)
}
tasks {
shadowJar {
manifest {
attributes["paperweight-mappings-namespace"] = "mojang"
}
archiveFileName = "${rootProject.name}-paper-plugin-${rootProject.properties["project_version"]}.jar"
destinationDirectory.set(file("$rootDir/target"))
relocate("net.kyori", "net.momirealms.craftengine.libraries")
relocate("net.momirealms.sparrow.nbt", "net.momirealms.craftengine.libraries.nbt")
relocate("net.momirealms.antigrieflib", "net.momirealms.craftengine.libraries.antigrieflib")
relocate("com.saicone.rtag", "net.momirealms.craftengine.libraries.tag")
relocate("org.incendo", "net.momirealms.craftengine.libraries")
relocate("dev.dejvokep", "net.momirealms.craftengine.libraries")
relocate("org.bstats", "net.momirealms.craftengine.libraries.bstats")
relocate("com.github.benmanes.caffeine", "net.momirealms.craftengine.libraries.caffeine")
relocate("com.ezylang.evalex", "net.momirealms.craftengine.libraries.evalex")
relocate("net.bytebuddy", "net.momirealms.craftengine.libraries.bytebuddy")
relocate("org.yaml.snakeyaml", "net.momirealms.craftengine.libraries.snakeyaml")
relocate("org.ahocorasick", "net.momirealms.craftengine.libraries.ahocorasick")
relocate("net.jpountz", "net.momirealms.craftengine.libraries.jpountz")
relocate("software.amazon.awssdk", "net.momirealms.craftengine.libraries.awssdk")
relocate("software.amazon.eventstream", "net.momirealms.craftengine.libraries.eventstream")
relocate("com.google.common.jimfs", "net.momirealms.craftengine.libraries.jimfs")
relocate("org.apache.commons", "net.momirealms.craftengine.libraries.commons")
}
}

View File

@@ -0,0 +1,51 @@
package net.momirealms.craftengine.bukkit;
import io.papermc.paper.plugin.bootstrap.BootstrapContext;
import io.papermc.paper.plugin.bootstrap.PluginBootstrap;
import io.papermc.paper.plugin.bootstrap.PluginProviderContext;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.plugin.classpath.PaperClassPathAppender;
import net.momirealms.craftengine.core.plugin.logger.PluginLogger;
import net.momirealms.craftengine.core.plugin.logger.Slf4jPluginLogger;
import net.momirealms.craftengine.core.util.ReflectionUtils;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Method;
import java.util.Objects;
@SuppressWarnings("UnstableApiUsage")
public class PaperCraftEngineBootstrap implements PluginBootstrap {
private static final Class<?> clazz$PluginProviderContext = PluginProviderContext.class;
private static final Class<?> clazz$ComponentLogger = Objects.requireNonNull(
ReflectionUtils.getClazz(
"net{}kyori{}adventure{}text{}logger{}slf4j{}ComponentLogger".replace("{}", ".")
)
);
private static final Method method$PluginProviderContext$getLogger = Objects.requireNonNull(
ReflectionUtils.getMethod(
clazz$PluginProviderContext, clazz$ComponentLogger, new String[] { "getLogger" }
)
);
protected BukkitCraftEngine plugin;
@Override
public void bootstrap(@NotNull BootstrapContext context) {
PluginLogger logger;
try {
logger = new Slf4jPluginLogger((org.slf4j.Logger) method$PluginProviderContext$getLogger.invoke(context));
} catch (ReflectiveOperationException e) {
throw new RuntimeException("Failed to getLogger", e);
}
this.plugin = new BukkitCraftEngine(
logger,
context.getDataDirectory(),
new PaperClassPathAppender(this.getClass().getClassLoader())
);
}
@Override
public @NotNull JavaPlugin createPlugin(@NotNull PluginProviderContext context) {
return new PaperCraftEnginePlugin(this);
}
}

View File

@@ -0,0 +1,31 @@
package net.momirealms.craftengine.bukkit;
import org.bukkit.plugin.java.JavaPlugin;
public class PaperCraftEnginePlugin extends JavaPlugin {
private final PaperCraftEngineBootstrap bootstrap;
private boolean hasLoaded = false;
public PaperCraftEnginePlugin(PaperCraftEngineBootstrap bootstrap) {
this.bootstrap = bootstrap;
this.bootstrap.plugin.setJavaPlugin(this);
}
@Override
public void onLoad() {
if (!this.hasLoaded) {
this.hasLoaded = true;
this.bootstrap.plugin.onPluginLoad();
}
}
@Override
public void onEnable() {
this.bootstrap.plugin.onPluginEnable();
}
@Override
public void onDisable() {
this.bootstrap.plugin.onPluginDisable();
}
}

View File

@@ -113,9 +113,9 @@ public class BukkitBlockManager extends AbstractBlockManager {
@Override
public void delayedInit() {
Bukkit.getPluginManager().registerEvents(this.blockEventListener, this.plugin.bootstrap());
Bukkit.getPluginManager().registerEvents(this.blockEventListener, this.plugin.javaPlugin());
if (this.fallingBlockRemoveListener != null) {
Bukkit.getPluginManager().registerEvents(this.fallingBlockRemoveListener, this.plugin.bootstrap());
Bukkit.getPluginManager().registerEvents(this.fallingBlockRemoveListener, this.plugin.javaPlugin());
}
}

View File

@@ -93,8 +93,8 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager {
COLLISION_ENTITY_CLASS = Config.colliderType() == ColliderType.INTERACTION ? Interaction.class : Boat.class;
NMS_COLLISION_ENTITY_TYPE = Config.colliderType() == ColliderType.INTERACTION ? Reflections.instance$EntityType$INTERACTION : Reflections.instance$EntityType$OAK_BOAT;
COLLISION_ENTITY_TYPE = Config.colliderType();
Bukkit.getPluginManager().registerEvents(this.dismountListener, this.plugin.bootstrap());
Bukkit.getPluginManager().registerEvents(this.furnitureEventListener, this.plugin.bootstrap());
Bukkit.getPluginManager().registerEvents(this.dismountListener, this.plugin.javaPlugin());
Bukkit.getPluginManager().registerEvents(this.furnitureEventListener, this.plugin.javaPlugin());
for (World world : Bukkit.getWorlds()) {
List<Entity> entities = world.getEntities();
for (Entity entity : entities) {

View File

@@ -48,7 +48,7 @@ public class BukkitProjectileManager implements Listener, ProjectileManager {
@Override
public void delayedInit() {
Bukkit.getPluginManager().registerEvents(this, this.plugin.bootstrap());
Bukkit.getPluginManager().registerEvents(this, this.plugin.javaPlugin());
for (World world : Bukkit.getWorlds()) {
List<Entity> entities = world.getEntities();
for (Entity entity : entities) {
@@ -166,7 +166,7 @@ public class BukkitProjectileManager implements Listener, ProjectileManager {
public ProjectileInjectTask(Projectile projectile) {
this.projectile = projectile;
if (VersionHelper.isFolia()) {
this.task = new FoliaTask(projectile.getScheduler().runAtFixedRate(plugin.bootstrap(), (t) -> this.run(), () -> {}, 1, 1));
this.task = new FoliaTask(projectile.getScheduler().runAtFixedRate(plugin.javaPlugin(), (t) -> this.run(), () -> {}, 1, 1));
} else {
this.task = plugin.scheduler().sync().runRepeating(this, 1, 1);
}

View File

@@ -42,7 +42,7 @@ public class BukkitFontManager extends AbstractFontManager implements Listener {
@Override
public void delayedInit() {
Bukkit.getPluginManager().registerEvents(this, plugin.bootstrap());
Bukkit.getPluginManager().registerEvents(this, plugin.javaPlugin());
}
@Override

View File

@@ -65,9 +65,9 @@ public class BukkitItemManager extends AbstractItemManager<ItemStack> {
@Override
public void delayedInit() {
Bukkit.getPluginManager().registerEvents(this.itemEventListener, this.plugin.bootstrap());
Bukkit.getPluginManager().registerEvents(this.debugStickListener, this.plugin.bootstrap());
Bukkit.getPluginManager().registerEvents(this.armorEventListener, this.plugin.bootstrap());
Bukkit.getPluginManager().registerEvents(this.itemEventListener, this.plugin.javaPlugin());
Bukkit.getPluginManager().registerEvents(this.debugStickListener, this.plugin.javaPlugin());
Bukkit.getPluginManager().registerEvents(this.armorEventListener, this.plugin.javaPlugin());
}
@Override

View File

@@ -277,9 +277,9 @@ public class BukkitRecipeManager extends AbstractRecipeManager<ItemStack> {
@Override
public void delayedInit() {
Bukkit.getPluginManager().registerEvents(this.recipeEventListener, this.plugin.bootstrap());
Bukkit.getPluginManager().registerEvents(this.recipeEventListener, this.plugin.javaPlugin());
if (this.crafterEventListener != null) {
Bukkit.getPluginManager().registerEvents(this.crafterEventListener, this.plugin.bootstrap());
Bukkit.getPluginManager().registerEvents(this.crafterEventListener, this.plugin.javaPlugin());
}
}

View File

@@ -46,7 +46,7 @@ public class BukkitVanillaLootManager extends AbstractVanillaLootManager impleme
@Override
public void delayedInit() {
Bukkit.getPluginManager().registerEvents(this, plugin.bootstrap());
Bukkit.getPluginManager().registerEvents(this, plugin.javaPlugin());
}
@Override

View File

@@ -43,7 +43,7 @@ public class BukkitPackManager extends AbstractPackManager implements Listener {
@Override
public void delayedInit() {
super.delayedInit();
Bukkit.getPluginManager().registerEvents(this, plugin.bootstrap());
Bukkit.getPluginManager().registerEvents(this, plugin.javaPlugin());
}
@EventHandler(priority = EventPriority.LOW)

View File

@@ -29,6 +29,7 @@ import net.momirealms.craftengine.bukkit.util.RegistryUtils;
import net.momirealms.craftengine.bukkit.world.BukkitWorldManager;
import net.momirealms.craftengine.core.item.ItemManager;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.classpath.ClassPathAppender;
import net.momirealms.craftengine.core.plugin.classpath.ReflectionClassPathAppender;
import net.momirealms.craftengine.core.plugin.command.sender.SenderFactory;
import net.momirealms.craftengine.core.plugin.compatibility.CompatibilityManager;
@@ -37,6 +38,7 @@ import net.momirealms.craftengine.core.plugin.dependency.Dependencies;
import net.momirealms.craftengine.core.plugin.dependency.Dependency;
import net.momirealms.craftengine.core.plugin.gui.category.ItemBrowserManagerImpl;
import net.momirealms.craftengine.core.plugin.logger.JavaPluginLogger;
import net.momirealms.craftengine.core.plugin.logger.PluginLogger;
import net.momirealms.craftengine.core.plugin.scheduler.SchedulerAdapter;
import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask;
import net.momirealms.craftengine.core.util.CharacterUtils;
@@ -48,9 +50,12 @@ import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import org.jspecify.annotations.Nullable;
import java.io.*;
import java.lang.reflect.Field;
import java.net.URL;
import java.net.URLConnection;
import java.nio.file.Path;
import java.util.List;
import java.util.Objects;
@@ -60,24 +65,28 @@ import java.util.Optional;
public class BukkitCraftEngine extends CraftEngine {
private static final String COMPATIBILITY_CLASS = "net.momirealms.craftengine.bukkit.compatibility.BukkitCompatibilityManager";
private static BukkitCraftEngine instance;
private final JavaPlugin bootstrap;
private SchedulerTask tickTask;
private boolean successfullyLoaded = false;
private boolean successfullyEnabled = false;
private boolean requiresRestart = false;
private boolean hasMod = false;
private AntiGriefLib antiGrief;
private JavaPlugin javaPlugin;
private final Path dataFolderPath;
public BukkitCraftEngine(JavaPlugin bootstrap) {
public BukkitCraftEngine(JavaPlugin plugin) {
this(new JavaPluginLogger(plugin.getLogger()), plugin.getDataFolder().toPath().toAbsolutePath(), new ReflectionClassPathAppender(plugin.getClass().getClassLoader()));
}
public BukkitCraftEngine(PluginLogger logger, Path dataFolderPath, ClassPathAppender classPathAppender) {
super((p) -> {
CraftEngineReloadEvent event = new CraftEngineReloadEvent((BukkitCraftEngine) p);
EventUtils.fireAndForget(event);
});
instance = this;
this.bootstrap = bootstrap;
super.classPathAppender = new ReflectionClassPathAppender(this);
super.scheduler = new BukkitSchedulerAdapter(this);
super.logger = new JavaPluginLogger(bootstrap.getLogger());
this.dataFolderPath = dataFolderPath;
super.classPathAppender = classPathAppender;
super.logger = logger;
super.platform = new BukkitPlatform();
// find mod class if present
Class<?> modClass = ReflectionUtils.getClazz(MOD_CLASS);
@@ -97,6 +106,11 @@ public class BukkitCraftEngine extends CraftEngine {
}
}
public void setJavaPlugin(JavaPlugin javaPlugin) {
this.javaPlugin = javaPlugin;
super.scheduler = new BukkitSchedulerAdapter(this);
}
@Override
public void onPluginLoad() {
super.onPluginLoad();
@@ -127,7 +141,7 @@ public class BukkitCraftEngine extends CraftEngine {
logger().severe(" ");
logger().severe(" ");
logger().severe(" ");
Bukkit.getPluginManager().disablePlugin(this.bootstrap);
Bukkit.getPluginManager().disablePlugin(this.javaPlugin);
return;
}
this.successfullyEnabled = true;
@@ -194,7 +208,7 @@ public class BukkitCraftEngine extends CraftEngine {
@Override
public void platformDelayedEnable() {
if (Config.metrics()) {
new Metrics(this.bootstrap(), 24333);
new Metrics(this.javaPlugin(), 24333);
}
// tick task
if (!VersionHelper.isFolia()) {
@@ -209,23 +223,40 @@ public class BukkitCraftEngine extends CraftEngine {
@Override
public InputStream resourceStream(String filePath) {
return bootstrap.getResource(CharacterUtils.replaceBackslashWithSlash(filePath));
return getResource(CharacterUtils.replaceBackslashWithSlash(filePath));
}
private @Nullable InputStream getResource(String filename) {
if (filename == null) {
throw new IllegalArgumentException("filename cannot be null");
}
try {
URL url = this.getClass().getClassLoader().getResource(filename);
if (url == null) {
return null;
}
URLConnection connection = url.openConnection();
connection.setUseCaches(false);
return connection.getInputStream();
} catch (IOException ex) {
return null;
}
}
@Override
public File dataFolderFile() {
return bootstrap().getDataFolder();
return this.dataFolderPath.toFile();
}
@Override
public Path dataFolderPath() {
return bootstrap().getDataFolder().toPath().toAbsolutePath();
return this.dataFolderPath;
}
@SuppressWarnings("deprecation")
@Override
public String pluginVersion() {
return bootstrap().getDescription().getVersion();
return javaPlugin().getDescription().getVersion();
}
@Override
@@ -263,8 +294,8 @@ public class BukkitCraftEngine extends CraftEngine {
return (SenderFactory<CraftEngine, CommandSender>) senderFactory;
}
public JavaPlugin bootstrap() {
return bootstrap;
public JavaPlugin javaPlugin() {
return this.javaPlugin;
}
public static BukkitCraftEngine instance() {
@@ -336,7 +367,7 @@ public class BukkitCraftEngine extends CraftEngine {
public AntiGriefLib antiGrief() {
if (this.antiGrief == null) {
this.antiGrief = AntiGriefLib.builder(this.bootstrap)
this.antiGrief = AntiGriefLib.builder(this.javaPlugin)
.ignoreOP(true)
.silentLogs(false)
.build();

View File

@@ -1,38 +0,0 @@
package net.momirealms.craftengine.bukkit.plugin.classpath;
import net.momirealms.craftengine.bukkit.util.Reflections;
import net.momirealms.craftengine.core.plugin.Plugin;
import net.momirealms.craftengine.core.plugin.classpath.ClassPathAppender;
import net.momirealms.craftengine.core.plugin.classpath.URLClassLoaderAccess;
import java.net.MalformedURLException;
import java.net.URLClassLoader;
import java.nio.file.Path;
public class BukkitClassPathAppender implements ClassPathAppender {
private final URLClassLoaderAccess classLoaderAccess;
public BukkitClassPathAppender(ClassLoader classLoader) throws IllegalAccessException {
if (Reflections.clazz$PaperPluginClassLoader != null && Reflections.clazz$PaperPluginClassLoader.isInstance(classLoader)) {
URLClassLoader libraryClassLoader = (URLClassLoader) Reflections.field$PaperPluginClassLoader$libraryLoader.get(classLoader);
this.classLoaderAccess = URLClassLoaderAccess.create(libraryClassLoader);
} else if (classLoader instanceof URLClassLoader) {
this.classLoaderAccess = URLClassLoaderAccess.create((URLClassLoader) classLoader);
} else {
throw new IllegalStateException("ClassLoader is not instance of URLClassLoader");
}
}
public BukkitClassPathAppender(Plugin plugin) throws IllegalAccessException {
this(plugin.getClass().getClassLoader());
}
@Override
public void addJarToClasspath(Path file) {
try {
this.classLoaderAccess.addURL(file.toUri().toURL());
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
}

View File

@@ -0,0 +1,45 @@
package net.momirealms.craftengine.bukkit.plugin.classpath;
import net.momirealms.craftengine.core.plugin.classpath.ClassPathAppender;
import net.momirealms.craftengine.core.plugin.classpath.URLClassLoaderAccess;
import net.momirealms.craftengine.core.util.ReflectionUtils;
import java.lang.reflect.Field;
import java.net.MalformedURLException;
import java.net.URLClassLoader;
import java.nio.file.Path;
import java.util.Optional;
public class PaperClassPathAppender implements ClassPathAppender {
public static final Class<?> clazz$PaperPluginClassLoader = ReflectionUtils.getClazz(
"io.papermc.paper.plugin.entrypoint.classloader.PaperPluginClassLoader"
);
public static final Field field$PaperPluginClassLoader$libraryLoader = Optional.ofNullable(clazz$PaperPluginClassLoader)
.map(it -> ReflectionUtils.getDeclaredField(it, URLClassLoader.class, 0))
.orElse(null);
private final URLClassLoaderAccess classLoaderAccess;
public PaperClassPathAppender(ClassLoader classLoader) {
try {
if (clazz$PaperPluginClassLoader != null && clazz$PaperPluginClassLoader.isInstance(classLoader)) {
URLClassLoader libraryClassLoader = (URLClassLoader) field$PaperPluginClassLoader$libraryLoader.get(classLoader);
this.classLoaderAccess = URLClassLoaderAccess.create(libraryClassLoader);
} else if (classLoader instanceof URLClassLoader) {
this.classLoaderAccess = URLClassLoaderAccess.create((URLClassLoader) classLoader);
} else {
throw new IllegalStateException("ClassLoader is not instance of URLClassLoader");
}
} catch (ReflectiveOperationException e) {
throw new RuntimeException("Failed to instantiate PaperPluginClassLoader", e);
}
}
@Override
public void addJarToClasspath(Path file) {
try {
this.classLoaderAccess.addURL(file.toUri().toURL());
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
}

View File

@@ -22,7 +22,7 @@ public class BukkitCommandManager extends AbstractCommandManager<CommandSender>
public BukkitCommandManager(BukkitCraftEngine plugin) {
super(plugin, new LegacyPaperCommandManager<>(
plugin.bootstrap(),
plugin.javaPlugin(),
ExecutionCoordinator.simpleCoordinator(),
SenderMapper.identity()
));

View File

@@ -71,7 +71,7 @@ public class BukkitSenderFactory extends SenderFactory<BukkitCraftEngine, Comman
@Override
protected void performCommand(CommandSender sender, String command) {
plugin().bootstrap().getServer().dispatchCommand(sender, command);
plugin().javaPlugin().getServer().dispatchCommand(sender, command);
}
@Override

View File

@@ -29,7 +29,7 @@ public class BukkitGuiManager implements GuiManager, Listener {
@Override
public void delayedInit() {
Bukkit.getPluginManager().registerEvents(this, plugin.bootstrap());
Bukkit.getPluginManager().registerEvents(this, plugin.javaPlugin());
}
@Override

View File

@@ -119,10 +119,10 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
this.immediatePacketConsumer.accept(connection, bundle);
};
// set up mod channel
this.plugin.bootstrap().getServer().getMessenger().registerIncomingPluginChannel(this.plugin.bootstrap(), MOD_CHANNEL, this);
this.plugin.bootstrap().getServer().getMessenger().registerOutgoingPluginChannel(this.plugin.bootstrap(), MOD_CHANNEL);
this.plugin.javaPlugin().getServer().getMessenger().registerIncomingPluginChannel(this.plugin.javaPlugin(), MOD_CHANNEL, this);
this.plugin.javaPlugin().getServer().getMessenger().registerOutgoingPluginChannel(this.plugin.javaPlugin(), MOD_CHANNEL);
// 配置via频道
this.plugin.bootstrap().getServer().getMessenger().registerIncomingPluginChannel(this.plugin.bootstrap(), VIA_CHANNEL, this);
this.plugin.javaPlugin().getServer().getMessenger().registerIncomingPluginChannel(this.plugin.javaPlugin(), VIA_CHANNEL, this);
// Inject server channel
try {
Object server = Reflections.method$MinecraftServer$getServer.invoke(null);
@@ -213,7 +213,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
this.onlineUsers.put(player.getUniqueId(), user);
this.resetUserArray();
if (VersionHelper.isFolia()) {
player.getScheduler().runAtFixedRate(plugin.bootstrap(), (t) -> user.tick(),
player.getScheduler().runAtFixedRate(plugin.javaPlugin(), (t) -> user.tick(),
() -> plugin.debug(() -> "Player " + player.getName() + "'s entity scheduler is retired"), 1, 1);
}
}
@@ -264,7 +264,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
@Override
public void init() {
Bukkit.getPluginManager().registerEvents(this, plugin.bootstrap());
Bukkit.getPluginManager().registerEvents(this, plugin.javaPlugin());
}
@Override

View File

@@ -1275,7 +1275,7 @@ public class PacketConsumers {
if (!user.isOnline()) return;
BukkitServerPlayer player = (BukkitServerPlayer) user;
if (VersionHelper.isFolia()) {
player.platformPlayer().getScheduler().run(BukkitCraftEngine.instance().bootstrap(), (t) -> {
player.platformPlayer().getScheduler().run(BukkitCraftEngine.instance().javaPlugin(), (t) -> {
try {
handleSetCreativeSlotPacketOnMainThread(player, packet);
} catch (Exception e) {
@@ -1413,7 +1413,7 @@ public class PacketConsumers {
Player player = (Player) user.platformPlayer();
if (player == null) return;
if (VersionHelper.isFolia()) {
player.getScheduler().run(BukkitCraftEngine.instance().bootstrap(), (t) -> {
player.getScheduler().run(BukkitCraftEngine.instance().javaPlugin(), (t) -> {
try {
handlePickItemFromEntityOnMainThread(player, furniture);
} catch (Exception e) {

View File

@@ -14,9 +14,9 @@ public class BukkitSchedulerAdapter extends AbstractJavaScheduler<World> {
public BukkitSchedulerAdapter(BukkitCraftEngine plugin) {
super(plugin);
if (VersionHelper.isFolia()) {
this.sync = new FoliaExecutor(plugin.bootstrap());
this.sync = new FoliaExecutor(plugin);
} else {
this.sync = new BukkitExecutor(plugin.bootstrap());
this.sync = new BukkitExecutor(plugin);
}
}

View File

@@ -1,17 +1,17 @@
package net.momirealms.craftengine.bukkit.plugin.scheduler.impl;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.core.plugin.scheduler.DummyTask;
import net.momirealms.craftengine.core.plugin.scheduler.RegionExecutor;
import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.NotNull;
public class BukkitExecutor implements RegionExecutor<World> {
private final Plugin plugin;
private final BukkitCraftEngine plugin;
public BukkitExecutor(Plugin plugin) {
public BukkitExecutor(BukkitCraftEngine plugin) {
this.plugin = plugin;
}
@@ -22,17 +22,17 @@ public class BukkitExecutor implements RegionExecutor<World> {
@Override
public void runDelayed(Runnable r, World world, int x, int z) {
Bukkit.getScheduler().runTask(plugin, r);
Bukkit.getScheduler().runTask(plugin.javaPlugin(), r);
}
@Override
public SchedulerTask runAsyncRepeating(Runnable runnable, long delay, long period) {
return new BukkitTask(Bukkit.getScheduler().runTaskTimerAsynchronously(plugin, runnable, delay, period));
return new BukkitTask(Bukkit.getScheduler().runTaskTimerAsynchronously(plugin.javaPlugin(), runnable, delay, period));
}
@Override
public SchedulerTask runAsyncLater(Runnable runnable, long delay) {
return new BukkitTask(Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, runnable, delay));
return new BukkitTask(Bukkit.getScheduler().runTaskLaterAsynchronously(plugin.javaPlugin(), runnable, delay));
}
@Override
@@ -42,15 +42,15 @@ public class BukkitExecutor implements RegionExecutor<World> {
runnable.run();
return new DummyTask();
} else {
return new BukkitTask(Bukkit.getScheduler().runTask(plugin, runnable));
return new BukkitTask(Bukkit.getScheduler().runTask(plugin.javaPlugin(), runnable));
}
}
return new BukkitTask(Bukkit.getScheduler().runTaskLater(plugin, runnable, delay));
return new BukkitTask(Bukkit.getScheduler().runTaskLater(plugin.javaPlugin(), runnable, delay));
}
@Override
public SchedulerTask runRepeating(Runnable runnable, long delay, long period, World world, int x, int z) {
return new BukkitTask(Bukkit.getScheduler().runTaskTimer(plugin, runnable, delay, period));
return new BukkitTask(Bukkit.getScheduler().runTaskTimer(plugin.javaPlugin(), runnable, delay, period));
}
@Override
@@ -59,6 +59,6 @@ public class BukkitExecutor implements RegionExecutor<World> {
runnable.run();
return;
}
Bukkit.getScheduler().runTask(plugin, runnable);
Bukkit.getScheduler().runTask(plugin.javaPlugin(), runnable);
}
}

View File

@@ -1,26 +1,26 @@
package net.momirealms.craftengine.bukkit.plugin.scheduler.impl;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.core.plugin.scheduler.RegionExecutor;
import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.NotNull;
import java.util.Optional;
public class FoliaExecutor implements RegionExecutor<World> {
private final Plugin plugin;
private final BukkitCraftEngine plugin;
public FoliaExecutor(Plugin plugin) {
public FoliaExecutor(BukkitCraftEngine plugin) {
this.plugin = plugin;
}
@Override
public void run(Runnable runnable, World world, int x, int z) {
Optional.ofNullable(world).ifPresentOrElse(w ->
Bukkit.getRegionScheduler().execute(plugin, w, x, z, runnable),
() -> Bukkit.getGlobalRegionScheduler().execute(plugin, runnable)
Bukkit.getRegionScheduler().execute(plugin.javaPlugin(), w, x, z, runnable),
() -> Bukkit.getGlobalRegionScheduler().execute(plugin.javaPlugin(), runnable)
);
}
@@ -43,15 +43,15 @@ public class FoliaExecutor implements RegionExecutor<World> {
public SchedulerTask runLater(Runnable runnable, long delay, World world, int x, int z) {
if (world == null) {
if (delay <= 0) {
return new FoliaTask(Bukkit.getGlobalRegionScheduler().runDelayed(plugin, scheduledTask -> runnable.run(), delay));
return new FoliaTask(Bukkit.getGlobalRegionScheduler().runDelayed(plugin.javaPlugin(), scheduledTask -> runnable.run(), delay));
} else {
return new FoliaTask(Bukkit.getGlobalRegionScheduler().run(plugin, scheduledTask -> runnable.run()));
return new FoliaTask(Bukkit.getGlobalRegionScheduler().run(plugin.javaPlugin(), scheduledTask -> runnable.run()));
}
} else {
if (delay <= 0) {
return new FoliaTask(Bukkit.getRegionScheduler().run(plugin, world, x, z, scheduledTask -> runnable.run()));
return new FoliaTask(Bukkit.getRegionScheduler().run(plugin.javaPlugin(), world, x, z, scheduledTask -> runnable.run()));
} else {
return new FoliaTask(Bukkit.getRegionScheduler().runDelayed(plugin, world, x, z, scheduledTask -> runnable.run(), delay));
return new FoliaTask(Bukkit.getRegionScheduler().runDelayed(plugin.javaPlugin(), world, x, z, scheduledTask -> runnable.run(), delay));
}
}
}
@@ -59,14 +59,14 @@ public class FoliaExecutor implements RegionExecutor<World> {
@Override
public SchedulerTask runRepeating(Runnable runnable, long delay, long period, World world, int x, int z) {
if (world == null) {
return new FoliaTask(Bukkit.getGlobalRegionScheduler().runAtFixedRate(plugin, scheduledTask -> runnable.run(), delay, period));
return new FoliaTask(Bukkit.getGlobalRegionScheduler().runAtFixedRate(plugin.javaPlugin(), scheduledTask -> runnable.run(), delay, period));
} else {
return new FoliaTask(Bukkit.getRegionScheduler().runAtFixedRate(plugin, world, x, z, scheduledTask -> runnable.run(), delay, period));
return new FoliaTask(Bukkit.getRegionScheduler().runAtFixedRate(plugin.javaPlugin(), world, x, z, scheduledTask -> runnable.run(), delay, period));
}
}
@Override
public void execute(@NotNull Runnable runnable) {
Bukkit.getGlobalRegionScheduler().execute(plugin, runnable);
Bukkit.getGlobalRegionScheduler().execute(plugin.javaPlugin(), runnable);
}
}

View File

@@ -32,7 +32,6 @@ import sun.misc.Unsafe;
import java.io.BufferedReader;
import java.lang.invoke.VarHandle;
import java.lang.reflect.*;
import java.net.URLClassLoader;
import java.time.Instant;
import java.util.*;
import java.util.concurrent.CompletableFuture;
@@ -6785,14 +6784,6 @@ public class Reflections {
.map(clazz -> ReflectionUtils.getTheOnlyConstructor(clazz))
.orElse(null);
public static final Class<?> clazz$PaperPluginClassLoader = ReflectionUtils.getClazz(
"io.papermc.paper.plugin.entrypoint.classloader.PaperPluginClassLoader"
);
public static final Field field$PaperPluginClassLoader$libraryLoader = Optional.ofNullable(clazz$PaperPluginClassLoader)
.map(it -> ReflectionUtils.getDeclaredField(it, URLClassLoader.class, 0))
.orElse(null);
public static final Method method$SoundSource$values = requireNonNull(
ReflectionUtils.getStaticMethod(
clazz$SoundSource, clazz$SoundSource.arrayType()

View File

@@ -92,7 +92,7 @@ public class BukkitWorldManager implements WorldManager, Listener {
public void delayedInit() {
// events and tasks
Bukkit.getPluginManager().registerEvents(this, this.plugin.bootstrap());
Bukkit.getPluginManager().registerEvents(this, this.plugin.javaPlugin());
this.tickTask = this.plugin.scheduler().asyncRepeating(() -> {
try {
if (this.isTicking) {

View File

@@ -1,7 +1,5 @@
package net.momirealms.craftengine.core.plugin.classpath;
import net.momirealms.craftengine.core.plugin.Plugin;
import java.net.MalformedURLException;
import java.net.URLClassLoader;
import java.nio.file.Path;
@@ -17,10 +15,6 @@ public class ReflectionClassPathAppender implements ClassPathAppender {
}
}
public ReflectionClassPathAppender(Plugin plugin) throws IllegalStateException {
this(plugin.getClass().getClassLoader());
}
@Override
public void addJarToClasspath(Path file) {
try {

View File

@@ -4,12 +4,6 @@ import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.dependency.relocation.Relocation;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.FileTime;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Collections;
import java.util.List;
import java.util.jar.JarFile;

View File

@@ -60,6 +60,8 @@ public class VersionHelper {
}
}
public static void init() {}
public static float version() {
return version;
}

View File

@@ -6,6 +6,7 @@ include(":bukkit:legacy")
include(":bukkit:compatibility")
include(":bukkit:compatibility:legacy")
include(":bukkit:loader")
include(":bukkit:paper-loader")
include(":server-mod:v1_20_1")
include(":server-mod:v1_20_5")
include(":server-mod:v1_21_5")