/* * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion * Copyright (C) 2016-2023 ViaVersion and contributors * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ package com.viaversion.viaversion.api.type; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.google.gson.JsonElement; import com.viaversion.viaversion.api.minecraft.BlockChangeRecord; import com.viaversion.viaversion.api.minecraft.EulerAngle; import com.viaversion.viaversion.api.minecraft.GlobalPosition; import com.viaversion.viaversion.api.minecraft.PlayerMessageSignature; import com.viaversion.viaversion.api.minecraft.Position; import com.viaversion.viaversion.api.minecraft.ProfileKey; import com.viaversion.viaversion.api.minecraft.Quaternion; import com.viaversion.viaversion.api.minecraft.Vector; import com.viaversion.viaversion.api.minecraft.Vector3f; import com.viaversion.viaversion.api.minecraft.VillagerData; import com.viaversion.viaversion.api.minecraft.item.Item; import com.viaversion.viaversion.api.type.types.ArrayType; import com.viaversion.viaversion.api.type.types.BooleanType; import com.viaversion.viaversion.api.type.types.ByteArrayType; import com.viaversion.viaversion.api.type.types.ByteType; import com.viaversion.viaversion.api.type.types.ComponentType; import com.viaversion.viaversion.api.type.types.DoubleType; import com.viaversion.viaversion.api.type.types.FloatType; import com.viaversion.viaversion.api.type.types.IntType; import com.viaversion.viaversion.api.type.types.LongArrayType; import com.viaversion.viaversion.api.type.types.LongType; import com.viaversion.viaversion.api.type.types.RemainingBytesType; import com.viaversion.viaversion.api.type.types.ShortByteArrayType; import com.viaversion.viaversion.api.type.types.ShortType; import com.viaversion.viaversion.api.type.types.StringType; import com.viaversion.viaversion.api.type.types.UUIDIntArrayType; import com.viaversion.viaversion.api.type.types.UUIDType; import com.viaversion.viaversion.api.type.types.UnsignedByteType; import com.viaversion.viaversion.api.type.types.UnsignedShortType; import com.viaversion.viaversion.api.type.types.VarIntArrayType; import com.viaversion.viaversion.api.type.types.VarIntType; import com.viaversion.viaversion.api.type.types.VarLongType; import com.viaversion.viaversion.api.type.types.VoidType; import com.viaversion.viaversion.api.type.types.minecraft.BlockChangeRecordType; import com.viaversion.viaversion.api.type.types.minecraft.EulerAngleType; import com.viaversion.viaversion.api.type.types.minecraft.FlatItemArrayType; import com.viaversion.viaversion.api.type.types.minecraft.FlatItemType; import com.viaversion.viaversion.api.type.types.minecraft.FlatVarIntItemArrayType; import com.viaversion.viaversion.api.type.types.minecraft.FlatVarIntItemType; import com.viaversion.viaversion.api.type.types.minecraft.GlobalPositionType; import com.viaversion.viaversion.api.type.types.minecraft.ItemArrayType; import com.viaversion.viaversion.api.type.types.minecraft.ItemType; import com.viaversion.viaversion.api.type.types.minecraft.NBTType; import com.viaversion.viaversion.api.type.types.minecraft.OptionalVarIntType; import com.viaversion.viaversion.api.type.types.minecraft.PlayerMessageSignatureType; import com.viaversion.viaversion.api.type.types.minecraft.Position1_14Type; import com.viaversion.viaversion.api.type.types.minecraft.PositionType; import com.viaversion.viaversion.api.type.types.minecraft.ProfileKeyType; import com.viaversion.viaversion.api.type.types.minecraft.QuaternionType; import com.viaversion.viaversion.api.type.types.minecraft.VarLongBlockChangeRecordType; import com.viaversion.viaversion.api.type.types.minecraft.Vector3fType; import com.viaversion.viaversion.api.type.types.minecraft.VectorType; import com.viaversion.viaversion.api.type.types.minecraft.VillagerDataType; import java.util.UUID; /** * Type for buffer reading and writing. * * @param read/written type */ public abstract class Type implements ByteBufReader, ByteBufWriter { public static final ByteType BYTE = new ByteType(); public static final UnsignedByteType UNSIGNED_BYTE = new UnsignedByteType(); public static final Type BYTE_ARRAY_PRIMITIVE = new ByteArrayType(); public static final Type OPTIONAL_BYTE_ARRAY_PRIMITIVE = new ByteArrayType.OptionalByteArrayType(); public static final Type SHORT_BYTE_ARRAY = new ShortByteArrayType(); public static final Type REMAINING_BYTES = new RemainingBytesType(); public static final ShortType SHORT = new ShortType(); public static final UnsignedShortType UNSIGNED_SHORT = new UnsignedShortType(); public static final IntType INT = new IntType(); public static final FloatType FLOAT = new FloatType(); public static final FloatType.OptionalFloatType OPTIONAL_FLOAT = new FloatType.OptionalFloatType(); public static final DoubleType DOUBLE = new DoubleType(); public static final LongType LONG = new LongType(); public static final Type LONG_ARRAY_PRIMITIVE = new LongArrayType(); public static final BooleanType BOOLEAN = new BooleanType(); /* Other Types */ public static final Type COMPONENT = new ComponentType(); public static final Type OPTIONAL_COMPONENT = new ComponentType.OptionalComponentType(); public static final Type STRING = new StringType(); public static final Type OPTIONAL_STRING = new StringType.OptionalStringType(); public static final Type STRING_ARRAY = new ArrayType<>(Type.STRING); public static final Type UUID = new UUIDType(); public static final Type OPTIONAL_UUID = new UUIDType.OptionalUUIDType(); public static final Type UUID_ARRAY = new ArrayType<>(Type.UUID); @Deprecated/*(forRemoval = true)*/ public static final Type UUID_INT_ARRAY = new UUIDIntArrayType(); public static final VarIntType VAR_INT = new VarIntType(); public static final OptionalVarIntType OPTIONAL_VAR_INT = new OptionalVarIntType(); public static final Type VAR_INT_ARRAY_PRIMITIVE = new VarIntArrayType(); public static final VarLongType VAR_LONG = new VarLongType(); /* Boxed number array types */ @Deprecated public static final Type BYTE_ARRAY = new ArrayType<>(Type.BYTE); @Deprecated public static final Type UNSIGNED_BYTE_ARRAY = new ArrayType<>(Type.UNSIGNED_BYTE); @Deprecated public static final Type BOOLEAN_ARRAY = new ArrayType<>(Type.BOOLEAN); @Deprecated public static final Type INT_ARRAY = new ArrayType<>(Type.INT); @Deprecated public static final Type SHORT_ARRAY = new ArrayType<>(Type.SHORT); @Deprecated public static final Type UNSIGNED_SHORT_ARRAY = new ArrayType<>(Type.UNSIGNED_SHORT); @Deprecated public static final Type DOUBLE_ARRAY = new ArrayType<>(Type.DOUBLE); @Deprecated public static final Type LONG_ARRAY = new ArrayType<>(Type.LONG); @Deprecated public static final Type FLOAT_ARRAY = new ArrayType<>(Type.FLOAT); @Deprecated public static final Type VAR_INT_ARRAY = new ArrayType<>(Type.VAR_INT); @Deprecated public static final Type VAR_LONG_ARRAY = new ArrayType<>(Type.VAR_LONG); /* Special Types */ public static final VoidType NOTHING = new VoidType(); // This is purely used for remapping. /* MC Types */ public static final Type POSITION = new PositionType(); public static final Type OPTIONAL_POSITION = new PositionType.OptionalPositionType(); public static final Type POSITION1_14 = new Position1_14Type(); public static final Type OPTIONAL_POSITION_1_14 = new Position1_14Type.OptionalPosition1_14Type(); public static final Type ROTATION = new EulerAngleType(); public static final Type VECTOR = new VectorType(); public static final Type VECTOR3F = new Vector3fType(); public static final Type QUATERNION = new QuaternionType(); public static final Type NBT = new NBTType(); public static final Type NBT_ARRAY = new ArrayType<>(Type.NBT); public static final Type GLOBAL_POSITION = new GlobalPositionType(); public static final Type OPTIONAL_GLOBAL_POSITION = new GlobalPositionType.OptionalGlobalPositionType(); public static final Type BLOCK_CHANGE_RECORD = new BlockChangeRecordType(); public static final Type BLOCK_CHANGE_RECORD_ARRAY = new ArrayType<>(Type.BLOCK_CHANGE_RECORD); public static final Type VAR_LONG_BLOCK_CHANGE_RECORD = new VarLongBlockChangeRecordType(); public static final Type VAR_LONG_BLOCK_CHANGE_RECORD_ARRAY = new ArrayType<>(Type.VAR_LONG_BLOCK_CHANGE_RECORD); public static final Type VILLAGER_DATA = new VillagerDataType(); public static final Type ITEM = new ItemType(); public static final Type ITEM_ARRAY = new ItemArrayType(); public static final Type PROFILE_KEY = new ProfileKeyType(); public static final Type OPTIONAL_PROFILE_KEY = new ProfileKeyType.OptionalProfileKeyType(); public static final Type PLAYER_MESSAGE_SIGNATURE = new PlayerMessageSignatureType(); public static final Type OPTIONAL_PLAYER_MESSAGE_SIGNATURE = new PlayerMessageSignatureType.OptionalPlayerMessageSignatureType(); public static final Type PLAYER_MESSAGE_SIGNATURE_ARRAY = new ArrayType<>(PLAYER_MESSAGE_SIGNATURE); /* 1.13 Flat Item (no data) */ public static final Type FLAT_ITEM = new FlatItemType(); public static final Type FLAT_VAR_INT_ITEM = new FlatVarIntItemType(); public static final Type FLAT_ITEM_ARRAY = new FlatItemArrayType(); public static final Type FLAT_VAR_INT_ITEM_ARRAY = new FlatVarIntItemArrayType(); public static final Type FLAT_ITEM_ARRAY_VAR_INT = new ArrayType<>(FLAT_ITEM); public static final Type FLAT_VAR_INT_ITEM_ARRAY_VAR_INT = new ArrayType<>(FLAT_VAR_INT_ITEM); /* Actual Class */ private final Class outputClass; private final String typeName; protected Type(Class outputClass) { this(outputClass.getSimpleName(), outputClass); } protected Type(String typeName, Class outputClass) { this.outputClass = outputClass; this.typeName = typeName; } /** * Returns the output class type. * * @return output class type */ public Class getOutputClass() { return outputClass; } /** * Returns the type name. * * @return type name */ public String getTypeName() { return typeName; } /** * Returns the base class, useful when the output class is insufficient for type comparison. * One such case are types with {{@link java.util.List}} as their output type. * * @return base class */ public Class getBaseClass() { return this.getClass(); } @Override public String toString() { return "Type|" + typeName; } }