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

初步改进兼容性

This commit is contained in:
XiaoMoMi
2025-12-22 19:10:23 +08:00
parent 0454ce29d8
commit e3d22a3d21
22 changed files with 205 additions and 117 deletions

View File

@@ -1,11 +1,15 @@
package net.momirealms.craftengine.bukkit.compatibility;
import cn.gtemc.itembridge.api.Provider;
import cn.gtemc.itembridge.core.BukkitItemBridge;
import cn.gtemc.levelerbridge.core.BukkitLevelerBridge;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
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.ItemBridgeSource;
import net.momirealms.craftengine.bukkit.compatibility.legacy.slimeworld.LegacySlimeFormatStorageAdaptor;
import net.momirealms.craftengine.bukkit.compatibility.leveler.LevelerBridgeLeveler;
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.modelengine.ModelEngineBlockEntityElementConfig;
@@ -30,9 +34,7 @@ import net.momirealms.craftengine.core.block.BlockManager;
import net.momirealms.craftengine.core.entity.furniture.ExternalModel;
import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.loot.LootConditions;
import net.momirealms.craftengine.core.plugin.compatibility.CompatibilityManager;
import net.momirealms.craftengine.core.plugin.compatibility.ModelProvider;
import net.momirealms.craftengine.core.plugin.compatibility.TagResolverProvider;
import net.momirealms.craftengine.core.plugin.compatibility.*;
import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.plugin.context.Context;
import net.momirealms.craftengine.core.plugin.context.condition.AlwaysFalseCondition;
@@ -44,22 +46,26 @@ import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.VersionHelper;
import net.momirealms.craftengine.core.world.WorldManager;
import org.bukkit.Bukkit;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin;
import java.util.*;
public class BukkitCompatibilityManager implements CompatibilityManager<org.bukkit.entity.Player> {
public class BukkitCompatibilityManager implements CompatibilityManager {
private final BukkitCraftEngine plugin;
private final Map<String, ModelProvider> modelProviders;
private final Map<String, TagResolverProvider> tagResolverProviders;
private final Map<String, ItemSource<ItemStack>> itemSources;
private final Map<String, LevelerProvider> levelerProviders;
private TagResolverProvider[] tagResolverProviderArray = null;
private BukkitLevelerBridge levelerBridge;
private boolean hasPlaceholderAPI;
private boolean hasGeyser;
private boolean hasFloodgate;
public BukkitCompatibilityManager(BukkitCraftEngine plugin) {
this.plugin = plugin;
this.itemSources = new HashMap<>();
this.levelerProviders = new HashMap<>();
this.modelProviders = new HashMap<>(Map.of(
"ModelEngine", ModelEngineModel::new,
"BetterModel", BetterModelModel::new
@@ -67,6 +73,27 @@ public class BukkitCompatibilityManager implements CompatibilityManager<org.bukk
this.tagResolverProviders = new HashMap<>();
}
@Override
public ItemSource<?> getItemSource(String id) {
return this.itemSources.get(id);
}
@SuppressWarnings("unchecked")
@Override
public void registerItemSource(ItemSource<?> itemSource) {
this.itemSources.put(itemSource.plugin(), (ItemSource<ItemStack>) itemSource);
}
@Override
public LevelerProvider getLevelerProvider(String id) {
return this.levelerProviders.get(id);
}
@Override
public void registerLevelerProvider(LevelerProvider provider) {
this.levelerProviders.put(provider.plugin(), provider);
}
@Override
public void onLoad() {
}
@@ -138,6 +165,14 @@ public class BukkitCompatibilityManager implements CompatibilityManager<org.bukk
if (this.isPluginEnabled("GrimAC") && Config.injectPacketEvents()) {
runCatchingHook(() -> WrappedBlockStateHelper.register("ac{}grim{}grimac{}shaded{}com{}github{}retrooper{}packetevents"), "GrimAC");
}
BukkitLevelerBridge levelerBridge = BukkitLevelerBridge.builder(false).build();
for (cn.gtemc.levelerbridge.api.LevelerProvider<org.bukkit.entity.Player> provider : levelerBridge.providers()) {
this.registerLevelerProvider(new LevelerBridgeLeveler(provider));
}
BukkitItemBridge itemBridge = BukkitItemBridge.builder(true).build();
for (Provider<ItemStack, org.bukkit.entity.Player> provider : itemBridge.providers()) {
this.registerItemSource(new ItemBridgeSource(provider));
}
}
private void runCatchingHook(ThrowableRunnable runnable, String plugin) {
@@ -304,12 +339,4 @@ public class BukkitCompatibilityManager implements CompatibilityManager<org.bukk
}
return uuid.version() == 0;
}
@Override
public BukkitLevelerBridge levelerBridge() {
if (this.levelerBridge == null) {
this.levelerBridge = BukkitLevelerBridge.builder().build();
}
return this.levelerBridge;
}
}

View File

@@ -0,0 +1,68 @@
package net.momirealms.craftengine.bukkit.compatibility.item;
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.item.ItemBuildContext;
import net.momirealms.craftengine.core.plugin.compatibility.ItemSource;
import net.momirealms.craftengine.core.plugin.context.ContextHolder;
import net.momirealms.craftengine.core.util.VersionHelper;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.Nullable;
import java.util.Map;
import java.util.function.Supplier;
public class ItemBridgeSource implements ItemSource<ItemStack> {
private final Provider<ItemStack, Player> provider;
public ItemBridgeSource(Provider<ItemStack, Player> provider) {
this.provider = provider;
}
@Override
public String plugin() {
return this.provider.plugin();
}
@Nullable
@Override
public ItemStack build(String id, ItemBuildContext context) {
net.momirealms.craftengine.core.entity.player.Player player = context.player();
Player bukkitPlayer = null;
if (player != null) {
bukkitPlayer = (Player) player.platformPlayer();
}
return this.provider.buildOrNull(id, bukkitPlayer, adapt(context));
}
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<net.momirealms.craftengine.core.plugin.context.ContextKey<?>, Supplier<Object>> 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<Object> contextKey = (ContextKey<Object>) ContextKey.of(type, entry.getKey().node());
with(builder, contextKey, entry.getValue());
}
return builder.build();
}
private static <T> void with(BuildContext.Builder builder, ContextKey<T> key, Supplier<T> value) {
builder.with(key, value);
}
@Override
public String id(ItemStack item) {
return this.provider.idOrNull(item);
}
}

View File

@@ -0,0 +1,27 @@
package net.momirealms.craftengine.bukkit.compatibility.leveler;
import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.plugin.compatibility.LevelerProvider;
public class LevelerBridgeLeveler implements LevelerProvider {
private final cn.gtemc.levelerbridge.api.LevelerProvider<org.bukkit.entity.Player> provider;
public LevelerBridgeLeveler(cn.gtemc.levelerbridge.api.LevelerProvider<org.bukkit.entity.Player> provider) {
this.provider = provider;
}
@Override
public String plugin() {
return this.provider.plugin();
}
@Override
public void addExp(Player player, String target, double amount) {
this.provider.addExperience((org.bukkit.entity.Player) player.platformPlayer(), target, amount);
}
@Override
public int getLevel(Player player, String target) {
return this.provider.getLevel((org.bukkit.entity.Player) player.platformPlayer(), target);
}
}

View File

@@ -7,7 +7,6 @@ import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.player.PlayerEvent;
import org.jetbrains.annotations.NotNull;

View File

@@ -1,7 +1,5 @@
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;
@@ -22,6 +20,7 @@ import net.momirealms.craftengine.core.item.*;
import net.momirealms.craftengine.core.item.recipe.DatapackRecipeResult;
import net.momirealms.craftengine.core.item.recipe.UniqueIdItem;
import net.momirealms.craftengine.core.pack.AbstractPackManager;
import net.momirealms.craftengine.core.plugin.compatibility.ItemSource;
import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException;
import net.momirealms.craftengine.core.util.GsonHelper;
@@ -59,7 +58,6 @@ public class BukkitItemManager extends AbstractItemManager<ItemStack> {
private final Item<ItemStack> emptyItem;
private final UniqueIdItem<ItemStack> emptyUniqueItem;
private final Function<Object, Integer> decoratedHashOpsGenerator;
private BukkitItemBridge itemBridge;
private Set<Key> lastRegisteredPatterns = Set.of();
@SuppressWarnings("unchecked")
@@ -86,13 +84,15 @@ public class BukkitItemManager extends AbstractItemManager<ItemStack> {
@Override
public void delayedLoad() {
super.delayedLoad();
List<Provider<ItemStack, org.bukkit.entity.Player>> sources = new ArrayList<>();
List<ItemSource<ItemStack>> sources = new ArrayList<>();
for (String externalSource : Config.recipeIngredientSources()) {
String sourceId = externalSource.toLowerCase(Locale.ENGLISH);
Optional<Provider<ItemStack, org.bukkit.entity.Player>> provider = itemBridgeProvider().provider(sourceId);
provider.ifPresent(sources::add);
ItemSource<?> itemSource = this.plugin.compatibilityManager().getItemSource(sourceId);
if (itemSource != null) {
sources.add((ItemSource<ItemStack>) itemSource);
}
}
this.factory.resetRecipeIngredientSources(sources.isEmpty() ? null : sources.toArray(new Provider[0]));
this.factory.resetRecipeIngredientSources(sources.isEmpty() ? null : sources.toArray(new ItemSource[0]));
}
@Override
@@ -444,14 +444,4 @@ public class BukkitItemManager extends AbstractItemManager<ItemStack> {
public Function<Object, Integer> 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;
}
}

View File

@@ -1,6 +1,5 @@
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;
@@ -13,13 +12,13 @@ import net.momirealms.craftengine.core.item.ItemWrapper;
import net.momirealms.craftengine.core.item.data.JukeboxPlayable;
import net.momirealms.craftengine.core.item.setting.EquipmentData;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.compatibility.ItemSource;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.StringUtils;
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;
@@ -27,7 +26,7 @@ import java.util.Optional;
public abstract class BukkitItemFactory<W extends ItemWrapper<ItemStack>> extends ItemFactory<W, ItemStack> {
private boolean hasExternalRecipeSource = false;
private Provider<ItemStack, Player>[] recipeIngredientSources = null;
private ItemSource<ItemStack>[] recipeIngredientSources = null;
protected BukkitItemFactory(CraftEngine plugin) {
super(plugin);
@@ -51,7 +50,7 @@ public abstract class BukkitItemFactory<W extends ItemWrapper<ItemStack>> extend
throw new IllegalStateException("Unsupported server version: " + VersionHelper.MINECRAFT_VERSION.version());
}
public void resetRecipeIngredientSources(Provider<ItemStack, Player>[] recipeIngredientSources) {
public void resetRecipeIngredientSources(ItemSource<ItemStack>[] recipeIngredientSources) {
if (recipeIngredientSources == null || recipeIngredientSources.length == 0) {
this.recipeIngredientSources = null;
this.hasExternalRecipeSource = false;
@@ -103,8 +102,8 @@ public abstract class BukkitItemFactory<W extends ItemWrapper<ItemStack>> extend
return null;
}
if (this.hasExternalRecipeSource) {
for (Provider<ItemStack, Player> source : this.recipeIngredientSources) {
String id = source.idOrNull(item.getItem());
for (ItemSource<ItemStack> source : this.recipeIngredientSources) {
String id = source.id(item.getItem());
if (id != null) {
return UniqueKey.create(Key.of(source.plugin(), StringUtils.toLowerCase(id)));
}

View File

@@ -48,7 +48,6 @@ import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
@@ -93,7 +92,7 @@ public class BukkitCraftEngine extends CraftEngine {
Class<?> compatibilityClass = ReflectionUtils.getClazz(COMPATIBILITY_CLASS);
if (compatibilityClass != null) {
try {
super.compatibilityManager = (CompatibilityManager<Player>) Objects.requireNonNull(ReflectionUtils.getConstructor(compatibilityClass, 0)).newInstance(this);
super.compatibilityManager = (CompatibilityManager) Objects.requireNonNull(ReflectionUtils.getConstructor(compatibilityClass, 0)).newInstance(this);
} catch (ReflectiveOperationException e) {
logger().warn("Compatibility class could not be instantiated: " + compatibilityClass.getName());
}
@@ -350,8 +349,8 @@ public class BukkitCraftEngine extends CraftEngine {
}
@Override
public CompatibilityManager<Player> compatibilityManager() {
return (CompatibilityManager<Player>) compatibilityManager;
public CompatibilityManager compatibilityManager() {
return compatibilityManager;
}
@Override

View File

@@ -1,6 +1,5 @@
package net.momirealms.craftengine.bukkit.plugin.command.feature;
import dev.dejvokep.boostedyaml.YamlDocument;
import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature;
import net.momirealms.craftengine.core.pack.ResourceLocation;
@@ -19,8 +18,6 @@ import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.representer.Representer;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashMap;

View File

@@ -6,7 +6,9 @@ import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.core.util.LegacyChatFormatter;
import net.momirealms.craftengine.core.world.score.TeamManager;
import java.util.*;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
public class BukkitTeamManager implements TeamManager {
private static BukkitTeamManager instance;

View File

@@ -72,10 +72,6 @@ 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"]}")
// LevelerBridge
compileOnly("cn.gtemc:levelerbridge:${rootProject.properties["levelerbridge_version"]}")
}
java {

View File

@@ -39,7 +39,6 @@ import net.momirealms.craftengine.core.registry.BuiltInRegistries;
import net.momirealms.craftengine.core.registry.Holder;
import net.momirealms.craftengine.core.registry.WritableRegistry;
import net.momirealms.craftengine.core.util.*;
import net.momirealms.craftengine.core.world.Glowing;
import net.momirealms.craftengine.core.world.collision.AABB;
import net.momirealms.sparrow.nbt.CompoundTag;
import org.incendo.cloud.suggestion.Suggestion;

View File

@@ -14,7 +14,6 @@ import net.momirealms.craftengine.core.entity.furniture.hitbox.FurnitureHitBoxCo
import net.momirealms.craftengine.core.entity.furniture.hitbox.FurnitureHitboxPart;
import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.entity.seat.Seat;
import net.momirealms.craftengine.core.entity.seat.SeatOwner;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.entityculling.CullingData;
import net.momirealms.craftengine.core.util.Key;

View File

@@ -1,6 +1,5 @@
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;
@@ -121,6 +120,4 @@ public interface ItemManager<T> extends Manageable, ModelGenerator {
List<UniqueKey> getIngredientSubstitutes(Key item);
ItemUpdateResult updateItem(Item<T> item, Supplier<ItemBuildContext> contextSupplier);
<P> ItemBridge<T, P> itemBridgeProvider();
}

View File

@@ -1,31 +1,24 @@
package net.momirealms.craftengine.core.item.modifier;
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.plugin.compatibility.ItemSource;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.LazyReference;
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<I> implements ItemDataModifier<I> {
public static final Factory<?> FACTORY = new Factory<>();
private static final ThreadLocal<Set<Dependency>> BUILD_STACK = ThreadLocal.withInitial(LinkedHashSet::new);
private final String id;
private final Provider<I, Object> provider;
private final LazyReference<ItemSource<I>> provider;
public ExternalModifier(String id, Provider<I, Object> provider) {
public ExternalModifier(String id, LazyReference<ItemSource<I>> provider) {
this.id = id;
this.provider = provider;
}
@@ -34,18 +27,18 @@ public class ExternalModifier<I> implements ItemDataModifier<I> {
return id;
}
public Provider<I, Object> source() {
return provider;
}
@Override
public Key type() {
return ItemDataModifiers.EXTERNAL;
}
@SuppressWarnings("unchecked")
@Override
public Item<I> apply(Item<I> item, ItemBuildContext context) {
Dependency dependency = new Dependency(provider.plugin(), id);
ItemSource<I> provider = this.provider.get();
if (provider == null) return item;
Dependency dependency = new Dependency(provider.plugin(), this.id);
Set<Dependency> buildStack = BUILD_STACK.get();
if (buildStack.contains(dependency)) {
@@ -60,14 +53,12 @@ public class ExternalModifier<I> implements ItemDataModifier<I> {
buildStack.add(dependency);
try {
ItemManager<I> itemManager = CraftEngine.instance().itemManager();
Player player = context.player();
I another = this.provider.buildOrNull(this.id, player == null ? null : player.platformPlayer(), adapt(context));
I another = provider.build(this.id, context);
if (another == null) {
CraftEngine.instance().logger().warn("'" + this.id + "' could not be found in " + provider.plugin());
return item;
}
Item<I> anotherWrapped = itemManager.wrap(another);
Item<I> anotherWrapped = (Item<I>) CraftEngine.instance().itemManager().wrap(another);
item.merge(anotherWrapped);
return item;
} catch (Throwable e) {
@@ -79,49 +70,28 @@ public class ExternalModifier<I> implements ItemDataModifier<I> {
}
}
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<net.momirealms.craftengine.core.plugin.context.ContextKey<?>, Supplier<Object>> 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<Object> contextKey = (ContextKey<Object>) ContextKey.of(type, entry.getKey().node());
with(builder, contextKey, entry.getValue());
}
return builder.build();
}
private static <T> void with(BuildContext.Builder builder, ContextKey<T> key, Supplier<T> value) {
builder.with(key, value);
}
public static class Factory<I> implements ItemDataModifierFactory<I> {
@SuppressWarnings("unchecked")
@Override
public ItemDataModifier<I> create(Object arg) {
Map<String, Object> 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");
ItemManager<I> itemManager = CraftEngine.instance().itemManager();
Provider<I, Object> provider = itemManager.itemBridgeProvider().provider(plugin.toLowerCase(Locale.ENGLISH)).orElseThrow(
() -> new LocalizedResourceConfigException("warning.config.item.data.external.invalid_source", plugin)
);
return new ExternalModifier<>(id, provider);
return new ExternalModifier<>(id, LazyReference.lazyReference(() -> {
ItemSource<?> itemSource = CraftEngine.instance().compatibilityManager().getItemSource(plugin.toLowerCase(Locale.ENGLISH));
if (itemSource == null) {
CraftEngine.instance().logger().warn("Item source '" + plugin + "' not found for item '" + id + "'");
}
return (ItemSource<I>) itemSource;
}));
}
}
private record Dependency(String source, String id) {
public @NotNull String asString() {
return source + "[id=" + id + "]";
return this.source + "[id=" + this.id + "]";
}
}
}

View File

@@ -88,7 +88,7 @@ public abstract class CraftEngine implements Plugin {
protected SoundManager soundManager;
protected VanillaLootManager vanillaLootManager;
protected AdvancementManager advancementManager;
protected CompatibilityManager<?> compatibilityManager;
protected CompatibilityManager compatibilityManager;
protected GlobalVariableManager globalVariableManager;
protected ProjectileManager projectileManager;
protected SeatManager seatManager;
@@ -644,10 +644,9 @@ public abstract class CraftEngine implements Plugin {
return vanillaLootManager;
}
@SuppressWarnings("unchecked")
@Override
public <T> CompatibilityManager<T> compatibilityManager() {
return (CompatibilityManager<T>) compatibilityManager;
public CompatibilityManager compatibilityManager() {
return compatibilityManager;
}
@Override

View File

@@ -94,7 +94,7 @@ public interface Plugin {
VanillaLootManager vanillaLootManager();
<T> CompatibilityManager<T> compatibilityManager();
CompatibilityManager compatibilityManager();
GlobalVariableManager globalVariableManager();

View File

@@ -1,13 +1,12 @@
package net.momirealms.craftengine.core.plugin.compatibility;
import cn.gtemc.levelerbridge.api.LevelerBridge;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.momirealms.craftengine.core.entity.furniture.ExternalModel;
import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.plugin.context.Context;
import net.momirealms.craftengine.core.plugin.network.NetWorkUser;
public interface CompatibilityManager<P> {
public interface CompatibilityManager {
void onLoad();
@@ -39,5 +38,11 @@ public interface CompatibilityManager<P> {
boolean isBedrockPlayer(Player player);
LevelerBridge<P> levelerBridge();
ItemSource<?> getItemSource(String id);
void registerItemSource(ItemSource<?> itemSource);
LevelerProvider getLevelerProvider(String id);
void registerLevelerProvider(LevelerProvider provider);
}

View File

@@ -0,0 +1,14 @@
package net.momirealms.craftengine.core.plugin.compatibility;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import org.jetbrains.annotations.Nullable;
public interface ItemSource<I> {
String plugin();
@Nullable
I build(String id, ItemBuildContext context);
String id(I item);
}

View File

@@ -4,7 +4,9 @@ import net.momirealms.craftengine.core.entity.player.Player;
public interface LevelerProvider {
String plugin();
void addExp(Player player, String target, double amount);
int getLevel(Player player, String target);
}
}

View File

@@ -33,12 +33,12 @@ public class LevelerExpFunction<CTX extends Context> extends AbstractConditional
public void runInternal(CTX ctx) {
if (this.selector == null) {
ctx.getOptionalParameter(DirectContextParameters.PLAYER).ifPresent(it -> {
CraftEngine.instance().compatibilityManager().levelerBridge().addExperience(this.plugin, it.platformPlayer(), this.leveler, this.count.getDouble(ctx));
CraftEngine.instance().compatibilityManager().getLevelerProvider(this.plugin).addExp(it, this.leveler, this.count.getDouble(ctx));
});
} else {
for (Player target : this.selector.get(ctx)) {
RelationalContext relationalContext = ViewerContext.of(ctx, PlayerOptionalContext.of(target));
CraftEngine.instance().compatibilityManager().levelerBridge().addExperience(this.plugin, target.platformPlayer(), this.leveler, this.count.getDouble(relationalContext));
CraftEngine.instance().compatibilityManager().getLevelerProvider(this.plugin).addExp(target, this.leveler, this.count.getDouble(relationalContext));
}
}
}

View File

@@ -13,7 +13,6 @@ import net.momirealms.craftengine.core.plugin.text.minimessage.IndexedArgumentTa
import net.momirealms.craftengine.core.plugin.text.minimessage.ShiftTag;
import net.momirealms.craftengine.core.util.AdventureHelper;
import net.momirealms.craftengine.core.util.MiscUtils;
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.yaml.snakeyaml.DumperOptions;

View File

@@ -47,7 +47,7 @@ mojang_brigadier_version=1.0.18
byte_buddy_version=1.18.1
ahocorasick_version=0.6.3
snake_yaml_version=2.5
anti_grief_version=1.0.5
anti_grief_version=1.0.6
nms_helper_version=1.0.151
evalex_version=3.5.0
reactive_streams_version=1.0.4