9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-31 12:56:28 +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

@@ -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;