mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-28 11:29:17 +00:00
解决跨平台的问题
This commit is contained in:
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user