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

优化插件启动过程

This commit is contained in:
XiaoMoMi
2025-11-15 22:17:28 +08:00
parent a8eca7edc1
commit 13f1d96e34
14 changed files with 273 additions and 185 deletions

View File

@@ -2,11 +2,13 @@ package net.momirealms.craftengine.bukkit.compatibility;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.momirealms.craftengine.bukkit.block.BukkitBlockManager;
import net.momirealms.craftengine.bukkit.block.entity.renderer.element.BukkitBlockEntityElementConfigs;
import net.momirealms.craftengine.bukkit.compatibility.item.*;
import net.momirealms.craftengine.bukkit.compatibility.legacy.slimeworld.LegacySlimeFormatStorageAdaptor;
import net.momirealms.craftengine.bukkit.compatibility.leveler.*;
import net.momirealms.craftengine.bukkit.compatibility.model.bettermodel.BetterModelBlockEntityElementConfig;
import net.momirealms.craftengine.bukkit.compatibility.model.bettermodel.BetterModelModel;
import net.momirealms.craftengine.bukkit.compatibility.model.bettermodel.BetterModelUtils;
import net.momirealms.craftengine.bukkit.compatibility.model.modelengine.ModelEngineBlockEntityElementConfig;
import net.momirealms.craftengine.bukkit.compatibility.model.modelengine.ModelEngineModel;
import net.momirealms.craftengine.bukkit.compatibility.model.modelengine.ModelEngineUtils;
import net.momirealms.craftengine.bukkit.compatibility.mythicmobs.MythicItemDropListener;
@@ -68,16 +70,6 @@ public class BukkitCompatibilityManager implements CompatibilityManager {
@Override
public void onEnable() {
this.initSlimeWorldHook();
if (this.isPluginEnabled("PlaceholderAPI")) {
PlaceholderAPIUtils.registerExpansions(this.plugin);
this.hasPlaceholderAPI = true;
logHook("PlaceholderAPI");
}
if (this.isPluginEnabled("Skript")) {
SkriptHook.register();
logHook("Skript");
}
// WorldEdit
// FastAsyncWorldEdit
if (this.isPluginEnabled("FastAsyncWorldEdit")) {
@@ -91,16 +83,48 @@ public class BukkitCompatibilityManager implements CompatibilityManager {
this.initWorldEditHook();
logHook("WorldEdit");
}
if (this.hasPlugin("BetterModel")) {
BukkitBlockEntityElementConfigs.register(Key.of("craftengine:better_model"), new BetterModelBlockEntityElementConfig.Factory());
logHook("BetterModel");
}
if (this.hasPlugin("ModelEngine")) {
BukkitBlockEntityElementConfigs.register(Key.of("craftengine:model_engine"), new ModelEngineBlockEntityElementConfig.Factory());
logHook("ModelEngine");
}
if (this.hasPlugin("CustomNameplates")) {
registerTagResolverProvider(new CustomNameplateProviders.Background());
registerTagResolverProvider(new CustomNameplateProviders.Nameplate());
registerTagResolverProvider(new CustomNameplateProviders.Bubble());
logHook("CustomNameplates");
}
Key worldGuardRegion = Key.of("worldguard:region");
if (this.hasPlugin("WorldGuard")) {
EventConditions.register(worldGuardRegion, new WorldGuardRegionCondition.FactoryImpl<>());
LootConditions.register(worldGuardRegion, new WorldGuardRegionCondition.FactoryImpl<>());
logHook("WorldGuard");
} else {
EventConditions.register(worldGuardRegion, new AlwaysFalseCondition.FactoryImpl<>());
LootConditions.register(worldGuardRegion, new AlwaysFalseCondition.FactoryImpl<>());
}
}
@Override
public void onDelayedEnable() {
this.initSlimeWorldHook();
if (this.isPluginEnabled("PlaceholderAPI")) {
PlaceholderAPIUtils.registerExpansions(this.plugin);
this.hasPlaceholderAPI = true;
logHook("PlaceholderAPI");
}
this.initItemHooks();
if (this.isPluginEnabled("LuckPerms")) {
this.initLuckPermsHook();
logHook("LuckPerms");
}
if (this.isPluginEnabled("Skript")) {
SkriptHook.register();
logHook("Skript");
}
if (this.isPluginEnabled("AuraSkills")) {
this.registerLevelerProvider("AuraSkills", new AuraSkillsLevelerProvider());
logHook("AuraSkills");
@@ -133,33 +157,10 @@ public class BukkitCompatibilityManager implements CompatibilityManager {
new MythicItemDropListener(this.plugin);
logHook("MythicMobs");
}
Key worldGuardRegion = Key.of("worldguard:region");
if (this.isPluginEnabled("WorldGuard")) {
EventConditions.register(worldGuardRegion, new WorldGuardRegionCondition.FactoryImpl<>());
LootConditions.register(worldGuardRegion, new WorldGuardRegionCondition.FactoryImpl<>());
logHook("WorldGuard");
} else {
EventConditions.register(worldGuardRegion, new AlwaysFalseCondition.FactoryImpl<>());
LootConditions.register(worldGuardRegion, new AlwaysFalseCondition.FactoryImpl<>());
}
if (this.isPluginEnabled("BetterModel")) {
BetterModelUtils.registerConstantBlockEntityRender();
logHook("BetterModel");
}
if (this.isPluginEnabled("ModelEngine")) {
ModelEngineUtils.registerConstantBlockEntityRender();
logHook("ModelEngine");
}
if (this.isPluginEnabled("QuickShop-Hikari")) {
new QuickShopItemExpressionHandler(this.plugin).register();
logHook("QuickShop-Hikari");
}
if (this.isPluginEnabled("CustomNameplates")) {
registerTagResolverProvider(new CustomNameplateProviders.Background());
registerTagResolverProvider(new CustomNameplateProviders.Nameplate());
registerTagResolverProvider(new CustomNameplateProviders.Bubble());
logHook("CustomNameplates");
}
}
@Override

View File

@@ -2,11 +2,11 @@ package net.momirealms.craftengine.bukkit.compatibility.model.bettermodel;
import kr.toxicity.model.api.BetterModel;
import kr.toxicity.model.api.data.renderer.ModelRenderer;
import net.momirealms.craftengine.bukkit.block.entity.renderer.element.BukkitBlockEntityElementConfigs;
import net.momirealms.craftengine.core.util.Key;
import org.bukkit.entity.Entity;
public class BetterModelUtils {
public final class BetterModelUtils {
private BetterModelUtils() {}
public static void bindModel(Entity base, String id) {
ModelRenderer renderer = BetterModel.plugin().modelManager().model(id);
@@ -15,8 +15,4 @@ public class BetterModelUtils {
}
renderer.create(base);
}
public static void registerConstantBlockEntityRender() {
BukkitBlockEntityElementConfigs.register(Key.of("craftengine:better_model"), new BetterModelBlockEntityElementConfig.Factory());
}
}

View File

@@ -3,11 +3,11 @@ package net.momirealms.craftengine.bukkit.compatibility.model.modelengine;
import com.ticxo.modelengine.api.ModelEngineAPI;
import com.ticxo.modelengine.api.model.ActiveModel;
import com.ticxo.modelengine.api.model.ModeledEntity;
import net.momirealms.craftengine.bukkit.block.entity.renderer.element.BukkitBlockEntityElementConfigs;
import net.momirealms.craftengine.core.util.Key;
import org.bukkit.entity.Entity;
public class ModelEngineUtils {
public final class ModelEngineUtils {
private ModelEngineUtils() {}
public static void bindModel(Entity base, String id) {
ModeledEntity modeledEntity = ModelEngineAPI.createModeledEntity(base);
@@ -26,8 +26,4 @@ public class ModelEngineUtils {
}
return entityId;
}
public static void registerConstantBlockEntityRender() {
BukkitBlockEntityElementConfigs.register(Key.of("craftengine:model_engine"), new ModelEngineBlockEntityElementConfig.Factory());
}
}

View File

@@ -44,14 +44,14 @@ tasks.withType<JavaCompile> {
}
bukkit {
load = net.minecrell.pluginyml.bukkit.BukkitPluginDescription.PluginLoadOrder.POSTWORLD
load = net.minecrell.pluginyml.bukkit.BukkitPluginDescription.PluginLoadOrder.STARTUP
main = "net.momirealms.craftengine.bukkit.plugin.BukkitCraftEnginePlugin"
version = rootProject.properties["project_version"] as String
name = "CraftEngine"
apiVersion = "1.20"
authors = listOf("XiaoMoMi")
contributors = listOf("https://github.com/Xiao-MoMi/craft-engine/graphs/contributors")
softDepend = listOf("PlaceholderAPI", "WorldEdit", "FastAsyncWorldEdit", "Skript")
softDepend = listOf("WorldEdit", "FastAsyncWorldEdit")
foliaSupported = true
}

View File

@@ -46,7 +46,7 @@ tasks.withType<JavaCompile> {
}
paper {
load = net.minecrell.pluginyml.bukkit.BukkitPluginDescription.PluginLoadOrder.POSTWORLD
load = net.minecrell.pluginyml.bukkit.BukkitPluginDescription.PluginLoadOrder.STARTUP
main = "net.momirealms.craftengine.bukkit.plugin.PaperCraftEnginePlugin"
bootstrapper = "net.momirealms.craftengine.bukkit.plugin.PaperCraftEngineBootstrap"
version = rootProject.properties["project_version"] as String
@@ -56,10 +56,7 @@ paper {
contributors = listOf("https://github.com/Xiao-MoMi/craft-engine/graphs/contributors")
foliaSupported = true
serverDependencies {
register("PlaceholderAPI") {
required = false
load = PaperPluginDescription.RelativeLoadOrder.BEFORE
}
// WorldEdit
register("WorldEdit") {
required = false
load = PaperPluginDescription.RelativeLoadOrder.BEFORE
@@ -69,10 +66,9 @@ paper {
load = PaperPluginDescription.RelativeLoadOrder.BEFORE
joinClasspath = false
}
register("Skript") {
required = false
load = PaperPluginDescription.RelativeLoadOrder.BEFORE
}
register("PlaceholderAPI") { required = false }
register("Skript") { required = false }
register("LuckPerms") { required = false }
register("ViaVersion") { required = false }
register("QuickShop-Hikari") { required = false }

View File

@@ -75,7 +75,6 @@ public class BukkitFurniture implements Furniture {
this.hasExternalModel = false;
}
Quaternionf conjugated = QuaternionUtils.toQuaternionf(0, Math.toRadians(180 - this.location.getYaw()), 0).conjugate();
List<Object> packets = new ArrayList<>();
List<Object> minimizedPackets = new ArrayList<>();

View File

@@ -56,6 +56,7 @@ public class BukkitPackManager extends AbstractPackManager implements Listener {
public void onPlayerJoin(PlayerJoinEvent event) {
if (Config.sendPackOnJoin() && !VersionHelper.isOrAbove1_20_2()) {
Player player = BukkitAdaptors.adapt(event.getPlayer());
// 可能有假人
if (player == null) return;
this.sendResourcePack(player);
}

View File

@@ -35,8 +35,6 @@ import net.momirealms.craftengine.core.plugin.compatibility.CompatibilityManager
import net.momirealms.craftengine.core.plugin.config.Config;
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.locale.TranslationManagerImpl;
import net.momirealms.craftengine.core.plugin.logger.JavaPluginLogger;
import net.momirealms.craftengine.core.plugin.logger.PluginLogger;
import net.momirealms.craftengine.core.plugin.scheduler.SchedulerAdapter;
@@ -56,7 +54,6 @@ import org.jspecify.annotations.Nullable;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.Objects;
@@ -104,17 +101,13 @@ public class BukkitCraftEngine extends CraftEngine {
this.javaPlugin = javaPlugin;
}
protected void setUpConfigAndLocale() {
this.config = new Config(this);
this.config.updateConfigCache();
// 先读取语言后,再重载语言文件系统
this.config.loadForcedLocale();
this.translationManager = new TranslationManagerImpl(this);
this.translationManager.reload();
// 最后才加载完整的config配置
this.config.loadFullSettings();
@Override
public void setUpConfigAndLocale() {
super.setUpConfigAndLocale();
super.packManager = new BukkitPackManager(this);
}
// 这个方法应该尽早被执行最好是boostrap阶段
public void injectRegistries() {
if (super.blockManager != null) return;
try {
@@ -143,9 +136,11 @@ public class BukkitCraftEngine extends CraftEngine {
@Override
public void onPluginLoad() {
// 普通bukkit插件会到这里才注册自定义方块
if (super.blockManager == null) {
this.injectRegistries();
}
// 注入一些新的类型,但是并不需要太早
try {
WorldStorageInjector.init();
} catch (Exception e) {
@@ -161,12 +156,44 @@ public class BukkitCraftEngine extends CraftEngine {
} catch (Exception e) {
throw new InjectionException("Error initializing ProtectedFieldVisitor", e);
}
// 初始化一些注册表
super.onPluginLoad();
super.networkManager = new BukkitNetworkManager(this);
super.blockManager.init();
super.itemManager = new BukkitItemManager(this);
this.successfullyLoaded = true;
BukkitBlockBehaviors.init();
BukkitItemBehaviors.init();
BukkitHitBoxTypes.init();
BukkitBlockEntityElementConfigs.init();
// 初始化 onload 阶段的兼容性
super.compatibilityManager().onLoad();
// 创建网络管理器
super.networkManager = new BukkitNetworkManager(this);
// 初始化方块管理器,获取镜像注册表,初始化网络映射
super.blockManager.init();
// 初始化物品管理器
super.itemManager = new BukkitItemManager(this);
// 初始化配方管理器
super.recipeManager = new BukkitRecipeManager(this);
// 初始化GUI管理器
super.guiManager = new BukkitGuiManager(this);
// 初始化世界管理器
super.worldManager = new BukkitWorldManager(this);
// 初始化声音管理器
super.soundManager = new BukkitSoundManager(this);
// 初始化战利品管理器
super.vanillaLootManager = new BukkitVanillaLootManager(this);
// 初始化字体管理器
super.fontManager = new BukkitFontManager(this);
// 初始化进度管理器
super.advancementManager = new BukkitAdvancementManager(this);
// 初始化弹射物管理器
super.projectileManager = new BukkitProjectileManager(this);
// 初始化座椅管理器
super.seatManager = new BukkitSeatManager(this);
// 初始化家具管理器
super.furnitureManager = new BukkitFurnitureManager(this);
// 注册默认的parser
this.registerDefaultParsers();
// 完成加载
this.successfullyLoaded = true;
}
@Override
@@ -203,24 +230,10 @@ public class BukkitCraftEngine extends CraftEngine {
Bukkit.getServer().shutdown();
return;
}
BukkitBlockBehaviors.init();
BukkitItemBehaviors.init();
BukkitHitBoxTypes.init();
BukkitBlockEntityElementConfigs.init();
super.packManager = new BukkitPackManager(this);
// 初始化指令发送者工厂
super.senderFactory = new BukkitSenderFactory(this);
super.recipeManager = new BukkitRecipeManager(this);
// 初始化指令管理器
super.commandManager = new BukkitCommandManager(this);
super.itemBrowserManager = new ItemBrowserManagerImpl(this);
super.guiManager = new BukkitGuiManager(this);
super.worldManager = new BukkitWorldManager(this);
super.soundManager = new BukkitSoundManager(this);
super.vanillaLootManager = new BukkitVanillaLootManager(this);
super.fontManager = new BukkitFontManager(this);
super.advancementManager = new BukkitAdvancementManager(this);
super.projectileManager = new BukkitProjectileManager(this);
super.furnitureManager = new BukkitFurnitureManager(this);
super.seatManager = new BukkitSeatManager(this);
super.onPluginEnable();
super.compatibilityManager().onEnable();
}

View File

@@ -49,6 +49,7 @@ public class BukkitWorldManager implements WorldManager, Listener {
this.plugin = plugin;
this.worlds = ConcurrentUUID2ReferenceChainedHashTable.createWithCapacity(10, 0.5f);
this.storageAdaptor = new DefaultStorageAdaptor();
// fixme 初始化
for (World world : Bukkit.getWorlds()) {
this.worlds.put(world.getUID(), new BukkitCEWorld(new BukkitWorld(world), this.storageAdaptor));
}