9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-28 11:29:17 +00:00

解决跨平台的问题

This commit is contained in:
jhqwqmc
2025-12-17 02:14:19 +08:00
parent d780795a2d
commit 5901712e16
4 changed files with 24 additions and 37 deletions

View File

@@ -1,7 +1,7 @@
package net.momirealms.craftengine.core.item;
import cn.gtemc.itembridge.api.ItemBridge;
import cn.gtemc.itembridge.api.Provider;
import cn.gtemc.itembridge.core.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;
@@ -123,7 +123,7 @@ public interface ItemManager<T> extends Manageable, ModelGenerator {
ItemUpdateResult updateItem(Item<T> item, Supplier<ItemBuildContext> contextSupplier);
ItemBridge itemBridgeProvider();
ItemBridge<T> itemBridgeProvider();
<I> Provider<I> getItemProvider(String plugin);
Optional<T> buildPlatformItem(Provider<T> provider, String id, ItemBuildContext context);
}

View File

@@ -1,12 +1,10 @@
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.locale.LocalizedResourceConfigException;
import net.momirealms.craftengine.core.util.Key;
@@ -18,7 +16,6 @@ import java.util.*;
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 static ContextKey<Object> platformPlayerKey;
private final String id;
private final Provider<I> provider;
@@ -40,7 +37,6 @@ public class ExternalModifier<I> implements ItemDataModifier<I> {
return ItemDataModifiers.EXTERNAL;
}
@SuppressWarnings("unchecked")
@Override
public Item<I> apply(Item<I> item, ItemBuildContext context) {
Dependency dependency = new Dependency(provider.plugin(), id);
@@ -58,12 +54,13 @@ public class ExternalModifier<I> implements ItemDataModifier<I> {
buildStack.add(dependency);
try {
Optional<I> another = this.provider.build(this.id, adapt(context));
ItemManager<I> itemManager = CraftEngine.instance().itemManager();
Optional<I> another = itemManager.buildPlatformItem(this.provider, this.id, context);
if (another.isEmpty()) {
CraftEngine.instance().logger().warn("'" + this.id + "' could not be found in " + provider.plugin());
return item;
}
Item<I> anotherWrapped = (Item<I>) CraftEngine.instance().itemManager().wrap(another.get());
Item<I> anotherWrapped = itemManager.wrap(another.get());
item.merge(anotherWrapped);
return item;
} catch (Throwable e) {
@@ -75,19 +72,6 @@ public class ExternalModifier<I> implements ItemDataModifier<I> {
}
}
@SuppressWarnings("unchecked")
private static BuildContext adapt(ItemBuildContext context) {
BuildContext.Builder builder = BuildContext.builder();
Player player = context.player();
if (player != null) {
if (platformPlayerKey == null) {
platformPlayerKey = (ContextKey<Object>) Objects.requireNonNull(ContextKey.of(player.platformPlayerClass(), "player"));
}
builder.with(platformPlayerKey, player.platformPlayer());
}
return builder.build();
}
public static class Factory<I> implements ItemDataModifierFactory<I> {
@Override
@@ -95,8 +79,11 @@ public class ExternalModifier<I> implements ItemDataModifier<I> {
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");
Provider<I> provider = CraftEngine.instance().itemManager().getItemProvider(plugin.toLowerCase(Locale.ENGLISH));
return new ExternalModifier<>(id, ResourceConfigUtils.requireNonNullOrThrow(provider, () -> new LocalizedResourceConfigException("warning.config.item.data.external.invalid_source", plugin)));
ItemManager<I> itemManager = CraftEngine.instance().itemManager();
Provider<I> provider = itemManager.itemBridgeProvider().provider(plugin.toLowerCase(Locale.ENGLISH)).orElseThrow(
() -> new LocalizedResourceConfigException("warning.config.item.data.external.invalid_source", plugin)
);
return new ExternalModifier<>(id, provider);
}
}