/* * Super Lead rope mod * Copyright (C) 2025 R3944Realms * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package top.r3944realms.lib39.util.nbt; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.UUID; import java.util.function.Consumer; /** * The type Nbt reader. */ @SuppressWarnings("unused") public class NBTReader { private final CompoundTag nbt; private NBTReader(CompoundTag nbt) { this.nbt = nbt; } /** * 从CompoundTag创建读取器 * * @param nbt the nbt * @return the nbt reader */ @NotNull public static NBTReader of(@NotNull CompoundTag nbt) { return new NBTReader(nbt); } /** * String nbt reader. * * @param key the key * @param setter the setter * @return the nbt reader */ // 基本读取方法 - 直接赋值给成员变量 public NBTReader string(String key, Consumer setter) { if (nbt.contains(key)) { setter.accept(nbt.getString(key)); } return this; } /** * String nbt reader. * * @param key the key * @param setter the setter * @param defaultValue the default value * @return the nbt reader */ public NBTReader string(String key, @NotNull Consumer setter, String defaultValue) { setter.accept(nbt.contains(key) ? nbt.getString(key) : defaultValue); return this; } /** * Byte value nbt reader. * * @param key the key * @param setter the setter * @return the nbt reader */ public NBTReader byteValue(String key, Consumer setter) { if (nbt.contains(key)) { setter.accept(nbt.getByte(key)); } return this; } /** * Byte value nbt reader. * * @param key the key * @param setter the setter * @param defaultValue the default value * @return the nbt reader */ public NBTReader byteValue(String key, @NotNull Consumer setter, byte defaultValue) { setter.accept(nbt.contains(key) ? nbt.getByte(key) : defaultValue); return this; } /** * Short value nbt reader. * * @param key the key * @param setter the setter * @return the nbt reader */ public NBTReader shortValue(String key, Consumer setter) { if (nbt.contains(key)) { setter.accept(nbt.getShort(key)); } return this; } /** * Short value nbt reader. * * @param key the key * @param setter the setter * @param defaultValue the default value * @return the nbt reader */ public NBTReader shortValue(String key, @NotNull Consumer setter, short defaultValue) { setter.accept(nbt.contains(key) ? nbt.getShort(key) : defaultValue); return this; } /** * Int value nbt reader. * * @param key the key * @param setter the setter * @return the nbt reader */ public NBTReader intValue(String key, Consumer setter) { if (nbt.contains(key)) { setter.accept(nbt.getInt(key)); } return this; } /** * Int value nbt reader. * * @param key the key * @param setter the setter * @param defaultValue the default value * @return the nbt reader */ public NBTReader intValue(String key, @NotNull Consumer setter, int defaultValue) { setter.accept(nbt.contains(key) ? nbt.getInt(key) : defaultValue); return this; } /** * Long value nbt reader. * * @param key the key * @param setter the setter * @return the nbt reader */ public NBTReader longValue(String key, Consumer setter) { if (nbt.contains(key)) { setter.accept(nbt.getLong(key)); } return this; } /** * Long value nbt reader. * * @param key the key * @param setter the setter * @param defaultValue the default value * @return the nbt reader */ public NBTReader longValue(String key, @NotNull Consumer setter, long defaultValue) { setter.accept(nbt.contains(key) ? nbt.getLong(key) : defaultValue); return this; } /** * Float value nbt reader. * * @param key the key * @param setter the setter * @return the nbt reader */ public NBTReader floatValue(String key, Consumer setter) { if (nbt.contains(key)) { setter.accept(nbt.getFloat(key)); } return this; } /** * Float value nbt reader. * * @param key the key * @param setter the setter * @param defaultValue the default value * @return the nbt reader */ public NBTReader floatValue(String key, @NotNull Consumer setter, float defaultValue) { setter.accept(nbt.contains(key) ? nbt.getFloat(key) : defaultValue); return this; } /** * Double value nbt reader. * * @param key the key * @param setter the setter * @return the nbt reader */ public NBTReader doubleValue(String key, Consumer setter) { if (nbt.contains(key)) { setter.accept(nbt.getDouble(key)); } return this; } /** * Double value nbt reader. * * @param key the key * @param setter the setter * @param defaultValue the default value * @return the nbt reader */ public NBTReader doubleValue(String key, @NotNull Consumer setter, double defaultValue) { setter.accept(nbt.contains(key) ? nbt.getDouble(key) : defaultValue); return this; } /** * Boolean value nbt reader. * * @param key the key * @param setter the setter * @return the nbt reader */ public NBTReader booleanValue(String key, Consumer setter) { if (nbt.contains(key)) { setter.accept(nbt.getBoolean(key)); } return this; } /** * Boolean value nbt reader. * * @param key the key * @param setter the setter * @param defaultValue the default value * @return the nbt reader */ public NBTReader booleanValue(String key, @NotNull Consumer setter, boolean defaultValue) { setter.accept(nbt.contains(key) ? nbt.getBoolean(key) : defaultValue); return this; } /** * Byte array nbt reader. * * @param key the key * @param setter the setter * @return the nbt reader */ // 数组类型 public NBTReader byteArray(String key, Consumer setter) { if (nbt.contains(key)) { setter.accept(nbt.getByteArray(key)); } return this; } /** * Int array nbt reader. * * @param key the key * @param setter the setter * @return the nbt reader */ public NBTReader intArray(String key, Consumer setter) { if (nbt.contains(key)) { setter.accept(nbt.getIntArray(key)); } return this; } /** * Long array nbt reader. * * @param key the key * @param setter the setter * @return the nbt reader */ public NBTReader longArray(String key, Consumer setter) { if (nbt.contains(key)) { setter.accept(nbt.getLongArray(key)); } return this; } /** * Uuid nbt reader. * * @param key the key * @param setter the setter * @return the nbt reader */ // UUID public NBTReader uuid(String key, Consumer setter) { if (nbt.hasUUID(key)) { setter.accept(nbt.getUUID(key)); } return this; } /** * Uuid nbt reader. * * @param key the key * @param setter the setter * @param defaultValue the default value * @return the nbt reader */ public NBTReader uuid(String key, @NotNull Consumer setter, UUID defaultValue) { setter.accept(nbt.hasUUID(key) ? nbt.getUUID(key) : defaultValue); return this; } /** * Compound nbt reader. * * @param key the key * @param setter the setter * @return the nbt reader */ // CompoundTag public NBTReader compound(String key, Consumer setter) { if (nbt.contains(key)) { setter.accept(nbt.getCompound(key)); } return this; } /** * Compound nbt reader. * * @param key the key * @param setter the setter * @param defaultValue the default value * @return the nbt reader */ public NBTReader compound(String key, @NotNull Consumer setter, CompoundTag defaultValue) { setter.accept(nbt.contains(key) ? nbt.getCompound(key) : defaultValue); return this; } /** * List nbt reader. * * @param key the key * @param type the type * @param setter the setter * @return the nbt reader */ // ListTag public NBTReader list(String key, int type, Consumer setter) { if (nbt.contains(key)) { setter.accept(nbt.getList(key, type)); } return this; } /** * Vec 3 nbt reader. * * @param key the key * @param setter the setter * @return the nbt reader */ // Vec3支持 public NBTReader vec3(String key, Consumer setter) { if (nbt.contains(key)) { CompoundTag vecTag = nbt.getCompound(key); if (vecTag.contains("X") && vecTag.contains("Y") && vecTag.contains("Z")) { setter.accept(new Vec3( vecTag.getDouble("X"), vecTag.getDouble("Y"), vecTag.getDouble("Z") )); } } return this; } /** * Vec 3 nbt reader. * * @param key the key * @param setter the setter * @param defaultValue the default value * @return the nbt reader */ public NBTReader vec3(String key, Consumer setter, Vec3 defaultValue) { if (nbt.contains(key)) { CompoundTag vecTag = nbt.getCompound(key); if (vecTag.contains("X") && vecTag.contains("Y") && vecTag.contains("Z")) { setter.accept(new Vec3( vecTag.getDouble("X"), vecTag.getDouble("Y"), vecTag.getDouble("Z") )); return this; } } setter.accept(defaultValue); return this; } /** * Enum value nbt reader. * * @param the type parameter * @param key the key * @param enumClass the enum class * @param setter the setter * @return the nbt reader */ // 枚举支持 public > NBTReader enumValue(String key, Class enumClass, Consumer setter) { if (nbt.contains(key)) { String value = nbt.getString(key); try { setter.accept(Enum.valueOf(enumClass, value.toUpperCase())); } catch (IllegalArgumentException ignored) { // 保持setter的当前值 } } return this; } /** * Enum value nbt reader. * * @param the type parameter * @param key the key * @param enumClass the enum class * @param setter the setter * @param defaultValue the default value * @return the nbt reader */ public > NBTReader enumValue(String key, Class enumClass, Consumer setter, T defaultValue) { if (nbt.contains(key)) { String value = nbt.getString(key); try { setter.accept(Enum.valueOf(enumClass, value.toUpperCase())); return this; } catch (IllegalArgumentException ignored) { } } setter.accept(defaultValue); return this; } /** * Nested nbt reader. * * @param key the key * @param consumer the consumer * @return the nbt reader */ // 嵌套读取支持 public NBTReader nested(String key, Consumer consumer) { if (nbt.contains(key)) { consumer.accept(new NBTReader(nbt.getCompound(key))); } return this; } /** * Nested nbt reader. * * @param key the key * @param consumer the consumer * @param orElse the or else * @return the nbt reader */ public NBTReader nested(String key, Consumer consumer, Runnable orElse) { if (nbt.contains(key)) { consumer.accept(new NBTReader(nbt.getCompound(key))); } else { orElse.run(); } return this; } /** * If present nbt reader. * * @param key the key * @param action the action * @return the nbt reader */ // 条件读取 public NBTReader ifPresent(String key, Runnable action) { if (nbt.contains(key)) { action.run(); } return this; } /** * If absent nbt reader. * * @param key the key * @param action the action * @return the nbt reader */ public NBTReader ifAbsent(String key, Runnable action) { if (!nbt.contains(key)) { action.run(); } return this; } /** * Gets raw. * * @return the raw */ // 获取原始NBT @NotNull public CompoundTag getRaw() { return nbt; } /** * Read vec 3 vec 3. * * @param nbt the nbt * @return the vec 3 */ // 便捷的静态方法(保持原有功能) @NotNull public static Vec3 readVec3(@NotNull CompoundTag nbt) { if (nbt.contains("X") && nbt.contains("Y") && nbt.contains("Z")) { return new Vec3( nbt.getDouble("X"), nbt.getDouble("Y"), nbt.getDouble("Z") ); } else { throw new IllegalArgumentException("NBT is missing X, Y, or Z value for Vec3"); } } /** * Read vec 3 safe vec 3. * * @param nbt the nbt * @return the vec 3 */ @Nullable public static Vec3 readVec3Safe(@NotNull CompoundTag nbt) { if (nbt.contains("X") && nbt.contains("Y") && nbt.contains("Z")) { return new Vec3( nbt.getDouble("X"), nbt.getDouble("Y"), nbt.getDouble("Z") ); } return null; } }