mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-22 00:19:17 +00:00
优化物品系统
This commit is contained in:
@@ -7,7 +7,7 @@ import net.momirealms.craftengine.core.item.CustomItem;
|
|||||||
import net.momirealms.craftengine.core.item.Item;
|
import net.momirealms.craftengine.core.item.Item;
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
||||||
import net.momirealms.craftengine.core.item.NetworkItemHandler;
|
import net.momirealms.craftengine.core.item.NetworkItemHandler;
|
||||||
import net.momirealms.craftengine.core.item.modifier.ArgumentModifier;
|
import net.momirealms.craftengine.core.item.modifier.ArgumentsModifier;
|
||||||
import net.momirealms.craftengine.core.item.modifier.ItemDataModifier;
|
import net.momirealms.craftengine.core.item.modifier.ItemDataModifier;
|
||||||
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
||||||
import net.momirealms.craftengine.core.plugin.config.Config;
|
import net.momirealms.craftengine.core.plugin.config.Config;
|
||||||
@@ -74,7 +74,7 @@ public final class LegacyNetworkItemHandler implements NetworkItemHandler<ItemSt
|
|||||||
return new OtherItem(wrapped, hasDifferentMaterial).process();
|
return new OtherItem(wrapped, hasDifferentMaterial).process();
|
||||||
} else {
|
} else {
|
||||||
CompoundTag tag = new CompoundTag();
|
CompoundTag tag = new CompoundTag();
|
||||||
Tag argumentTag = wrapped.getTag(ArgumentModifier.ARGUMENTS_TAG);
|
Tag argumentTag = wrapped.getTag(ArgumentsModifier.ARGUMENTS_TAG);
|
||||||
ItemBuildContext context;
|
ItemBuildContext context;
|
||||||
if (argumentTag instanceof CompoundTag arguments) {
|
if (argumentTag instanceof CompoundTag arguments) {
|
||||||
ContextHolder.Builder builder = ContextHolder.builder();
|
ContextHolder.Builder builder = ContextHolder.builder();
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import net.kyori.adventure.text.Component;
|
|||||||
import net.momirealms.craftengine.bukkit.nms.FastNMS;
|
import net.momirealms.craftengine.bukkit.nms.FastNMS;
|
||||||
import net.momirealms.craftengine.core.entity.player.Player;
|
import net.momirealms.craftengine.core.entity.player.Player;
|
||||||
import net.momirealms.craftengine.core.item.*;
|
import net.momirealms.craftengine.core.item.*;
|
||||||
import net.momirealms.craftengine.core.item.modifier.ArgumentModifier;
|
import net.momirealms.craftengine.core.item.modifier.ArgumentsModifier;
|
||||||
import net.momirealms.craftengine.core.item.modifier.ItemDataModifier;
|
import net.momirealms.craftengine.core.item.modifier.ItemDataModifier;
|
||||||
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
||||||
import net.momirealms.craftengine.core.plugin.config.Config;
|
import net.momirealms.craftengine.core.plugin.config.Config;
|
||||||
@@ -77,7 +77,7 @@ public final class ModernNetworkItemHandler implements NetworkItemHandler<ItemSt
|
|||||||
return new OtherItem(wrapped, hasDifferentMaterial).process();
|
return new OtherItem(wrapped, hasDifferentMaterial).process();
|
||||||
} else {
|
} else {
|
||||||
CompoundTag customData = Optional.ofNullable(wrapped.getSparrowNBTComponent(ComponentTypes.CUSTOM_DATA)).map(CompoundTag.class::cast).orElse(new CompoundTag());
|
CompoundTag customData = Optional.ofNullable(wrapped.getSparrowNBTComponent(ComponentTypes.CUSTOM_DATA)).map(CompoundTag.class::cast).orElse(new CompoundTag());
|
||||||
CompoundTag arguments = customData.getCompound(ArgumentModifier.ARGUMENTS_TAG);
|
CompoundTag arguments = customData.getCompound(ArgumentsModifier.ARGUMENTS_TAG);
|
||||||
ItemBuildContext context;
|
ItemBuildContext context;
|
||||||
if (arguments == null) {
|
if (arguments == null) {
|
||||||
context = ItemBuildContext.of(player);
|
context = ItemBuildContext.of(player);
|
||||||
|
|||||||
@@ -10,21 +10,20 @@ import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBuiltInReg
|
|||||||
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistryOps;
|
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistryOps;
|
||||||
import net.momirealms.craftengine.bukkit.util.EnchantmentUtils;
|
import net.momirealms.craftengine.bukkit.util.EnchantmentUtils;
|
||||||
import net.momirealms.craftengine.bukkit.util.KeyUtils;
|
import net.momirealms.craftengine.bukkit.util.KeyUtils;
|
||||||
|
import net.momirealms.craftengine.core.attribute.AttributeModifier;
|
||||||
|
import net.momirealms.craftengine.core.item.ComponentKeys;
|
||||||
import net.momirealms.craftengine.core.item.data.Enchantment;
|
import net.momirealms.craftengine.core.item.data.Enchantment;
|
||||||
import net.momirealms.craftengine.core.item.data.FireworkExplosion;
|
import net.momirealms.craftengine.core.item.data.FireworkExplosion;
|
||||||
import net.momirealms.craftengine.core.item.data.Trim;
|
import net.momirealms.craftengine.core.item.data.Trim;
|
||||||
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
||||||
import net.momirealms.craftengine.core.util.Color;
|
import net.momirealms.craftengine.core.util.*;
|
||||||
import net.momirealms.craftengine.core.util.Key;
|
|
||||||
import net.momirealms.craftengine.core.util.MiscUtils;
|
|
||||||
import net.momirealms.sparrow.nbt.CompoundTag;
|
import net.momirealms.sparrow.nbt.CompoundTag;
|
||||||
|
import net.momirealms.sparrow.nbt.ListTag;
|
||||||
import net.momirealms.sparrow.nbt.Tag;
|
import net.momirealms.sparrow.nbt.Tag;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.List;
|
import java.util.*;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemWrapper> {
|
public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemWrapper> {
|
||||||
|
|
||||||
@@ -129,7 +128,7 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
|
|||||||
valueTag = MRegistryOps.JAVA.convertTo(MRegistryOps.SPARROW_NBT, value);
|
valueTag = MRegistryOps.JAVA.convertTo(MRegistryOps.SPARROW_NBT, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
CompoundTag rootTag = (CompoundTag) item.getSparrowNBTComponent(ComponentTypes.CUSTOM_DATA).orElse(new CompoundTag());
|
CompoundTag rootTag = (CompoundTag) item.getSparrowNBTComponent(ComponentTypes.CUSTOM_DATA).orElseGet(CompoundTag::new);
|
||||||
|
|
||||||
if (path == null || path.length == 0) {
|
if (path == null || path.length == 0) {
|
||||||
if (valueTag instanceof CompoundTag) {
|
if (valueTag instanceof CompoundTag) {
|
||||||
@@ -587,4 +586,26 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
|
|||||||
Object itemStack2 = FastNMS.INSTANCE.method$ItemStack$transmuteCopy(itemStack1, newItem, amount);
|
Object itemStack2 = FastNMS.INSTANCE.method$ItemStack$transmuteCopy(itemStack1, newItem, amount);
|
||||||
return new ComponentItemWrapper(FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(itemStack2));
|
return new ComponentItemWrapper(FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(itemStack2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void attributeModifiers(ComponentItemWrapper item, List<AttributeModifier> modifierList) {
|
||||||
|
CompoundTag compoundTag = (CompoundTag) item.getSparrowNBTComponent(ComponentKeys.ATTRIBUTE_MODIFIERS).orElseGet(CompoundTag::new);
|
||||||
|
ListTag modifiers = new ListTag();
|
||||||
|
compoundTag.put("modifiers", modifiers);
|
||||||
|
for (AttributeModifier modifier : modifierList) {
|
||||||
|
CompoundTag modifierTag = new CompoundTag();
|
||||||
|
modifierTag.putString("type", modifier.type());
|
||||||
|
modifierTag.putString("slot", modifier.slot().name().toLowerCase(Locale.ENGLISH));
|
||||||
|
if (VersionHelper.isOrAbove1_21()) {
|
||||||
|
modifierTag.putString("id", modifier.id().toString());
|
||||||
|
} else {
|
||||||
|
modifierTag.putIntArray("uuid", UUIDUtils.uuidToIntArray(UUID.nameUUIDFromBytes(modifier.id().toString().getBytes(StandardCharsets.UTF_8))));
|
||||||
|
modifierTag.putString("name", modifier.id().toString());
|
||||||
|
}
|
||||||
|
modifierTag.putDouble("amount", modifier.amount());
|
||||||
|
modifierTag.putString("operation", modifier.operation().id());
|
||||||
|
modifiers.add(modifierTag);
|
||||||
|
}
|
||||||
|
item.setNBTComponent(ComponentKeys.ATTRIBUTE_MODIFIERS, compoundTag);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -5,15 +5,20 @@ import com.google.gson.JsonElement;
|
|||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.momirealms.craftengine.bukkit.item.ComponentItemWrapper;
|
import net.momirealms.craftengine.bukkit.item.ComponentItemWrapper;
|
||||||
import net.momirealms.craftengine.bukkit.item.ComponentTypes;
|
import net.momirealms.craftengine.bukkit.item.ComponentTypes;
|
||||||
|
import net.momirealms.craftengine.core.attribute.AttributeModifier;
|
||||||
|
import net.momirealms.craftengine.core.item.ComponentKeys;
|
||||||
import net.momirealms.craftengine.core.item.data.JukeboxPlayable;
|
import net.momirealms.craftengine.core.item.data.JukeboxPlayable;
|
||||||
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
||||||
import net.momirealms.craftengine.core.util.AdventureHelper;
|
import net.momirealms.craftengine.core.util.AdventureHelper;
|
||||||
import net.momirealms.craftengine.core.util.GsonHelper;
|
import net.momirealms.craftengine.core.util.GsonHelper;
|
||||||
|
import net.momirealms.craftengine.core.util.VersionHelper;
|
||||||
|
import net.momirealms.sparrow.nbt.CompoundTag;
|
||||||
import net.momirealms.sparrow.nbt.ListTag;
|
import net.momirealms.sparrow.nbt.ListTag;
|
||||||
import net.momirealms.sparrow.nbt.Tag;
|
import net.momirealms.sparrow.nbt.Tag;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
public class ComponentItemFactory1_21_5 extends ComponentItemFactory1_21_4 {
|
public class ComponentItemFactory1_21_5 extends ComponentItemFactory1_21_4 {
|
||||||
@@ -123,4 +128,29 @@ public class ComponentItemFactory1_21_5 extends ComponentItemFactory1_21_4 {
|
|||||||
protected void jukeboxSong(ComponentItemWrapper item, JukeboxPlayable data) {
|
protected void jukeboxSong(ComponentItemWrapper item, JukeboxPlayable data) {
|
||||||
item.setJavaComponent(ComponentTypes.JUKEBOX_PLAYABLE, data.song());
|
item.setJavaComponent(ComponentTypes.JUKEBOX_PLAYABLE, data.song());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void attributeModifiers(ComponentItemWrapper item, List<AttributeModifier> modifierList) {
|
||||||
|
ListTag modifiers = new ListTag();
|
||||||
|
for (AttributeModifier modifier : modifierList) {
|
||||||
|
CompoundTag modifierTag = new CompoundTag();
|
||||||
|
modifierTag.putString("type", modifier.type());
|
||||||
|
modifierTag.putString("slot", modifier.slot().name().toLowerCase(Locale.ENGLISH));
|
||||||
|
modifierTag.putString("id", modifier.id().toString());
|
||||||
|
modifierTag.putDouble("amount", modifier.amount());
|
||||||
|
modifierTag.putString("operation", modifier.operation().id());
|
||||||
|
AttributeModifier.Display display = modifier.display();
|
||||||
|
if (VersionHelper.isOrAbove1_21_6() && display != null) {
|
||||||
|
CompoundTag displayTag = new CompoundTag();
|
||||||
|
AttributeModifier.Display.Type displayType = display.type();
|
||||||
|
displayTag.putString("type", displayType.name().toLowerCase(Locale.ENGLISH));
|
||||||
|
if (displayType == AttributeModifier.Display.Type.OVERRIDE) {
|
||||||
|
displayTag.put("value", AdventureHelper.componentToTag(display.value()));
|
||||||
|
}
|
||||||
|
modifierTag.put("display", displayTag);
|
||||||
|
}
|
||||||
|
modifiers.add(modifierTag);
|
||||||
|
}
|
||||||
|
item.setNBTComponent(ComponentKeys.ATTRIBUTE_MODIFIERS, modifiers);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import net.momirealms.craftengine.bukkit.item.LegacyItemWrapper;
|
|||||||
import net.momirealms.craftengine.bukkit.nms.FastNMS;
|
import net.momirealms.craftengine.bukkit.nms.FastNMS;
|
||||||
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBuiltInRegistries;
|
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBuiltInRegistries;
|
||||||
import net.momirealms.craftengine.bukkit.util.KeyUtils;
|
import net.momirealms.craftengine.bukkit.util.KeyUtils;
|
||||||
|
import net.momirealms.craftengine.core.attribute.AttributeModifier;
|
||||||
import net.momirealms.craftengine.core.item.data.Enchantment;
|
import net.momirealms.craftengine.core.item.data.Enchantment;
|
||||||
import net.momirealms.craftengine.core.item.data.FireworkExplosion;
|
import net.momirealms.craftengine.core.item.data.FireworkExplosion;
|
||||||
import net.momirealms.craftengine.core.item.data.Trim;
|
import net.momirealms.craftengine.core.item.data.Trim;
|
||||||
@@ -13,6 +14,9 @@ import net.momirealms.craftengine.core.plugin.CraftEngine;
|
|||||||
import net.momirealms.craftengine.core.util.Color;
|
import net.momirealms.craftengine.core.util.Color;
|
||||||
import net.momirealms.craftengine.core.util.Key;
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
import net.momirealms.craftengine.core.util.SkullUtils;
|
import net.momirealms.craftengine.core.util.SkullUtils;
|
||||||
|
import net.momirealms.craftengine.core.util.UUIDUtils;
|
||||||
|
import net.momirealms.sparrow.nbt.CompoundTag;
|
||||||
|
import net.momirealms.sparrow.nbt.ListTag;
|
||||||
import net.momirealms.sparrow.nbt.Tag;
|
import net.momirealms.sparrow.nbt.Tag;
|
||||||
import org.bukkit.NamespacedKey;
|
import org.bukkit.NamespacedKey;
|
||||||
import org.bukkit.Registry;
|
import org.bukkit.Registry;
|
||||||
@@ -344,4 +348,20 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
|
|||||||
FastNMS.INSTANCE.method$ItemStack$setTag(newItemStack, FastNMS.INSTANCE.method$CompoundTag$copy(FastNMS.INSTANCE.field$ItemStack$getOrCreateTag(item.getLiteralObject())));
|
FastNMS.INSTANCE.method$ItemStack$setTag(newItemStack, FastNMS.INSTANCE.method$CompoundTag$copy(FastNMS.INSTANCE.field$ItemStack$getOrCreateTag(item.getLiteralObject())));
|
||||||
return new LegacyItemWrapper(FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(newItemStack));
|
return new LegacyItemWrapper(FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(newItemStack));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void attributeModifiers(LegacyItemWrapper item, List<AttributeModifier> modifiers) {
|
||||||
|
ListTag listTag = new ListTag();
|
||||||
|
for (AttributeModifier modifier : modifiers) {
|
||||||
|
CompoundTag modifierTag = new CompoundTag();
|
||||||
|
modifierTag.putString("AttributeName", modifier.type());
|
||||||
|
modifierTag.putString("Name", modifier.id().toString());
|
||||||
|
modifierTag.putString("Slot", modifier.slot().name().toLowerCase(Locale.ENGLISH));
|
||||||
|
modifierTag.putInt("Operation", modifier.operation().ordinal());
|
||||||
|
modifierTag.putDouble("Amount", modifier.amount());
|
||||||
|
modifierTag.putIntArray("UUID", UUIDUtils.uuidToIntArray(UUID.nameUUIDFromBytes(modifier.id().toString().getBytes(StandardCharsets.UTF_8))));
|
||||||
|
listTag.add(modifierTag);
|
||||||
|
}
|
||||||
|
item.setTag(listTag, "AttributeModifiers");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -72,6 +72,7 @@ warning.config.type.float: "<yellow>Issue found in file <arg:0> - Failed to load
|
|||||||
warning.config.type.double: "<yellow>Issue found in file <arg:0> - Failed to load '<arg:1>': Cannot cast '<arg:2>' to double type for option '<arg:3>'.</yellow>"
|
warning.config.type.double: "<yellow>Issue found in file <arg:0> - Failed to load '<arg:1>': Cannot cast '<arg:2>' to double type for option '<arg:3>'.</yellow>"
|
||||||
warning.config.type.quaternionf: "<yellow>Issue found in file <arg:0> - Failed to load '<arg:1>': Cannot cast '<arg:2>' to Quaternionf type for option '<arg:3>'.</yellow>"
|
warning.config.type.quaternionf: "<yellow>Issue found in file <arg:0> - Failed to load '<arg:1>': Cannot cast '<arg:2>' to Quaternionf type for option '<arg:3>'.</yellow>"
|
||||||
warning.config.type.vector3f: "<yellow>Issue found in file <arg:0> - Failed to load '<arg:1>': Cannot cast '<arg:2>' to Vector3f type for option '<arg:3>'.</yellow>"
|
warning.config.type.vector3f: "<yellow>Issue found in file <arg:0> - Failed to load '<arg:1>': Cannot cast '<arg:2>' to Vector3f type for option '<arg:3>'.</yellow>"
|
||||||
|
warning.config.type.map: "<yellow>Issue found in file <arg:0> - Failed to load '<arg:1>': Cannot cast '<arg:2>' to Map type for option '<arg:3>'.</yellow>"
|
||||||
warning.config.type.snbt.invalid_syntax: "<yellow>Issue found in file <arg:0> - Failed to load '<arg:1>': Invalid snbt syntax '<arg:2>'.</yellow>"
|
warning.config.type.snbt.invalid_syntax: "<yellow>Issue found in file <arg:0> - Failed to load '<arg:1>': Invalid snbt syntax '<arg:2>'.</yellow>"
|
||||||
warning.config.number.missing_type: "<yellow>Issue found in file <arg:0> - The config '<arg:1>' is missing the required 'type' argument for number argument.</yellow>"
|
warning.config.number.missing_type: "<yellow>Issue found in file <arg:0> - The config '<arg:1>' is missing the required 'type' argument for number argument.</yellow>"
|
||||||
warning.config.number.invalid_type: "<yellow>Issue found in file <arg:0> - The config '<arg:1>' is using an invalid number argument type '<arg:2>'.</yellow>"
|
warning.config.number.invalid_type: "<yellow>Issue found in file <arg:0> - The config '<arg:1>' is using an invalid number argument type '<arg:2>'.</yellow>"
|
||||||
@@ -173,6 +174,9 @@ warning.config.item.data.attribute_modifiers.missing_amount: "<yellow>Issue foun
|
|||||||
warning.config.item.data.attribute_modifiers.missing_operation: "<yellow>Issue found in file <arg:0> - The item '<arg:1>' is missing the required 'operation' argument for 'attribute-modifiers' data.</yellow>"
|
warning.config.item.data.attribute_modifiers.missing_operation: "<yellow>Issue found in file <arg:0> - The item '<arg:1>' is missing the required 'operation' argument for 'attribute-modifiers' data.</yellow>"
|
||||||
warning.config.item.data.attribute_modifiers.display.missing_type: "<yellow>Issue found in file <arg:0> - The item '<arg:1>' is missing the required 'type' argument for 'attribute-modifiers' display data.</yellow>"
|
warning.config.item.data.attribute_modifiers.display.missing_type: "<yellow>Issue found in file <arg:0> - The item '<arg:1>' is missing the required 'type' argument for 'attribute-modifiers' display data.</yellow>"
|
||||||
warning.config.item.data.attribute_modifiers.display.missing_value: "<yellow>Issue found in file <arg:0> - The item '<arg:1>' is missing the required 'value' argument for 'attribute-modifiers' display data.</yellow>"
|
warning.config.item.data.attribute_modifiers.display.missing_value: "<yellow>Issue found in file <arg:0> - The item '<arg:1>' is missing the required 'value' argument for 'attribute-modifiers' display data.</yellow>"
|
||||||
|
warning.config.item.data.external.missing_source: "<yellow>Issue found in file <arg:0> - The item '<arg:1>' is missing the required 'source' argument for 'external' data.</yellow>"
|
||||||
|
warning.config.item.data.external.missing_id: "<yellow>Issue found in file <arg:0> - The item '<arg:1>' is missing the required 'id' argument for 'external' data.</yellow>"
|
||||||
|
warning.config.item.data.external.invalid_source: "<yellow>Issue found in file <arg:0> - The item '<arg:1>' is using an invalid item source '<arg:2>' for 'external' data.</yellow>"
|
||||||
warning.config.item.missing_material: "<yellow>Issue found in file <arg:0> - The item '<arg:1>' is missing the required 'material' argument.</yellow>"
|
warning.config.item.missing_material: "<yellow>Issue found in file <arg:0> - The item '<arg:1>' is missing the required 'material' argument.</yellow>"
|
||||||
warning.config.item.invalid_material: "<yellow>Issue found in file <arg:0> - The item '<arg:1>' is using an invalid material type '<arg:2>'.</yellow>"
|
warning.config.item.invalid_material: "<yellow>Issue found in file <arg:0> - The item '<arg:1>' is using an invalid material type '<arg:2>'.</yellow>"
|
||||||
warning.config.item.invalid_custom_model_data: "<yellow>Issue found in file <arg:0> - The item '<arg:1>' is using a negative custom model data '<arg:2>' which is invalid.</yellow>"
|
warning.config.item.invalid_custom_model_data: "<yellow>Issue found in file <arg:0> - The item '<arg:1>' is using a negative custom model data '<arg:2>' which is invalid.</yellow>"
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ warning.config.type.boolean: "<yellow>在文件 <arg:0> 发现问题 - 无法加
|
|||||||
warning.config.type.double: "<yellow>在文件 <arg:0> 发现问题 - 无法加载 '<arg:1>': 无法将 '<arg:2>' 转换为双精度类型 (选项 '<arg:3>')</yellow>"
|
warning.config.type.double: "<yellow>在文件 <arg:0> 发现问题 - 无法加载 '<arg:1>': 无法将 '<arg:2>' 转换为双精度类型 (选项 '<arg:3>')</yellow>"
|
||||||
warning.config.type.quaternionf: "<yellow>在文件 <arg:0> 发现问题 - 无法加载 '<arg:1>': 无法将 '<arg:2>' 转换为四元数类型 (选项 '<arg:3>')</yellow>"
|
warning.config.type.quaternionf: "<yellow>在文件 <arg:0> 发现问题 - 无法加载 '<arg:1>': 无法将 '<arg:2>' 转换为四元数类型 (选项 '<arg:3>')</yellow>"
|
||||||
warning.config.type.vector3f: "<yellow>在文件 <arg:0> 发现问题 - 无法加载 '<arg:1>': 无法将 '<arg:2>' 转换为三维向量类型 (选项 '<arg:3>')</yellow>"
|
warning.config.type.vector3f: "<yellow>在文件 <arg:0> 发现问题 - 无法加载 '<arg:1>': 无法将 '<arg:2>' 转换为三维向量类型 (选项 '<arg:3>')</yellow>"
|
||||||
|
warning.config.type.map: "<yellow>在文件 <arg:0> 发现问题 - 无法加载 '<arg:1>': 无法将 '<arg:2>' 转换为映射类型 (选项 '<arg:3>')</yellow>"
|
||||||
warning.config.type.snbt.invalid_syntax: "<yellow>在文件 <arg:0> 发现问题 - 无法加载 '<arg:1>': 无效的 SNBT 语法 '<arg:2>'.</yellow>"
|
warning.config.type.snbt.invalid_syntax: "<yellow>在文件 <arg:0> 发现问题 - 无法加载 '<arg:1>': 无效的 SNBT 语法 '<arg:2>'.</yellow>"
|
||||||
warning.config.number.missing_type: "<yellow>在文件 <arg:0> 发现问题 - 配置项 '<arg:1>' 缺少数字类型所需的 'type' 参数</yellow>"
|
warning.config.number.missing_type: "<yellow>在文件 <arg:0> 发现问题 - 配置项 '<arg:1>' 缺少数字类型所需的 'type' 参数</yellow>"
|
||||||
warning.config.number.invalid_type: "<yellow>在文件 <arg:0> 发现问题 - 配置项 '<arg:1>' 使用了无效的数字类型 '<arg:2>'</yellow>"
|
warning.config.number.invalid_type: "<yellow>在文件 <arg:0> 发现问题 - 配置项 '<arg:1>' 使用了无效的数字类型 '<arg:2>'</yellow>"
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package net.momirealms.craftengine.core.attribute;
|
package net.momirealms.craftengine.core.attribute;
|
||||||
|
|
||||||
|
import net.kyori.adventure.text.Component;
|
||||||
import net.momirealms.craftengine.core.util.Key;
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
@@ -72,7 +73,7 @@ public class AttributeModifier {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public record Display(AttributeModifier.Display.Type type, String value) {
|
public record Display(AttributeModifier.Display.Type type, Component value) {
|
||||||
|
|
||||||
public enum Type {
|
public enum Type {
|
||||||
DEFAULT, HIDDEN, OVERRIDE
|
DEFAULT, HIDDEN, OVERRIDE
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.item;
|
|||||||
|
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
|
import net.momirealms.craftengine.core.attribute.AttributeModifier;
|
||||||
import net.momirealms.craftengine.core.item.behavior.ItemBehavior;
|
import net.momirealms.craftengine.core.item.behavior.ItemBehavior;
|
||||||
import net.momirealms.craftengine.core.item.data.Enchantment;
|
import net.momirealms.craftengine.core.item.data.Enchantment;
|
||||||
import net.momirealms.craftengine.core.item.data.FireworkExplosion;
|
import net.momirealms.craftengine.core.item.data.FireworkExplosion;
|
||||||
@@ -253,6 +254,12 @@ public class AbstractItem<W extends ItemWrapper<I>, I> implements Item<I> {
|
|||||||
return this.factory.loreComponent(this.item);
|
return this.factory.loreComponent(this.item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Item<I> attributeModifiers(List<AttributeModifier> modifiers) {
|
||||||
|
this.factory.attributeModifiers(this.item, modifiers);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Item<I> unbreakable(boolean unbreakable) {
|
public Item<I> unbreakable(boolean unbreakable) {
|
||||||
this.factory.unbreakable(this.item, unbreakable);
|
this.factory.unbreakable(this.item, unbreakable);
|
||||||
|
|||||||
@@ -2,16 +2,10 @@ package net.momirealms.craftengine.core.item;
|
|||||||
|
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import com.google.gson.JsonPrimitive;
|
import com.google.gson.JsonPrimitive;
|
||||||
import net.momirealms.craftengine.core.attribute.AttributeModifier;
|
|
||||||
import net.momirealms.craftengine.core.item.behavior.ItemBehavior;
|
import net.momirealms.craftengine.core.item.behavior.ItemBehavior;
|
||||||
import net.momirealms.craftengine.core.item.behavior.ItemBehaviors;
|
import net.momirealms.craftengine.core.item.behavior.ItemBehaviors;
|
||||||
import net.momirealms.craftengine.core.item.data.Enchantment;
|
|
||||||
import net.momirealms.craftengine.core.item.data.JukeboxPlayable;
|
|
||||||
import net.momirealms.craftengine.core.item.equipment.*;
|
import net.momirealms.craftengine.core.item.equipment.*;
|
||||||
import net.momirealms.craftengine.core.item.modifier.*;
|
import net.momirealms.craftengine.core.item.modifier.*;
|
||||||
import net.momirealms.craftengine.core.item.modifier.lore.DynamicLoreModifier;
|
|
||||||
import net.momirealms.craftengine.core.item.modifier.lore.LoreModifier;
|
|
||||||
import net.momirealms.craftengine.core.item.setting.EquipmentData;
|
|
||||||
import net.momirealms.craftengine.core.pack.AbstractPackManager;
|
import net.momirealms.craftengine.core.pack.AbstractPackManager;
|
||||||
import net.momirealms.craftengine.core.pack.LoadingSequence;
|
import net.momirealms.craftengine.core.pack.LoadingSequence;
|
||||||
import net.momirealms.craftengine.core.pack.Pack;
|
import net.momirealms.craftengine.core.pack.Pack;
|
||||||
@@ -21,27 +15,22 @@ import net.momirealms.craftengine.core.pack.model.generation.AbstractModelGenera
|
|||||||
import net.momirealms.craftengine.core.pack.model.generation.ModelGeneration;
|
import net.momirealms.craftengine.core.pack.model.generation.ModelGeneration;
|
||||||
import net.momirealms.craftengine.core.pack.model.select.ChargeTypeSelectProperty;
|
import net.momirealms.craftengine.core.pack.model.select.ChargeTypeSelectProperty;
|
||||||
import net.momirealms.craftengine.core.pack.model.select.TrimMaterialSelectProperty;
|
import net.momirealms.craftengine.core.pack.model.select.TrimMaterialSelectProperty;
|
||||||
import net.momirealms.craftengine.core.pack.obfuscation.ResourcePackGenerationException;
|
|
||||||
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
||||||
import net.momirealms.craftengine.core.plugin.config.Config;
|
import net.momirealms.craftengine.core.plugin.config.Config;
|
||||||
import net.momirealms.craftengine.core.plugin.config.ConfigParser;
|
import net.momirealms.craftengine.core.plugin.config.ConfigParser;
|
||||||
import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext;
|
import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext;
|
||||||
import net.momirealms.craftengine.core.plugin.context.event.EventFunctions;
|
import net.momirealms.craftengine.core.plugin.context.event.EventFunctions;
|
||||||
import net.momirealms.craftengine.core.plugin.context.event.EventTrigger;
|
import net.momirealms.craftengine.core.plugin.context.event.EventTrigger;
|
||||||
import net.momirealms.craftengine.core.plugin.context.text.TextProvider;
|
|
||||||
import net.momirealms.craftengine.core.plugin.context.text.TextProviders;
|
|
||||||
import net.momirealms.craftengine.core.plugin.locale.LocalizedException;
|
|
||||||
import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException;
|
import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException;
|
||||||
import net.momirealms.craftengine.core.plugin.locale.TranslationManager;
|
import net.momirealms.craftengine.core.plugin.locale.TranslationManager;
|
||||||
|
import net.momirealms.craftengine.core.registry.BuiltInRegistries;
|
||||||
import net.momirealms.craftengine.core.util.*;
|
import net.momirealms.craftengine.core.util.*;
|
||||||
import org.incendo.cloud.suggestion.Suggestion;
|
import org.incendo.cloud.suggestion.Suggestion;
|
||||||
import org.incendo.cloud.type.Either;
|
import org.incendo.cloud.type.Either;
|
||||||
import org.joml.Vector3f;
|
|
||||||
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Function;
|
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public abstract class AbstractItemManager<I> extends AbstractModelGenerator implements ItemManager<I> {
|
public abstract class AbstractItemManager<I> extends AbstractModelGenerator implements ItemManager<I> {
|
||||||
@@ -52,7 +41,6 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
|
|||||||
private final ItemParser itemParser;
|
private final ItemParser itemParser;
|
||||||
private final EquipmentParser equipmentParser;
|
private final EquipmentParser equipmentParser;
|
||||||
protected final Map<String, ExternalItemSource<I>> externalItemSources = new HashMap<>();
|
protected final Map<String, ExternalItemSource<I>> externalItemSources = new HashMap<>();
|
||||||
protected final Map<String, Function<Object, ItemDataModifier<I>>> dataFunctions = new HashMap<>();
|
|
||||||
protected final Map<Key, CustomItem<I>> customItems = new HashMap<>();
|
protected final Map<Key, CustomItem<I>> customItems = new HashMap<>();
|
||||||
protected final Map<Key, List<UniqueKey>> customItemTags = new HashMap<>();
|
protected final Map<Key, List<UniqueKey>> customItemTags = new HashMap<>();
|
||||||
protected final Map<Key, Map<Integer, Key>> cmdConflictChecker = new HashMap<>();
|
protected final Map<Key, Map<Integer, Key>> cmdConflictChecker = new HashMap<>();
|
||||||
@@ -69,14 +57,7 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
|
|||||||
super(plugin);
|
super(plugin);
|
||||||
this.itemParser = new ItemParser();
|
this.itemParser = new ItemParser();
|
||||||
this.equipmentParser = new EquipmentParser();
|
this.equipmentParser = new EquipmentParser();
|
||||||
this.registerFunctions();
|
ItemDataModifiers.init();
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void registerDataType(Function<Object, ItemDataModifier<I>> factory, String... alias) {
|
|
||||||
for (String a : alias) {
|
|
||||||
this.dataFunctions.put(a, factory);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static void registerVanillaItemExtraBehavior(ItemBehavior behavior, Key... items) {
|
protected static void registerVanillaItemExtraBehavior(ItemBehavior behavior, Key... items) {
|
||||||
@@ -85,23 +66,23 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void applyDataFunctions(Map<String, Object> dataSection, Consumer<ItemDataModifier<I>> consumer) {
|
@SuppressWarnings("unchecked")
|
||||||
|
protected void applyDataModifiers(Map<String, Object> dataSection, Consumer<ItemDataModifier<I>> callback) {
|
||||||
|
ExceptionCollector<LocalizedResourceConfigException> errorCollector = new ExceptionCollector<>();
|
||||||
if (dataSection != null) {
|
if (dataSection != null) {
|
||||||
for (Map.Entry<String, Object> dataEntry : dataSection.entrySet()) {
|
for (Map.Entry<String, Object> dataEntry : dataSection.entrySet()) {
|
||||||
Optional.ofNullable(this.dataFunctions.get(dataEntry.getKey())).ifPresent(function -> {
|
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 -> {
|
||||||
try {
|
try {
|
||||||
consumer.accept(function.apply(dataEntry.getValue()));
|
callback.accept((ItemDataModifier<I>) factory.create(value));
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (LocalizedResourceConfigException e) {
|
||||||
this.plugin.logger().warn("Invalid data format", e);
|
errorCollector.add(e);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
errorCollector.throwIfPresent();
|
||||||
|
|
||||||
@Override
|
|
||||||
public Function<Object, ItemDataModifier<I>> getDataType(String key) {
|
|
||||||
return this.dataFunctions.get(key);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -338,8 +319,6 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
|
|||||||
throw new LocalizedResourceConfigException("warning.config.item.duplicate");
|
throw new LocalizedResourceConfigException("warning.config.item.duplicate");
|
||||||
}
|
}
|
||||||
|
|
||||||
ExceptionCollector<LocalizedResourceConfigException> collector = new ExceptionCollector<>();
|
|
||||||
|
|
||||||
UniqueKey uniqueId = UniqueKey.create(id);
|
UniqueKey uniqueId = UniqueKey.create(id);
|
||||||
// 判断是不是原版物品
|
// 判断是不是原版物品
|
||||||
boolean isVanillaItem = isVanillaItem(id);
|
boolean isVanillaItem = isVanillaItem(id);
|
||||||
@@ -386,21 +365,26 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
|
|||||||
else itemBuilder.dataModifier(new ItemModelModifier<>(itemModelKey));
|
else itemBuilder.dataModifier(new ItemModelModifier<>(itemModelKey));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 对于不重要的配置,可以仅警告,不返回
|
||||||
|
ExceptionCollector<LocalizedResourceConfigException> collector = new ExceptionCollector<>();
|
||||||
|
|
||||||
// 应用物品数据
|
// 应用物品数据
|
||||||
try {
|
try {
|
||||||
applyDataFunctions(MiscUtils.castToMap(section.get("data"), true), itemBuilder::dataModifier);
|
applyDataModifiers(MiscUtils.castToMap(section.get("data"), true), itemBuilder::dataModifier);
|
||||||
} catch (LocalizedResourceConfigException e) {
|
} catch (LocalizedResourceConfigException e) {
|
||||||
collector.add(e);
|
collector.add(e);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
applyDataFunctions(MiscUtils.castToMap(section.get("client-bound-data"), true), itemBuilder::clientBoundDataModifier);
|
applyDataModifiers(MiscUtils.castToMap(section.get("client-bound-data"), true), itemBuilder::clientBoundDataModifier);
|
||||||
} catch (LocalizedResourceConfigException e) {
|
} catch (LocalizedResourceConfigException e) {
|
||||||
collector.add(e);
|
collector.add(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果不是原版物品,那么加入ce的标识符
|
// 如果不是原版物品,那么加入ce的标识符
|
||||||
if (!isVanillaItem)
|
if (!isVanillaItem)
|
||||||
itemBuilder.dataModifier(new IdModifier<>(id));
|
itemBuilder.dataModifier(new IdModifier<>(id));
|
||||||
|
|
||||||
|
// 事件
|
||||||
Map<EventTrigger, List<net.momirealms.craftengine.core.plugin.context.function.Function<PlayerOptionalContext>>> eventTriggerListMap;
|
Map<EventTrigger, List<net.momirealms.craftengine.core.plugin.context.function.Function<PlayerOptionalContext>>> eventTriggerListMap;
|
||||||
try {
|
try {
|
||||||
eventTriggerListMap = EventFunctions.parseEvents(ResourceConfigUtils.get(section, "events", "event"));
|
eventTriggerListMap = EventFunctions.parseEvents(ResourceConfigUtils.get(section, "events", "event"));
|
||||||
@@ -409,6 +393,7 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
|
|||||||
eventTriggerListMap = Map.of();
|
eventTriggerListMap = Map.of();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 设置
|
||||||
ItemSettings settings;
|
ItemSettings settings;
|
||||||
try {
|
try {
|
||||||
settings = Optional.ofNullable(ResourceConfigUtils.get(section, "settings"))
|
settings = Optional.ofNullable(ResourceConfigUtils.get(section, "settings"))
|
||||||
@@ -419,12 +404,23 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
|
|||||||
collector.add(e);
|
collector.add(e);
|
||||||
settings = ItemSettings.of().canPlaceRelatedVanillaBlock(isVanillaItem);
|
settings = ItemSettings.of().canPlaceRelatedVanillaBlock(isVanillaItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 行为
|
||||||
|
List<ItemBehavior> behaviors;
|
||||||
|
try {
|
||||||
|
behaviors = ItemBehaviors.fromObj(pack, path, id, ResourceConfigUtils.get(section, "behavior", "behaviors"));
|
||||||
|
} catch (LocalizedResourceConfigException e) {
|
||||||
|
collector.add(e);
|
||||||
|
behaviors = Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
// 构建自定义物品
|
// 构建自定义物品
|
||||||
CustomItem<I> customItem = itemBuilder
|
CustomItem<I> customItem = itemBuilder
|
||||||
.behaviors(ItemBehaviors.fromObj(pack, path, id, ResourceConfigUtils.get(section, "behavior", "behaviors")))
|
.behaviors(behaviors)
|
||||||
.settings(settings)
|
.settings(settings)
|
||||||
.events(eventTriggerListMap)
|
.events(eventTriggerListMap)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
// 添加到缓存
|
// 添加到缓存
|
||||||
addCustomItem(customItem);
|
addCustomItem(customItem);
|
||||||
|
|
||||||
@@ -433,13 +429,11 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
|
|||||||
AbstractItemManager.this.plugin.itemBrowserManager().addExternalCategoryMember(id, MiscUtils.getAsStringList(section.get("category")).stream().map(Key::of).toList());
|
AbstractItemManager.this.plugin.itemBrowserManager().addExternalCategoryMember(id, MiscUtils.getAsStringList(section.get("category")).stream().map(Key::of).toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
// 抛出异常
|
|
||||||
collector.throwIfPresent();
|
|
||||||
|
|
||||||
// 模型配置区域,如果这里被配置了,那么用户必须要配置custom-model-data或item-model
|
// 模型配置区域,如果这里被配置了,那么用户必须要配置custom-model-data或item-model
|
||||||
Map<String, Object> modelSection = MiscUtils.castToMap(section.get("model"), true);
|
Map<String, Object> modelSection = MiscUtils.castToMap(section.get("model"), true);
|
||||||
Map<String, Object> legacyModelSection = MiscUtils.castToMap(section.get("legacy-model"), true);
|
Map<String, Object> legacyModelSection = MiscUtils.castToMap(section.get("legacy-model"), true);
|
||||||
if (modelSection == null && legacyModelSection == null) {
|
if (modelSection == null && legacyModelSection == null) {
|
||||||
|
collector.throwIfPresent();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -448,39 +442,47 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
|
|||||||
if (!isVanillaItem) {
|
if (!isVanillaItem) {
|
||||||
// 既没有模型值也没有item-model
|
// 既没有模型值也没有item-model
|
||||||
if (customModelData == 0 && itemModelKey == null) {
|
if (customModelData == 0 && itemModelKey == null) {
|
||||||
throw new LocalizedResourceConfigException("warning.config.item.missing_model_id");
|
collector.addAndThrow(new LocalizedResourceConfigException("warning.config.item.missing_model_id"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1.21.4+必须要配置model区域,如果不需要高版本兼容,则可以只写legacy-model
|
|
||||||
if (needsModelSection && modelSection == null) {
|
|
||||||
throw new LocalizedResourceConfigException("warning.config.item.missing_model");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 新版格式
|
// 新版格式
|
||||||
ItemModel modernModel = null;
|
ItemModel modernModel = null;
|
||||||
// 旧版格式
|
// 旧版格式
|
||||||
TreeSet<LegacyOverridesModel> legacyOverridesModels = null;
|
TreeSet<LegacyOverridesModel> legacyOverridesModels = null;
|
||||||
// 如果需要支持新版item model 或者用户需要旧版本兼容,但是没配置legacy-model
|
// 如果需要支持新版item model 或者用户需要旧版本兼容,但是没配置legacy-model
|
||||||
if (needsModelSection) {
|
if (needsModelSection) {
|
||||||
|
// 1.21.4+必须要配置model区域,如果不需要高版本兼容,则可以只写legacy-model
|
||||||
|
if (modelSection == null) {
|
||||||
|
collector.addAndThrow(new LocalizedResourceConfigException("warning.config.item.missing_model"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
modernModel = ItemModels.fromMap(modelSection);
|
modernModel = ItemModels.fromMap(modelSection);
|
||||||
for (ModelGeneration generation : modernModel.modelsToGenerate()) {
|
for (ModelGeneration generation : modernModel.modelsToGenerate()) {
|
||||||
prepareModelGeneration(generation);
|
prepareModelGeneration(generation);
|
||||||
}
|
}
|
||||||
|
} catch (LocalizedResourceConfigException e) {
|
||||||
|
collector.addAndThrow(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// 如果需要旧版本兼容
|
// 如果需要旧版本兼容
|
||||||
if (needsLegacyCompatibility()) {
|
if (needsLegacyCompatibility()) {
|
||||||
if (legacyModelSection != null) {
|
if (legacyModelSection != null) {
|
||||||
|
try {
|
||||||
LegacyItemModel legacyItemModel = LegacyItemModel.fromMap(legacyModelSection, customModelData);
|
LegacyItemModel legacyItemModel = LegacyItemModel.fromMap(legacyModelSection, customModelData);
|
||||||
for (ModelGeneration generation : legacyItemModel.modelsToGenerate()) {
|
for (ModelGeneration generation : legacyItemModel.modelsToGenerate()) {
|
||||||
prepareModelGeneration(generation);
|
prepareModelGeneration(generation);
|
||||||
}
|
}
|
||||||
legacyOverridesModels = new TreeSet<>(legacyItemModel.overrides());
|
legacyOverridesModels = new TreeSet<>(legacyItemModel.overrides());
|
||||||
|
} catch (LocalizedResourceConfigException e) {
|
||||||
|
collector.addAndThrow(e);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
legacyOverridesModels = new TreeSet<>();
|
legacyOverridesModels = new TreeSet<>();
|
||||||
processModelRecursively(modernModel, new LinkedHashMap<>(), legacyOverridesModels, clientBoundMaterial, customModelData);
|
processModelRecursively(modernModel, new LinkedHashMap<>(), legacyOverridesModels, clientBoundMaterial, customModelData);
|
||||||
if (legacyOverridesModels.isEmpty()) {
|
if (legacyOverridesModels.isEmpty()) {
|
||||||
TranslationManager.instance().log("warning.config.item.legacy_model.cannot_convert", path.toString(), id.asString());
|
collector.add(new LocalizedResourceConfigException("warning.config.item.legacy_model.cannot_convert", path.toString(), id.asString()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -496,7 +498,7 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
|
|||||||
// 检查cmd冲突
|
// 检查cmd冲突
|
||||||
Map<Integer, Key> conflict = AbstractItemManager.this.cmdConflictChecker.computeIfAbsent(finalBaseModel, k -> new HashMap<>());
|
Map<Integer, Key> conflict = AbstractItemManager.this.cmdConflictChecker.computeIfAbsent(finalBaseModel, k -> new HashMap<>());
|
||||||
if (conflict.containsKey(customModelData)) {
|
if (conflict.containsKey(customModelData)) {
|
||||||
throw new LocalizedResourceConfigException("warning.config.item.custom_model_data_conflict", String.valueOf(customModelData), conflict.get(customModelData).toString());
|
collector.addAndThrow(new LocalizedResourceConfigException("warning.config.item.custom_model_data_conflict", String.valueOf(customModelData), conflict.get(customModelData).toString()));
|
||||||
}
|
}
|
||||||
conflict.put(customModelData, id);
|
conflict.put(customModelData, id);
|
||||||
// 添加新版item model
|
// 添加新版item model
|
||||||
@@ -514,7 +516,7 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
|
|||||||
lom.addAll(legacyOverridesModels);
|
lom.addAll(legacyOverridesModels);
|
||||||
}
|
}
|
||||||
} else if (isVanillaItemModel) {
|
} else if (isVanillaItemModel) {
|
||||||
throw new LocalizedResourceConfigException("warning.config.item.item_model.conflict", itemModelKey.asString());
|
collector.addAndThrow(new LocalizedResourceConfigException("warning.config.item.item_model.conflict", itemModelKey.asString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 使用了item-model组件,且不是原版物品的
|
// 使用了item-model组件,且不是原版物品的
|
||||||
@@ -541,157 +543,9 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void registerFunctions() {
|
// 抛出异常
|
||||||
registerDataType((obj) -> {
|
collector.throwIfPresent();
|
||||||
Map<String, Object> data = MiscUtils.castToMap(obj, false);
|
|
||||||
String plugin = data.get("plugin").toString();
|
|
||||||
String id = data.get("id").toString();
|
|
||||||
ExternalItemSource<I> provider = AbstractItemManager.this.getExternalItemSource(plugin.toLowerCase(Locale.ENGLISH));
|
|
||||||
return new ExternalModifier<>(id, Objects.requireNonNull(provider, "Item provider " + plugin + " not found"));
|
|
||||||
}, "external");
|
|
||||||
if (VersionHelper.isOrAbove1_20_5()) {
|
|
||||||
registerDataType((obj) -> {
|
|
||||||
String name = obj.toString();
|
|
||||||
return new CustomNameModifier<>(name);
|
|
||||||
}, "custom-name");
|
|
||||||
registerDataType((obj) -> {
|
|
||||||
String name = obj.toString();
|
|
||||||
return new ItemNameModifier<>(name);
|
|
||||||
}, "item-name", "display-name");
|
|
||||||
} else {
|
|
||||||
registerDataType((obj) -> {
|
|
||||||
String name = obj.toString();
|
|
||||||
return new CustomNameModifier<>(name);
|
|
||||||
}, "custom-name", "item-name", "display-name");
|
|
||||||
}
|
|
||||||
registerDataType(LoreModifier::createLoreModifier, "lore", "display-lore", "description");
|
|
||||||
registerDataType((obj) -> {
|
|
||||||
Map<String, LoreModifier<I>> dynamicLore = new LinkedHashMap<>();
|
|
||||||
if (obj instanceof Map<?, ?> map) {
|
|
||||||
for (Map.Entry<?, ?> entry : map.entrySet()) {
|
|
||||||
dynamicLore.put(entry.getKey().toString(), LoreModifier.createLoreModifier(entry.getValue()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new DynamicLoreModifier<>(dynamicLore);
|
|
||||||
}, "dynamic-lore");
|
|
||||||
registerDataType((obj) -> {
|
|
||||||
if (obj instanceof Integer integer) {
|
|
||||||
return new DyedColorModifier<>(Color.fromDecimal(integer));
|
|
||||||
} else {
|
|
||||||
Vector3f vector3f = MiscUtils.getAsVector3f(obj, "dyed-color");
|
|
||||||
return new DyedColorModifier<>(Color.fromVector3f(vector3f));
|
|
||||||
}
|
|
||||||
}, "dyed-color");
|
|
||||||
registerDataType((obj) -> {
|
|
||||||
Map<String, Object> data = MiscUtils.castToMap(obj, false);
|
|
||||||
return new TagsModifier<>(data);
|
|
||||||
}, "tags", "tag", "nbt");
|
|
||||||
registerDataType((object -> {
|
|
||||||
MutableInt mutableInt = new MutableInt(0);
|
|
||||||
List<AttributeModifier> attributeModifiers = ResourceConfigUtils.parseConfigAsList(object, (map) -> {
|
|
||||||
String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.item.data.attribute_modifiers.missing_type");
|
|
||||||
Key nativeType = AttributeModifiersModifier.getNativeAttributeName(Key.of(type));
|
|
||||||
AttributeModifier.Slot slot = AttributeModifier.Slot.valueOf(map.getOrDefault("slot", "any").toString().toUpperCase(Locale.ENGLISH));
|
|
||||||
Key id = Optional.ofNullable(map.get("id")).map(String::valueOf).map(Key::of).orElseGet(() -> {
|
|
||||||
mutableInt.add(1);
|
|
||||||
return Key.of("craftengine", "modifier_" + mutableInt.intValue());
|
|
||||||
});
|
|
||||||
double amount = ResourceConfigUtils.getAsDouble(
|
|
||||||
ResourceConfigUtils.requireNonNullOrThrow(map.get("amount"), "warning.config.item.data.attribute_modifiers.missing_amount"), "amount"
|
|
||||||
);
|
|
||||||
AttributeModifier.Operation operation = AttributeModifier.Operation.valueOf(
|
|
||||||
ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("operation"), "warning.config.item.data.attribute_modifiers.missing_operation").toUpperCase(Locale.ENGLISH)
|
|
||||||
);
|
|
||||||
AttributeModifier.Display display = null;
|
|
||||||
if (VersionHelper.isOrAbove1_21_6() && map.containsKey("display")) {
|
|
||||||
Map<String, Object> displayMap = MiscUtils.castToMap(map.get("display"), false);
|
|
||||||
AttributeModifier.Display.Type displayType = AttributeModifier.Display.Type.valueOf(ResourceConfigUtils.requireNonEmptyStringOrThrow(displayMap.get("type"), "warning.config.item.data.attribute_modifiers.display.missing_type").toUpperCase(Locale.ENGLISH));
|
|
||||||
if (displayType == AttributeModifier.Display.Type.OVERRIDE) {
|
|
||||||
String miniMessageValue = ResourceConfigUtils.requireNonEmptyStringOrThrow(displayMap.get("value"), "warning.config.item.data.attribute_modifiers.display.missing_value");
|
|
||||||
display = new AttributeModifier.Display(displayType, miniMessageValue);
|
|
||||||
} else {
|
|
||||||
display = new AttributeModifier.Display(displayType, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new AttributeModifier(nativeType.value(), slot, id,
|
|
||||||
amount, operation, display);
|
|
||||||
});
|
|
||||||
return new AttributeModifiersModifier<>(attributeModifiers);
|
|
||||||
}), "attributes", "attribute-modifiers", "attribute-modifier");
|
|
||||||
registerDataType((obj) -> {
|
|
||||||
boolean value = TypeUtils.checkType(obj, Boolean.class);
|
|
||||||
return new UnbreakableModifier<>(value);
|
|
||||||
}, "unbreakable");
|
|
||||||
registerDataType((obj) -> {
|
|
||||||
int customModelData = ResourceConfigUtils.getAsInt(obj, "custom-model-data");
|
|
||||||
return new CustomModelDataModifier<>(customModelData);
|
|
||||||
}, "custom-model-data");
|
|
||||||
registerDataType((obj) -> {
|
|
||||||
Map<String, Object> data = MiscUtils.castToMap(obj, false);
|
|
||||||
List<Enchantment> enchantments = new ArrayList<>();
|
|
||||||
for (Map.Entry<String, Object> e : data.entrySet()) {
|
|
||||||
if (e.getValue() instanceof Number number) {
|
|
||||||
enchantments.add(new Enchantment(Key.of(e.getKey()), number.intValue()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new EnchantmentModifier<>(enchantments);
|
|
||||||
}, "enchantment", "enchantments", "enchant");
|
|
||||||
registerDataType((obj) -> {
|
|
||||||
Map<String, Object> data = MiscUtils.castToMap(obj, false);
|
|
||||||
String material = data.get("material").toString().toLowerCase(Locale.ENGLISH);
|
|
||||||
String pattern = data.get("pattern").toString().toLowerCase(Locale.ENGLISH);
|
|
||||||
return new TrimModifier<>(Key.of(material), Key.of(pattern));
|
|
||||||
}, "trim");
|
|
||||||
registerDataType((obj) -> {
|
|
||||||
List<Key> components = MiscUtils.getAsStringList(obj).stream().map(Key::of).toList();
|
|
||||||
return new HideTooltipModifier<>(components);
|
|
||||||
}, "hide-tooltip", "hide-flags");
|
|
||||||
registerDataType((obj) -> {
|
|
||||||
Map<String, Object> data = MiscUtils.castToMap(obj, false);
|
|
||||||
Map<String, TextProvider> arguments = new HashMap<>();
|
|
||||||
for (Map.Entry<String, Object> entry : data.entrySet()) {
|
|
||||||
arguments.put(entry.getKey(), TextProviders.fromString(entry.getValue().toString()));
|
|
||||||
}
|
|
||||||
return new ArgumentModifier<>(arguments);
|
|
||||||
}, "args", "argument", "arguments");
|
|
||||||
if (VersionHelper.isOrAbove1_20_5()) {
|
|
||||||
registerDataType((obj) -> {
|
|
||||||
Map<String, Object> data = MiscUtils.castToMap(obj, false);
|
|
||||||
return new ComponentModifier<>(data);
|
|
||||||
}, "components", "component");
|
|
||||||
registerDataType((obj) -> {
|
|
||||||
List<String> data = MiscUtils.getAsStringList(obj);
|
|
||||||
return new RemoveComponentModifier<>(data);
|
|
||||||
}, "remove-components", "remove-component");
|
|
||||||
registerDataType((obj) -> {
|
|
||||||
Map<String, Object> data = MiscUtils.castToMap(obj, false);
|
|
||||||
int nutrition = ResourceConfigUtils.getAsInt(data.get("nutrition"), "nutrition");
|
|
||||||
float saturation = ResourceConfigUtils.getAsFloat(data.get("saturation"), "saturation");
|
|
||||||
return new FoodModifier<>(nutrition, saturation, ResourceConfigUtils.getAsBoolean(data.getOrDefault("can-always-eat", false), "can-always-eat"));
|
|
||||||
}, "food");
|
|
||||||
}
|
|
||||||
if (VersionHelper.isOrAbove1_21()) {
|
|
||||||
registerDataType((obj) -> {
|
|
||||||
String song = obj.toString();
|
|
||||||
return new JukeboxSongModifier<>(new JukeboxPlayable(song, true));
|
|
||||||
}, "jukebox-playable");
|
|
||||||
}
|
|
||||||
if (VersionHelper.isOrAbove1_21_2()) {
|
|
||||||
registerDataType((obj) -> {
|
|
||||||
String id = obj.toString();
|
|
||||||
return new TooltipStyleModifier<>(Key.of(id));
|
|
||||||
}, "tooltip-style");
|
|
||||||
registerDataType((obj) -> {
|
|
||||||
Map<String, Object> data = MiscUtils.castToMap(obj, false);
|
|
||||||
return new EquippableModifier<>(EquipmentData.fromMap(data));
|
|
||||||
}, "equippable");
|
|
||||||
registerDataType((obj) -> {
|
|
||||||
String id = obj.toString();
|
|
||||||
return new ItemModelModifier<>(Key.of(id));
|
|
||||||
}, "item-model");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.item;
|
|||||||
|
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
|
import net.momirealms.craftengine.core.attribute.AttributeModifier;
|
||||||
import net.momirealms.craftengine.core.item.behavior.ItemBehavior;
|
import net.momirealms.craftengine.core.item.behavior.ItemBehavior;
|
||||||
import net.momirealms.craftengine.core.item.data.Enchantment;
|
import net.momirealms.craftengine.core.item.data.Enchantment;
|
||||||
import net.momirealms.craftengine.core.item.data.FireworkExplosion;
|
import net.momirealms.craftengine.core.item.data.FireworkExplosion;
|
||||||
@@ -119,6 +120,8 @@ public interface Item<I> {
|
|||||||
|
|
||||||
Optional<List<Component>> loreComponent();
|
Optional<List<Component>> loreComponent();
|
||||||
|
|
||||||
|
Item<I> attributeModifiers(List<AttributeModifier> modifiers);
|
||||||
|
|
||||||
Optional<JukeboxPlayable> jukeboxSong();
|
Optional<JukeboxPlayable> jukeboxSong();
|
||||||
|
|
||||||
Item<I> jukeboxSong(JukeboxPlayable song);
|
Item<I> jukeboxSong(JukeboxPlayable song);
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package net.momirealms.craftengine.core.item;
|
||||||
|
|
||||||
|
import net.momirealms.craftengine.core.item.modifier.ItemDataModifier;
|
||||||
|
|
||||||
|
public interface ItemDataModifierFactory<I> {
|
||||||
|
|
||||||
|
ItemDataModifier<I> create(Object arg);
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.item;
|
|||||||
|
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
|
import net.momirealms.craftengine.core.attribute.AttributeModifier;
|
||||||
import net.momirealms.craftengine.core.item.data.Enchantment;
|
import net.momirealms.craftengine.core.item.data.Enchantment;
|
||||||
import net.momirealms.craftengine.core.item.data.FireworkExplosion;
|
import net.momirealms.craftengine.core.item.data.FireworkExplosion;
|
||||||
import net.momirealms.craftengine.core.item.data.JukeboxPlayable;
|
import net.momirealms.craftengine.core.item.data.JukeboxPlayable;
|
||||||
@@ -215,4 +216,6 @@ public abstract class ItemFactory<W extends ItemWrapper<I>, I> {
|
|||||||
protected abstract boolean isDyeItem(W item);
|
protected abstract boolean isDyeItem(W item);
|
||||||
|
|
||||||
protected abstract Optional<Color> dyeColor(W item);
|
protected abstract Optional<Color> dyeColor(W item);
|
||||||
|
|
||||||
|
protected abstract void attributeModifiers(W item, List<AttributeModifier> modifiers);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package net.momirealms.craftengine.core.item;
|
|||||||
import net.momirealms.craftengine.core.entity.player.Player;
|
import net.momirealms.craftengine.core.entity.player.Player;
|
||||||
import net.momirealms.craftengine.core.item.behavior.ItemBehavior;
|
import net.momirealms.craftengine.core.item.behavior.ItemBehavior;
|
||||||
import net.momirealms.craftengine.core.item.equipment.Equipment;
|
import net.momirealms.craftengine.core.item.equipment.Equipment;
|
||||||
import net.momirealms.craftengine.core.item.modifier.ItemDataModifier;
|
|
||||||
import net.momirealms.craftengine.core.item.recipe.UniqueIdItem;
|
import net.momirealms.craftengine.core.item.recipe.UniqueIdItem;
|
||||||
import net.momirealms.craftengine.core.pack.model.LegacyOverridesModel;
|
import net.momirealms.craftengine.core.pack.model.LegacyOverridesModel;
|
||||||
import net.momirealms.craftengine.core.pack.model.ModernItemModel;
|
import net.momirealms.craftengine.core.pack.model.ModernItemModel;
|
||||||
@@ -18,14 +17,9 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.function.Function;
|
|
||||||
|
|
||||||
public interface ItemManager<T> extends Manageable, ModelGenerator {
|
public interface ItemManager<T> extends Manageable, ModelGenerator {
|
||||||
|
|
||||||
void registerDataType(Function<Object, ItemDataModifier<T>> factory, String... alias);
|
|
||||||
|
|
||||||
Function<Object, ItemDataModifier<T>> getDataType(String key);
|
|
||||||
|
|
||||||
Map<Key, Equipment> equipments();
|
Map<Key, Equipment> equipments();
|
||||||
|
|
||||||
ConfigParser[] parsers();
|
ConfigParser[] parsers();
|
||||||
|
|||||||
@@ -3,7 +3,11 @@ package net.momirealms.craftengine.core.item.modifier;
|
|||||||
import net.momirealms.craftengine.core.item.ComponentKeys;
|
import net.momirealms.craftengine.core.item.ComponentKeys;
|
||||||
import net.momirealms.craftengine.core.item.Item;
|
import net.momirealms.craftengine.core.item.Item;
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
||||||
|
import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
|
||||||
import net.momirealms.craftengine.core.plugin.context.text.TextProvider;
|
import net.momirealms.craftengine.core.plugin.context.text.TextProvider;
|
||||||
|
import net.momirealms.craftengine.core.plugin.context.text.TextProviders;
|
||||||
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
|
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
|
||||||
import net.momirealms.craftengine.core.util.VersionHelper;
|
import net.momirealms.craftengine.core.util.VersionHelper;
|
||||||
import net.momirealms.sparrow.nbt.CompoundTag;
|
import net.momirealms.sparrow.nbt.CompoundTag;
|
||||||
import net.momirealms.sparrow.nbt.StringTag;
|
import net.momirealms.sparrow.nbt.StringTag;
|
||||||
@@ -12,17 +16,22 @@ import java.util.HashMap;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
public class ArgumentModifier<I> implements ItemDataModifier<I> {
|
public class ArgumentsModifier<I> implements ItemDataModifier<I> {
|
||||||
|
public static final Factory<?> FACTORY = new Factory<>();
|
||||||
public static final String ARGUMENTS_TAG = "craftengine:arguments";
|
public static final String ARGUMENTS_TAG = "craftengine:arguments";
|
||||||
private final Map<String, TextProvider> arguments;
|
private final Map<String, TextProvider> arguments;
|
||||||
|
|
||||||
public ArgumentModifier(Map<String, TextProvider> arguments) {
|
public ArgumentsModifier(Map<String, TextProvider> arguments) {
|
||||||
this.arguments = arguments;
|
this.arguments = arguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Map<String, TextProvider> arguments() {
|
||||||
|
return arguments;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String name() {
|
public Key type() {
|
||||||
return "arguments";
|
return ItemDataModifiers.ARGUMENTS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -44,4 +53,17 @@ public class ArgumentModifier<I> implements ItemDataModifier<I> {
|
|||||||
}
|
}
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class Factory<I> implements ItemDataModifierFactory<I> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemDataModifier<I> create(Object arg) {
|
||||||
|
Map<String, Object> data = ResourceConfigUtils.getAsMap(arg, "arguments");
|
||||||
|
Map<String, TextProvider> arguments = new HashMap<>();
|
||||||
|
for (Map.Entry<String, Object> entry : data.entrySet()) {
|
||||||
|
arguments.put(entry.getKey(), TextProviders.fromString(entry.getValue().toString()));
|
||||||
|
}
|
||||||
|
return new ArgumentsModifier<>(arguments);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -6,19 +6,14 @@ import net.momirealms.craftengine.core.attribute.Attributes1_21;
|
|||||||
import net.momirealms.craftengine.core.item.ComponentKeys;
|
import net.momirealms.craftengine.core.item.ComponentKeys;
|
||||||
import net.momirealms.craftengine.core.item.Item;
|
import net.momirealms.craftengine.core.item.Item;
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
||||||
import net.momirealms.craftengine.core.item.NetworkItemHandler;
|
import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
|
||||||
import net.momirealms.craftengine.core.util.AdventureHelper;
|
import net.momirealms.craftengine.core.util.*;
|
||||||
import net.momirealms.craftengine.core.util.Key;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import net.momirealms.craftengine.core.util.UUIDUtils;
|
|
||||||
import net.momirealms.craftengine.core.util.VersionHelper;
|
|
||||||
import net.momirealms.sparrow.nbt.CompoundTag;
|
|
||||||
import net.momirealms.sparrow.nbt.ListTag;
|
|
||||||
import net.momirealms.sparrow.nbt.Tag;
|
|
||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
public class AttributeModifiersModifier<I> implements ItemDataModifier<I> {
|
public class AttributeModifiersModifier<I> implements SimpleNetworkItemDataModifier<I> {
|
||||||
|
public static final Factory<?> FACTORY = new Factory<>();
|
||||||
public static final Map<Key, Key> CONVERTOR = new HashMap<>();
|
public static final Map<Key, Key> CONVERTOR = new HashMap<>();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
@@ -102,89 +97,64 @@ public class AttributeModifiersModifier<I> implements ItemDataModifier<I> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String name() {
|
public Key type() {
|
||||||
return "attribute-modifiers";
|
return ItemDataModifiers.ATTRIBUTE_MODIFIERS;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Object previous;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Item<I> apply(Item<I> item, ItemBuildContext context) {
|
public Item<I> apply(Item<I> item, ItemBuildContext context) {
|
||||||
if (VersionHelper.isOrAbove1_21_5()) {
|
return item.attributeModifiers(this.modifiers);
|
||||||
ListTag modifiers = new ListTag();
|
|
||||||
for (AttributeModifier modifier : this.modifiers) {
|
|
||||||
CompoundTag modifierTag = new CompoundTag();
|
|
||||||
modifierTag.putString("type", modifier.type());
|
|
||||||
modifierTag.putString("slot", modifier.slot().name().toLowerCase(Locale.ENGLISH));
|
|
||||||
modifierTag.putString("id", modifier.id().toString());
|
|
||||||
modifierTag.putDouble("amount", modifier.amount());
|
|
||||||
modifierTag.putString("operation", modifier.operation().id());
|
|
||||||
AttributeModifier.Display display = modifier.display();
|
|
||||||
if (VersionHelper.isOrAbove1_21_6() && display != null) {
|
|
||||||
CompoundTag displayTag = new CompoundTag();
|
|
||||||
AttributeModifier.Display.Type displayType = display.type();
|
|
||||||
displayTag.putString("type", displayType.name().toLowerCase(Locale.ENGLISH));
|
|
||||||
if (displayType == AttributeModifier.Display.Type.OVERRIDE) {
|
|
||||||
displayTag.put("value", AdventureHelper.componentToTag(AdventureHelper.miniMessage().deserialize(display.value(), context.tagResolvers())));
|
|
||||||
}
|
|
||||||
modifierTag.put("display", displayTag);
|
|
||||||
}
|
|
||||||
modifiers.add(modifierTag);
|
|
||||||
}
|
|
||||||
item.setNBTComponent(ComponentKeys.ATTRIBUTE_MODIFIERS, modifiers);
|
|
||||||
} else if (VersionHelper.isOrAbove1_20_5()) {
|
|
||||||
CompoundTag compoundTag = (CompoundTag) Optional.ofNullable(item.getSparrowNBTComponent(ComponentKeys.ATTRIBUTE_MODIFIERS)).orElseGet(CompoundTag::new);
|
|
||||||
ListTag modifiers = new ListTag();
|
|
||||||
compoundTag.put("modifiers", modifiers);
|
|
||||||
for (AttributeModifier modifier : this.modifiers) {
|
|
||||||
CompoundTag modifierTag = new CompoundTag();
|
|
||||||
modifierTag.putString("type", modifier.type());
|
|
||||||
modifierTag.putString("slot", modifier.slot().name().toLowerCase(Locale.ENGLISH));
|
|
||||||
if (VersionHelper.isOrAbove1_21()) {
|
|
||||||
modifierTag.putString("id", modifier.id().toString());
|
|
||||||
} else {
|
|
||||||
modifierTag.putIntArray("uuid", UUIDUtils.uuidToIntArray(UUID.nameUUIDFromBytes(modifier.id().toString().getBytes(StandardCharsets.UTF_8))));
|
|
||||||
modifierTag.putString("name", modifier.id().toString());
|
|
||||||
}
|
|
||||||
modifierTag.putDouble("amount", modifier.amount());
|
|
||||||
modifierTag.putString("operation", modifier.operation().id());
|
|
||||||
modifiers.add(modifierTag);
|
|
||||||
}
|
|
||||||
item.setNBTComponent(ComponentKeys.ATTRIBUTE_MODIFIERS, compoundTag);
|
|
||||||
} else {
|
|
||||||
ListTag listTag = new ListTag();
|
|
||||||
for (AttributeModifier modifier : this.modifiers) {
|
|
||||||
CompoundTag modifierTag = new CompoundTag();
|
|
||||||
modifierTag.putString("AttributeName", modifier.type());
|
|
||||||
modifierTag.putString("Name", modifier.id().toString());
|
|
||||||
modifierTag.putString("Slot", modifier.slot().name().toLowerCase(Locale.ENGLISH));
|
|
||||||
modifierTag.putInt("Operation", modifier.operation().ordinal());
|
|
||||||
modifierTag.putDouble("Amount", modifier.amount());
|
|
||||||
modifierTag.putIntArray("UUID", UUIDUtils.uuidToIntArray(UUID.nameUUIDFromBytes(modifier.id().toString().getBytes(StandardCharsets.UTF_8))));
|
|
||||||
listTag.add(modifierTag);
|
|
||||||
}
|
|
||||||
item.setTag(listTag, "AttributeModifiers");
|
|
||||||
}
|
|
||||||
return item;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Item<I> prepareNetworkItem(Item<I> item, ItemBuildContext context, CompoundTag networkData) {
|
public @Nullable Key componentType(Item<I> item, ItemBuildContext context) {
|
||||||
if (VersionHelper.isOrAbove1_20_5()) {
|
return ComponentKeys.ATTRIBUTE_MODIFIERS;
|
||||||
Tag previous = item.getSparrowNBTComponent(ComponentKeys.ATTRIBUTE_MODIFIERS);
|
}
|
||||||
if (previous != null) {
|
|
||||||
networkData.put(ComponentKeys.ATTRIBUTE_MODIFIERS.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
@Override
|
||||||
|
public @Nullable Object[] nbtPath(Item<I> item, ItemBuildContext context) {
|
||||||
|
return new Object[]{"AttributeModifiers"};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String nbtPathString(Item<I> item, ItemBuildContext context) {
|
||||||
|
return "AttributeModifiers";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Factory<I> implements ItemDataModifierFactory<I> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemDataModifier<I> create(Object arg) {
|
||||||
|
MutableInt mutableInt = new MutableInt(0);
|
||||||
|
List<AttributeModifier> attributeModifiers = ResourceConfigUtils.parseConfigAsList(arg, (map) -> {
|
||||||
|
String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.item.data.attribute_modifiers.missing_type");
|
||||||
|
Key nativeType = AttributeModifiersModifier.getNativeAttributeName(Key.of(type));
|
||||||
|
AttributeModifier.Slot slot = AttributeModifier.Slot.valueOf(map.getOrDefault("slot", "any").toString().toUpperCase(Locale.ENGLISH));
|
||||||
|
Key id = Optional.ofNullable(map.get("id")).map(String::valueOf).map(Key::of).orElseGet(() -> {
|
||||||
|
mutableInt.add(1);
|
||||||
|
return Key.of("craftengine", "modifier_" + mutableInt.intValue());
|
||||||
|
});
|
||||||
|
double amount = ResourceConfigUtils.getAsDouble(
|
||||||
|
ResourceConfigUtils.requireNonNullOrThrow(map.get("amount"), "warning.config.item.data.attribute_modifiers.missing_amount"), "amount"
|
||||||
|
);
|
||||||
|
AttributeModifier.Operation operation = AttributeModifier.Operation.valueOf(
|
||||||
|
ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("operation"), "warning.config.item.data.attribute_modifiers.missing_operation").toUpperCase(Locale.ENGLISH)
|
||||||
|
);
|
||||||
|
AttributeModifier.Display display = null;
|
||||||
|
if (VersionHelper.isOrAbove1_21_6() && map.containsKey("display")) {
|
||||||
|
Map<String, Object> displayMap = MiscUtils.castToMap(map.get("display"), false);
|
||||||
|
AttributeModifier.Display.Type displayType = AttributeModifier.Display.Type.valueOf(ResourceConfigUtils.requireNonEmptyStringOrThrow(displayMap.get("type"), "warning.config.item.data.attribute_modifiers.display.missing_type").toUpperCase(Locale.ENGLISH));
|
||||||
|
if (displayType == AttributeModifier.Display.Type.OVERRIDE) {
|
||||||
|
String miniMessageValue = ResourceConfigUtils.requireNonEmptyStringOrThrow(displayMap.get("value"), "warning.config.item.data.attribute_modifiers.display.missing_value");
|
||||||
|
display = new AttributeModifier.Display(displayType, AdventureHelper.miniMessage().deserialize(miniMessageValue));
|
||||||
} else {
|
} else {
|
||||||
networkData.put(ComponentKeys.ATTRIBUTE_MODIFIERS.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
display = new AttributeModifier.Display(displayType, null);
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Tag previous = item.getTag("AttributeModifiers");
|
|
||||||
if (previous != null) {
|
|
||||||
networkData.put("AttributeModifiers", NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
|
||||||
} else {
|
|
||||||
networkData.put("AttributeModifiers", NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return item;
|
return new AttributeModifier(nativeType.value(), slot, id,
|
||||||
|
amount, operation, display);
|
||||||
|
});
|
||||||
|
return new AttributeModifiersModifier<>(attributeModifiers);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,12 @@
|
|||||||
package net.momirealms.craftengine.core.item.modifier;
|
package net.momirealms.craftengine.core.item.modifier;
|
||||||
|
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import net.momirealms.craftengine.core.item.ComponentKeys;
|
import net.momirealms.craftengine.core.item.*;
|
||||||
import net.momirealms.craftengine.core.item.Item;
|
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
|
||||||
import net.momirealms.craftengine.core.item.NetworkItemHandler;
|
|
||||||
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
||||||
import net.momirealms.craftengine.core.util.GsonHelper;
|
import net.momirealms.craftengine.core.util.GsonHelper;
|
||||||
import net.momirealms.craftengine.core.util.Key;
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
import net.momirealms.craftengine.core.util.Pair;
|
import net.momirealms.craftengine.core.util.Pair;
|
||||||
|
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
|
||||||
import net.momirealms.sparrow.nbt.CompoundTag;
|
import net.momirealms.sparrow.nbt.CompoundTag;
|
||||||
import net.momirealms.sparrow.nbt.Tag;
|
import net.momirealms.sparrow.nbt.Tag;
|
||||||
|
|
||||||
@@ -16,11 +14,12 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class ComponentModifier<I> implements ItemDataModifier<I> {
|
public class ComponentsModifier<I> implements ItemDataModifier<I> {
|
||||||
|
public static final Factory<?> FACTORY = new Factory<>();
|
||||||
private final List<Pair<Key, Tag>> arguments;
|
private final List<Pair<Key, Tag>> arguments;
|
||||||
private CompoundTag customData = null;
|
private CompoundTag customData = null;
|
||||||
|
|
||||||
public ComponentModifier(Map<String, Object> arguments) {
|
public ComponentsModifier(Map<String, Object> arguments) {
|
||||||
List<Pair<Key, Tag>> pairs = new ArrayList<>(arguments.size());
|
List<Pair<Key, Tag>> pairs = new ArrayList<>(arguments.size());
|
||||||
for (Map.Entry<String, Object> entry : arguments.entrySet()) {
|
for (Map.Entry<String, Object> entry : arguments.entrySet()) {
|
||||||
Key key = Key.of(entry.getKey());
|
Key key = Key.of(entry.getKey());
|
||||||
@@ -33,7 +32,7 @@ public class ComponentModifier<I> implements ItemDataModifier<I> {
|
|||||||
this.arguments = pairs;
|
this.arguments = pairs;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Pair<Key, Tag>> arguments() {
|
public List<Pair<Key, Tag>> components() {
|
||||||
return arguments;
|
return arguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,8 +48,8 @@ public class ComponentModifier<I> implements ItemDataModifier<I> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String name() {
|
public Key type() {
|
||||||
return "components";
|
return ItemDataModifiers.COMPONENTS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -84,4 +83,13 @@ public class ComponentModifier<I> implements ItemDataModifier<I> {
|
|||||||
}
|
}
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class Factory<I> implements ItemDataModifierFactory<I> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemDataModifier<I> create(Object arg) {
|
||||||
|
Map<String, Object> data = ResourceConfigUtils.getAsMap(arg, "components");
|
||||||
|
return new ComponentsModifier<>(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -3,21 +3,26 @@ package net.momirealms.craftengine.core.item.modifier;
|
|||||||
import net.momirealms.craftengine.core.item.ComponentKeys;
|
import net.momirealms.craftengine.core.item.ComponentKeys;
|
||||||
import net.momirealms.craftengine.core.item.Item;
|
import net.momirealms.craftengine.core.item.Item;
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
||||||
import net.momirealms.craftengine.core.item.NetworkItemHandler;
|
import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
|
||||||
import net.momirealms.craftengine.core.util.VersionHelper;
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
import net.momirealms.sparrow.nbt.CompoundTag;
|
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
|
||||||
import net.momirealms.sparrow.nbt.Tag;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
public class CustomModelDataModifier<I> implements ItemDataModifier<I> {
|
public class CustomModelDataModifier<I> implements SimpleNetworkItemDataModifier<I> {
|
||||||
|
public static final Factory<?> FACTORY = new Factory<>();
|
||||||
private final int argument;
|
private final int argument;
|
||||||
|
|
||||||
public CustomModelDataModifier(int argument) {
|
public CustomModelDataModifier(int argument) {
|
||||||
this.argument = argument;
|
this.argument = argument;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int customModelData() {
|
||||||
|
return this.argument;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String name() {
|
public Key type() {
|
||||||
return "custom-model-data";
|
return ItemDataModifiers.CUSTOM_MODEL_DATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -27,22 +32,26 @@ public class CustomModelDataModifier<I> implements ItemDataModifier<I> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Item<I> prepareNetworkItem(Item<I> item, ItemBuildContext context, CompoundTag networkData) {
|
public @Nullable Key componentType(Item<I> item, ItemBuildContext context) {
|
||||||
if (VersionHelper.isOrAbove1_20_5()) {
|
return ComponentKeys.CUSTOM_MODEL_DATA;
|
||||||
Tag previous = item.getSparrowNBTComponent(ComponentKeys.CUSTOM_MODEL_DATA);
|
|
||||||
if (previous != null) {
|
|
||||||
networkData.put(ComponentKeys.CUSTOM_MODEL_DATA.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
|
||||||
} else {
|
|
||||||
networkData.put(ComponentKeys.CUSTOM_MODEL_DATA.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
Tag previous = item.getTag("CustomModelData");
|
@Override
|
||||||
if (previous != null) {
|
public @Nullable Object[] nbtPath(Item<I> item, ItemBuildContext context) {
|
||||||
networkData.put("CustomModelData", NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
return new Object[]{"CustomModelData"};
|
||||||
} else {
|
}
|
||||||
networkData.put("CustomModelData", NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
|
||||||
|
@Override
|
||||||
|
public String nbtPathString(Item<I> item, ItemBuildContext context) {
|
||||||
|
return "CustomModelData";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Factory<I> implements ItemDataModifierFactory<I> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemDataModifier<I> create(Object arg) {
|
||||||
|
int customModelData = ResourceConfigUtils.getAsInt(arg, "custom-model-data");
|
||||||
|
return new CustomModelDataModifier<>(customModelData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return item;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,14 +3,14 @@ package net.momirealms.craftengine.core.item.modifier;
|
|||||||
import net.momirealms.craftengine.core.item.ComponentKeys;
|
import net.momirealms.craftengine.core.item.ComponentKeys;
|
||||||
import net.momirealms.craftengine.core.item.Item;
|
import net.momirealms.craftengine.core.item.Item;
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
||||||
import net.momirealms.craftengine.core.item.NetworkItemHandler;
|
import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
|
||||||
import net.momirealms.craftengine.core.plugin.config.Config;
|
import net.momirealms.craftengine.core.plugin.config.Config;
|
||||||
import net.momirealms.craftengine.core.util.AdventureHelper;
|
import net.momirealms.craftengine.core.util.AdventureHelper;
|
||||||
import net.momirealms.craftengine.core.util.VersionHelper;
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
import net.momirealms.sparrow.nbt.CompoundTag;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import net.momirealms.sparrow.nbt.Tag;
|
|
||||||
|
|
||||||
public class CustomNameModifier<I> implements ItemDataModifier<I> {
|
public class CustomNameModifier<I> implements SimpleNetworkItemDataModifier<I> {
|
||||||
|
public static final Factory<?> FACTORY = new Factory<>();
|
||||||
private final String argument;
|
private final String argument;
|
||||||
|
|
||||||
public CustomNameModifier(String argument) {
|
public CustomNameModifier(String argument) {
|
||||||
@@ -25,9 +25,13 @@ public class CustomNameModifier<I> implements ItemDataModifier<I> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String customName() {
|
||||||
|
return argument;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String name() {
|
public Key type() {
|
||||||
return "custom-name";
|
return ItemDataModifiers.CUSTOM_NAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -37,22 +41,26 @@ public class CustomNameModifier<I> implements ItemDataModifier<I> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Item<I> prepareNetworkItem(Item<I> item, ItemBuildContext context, CompoundTag networkData) {
|
public @Nullable Key componentType(Item<I> item, ItemBuildContext context) {
|
||||||
if (VersionHelper.isOrAbove1_20_5()) {
|
return ComponentKeys.CUSTOM_NAME;
|
||||||
Tag previous = item.getSparrowNBTComponent(ComponentKeys.CUSTOM_NAME);
|
|
||||||
if (previous != null) {
|
|
||||||
networkData.put(ComponentKeys.CUSTOM_NAME.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
|
||||||
} else {
|
|
||||||
networkData.put(ComponentKeys.CUSTOM_NAME.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
Tag previous = item.getTag("display", "Name");
|
@Override
|
||||||
if (previous != null) {
|
public @Nullable Object[] nbtPath(Item<I> item, ItemBuildContext context) {
|
||||||
networkData.put("display.Name", NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
return new Object[]{"display", "Name"};
|
||||||
} else {
|
}
|
||||||
networkData.put("display.Name", NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
|
||||||
|
@Override
|
||||||
|
public String nbtPathString(Item<I> item, ItemBuildContext context) {
|
||||||
|
return "display.Name";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Factory<I> implements ItemDataModifierFactory<I> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemDataModifier<I> create(Object arg) {
|
||||||
|
String name = arg.toString();
|
||||||
|
return new CustomNameModifier<>(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return item;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,47 +3,60 @@ package net.momirealms.craftengine.core.item.modifier;
|
|||||||
import net.momirealms.craftengine.core.item.ComponentKeys;
|
import net.momirealms.craftengine.core.item.ComponentKeys;
|
||||||
import net.momirealms.craftengine.core.item.Item;
|
import net.momirealms.craftengine.core.item.Item;
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
||||||
import net.momirealms.craftengine.core.item.NetworkItemHandler;
|
import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
|
||||||
import net.momirealms.craftengine.core.util.Color;
|
import net.momirealms.craftengine.core.util.Color;
|
||||||
import net.momirealms.craftengine.core.util.VersionHelper;
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
import net.momirealms.sparrow.nbt.CompoundTag;
|
import net.momirealms.craftengine.core.util.MiscUtils;
|
||||||
import net.momirealms.sparrow.nbt.Tag;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.joml.Vector3f;
|
||||||
|
|
||||||
public class DyedColorModifier<I> implements ItemDataModifier<I> {
|
public class DyedColorModifier<I> implements SimpleNetworkItemDataModifier<I> {
|
||||||
|
public static final Factory<?> FACTORY = new Factory<>();
|
||||||
private final Color color;
|
private final Color color;
|
||||||
|
|
||||||
public DyedColorModifier(Color color) {
|
public DyedColorModifier(Color color) {
|
||||||
this.color = color;
|
this.color = color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Color dyedColor() {
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String name() {
|
public Key type() {
|
||||||
return "dyed-color";
|
return ItemDataModifiers.DYED_COLOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Item<I> apply(Item<I> item, ItemBuildContext context) {
|
public Item<I> apply(Item<I> item, ItemBuildContext context) {
|
||||||
item.dyedColor(this.color);
|
return item.dyedColor(this.color);
|
||||||
return item;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Item<I> prepareNetworkItem(Item<I> item, ItemBuildContext context, CompoundTag networkData) {
|
public @Nullable Key componentType(Item<I> item, ItemBuildContext context) {
|
||||||
if (VersionHelper.isOrAbove1_20_5()) {
|
return ComponentKeys.DYED_COLOR;
|
||||||
Tag previous = item.getSparrowNBTComponent(ComponentKeys.DYED_COLOR);
|
}
|
||||||
if (previous != null) {
|
|
||||||
networkData.put(ComponentKeys.DYED_COLOR.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
@Override
|
||||||
|
public @Nullable Object[] nbtPath(Item<I> item, ItemBuildContext context) {
|
||||||
|
return new Object[]{"display", "color"};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String nbtPathString(Item<I> item, ItemBuildContext context) {
|
||||||
|
return "display.color";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Factory<I> implements ItemDataModifierFactory<I> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemDataModifier<I> create(Object arg) {
|
||||||
|
if (arg instanceof Integer integer) {
|
||||||
|
return new DyedColorModifier<>(Color.fromDecimal(integer));
|
||||||
} else {
|
} else {
|
||||||
networkData.put(ComponentKeys.DYED_COLOR.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
Vector3f vector3f = MiscUtils.getAsVector3f(arg, "dyed-color");
|
||||||
}
|
return new DyedColorModifier<>(Color.fromVector3f(vector3f));
|
||||||
} else {
|
|
||||||
Tag previous = item.getTag("display", "color");
|
|
||||||
if (previous != null) {
|
|
||||||
networkData.put("display.color", NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
|
||||||
} else {
|
|
||||||
networkData.put("display.color", NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return item;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,70 +0,0 @@
|
|||||||
package net.momirealms.craftengine.core.item.modifier;
|
|
||||||
|
|
||||||
import net.momirealms.craftengine.core.item.*;
|
|
||||||
import net.momirealms.craftengine.core.item.data.Enchantment;
|
|
||||||
import net.momirealms.craftengine.core.util.VersionHelper;
|
|
||||||
import net.momirealms.sparrow.nbt.CompoundTag;
|
|
||||||
import net.momirealms.sparrow.nbt.Tag;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class EnchantmentModifier<I> implements ItemDataModifier<I> {
|
|
||||||
private final List<Enchantment> enchantments;
|
|
||||||
|
|
||||||
public EnchantmentModifier(List<Enchantment> enchantments) {
|
|
||||||
this.enchantments = enchantments;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String name() {
|
|
||||||
return "enchantment";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Item<I> apply(Item<I> item, ItemBuildContext context) {
|
|
||||||
if (item.vanillaId().equals(ItemKeys.ENCHANTED_BOOK)) {
|
|
||||||
item.setStoredEnchantments(this.enchantments);
|
|
||||||
} else {
|
|
||||||
item.setEnchantments(this.enchantments);
|
|
||||||
}
|
|
||||||
return item;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Item<I> prepareNetworkItem(Item<I> item, ItemBuildContext context, CompoundTag networkData) {
|
|
||||||
if (item.vanillaId().equals(ItemKeys.ENCHANTED_BOOK)) {
|
|
||||||
if (VersionHelper.isOrAbove1_20_5()) {
|
|
||||||
Tag previous = item.getSparrowNBTComponent(ComponentKeys.STORED_ENCHANTMENTS);
|
|
||||||
if (previous != null) {
|
|
||||||
networkData.put(ComponentKeys.STORED_ENCHANTMENTS.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
|
||||||
} else {
|
|
||||||
networkData.put(ComponentKeys.STORED_ENCHANTMENTS.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Tag previous = item.getTag("StoredEnchantments");
|
|
||||||
if (previous != null) {
|
|
||||||
networkData.put("StoredEnchantments", NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
|
||||||
} else {
|
|
||||||
networkData.put("StoredEnchantments", NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (VersionHelper.isOrAbove1_20_5()) {
|
|
||||||
Tag previous = item.getSparrowNBTComponent(ComponentKeys.ENCHANTMENTS);
|
|
||||||
if (previous != null) {
|
|
||||||
networkData.put(ComponentKeys.ENCHANTMENTS.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
|
||||||
} else {
|
|
||||||
networkData.put(ComponentKeys.ENCHANTMENTS.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Tag previous = item.getTag("Enchantments");
|
|
||||||
if (previous != null) {
|
|
||||||
networkData.put("Enchantments", NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
|
||||||
} else {
|
|
||||||
networkData.put("Enchantments", NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return item;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
package net.momirealms.craftengine.core.item.modifier;
|
||||||
|
|
||||||
|
import net.momirealms.craftengine.core.item.*;
|
||||||
|
import net.momirealms.craftengine.core.item.data.Enchantment;
|
||||||
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
|
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class EnchantmentsModifier<I> implements SimpleNetworkItemDataModifier<I> {
|
||||||
|
public static final Factory<?> FACTORY = new Factory<>();
|
||||||
|
private final List<Enchantment> enchantments;
|
||||||
|
|
||||||
|
public EnchantmentsModifier(List<Enchantment> enchantments) {
|
||||||
|
this.enchantments = enchantments;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Enchantment> enchantments() {
|
||||||
|
return enchantments;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Key type() {
|
||||||
|
return ItemDataModifiers.ENCHANTMENTS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Item<I> apply(Item<I> item, ItemBuildContext context) {
|
||||||
|
if (item.vanillaId().equals(ItemKeys.ENCHANTED_BOOK)) {
|
||||||
|
return item.setStoredEnchantments(this.enchantments);
|
||||||
|
} else {
|
||||||
|
return item.setEnchantments(this.enchantments);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable Key componentType(Item<I> item, ItemBuildContext context) {
|
||||||
|
return item.vanillaId().equals(ItemKeys.ENCHANTED_BOOK) ? ComponentKeys.STORED_ENCHANTMENTS : ComponentKeys.ENCHANTMENTS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable Object[] nbtPath(Item<I> item, ItemBuildContext context) {
|
||||||
|
return item.vanillaId().equals(ItemKeys.ENCHANTED_BOOK) ? new Object[]{"StoredEnchantments"} : new Object[]{"Enchantments"};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String nbtPathString(Item<I> item, ItemBuildContext context) {
|
||||||
|
return item.vanillaId().equals(ItemKeys.ENCHANTED_BOOK) ? "StoredEnchantments" : "Enchantments";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Factory<I> implements ItemDataModifierFactory<I> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemDataModifier<I> create(Object arg) {
|
||||||
|
Map<String, Object> data = ResourceConfigUtils.getAsMap(arg, "enchantments");
|
||||||
|
List<Enchantment> enchantments = new ArrayList<>();
|
||||||
|
for (Map.Entry<String, Object> e : data.entrySet()) {
|
||||||
|
if (e.getValue() instanceof Number number) {
|
||||||
|
enchantments.add(new Enchantment(Key.of(e.getKey()), number.intValue()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new EnchantmentsModifier<>(enchantments);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,24 +3,26 @@ package net.momirealms.craftengine.core.item.modifier;
|
|||||||
import net.momirealms.craftengine.core.item.ComponentKeys;
|
import net.momirealms.craftengine.core.item.ComponentKeys;
|
||||||
import net.momirealms.craftengine.core.item.Item;
|
import net.momirealms.craftengine.core.item.Item;
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
||||||
import net.momirealms.craftengine.core.item.NetworkItemHandler;
|
|
||||||
import net.momirealms.craftengine.core.item.setting.EquipmentData;
|
import net.momirealms.craftengine.core.item.setting.EquipmentData;
|
||||||
import net.momirealms.craftengine.core.util.Key;
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
import net.momirealms.sparrow.nbt.CompoundTag;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import net.momirealms.sparrow.nbt.Tag;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
public class EquippableAssetIdModifier<I> implements ItemDataModifier<I> {
|
public class EquippableAssetIdModifier<I> implements SimpleNetworkItemDataModifier<I> {
|
||||||
private final Key assetId;
|
private final Key assetId;
|
||||||
|
|
||||||
public EquippableAssetIdModifier(Key assetsId) {
|
public EquippableAssetIdModifier(Key assetsId) {
|
||||||
this.assetId = assetsId;
|
this.assetId = assetsId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Key assetId() {
|
||||||
|
return assetId;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String name() {
|
public Key type() {
|
||||||
return "equippable-asset-id";
|
return ItemDataModifiers.EQUIPPABLE_ASSET_ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -39,13 +41,7 @@ public class EquippableAssetIdModifier<I> implements ItemDataModifier<I> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Item<I> prepareNetworkItem(Item<I> item, ItemBuildContext context, CompoundTag networkData) {
|
public @Nullable Key componentType(Item<I> item, ItemBuildContext context) {
|
||||||
Tag previous = item.getSparrowNBTComponent(ComponentKeys.EQUIPPABLE);
|
return ComponentKeys.EQUIPPABLE;
|
||||||
if (previous != null) {
|
|
||||||
networkData.put(ComponentKeys.EQUIPPABLE.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
|
||||||
} else {
|
|
||||||
networkData.put(ComponentKeys.EQUIPPABLE.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
|
||||||
}
|
|
||||||
return item;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,24 +1,49 @@
|
|||||||
package net.momirealms.craftengine.core.item.modifier;
|
package net.momirealms.craftengine.core.item.modifier;
|
||||||
|
|
||||||
|
import net.momirealms.craftengine.core.item.ComponentKeys;
|
||||||
import net.momirealms.craftengine.core.item.Item;
|
import net.momirealms.craftengine.core.item.Item;
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
||||||
|
import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
|
||||||
import net.momirealms.craftengine.core.item.setting.EquipmentData;
|
import net.momirealms.craftengine.core.item.setting.EquipmentData;
|
||||||
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
|
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
public class EquippableModifier<I> implements ItemDataModifier<I> {
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class EquippableModifier<I> implements SimpleNetworkItemDataModifier<I> {
|
||||||
|
public static final Factory<?> FACTORY = new Factory<>();
|
||||||
private final EquipmentData data;
|
private final EquipmentData data;
|
||||||
|
|
||||||
public EquippableModifier(EquipmentData data) {
|
public EquippableModifier(EquipmentData data) {
|
||||||
this.data = data;
|
this.data = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public EquipmentData data() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String name() {
|
public Key type() {
|
||||||
return "equippable";
|
return ItemDataModifiers.EQUIPPABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Item<I> apply(Item<I> item, ItemBuildContext context) {
|
public Item<I> apply(Item<I> item, ItemBuildContext context) {
|
||||||
item.equippable(this.data);
|
return item.equippable(this.data);
|
||||||
return item;
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable Key componentType(Item<I> item, ItemBuildContext context) {
|
||||||
|
return ComponentKeys.EQUIPPABLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Factory<I> implements ItemDataModifierFactory<I> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemDataModifier<I> create(Object arg) {
|
||||||
|
Map<String, Object> data = ResourceConfigUtils.getAsMap(arg, "equippable");
|
||||||
|
return new EquippableModifier<>(EquipmentData.fromMap(data));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,9 +3,17 @@ package net.momirealms.craftengine.core.item.modifier;
|
|||||||
import net.momirealms.craftengine.core.item.ExternalItemSource;
|
import net.momirealms.craftengine.core.item.ExternalItemSource;
|
||||||
import net.momirealms.craftengine.core.item.Item;
|
import net.momirealms.craftengine.core.item.Item;
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
||||||
|
import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
|
||||||
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
||||||
|
import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException;
|
||||||
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
|
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class ExternalModifier<I> implements ItemDataModifier<I> {
|
public class ExternalModifier<I> implements ItemDataModifier<I> {
|
||||||
|
public static final Factory<?> FACTORY = new Factory<>();
|
||||||
private final String id;
|
private final String id;
|
||||||
private final ExternalItemSource<I> provider;
|
private final ExternalItemSource<I> provider;
|
||||||
|
|
||||||
@@ -14,9 +22,17 @@ public class ExternalModifier<I> implements ItemDataModifier<I> {
|
|||||||
this.provider = provider;
|
this.provider = provider;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String id() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExternalItemSource<I> source() {
|
||||||
|
return provider;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String name() {
|
public Key type() {
|
||||||
return "external";
|
return ItemDataModifiers.EXTERNAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@@ -31,4 +47,17 @@ public class ExternalModifier<I> implements ItemDataModifier<I> {
|
|||||||
item.merge(anotherWrapped);
|
item.merge(anotherWrapped);
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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");
|
||||||
|
ExternalItemSource<I> provider = (ExternalItemSource<I>) CraftEngine.instance().itemManager().getExternalItemSource(plugin.toLowerCase(Locale.ENGLISH));
|
||||||
|
return new ExternalModifier<>(id, ResourceConfigUtils.requireNonNullOrThrow(provider, () -> new LocalizedResourceConfigException("warning.config.item.data.external.invalid_source", plugin)));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,13 +3,15 @@ package net.momirealms.craftengine.core.item.modifier;
|
|||||||
import net.momirealms.craftengine.core.item.ComponentKeys;
|
import net.momirealms.craftengine.core.item.ComponentKeys;
|
||||||
import net.momirealms.craftengine.core.item.Item;
|
import net.momirealms.craftengine.core.item.Item;
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
||||||
import net.momirealms.craftengine.core.item.NetworkItemHandler;
|
import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
|
||||||
import net.momirealms.sparrow.nbt.CompoundTag;
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
import net.momirealms.sparrow.nbt.Tag;
|
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class FoodModifier<I> implements ItemDataModifier<I> {
|
public class FoodModifier<I> implements SimpleNetworkItemDataModifier<I> {
|
||||||
|
public static final Factory<?> FACTORY = new Factory<>();
|
||||||
private final int nutrition;
|
private final int nutrition;
|
||||||
private final float saturation;
|
private final float saturation;
|
||||||
private final boolean canAlwaysEat;
|
private final boolean canAlwaysEat;
|
||||||
@@ -20,9 +22,21 @@ public class FoodModifier<I> implements ItemDataModifier<I> {
|
|||||||
this.saturation = saturation;
|
this.saturation = saturation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean canAlwaysEat() {
|
||||||
|
return canAlwaysEat;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int nutrition() {
|
||||||
|
return nutrition;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float saturation() {
|
||||||
|
return saturation;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String name() {
|
public Key type() {
|
||||||
return "food";
|
return ItemDataModifiers.FOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -36,13 +50,18 @@ public class FoodModifier<I> implements ItemDataModifier<I> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Item<I> prepareNetworkItem(Item<I> item, ItemBuildContext context, CompoundTag networkData) {
|
public @Nullable Key componentType(Item<I> item, ItemBuildContext context) {
|
||||||
Tag previous = item.getSparrowNBTComponent(ComponentKeys.FOOD);
|
return ComponentKeys.FOOD;
|
||||||
if (previous != null) {
|
}
|
||||||
networkData.put(ComponentKeys.FOOD.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
|
||||||
} else {
|
public static class Factory<I> implements ItemDataModifierFactory<I> {
|
||||||
networkData.put(ComponentKeys.FOOD.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
|
||||||
|
@Override
|
||||||
|
public ItemDataModifier<I> create(Object arg) {
|
||||||
|
Map<String, Object> data = ResourceConfigUtils.getAsMap(arg, "food");
|
||||||
|
int nutrition = ResourceConfigUtils.getAsInt(data.get("nutrition"), "nutrition");
|
||||||
|
float saturation = ResourceConfigUtils.getAsFloat(data.get("saturation"), "saturation");
|
||||||
|
return new FoodModifier<>(nutrition, saturation, ResourceConfigUtils.getAsBoolean(data.getOrDefault("can-always-eat", false), "can-always-eat"));
|
||||||
}
|
}
|
||||||
return item;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
package net.momirealms.craftengine.core.item.modifier;
|
package net.momirealms.craftengine.core.item.modifier;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import net.momirealms.craftengine.core.item.ComponentKeys;
|
import net.momirealms.craftengine.core.item.*;
|
||||||
import net.momirealms.craftengine.core.item.Item;
|
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
|
||||||
import net.momirealms.craftengine.core.item.NetworkItemHandler;
|
|
||||||
import net.momirealms.craftengine.core.util.Key;
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
import net.momirealms.craftengine.core.util.MiscUtils;
|
import net.momirealms.craftengine.core.util.MiscUtils;
|
||||||
import net.momirealms.craftengine.core.util.VersionHelper;
|
import net.momirealms.craftengine.core.util.VersionHelper;
|
||||||
@@ -19,6 +16,7 @@ import java.util.stream.Collectors;
|
|||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public class HideTooltipModifier<I> implements ItemDataModifier<I> {
|
public class HideTooltipModifier<I> implements ItemDataModifier<I> {
|
||||||
|
public static final Factory<?> FACTORY = new Factory<>();
|
||||||
public static final Map<Key, Integer> TO_LEGACY;
|
public static final Map<Key, Integer> TO_LEGACY;
|
||||||
public static final List<Key> COMPONENTS = List.of(
|
public static final List<Key> COMPONENTS = List.of(
|
||||||
ComponentKeys.UNBREAKABLE,
|
ComponentKeys.UNBREAKABLE,
|
||||||
@@ -127,8 +125,8 @@ public class HideTooltipModifier<I> implements ItemDataModifier<I> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String name() {
|
public Key type() {
|
||||||
return "hide-tooltip";
|
return ItemDataModifiers.HIDE_TOOLTIP;
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface Applier<I> {
|
public interface Applier<I> {
|
||||||
@@ -233,4 +231,13 @@ public class HideTooltipModifier<I> implements ItemDataModifier<I> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class Factory<I> implements ItemDataModifierFactory<I> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemDataModifier<I> create(Object arg) {
|
||||||
|
List<Key> components = MiscUtils.getAsStringList(arg).stream().map(Key::of).toList();
|
||||||
|
return new HideTooltipModifier<>(components);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,9 +12,13 @@ public class IdModifier<I> implements ItemDataModifier<I> {
|
|||||||
this.argument = argument;
|
this.argument = argument;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Key identifier() {
|
||||||
|
return argument;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String name() {
|
public Key type() {
|
||||||
return "id";
|
return ItemDataModifiers.ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -2,11 +2,12 @@ package net.momirealms.craftengine.core.item.modifier;
|
|||||||
|
|
||||||
import net.momirealms.craftengine.core.item.Item;
|
import net.momirealms.craftengine.core.item.Item;
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
||||||
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
import net.momirealms.sparrow.nbt.CompoundTag;
|
import net.momirealms.sparrow.nbt.CompoundTag;
|
||||||
|
|
||||||
public interface ItemDataModifier<I> {
|
public interface ItemDataModifier<I> {
|
||||||
|
|
||||||
String name();
|
Key type();
|
||||||
|
|
||||||
Item<I> apply(Item<I> item, ItemBuildContext context);
|
Item<I> apply(Item<I> item, ItemBuildContext context);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,88 @@
|
|||||||
|
package net.momirealms.craftengine.core.item.modifier;
|
||||||
|
|
||||||
|
import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
|
||||||
|
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;
|
||||||
|
import net.momirealms.craftengine.core.registry.Registries;
|
||||||
|
import net.momirealms.craftengine.core.registry.WritableRegistry;
|
||||||
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
|
import net.momirealms.craftengine.core.util.ResourceKey;
|
||||||
|
import net.momirealms.craftengine.core.util.VersionHelper;
|
||||||
|
|
||||||
|
public final class ItemDataModifiers {
|
||||||
|
private ItemDataModifiers() {}
|
||||||
|
|
||||||
|
public static final Key ITEM_MODEL = Key.of("craftengine:item-model");
|
||||||
|
public static final Key ID = Key.of("craftengine:id");
|
||||||
|
public static final Key HIDE_TOOLTIP = Key.of("craftengine:hide-tooltip");
|
||||||
|
public static final Key FOOD = Key.of("craftengine:food");
|
||||||
|
public static final Key EXTERNAL = Key.of("craftengine:external");
|
||||||
|
public static final Key EQUIPPABLE = Key.of("craftengine:equippable");
|
||||||
|
public static final Key EQUIPPABLE_ASSET_ID = Key.of("craftengine:equippable-asset-id");
|
||||||
|
public static final Key ENCHANTMENT = Key.of("craftengine:enchantment");
|
||||||
|
public static final Key ENCHANTMENTS = Key.of("craftengine:enchantments");
|
||||||
|
public static final Key DYED_COLOR = Key.of("craftengine:dyed-color");
|
||||||
|
public static final Key DISPLAY_NAME = Key.of("craftengine:display-name");
|
||||||
|
public static final Key CUSTOM_NAME = Key.of("craftengine:custom-name");
|
||||||
|
public static final Key CUSTOM_MODEL_DATA = Key.of("craftengine:custom-model-data");
|
||||||
|
public static final Key COMPONENTS = Key.of("craftengine:components");
|
||||||
|
public static final Key ATTRIBUTE_MODIFIERS = Key.of("craftengine:attribute-modifiers");
|
||||||
|
public static final Key ATTRIBUTES = Key.of("craftengine:attributes");
|
||||||
|
public static final Key ARGUMENTS = Key.of("craftengine:arguments");
|
||||||
|
public static final Key ITEM_NAME = Key.of("craftengine:item-name");
|
||||||
|
public static final Key JUKEBOX_PLAYABLE = Key.of("craftengine:jukebox-playable");
|
||||||
|
public static final Key REMOVE_COMPONENTS = Key.of("craftengine:remove-components");
|
||||||
|
public static final Key TAGS = Key.of("craftengine:tags");
|
||||||
|
public static final Key NBT = Key.of("craftengine:nbt");
|
||||||
|
public static final Key TOOLTIP_STYLE = Key.of("craftengine:tooltip-style");
|
||||||
|
public static final Key TRIM = Key.of("craftengine:trim");
|
||||||
|
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 <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);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void init() {}
|
||||||
|
|
||||||
|
static {
|
||||||
|
register(EXTERNAL, ExternalModifier.FACTORY);
|
||||||
|
register(LORE, LoreModifier.FACTORY);
|
||||||
|
register(DYNAMIC_LORE, DynamicLoreModifier.FACTORY);
|
||||||
|
register(DYED_COLOR, DyedColorModifier.FACTORY);
|
||||||
|
register(TAGS, TagsModifier.FACTORY);
|
||||||
|
register(NBT, TagsModifier.FACTORY);
|
||||||
|
register(ATTRIBUTE_MODIFIERS, AttributeModifiersModifier.FACTORY);
|
||||||
|
register(ATTRIBUTES, AttributeModifiersModifier.FACTORY);
|
||||||
|
register(CUSTOM_MODEL_DATA, CustomModelDataModifier.FACTORY);
|
||||||
|
register(UNBREAKABLE, UnbreakableModifier.FACTORY);
|
||||||
|
register(ENCHANTMENT, EnchantmentsModifier.FACTORY);
|
||||||
|
register(ENCHANTMENTS, EnchantmentsModifier.FACTORY);
|
||||||
|
register(TRIM, TrimModifier.FACTORY);
|
||||||
|
register(HIDE_TOOLTIP, HideTooltipModifier.FACTORY);
|
||||||
|
register(ARGUMENTS, ArgumentsModifier.FACTORY);
|
||||||
|
if (VersionHelper.isOrAbove1_20_5()) {
|
||||||
|
register(CUSTOM_NAME, CustomNameModifier.FACTORY);
|
||||||
|
register(ITEM_NAME, ItemNameModifier.FACTORY);
|
||||||
|
register(DISPLAY_NAME, ItemNameModifier.FACTORY);
|
||||||
|
register(COMPONENTS, ComponentsModifier.FACTORY);
|
||||||
|
register(REMOVE_COMPONENTS, RemoveComponentModifier.FACTORY);
|
||||||
|
register(FOOD, FoodModifier.FACTORY);
|
||||||
|
} else {
|
||||||
|
register(CUSTOM_NAME, CustomNameModifier.FACTORY);
|
||||||
|
register(ITEM_NAME, CustomNameModifier.FACTORY);
|
||||||
|
register(DISPLAY_NAME, CustomNameModifier.FACTORY);
|
||||||
|
}
|
||||||
|
if (VersionHelper.isOrAbove1_21()) {
|
||||||
|
register(JUKEBOX_PLAYABLE, JukeboxSongModifier.FACTORY);
|
||||||
|
}
|
||||||
|
if (VersionHelper.isOrAbove1_21_2()) {
|
||||||
|
register(TOOLTIP_STYLE, TooltipStyleModifier.FACTORY);
|
||||||
|
register(ITEM_MODEL, ItemModelModifier.FACTORY);
|
||||||
|
register(EQUIPPABLE, EquippableModifier.FACTORY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,37 +3,43 @@ package net.momirealms.craftengine.core.item.modifier;
|
|||||||
import net.momirealms.craftengine.core.item.ComponentKeys;
|
import net.momirealms.craftengine.core.item.ComponentKeys;
|
||||||
import net.momirealms.craftengine.core.item.Item;
|
import net.momirealms.craftengine.core.item.Item;
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
||||||
import net.momirealms.craftengine.core.item.NetworkItemHandler;
|
import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
|
||||||
import net.momirealms.craftengine.core.util.Key;
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
import net.momirealms.sparrow.nbt.CompoundTag;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import net.momirealms.sparrow.nbt.Tag;
|
|
||||||
|
|
||||||
public class ItemModelModifier<I> implements ItemDataModifier<I> {
|
public class ItemModelModifier<I> implements SimpleNetworkItemDataModifier<I> {
|
||||||
|
public static final Factory<?> FACTORY = new Factory<>();
|
||||||
private final Key data;
|
private final Key data;
|
||||||
|
|
||||||
public ItemModelModifier(Key data) {
|
public ItemModelModifier(Key data) {
|
||||||
this.data = data;
|
this.data = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Key data() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String name() {
|
public Key type() {
|
||||||
return "item-model";
|
return ItemDataModifiers.ITEM_MODEL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Item<I> apply(Item<I> item, ItemBuildContext context) {
|
public Item<I> apply(Item<I> item, ItemBuildContext context) {
|
||||||
item.itemModel(this.data.toString());
|
return item.itemModel(this.data.asString());
|
||||||
return item;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Item<I> prepareNetworkItem(Item<I> item, ItemBuildContext context, CompoundTag networkData) {
|
public @Nullable Key componentType(Item<I> item, ItemBuildContext context) {
|
||||||
Tag previous = item.getSparrowNBTComponent(ComponentKeys.ITEM_MODEL);
|
return ComponentKeys.ITEM_MODEL;
|
||||||
if (previous != null) {
|
}
|
||||||
networkData.put(ComponentKeys.ITEM_MODEL.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
|
||||||
} else {
|
public static class Factory<I> implements ItemDataModifierFactory<I> {
|
||||||
networkData.put(ComponentKeys.ITEM_MODEL.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
|
||||||
|
@Override
|
||||||
|
public ItemDataModifier<I> create(Object arg) {
|
||||||
|
String id = arg.toString();
|
||||||
|
return new ItemModelModifier<>(Key.of(id));
|
||||||
}
|
}
|
||||||
return item;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,22 +3,26 @@ package net.momirealms.craftengine.core.item.modifier;
|
|||||||
import net.momirealms.craftengine.core.item.ComponentKeys;
|
import net.momirealms.craftengine.core.item.ComponentKeys;
|
||||||
import net.momirealms.craftengine.core.item.Item;
|
import net.momirealms.craftengine.core.item.Item;
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
||||||
import net.momirealms.craftengine.core.item.NetworkItemHandler;
|
import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
|
||||||
import net.momirealms.craftengine.core.util.AdventureHelper;
|
import net.momirealms.craftengine.core.util.AdventureHelper;
|
||||||
import net.momirealms.craftengine.core.util.VersionHelper;
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
import net.momirealms.sparrow.nbt.CompoundTag;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import net.momirealms.sparrow.nbt.Tag;
|
|
||||||
|
|
||||||
public class ItemNameModifier<I> implements ItemDataModifier<I> {
|
public class ItemNameModifier<I> implements SimpleNetworkItemDataModifier<I> {
|
||||||
|
public static final Factory<?> FACTORY = new Factory<>();
|
||||||
private final String argument;
|
private final String argument;
|
||||||
|
|
||||||
public ItemNameModifier(String argument) {
|
public ItemNameModifier(String argument) {
|
||||||
this.argument = argument;
|
this.argument = argument;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String itemName() {
|
||||||
|
return argument;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String name() {
|
public Key type() {
|
||||||
return "item-name";
|
return ItemDataModifiers.ITEM_NAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -28,22 +32,26 @@ public class ItemNameModifier<I> implements ItemDataModifier<I> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Item<I> prepareNetworkItem(Item<I> item, ItemBuildContext context, CompoundTag networkData) {
|
public @Nullable Key componentType(Item<I> item, ItemBuildContext context) {
|
||||||
if (VersionHelper.isOrAbove1_20_5()) {
|
return ComponentKeys.ITEM_NAME;
|
||||||
Tag previous = item.getSparrowNBTComponent(ComponentKeys.ITEM_NAME);
|
|
||||||
if (previous != null) {
|
|
||||||
networkData.put(ComponentKeys.ITEM_NAME.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
|
||||||
} else {
|
|
||||||
networkData.put(ComponentKeys.ITEM_NAME.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
Tag previous = item.getTag("display", "Name");
|
@Override
|
||||||
if (previous != null) {
|
public @Nullable Object[] nbtPath(Item<I> item, ItemBuildContext context) {
|
||||||
networkData.put("display.Name", NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
return new Object[]{"display", "Name"};
|
||||||
} else {
|
}
|
||||||
networkData.put("display.Name", NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
|
||||||
|
@Override
|
||||||
|
public String nbtPathString(Item<I> item, ItemBuildContext context) {
|
||||||
|
return "display.Name";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Factory<I> implements ItemDataModifierFactory<I> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemDataModifier<I> create(Object arg) {
|
||||||
|
String name = arg.toString();
|
||||||
|
return new ItemNameModifier<>(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return item;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,18 +2,25 @@ package net.momirealms.craftengine.core.item.modifier;
|
|||||||
|
|
||||||
import net.momirealms.craftengine.core.item.Item;
|
import net.momirealms.craftengine.core.item.Item;
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
||||||
|
import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
|
||||||
import net.momirealms.craftengine.core.item.data.JukeboxPlayable;
|
import net.momirealms.craftengine.core.item.data.JukeboxPlayable;
|
||||||
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
|
|
||||||
public class JukeboxSongModifier<I> implements ItemDataModifier<I> {
|
public class JukeboxSongModifier<I> implements ItemDataModifier<I> {
|
||||||
|
public static final Factory<?> FACTORY = new Factory<>();
|
||||||
private final JukeboxPlayable song;
|
private final JukeboxPlayable song;
|
||||||
|
|
||||||
public JukeboxSongModifier(JukeboxPlayable song) {
|
public JukeboxSongModifier(JukeboxPlayable song) {
|
||||||
this.song = song;
|
this.song = song;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public JukeboxPlayable song() {
|
||||||
|
return song;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String name() {
|
public Key type() {
|
||||||
return "jukebox-playable";
|
return ItemDataModifiers.JUKEBOX_PLAYABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -21,4 +28,13 @@ public class JukeboxSongModifier<I> implements ItemDataModifier<I> {
|
|||||||
item.jukeboxSong(this.song);
|
item.jukeboxSong(this.song);
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class Factory<I> implements ItemDataModifierFactory<I> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemDataModifier<I> create(Object arg) {
|
||||||
|
String song = arg.toString();
|
||||||
|
return new JukeboxSongModifier<>(new JukeboxPlayable(song, true));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,10 @@ package net.momirealms.craftengine.core.item.modifier;
|
|||||||
|
|
||||||
import net.momirealms.craftengine.core.item.Item;
|
import net.momirealms.craftengine.core.item.Item;
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
||||||
|
import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
|
||||||
import net.momirealms.craftengine.core.item.NetworkItemHandler;
|
import net.momirealms.craftengine.core.item.NetworkItemHandler;
|
||||||
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
|
import net.momirealms.craftengine.core.util.MiscUtils;
|
||||||
import net.momirealms.sparrow.nbt.CompoundTag;
|
import net.momirealms.sparrow.nbt.CompoundTag;
|
||||||
import net.momirealms.sparrow.nbt.Tag;
|
import net.momirealms.sparrow.nbt.Tag;
|
||||||
|
|
||||||
@@ -10,19 +13,20 @@ import java.util.Collections;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class RemoveComponentModifier<I> implements ItemDataModifier<I> {
|
public class RemoveComponentModifier<I> implements ItemDataModifier<I> {
|
||||||
|
public static final Factory<?> FACTORY = new Factory<>();
|
||||||
private final List<String> arguments;
|
private final List<String> arguments;
|
||||||
|
|
||||||
public RemoveComponentModifier(List<String> arguments) {
|
public RemoveComponentModifier(List<String> arguments) {
|
||||||
this.arguments = arguments;
|
this.arguments = arguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> arguments() {
|
public List<String> components() {
|
||||||
return Collections.unmodifiableList(this.arguments);
|
return Collections.unmodifiableList(this.arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String name() {
|
public Key type() {
|
||||||
return "remove-components";
|
return ItemDataModifiers.REMOVE_COMPONENTS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -43,4 +47,13 @@ public class RemoveComponentModifier<I> implements ItemDataModifier<I> {
|
|||||||
}
|
}
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class Factory<I> implements ItemDataModifierFactory<I> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemDataModifier<I> create(Object arg) {
|
||||||
|
List<String> data = MiscUtils.getAsStringList(arg);
|
||||||
|
return new RemoveComponentModifier<>(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,61 @@
|
|||||||
|
package net.momirealms.craftengine.core.item.modifier;
|
||||||
|
|
||||||
|
import net.momirealms.craftengine.core.item.Item;
|
||||||
|
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
||||||
|
import net.momirealms.craftengine.core.item.NetworkItemHandler;
|
||||||
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
|
import net.momirealms.craftengine.core.util.VersionHelper;
|
||||||
|
import net.momirealms.sparrow.nbt.CompoundTag;
|
||||||
|
import net.momirealms.sparrow.nbt.Tag;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
public interface SimpleNetworkItemDataModifier<I> extends ItemDataModifier<I> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
default Item<I> prepareNetworkItem(Item<I> item, ItemBuildContext context, CompoundTag networkData) {
|
||||||
|
if (VersionHelper.COMPONENT_RELEASE) {
|
||||||
|
Key componentType= componentType(item, context);
|
||||||
|
if (componentType != null) {
|
||||||
|
Tag previous = item.getSparrowNBTComponent(componentType);
|
||||||
|
if (previous != null) {
|
||||||
|
networkData.put(componentType.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
||||||
|
} else {
|
||||||
|
networkData.put(componentType.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Object[] path = nbtPath(item, context);
|
||||||
|
if (path != null) {
|
||||||
|
Tag previous = item.getTag(path);
|
||||||
|
if (previous != null) {
|
||||||
|
networkData.put(nbtPathString(item, context), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
||||||
|
} else {
|
||||||
|
networkData.put(nbtPathString(item, context), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
default Key componentType(Item<I> item, ItemBuildContext context) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
default Object[] nbtPath(Item<I> item, ItemBuildContext context) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
default String nbtPathString(Item<I> item, ItemBuildContext context) {
|
||||||
|
Object[] path = nbtPath(item, context);
|
||||||
|
if (path != null && path.length > 0) {
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
for (Object object : path) {
|
||||||
|
builder.append(object.toString());
|
||||||
|
}
|
||||||
|
return builder.toString();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,12 +1,7 @@
|
|||||||
package net.momirealms.craftengine.core.item.modifier;
|
package net.momirealms.craftengine.core.item.modifier;
|
||||||
|
|
||||||
import net.momirealms.craftengine.core.item.ComponentKeys;
|
import net.momirealms.craftengine.core.item.*;
|
||||||
import net.momirealms.craftengine.core.item.Item;
|
import net.momirealms.craftengine.core.util.*;
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
|
||||||
import net.momirealms.craftengine.core.item.NetworkItemHandler;
|
|
||||||
import net.momirealms.craftengine.core.util.MiscUtils;
|
|
||||||
import net.momirealms.craftengine.core.util.TypeUtils;
|
|
||||||
import net.momirealms.craftengine.core.util.VersionHelper;
|
|
||||||
import net.momirealms.sparrow.nbt.CompoundTag;
|
import net.momirealms.sparrow.nbt.CompoundTag;
|
||||||
import net.momirealms.sparrow.nbt.Tag;
|
import net.momirealms.sparrow.nbt.Tag;
|
||||||
|
|
||||||
@@ -14,19 +9,20 @@ import java.util.LinkedHashMap;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class TagsModifier<I> implements ItemDataModifier<I> {
|
public class TagsModifier<I> implements ItemDataModifier<I> {
|
||||||
|
public static final Factory<?> FACTORY = new Factory<>();
|
||||||
private final Map<String, Object> arguments;
|
private final Map<String, Object> arguments;
|
||||||
|
|
||||||
public TagsModifier(Map<String, Object> arguments) {
|
public TagsModifier(Map<String, Object> arguments) {
|
||||||
this.arguments = mapToMap(arguments);
|
this.arguments = mapToMap(arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, Object> arguments() {
|
public Map<String, Object> tags() {
|
||||||
return arguments;
|
return arguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String name() {
|
public Key type() {
|
||||||
return "tags";
|
return ItemDataModifiers.TAGS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -135,4 +131,12 @@ public class TagsModifier<I> implements ItemDataModifier<I> {
|
|||||||
private record ParsedValue(boolean success, Object result) {
|
private record ParsedValue(boolean success, Object result) {
|
||||||
static final ParsedValue FAILURE = new ParsedValue(false, null);
|
static final ParsedValue FAILURE = new ParsedValue(false, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class Factory<I> implements ItemDataModifierFactory<I> {
|
||||||
|
@Override
|
||||||
|
public ItemDataModifier<I> create(Object arg) {
|
||||||
|
Map<String, Object> data = ResourceConfigUtils.getAsMap(arg, "nbt");
|
||||||
|
return new TagsModifier<>(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,21 +3,25 @@ package net.momirealms.craftengine.core.item.modifier;
|
|||||||
import net.momirealms.craftengine.core.item.ComponentKeys;
|
import net.momirealms.craftengine.core.item.ComponentKeys;
|
||||||
import net.momirealms.craftengine.core.item.Item;
|
import net.momirealms.craftengine.core.item.Item;
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
||||||
import net.momirealms.craftengine.core.item.NetworkItemHandler;
|
import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
|
||||||
import net.momirealms.craftengine.core.util.Key;
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
import net.momirealms.sparrow.nbt.CompoundTag;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import net.momirealms.sparrow.nbt.Tag;
|
|
||||||
|
|
||||||
public class TooltipStyleModifier<I> implements ItemDataModifier<I> {
|
public class TooltipStyleModifier<I> implements SimpleNetworkItemDataModifier<I> {
|
||||||
|
public static final Factory<?> FACTORY = new Factory<>();
|
||||||
private final Key argument;
|
private final Key argument;
|
||||||
|
|
||||||
public TooltipStyleModifier(Key argument) {
|
public TooltipStyleModifier(Key argument) {
|
||||||
this.argument = argument;
|
this.argument = argument;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Key tooltipStyle() {
|
||||||
|
return this.argument;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String name() {
|
public Key type() {
|
||||||
return "tooltip-style";
|
return ItemDataModifiers.TOOLTIP_STYLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -27,13 +31,16 @@ public class TooltipStyleModifier<I> implements ItemDataModifier<I> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Item<I> prepareNetworkItem(Item<I> item, ItemBuildContext context, CompoundTag networkData) {
|
public @Nullable Key componentType(Item<I> item, ItemBuildContext context) {
|
||||||
Tag previous = item.getSparrowNBTComponent(ComponentKeys.TOOLTIP_STYLE);
|
return ComponentKeys.TOOLTIP_STYLE;
|
||||||
if (previous != null) {
|
}
|
||||||
networkData.put(ComponentKeys.TOOLTIP_STYLE.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
|
||||||
} else {
|
public static class Factory<I> implements ItemDataModifierFactory<I> {
|
||||||
networkData.put(ComponentKeys.TOOLTIP_STYLE.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
|
||||||
|
@Override
|
||||||
|
public ItemDataModifier<I> create(Object arg) {
|
||||||
|
String id = arg.toString();
|
||||||
|
return new TooltipStyleModifier<>(Key.of(id));
|
||||||
}
|
}
|
||||||
return item;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,14 +3,17 @@ package net.momirealms.craftengine.core.item.modifier;
|
|||||||
import net.momirealms.craftengine.core.item.ComponentKeys;
|
import net.momirealms.craftengine.core.item.ComponentKeys;
|
||||||
import net.momirealms.craftengine.core.item.Item;
|
import net.momirealms.craftengine.core.item.Item;
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
||||||
import net.momirealms.craftengine.core.item.NetworkItemHandler;
|
import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
|
||||||
import net.momirealms.craftengine.core.item.data.Trim;
|
import net.momirealms.craftengine.core.item.data.Trim;
|
||||||
import net.momirealms.craftengine.core.util.Key;
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
import net.momirealms.craftengine.core.util.VersionHelper;
|
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
|
||||||
import net.momirealms.sparrow.nbt.CompoundTag;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import net.momirealms.sparrow.nbt.Tag;
|
|
||||||
|
|
||||||
public class TrimModifier<I> implements ItemDataModifier<I> {
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class TrimModifier<I> implements SimpleNetworkItemDataModifier<I> {
|
||||||
|
public static final Factory<?> FACTORY = new Factory<>();
|
||||||
private final Key material;
|
private final Key material;
|
||||||
private final Key pattern;
|
private final Key pattern;
|
||||||
|
|
||||||
@@ -19,34 +22,47 @@ public class TrimModifier<I> implements ItemDataModifier<I> {
|
|||||||
this.pattern = pattern;
|
this.pattern = pattern;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Key material() {
|
||||||
|
return material;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Key pattern() {
|
||||||
|
return pattern;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String name() {
|
public Key type() {
|
||||||
return "trim";
|
return ItemDataModifiers.TRIM;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Item<I> apply(Item<I> item, ItemBuildContext context) {
|
public Item<I> apply(Item<I> item, ItemBuildContext context) {
|
||||||
item.trim(new Trim(this.pattern, this.material));
|
return item.trim(new Trim(this.pattern, this.material));
|
||||||
return item;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Item<I> prepareNetworkItem(Item<I> item, ItemBuildContext context, CompoundTag networkData) {
|
public @Nullable Key componentType(Item<I> item, ItemBuildContext context) {
|
||||||
if (VersionHelper.isOrAbove1_20_5()) {
|
return ComponentKeys.TRIM;
|
||||||
Tag previous = item.getSparrowNBTComponent(ComponentKeys.TRIM);
|
|
||||||
if (previous != null) {
|
|
||||||
networkData.put(ComponentKeys.TRIM.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
|
||||||
} else {
|
|
||||||
networkData.put(ComponentKeys.TRIM.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
Tag previous = item.getTag("Trim");
|
@Override
|
||||||
if (previous != null) {
|
public @Nullable Object[] nbtPath(Item<I> item, ItemBuildContext context) {
|
||||||
networkData.put("Trim", NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
return new Object[]{"Trim"};
|
||||||
} else {
|
}
|
||||||
networkData.put("Trim", NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
|
||||||
|
@Override
|
||||||
|
public String nbtPathString(Item<I> item, ItemBuildContext context) {
|
||||||
|
return "Trim";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Factory<I> implements ItemDataModifierFactory<I> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemDataModifier<I> create(Object arg) {
|
||||||
|
Map<String, Object> data = ResourceConfigUtils.getAsMap(arg, "trim");
|
||||||
|
String material = data.get("material").toString().toLowerCase(Locale.ENGLISH);
|
||||||
|
String pattern = data.get("pattern").toString().toLowerCase(Locale.ENGLISH);
|
||||||
|
return new TrimModifier<>(Key.of(material), Key.of(pattern));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return item;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,21 +3,26 @@ package net.momirealms.craftengine.core.item.modifier;
|
|||||||
import net.momirealms.craftengine.core.item.ComponentKeys;
|
import net.momirealms.craftengine.core.item.ComponentKeys;
|
||||||
import net.momirealms.craftengine.core.item.Item;
|
import net.momirealms.craftengine.core.item.Item;
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
||||||
import net.momirealms.craftengine.core.item.NetworkItemHandler;
|
import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
|
||||||
import net.momirealms.craftengine.core.util.VersionHelper;
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
import net.momirealms.sparrow.nbt.CompoundTag;
|
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
|
||||||
import net.momirealms.sparrow.nbt.Tag;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
public class UnbreakableModifier<I> implements ItemDataModifier<I> {
|
public class UnbreakableModifier<I> implements SimpleNetworkItemDataModifier<I> {
|
||||||
|
public static final Factory<?> FACTORY = new Factory<>();
|
||||||
private final boolean argument;
|
private final boolean argument;
|
||||||
|
|
||||||
public UnbreakableModifier(boolean argument) {
|
public UnbreakableModifier(boolean argument) {
|
||||||
this.argument = argument;
|
this.argument = argument;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean unbreakable() {
|
||||||
|
return argument;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String name() {
|
public Key type() {
|
||||||
return "unbreakable";
|
return ItemDataModifiers.UNBREAKABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -27,22 +32,26 @@ public class UnbreakableModifier<I> implements ItemDataModifier<I> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Item<I> prepareNetworkItem(Item<I> item, ItemBuildContext context, CompoundTag networkData) {
|
public @Nullable Key componentType(Item<I> item, ItemBuildContext context) {
|
||||||
if (VersionHelper.isOrAbove1_20_5()) {
|
return ComponentKeys.UNBREAKABLE;
|
||||||
Tag previous = item.getSparrowNBTComponent(ComponentKeys.UNBREAKABLE);
|
|
||||||
if (previous != null) {
|
|
||||||
networkData.put(ComponentKeys.UNBREAKABLE.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
|
||||||
} else {
|
|
||||||
networkData.put(ComponentKeys.UNBREAKABLE.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
Tag previous = item.getTag("Unbreakable");
|
@Override
|
||||||
if (previous != null) {
|
public @Nullable Object[] nbtPath(Item<I> item, ItemBuildContext context) {
|
||||||
networkData.put("Unbreakable", NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
return new Object[]{"Unbreakable"};
|
||||||
} else {
|
}
|
||||||
networkData.put("Unbreakable", NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
|
||||||
|
@Override
|
||||||
|
public String nbtPathString(Item<I> item, ItemBuildContext context) {
|
||||||
|
return "Unbreakable";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Factory<I> implements ItemDataModifierFactory<I> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemDataModifier<I> create(Object arg) {
|
||||||
|
boolean value = ResourceConfigUtils.getAsBoolean(arg, "unbreakable");
|
||||||
|
return new UnbreakableModifier<>(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return item;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,16 +3,18 @@ package net.momirealms.craftengine.core.item.modifier.lore;
|
|||||||
import net.momirealms.craftengine.core.item.ComponentKeys;
|
import net.momirealms.craftengine.core.item.ComponentKeys;
|
||||||
import net.momirealms.craftengine.core.item.Item;
|
import net.momirealms.craftengine.core.item.Item;
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
||||||
import net.momirealms.craftengine.core.item.NetworkItemHandler;
|
import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
|
||||||
import net.momirealms.craftengine.core.item.modifier.ItemDataModifier;
|
import net.momirealms.craftengine.core.item.modifier.ItemDataModifier;
|
||||||
import net.momirealms.craftengine.core.util.VersionHelper;
|
import net.momirealms.craftengine.core.item.modifier.ItemDataModifiers;
|
||||||
import net.momirealms.sparrow.nbt.CompoundTag;
|
import net.momirealms.craftengine.core.item.modifier.SimpleNetworkItemDataModifier;
|
||||||
import net.momirealms.sparrow.nbt.Tag;
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
|
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
public final class DynamicLoreModifier<I> implements ItemDataModifier<I> {
|
public final class DynamicLoreModifier<I> implements SimpleNetworkItemDataModifier<I> {
|
||||||
|
public static final Factory<?> FACTORY = new Factory<>();
|
||||||
public static final String CONTEXT_TAG_KEY = "craftengine:display_context";
|
public static final String CONTEXT_TAG_KEY = "craftengine:display_context";
|
||||||
private final Map<String, LoreModifier<I>> displayContexts;
|
private final Map<String, LoreModifier<I>> displayContexts;
|
||||||
private final LoreModifier<I> defaultModifier;
|
private final LoreModifier<I> defaultModifier;
|
||||||
@@ -27,8 +29,8 @@ public final class DynamicLoreModifier<I> implements ItemDataModifier<I> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String name() {
|
public Key type() {
|
||||||
return "dynamic-lore";
|
return ItemDataModifiers.DYNAMIC_LORE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -42,22 +44,30 @@ public final class DynamicLoreModifier<I> implements ItemDataModifier<I> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Item<I> prepareNetworkItem(Item<I> item, ItemBuildContext context, CompoundTag networkData) {
|
public Key componentType(Item<I> item, ItemBuildContext context) {
|
||||||
if (VersionHelper.isOrAbove1_20_5()) {
|
return ComponentKeys.LORE;
|
||||||
Tag previous = item.getSparrowNBTComponent(ComponentKeys.LORE);
|
|
||||||
if (previous != null) {
|
|
||||||
networkData.put(ComponentKeys.LORE.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
|
||||||
} else {
|
|
||||||
networkData.put(ComponentKeys.LORE.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
Tag previous = item.getTag("display", "Lore");
|
@Override
|
||||||
if (previous != null) {
|
public Object[] nbtPath(Item<I> item, ItemBuildContext context) {
|
||||||
networkData.put("display.Lore", NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
return new Object[]{"display", "Lore"};
|
||||||
} else {
|
}
|
||||||
networkData.put("display.Lore", NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
|
||||||
|
@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) {
|
||||||
|
Map<String, LoreModifier<I>> dynamicLore = new LinkedHashMap<>();
|
||||||
|
if (arg instanceof Map<?, ?> map) {
|
||||||
|
for (Map.Entry<?, ?> entry : map.entrySet()) {
|
||||||
|
dynamicLore.put(entry.getKey().toString(), LoreModifier.createLoreModifier(entry.getValue()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return item;
|
return new DynamicLoreModifier<>(dynamicLore);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,37 +4,51 @@ import net.kyori.adventure.text.Component;
|
|||||||
import net.momirealms.craftengine.core.item.ComponentKeys;
|
import net.momirealms.craftengine.core.item.ComponentKeys;
|
||||||
import net.momirealms.craftengine.core.item.Item;
|
import net.momirealms.craftengine.core.item.Item;
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
||||||
import net.momirealms.craftengine.core.item.NetworkItemHandler;
|
import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
|
||||||
import net.momirealms.craftengine.core.item.modifier.ItemDataModifier;
|
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.craftengine.core.util.MiscUtils;
|
import net.momirealms.craftengine.core.util.MiscUtils;
|
||||||
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
|
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
|
||||||
import net.momirealms.craftengine.core.util.VersionHelper;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import net.momirealms.sparrow.nbt.CompoundTag;
|
|
||||||
import net.momirealms.sparrow.nbt.Tag;
|
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public sealed interface LoreModifier<I> extends ItemDataModifier<I>
|
public sealed interface LoreModifier<I> extends SimpleNetworkItemDataModifier<I>
|
||||||
permits LoreModifier.EmptyLoreModifier, LoreModifier.CompositeLoreModifier, LoreModifier.DoubleLoreModifier, LoreModifier.SingleLoreModifier {
|
permits LoreModifier.EmptyLoreModifier, LoreModifier.CompositeLoreModifier, LoreModifier.DoubleLoreModifier, LoreModifier.SingleLoreModifier {
|
||||||
|
Factory<?> FACTORY = new Factory<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
default String name() {
|
default Key type() {
|
||||||
return "lore";
|
return ItemDataModifiers.LORE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
default Item<I> prepareNetworkItem(Item<I> item, ItemBuildContext context, CompoundTag networkData) {
|
@Nullable
|
||||||
if (VersionHelper.isOrAbove1_20_5()) {
|
default Key componentType(Item<I> item, ItemBuildContext context) {
|
||||||
Tag previous = item.getSparrowNBTComponent(ComponentKeys.LORE);
|
return ComponentKeys.LORE;
|
||||||
if (previous != null) networkData.put(ComponentKeys.LORE.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
}
|
||||||
else networkData.put(ComponentKeys.LORE.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
|
||||||
} else {
|
@Override
|
||||||
Tag previous = item.getTag("display", "Lore");
|
@Nullable
|
||||||
if (previous != null) networkData.put("display.Lore", NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous));
|
default Object[] nbtPath(Item<I> item, ItemBuildContext context) {
|
||||||
else networkData.put("display.Lore", NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE));
|
return new Object[]{"display", "Lore"};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
default String nbtPathString(Item<I> item, ItemBuildContext context) {
|
||||||
|
return "display.Lore";
|
||||||
|
}
|
||||||
|
|
||||||
|
List<LoreModification> lore();
|
||||||
|
|
||||||
|
class Factory<I> implements ItemDataModifierFactory<I> {
|
||||||
|
@Override
|
||||||
|
public ItemDataModifier<I> create(Object arg) {
|
||||||
|
return createLoreModifier(arg);
|
||||||
}
|
}
|
||||||
return item;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static <I> LoreModifier<I> createLoreModifier(Object arg) {
|
static <I> LoreModifier<I> createLoreModifier(Object arg) {
|
||||||
@@ -78,6 +92,11 @@ public sealed interface LoreModifier<I> extends ItemDataModifier<I>
|
|||||||
public Item<I> apply(Item<I> item, ItemBuildContext context) {
|
public Item<I> apply(Item<I> item, ItemBuildContext context) {
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<LoreModification> lore() {
|
||||||
|
return List.of();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
non-sealed class SingleLoreModifier<I> implements LoreModifier<I> {
|
non-sealed class SingleLoreModifier<I> implements LoreModifier<I> {
|
||||||
@@ -92,6 +111,11 @@ public sealed interface LoreModifier<I> extends ItemDataModifier<I>
|
|||||||
item.loreComponent(this.modification.parseAsList(context));
|
item.loreComponent(this.modification.parseAsList(context));
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<LoreModification> lore() {
|
||||||
|
return List.of(modification);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
non-sealed class DoubleLoreModifier<I> implements LoreModifier<I> {
|
non-sealed class DoubleLoreModifier<I> implements LoreModifier<I> {
|
||||||
@@ -108,6 +132,11 @@ public sealed interface LoreModifier<I> extends ItemDataModifier<I>
|
|||||||
item.loreComponent(this.modification2.apply(this.modification1.apply(Stream.empty(), context), context).toList());
|
item.loreComponent(this.modification2.apply(this.modification1.apply(Stream.empty(), context), context).toList());
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<LoreModification> lore() {
|
||||||
|
return List.of(modification1, modification2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
non-sealed class CompositeLoreModifier<I> implements LoreModifier<I> {
|
non-sealed class CompositeLoreModifier<I> implements LoreModifier<I> {
|
||||||
@@ -122,5 +151,10 @@ public sealed interface LoreModifier<I> extends ItemDataModifier<I>
|
|||||||
item.loreComponent(Arrays.stream(this.modifications).reduce(Stream.<Component>empty(), (stream, modification) -> modification.apply(stream, context), Stream::concat).toList());
|
item.loreComponent(Arrays.stream(this.modifications).reduce(Stream.<Component>empty(), (stream, modification) -> modification.apply(stream, context), Stream::concat).toList());
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<LoreModification> lore() {
|
||||||
|
return Arrays.asList(modifications);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import net.momirealms.craftengine.core.item.BuildableItem;
|
|||||||
import net.momirealms.craftengine.core.item.Item;
|
import net.momirealms.craftengine.core.item.Item;
|
||||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
||||||
import net.momirealms.craftengine.core.item.modifier.ItemDataModifier;
|
import net.momirealms.craftengine.core.item.modifier.ItemDataModifier;
|
||||||
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
|
||||||
import net.momirealms.craftengine.core.registry.BuiltInRegistries;
|
import net.momirealms.craftengine.core.registry.BuiltInRegistries;
|
||||||
import net.momirealms.craftengine.core.registry.Registries;
|
import net.momirealms.craftengine.core.registry.Registries;
|
||||||
import net.momirealms.craftengine.core.registry.WritableRegistry;
|
import net.momirealms.craftengine.core.registry.WritableRegistry;
|
||||||
@@ -33,9 +32,8 @@ public record CustomRecipeResult<T>(BuildableItem<T> item, int count, PostProces
|
|||||||
registerPostProcessorType(Key.of("apply_data"), args -> {
|
registerPostProcessorType(Key.of("apply_data"), args -> {
|
||||||
List<ItemDataModifier<?>> modifiers = new ArrayList<>();
|
List<ItemDataModifier<?>> modifiers = new ArrayList<>();
|
||||||
for (Map.Entry<String, Object> entry : args.entrySet()) {
|
for (Map.Entry<String, Object> entry : args.entrySet()) {
|
||||||
Optional.ofNullable(CraftEngine.instance().itemManager().getDataType(entry.getKey())).ifPresent(it -> {
|
Optional.ofNullable(BuiltInRegistries.ITEM_DATA_MODIFIER_FACTORY.getValue(Key.withDefaultNamespace(entry.getKey(), "craftengine")))
|
||||||
modifiers.add(it.apply(entry.getValue()));
|
.ifPresent(factory -> modifiers.add(factory.create(entry.getValue())));
|
||||||
});
|
|
||||||
}
|
}
|
||||||
return new ApplyItemDataProcessor<>(modifiers.toArray(new ItemDataModifier[0]));
|
return new ApplyItemDataProcessor<>(modifiers.toArray(new ItemDataModifier[0]));
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -591,11 +591,7 @@ public abstract class AbstractPackManager implements PackManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (LocalizedException e) {
|
} catch (LocalizedException e) {
|
||||||
if (e instanceof LocalizedResourceConfigException exception) {
|
printWarningRecursively(e, cached.filePath(), cached.prefix() + "." + key);
|
||||||
exception.setPath(cached.filePath());
|
|
||||||
exception.setId(cached.prefix() + "." + key);
|
|
||||||
}
|
|
||||||
TranslationManager.instance().log(e.node(), e.arguments());
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
this.plugin.logger().warn("Unexpected error loading file " + cached.filePath() + " - '" + parser.sectionId()[0] + "." + key + "'. Please find the cause according to the stacktrace or seek developer help. Additional info: " + GsonHelper.get().toJson(configEntry.getValue()), e);
|
this.plugin.logger().warn("Unexpected error loading file " + cached.filePath() + " - '" + parser.sectionId()[0] + "." + key + "'. Please find the cause according to the stacktrace or seek developer help. Additional info: " + GsonHelper.get().toJson(configEntry.getValue()), e);
|
||||||
}
|
}
|
||||||
@@ -607,6 +603,19 @@ public abstract class AbstractPackManager implements PackManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void printWarningRecursively(LocalizedException e, Path path, String prefix) {
|
||||||
|
for (Throwable t : e.getSuppressed()) {
|
||||||
|
if (t instanceof LocalizedException suppressed) {
|
||||||
|
printWarningRecursively(suppressed, path, prefix);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (e instanceof LocalizedResourceConfigException exception) {
|
||||||
|
exception.setPath(path);
|
||||||
|
exception.setId(prefix);
|
||||||
|
}
|
||||||
|
TranslationManager.instance().log(e.node(), e.arguments());
|
||||||
|
}
|
||||||
|
|
||||||
private void processConfigEntry(Map.Entry<String, Object> entry, Path path, Pack pack, BiConsumer<ConfigParser, CachedConfigSection> callback) {
|
private void processConfigEntry(Map.Entry<String, Object> entry, Path path, Pack pack, BiConsumer<ConfigParser, CachedConfigSection> callback) {
|
||||||
if (entry.getValue() instanceof Map<?,?> typeSections0) {
|
if (entry.getValue() instanceof Map<?,?> typeSections0) {
|
||||||
String key = entry.getKey();
|
String key = entry.getKey();
|
||||||
|
|||||||
@@ -31,6 +31,10 @@ public class FixedNumberProvider implements NumberProvider {
|
|||||||
return NumberProviders.FIXED;
|
return NumberProviders.FIXED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static FixedNumberProvider of(final double value) {
|
||||||
|
return new FixedNumberProvider(value);
|
||||||
|
}
|
||||||
|
|
||||||
public static class FactoryImpl implements NumberProviderFactory {
|
public static class FactoryImpl implements NumberProviderFactory {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import net.momirealms.craftengine.core.block.CustomBlock;
|
|||||||
import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory;
|
import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory;
|
||||||
import net.momirealms.craftengine.core.block.properties.PropertyFactory;
|
import net.momirealms.craftengine.core.block.properties.PropertyFactory;
|
||||||
import net.momirealms.craftengine.core.entity.furniture.HitBoxFactory;
|
import net.momirealms.craftengine.core.entity.furniture.HitBoxFactory;
|
||||||
|
import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
|
||||||
import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory;
|
import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory;
|
||||||
import net.momirealms.craftengine.core.item.equipment.EquipmentFactory;
|
import net.momirealms.craftengine.core.item.equipment.EquipmentFactory;
|
||||||
import net.momirealms.craftengine.core.item.recipe.CustomRecipeResult;
|
import net.momirealms.craftengine.core.item.recipe.CustomRecipeResult;
|
||||||
@@ -42,6 +43,7 @@ import net.momirealms.craftengine.core.util.ResourceKey;
|
|||||||
public class BuiltInRegistries {
|
public class BuiltInRegistries {
|
||||||
public static final Registry<CustomBlock> BLOCK = createDynamicBoundRegistry(Registries.BLOCK);
|
public static final Registry<CustomBlock> BLOCK = createDynamicBoundRegistry(Registries.BLOCK);
|
||||||
public static final Registry<BlockBehaviorFactory> BLOCK_BEHAVIOR_FACTORY = createConstantBoundRegistry(Registries.BLOCK_BEHAVIOR_FACTORY);
|
public static final Registry<BlockBehaviorFactory> BLOCK_BEHAVIOR_FACTORY = createConstantBoundRegistry(Registries.BLOCK_BEHAVIOR_FACTORY);
|
||||||
|
public static final Registry<ItemDataModifierFactory<?>> ITEM_DATA_MODIFIER_FACTORY = createConstantBoundRegistry(Registries.ITEM_DATA_MODIFIER_FACTORY);
|
||||||
public static final Registry<ItemBehaviorFactory> ITEM_BEHAVIOR_FACTORY = createConstantBoundRegistry(Registries.ITEM_BEHAVIOR_FACTORY);
|
public static final Registry<ItemBehaviorFactory> ITEM_BEHAVIOR_FACTORY = createConstantBoundRegistry(Registries.ITEM_BEHAVIOR_FACTORY);
|
||||||
public static final Registry<PropertyFactory> PROPERTY_FACTORY = createConstantBoundRegistry(Registries.PROPERTY_FACTORY);
|
public static final Registry<PropertyFactory> PROPERTY_FACTORY = createConstantBoundRegistry(Registries.PROPERTY_FACTORY);
|
||||||
public static final Registry<LootFunctionFactory<?>> LOOT_FUNCTION_FACTORY = createConstantBoundRegistry(Registries.LOOT_FUNCTION_FACTORY);
|
public static final Registry<LootFunctionFactory<?>> LOOT_FUNCTION_FACTORY = createConstantBoundRegistry(Registries.LOOT_FUNCTION_FACTORY);
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import net.momirealms.craftengine.core.block.CustomBlock;
|
|||||||
import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory;
|
import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory;
|
||||||
import net.momirealms.craftengine.core.block.properties.PropertyFactory;
|
import net.momirealms.craftengine.core.block.properties.PropertyFactory;
|
||||||
import net.momirealms.craftengine.core.entity.furniture.HitBoxFactory;
|
import net.momirealms.craftengine.core.entity.furniture.HitBoxFactory;
|
||||||
|
import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
|
||||||
import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory;
|
import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory;
|
||||||
import net.momirealms.craftengine.core.item.equipment.EquipmentFactory;
|
import net.momirealms.craftengine.core.item.equipment.EquipmentFactory;
|
||||||
import net.momirealms.craftengine.core.item.recipe.CustomRecipeResult;
|
import net.momirealms.craftengine.core.item.recipe.CustomRecipeResult;
|
||||||
@@ -43,6 +44,7 @@ import net.momirealms.craftengine.core.util.ResourceKey;
|
|||||||
public class Registries {
|
public class Registries {
|
||||||
public static final Key ROOT_REGISTRY = Key.withDefaultNamespace("root");
|
public static final Key ROOT_REGISTRY = Key.withDefaultNamespace("root");
|
||||||
public static final ResourceKey<Registry<CustomBlock>> BLOCK = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("block"));
|
public static final ResourceKey<Registry<CustomBlock>> BLOCK = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("block"));
|
||||||
|
public static final ResourceKey<Registry<ItemDataModifierFactory<?>>> ITEM_DATA_MODIFIER_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("item_data_modifier_factory"));
|
||||||
public static final ResourceKey<Registry<PropertyFactory>> PROPERTY_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("property_factory"));
|
public static final ResourceKey<Registry<PropertyFactory>> PROPERTY_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("property_factory"));
|
||||||
public static final ResourceKey<Registry<BlockBehaviorFactory>> BLOCK_BEHAVIOR_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("block_behavior_factory"));
|
public static final ResourceKey<Registry<BlockBehaviorFactory>> BLOCK_BEHAVIOR_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("block_behavior_factory"));
|
||||||
public static final ResourceKey<Registry<ItemBehaviorFactory>> ITEM_BEHAVIOR_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("item_behavior_factory"));
|
public static final ResourceKey<Registry<ItemBehaviorFactory>> ITEM_BEHAVIOR_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("item_behavior_factory"));
|
||||||
|
|||||||
@@ -19,5 +19,10 @@ public class ExceptionCollector<T extends Throwable> {
|
|||||||
throw this.result;
|
throw this.result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addAndThrow(T throwable) throws T {
|
||||||
|
this.add(throwable);
|
||||||
|
this.throwIfPresent();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -204,4 +204,12 @@ public final class ResourceConfigUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static Map<String, Object> getAsMap(Object obj, String option) {
|
||||||
|
if (obj instanceof Map<?, ?> map) {
|
||||||
|
return (Map<String, Object>) map;
|
||||||
|
}
|
||||||
|
throw new LocalizedResourceConfigException("warning.config.type.map", String.valueOf(obj), option);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import java.nio.charset.StandardCharsets;
|
|||||||
public class VersionHelper {
|
public class VersionHelper {
|
||||||
public static final boolean PREMIUM = true;
|
public static final boolean PREMIUM = true;
|
||||||
public static final MinecraftVersion MINECRAFT_VERSION;
|
public static final MinecraftVersion MINECRAFT_VERSION;
|
||||||
|
public static final boolean COMPONENT_RELEASE;
|
||||||
private static final int version;
|
private static final int version;
|
||||||
private static final int majorVersion;
|
private static final int majorVersion;
|
||||||
private static final int minorVersion;
|
private static final int minorVersion;
|
||||||
@@ -71,6 +72,8 @@ public class VersionHelper {
|
|||||||
majorVersion = major;
|
majorVersion = major;
|
||||||
minorVersion = minor;
|
minorVersion = minor;
|
||||||
|
|
||||||
|
COMPONENT_RELEASE = v1_20_5;
|
||||||
|
|
||||||
mojmap = checkMojMap();
|
mojmap = checkMojMap();
|
||||||
folia = checkFolia();
|
folia = checkFolia();
|
||||||
paper = checkPaper();
|
paper = checkPaper();
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ org.gradle.jvmargs=-Xmx1G
|
|||||||
|
|
||||||
# Project settings
|
# Project settings
|
||||||
# Rule: [major update].[feature update].[bug fix]
|
# Rule: [major update].[feature update].[bug fix]
|
||||||
project_version=0.0.60.8
|
project_version=0.0.60.9
|
||||||
config_version=43
|
config_version=43
|
||||||
lang_version=22
|
lang_version=23
|
||||||
project_group=net.momirealms
|
project_group=net.momirealms
|
||||||
latest_supported_version=1.21.8
|
latest_supported_version=1.21.8
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user