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:
@@ -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));
|
||||
//
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user