diff --git a/bukkit/compatibility/build.gradle.kts b/bukkit/compatibility/build.gradle.kts index e995978d5..957f7f6b1 100644 --- a/bukkit/compatibility/build.gradle.kts +++ b/bukkit/compatibility/build.gradle.kts @@ -11,6 +11,9 @@ repositories { maven("https://nexus.phoenixdevt.fr/repository/maven-public/") // mmoitems maven("https://repo.viaversion.com") // via maven("https://repo.skriptlang.org/releases/") // skript + maven("https://nexus.neetgames.com/repository/maven-releases/") // mcmmo + maven("https://repo.dmulloy2.net/repository/public/") // mcmmo required + maven("https://repo.auxilor.io/repository/maven-public/") // eco } dependencies { @@ -49,6 +52,21 @@ dependencies { compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Bukkit") { isTransitive = false } // MythicMobs compileOnly("io.lumine:Mythic-Dist:5.9.0") + // McMMO + compileOnly("com.gmail.nossr50.mcMMO:mcMMO:2.2.038") + // MMOCore + compileOnly("net.Indyuce:MMOCore-API:1.12.1-SNAPSHOT") + // JobsReborn + compileOnly("com.github.Zrips:Jobs:v5.2.2.3") + // CustomFishing + compileOnly("net.momirealms:custom-fishing:2.3.3") + // eco + compileOnly("com.willfp:eco:6.70.1") + compileOnly("com.willfp:EcoJobs:3.56.1") + compileOnly("com.willfp:EcoSkills:3.46.1") + compileOnly("com.willfp:libreforge:4.58.1") + // AureliumSkills + compileOnly("com.github.Archy-X:AureliumSkills:Beta1.3.21") } java { diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java index 049efa25f..518dca60b 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java @@ -1,14 +1,15 @@ package net.momirealms.craftengine.bukkit.compatibility; import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; -import net.momirealms.craftengine.bukkit.compatibility.bettermodel.BetterModelModel; +import net.momirealms.craftengine.bukkit.compatibility.model.bettermodel.BetterModelModel; +import net.momirealms.craftengine.bukkit.compatibility.item.CustomFishingProvider; import net.momirealms.craftengine.bukkit.compatibility.item.MMOItemsProvider; import net.momirealms.craftengine.bukkit.compatibility.item.MythicMobsProvider; import net.momirealms.craftengine.bukkit.compatibility.item.NeigeItemsProvider; import net.momirealms.craftengine.bukkit.compatibility.legacy.slimeworld.LegacySlimeFormatStorageAdaptor; -import net.momirealms.craftengine.bukkit.compatibility.leveler.AuraSkillsLevelerProvider; -import net.momirealms.craftengine.bukkit.compatibility.modelengine.ModelEngineModel; -import net.momirealms.craftengine.bukkit.compatibility.modelengine.ModelEngineUtils; +import net.momirealms.craftengine.bukkit.compatibility.leveler.*; +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.MythicMobsListener; import net.momirealms.craftengine.bukkit.compatibility.papi.PlaceholderAPIUtils; import net.momirealms.craftengine.bukkit.compatibility.permission.LuckPermsEventListeners; @@ -30,10 +31,7 @@ import net.momirealms.craftengine.core.world.WorldManager; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; +import java.util.*; public class BukkitCompatibilityManager implements CompatibilityManager { private final BukkitCraftEngine plugin; @@ -108,6 +106,29 @@ public class BukkitCompatibilityManager implements CompatibilityManager { this.registerLevelerProvider("AuraSkills", new AuraSkillsLevelerProvider()); logHook("AuraSkills"); } + if (this.isPluginEnabled("AureliumSkills")) { + this.registerLevelerProvider("AureliumSkills", new AureliumSkillsLevelerProvider()); + } + if (this.isPluginEnabled("McMMO")) { + this.registerLevelerProvider("McMMO", new McMMOLevelerProvider()); + logHook("McMMO"); + } + if (this.isPluginEnabled("MMOCore")) { + this.registerLevelerProvider("MMOCore", new MMOCoreLevelerProvider()); + logHook("MMOCore"); + } + if (this.isPluginEnabled("Jobs")) { + registerLevelerProvider("Jobs", new JobsRebornLevelerProvider()); + logHook("Jobs"); + } + if (this.isPluginEnabled("EcoSkills")) { + registerLevelerProvider("EcoSkills", new EcoSkillsLevelerProvider()); + logHook("EcoSkills"); + } + if (this.isPluginEnabled("EcoJobs")) { + registerLevelerProvider("EcoJobs", new EcoJobsLevelerProvider()); + logHook("EcoJobs"); + } if (this.isPluginEnabled("MythicMobs")) { BukkitItemManager.instance().registerExternalItemProvider(new MythicMobsProvider()); new MythicMobsListener(this.plugin); @@ -189,7 +210,17 @@ public class BukkitCompatibilityManager implements CompatibilityManager { Plugin fastAsyncWorldEdit = Bukkit.getPluginManager().getPlugin("FastAsyncWorldEdit"); String version = VersionHelper.isPaper() ? fastAsyncWorldEdit.getPluginMeta().getVersion() : fastAsyncWorldEdit.getDescription().getVersion(); if (!this.fastAsyncWorldEditVersionCheck(version)) { - this.plugin.logger().warn("[Compatibility] Please update FastAsyncWorldEdit to 2.13.0 or newer for better compatibility"); + this.plugin.logger().severe(""); + this.plugin.logger().severe(""); + if (Locale.getDefault() == Locale.SIMPLIFIED_CHINESE) { + this.plugin.logger().severe("[Compatibility] 插件需要更新 FastAsyncWorldEdit 到 2.13.0 或更高版本,以获得更好的兼容性。(当前版本: " + version + ")"); + this.plugin.logger().severe("[Compatibility] 请前往 https://ci.athion.net/job/FastAsyncWorldEdit/ 下载最新版本"); + } else { + this.plugin.logger().severe("[Compatibility] Please update FastAsyncWorldEdit to 2.13.0 or newer for better compatibility. (Current version: " + version + ")"); + this.plugin.logger().severe("[Compatibility] Please go to https://ci.athion.net/job/FastAsyncWorldEdit/ to download the latest version"); + } + this.plugin.logger().severe(""); + this.plugin.logger().severe(""); } new WorldEditBlockRegister(BukkitBlockManager.instance(), true); } @@ -223,6 +254,10 @@ public class BukkitCompatibilityManager implements CompatibilityManager { itemManager.registerExternalItemProvider(new MMOItemsProvider()); logHook("MMOItems"); } + if (this.isPluginEnabled("CustomFishing")) { + itemManager.registerExternalItemProvider(new CustomFishingProvider()); + logHook("CustomFishing"); + } } private Plugin getPlugin(String name) { diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/CustomFishingProvider.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/CustomFishingProvider.java new file mode 100644 index 000000000..e32e03631 --- /dev/null +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/CustomFishingProvider.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.bukkit.compatibility.item; + +import net.momirealms.craftengine.core.item.ExternalItemProvider; +import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; +import net.momirealms.customfishing.api.mechanic.context.Context; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.Nullable; + +public class CustomFishingProvider implements ExternalItemProvider { + @Override + public String plugin() { + return "CustomFishing"; + } + + @Nullable + @Override + public ItemStack build(String id, ItemBuildContext context) { + return BukkitCustomFishingPlugin.getInstance().getItemManager() + .buildInternal(Context.player(((Player) context.player().platformPlayer())), id); + } +} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/AureliumSkillsLevelerProvider.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/AureliumSkillsLevelerProvider.java new file mode 100644 index 000000000..db609f775 --- /dev/null +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/AureliumSkillsLevelerProvider.java @@ -0,0 +1,27 @@ +package net.momirealms.craftengine.bukkit.compatibility.leveler; + +import com.archyx.aureliumskills.api.AureliumAPI; +import com.archyx.aureliumskills.leveler.Leveler; +import com.archyx.aureliumskills.skills.SkillRegistry; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.compatibility.LevelerProvider; + +public class AureliumSkillsLevelerProvider implements LevelerProvider { + private final Leveler leveler; + private final SkillRegistry skillRegistry; + + public AureliumSkillsLevelerProvider() { + this.leveler = AureliumAPI.getPlugin().getLeveler(); + this.skillRegistry = AureliumAPI.getPlugin().getSkillRegistry(); + } + + @Override + public void addExp(Player player, String target, double amount) { + this.leveler.addXp(((org.bukkit.entity.Player) player.platformPlayer()), this.skillRegistry.getSkill(target), amount); + } + + @Override + public int getLevel(Player player, String target) { + return AureliumAPI.getSkillLevel(((org.bukkit.entity.Player) player.platformPlayer()), this.skillRegistry.getSkill(target)); + } +} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/EcoJobsLevelerProvider.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/EcoJobsLevelerProvider.java new file mode 100644 index 000000000..37bfca61b --- /dev/null +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/EcoJobsLevelerProvider.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.bukkit.compatibility.leveler; + +import com.willfp.ecojobs.api.EcoJobsAPI; +import com.willfp.ecojobs.jobs.Job; +import com.willfp.ecojobs.jobs.Jobs; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.compatibility.LevelerProvider; + +public class EcoJobsLevelerProvider implements LevelerProvider { + + @Override + public void addExp(Player player, String target, double amount) { + org.bukkit.entity.Player bukkitPlayer = (org.bukkit.entity.Player) player.platformPlayer(); + for (Job job : EcoJobsAPI.getActiveJobs(bukkitPlayer)) { + if (job.getId().equals(target)) { + EcoJobsAPI.giveJobExperience(bukkitPlayer, job, amount); + return; + } + } + } + + @Override + public int getLevel(Player player, String target) { + Job job = Jobs.getByID(target); + if (job == null) return 0; + return EcoJobsAPI.getJobLevel(((org.bukkit.entity.Player) player.platformPlayer()), job); + } +} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/EcoSkillsLevelerProvider.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/EcoSkillsLevelerProvider.java new file mode 100644 index 000000000..c22e33bef --- /dev/null +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/EcoSkillsLevelerProvider.java @@ -0,0 +1,21 @@ +package net.momirealms.craftengine.bukkit.compatibility.leveler; + +import com.willfp.ecoskills.api.EcoSkillsAPI; +import com.willfp.ecoskills.skills.Skills; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.compatibility.LevelerProvider; + +import java.util.Objects; + +public class EcoSkillsLevelerProvider implements LevelerProvider { + + @Override + public void addExp(Player player, String target, double amount) { + EcoSkillsAPI.gainSkillXP(((org.bukkit.entity.Player) player.platformPlayer()), Objects.requireNonNull(Skills.INSTANCE.getByID(target)), amount); + } + + @Override + public int getLevel(Player player, String target) { + return EcoSkillsAPI.getSkillLevel(((org.bukkit.entity.Player) player.platformPlayer()), Objects.requireNonNull(Skills.INSTANCE.getByID(target))); + } +} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/JobsRebornLevelerProvider.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/JobsRebornLevelerProvider.java new file mode 100644 index 000000000..47cc9fd5a --- /dev/null +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/JobsRebornLevelerProvider.java @@ -0,0 +1,30 @@ +package net.momirealms.craftengine.bukkit.compatibility.leveler; + +import com.gamingmesh.jobs.Jobs; +import com.gamingmesh.jobs.container.Job; +import com.gamingmesh.jobs.container.JobProgression; +import com.gamingmesh.jobs.container.JobsPlayer; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.compatibility.LevelerProvider; + +public class JobsRebornLevelerProvider implements LevelerProvider { + + @Override + public void addExp(Player player, String target, double amount) { + JobsPlayer jobsPlayer = Jobs.getPlayerManager().getJobsPlayer(player.uuid()); + Job job = Jobs.getJob(target); + if (jobsPlayer != null && jobsPlayer.isInJob(job)) { + Jobs.getPlayerManager().addExperience(jobsPlayer, job, amount); + } + } + + @Override + public int getLevel(Player player, String target) { + JobsPlayer jobsPlayer = Jobs.getPlayerManager().getJobsPlayer(player.uuid()); + if (jobsPlayer != null) { + JobProgression jobProgression = jobsPlayer.getJobProgression(Jobs.getJob(target)); + return jobProgression.getLevel(); + } + return 0; + } +} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/MMOCoreLevelerProvider.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/MMOCoreLevelerProvider.java new file mode 100644 index 000000000..e7134e6ca --- /dev/null +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/MMOCoreLevelerProvider.java @@ -0,0 +1,20 @@ +package net.momirealms.craftengine.bukkit.compatibility.leveler; + +import net.Indyuce.mmocore.MMOCore; +import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.experience.EXPSource; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.compatibility.LevelerProvider; + +public class MMOCoreLevelerProvider implements LevelerProvider { + + @Override + public void addExp(Player player, String target, double amount) { + MMOCore.plugin.professionManager.get(target).giveExperience(PlayerData.get(player.uuid()), amount, null , EXPSource.OTHER); + } + + @Override + public int getLevel(Player player, String target) { + return PlayerData.get(player.uuid()).getCollectionSkills().getLevel(MMOCore.plugin.professionManager.get(target)); + } +} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/McMMOLevelerProvider.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/McMMOLevelerProvider.java new file mode 100644 index 000000000..492eb9949 --- /dev/null +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/McMMOLevelerProvider.java @@ -0,0 +1,19 @@ +package net.momirealms.craftengine.bukkit.compatibility.leveler; + +import com.gmail.nossr50.api.ExperienceAPI; +import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.compatibility.LevelerProvider; + +public class McMMOLevelerProvider implements LevelerProvider { + + @Override + public void addExp(Player player, String target, double amount) { + ExperienceAPI.addRawXP((org.bukkit.entity.Player) player.platformPlayer(), target, (float) amount, "UNKNOWN"); + } + + @Override + public int getLevel(Player player, String target) { + return ExperienceAPI.getLevel((org.bukkit.entity.Player) player.platformPlayer(), PrimarySkillType.valueOf(target)); + } +} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/bettermodel/BetterModelModel.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/model/bettermodel/BetterModelModel.java similarity index 88% rename from bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/bettermodel/BetterModelModel.java rename to bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/model/bettermodel/BetterModelModel.java index 5dfa9c816..bfda089ba 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/bettermodel/BetterModelModel.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/model/bettermodel/BetterModelModel.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.bukkit.compatibility.bettermodel; +package net.momirealms.craftengine.bukkit.compatibility.model.bettermodel; import net.momirealms.craftengine.core.entity.AbstractEntity; import net.momirealms.craftengine.core.entity.furniture.AbstractExternalModel; diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/bettermodel/BetterModelUtils.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/model/bettermodel/BetterModelUtils.java similarity index 86% rename from bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/bettermodel/BetterModelUtils.java rename to bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/model/bettermodel/BetterModelUtils.java index 93696e7f5..eb103dc80 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/bettermodel/BetterModelUtils.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/model/bettermodel/BetterModelUtils.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.bukkit.compatibility.bettermodel; +package net.momirealms.craftengine.bukkit.compatibility.model.bettermodel; import kr.toxicity.model.api.BetterModel; import kr.toxicity.model.api.data.renderer.BlueprintRenderer; diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/modelengine/ModelEngineModel.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/model/modelengine/ModelEngineModel.java similarity index 88% rename from bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/modelengine/ModelEngineModel.java rename to bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/model/modelengine/ModelEngineModel.java index 8ce03f0d6..a4d35dc4e 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/modelengine/ModelEngineModel.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/model/modelengine/ModelEngineModel.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.bukkit.compatibility.modelengine; +package net.momirealms.craftengine.bukkit.compatibility.model.modelengine; import net.momirealms.craftengine.core.entity.AbstractEntity; import net.momirealms.craftengine.core.entity.furniture.AbstractExternalModel; diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/modelengine/ModelEngineUtils.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/model/modelengine/ModelEngineUtils.java similarity index 92% rename from bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/modelengine/ModelEngineUtils.java rename to bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/model/modelengine/ModelEngineUtils.java index a2f952689..b32074691 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/modelengine/ModelEngineUtils.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/model/modelengine/ModelEngineUtils.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.bukkit.compatibility.modelengine; +package net.momirealms.craftengine.bukkit.compatibility.model.modelengine; import com.ticxo.modelengine.api.ModelEngineAPI; import com.ticxo.modelengine.api.model.ActiveModel; diff --git a/bukkit/paper-loader/build.gradle.kts b/bukkit/paper-loader/build.gradle.kts index 2ffb47974..48c20fc80 100644 --- a/bukkit/paper-loader/build.gradle.kts +++ b/bukkit/paper-loader/build.gradle.kts @@ -77,14 +77,22 @@ paper { // external models register("ModelEngine") { required = false } register("BetterModel") { required = false } + register("FreeMinecraftModels") { required = false } // external items register("NeigeItems") { required = false } register("MMOItems") { required = false } register("MythicMobs") { required = false } + register("CustomFishing") { required = false } // leveler register("AuraSkills") { required = false } + register("AureliumSkills") { required = false } + register("McMMO") { required = false } + register("MMOCore") { required = false } + register("Jobs") { required = false } + register("EcoSkills") { required = false } + register("EcoJobs") { required = false } // anti grief lib register("Dominion") { required = false } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BukkitBlockBehaviors.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BukkitBlockBehaviors.java index 042c5947b..867914a61 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BukkitBlockBehaviors.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BukkitBlockBehaviors.java @@ -19,6 +19,7 @@ public class BukkitBlockBehaviors extends BlockBehaviors { public static final Key CROP_BLOCK = Key.from("craftengine:crop_block"); public static final Key GRASS_BLOCK = Key.from("craftengine:grass_block"); public static final Key LAMP_BLOCK = Key.from("craftengine:lamp_block"); + public static final Key TRAPDOOR_BLOCK = Key.from("craftengine:trapdoor_block"); public static void init() { register(EMPTY, (block, args) -> EmptyBlockBehavior.INSTANCE); @@ -36,5 +37,6 @@ public class BukkitBlockBehaviors extends BlockBehaviors { register(CROP_BLOCK, CropBlockBehavior.FACTORY); register(GRASS_BLOCK, GrassBlockBehavior.FACTORY); register(LAMP_BLOCK, LampBlockBehavior.FACTORY); + register(TRAPDOOR_BLOCK, TrapDoorBlockBehavior.FACTORY); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/TrapDoorBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/TrapDoorBlockBehavior.java new file mode 100644 index 000000000..86387b3fd --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/TrapDoorBlockBehavior.java @@ -0,0 +1,64 @@ +package net.momirealms.craftengine.bukkit.block.behavior; + +import net.momirealms.craftengine.core.block.BlockBehavior; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.item.context.BlockPlaceContext; +import net.momirealms.craftengine.core.util.Half; +import net.momirealms.craftengine.core.util.HorizontalDirection; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; +import java.util.concurrent.Callable; + +public class TrapDoorBlockBehavior extends WaterLoggedBlockBehavior { + public static final Factory FACTORY = new Factory(); + private final Property halfProperty; + private final Property directionProperty; + private final Property poweredProperty; + private final Property openProperty; + + public TrapDoorBlockBehavior(CustomBlock block, + @Nullable Property waterloggedProperty, + Property halfProperty, + Property directionProperty, + Property poweredProperty, + Property openProperty) { + super(block, waterloggedProperty); + this.halfProperty = halfProperty; + this.directionProperty = directionProperty; + this.poweredProperty = poweredProperty; + this.openProperty = openProperty; + } +// +// @Override +// public ImmutableBlockState updateStateForPlacement(BlockPlaceContext context, ImmutableBlockState state) { +// +// } + + @Override + public void tick(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + + } + + @Override + public void neighborChanged(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + + } + + @SuppressWarnings("unchecked") + public static class Factory implements BlockBehaviorFactory { + @Override + public BlockBehavior create(CustomBlock block, Map arguments) { + Property waterlogged = (Property) block.getProperty("waterlogged"); + Property half = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("half"), "warning.config.block.behavior.trapdoor.missing_half"); + Property direction = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("direction"), "warning.config.block.behavior.trapdoor.missing_direction"); + Property open = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("open"), "warning.config.block.behavior.trapdoor.missing_open"); + Property powered = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("open"), "warning.config.block.behavior.trapdoor.missing_powered"); + return new TrapDoorBlockBehavior(block, waterlogged, half, direction, powered, open); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java index e6b543954..e27aeb338 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java @@ -76,6 +76,9 @@ public final class BlockGenerator { // getSupportShape .method(ElementMatchers.is(CoreReflections.method$BlockBehaviour$getBlockSupportShape)) .intercept(MethodDelegation.to(GetSupportShapeInterceptor.INSTANCE)) + // isPathFindable + .method(ElementMatchers.is(CoreReflections.method$BlockBehaviour$isPathFindable)) + .intercept(MethodDelegation.to(IsPathFindableInterceptor.INSTANCE)) // mirror .method(ElementMatchers.is(CoreReflections.method$BlockBehaviour$mirror)) .intercept(MethodDelegation.to(MirrorInterceptor.INSTANCE)) @@ -254,6 +257,21 @@ public final class BlockGenerator { } } + public static class IsPathFindableInterceptor { + public static final IsPathFindableInterceptor INSTANCE = new IsPathFindableInterceptor(); + + @RuntimeType + public Object intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) throws Exception { + ObjectHolder holder = ((BehaviorHolder) thisObj).getBehaviorHolder(); + try { + return holder.value().isPathFindable(thisObj, args, superMethod); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run isPathFindable", e); + return superMethod.call(); + } + } + } + public static class MirrorInterceptor { public static final MirrorInterceptor INSTANCE = new MirrorInterceptor(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java index bc1d611a1..ef984cf72 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java @@ -1344,6 +1344,38 @@ public final class CoreReflections { ) ); + public static final Class clazz$PathComputationType = requireNonNull( + BukkitReflectionUtils.findReobfOrMojmapClass( + "world.level.pathfinder.PathMode", + "world.level.pathfinder.PathComputationType" + ) + ); + + public static final Method method$PathComputationType$values = requireNonNull( + ReflectionUtils.getStaticMethod(clazz$PathComputationType, clazz$PathComputationType.arrayType()) + ); + + public static final Object instance$PathComputationType$LAND; + public static final Object instance$PathComputationType$WATER; + public static final Object instance$PathComputationType$AIR; + + static { + try { + Object[] objs = (Object[]) method$PathComputationType$values.invoke(null); + instance$PathComputationType$LAND = objs[0]; + instance$PathComputationType$WATER = objs[1]; + instance$PathComputationType$AIR = objs[2]; + } catch (ReflectiveOperationException e) { + throw new ReflectionInitException("Failed to initialize PathComputationType", e); + } + } + + public static final Method method$BlockBehaviour$isPathFindable = requireNonNull( + VersionHelper.isOrAbove1_20_5() ? + ReflectionUtils.getDeclaredMethod(clazz$BlockBehaviour, boolean.class, clazz$BlockState, clazz$PathComputationType) : + ReflectionUtils.getMethod(clazz$BlockBehaviour, boolean.class, clazz$BlockState, clazz$BlockGetter, clazz$BlockPos, clazz$PathComputationType) + ); + public static final Method method$BlockBehaviour$getShape = requireNonNull( ReflectionUtils.getDeclaredMethod(clazz$BlockBehaviour, clazz$VoxelShape, new String[]{"getShape", "a"}, clazz$BlockState, clazz$BlockGetter, CoreReflections.clazz$BlockPos, clazz$CollisionContext) ); diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockBehavior.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockBehavior.java index 97eaa68cd..f4ad8fb6c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/BlockBehavior.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockBehavior.java @@ -49,6 +49,10 @@ public abstract class BlockBehavior { return (boolean) superMethod.call(); } + public boolean isPathFindable(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + return (boolean) superMethod.call(); + } + public void onBrokenAfterFall(Object thisBlock, Object[] args) throws Exception { } diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java index 44194f07a..2538f1fe1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java @@ -16,6 +16,7 @@ public class Properties { public static final Key AXIS = Key.of("craftengine:axis"); public static final Key HORIZONTAL_DIRECTION = Key.of("craftengine:4-direction"); public static final Key DIRECTION = Key.of("craftengine:6-direction"); + public static final Key HALF = Key.of("craftengine:half"); static { register(BOOLEAN, BooleanProperty.FACTORY); @@ -24,6 +25,7 @@ public class Properties { register(AXIS, new EnumProperty.Factory<>(Direction.Axis.class)); register(DIRECTION, new EnumProperty.Factory<>(Direction.class)); register(HORIZONTAL_DIRECTION, new EnumProperty.Factory<>(HorizontalDirection.class)); + register(HALF, new EnumProperty.Factory<>(Half.class)); } public static void register(Key key, PropertyFactory factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureManager.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureManager.java index cab15452d..434d5b273 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureManager.java @@ -88,9 +88,16 @@ public abstract class AbstractFurnitureManager implements FurnitureManager { if (byId.containsKey(id)) { throw new LocalizedResourceConfigException("warning.config.furniture.duplicate"); } - EnumMap placements = new EnumMap<>(AnchorType.class); - Map placementMap = MiscUtils.castToMap(ResourceConfigUtils.requireNonNullOrThrow(section.get("placement"), "warning.config.furniture.missing_placement"), false); + Object placementObj = section.get("placement"); + if (placementObj == null) { + // 防呆 + if (section.containsKey("material")) { + plugin.itemManager().parser().parseSection(pack, path, id, section); + return; + } + } + Map placementMap = MiscUtils.castToMap(ResourceConfigUtils.requireNonNullOrThrow(placementObj, "warning.config.furniture.missing_placement"), false); if (placementMap.isEmpty()) { throw new LocalizedResourceConfigException("warning.config.furniture.missing_placement"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DynamicLoreModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DynamicLoreModifier.java index 01e8d92be..8962c63e0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DynamicLoreModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DynamicLoreModifier.java @@ -9,11 +9,13 @@ import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.sparrow.nbt.CompoundTag; import net.momirealms.sparrow.nbt.Tag; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; public class DynamicLoreModifier implements ItemDataModifier { + public static final String CONTEXT_TAG_KEY = "craftengine:display_context"; private final Map> displayContexts; private final String defaultContext; @@ -22,6 +24,10 @@ public class DynamicLoreModifier implements ItemDataModifier { this.displayContexts = displayContexts; } + public Map> displayContexts() { + return Collections.unmodifiableMap(this.displayContexts); + } + @Override public String name() { return "dynamic-lore"; @@ -29,7 +35,7 @@ public class DynamicLoreModifier implements ItemDataModifier { @Override public Item apply(Item item, ItemBuildContext context) { - String displayContext = Optional.ofNullable(item.getJavaTag("craftengine:display_context")).orElse(this.defaultContext).toString(); + String displayContext = Optional.ofNullable(item.getJavaTag(CONTEXT_TAG_KEY)).orElse(this.defaultContext).toString(); List lore = this.displayContexts.get(displayContext); if (lore == null) { lore = this.displayContexts.get(this.defaultContext); diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Half.java b/core/src/main/java/net/momirealms/craftengine/core/util/Half.java new file mode 100644 index 000000000..6567ea1c5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Half.java @@ -0,0 +1,5 @@ +package net.momirealms.craftengine.core.util; + +public enum Half { + TOP, BOTTOM +}