3
0
Mirror von https://github.com/ViaVersion/ViaVersion.git synchronisiert 2024-11-03 14:50:30 +01:00

Some MetadataRewriter cleanup

Dieser Commit ist enthalten in:
KennyTV 2020-08-10 18:32:23 +02:00
Ursprung da77c32a0d
Commit 31f7bde35f
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
GPG-Schlüssel-ID: 6BE3B555EBC5982B
6 geänderte Dateien mit 52 neuen und 32 gelöschten Zeilen

Datei anzeigen

@ -16,10 +16,7 @@ import us.myles.ViaVersion.api.type.Type;
import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld; import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.logging.Logger; import java.util.logging.Logger;
public abstract class MetadataRewriter { public abstract class MetadataRewriter {
@ -35,16 +32,9 @@ public abstract class MetadataRewriter {
public final void handleMetadata(int entityId, List<Metadata> metadatas, UserConnection connection) { public final void handleMetadata(int entityId, List<Metadata> metadatas, UserConnection connection) {
EntityType type = connection.get(entityTrackerClass).getEntity(entityId); EntityType type = connection.get(entityTrackerClass).getEntity(entityId);
Map<Integer, Metadata> metadataMap = new HashMap<>(metadatas.size());
for (Metadata metadata : metadatas) {
metadataMap.put(metadata.getId(), metadata);
}
metadataMap = Collections.unmodifiableMap(metadataMap);
for (Metadata metadata : new ArrayList<>(metadatas)) { for (Metadata metadata : new ArrayList<>(metadatas)) {
try { try {
handleMetadata(entityId, type, metadata, metadatas, metadataMap, connection); handleMetadata(entityId, type, metadata, metadatas, connection);
} catch (Exception e) { } catch (Exception e) {
metadatas.remove(metadata); metadatas.remove(metadata);
if (!Via.getConfig().isSuppressMetadataErrors() || Via.getManager().isDebug()) { if (!Via.getConfig().isSuppressMetadataErrors() || Via.getManager().isDebug()) {
@ -270,20 +260,49 @@ public abstract class MetadataRewriter {
}; };
} }
// ---------------------------------------------------------------------------
protected abstract EntityType getTypeFromId(int type); protected abstract EntityType getTypeFromId(int type);
/**
* Returns the entity type from the given id.
* From 1.14 and onwards, this is the same exact value as {@link #getTypeFromId(int)}.
*
* @param type entity type id
* @return EntityType from id
*/
protected EntityType getObjectTypeFromId(int type) { protected EntityType getObjectTypeFromId(int type) {
return getTypeFromId(type); return getTypeFromId(type);
} }
/**
* Returns the mapped entitiy (or the same if it has not changed).
*
* @param oldId old entity id
* @return mapped entity id
*/
public int getNewEntityId(int oldId) { public int getNewEntityId(int oldId) {
return typeMapping != null ? typeMapping.getOrDefault(oldId, oldId) : oldId; return typeMapping != null ? typeMapping.getOrDefault(oldId, oldId) : oldId;
} }
protected void handleMetadata(int entityId, EntityType type, Metadata metadata, List<Metadata> metadatas, UserConnection connection) throws Exception { /**
} * To be overridden to handle metadata.
*
* @param entityId entity id
* @param type entity type, or null if not tracked
* @param metadata current metadata
* @param metadatas full, mutable list of metadata
* @param connection user connection
*/
protected abstract void handleMetadata(int entityId, @Nullable EntityType type, Metadata metadata, List<Metadata> metadatas, UserConnection connection) throws Exception;
protected void handleMetadata(int entityId, EntityType type, Metadata metadata, List<Metadata> metadatas, Map<Integer, Metadata> metadataMap, UserConnection connection) throws Exception { @Nullable
handleMetadata(entityId, type, metadata, metadatas, connection); protected Metadata getMetaByIndex(int index, List<Metadata> metadataList) {
for (Metadata metadata : metadataList) {
if (metadata.getId() == index) {
return metadata;
}
}
return null;
} }
} }

Datei anzeigen

@ -6,7 +6,8 @@ import us.myles.ViaVersion.api.type.Type;
import java.util.List; import java.util.List;
public abstract class MetaListTypeTemplate extends Type<List<Metadata>> { public abstract class MetaListTypeTemplate extends Type<List<Metadata>> {
public MetaListTypeTemplate() {
protected MetaListTypeTemplate() {
super("MetaData List", List.class); super("MetaData List", List.class);
} }

Datei anzeigen

@ -5,6 +5,7 @@ import us.myles.ViaVersion.api.minecraft.metadata.Metadata;
import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.api.type.Type;
public abstract class ModernMetaListType extends AbstractMetaListType { public abstract class ModernMetaListType extends AbstractMetaListType {
@Override @Override
protected void writeEnd(final Type<Metadata> type, final ByteBuf buffer) throws Exception { protected void writeEnd(final Type<Metadata> type, final ByteBuf buffer) throws Exception {
type.write(buffer, null); type.write(buffer, null);

Datei anzeigen

@ -15,7 +15,6 @@ import us.myles.ViaVersion.protocols.protocol1_11to1_10.Protocol1_11To1_10;
import us.myles.ViaVersion.protocols.protocol1_11to1_10.storage.EntityTracker1_11; import us.myles.ViaVersion.protocols.protocol1_11to1_10.storage.EntityTracker1_11;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
public class MetadataRewriter1_11To1_10 extends MetadataRewriter { public class MetadataRewriter1_11To1_10 extends MetadataRewriter {
@ -25,7 +24,7 @@ public class MetadataRewriter1_11To1_10 extends MetadataRewriter {
} }
@Override @Override
protected void handleMetadata(int entityId, us.myles.ViaVersion.api.entities.EntityType type, Metadata metadata, List<Metadata> metadatas, Map<Integer, Metadata> metadataMap, UserConnection connection) { protected void handleMetadata(int entityId, us.myles.ViaVersion.api.entities.EntityType type, Metadata metadata, List<Metadata> metadatas, UserConnection connection) {
if (metadata.getValue() instanceof Item) { if (metadata.getValue() instanceof Item) {
// Apply rewrite // Apply rewrite
EntityIdRewriter.toClientItem((Item) metadata.getValue()); EntityIdRewriter.toClientItem((Item) metadata.getValue());
@ -100,15 +99,14 @@ public class MetadataRewriter1_11To1_10 extends MetadataRewriter {
} }
if (type.is(EntityType.ARMOR_STAND) && Via.getConfig().isHologramPatch()) { if (type.is(EntityType.ARMOR_STAND) && Via.getConfig().isHologramPatch()) {
Optional<Metadata> flags = Optional.ofNullable(metadataMap.get(11)); Metadata flags = getMetaByIndex(11, metadatas);
Optional<Metadata> customName = Optional.ofNullable(metadataMap.get(2)); Metadata customName = getMetaByIndex(2, metadatas);
Optional<Metadata> customNameVisible = Optional.ofNullable(metadataMap.get(3)); Metadata customNameVisible = getMetaByIndex(3, metadatas);
if (metadata.getId() == 0 && flags.isPresent() && customName.isPresent() && customNameVisible.isPresent()) { if (metadata.getId() == 0 && flags != null && customName != null && customNameVisible != null) {
Metadata meta = flags.get();
byte data = (byte) metadata.getValue(); byte data = (byte) metadata.getValue();
// Check invisible | Check small | Check if custom name is empty | Check if custom name visible is true // Check invisible | Check small | Check if custom name is empty | Check if custom name visible is true
if ((data & 0x20) == 0x20 && ((byte) meta.getValue() & 0x01) == 0x01 if ((data & 0x20) == 0x20 && ((byte) flags.getValue() & 0x01) == 0x01
&& !((String) customName.get().getValue()).isEmpty() && (boolean) customNameVisible.get().getValue()) { && !((String) customName.getValue()).isEmpty() && (boolean) customNameVisible.getValue()) {
EntityTracker1_11 tracker = connection.get(EntityTracker1_11.class); EntityTracker1_11 tracker = connection.get(EntityTracker1_11.class);
if (!tracker.isHologram(entityId)) { if (!tracker.isHologram(entityId)) {
tracker.addHologram(entityId); tracker.addHologram(entityId);

Datei anzeigen

@ -17,7 +17,6 @@ import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.packets.WorldPackets;
import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.storage.EntityTracker1_13; import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.storage.EntityTracker1_13;
import java.util.List; import java.util.List;
import java.util.Map;
public class MetadataRewriter1_13To1_12_2 extends MetadataRewriter { public class MetadataRewriter1_13To1_12_2 extends MetadataRewriter {
@ -26,7 +25,7 @@ public class MetadataRewriter1_13To1_12_2 extends MetadataRewriter {
} }
@Override @Override
protected void handleMetadata(int entityId, EntityType type, Metadata metadata, List<Metadata> metadatas, Map<Integer, Metadata> metadataMap, UserConnection connection) throws Exception { protected void handleMetadata(int entityId, EntityType type, Metadata metadata, List<Metadata> metadatas, UserConnection connection) throws Exception {
// Handle new MetaTypes // Handle new MetaTypes
if (metadata.getMetaType().getTypeID() > 4) { if (metadata.getMetaType().getTypeID() > 4) {
metadata.setMetaType(MetaType1_13.byId(metadata.getMetaType().getTypeID() + 1)); metadata.setMetaType(MetaType1_13.byId(metadata.getMetaType().getTypeID() + 1));
@ -80,8 +79,10 @@ public class MetadataRewriter1_13To1_12_2 extends MetadataRewriter {
if (type == Entity1_13Types.EntityType.AREA_EFFECT_CLOUD) { if (type == Entity1_13Types.EntityType.AREA_EFFECT_CLOUD) {
if (metadata.getId() == 9) { if (metadata.getId() == 9) {
int particleId = (int) metadata.getValue(); int particleId = (int) metadata.getValue();
int parameter1 = metadataMap.containsKey(10) ? (int) metadataMap.get(10).getValue() : 0; Metadata parameter1Meta = getMetaByIndex(10, metadatas);
int parameter2 = metadataMap.containsKey(11) ? (int) metadataMap.get(11).getValue() : 0; Metadata parameter2Meta = getMetaByIndex(11, metadatas);
int parameter1 = parameter1Meta != null ? (int) parameter1Meta.getValue() : 0;
int parameter2 = parameter2Meta != null ? (int) parameter2Meta.getValue() : 0;
Particle particle = ParticleRewriter.rewriteParticle(particleId, new Integer[]{parameter1, parameter2}); Particle particle = ParticleRewriter.rewriteParticle(particleId, new Integer[]{parameter1, parameter2});
if (particle != null && particle.getId() != -1) { if (particle != null && particle.getId() != -1) {

Datei anzeigen

@ -16,7 +16,6 @@ import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9To1_8;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.EntityTracker1_9; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.EntityTracker1_9;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.UUID; import java.util.UUID;
public class MetadataRewriter1_9To1_8 extends MetadataRewriter { public class MetadataRewriter1_9To1_8 extends MetadataRewriter {
@ -26,7 +25,7 @@ public class MetadataRewriter1_9To1_8 extends MetadataRewriter {
} }
@Override @Override
protected void handleMetadata(int entityId, EntityType type, Metadata metadata, List<Metadata> metadatas, Map<Integer, Metadata> metadataMap, UserConnection connection) throws Exception { protected void handleMetadata(int entityId, EntityType type, Metadata metadata, List<Metadata> metadatas, UserConnection connection) throws Exception {
MetaIndex metaIndex = MetaIndex.searchIndex(type, metadata.getId()); MetaIndex metaIndex = MetaIndex.searchIndex(type, metadata.getId());
if (metaIndex == null) { if (metaIndex == null) {
throw new Exception("Could not find valid metadata"); throw new Exception("Could not find valid metadata");
@ -43,7 +42,8 @@ public class MetadataRewriter1_9To1_8 extends MetadataRewriter {
if (type == Entity1_10Types.EntityType.ENDERMAN && metaIndex.getNewType() == MetaType1_9.BlockID) { if (type == Entity1_10Types.EntityType.ENDERMAN && metaIndex.getNewType() == MetaType1_9.BlockID) {
if (metaIndex.getOldType() == MetaType1_8.Short) { if (metaIndex.getOldType() == MetaType1_8.Short) {
int id = (Short) metadata.getValue(); int id = (Short) metadata.getValue();
int data = metadataMap.containsKey(17) ? (Byte) metadataMap.get(17).getValue() : 0; Metadata meta = getMetaByIndex(17, metadatas);
int data = meta != null ? (Byte) meta.getValue() : 0;
int combined = (id << 4) | (data & 0xF); int combined = (id << 4) | (data & 0xF);
metadata.setValue(combined); metadata.setValue(combined);
} else { } else {