Mirror von
https://github.com/ViaVersion/ViaVersion.git
synchronisiert 2024-09-08 22:02:50 +02:00
Make Metadata fully type safe, remove "Discontinued" meta types
The Discontinued entry was a special edge case that could lead to a Metadata type returning null. Instead, just directly use null in the 1.8->1.9 code where it is checked against. Also renamed the Meta1_17Types entries to be in uppercase and properly represent their value type.
Dieser Commit ist enthalten in:
Ursprung
bc89f57088
Commit
2d0a597f74
@ -26,7 +26,7 @@ import com.viaversion.viaversion.api.connection.UserConnection;
|
|||||||
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
|
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
|
||||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||||
|
|
||||||
public interface EntityTracker extends ClientEntityIdChangeListener {
|
public interface EntityTracker {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User connection the tracker belongs to.
|
* User connection the tracker belongs to.
|
||||||
|
@ -38,14 +38,12 @@ public final class Metadata {
|
|||||||
* @param id metadata index
|
* @param id metadata index
|
||||||
* @param metaType metadata type
|
* @param metaType metadata type
|
||||||
* @param value value if present
|
* @param value value if present
|
||||||
* @throws NullPointerException if the given metaType is null
|
|
||||||
* @throws IllegalArgumentException if the value and metaType are incompatible
|
* @throws IllegalArgumentException if the value and metaType are incompatible
|
||||||
*/
|
*/
|
||||||
public Metadata(int id, MetaType metaType, @Nullable Object value) {
|
public Metadata(int id, MetaType metaType, @Nullable Object value) {
|
||||||
Preconditions.checkNotNull(metaType);
|
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.metaType = metaType;
|
this.metaType = metaType;
|
||||||
this.value = checkValue(value);
|
this.value = checkValue(metaType, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int id() {
|
public int id() {
|
||||||
@ -61,13 +59,14 @@ public final class Metadata {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the metadata type.
|
* Sets the metadata type if compatible with the current value.
|
||||||
* Update the value with {@link #setValue(Object)} in case value and type are no longer compatible.
|
|
||||||
*
|
*
|
||||||
* @param metaType metadata type
|
* @param metaType metadata type
|
||||||
|
* @throws IllegalArgumentException if the metadata type and current value are incompatible
|
||||||
|
* @see #setTypeAndValue(MetaType, Object)
|
||||||
*/
|
*/
|
||||||
public void setMetaType(MetaType metaType) {
|
public void setMetaType(MetaType metaType) {
|
||||||
Preconditions.checkNotNull(metaType);
|
checkValue(metaType, this.value);
|
||||||
this.metaType = metaType;
|
this.metaType = metaType;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,28 +79,46 @@ public final class Metadata {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the metadata value.
|
* Sets the metadata value if compatible with the current meta type.
|
||||||
* Always call {@link #setMetaType(MetaType)} first if the output type changes.
|
|
||||||
*
|
*
|
||||||
* @param value value
|
* @param value value
|
||||||
* @throws IllegalArgumentException if the value and metaType are incompatible
|
* @throws IllegalArgumentException if the value and current metaType are incompatible
|
||||||
|
* @see #setTypeAndValue(MetaType, Object)
|
||||||
*/
|
*/
|
||||||
public void setValue(@Nullable Object value) {
|
public void setValue(@Nullable Object value) {
|
||||||
this.value = checkValue(value);
|
this.value = checkValue(this.metaType, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Object checkValue(Object value) {
|
/**
|
||||||
|
* Sets metadata type and value.
|
||||||
|
*
|
||||||
|
* @param metaType metadata type
|
||||||
|
* @param value value
|
||||||
|
* @throws IllegalArgumentException if the value and metaType are incompatible
|
||||||
|
*/
|
||||||
|
public void setTypeAndValue(MetaType metaType, @Nullable Object value) {
|
||||||
|
this.value = checkValue(metaType, value);
|
||||||
|
this.metaType = metaType;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object checkValue(MetaType metaType, @Nullable Object value) {
|
||||||
|
Preconditions.checkNotNull(metaType);
|
||||||
if (value != null && !metaType.type().getOutputClass().isAssignableFrom(value.getClass())) {
|
if (value != null && !metaType.type().getOutputClass().isAssignableFrom(value.getClass())) {
|
||||||
throw new IllegalArgumentException("Metadata value and metaType are incompatible. Type=" + metaType + ", value=" + value);
|
throw new IllegalArgumentException("Metadata value and metaType are incompatible. Type=" + metaType
|
||||||
|
+ ", value=" + (value != null ? value + " (" + value.getClass().getSimpleName() + ")" : "null"));
|
||||||
}
|
}
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public void setMetaTypeUnsafe(MetaType type) {
|
||||||
|
this.metaType = type;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(final Object o) {
|
public boolean equals(final Object o) {
|
||||||
if (this == o) return true;
|
if (this == o) return true;
|
||||||
if (o == null || getClass() != o.getClass()) return false;
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
|
||||||
Metadata metadata = (Metadata) o;
|
Metadata metadata = (Metadata) o;
|
||||||
if (id != metadata.id) return false;
|
if (id != metadata.id) return false;
|
||||||
if (metaType != metaType) return false;
|
if (metaType != metaType) return false;
|
||||||
@ -111,7 +128,7 @@ public final class Metadata {
|
|||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
int result = id;
|
int result = id;
|
||||||
result = 31 * result + (metaType != null ? metaType.hashCode() : 0);
|
result = 31 * result + metaType.hashCode();
|
||||||
result = 31 * result + (value != null ? value.hashCode() : 0);
|
result = 31 * result + (value != null ? value.hashCode() : 0);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -39,8 +39,7 @@ public enum MetaType1_12 implements MetaType {
|
|||||||
Direction(10, Type.VAR_INT),
|
Direction(10, Type.VAR_INT),
|
||||||
OptUUID(11, Type.OPTIONAL_UUID),
|
OptUUID(11, Type.OPTIONAL_UUID),
|
||||||
BlockID(12, Type.VAR_INT),
|
BlockID(12, Type.VAR_INT),
|
||||||
NBTTag(13, Type.NBT),
|
NBTTag(13, Type.NBT);
|
||||||
Discontinued(99, null);
|
|
||||||
|
|
||||||
private final int typeID;
|
private final int typeID;
|
||||||
private final Type type;
|
private final Type type;
|
||||||
|
@ -42,8 +42,7 @@ public enum MetaType1_13 implements MetaType {
|
|||||||
OptUUID(12, Type.OPTIONAL_UUID),
|
OptUUID(12, Type.OPTIONAL_UUID),
|
||||||
BlockID(13, Type.VAR_INT),
|
BlockID(13, Type.VAR_INT),
|
||||||
NBTTag(14, Type.NBT),
|
NBTTag(14, Type.NBT),
|
||||||
PARTICLE(15, Types1_13.PARTICLE),
|
PARTICLE(15, Types1_13.PARTICLE);
|
||||||
Discontinued(99, null);
|
|
||||||
|
|
||||||
private final int typeID;
|
private final int typeID;
|
||||||
private final Type type;
|
private final Type type;
|
||||||
|
@ -42,8 +42,7 @@ public enum MetaType1_13_2 implements MetaType {
|
|||||||
OptUUID(12, Type.OPTIONAL_UUID),
|
OptUUID(12, Type.OPTIONAL_UUID),
|
||||||
BlockID(13, Type.VAR_INT),
|
BlockID(13, Type.VAR_INT),
|
||||||
NBTTag(14, Type.NBT),
|
NBTTag(14, Type.NBT),
|
||||||
PARTICLE(15, Types1_13_2.PARTICLE),
|
PARTICLE(15, Types1_13_2.PARTICLE);
|
||||||
Discontinued(99, null);
|
|
||||||
|
|
||||||
private final int typeID;
|
private final int typeID;
|
||||||
private final Type type;
|
private final Type type;
|
||||||
|
@ -45,8 +45,7 @@ public enum MetaType1_14 implements MetaType {
|
|||||||
PARTICLE(15, Types1_14.PARTICLE),
|
PARTICLE(15, Types1_14.PARTICLE),
|
||||||
VillagerData(16, Type.VILLAGER_DATA),
|
VillagerData(16, Type.VILLAGER_DATA),
|
||||||
OptVarInt(17, Type.OPTIONAL_VAR_INT),
|
OptVarInt(17, Type.OPTIONAL_VAR_INT),
|
||||||
Pose(18, Type.VAR_INT),
|
Pose(18, Type.VAR_INT);
|
||||||
Discontinued(99, null);
|
|
||||||
|
|
||||||
private final int typeID;
|
private final int typeID;
|
||||||
private final Type type;
|
private final Type type;
|
||||||
|
@ -27,32 +27,31 @@ import com.viaversion.viaversion.api.type.Type;
|
|||||||
import com.viaversion.viaversion.api.type.types.version.Types1_17;
|
import com.viaversion.viaversion.api.type.types.version.Types1_17;
|
||||||
|
|
||||||
public enum MetaType1_17 implements MetaType {
|
public enum MetaType1_17 implements MetaType {
|
||||||
Byte(0, Type.BYTE),
|
BYTE(0, Type.BYTE),
|
||||||
VarInt(1, Type.VAR_INT),
|
VAR_INT(1, Type.VAR_INT),
|
||||||
Float(2, Type.FLOAT),
|
FLOAT(2, Type.FLOAT),
|
||||||
String(3, Type.STRING),
|
STRING(3, Type.STRING),
|
||||||
Chat(4, Type.COMPONENT),
|
COMPONENT(4, Type.COMPONENT),
|
||||||
OptChat(5, Type.OPTIONAL_COMPONENT),
|
OPT_COMPONENT(5, Type.OPTIONAL_COMPONENT),
|
||||||
Slot(6, Type.FLAT_VAR_INT_ITEM),
|
ITEM(6, Type.FLAT_VAR_INT_ITEM),
|
||||||
Boolean(7, Type.BOOLEAN),
|
BOOLEAN(7, Type.BOOLEAN),
|
||||||
Vector3F(8, Type.ROTATION),
|
ROTATION(8, Type.ROTATION),
|
||||||
Position(9, Type.POSITION1_14),
|
POSITION(9, Type.POSITION1_14),
|
||||||
OptPosition(10, Type.OPTIONAL_POSITION_1_14),
|
OPT_POSITION(10, Type.OPTIONAL_POSITION_1_14),
|
||||||
Direction(11, Type.VAR_INT),
|
DIRECTION(11, Type.VAR_INT),
|
||||||
OptUUID(12, Type.OPTIONAL_UUID),
|
OPT_UUID(12, Type.OPTIONAL_UUID),
|
||||||
BlockID(13, Type.VAR_INT),
|
BLOCK_STATE(13, Type.VAR_INT),
|
||||||
NBTTag(14, Type.NBT),
|
NBT(14, Type.NBT),
|
||||||
PARTICLE(15, Types1_17.PARTICLE),
|
PARTICLE(15, Types1_17.PARTICLE),
|
||||||
VillagerData(16, Type.VILLAGER_DATA),
|
VILLAGER_DATA(16, Type.VILLAGER_DATA),
|
||||||
OptVarInt(17, Type.OPTIONAL_VAR_INT),
|
OPT_VAR_INT(17, Type.OPTIONAL_VAR_INT),
|
||||||
Pose(18, Type.VAR_INT),
|
POSE(18, Type.VAR_INT);
|
||||||
Discontinued(99, null);
|
|
||||||
|
|
||||||
private final int typeID;
|
private final int typeId;
|
||||||
private final Type type;
|
private final Type type;
|
||||||
|
|
||||||
MetaType1_17(int typeID, Type type) {
|
MetaType1_17(int typeId, Type type) {
|
||||||
this.typeID = typeID;
|
this.typeId = typeId;
|
||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,7 +61,7 @@ public enum MetaType1_17 implements MetaType {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int typeId() {
|
public int typeId() {
|
||||||
return typeID;
|
return typeId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -34,6 +34,7 @@ public enum MetaType1_8 implements MetaType {
|
|||||||
Slot(5, Type.ITEM),
|
Slot(5, Type.ITEM),
|
||||||
Position(6, Type.VECTOR),
|
Position(6, Type.VECTOR),
|
||||||
Rotation(7, Type.ROTATION),
|
Rotation(7, Type.ROTATION),
|
||||||
|
@Deprecated
|
||||||
NonExistent(-1, Type.NOTHING);
|
NonExistent(-1, Type.NOTHING);
|
||||||
|
|
||||||
private final int typeID;
|
private final int typeID;
|
||||||
|
@ -38,8 +38,7 @@ public enum MetaType1_9 implements MetaType {
|
|||||||
OptPosition(9, Type.OPTIONAL_POSITION),
|
OptPosition(9, Type.OPTIONAL_POSITION),
|
||||||
Direction(10, Type.VAR_INT),
|
Direction(10, Type.VAR_INT),
|
||||||
OptUUID(11, Type.OPTIONAL_UUID),
|
OptUUID(11, Type.OPTIONAL_UUID),
|
||||||
BlockID(12, Type.VAR_INT),
|
BlockID(12, Type.VAR_INT);
|
||||||
Discontinued(99, null);
|
|
||||||
|
|
||||||
private final int typeID;
|
private final int typeID;
|
||||||
private final Type type;
|
private final Type type;
|
||||||
|
@ -20,6 +20,7 @@ package com.viaversion.viaversion.data.entity;
|
|||||||
|
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||||
|
import com.viaversion.viaversion.api.data.entity.ClientEntityIdChangeListener;
|
||||||
import com.viaversion.viaversion.api.data.entity.EntityTracker;
|
import com.viaversion.viaversion.api.data.entity.EntityTracker;
|
||||||
import com.viaversion.viaversion.api.data.entity.StoredEntityData;
|
import com.viaversion.viaversion.api.data.entity.StoredEntityData;
|
||||||
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
|
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
|
||||||
@ -28,7 +29,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
public class EntityTrackerBase implements EntityTracker {
|
public class EntityTrackerBase implements EntityTracker, ClientEntityIdChangeListener {
|
||||||
private final Map<Integer, EntityType> entityTypes = new ConcurrentHashMap<>();
|
private final Map<Integer, EntityType> entityTypes = new ConcurrentHashMap<>();
|
||||||
private final Map<Integer, StoredEntityData> entityData;
|
private final Map<Integer, StoredEntityData> entityData;
|
||||||
private final UserConnection connection;
|
private final UserConnection connection;
|
||||||
@ -68,9 +69,9 @@ public class EntityTrackerBase implements EntityTracker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public StoredEntityData entityData(int id) {
|
public @Nullable StoredEntityData entityData(int id) {
|
||||||
EntityType type = entityType(id);
|
EntityType type = entityType(id);
|
||||||
return entityData.computeIfAbsent(id, s -> new StoredEntityImpl(type));
|
return type != null ? entityData.computeIfAbsent(id, s -> new StoredEntityImpl(type)) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -51,9 +51,8 @@ public class MetadataRewriter1_11To1_10 extends EntityRewriter<Protocol1_11To1_1
|
|||||||
if (type.is(EntityType.ELDER_GUARDIAN) || type.is(EntityType.GUARDIAN)) { // Guardians
|
if (type.is(EntityType.ELDER_GUARDIAN) || type.is(EntityType.GUARDIAN)) { // Guardians
|
||||||
int oldid = metadata.id();
|
int oldid = metadata.id();
|
||||||
if (oldid == 12) {
|
if (oldid == 12) {
|
||||||
metadata.setMetaType(MetaType1_9.Boolean);
|
|
||||||
boolean val = (((byte) metadata.getValue()) & 0x02) == 0x02;
|
boolean val = (((byte) metadata.getValue()) & 0x02) == 0x02;
|
||||||
metadata.setValue(val);
|
metadata.setTypeAndValue(MetaType1_9.Boolean, val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,11 +51,10 @@ public class MetadataRewriter1_13To1_12_2 extends EntityRewriter<Protocol1_13To1
|
|||||||
|
|
||||||
// Handle String -> Chat DisplayName
|
// Handle String -> Chat DisplayName
|
||||||
if (metadata.id() == 2) {
|
if (metadata.id() == 2) {
|
||||||
metadata.setMetaType(MetaType1_13.OptChat);
|
|
||||||
if (metadata.getValue() != null && !((String) metadata.getValue()).isEmpty()) {
|
if (metadata.getValue() != null && !((String) metadata.getValue()).isEmpty()) {
|
||||||
metadata.setValue(ChatRewriter.legacyTextToJson((String) metadata.getValue()));
|
metadata.setTypeAndValue(MetaType1_13.OptChat, ChatRewriter.legacyTextToJson((String) metadata.getValue()));
|
||||||
} else {
|
} else {
|
||||||
metadata.setValue(null);
|
metadata.setTypeAndValue(MetaType1_13.OptChat, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,14 +139,12 @@ public class MetadataRewriter1_14To1_13_2 extends EntityRewriter<Protocol1_14To1
|
|||||||
} else if (type.is(Entity1_14Types.VILLAGER)) {
|
} else if (type.is(Entity1_14Types.VILLAGER)) {
|
||||||
if (metadata.id() == 15) {
|
if (metadata.id() == 15) {
|
||||||
// plains
|
// plains
|
||||||
metadata.setMetaType(MetaType1_14.VillagerData);
|
metadata.setTypeAndValue(MetaType1_14.VillagerData, new VillagerData(2, getNewProfessionId((int) metadata.getValue()), 0));
|
||||||
metadata.setValue(new VillagerData(2, getNewProfessionId((int) metadata.getValue()), 0));
|
|
||||||
}
|
}
|
||||||
} else if (type.is(Entity1_14Types.ZOMBIE_VILLAGER)) {
|
} else if (type.is(Entity1_14Types.ZOMBIE_VILLAGER)) {
|
||||||
if (metadata.id() == 18) {
|
if (metadata.id() == 18) {
|
||||||
// plains
|
// plains
|
||||||
metadata.setMetaType(MetaType1_14.VillagerData);
|
metadata.setTypeAndValue(MetaType1_14.VillagerData, new VillagerData(2, getNewProfessionId((int) metadata.getValue()), 0));
|
||||||
metadata.setValue(new VillagerData(2, getNewProfessionId((int) metadata.getValue()), 0));
|
|
||||||
}
|
}
|
||||||
} else if (type.isOrHasParent(Entity1_14Types.ABSTRACT_ARROW)) {
|
} else if (type.isOrHasParent(Entity1_14Types.ABSTRACT_ARROW)) {
|
||||||
if (metadata.id() >= 9) { // New piercing
|
if (metadata.id() >= 9) { // New piercing
|
||||||
|
@ -37,7 +37,7 @@ public class MetadataRewriter1_17To1_16_4 extends EntityRewriter {
|
|||||||
filter().handler((event, meta) -> {
|
filter().handler((event, meta) -> {
|
||||||
meta.setMetaType(MetaType1_17.byId(meta.metaType().typeId()));
|
meta.setMetaType(MetaType1_17.byId(meta.metaType().typeId()));
|
||||||
|
|
||||||
if (meta.metaType() == MetaType1_17.Pose) {
|
if (meta.metaType() == MetaType1_17.POSE) {
|
||||||
int pose = meta.value();
|
int pose = meta.value();
|
||||||
if (pose > 5) {
|
if (pose > 5) {
|
||||||
// Added LONG_JUMP at 6
|
// Added LONG_JUMP at 6
|
||||||
@ -45,7 +45,7 @@ public class MetadataRewriter1_17To1_16_4 extends EntityRewriter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
registerDumMetaTypeHandler(MetaType1_17.Slot, MetaType1_17.BlockID, MetaType1_17.PARTICLE, InventoryPackets::toClient);
|
registerDumMetaTypeHandler(MetaType1_17.ITEM, MetaType1_17.BLOCK_STATE, MetaType1_17.PARTICLE, InventoryPackets::toClient);
|
||||||
|
|
||||||
// Ticks frozen added with id 7
|
// Ticks frozen added with id 7
|
||||||
filter().filterFamily(Entity1_17Types.ENTITY).addIndex(7);
|
filter().filterFamily(Entity1_17Types.ENTITY).addIndex(7);
|
||||||
|
@ -22,6 +22,7 @@ import com.viaversion.viaversion.api.minecraft.entities.EntityType;
|
|||||||
import com.viaversion.viaversion.api.minecraft.metadata.types.MetaType1_8;
|
import com.viaversion.viaversion.api.minecraft.metadata.types.MetaType1_8;
|
||||||
import com.viaversion.viaversion.api.minecraft.metadata.types.MetaType1_9;
|
import com.viaversion.viaversion.api.minecraft.metadata.types.MetaType1_9;
|
||||||
import com.viaversion.viaversion.util.Pair;
|
import com.viaversion.viaversion.util.Pair;
|
||||||
|
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@ -54,11 +55,11 @@ public enum MetaIndex {
|
|||||||
STAND_RL_POS(ARMOR_STAND, 16, MetaType1_8.Rotation, MetaType1_9.Vector3F),
|
STAND_RL_POS(ARMOR_STAND, 16, MetaType1_8.Rotation, MetaType1_9.Vector3F),
|
||||||
// human, discountined?
|
// human, discountined?
|
||||||
PLAYER_SKIN_FLAGS(ENTITY_HUMAN, 10, MetaType1_8.Byte, 12, MetaType1_9.Byte), // unsigned on 1.8
|
PLAYER_SKIN_FLAGS(ENTITY_HUMAN, 10, MetaType1_8.Byte, 12, MetaType1_9.Byte), // unsigned on 1.8
|
||||||
PLAYER_HUMAN_BYTE(ENTITY_HUMAN, 16, MetaType1_8.Byte, MetaType1_9.Discontinued), // unused on 1.8
|
PLAYER_HUMAN_BYTE(ENTITY_HUMAN, 16, MetaType1_8.Byte, null), // unused on 1.8
|
||||||
PLAYER_ADDITIONAL_HEARTS(ENTITY_HUMAN, 17, MetaType1_8.Float, 10, MetaType1_9.Float),
|
PLAYER_ADDITIONAL_HEARTS(ENTITY_HUMAN, 17, MetaType1_8.Float, 10, MetaType1_9.Float),
|
||||||
PLAYER_SCORE(ENTITY_HUMAN, 18, MetaType1_8.Int, 11, MetaType1_9.VarInt),
|
PLAYER_SCORE(ENTITY_HUMAN, 18, MetaType1_8.Int, 11, MetaType1_9.VarInt),
|
||||||
PLAYER_HAND(ENTITY_HUMAN, -1, MetaType1_8.NonExistent, 5, MetaType1_9.Byte), // new in 1.9
|
PLAYER_HAND(ENTITY_HUMAN, -1, MetaType1_8.NonExistent, 5, MetaType1_9.Byte), // new in 1.9
|
||||||
SOMETHING_ANTICHEAT_PLUGINS_FOR_SOME_REASON_USE(ENTITY_HUMAN, 11, MetaType1_8.Byte, MetaType1_9.Discontinued), //For what we know, This doesn't exists. If you think it exists and knows what it does. Please tell us.
|
SOMETHING_ANTICHEAT_PLUGINS_FOR_SOME_REASON_USE(ENTITY_HUMAN, 11, MetaType1_8.Byte, null), //For what we know, This doesn't exists. If you think it exists and knows what it does. Please tell us.
|
||||||
// horse
|
// horse
|
||||||
HORSE_INFO(HORSE, 16, MetaType1_8.Int, 12, MetaType1_9.Byte),
|
HORSE_INFO(HORSE, 16, MetaType1_8.Int, 12, MetaType1_9.Byte),
|
||||||
HORSE_TYPE(HORSE, 19, MetaType1_8.Byte, 13, MetaType1_9.VarInt),
|
HORSE_TYPE(HORSE, 19, MetaType1_8.Byte, 13, MetaType1_9.VarInt),
|
||||||
@ -86,7 +87,7 @@ public enum MetaIndex {
|
|||||||
VILLAGER_PROFESSION(VILLAGER, 16, MetaType1_8.Int, 12, MetaType1_9.VarInt),
|
VILLAGER_PROFESSION(VILLAGER, 16, MetaType1_8.Int, 12, MetaType1_9.VarInt),
|
||||||
// enderman
|
// enderman
|
||||||
ENDERMAN_BLOCKSTATE(ENDERMAN, 16, MetaType1_8.Short, 11, MetaType1_9.BlockID),
|
ENDERMAN_BLOCKSTATE(ENDERMAN, 16, MetaType1_8.Short, 11, MetaType1_9.BlockID),
|
||||||
ENDERMAN_BLOCKDATA(ENDERMAN, 17, MetaType1_8.Byte, MetaType1_9.Discontinued), //always 0 when sent, never read by the client
|
ENDERMAN_BLOCKDATA(ENDERMAN, 17, MetaType1_8.Byte, null), //always 0 when sent, never read by the client
|
||||||
ENDERMAN_ISSCREAMING(ENDERMAN, 18, MetaType1_8.Byte, 12, MetaType1_9.Boolean),
|
ENDERMAN_ISSCREAMING(ENDERMAN, 18, MetaType1_8.Byte, 12, MetaType1_9.Boolean),
|
||||||
// zombie
|
// zombie
|
||||||
ZOMBIE_ISCHILD(ZOMBIE, 12, MetaType1_8.Byte, 11, MetaType1_9.Boolean),
|
ZOMBIE_ISCHILD(ZOMBIE, 12, MetaType1_8.Byte, 11, MetaType1_9.Boolean),
|
||||||
@ -117,7 +118,7 @@ public enum MetaIndex {
|
|||||||
WITHER_TARGET3(WITHER, 19, MetaType1_8.Int, 13, MetaType1_9.VarInt),
|
WITHER_TARGET3(WITHER, 19, MetaType1_8.Int, 13, MetaType1_9.VarInt),
|
||||||
WITHER_INVULN_TIME(WITHER, 20, MetaType1_8.Int, 14, MetaType1_9.VarInt),
|
WITHER_INVULN_TIME(WITHER, 20, MetaType1_8.Int, 14, MetaType1_9.VarInt),
|
||||||
WITHER_PROPERTIES(WITHER, 10, MetaType1_8.Byte, MetaType1_9.Byte),
|
WITHER_PROPERTIES(WITHER, 10, MetaType1_8.Byte, MetaType1_9.Byte),
|
||||||
WITHER_UNKNOWN(WITHER, 11, MetaType1_8.Byte, MetaType1_9.Discontinued),
|
WITHER_UNKNOWN(WITHER, 11, MetaType1_8.Byte, null),
|
||||||
// wither skull
|
// wither skull
|
||||||
WITHERSKULL_INVULN(WITHER_SKULL, 10, MetaType1_8.Byte, 5, MetaType1_9.Boolean),
|
WITHERSKULL_INVULN(WITHER_SKULL, 10, MetaType1_8.Byte, 5, MetaType1_9.Boolean),
|
||||||
// guardian
|
// guardian
|
||||||
@ -150,12 +151,12 @@ public enum MetaIndex {
|
|||||||
ITEMFRAME_ITEM(ITEM_FRAME, 8, MetaType1_8.Slot, 5, MetaType1_9.Slot),
|
ITEMFRAME_ITEM(ITEM_FRAME, 8, MetaType1_8.Slot, 5, MetaType1_9.Slot),
|
||||||
ITEMFRAME_ROTATION(ITEM_FRAME, 9, MetaType1_8.Byte, 6, MetaType1_9.VarInt),
|
ITEMFRAME_ROTATION(ITEM_FRAME, 9, MetaType1_8.Byte, 6, MetaType1_9.VarInt),
|
||||||
// ender crystal
|
// ender crystal
|
||||||
ENDERCRYSTAL_HEALTH(ENDER_CRYSTAL, 8, MetaType1_8.Int, MetaType1_9.Discontinued),
|
ENDERCRYSTAL_HEALTH(ENDER_CRYSTAL, 8, MetaType1_8.Int, null),
|
||||||
// Ender dragon boss bar issues
|
// Ender dragon boss bar issues
|
||||||
ENDERDRAGON_UNKNOWN(ENDER_DRAGON, 5, MetaType1_8.Byte, MetaType1_9.Discontinued),
|
ENDERDRAGON_UNKNOWN(ENDER_DRAGON, 5, MetaType1_8.Byte, null),
|
||||||
ENDERDRAGON_NAME(ENDER_DRAGON, 10, MetaType1_8.String, MetaType1_9.Discontinued),
|
ENDERDRAGON_NAME(ENDER_DRAGON, 10, MetaType1_8.String, null),
|
||||||
// Normal Ender dragon
|
// Normal Ender dragon
|
||||||
ENDERDRAGON_FLAG(ENDER_DRAGON, 15, MetaType1_8.Byte, MetaType1_9.Discontinued),
|
ENDERDRAGON_FLAG(ENDER_DRAGON, 15, MetaType1_8.Byte, null),
|
||||||
ENDERDRAGON_PHASE(ENDER_DRAGON, 11, MetaType1_8.Byte, MetaType1_9.VarInt);
|
ENDERDRAGON_PHASE(ENDER_DRAGON, 11, MetaType1_8.Byte, MetaType1_9.VarInt);
|
||||||
|
|
||||||
private static final HashMap<Pair<Entity1_10Types.EntityType, Integer>, MetaIndex> metadataRewrites = new HashMap<>();
|
private static final HashMap<Pair<Entity1_10Types.EntityType, Integer>, MetaIndex> metadataRewrites = new HashMap<>();
|
||||||
@ -171,7 +172,7 @@ public enum MetaIndex {
|
|||||||
private final MetaType1_8 oldType;
|
private final MetaType1_8 oldType;
|
||||||
private final int index;
|
private final int index;
|
||||||
|
|
||||||
MetaIndex(Entity1_10Types.EntityType type, int index, MetaType1_8 oldType, MetaType1_9 newType) {
|
MetaIndex(Entity1_10Types.EntityType type, int index, MetaType1_8 oldType, @Nullable MetaType1_9 newType) {
|
||||||
this.clazz = type;
|
this.clazz = type;
|
||||||
this.index = index;
|
this.index = index;
|
||||||
this.newIndex = index;
|
this.newIndex = index;
|
||||||
@ -179,7 +180,7 @@ public enum MetaIndex {
|
|||||||
this.newType = newType;
|
this.newType = newType;
|
||||||
}
|
}
|
||||||
|
|
||||||
MetaIndex(Entity1_10Types.EntityType type, int index, MetaType1_8 oldType, int newIndex, MetaType1_9 newType) {
|
MetaIndex(Entity1_10Types.EntityType type, int index, MetaType1_8 oldType, int newIndex, @Nullable MetaType1_9 newType) {
|
||||||
this.clazz = type;
|
this.clazz = type;
|
||||||
this.index = index;
|
this.index = index;
|
||||||
this.oldType = oldType;
|
this.oldType = oldType;
|
||||||
@ -195,7 +196,7 @@ public enum MetaIndex {
|
|||||||
return newIndex;
|
return newIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
public MetaType1_9 getNewType() {
|
public @Nullable MetaType1_9 getNewType() {
|
||||||
return newType;
|
return newType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,7 +26,6 @@ import com.viaversion.viaversion.api.minecraft.item.Item;
|
|||||||
import com.viaversion.viaversion.api.minecraft.metadata.MetaType;
|
import com.viaversion.viaversion.api.minecraft.metadata.MetaType;
|
||||||
import com.viaversion.viaversion.api.minecraft.metadata.Metadata;
|
import com.viaversion.viaversion.api.minecraft.metadata.Metadata;
|
||||||
import com.viaversion.viaversion.api.minecraft.metadata.types.MetaType1_8;
|
import com.viaversion.viaversion.api.minecraft.metadata.types.MetaType1_8;
|
||||||
import com.viaversion.viaversion.api.minecraft.metadata.types.MetaType1_9;
|
|
||||||
import com.viaversion.viaversion.protocols.protocol1_9to1_8.ItemRewriter;
|
import com.viaversion.viaversion.protocols.protocol1_9to1_8.ItemRewriter;
|
||||||
import com.viaversion.viaversion.protocols.protocol1_9to1_8.Protocol1_9To1_8;
|
import com.viaversion.viaversion.protocols.protocol1_9to1_8.Protocol1_9To1_8;
|
||||||
import com.viaversion.viaversion.rewriter.EntityRewriter;
|
import com.viaversion.viaversion.rewriter.EntityRewriter;
|
||||||
@ -47,13 +46,13 @@ public class MetadataRewriter1_9To1_8 extends EntityRewriter<Protocol1_9To1_8> {
|
|||||||
throw new Exception("Could not find valid metadata");
|
throw new Exception("Could not find valid metadata");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (metaIndex.getNewType() == MetaType1_9.Discontinued) {
|
if (metaIndex.getNewType() == null) {
|
||||||
metadatas.remove(metadata);
|
metadatas.remove(metadata);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
metadata.setId(metaIndex.getNewIndex());
|
metadata.setId(metaIndex.getNewIndex());
|
||||||
metadata.setMetaType(metaIndex.getNewType());
|
metadata.setMetaTypeUnsafe(metaIndex.getNewType());
|
||||||
|
|
||||||
Object value = metadata.getValue();
|
Object value = metadata.getValue();
|
||||||
switch (metaIndex.getNewType()) {
|
switch (metaIndex.getNewType()) {
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren