mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-31 12:56:28 +00:00
初步改进兼容性
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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 + "]";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -94,7 +94,7 @@ public interface Plugin {
|
||||
|
||||
VanillaLootManager vanillaLootManager();
|
||||
|
||||
<T> CompatibilityManager<T> compatibilityManager();
|
||||
CompatibilityManager compatibilityManager();
|
||||
|
||||
GlobalVariableManager globalVariableManager();
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user