diff --git a/bukkit/build.gradle.kts b/bukkit/build.gradle.kts index 10489df7f..52a33db12 100644 --- a/bukkit/build.gradle.kts +++ b/bukkit/build.gradle.kts @@ -9,6 +9,7 @@ repositories { maven("https://repo.momirealms.net/releases/") maven("https://libraries.minecraft.net/") maven("https://repo.papermc.io/repository/maven-public/") + maven("https://repo.gtemc.net/releases/") } dependencies { @@ -62,6 +63,8 @@ dependencies { compileOnly("com.mojang:authlib:${rootProject.properties["authlib_version"]}") // concurrentutil compileOnly("ca.spottedleaf:concurrentutil:${rootProject.properties["concurrent_util_version"]}") + // ItemBridge + compileOnly("cn.gtemc:itembridge:${rootProject.properties["itembridge_version"]}") } java { @@ -90,6 +93,7 @@ tasks { 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("cn.gtemc.itembridge", "net.momirealms.craftengine.libraries.itembridge") relocate("org.incendo", "net.momirealms.craftengine.libraries") relocate("dev.dejvokep", "net.momirealms.craftengine.libraries") relocate("org.bstats", "net.momirealms.craftengine.libraries.bstats") diff --git a/bukkit/compatibility/build.gradle.kts b/bukkit/compatibility/build.gradle.kts index 0919122ee..e0f9a3b33 100644 --- a/bukkit/compatibility/build.gradle.kts +++ b/bukkit/compatibility/build.gradle.kts @@ -19,6 +19,7 @@ repositories { maven("https://repo.codemc.io/repository/maven-public/") // quickshop maven("https://repo.nexomc.com/releases/") // nexo maven("https://repo.opencollab.dev/main/") // geyser + maven("https://repo.gtemc.net/releases/") } dependencies { @@ -96,6 +97,8 @@ dependencies { compileOnly("org.geysermc.geyser:api:2.9.0-SNAPSHOT") // Floodgate compileOnly("org.geysermc.floodgate:api:2.2.4-SNAPSHOT") + // ItemBridge + compileOnly("cn.gtemc:itembridge:${rootProject.properties["itembridge_version"]}") } 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 78fc7c7cf..2b165aeb2 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 @@ -5,7 +5,6 @@ import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.block.entity.renderer.element.BukkitBlockEntityElementConfigs; import net.momirealms.craftengine.bukkit.compatibility.bedrock.FloodgateUtils; import net.momirealms.craftengine.bukkit.compatibility.bedrock.GeyserUtils; -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; @@ -26,7 +25,6 @@ import net.momirealms.craftengine.bukkit.compatibility.tag.CustomNameplateProvid import net.momirealms.craftengine.bukkit.compatibility.viaversion.ViaVersionUtils; import net.momirealms.craftengine.bukkit.compatibility.worldedit.WorldEditBlockRegister; import net.momirealms.craftengine.bukkit.font.BukkitFontManager; -import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.core.block.BlockManager; import net.momirealms.craftengine.core.entity.furniture.ExternalModel; @@ -130,7 +128,6 @@ public class BukkitCompatibilityManager implements CompatibilityManager { this.hasPlaceholderAPI = true; logHook("PlaceholderAPI"); } - this.initItemHooks(); if (this.isPluginEnabled("LuckPerms")) { this.initLuckPermsHook(); logHook("LuckPerms"); @@ -167,7 +164,6 @@ public class BukkitCompatibilityManager implements CompatibilityManager { logHook("EcoJobs"); } if (this.isPluginEnabled("MythicMobs")) { - BukkitItemManager.instance().registerExternalItemSource(new MythicMobsSource()); new MythicItemDropListener(this.plugin); logHook("MythicMobs"); } @@ -224,7 +220,7 @@ public class BukkitCompatibilityManager implements CompatibilityManager { private void initLuckPermsHook() { new LuckPermsEventListeners(plugin.javaPlugin(), (uuid) -> { - BukkitFontManager fontManager = (BukkitFontManager) plugin.fontManager(); + BukkitFontManager fontManager = plugin.fontManager(); fontManager.refreshEmojiSuggestions(uuid); }); } @@ -297,42 +293,6 @@ public class BukkitCompatibilityManager implements CompatibilityManager { } } - private void initItemHooks() { - BukkitItemManager itemManager = BukkitItemManager.instance(); - if (this.isPluginEnabled("NeigeItems")) { - itemManager.registerExternalItemSource(new NeigeItemsSource()); - logHook("NeigeItems"); - } - if (this.isPluginEnabled("MMOItems")) { - itemManager.registerExternalItemSource(new MMOItemsSource()); - logHook("MMOItems"); - } - if (this.isPluginEnabled("CustomFishing")) { - itemManager.registerExternalItemSource(new CustomFishingSource()); - logHook("CustomFishing"); - } - if (this.isPluginEnabled("Zaphkiel")) { - itemManager.registerExternalItemSource(new ZaphkielSource()); - logHook("Zaphkiel"); - } - if (this.isPluginEnabled("HeadDatabase")) { - itemManager.registerExternalItemSource(new HeadDatabaseSource()); - logHook("HeadDatabase"); - } - if (this.isPluginEnabled("SX-Item")) { - itemManager.registerExternalItemSource(new SXItemSource()); - logHook("SX-Item"); - } - if (this.isPluginEnabled("Slimefun")) { - itemManager.registerExternalItemSource(new SlimefunSource()); - logHook("Slimefun"); - } - if (this.isPluginEnabled("Nexo")) { - itemManager.registerExternalItemSource(new NexoItemSource()); - logHook("Nexo"); - } - } - private Plugin getPlugin(String name) { return Bukkit.getPluginManager().getPlugin(name); } diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/CustomFishingSource.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/CustomFishingSource.java deleted file mode 100644 index e4e28368d..000000000 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/CustomFishingSource.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.momirealms.craftengine.bukkit.compatibility.item; - -import net.momirealms.craftengine.core.item.ExternalItemSource; -import net.momirealms.craftengine.core.item.ItemBuildContext; -import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; -import net.momirealms.customfishing.api.mechanic.context.Context; -import net.momirealms.customfishing.api.mechanic.context.ContextKeys; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.Nullable; - -import java.util.Optional; - -public class CustomFishingSource implements ExternalItemSource { - @Override - public String plugin() { - return "customfishing"; - } - - @SuppressWarnings("UnstableApiUsage") - @Nullable - @Override - public ItemStack build(String id, ItemBuildContext context) { - Context ctx = Context.player( - (Player) Optional.ofNullable(context.player()) - .map(net.momirealms.craftengine.core.entity.player.Player::platformPlayer) - .orElse(null) - ); - return BukkitCustomFishingPlugin.getInstance().getItemManager().buildInternal(ctx.arg(ContextKeys.ID, id), id); - } - - @Override - public String id(ItemStack item) { - return BukkitCustomFishingPlugin.getInstance().getItemManager().getCustomFishingItemID(item); - } -} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/HeadDatabaseSource.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/HeadDatabaseSource.java deleted file mode 100644 index 90f8763aa..000000000 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/HeadDatabaseSource.java +++ /dev/null @@ -1,33 +0,0 @@ -package net.momirealms.craftengine.bukkit.compatibility.item; - -import me.arcaniax.hdb.api.HeadDatabaseAPI; -import net.momirealms.craftengine.core.item.ExternalItemSource; -import net.momirealms.craftengine.core.item.ItemBuildContext; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.Nullable; - -public class HeadDatabaseSource implements ExternalItemSource { - private HeadDatabaseAPI api; - - @Override - public String plugin() { - return "headdatabase"; - } - - @Nullable - @Override - public ItemStack build(String id, ItemBuildContext context) { - if (api == null) { - api = new HeadDatabaseAPI(); - } - return api.getItemHead(id); - } - - @Override - public String id(ItemStack item) { - if (api == null) { - api = new HeadDatabaseAPI(); - } - return api.getItemID(item); - } -} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MMOItemsSource.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MMOItemsSource.java deleted file mode 100644 index 68f5831af..000000000 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MMOItemsSource.java +++ /dev/null @@ -1,38 +0,0 @@ -package net.momirealms.craftengine.bukkit.compatibility.item; - -import net.Indyuce.mmoitems.MMOItems; -import net.Indyuce.mmoitems.api.Type; -import net.Indyuce.mmoitems.api.item.mmoitem.MMOItem; -import net.momirealms.craftengine.core.item.ExternalItemSource; -import net.momirealms.craftengine.core.item.ItemBuildContext; -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.Nullable; - -import static java.util.Objects.requireNonNull; - -public class MMOItemsSource implements ExternalItemSource { - - @Override - public String plugin() { - return "mmoitems"; - } - - @Override - public @Nullable ItemStack build(String id, ItemBuildContext context) { - String[] split = id.split(":", 2); - if (split.length == 1) { - split = split[0].split("_", 2); - } - if (split.length == 1) return new ItemStack(Material.AIR); - // 这里与使用和mmoitems相同的转换id方法 - String mmoItemId = split[1].toUpperCase().replace("-", "_").replace(" ", "_"); - MMOItem mmoItem = MMOItems.plugin.getMMOItem(Type.get(split[0]), mmoItemId); - return mmoItem == null ? new ItemStack(Material.AIR) : requireNonNull(mmoItem.newBuilder().build()); - } - - @Override - public String id(ItemStack item) { - return MMOItems.getType(item) + "_" + MMOItems.getID(item); - } -} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MythicMobsSource.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MythicMobsSource.java deleted file mode 100644 index 8eb9e7d9c..000000000 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MythicMobsSource.java +++ /dev/null @@ -1,51 +0,0 @@ -package net.momirealms.craftengine.bukkit.compatibility.item; - -import io.lumine.mythic.api.adapters.AbstractPlayer; -import io.lumine.mythic.api.skills.SkillCaster; -import io.lumine.mythic.bukkit.BukkitAdapter; -import io.lumine.mythic.bukkit.MythicBukkit; -import io.lumine.mythic.core.drops.DropMetadataImpl; -import net.momirealms.craftengine.core.item.ExternalItemSource; -import net.momirealms.craftengine.core.item.ItemBuildContext; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.Nullable; - -import java.util.Optional; - -public class MythicMobsSource implements ExternalItemSource { - private MythicBukkit mythicBukkit; - - @Override - public String plugin() { - return "mythicmobs"; - } - - @Nullable - @Override - public ItemStack build(String id, ItemBuildContext context) { - if (mythicBukkit == null || mythicBukkit.isClosed()) { - this.mythicBukkit = MythicBukkit.inst(); - } - return Optional.ofNullable(context.player()) - .map(p -> (Player) p.platformPlayer()) - .map(p -> { - AbstractPlayer target = BukkitAdapter.adapt(p); - SkillCaster caster = mythicBukkit.getSkillManager().getCaster(target); - DropMetadataImpl meta = new DropMetadataImpl(caster, target); - return mythicBukkit.getItemManager().getItem(id) - .map(i -> i.generateItemStack(meta, 1)) - .map(BukkitAdapter::adapt) - .orElse(null); - }) - .orElseGet(() -> mythicBukkit.getItemManager().getItemStack(id)); - } - - @Override - public String id(ItemStack item) { - if (mythicBukkit == null || mythicBukkit.isClosed()) { - this.mythicBukkit = MythicBukkit.inst(); - } - return mythicBukkit.getItemManager().getMythicTypeFromItem(item); - } -} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/NeigeItemsSource.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/NeigeItemsSource.java deleted file mode 100644 index 5631f1dc9..000000000 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/NeigeItemsSource.java +++ /dev/null @@ -1,27 +0,0 @@ -package net.momirealms.craftengine.bukkit.compatibility.item; - -import net.momirealms.craftengine.core.item.ExternalItemSource; -import net.momirealms.craftengine.core.item.ItemBuildContext; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import pers.neige.neigeitems.manager.ItemManager; - -import java.util.Optional; - -public class NeigeItemsSource implements ExternalItemSource { - - @Override - public String plugin() { - return "neigeitems"; - } - - @Override - public ItemStack build(String id, ItemBuildContext context) { - return ItemManager.INSTANCE.getItemStack(id, Optional.ofNullable(context.player()).map(it -> (Player) it.platformPlayer()).orElse(null)); - } - - @Override - public String id(ItemStack item) { - return ItemManager.INSTANCE.getItemId(item); - } -} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/NexoItemSource.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/NexoItemSource.java deleted file mode 100644 index fbe3452e9..000000000 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/NexoItemSource.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.momirealms.craftengine.bukkit.compatibility.item; - -import com.nexomc.nexo.api.NexoItems; -import com.nexomc.nexo.items.ItemBuilder; -import net.momirealms.craftengine.core.item.ExternalItemSource; -import net.momirealms.craftengine.core.item.ItemBuildContext; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.Nullable; - -public class NexoItemSource implements ExternalItemSource { - - @Override - public String plugin() { - return "nexo"; - } - - @Nullable - @Override - public ItemStack build(String id, ItemBuildContext context) { - ItemBuilder itemBuilder = NexoItems.itemFromId(id); - if (itemBuilder == null) return null; - return itemBuilder.build(); - } - - @Override - public String id(ItemStack item) { - return NexoItems.idFromItem(item); - } -} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/SXItemSource.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/SXItemSource.java deleted file mode 100644 index 93d820fd0..000000000 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/SXItemSource.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.momirealms.craftengine.bukkit.compatibility.item; - -import github.saukiya.sxitem.SXItem; -import net.momirealms.craftengine.core.item.ExternalItemSource; -import net.momirealms.craftengine.core.item.ItemBuildContext; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.Nullable; - -import java.util.Optional; - -public class SXItemSource implements ExternalItemSource { - - @Override - public String plugin() { - return "sx-item"; - } - - @Nullable - @Override - public ItemStack build(String id, ItemBuildContext context) { - return SXItem.getItemManager().getItem(id, Optional.ofNullable(context.player()).map(p -> (Player) p.platformPlayer()).orElse(null)); - } - - @Override - public String id(ItemStack item) { - return SXItem.getItemManager().getItemKey(item); - } -} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/SlimefunSource.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/SlimefunSource.java deleted file mode 100644 index d9c73986e..000000000 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/SlimefunSource.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.momirealms.craftengine.bukkit.compatibility.item; - -import io.github.thebusybiscuit.slimefun4.api.items.SlimefunItem; -import net.momirealms.craftengine.core.item.ExternalItemSource; -import net.momirealms.craftengine.core.item.ItemBuildContext; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.Nullable; - -import java.util.Optional; - -public class SlimefunSource implements ExternalItemSource { - - @Override - public String plugin() { - return "slimefun"; - } - - @Nullable - @Override - public ItemStack build(String id, ItemBuildContext context) { - return Optional.ofNullable(SlimefunItem.getById(id)).map(SlimefunItem::getItem).orElse(null); - } - - @Override - public String id(ItemStack item) { - return Optional.ofNullable(SlimefunItem.getByItem(item)).map(SlimefunItem::getId).orElse(null); - } -} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/ZaphkielSource.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/ZaphkielSource.java deleted file mode 100644 index 3c9329b11..000000000 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/ZaphkielSource.java +++ /dev/null @@ -1,33 +0,0 @@ -package net.momirealms.craftengine.bukkit.compatibility.item; - -import ink.ptms.zaphkiel.Zaphkiel; -import net.momirealms.craftengine.core.item.ExternalItemSource; -import net.momirealms.craftengine.core.item.ItemBuildContext; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -import javax.annotation.Nullable; -import java.util.Optional; - -/** - * @author iiabc - * @since 2025/8/30 09:39 - */ -public class ZaphkielSource implements ExternalItemSource { - - @Override - public String plugin() { - return "zaphkiel"; - } - - @Override - public @Nullable ItemStack build(String id, ItemBuildContext context) { - Player player = Optional.ofNullable(context.player()).map(it -> (Player) it.platformPlayer()).orElse(null); - return Zaphkiel.INSTANCE.api().getItemManager().generateItemStack(id, player); - } - - @Override - public String id(ItemStack item) { - return Zaphkiel.INSTANCE.api().getItemHandler().getItemId(item); - } -} diff --git a/bukkit/loader/build.gradle.kts b/bukkit/loader/build.gradle.kts index b8d526844..bb27e4c13 100644 --- a/bukkit/loader/build.gradle.kts +++ b/bukkit/loader/build.gradle.kts @@ -7,6 +7,7 @@ repositories { maven("https://jitpack.io/") maven("https://repo.papermc.io/repository/maven-public/") maven("https://repo.momirealms.net/releases/") + maven("https://repo.gtemc.net/releases/") mavenCentral() } @@ -27,6 +28,7 @@ dependencies { 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:${rootProject.properties["nms_helper_version"]}") + implementation("cn.gtemc:itembridge:${rootProject.properties["itembridge_version"]}") } java { @@ -66,6 +68,7 @@ tasks { 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("cn.gtemc.itembridge", "net.momirealms.craftengine.libraries.itembridge") relocate("org.incendo", "net.momirealms.craftengine.libraries") relocate("dev.dejvokep", "net.momirealms.craftengine.libraries") relocate("org.bstats", "net.momirealms.craftengine.libraries.bstats") diff --git a/bukkit/paper-loader/build.gradle.kts b/bukkit/paper-loader/build.gradle.kts index 155a5e15b..09e83e3e6 100644 --- a/bukkit/paper-loader/build.gradle.kts +++ b/bukkit/paper-loader/build.gradle.kts @@ -11,6 +11,7 @@ repositories { maven("https://jitpack.io/") maven("https://repo.papermc.io/repository/maven-public/") maven("https://repo.momirealms.net/releases/") + maven("https://repo.gtemc.net/releases/") mavenCentral() } @@ -31,6 +32,7 @@ dependencies { 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("cn.gtemc:itembridge:${rootProject.properties["itembridge_version"]}") } java { @@ -92,15 +94,33 @@ paper { register("BetterModel") { required = false } // external items - register("NeigeItems") { required = false } + register("AzureFlow") { required = false } + register("CustomFishing") { required = false } + register("EcoArmor") { required = false } + register("EcoCrates") { required = false } + register("EcoItems") { required = false } + register("EcoMobs") { required = false } + register("EcoPets") { required = false } + register("EcoScrolls") { required = false } + register("ExecutableItems") { required = false } + register("HeadDatabase") { required = false } + register("HMCCosmetics") { required = false } + register("ItemsAdder") { required = false } + register("MagicGem") { required = false } register("MMOItems") { required = false } register("MythicMobs") { required = false } - register("CustomFishing") { required = false } - register("Zaphkiel") { required = false } - register("HeadDatabase") { required = false } - register("SX-Item") { required = false } - register("Slimefun") { required = false } + register("NeigeItems") { required = false } register("Nexo") { required = false } + register("Nova") { required = false } + register("Oraxen") { required = false } + register("PxRpg") { required = false } + register("Ratziel") { required = false } + register("Reforges") { required = false } + register("Slimefun") { required = false } + register("StatTrackers") { required = false } + register("SX-Item") { required = false } + register("Talismans") { required = false } + register("Zaphkiel") { required = false } // leveler register("AuraSkills") { required = false } @@ -155,6 +175,7 @@ tasks { 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("cn.gtemc.itembridge", "net.momirealms.craftengine.libraries.itembridge") relocate("org.incendo", "net.momirealms.craftengine.libraries") relocate("dev.dejvokep", "net.momirealms.craftengine.libraries") relocate("org.bstats", "net.momirealms.craftengine.libraries.bstats") diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java index 08f477aaa..ce138ee0a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java @@ -1,5 +1,7 @@ package net.momirealms.craftengine.bukkit.item; +import cn.gtemc.itembridge.api.Provider; +import cn.gtemc.itembridge.core.BukkitItemBridge; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -39,6 +41,7 @@ import java.nio.file.Path; import java.util.*; import java.util.function.Function; +@SuppressWarnings("unchecked") public class BukkitItemManager extends AbstractItemManager { static { registerVanillaItemExtraBehavior(FlintAndSteelItemBehavior.INSTANCE, ItemKeys.FLINT_AND_STEEL); @@ -56,6 +59,7 @@ public class BukkitItemManager extends AbstractItemManager { private final Item emptyItem; private final UniqueIdItem emptyUniqueItem; private final Function decoratedHashOpsGenerator; + private BukkitItemBridge itemBridge; private Set lastRegisteredPatterns = Set.of(); @SuppressWarnings("unchecked") @@ -82,15 +86,13 @@ public class BukkitItemManager extends AbstractItemManager { @Override public void delayedLoad() { super.delayedLoad(); - List> sources = new ArrayList<>(); + List> sources = new ArrayList<>(); for (String externalSource : Config.recipeIngredientSources()) { String sourceId = externalSource.toLowerCase(Locale.ENGLISH); - ExternalItemSource provider = getExternalItemSource(sourceId); - if (provider != null) { - sources.add(provider); - } + Optional> provider = itemBridgeProvider().provider(sourceId); + provider.ifPresent(sources::add); } - this.factory.resetRecipeIngredientSources(sources.isEmpty() ? null : sources.toArray(new ExternalItemSource[0])); + this.factory.resetRecipeIngredientSources(sources.isEmpty() ? null : sources.toArray(new Provider[0])); } @Override @@ -442,4 +444,14 @@ public class BukkitItemManager extends AbstractItemManager { public Function decoratedHashOpsGenerator() { return decoratedHashOpsGenerator; } + + @Override + public BukkitItemBridge itemBridgeProvider() { + if (this.itemBridge == null) { + BukkitItemBridge.BukkitBuilder builder = BukkitItemBridge.builder(); + builder.removeById("craftengine"); + this.itemBridge = builder.build(); + } + return this.itemBridge; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java index 49760561b..34ec2fa08 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java @@ -1,12 +1,12 @@ package net.momirealms.craftengine.bukkit.item.factory; +import cn.gtemc.itembridge.api.Provider; import com.google.gson.JsonElement; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBuiltInRegistries; import net.momirealms.craftengine.bukkit.util.ItemTags; import net.momirealms.craftengine.bukkit.util.KeyUtils; -import net.momirealms.craftengine.core.item.ExternalItemSource; import net.momirealms.craftengine.core.item.ItemFactory; import net.momirealms.craftengine.core.item.ItemKeys; import net.momirealms.craftengine.core.item.ItemWrapper; @@ -19,6 +19,7 @@ import net.momirealms.craftengine.core.util.UniqueKey; import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.sparrow.nbt.Tag; import org.bukkit.Bukkit; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import java.util.Objects; @@ -26,7 +27,7 @@ import java.util.Optional; public abstract class BukkitItemFactory> extends ItemFactory { private boolean hasExternalRecipeSource = false; - private ExternalItemSource[] recipeIngredientSources = null; + private Provider[] recipeIngredientSources = null; protected BukkitItemFactory(CraftEngine plugin) { super(plugin); @@ -50,7 +51,7 @@ public abstract class BukkitItemFactory> extend throw new IllegalStateException("Unsupported server version: " + VersionHelper.MINECRAFT_VERSION.version()); } - public void resetRecipeIngredientSources(ExternalItemSource[] recipeIngredientSources) { + public void resetRecipeIngredientSources(Provider[] recipeIngredientSources) { if (recipeIngredientSources == null || recipeIngredientSources.length == 0) { this.recipeIngredientSources = null; this.hasExternalRecipeSource = false; @@ -102,8 +103,8 @@ public abstract class BukkitItemFactory> extend return null; } if (this.hasExternalRecipeSource) { - for (ExternalItemSource source : this.recipeIngredientSources) { - String id = source.id(item.getItem()); + for (Provider source : this.recipeIngredientSources) { + String id = source.idOrNull(item.getItem()); if (id != null) { return UniqueKey.create(Key.of(source.plugin(), StringUtils.toLowerCase(id))); } diff --git a/common-files/src/main/resources/translations/zh_cn.yml b/common-files/src/main/resources/translations/zh_cn.yml index cbe3894bc..f1f7138c8 100644 --- a/common-files/src/main/resources/translations/zh_cn.yml +++ b/common-files/src/main/resources/translations/zh_cn.yml @@ -563,16 +563,19 @@ warning.config.selector.invalid_type: "在文件 发现问题 - warning.config.selector.invalid_target: "在文件 发现问题 - 配置项 '' 使用了无效的选择器目标 ''" warning.config.resource_pack.item_model.already_exist: "无法为 '' 生成物品模型, 因为文件 '' 已存在" warning.config.resource_pack.model.generation.already_exist: "无法生成模型, 因为模型文件 '' 已存在" -warning.config.resource_pack.generation.malformatted_json: "Json文件 '' 格式错误" -warning.config.resource_pack.generation.missing_font_texture: "字体''缺少必要纹理: ''" -warning.config.resource_pack.generation.missing_model_texture: "模型''缺少纹理''" -warning.config.resource_pack.generation.missing_item_model: "物品''缺少模型文件: ''" -warning.config.resource_pack.generation.missing_block_model: "方块状态''缺少模型文件: ''" -warning.config.resource_pack.generation.missing_parent_model: "模型''找不到父级模型文件: ''" +warning.config.resource_pack.generation.malformatted_json: "JSON 文件 '' 格式错误" +warning.config.resource_pack.generation.missing_font_texture: "字体 '' 缺少必要纹理: ''" +warning.config.resource_pack.generation.missing_model_texture: "模型 '' 缺少纹理 ''" +warning.config.resource_pack.generation.missing_atlas_texture: "纹理图集 '' 缺少纹理 ''" +warning.config.resource_pack.generation.missing_item_model: "物品 '' 缺少模型文件: ''" +warning.config.resource_pack.generation.missing_block_model: "方块状态 '' 缺少模型文件: ''" +warning.config.resource_pack.generation.missing_parent_model: "模型 '' 找不到父级模型文件: ''" warning.config.resource_pack.generation.missing_equipment_texture: "装备 '' 缺少纹理 ''" warning.config.resource_pack.generation.missing_sound: "声音事件 '' 缺少 ogg 文件 ''" -warning.config.resource_pack.generation.texture_not_in_atlas: "纹理''不在图集内. 你需要将纹理路径或文件夹前缀添加到图集内, 或者启用 config.yml 中的 'fix-atlas' 选项" -warning.config.resource_pack.invalid_overlay_format: "在 config.yml 的 'resource-pack.overlay-format' 处发现问题 - 无效的overlay格式 ''. Overlay格式必须包含占位符 '{version}'" +warning.config.resource_pack.generation.texture_not_in_atlas: "纹理 '' 不在纹理图集内. 你需要将纹理路径或文件夹前缀添加到纹理图集内, 或者启用 config.yml 中的 'fix-atlas' 选项" +warning.config.resource_pack.generation.multiple_atlases: "模型 '' 使用了多个纹理图集, 预期应来自 '', 但同时检测到 ''. 请确保模型使用的所有纹理均来自同一纹理图集以修复此问题" +warning.config.resource_pack.generation.duplicated_sprite: "无法加载模型 ''. 纹理图集 '' 中的精灵图 '' 与纹理图集 '' 中的定义重复" +warning.config.resource_pack.invalid_overlay_format: "在 config.yml 的 'resource-pack.overlay-format' 处发现问题 - 无效的叠加资源包格式 ''. 叠加资源包格式必须包含占位符 '{version}'" warning.config.equipment.duplicate: "在文件 发现问题 - 重复的装备配置 ''. 请检查其他文件中是否存在相同配置" warning.config.equipment.missing_type: "在文件 发现问题 - 装备 '' 缺少必需的 'type' 参数" warning.config.equipment.invalid_type: "在文件 发现问题 - 装备 '' 使用了无效的 'type' 参数" diff --git a/core/build.gradle.kts b/core/build.gradle.kts index f49d99ae4..d5f8a4bd1 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -7,6 +7,7 @@ repositories { maven("https://jitpack.io/") maven("https://libraries.minecraft.net/") maven("https://repo.momirealms.net/releases/") + maven("https://repo.gtemc.net/releases/") } dependencies { @@ -71,6 +72,8 @@ dependencies { compileOnly("ca.spottedleaf:concurrentutil:${rootProject.properties["concurrent_util_version"]}") // bucket4j compileOnly("com.bucket4j:bucket4j_jdk17-core:${rootProject.properties["bucket4j_version"]}") + // ItemBridge + compileOnly("cn.gtemc:itembridge:${rootProject.properties["itembridge_version"]}") } java { @@ -110,6 +113,7 @@ tasks { relocate("io.netty.handler.codec.spdy", "net.momirealms.craftengine.libraries.netty.handler.codec.spdy") relocate("io.netty.handler.codec.http2", "net.momirealms.craftengine.libraries.netty.handler.codec.http2") relocate("io.github.bucket4j", "net.momirealms.craftengine.libraries.bucket4j") // bucket4j + relocate("cn.gtemc.itembridge", "net.momirealms.craftengine.libraries.itembridge") } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java index 81b865041..c0784794d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java @@ -13,7 +13,6 @@ import net.momirealms.craftengine.core.item.updater.ItemUpdaters; import net.momirealms.craftengine.core.pack.AbstractPackManager; import net.momirealms.craftengine.core.pack.LoadingSequence; import net.momirealms.craftengine.core.pack.Pack; -import net.momirealms.craftengine.core.pack.ResourceLocation; import net.momirealms.craftengine.core.pack.allocator.IdAllocator; import net.momirealms.craftengine.core.pack.model.*; import net.momirealms.craftengine.core.pack.model.generation.AbstractModelGenerator; @@ -50,7 +49,6 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl private final ItemParser itemParser; private final EquipmentParser equipmentParser; - protected final Map> externalItemSources = new HashMap<>(); protected final Map> customItemsById = new LinkedHashMap<>(); protected final Map> customItemsByPath = new HashMap<>(); protected final Map> customItemTags = new HashMap<>(); @@ -96,19 +94,6 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl return new ConfigParser[]{this.itemParser, this.equipmentParser}; } - @Override - public ExternalItemSource getExternalItemSource(String name) { - return this.externalItemSources.get(name); - } - - @Override - public boolean registerExternalItemSource(ExternalItemSource externalItemSource) { - if (!ResourceLocation.isValidNamespace(externalItemSource.plugin())) return false; - if (this.externalItemSources.containsKey(externalItemSource.plugin())) return false; - this.externalItemSources.put(externalItemSource.plugin(), externalItemSource); - return true; - } - @Override public void unload() { super.clearModelsToGenerate(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ExternalItemSource.java b/core/src/main/java/net/momirealms/craftengine/core/item/ExternalItemSource.java deleted file mode 100644 index 68daa3d67..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ExternalItemSource.java +++ /dev/null @@ -1,13 +0,0 @@ -package net.momirealms.craftengine.core.item; - -import org.jetbrains.annotations.Nullable; - -public interface ExternalItemSource { - - String plugin(); - - @Nullable - I build(String id, ItemBuildContext context); - - String id(I item); -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java index ba87486ee..f31ec93a0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.core.item; +import cn.gtemc.itembridge.api.ItemBridge; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.behavior.ItemBehavior; import net.momirealms.craftengine.core.item.equipment.Equipment; @@ -60,10 +61,6 @@ public interface ItemManager extends Manageable, ModelGenerator { return loadedItems().keySet(); } - ExternalItemSource getExternalItemSource(String name); - - boolean registerExternalItemSource(ExternalItemSource externalItemSource); - Optional getEquipment(Key key); Optional> getCustomItem(Key key); @@ -124,4 +121,6 @@ public interface ItemManager extends Manageable, ModelGenerator { List getIngredientSubstitutes(Key item); ItemUpdateResult updateItem(Item item, Supplier contextSupplier); + +

ItemBridge itemBridgeProvider(); } \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ExternalModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ExternalModifier.java index 4844f542e..2774c34c0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ExternalModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ExternalModifier.java @@ -1,24 +1,31 @@ package net.momirealms.craftengine.core.item.modifier; -import net.momirealms.craftengine.core.item.ExternalItemSource; +import cn.gtemc.itembridge.api.Provider; +import cn.gtemc.itembridge.api.context.BuildContext; +import cn.gtemc.itembridge.api.context.ContextKey; +import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.ItemBuildContext; import net.momirealms.craftengine.core.item.ItemDataModifierFactory; +import net.momirealms.craftengine.core.item.ItemManager; import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; +import net.momirealms.craftengine.core.util.VersionHelper; import org.jetbrains.annotations.NotNull; import java.util.*; +import java.util.function.Supplier; public class ExternalModifier implements ItemDataModifier { public static final Factory FACTORY = new Factory<>(); private static final ThreadLocal> BUILD_STACK = ThreadLocal.withInitial(LinkedHashSet::new); private final String id; - private final ExternalItemSource provider; + private final Provider provider; - public ExternalModifier(String id, ExternalItemSource provider) { + public ExternalModifier(String id, Provider provider) { this.id = id; this.provider = provider; } @@ -27,7 +34,7 @@ public class ExternalModifier implements ItemDataModifier { return id; } - public ExternalItemSource source() { + public Provider source() { return provider; } @@ -36,7 +43,6 @@ public class ExternalModifier implements ItemDataModifier { return ItemDataModifiers.EXTERNAL; } - @SuppressWarnings("unchecked") @Override public Item apply(Item item, ItemBuildContext context) { Dependency dependency = new Dependency(provider.plugin(), id); @@ -54,12 +60,14 @@ public class ExternalModifier implements ItemDataModifier { buildStack.add(dependency); try { - I another = this.provider.build(this.id, context); + ItemManager itemManager = CraftEngine.instance().itemManager(); + Player player = context.player(); + I another = this.provider.buildOrNull(this.id, player == null ? null : player.platformPlayer(), adapt(context)); if (another == null) { CraftEngine.instance().logger().warn("'" + this.id + "' could not be found in " + provider.plugin()); return item; } - Item anotherWrapped = (Item) CraftEngine.instance().itemManager().wrap(another); + Item anotherWrapped = itemManager.wrap(another); item.merge(anotherWrapped); return item; } catch (Throwable e) { @@ -71,16 +79,42 @@ public class ExternalModifier implements ItemDataModifier { } } + private static BuildContext adapt(ItemBuildContext context) { + if (!VersionHelper.IS_RUNNING_IN_DEV) return BuildContext.empty(); // 先不在生产环境启用 + ContextHolder contexts = context.contexts(); + if (contexts.isEmpty()) { + return BuildContext.empty(); + } + BuildContext.Builder builder = BuildContext.builder(); + for (Map.Entry, Supplier> entry : contexts.params().entrySet()) { + Object value = entry.getValue().get(); + if (value == null) { + continue; + } + Class type = value.getClass(); // fixme 这个获取办法并不正确,net.momirealms.craftengine.core.plugin.context.ContextKey 应该在创建的时候记录是什么类型 + @SuppressWarnings("unchecked") + ContextKey contextKey = (ContextKey) ContextKey.of(type, entry.getKey().node()); + with(builder, contextKey, entry.getValue()); + } + return builder.build(); + } + + private static void with(BuildContext.Builder builder, ContextKey key, Supplier value) { + builder.with(key, value); + } + public static class Factory implements ItemDataModifierFactory { - @SuppressWarnings("unchecked") @Override public ItemDataModifier create(Object arg) { Map data = ResourceConfigUtils.getAsMap(arg, "external"); String plugin = ResourceConfigUtils.requireNonEmptyStringOrThrow(ResourceConfigUtils.get(data, "plugin", "source"), "warning.config.item.data.external.missing_source"); String id = ResourceConfigUtils.requireNonEmptyStringOrThrow(data.get("id"), "warning.config.item.data.external.missing_id"); - ExternalItemSource provider = (ExternalItemSource) CraftEngine.instance().itemManager().getExternalItemSource(plugin.toLowerCase(Locale.ENGLISH)); - return new ExternalModifier<>(id, ResourceConfigUtils.requireNonNullOrThrow(provider, () -> new LocalizedResourceConfigException("warning.config.item.data.external.invalid_source", plugin))); + ItemManager itemManager = CraftEngine.instance().itemManager(); + Provider provider = itemManager.itemBridgeProvider().provider(plugin.toLowerCase(Locale.ENGLISH)).orElseThrow( + () -> new LocalizedResourceConfigException("warning.config.item.data.external.invalid_source", plugin) + ); + return new ExternalModifier<>(id, provider); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextHolder.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextHolder.java index cb7124019..cda3fd723 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextHolder.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextHolder.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.core.plugin.context; import com.google.common.collect.ImmutableMap; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -93,6 +94,16 @@ public class ContextHolder { return (T) Optional.ofNullable(this.params.get(parameter)).map(Supplier::get).orElse(defaultValue); } + @ApiStatus.Internal + public Map, Supplier> params() { + return ImmutableMap.copyOf(this.params); + } + + @ApiStatus.Internal + public boolean isEmpty() { + return this.params.isEmpty(); + } + public static Builder builder() { return new Builder(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CompressionMethod.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CompressionMethod.java index cfe5268c0..466d366bf 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CompressionMethod.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CompressionMethod.java @@ -1,16 +1,20 @@ package net.momirealms.craftengine.core.world.chunk.storage; import it.unimi.dsi.fastutil.io.FastBufferedInputStream; +import it.unimi.dsi.fastutil.io.FastBufferedOutputStream; import net.jpountz.lz4.LZ4BlockInputStream; import net.jpountz.lz4.LZ4BlockOutputStream; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.dependency.Dependencies; +import net.momirealms.craftengine.core.util.ReflectionUtils; import org.jetbrains.annotations.Nullable; import java.io.BufferedOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodType; import java.lang.reflect.Constructor; import java.util.Set; import java.util.zip.DeflaterOutputStream; @@ -22,8 +26,8 @@ public class CompressionMethod { public static final int METHOD_COUNT = 5; public static final CompressionMethod[] METHODS = new CompressionMethod[METHOD_COUNT +1]; public static final CompressionMethod NONE = register(new CompressionMethod(1, (stream) -> stream, (stream) -> stream)); - public static final CompressionMethod DEFLATE = register(new CompressionMethod(2, (stream) -> new FastBufferedInputStream(new InflaterInputStream(stream)), (stream) -> new BufferedOutputStream(new DeflaterOutputStream(stream)))); - public static final CompressionMethod GZIP = register(new CompressionMethod(3, (stream) -> new FastBufferedInputStream(new GZIPInputStream(stream)), (stream) -> new BufferedOutputStream(new GZIPOutputStream(stream)))); + public static final CompressionMethod DEFLATE = register(new CompressionMethod(2, (stream) -> new FastBufferedInputStream(new InflaterInputStream(stream)), (stream) -> new FastBufferedOutputStream(new DeflaterOutputStream(stream)))); + public static final CompressionMethod GZIP = register(new CompressionMethod(3, (stream) -> new FastBufferedInputStream(new GZIPInputStream(stream)), (stream) -> new FastBufferedOutputStream(new GZIPOutputStream(stream)))); public static final CompressionMethod LZ4 = register(new CompressionMethod(4, LZ4BlockInputStream::new, LZ4BlockOutputStream::new)); public static final CompressionMethod ZSTD; @@ -31,24 +35,26 @@ public class CompressionMethod { ClassLoader classLoader = CraftEngine.instance().dependencyManager().obtainClassLoaderWith(Set.of(Dependencies.ZSTD)); try { Class inputStreamClass = classLoader.loadClass("com.github.luben.zstd.ZstdInputStream"); - Constructor inputStreamConstructor = inputStreamClass.getConstructor(InputStream.class); + MethodHandle inputStreamConstructor = ReflectionUtils.unreflectConstructor(inputStreamClass.getConstructor(InputStream.class)) + .asType(MethodType.methodType(InputStream.class, InputStream.class)); Class outputStreamClass = classLoader.loadClass("com.github.luben.zstd.ZstdOutputStream"); - Constructor outputStreamConstructor = outputStreamClass.getConstructor(OutputStream.class); + MethodHandle outputStreamConstructor = ReflectionUtils.unreflectConstructor(outputStreamClass.getConstructor(OutputStream.class)) + .asType(MethodType.methodType(OutputStream.class, OutputStream.class)); ZSTD = register( new CompressionMethod( 5, rawStream -> { try { - return (InputStream) inputStreamConstructor.newInstance(rawStream); - } catch (Exception e) { + return (InputStream) inputStreamConstructor.invokeExact(rawStream); + } catch (Throwable e) { CraftEngine.instance().logger().warn("Could not instantiate ZstdInputStream", e); return rawStream; } }, rawStream -> { try { - return (OutputStream) outputStreamConstructor.newInstance(rawStream); - } catch (Exception e) { + return (OutputStream) outputStreamConstructor.invokeExact(rawStream); + } catch (Throwable e) { CraftEngine.instance().logger().warn("Could not instantiate ZstdOutputStream", e); return rawStream; } diff --git a/gradle.properties b/gradle.properties index 27f3fbb86..73bd8304d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -57,6 +57,7 @@ jimfs_version=1.3.1 authlib_version=7.0.60 concurrent_util_version=0.0.8-SNAPSHOT bucket4j_version=8.15.0 +itembridge_version=1.0.12 # Proxy settings systemProp.socks.proxyHost=127.0.0.1