9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-26 10:29:20 +00:00

添加可覆写lore,增强物品数据读取逻辑

This commit is contained in:
XiaoMoMi
2025-08-14 18:02:43 +08:00
parent 70b8cab056
commit 5ea84511e8
13 changed files with 185 additions and 3 deletions

View File

@@ -3,13 +3,20 @@ package net.momirealms.craftengine.core.block;
import com.google.gson.JsonElement;
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import net.momirealms.craftengine.core.pack.LoadingSequence;
import net.momirealms.craftengine.core.pack.Pack;
import net.momirealms.craftengine.core.pack.ResourceLocation;
import net.momirealms.craftengine.core.pack.model.generation.AbstractModelGenerator;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.plugin.config.ConfigParser;
import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.MiscUtils;
import org.incendo.cloud.suggestion.Suggestion;
import org.jetbrains.annotations.NotNull;
import java.nio.file.Path;
import java.util.*;
public abstract class AbstractBlockManager extends AbstractModelGenerator implements BlockManager {
@@ -127,4 +134,52 @@ public abstract class AbstractBlockManager extends AbstractModelGenerator implem
}
protected abstract void resendTags();
protected abstract boolean isVanillaBlock(Key id);
protected abstract int getBlockRegistryId(Key id);
public class BlockParser implements ConfigParser {
public static final String[] CONFIG_SECTION_NAME = new String[]{"blocks", "block"};
@Override
public String[] sectionId() {
return CONFIG_SECTION_NAME;
}
@Override
public int loadingSequence() {
return LoadingSequence.BLOCK;
}
@Override
public void parseSection(Pack pack, Path path, Key id, Map<String, Object> section) {
if (isVanillaBlock(id)) {
parseVanillaBlock(pack, path, id, section);
} else {
// check duplicated config
if (AbstractBlockManager.this.byId.containsKey(id)) {
throw new LocalizedResourceConfigException("warning.config.block.duplicate");
}
parseCustomBlock(pack, path, id, section);
}
}
private void parseVanillaBlock(Pack pack, Path path, Key id, Map<String, Object> section) {
Map<String, Object> settings = MiscUtils.castToMap(section.get("settings"), true);
if (settings != null) {
Object clientBoundTags = settings.get("client-bound-tags");
if (clientBoundTags instanceof List<?> list) {
List<String> clientSideTags = MiscUtils.getAsStringList(list).stream().filter(ResourceLocation::isValid).toList();
AbstractBlockManager.this.clientBoundTags.put(getBlockRegistryId(id), clientSideTags);
}
}
}
private void parseCustomBlock(Pack pack, Path path, Key id, Map<String, Object> section) {
// 获取方块设置
BlockSettings settings = BlockSettings.fromMap(id, MiscUtils.castToMap(section.get("settings"), true));
//
}
}
}

View File

@@ -371,6 +371,11 @@ public class AbstractItem<W extends ItemWrapper<I>, I> implements Item<I> {
return this.factory.hasComponent(this.item, type);
}
@Override
public boolean hasNonDefaultComponent(Object type) {
return this.factory.hasNonDefaultComponent(this.item, type);
}
@Override
public void removeComponent(Object type) {
this.factory.removeComponent(this.item, type);

View File

@@ -73,7 +73,12 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
for (Map.Entry<String, Object> dataEntry : dataSection.entrySet()) {
Object value = dataEntry.getValue();
if (value == null) continue;
Optional.ofNullable(BuiltInRegistries.ITEM_DATA_MODIFIER_FACTORY.getValue(Key.withDefaultNamespace(dataEntry.getKey(), Key.DEFAULT_NAMESPACE))).ifPresent(factory -> {
String key = dataEntry.getKey();
int idIndex = key.indexOf('#');
if (idIndex != -1) {
key = key.substring(0, idIndex);
}
Optional.ofNullable(BuiltInRegistries.ITEM_DATA_MODIFIER_FACTORY.getValue(Key.withDefaultNamespace(key, Key.DEFAULT_NAMESPACE))).ifPresent(factory -> {
try {
callback.accept((ItemDataModifier<I>) factory.create(value));
} catch (LocalizedResourceConfigException e) {

View File

@@ -163,6 +163,8 @@ public interface Item<I> {
boolean hasComponent(Object type);
boolean hasNonDefaultComponent(Object type);
void removeComponent(Object type);
void setExactComponent(Object type, Object value);

View File

@@ -69,6 +69,8 @@ public abstract class ItemFactory<W extends ItemWrapper<I>, I> {
protected abstract void resetComponent(W item, Object type);
protected abstract boolean hasNonDefaultComponent(W item, Object type);
protected abstract I getItem(W item);
protected abstract void customModelData(W item, Integer data);

View File

@@ -1,6 +1,7 @@
package net.momirealms.craftengine.core.item.modifier;
import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
import net.momirealms.craftengine.core.item.modifier.lore.OverwritableLoreModifier;
import net.momirealms.craftengine.core.item.modifier.lore.DynamicLoreModifier;
import net.momirealms.craftengine.core.item.modifier.lore.LoreModifier;
import net.momirealms.craftengine.core.registry.BuiltInRegistries;
@@ -40,10 +41,15 @@ public final class ItemDataModifiers {
public static final Key LORE = Key.of("craftengine:lore");
public static final Key UNBREAKABLE = Key.of("craftengine:unbreakable");
public static final Key DYNAMIC_LORE = Key.of("craftengine:dynamic-lore");
public static final Key OVERWRITABLE_LORE = Key.of("craftengine:overwritable-lore");
public static <T> void register(Key key, ItemDataModifierFactory<T> factory) {
((WritableRegistry<ItemDataModifierFactory<?>>) BuiltInRegistries.ITEM_DATA_MODIFIER_FACTORY)
.register(ResourceKey.create(Registries.ITEM_DATA_MODIFIER_FACTORY.location(), key), factory);
if (key.value().contains("-")) {
((WritableRegistry<ItemDataModifierFactory<?>>) BuiltInRegistries.ITEM_DATA_MODIFIER_FACTORY)
.register(ResourceKey.create(Registries.ITEM_DATA_MODIFIER_FACTORY.location(), new Key(key.namespace(), key.value().replace("-", "_"))), factory);
}
}
public static void init() {}
@@ -52,6 +58,7 @@ public final class ItemDataModifiers {
register(EXTERNAL, ExternalModifier.FACTORY);
register(LORE, LoreModifier.FACTORY);
register(DYNAMIC_LORE, DynamicLoreModifier.FACTORY);
register(OVERWRITABLE_LORE, OverwritableLoreModifier.FACTORY);
register(DYED_COLOR, DyedColorModifier.FACTORY);
register(TAGS, TagsModifier.FACTORY);
register(NBT, TagsModifier.FACTORY);

View File

@@ -0,0 +1,64 @@
package net.momirealms.craftengine.core.item.modifier.lore;
import net.momirealms.craftengine.core.item.ComponentKeys;
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.modifier.ItemDataModifier;
import net.momirealms.craftengine.core.item.modifier.ItemDataModifiers;
import net.momirealms.craftengine.core.item.modifier.SimpleNetworkItemDataModifier;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.sparrow.nbt.CompoundTag;
public final class OverwritableLoreModifier<I> implements SimpleNetworkItemDataModifier<I> {
public static final Factory<?> FACTORY = new Factory<>();
private final LoreModifier<I> loreModifier;
public OverwritableLoreModifier(LoreModifier<I> loreModifier) {
this.loreModifier = loreModifier;
}
@Override
public Key type() {
return ItemDataModifiers.OVERWRITABLE_LORE;
}
@Override
public Item<I> apply(Item<I> item, ItemBuildContext context) {
if (item.hasNonDefaultComponent(ComponentKeys.LORE)) {
return item;
}
return this.loreModifier.apply(item, context);
}
@Override
public Key componentType(Item<I> item, ItemBuildContext context) {
return ComponentKeys.LORE;
}
@Override
public Object[] nbtPath(Item<I> item, ItemBuildContext context) {
return new Object[]{"display", "Lore"};
}
@Override
public String nbtPathString(Item<I> item, ItemBuildContext context) {
return "display.Lore";
}
public static class Factory<I> implements ItemDataModifierFactory<I> {
@Override
public ItemDataModifier<I> create(Object arg) {
LoreModifier<I> lore = LoreModifier.createLoreModifier(arg);
return new OverwritableLoreModifier<>(lore);
}
}
@Override
public Item<I> prepareNetworkItem(Item<I> item, ItemBuildContext context, CompoundTag networkData) {
if (item.hasNonDefaultComponent(ComponentKeys.LORE)) {
return item;
}
return SimpleNetworkItemDataModifier.super.prepareNetworkItem(item, context, networkData);
}
}