package de.take_weiland.mods.commons.internal.tonbt.builtin; import de.take_weiland.mods.commons.nbt.NBT; import de.take_weiland.mods.commons.nbt.NBTSerializer; import de.take_weiland.mods.commons.nbt.NBTSerializerFactory; import de.take_weiland.mods.commons.serialize.Property; import net.minecraft.nbt.*; import javax.annotation.ParametersAreNonnullByDefault; /** * @author diesieben07 */ @ParametersAreNonnullByDefault public final class DefaultNBTSerializers implements NBTSerializerFactory { @Override public <T> NBTSerializer<T> get(Property<T, ?> typeSpec) { Class<?> raw = typeSpec.getRawType(); NBTSerializer<?> result; if (raw == boolean.class) { result = ForBool.INSTANCE; } else if (raw == byte.class) { result = ForByte.INSTANCE; } else if (raw == short.class) { result = ForShort.INSTANCE; } else if (raw == char.class) { result = ForChar.INSTANCE; } else if (raw == int.class) { result = ForInt.INSTANCE; } else if (raw == long.class) { result = ForLong.INSTANCE; } else if (raw == float.class) { result = ForFloat.INSTANCE; } else if (raw == double.class) { result = ForDouble.INSTANCE; } else if (raw == String.class) { result = ForString.INSTANCE; } else if (raw == CharSequence.class) { result = ForCharSeq.INSTANCE; } else if (raw.isEnum()) { result = EnumSerializer.get(raw); } else { result = null; } //noinspection unchecked return (NBTSerializer<T>) result; } private enum ForBool implements NBTSerializer<Boolean> { INSTANCE; private static final byte TRUE = 1; private static final byte FALSE = 0; @Override public NBTBase write(Boolean value) { return new NBTTagByte("", value ? TRUE : FALSE); } @Override public Boolean read(Boolean value, NBTBase nbt) { return nbt.getId() == NBT.TAG_BYTE && ((NBTTagByte) nbt).data == TRUE; } } private enum ForByte implements NBTSerializer<Byte> { INSTANCE; @Override public NBTBase write(Byte value) { return new NBTTagByte("", value); } @Override public Byte read(Byte value, NBTBase nbt) { return nbt.getId() == NBT.TAG_BYTE ? ((NBTTagByte) nbt).data : 0; } } private enum ForShort implements NBTSerializer<Short> { INSTANCE; @Override public NBTBase write(Short value) { return new NBTTagShort("", value); } @Override public Short read(Short value, NBTBase nbt) { return nbt.getId() == NBT.TAG_SHORT ? ((NBTTagShort) nbt).data : 0; } } private enum ForChar implements NBTSerializer<Character> { INSTANCE; @Override public NBTBase write(Character value) { return new NBTTagShort("", (short) value.charValue()); } @Override public Character read(Character value, NBTBase nbt) { return nbt.getId() == NBT.TAG_SHORT ? (char) ((NBTTagShort) nbt).data : 0; } } private enum ForInt implements NBTSerializer<Integer> { INSTANCE; @Override public NBTBase write(Integer value) { return new NBTTagInt("", value); } @Override public Integer read(Integer value, NBTBase nbt) { return nbt.getId() == NBT.TAG_INT ? ((NBTTagInt) nbt).data : 0; } } private enum ForLong implements NBTSerializer<Long> { INSTANCE; @Override public NBTBase write(Long value) { return new NBTTagLong("", value); } @Override public Long read(Long value, NBTBase nbt) { return nbt.getId() == NBT.TAG_LONG ? ((NBTTagLong) nbt).data : 0; } } private enum ForFloat implements NBTSerializer<Float> { INSTANCE; @Override public NBTBase write(Float value) { return new NBTTagFloat("", value); } @Override public Float read(Float value, NBTBase nbt) { return nbt.getId() == NBT.TAG_FLOAT ? ((NBTTagFloat) nbt).data : 0f; } } private enum ForDouble implements NBTSerializer<Double> { INSTANCE; @Override public NBTBase write(Double value) { return new NBTTagDouble("", value); } @Override public Double read(Double value, NBTBase nbt) { return nbt.getId() == NBT.TAG_DOUBLE ? ((NBTTagDouble) nbt).data : 0d; } } private enum ForString implements NBTSerializer<String> { INSTANCE; @Override public NBTBase write(String value) { return value.isEmpty() ? new NBTTagByte("", (byte) 0) : new NBTTagString("", value); } @Override public String read(String value, NBTBase nbt) { return nbt.getId() == NBT.TAG_STRING ? ((NBTTagString) nbt).data : ""; } } private enum ForCharSeq implements NBTSerializer<CharSequence> { INSTANCE; @Override public NBTBase write(CharSequence value) { return new NBTTagString("", value.toString()); } @Override public CharSequence read(CharSequence value, NBTBase nbt) { return nbt.getId()== NBT.TAG_STRING ? ((NBTTagString) nbt).data : null; } } }