1.7 protocol cleanup, try to fix metadata

This commit is contained in:
creeper123123321 2021-10-30 11:26:55 -03:00
parent 72a166e2be
commit 68e790f06c
5 changed files with 78 additions and 83 deletions

View File

@ -9,42 +9,38 @@ import de.gerrygames.viarewind.protocol.protocol1_8to1_7_6_10.metadata.MetaIndex
object MetadataRewriter { object MetadataRewriter {
fun transform(type: Entity1_10Types.EntityType?, list: MutableList<Metadata>) { fun transform(type: Entity1_10Types.EntityType?, list: MutableList<Metadata>) {
for (entry in ArrayList(list)) { for (entry in ArrayList(list)) {
val metaIndex = MetaIndex1_8to1_7_6_10.searchIndex(type, entry.id())
try { try {
if (metaIndex == null) throw Exception("Could not find valid metadata")
if (metaIndex.newType == MetaType1_8.NonExistent || metaIndex.newType == null) {
list.remove(entry)
return
}
val value = entry.value val value = entry.value
if (value == null val metaIndex = MetaIndex1_8to1_7_6_10.searchIndex(type, entry.id())
|| !value.javaClass.isAssignableFrom(metaIndex.oldType.type().outputClass)) {
if (metaIndex == null || metaIndex.newType == MetaType1_8.NonExistent) {
list.remove(entry) list.remove(entry)
return continue
} }
entry.setMetaType(metaIndex.newType) entry.setMetaType(metaIndex.newType)
entry.setId(metaIndex.newIndex) entry.setId(metaIndex.newIndex)
when (metaIndex.newType) { when (metaIndex.newType) {
MetaType1_8.Int -> entry.value = (value as Number).toInt()
MetaType1_8.Byte -> { MetaType1_8.Byte -> {
var byteValue = (value as Number).toByte() var byteValue = (value as Number).toByte()
entry.value = byteValue
if (metaIndex == MetaIndex1_8to1_7_6_10.HUMAN_SKIN_FLAGS) { if (metaIndex == MetaIndex1_8to1_7_6_10.HUMAN_SKIN_FLAGS) {
val cape = byteValue.toInt() == 2 val cape = byteValue.toInt() == 2
byteValue = (if (cape) 127 else 125).toByte() byteValue = (if (cape) 127 else 125).toByte()
entry.value = byteValue
} }
entry.value = byteValue
} }
MetaType1_8.Int -> entry.value = (value as Number).toInt()
MetaType1_8.Short -> entry.value = (value as Number).toShort() MetaType1_8.Short -> entry.value = (value as Number).toShort()
MetaType1_8.String -> entry.value = value.toString()
MetaType1_8.Float -> entry.value = (value as Number).toFloat() MetaType1_8.Float -> entry.value = (value as Number).toFloat()
MetaType1_8.String -> entry.value = value.toString()
MetaType1_8.Slot, MetaType1_8.Position, MetaType1_8.Rotation -> entry.value = value MetaType1_8.Slot, MetaType1_8.Position, MetaType1_8.Rotation -> entry.value = value
else -> { else -> throw Exception("unknown metatype ${metaIndex.newType}")
Via.getPlatform().logger.warning("[Out] Unhandled MetaDataType: " + metaIndex.newType)
list.remove(entry)
}
} }
} catch (e: Exception) { } catch (e: Exception) {
if (!Via.getPlatform().conf.isSuppressMetadataErrors) {
Via.getPlatform().logger.warning("Metadata Exception: $e $list")
}
list.remove(entry) list.remove(entry)
} }
} }

View File

@ -59,14 +59,14 @@ fun Protocol1_8To1_7_6.registerEntityPackets() {
this.registerClientbound(ClientboundPackets1_7.SPAWN_ENTITY, object : PacketRemapper() { this.registerClientbound(ClientboundPackets1_7.SPAWN_ENTITY, object : PacketRemapper() {
override fun registerMap() { override fun registerMap() {
map(Type.VAR_INT) map(Type.VAR_INT) // id
map(Type.BYTE) map(Type.BYTE) // type
map(Type.INT) map(Type.INT) // x
map(Type.INT) map(Type.INT) // y
map(Type.INT) map(Type.INT) // z
map(Type.BYTE) map(Type.BYTE) // pitch
map(Type.BYTE) map(Type.BYTE) // yaw
map(Type.INT) map(Type.INT) // data
handler { packetWrapper -> handler { packetWrapper ->
val type = packetWrapper.get(Type.BYTE, 0) val type = packetWrapper.get(Type.BYTE, 0)
var x = packetWrapper.get(Type.INT, 0) var x = packetWrapper.get(Type.INT, 0)
@ -107,12 +107,12 @@ fun Protocol1_8To1_7_6.registerEntityPackets() {
packetWrapper.set(Type.INT, 3, data) packetWrapper.set(Type.INT, 3, data)
} }
handler { packetWrapper -> handler { packetWrapper ->
val entityID: Int = packetWrapper.get(Type.VAR_INT, 0) val entityID = packetWrapper.get(Type.VAR_INT, 0)
val typeID = packetWrapper.get(Type.BYTE, 0).toInt() val typeID = packetWrapper.get(Type.BYTE, 0).toInt()
val tracker = packetWrapper.user().get(EntityTracker::class.java)!! val tracker = packetWrapper.user().get(EntityTracker::class.java)!!
val type: Entity1_10Types.EntityType = Entity1_10Types.getTypeFromId(typeID, true) val type: Entity1_10Types.EntityType = Entity1_10Types.getTypeFromId(typeID, true)
tracker.clientEntityTypes[entityID] = type tracker.addEntity(entityID, type)
tracker.sendMetadataBuffer(entityID) tracker.flushMetadataBuffer(entityID)
} }
} }
}) })
@ -135,18 +135,11 @@ fun Protocol1_8To1_7_6.registerEntityPackets() {
val entityID: Int = packetWrapper.get(Type.VAR_INT, 0) val entityID: Int = packetWrapper.get(Type.VAR_INT, 0)
val typeID = packetWrapper.get(Type.UNSIGNED_BYTE, 0).toInt() val typeID = packetWrapper.get(Type.UNSIGNED_BYTE, 0).toInt()
val tracker = packetWrapper.user().get(EntityTracker::class.java)!! val tracker = packetWrapper.user().get(EntityTracker::class.java)!!
tracker.clientEntityTypes.put(entityID, Entity1_10Types.getTypeFromId(typeID, false)) tracker.addEntity(entityID, Entity1_10Types.getTypeFromId(typeID, false))
tracker.sendMetadataBuffer(entityID) tracker.flushMetadataBuffer(entityID)
}
handler { wrapper -> val metadataList = packetWrapper.get(Types1_8.METADATA_LIST, 0)
val metadataList = wrapper.get(Types1_8.METADATA_LIST, 0) MetadataRewriter.transform(tracker.getType(entityID), metadataList)
val entityID: Int = wrapper.get(Type.VAR_INT, 0)
val tracker = wrapper.user().get(EntityTracker::class.java)!!
if (tracker.clientEntityTypes.containsKey(entityID)) {
MetadataRewriter.transform(tracker.clientEntityTypes[entityID], metadataList)
} else {
wrapper.cancel()
}
} }
} }
}) })
@ -160,8 +153,8 @@ fun Protocol1_8To1_7_6.registerEntityPackets() {
handler { packetWrapper -> handler { packetWrapper ->
val entityID = packetWrapper.get(Type.VAR_INT, 0) val entityID = packetWrapper.get(Type.VAR_INT, 0)
val tracker = packetWrapper.user().get(EntityTracker::class.java)!! val tracker = packetWrapper.user().get(EntityTracker::class.java)!!
tracker.clientEntityTypes.put(entityID, Entity1_10Types.EntityType.PAINTING) tracker.addEntity(entityID, Entity1_10Types.EntityType.PAINTING)
tracker.sendMetadataBuffer(entityID) tracker.flushMetadataBuffer(entityID)
} }
} }
}) })
@ -176,8 +169,8 @@ fun Protocol1_8To1_7_6.registerEntityPackets() {
handler { packetWrapper -> handler { packetWrapper ->
val entityID: Int = packetWrapper.get(Type.VAR_INT, 0) val entityID: Int = packetWrapper.get(Type.VAR_INT, 0)
val tracker = packetWrapper.user().get(EntityTracker::class.java)!! val tracker = packetWrapper.user().get(EntityTracker::class.java)!!
tracker.clientEntityTypes.put(entityID, Entity1_10Types.EntityType.EXPERIENCE_ORB) tracker.addEntity(entityID, Entity1_10Types.EntityType.EXPERIENCE_ORB)
tracker.sendMetadataBuffer(entityID) tracker.flushMetadataBuffer(entityID)
} }
} }
}) })
@ -270,8 +263,8 @@ fun Protocol1_8To1_7_6.registerEntityPackets() {
val metadataList = wrapper.get(Types1_8.METADATA_LIST, 0) val metadataList = wrapper.get(Types1_8.METADATA_LIST, 0)
val entityID: Int = wrapper.get(Type.VAR_INT, 0) val entityID: Int = wrapper.get(Type.VAR_INT, 0)
val tracker = wrapper.user().get(EntityTracker::class.java)!! val tracker = wrapper.user().get(EntityTracker::class.java)!!
if (tracker.clientEntityTypes.containsKey(entityID)) { if (tracker.hasEntity(entityID)) {
MetadataRewriter.transform(tracker.clientEntityTypes[entityID], metadataList) MetadataRewriter.transform(tracker.getType(entityID), metadataList)
if (metadataList.isEmpty()) wrapper.cancel() if (metadataList.isEmpty()) wrapper.cancel()
} else { } else {
tracker.addMetadataToBuffer(entityID, metadataList) tracker.addMetadataToBuffer(entityID, metadataList)
@ -330,8 +323,8 @@ fun Protocol1_8To1_7_6.registerEntityPackets() {
handler { packetWrapper -> handler { packetWrapper ->
val entityID: Int = packetWrapper.get(Type.VAR_INT, 0) val entityID: Int = packetWrapper.get(Type.VAR_INT, 0)
val tracker = packetWrapper.user().get(EntityTracker::class.java)!! val tracker = packetWrapper.user().get(EntityTracker::class.java)!!
tracker.clientEntityTypes[entityID] = Entity1_10Types.EntityType.LIGHTNING tracker.addEntity(entityID, Entity1_10Types.EntityType.LIGHTNING)
tracker.sendMetadataBuffer(entityID) tracker.flushMetadataBuffer(entityID)
} }
} }
}) })

View File

@ -182,8 +182,8 @@ fun Protocol1_8To1_7_6.registerPlayerPackets() {
handler { packetWrapper -> handler { packetWrapper ->
val entityID: Int = packetWrapper.get(Type.VAR_INT, 0) val entityID: Int = packetWrapper.get(Type.VAR_INT, 0)
val tracker: EntityTracker = packetWrapper.user().get(EntityTracker::class.java)!! val tracker: EntityTracker = packetWrapper.user().get(EntityTracker::class.java)!!
tracker.clientEntityTypes[entityID] = Entity1_10Types.EntityType.PLAYER tracker.addEntity(entityID, Entity1_10Types.EntityType.PLAYER)
tracker.sendMetadataBuffer(entityID) tracker.flushMetadataBuffer(entityID)
} }
} }
}) })
@ -375,29 +375,28 @@ fun Protocol1_8To1_7_6.registerPlayerPackets() {
map(Type.STRING) map(Type.STRING)
handler { packetWrapper -> handler { packetWrapper ->
val channel = packetWrapper.get(Type.STRING, 0) val channel = packetWrapper.get(Type.STRING, 0)
if (channel.equals("MC|ItemName", ignoreCase = true)) { when (channel) {
val name: ByteArray = packetWrapper.read(Type.STRING).toByteArray(Charsets.UTF_8) "MC|ItemName" -> {
packetWrapper.write(Type.REMAINING_BYTES, name) val name: ByteArray = packetWrapper.read(Type.STRING).toByteArray(Charsets.UTF_8)
} else if (channel.equals("MC|BEdit", ignoreCase = true) || channel.equals( packetWrapper.write(Type.REMAINING_BYTES, name)
"MC|BSign", }
ignoreCase = true "MC|BEdit", "MC|BSign" ->{
) packetWrapper.read(Type.SHORT) //length
) { val book: Item = packetWrapper.read(Types1_7_6_10.COMPRESSED_NBT_ITEM)
packetWrapper.read(Type.SHORT) //length val tag = book.tag()
val book: Item = packetWrapper.read(Types1_7_6_10.COMPRESSED_NBT_ITEM) if (tag != null && tag.contains("pages")) {
val tag = book.tag() val pages = tag.get<ListTag>("pages")
if (tag != null && tag.contains("pages")) { if (pages != null) {
val pages = tag.get<ListTag>("pages") (0 until pages.size()).forEach { i ->
if (pages != null) { val page = pages.get<StringTag>(i)
(0 until pages.size()).forEach { i -> var value: String? = page.value
val page = pages.get<StringTag>(i) value = ChatUtil.jsonToLegacy(value)
var value: String? = page.value page.value = value
value = ChatUtil.jsonToLegacy(value) }
page.value = value
} }
} }
packetWrapper.write(Type.ITEM, book)
} }
packetWrapper.write(Type.ITEM, book)
} }
packetWrapper.cancel() packetWrapper.cancel()
packetWrapper.packetType = null packetWrapper.packetType = null

View File

@ -197,7 +197,7 @@ fun Protocol1_8To1_7_6.registerWorldPackets() {
this.registerServerbound(ServerboundPackets1_8.PLAYER_DIGGING, object : PacketRemapper() { this.registerServerbound(ServerboundPackets1_8.PLAYER_DIGGING, object : PacketRemapper() {
override fun registerMap() { override fun registerMap() {
map(Type.UNSIGNED_BYTE, Type.BYTE) //Status map(Type.VAR_INT) //Status
map(TypeRemapper(Type.POSITION), xyzUBytePosWriter) map(TypeRemapper(Type.POSITION), xyzUBytePosWriter)
map(Type.BYTE) //Face map(Type.BYTE) //Face
} }

View File

@ -10,32 +10,39 @@ import com.viaversion.viaversion.api.protocol.packet.PacketWrapper
import com.viaversion.viaversion.api.type.Type import com.viaversion.viaversion.api.type.Type
import com.viaversion.viaversion.api.type.types.version.Types1_8 import com.viaversion.viaversion.api.type.types.version.Types1_8
import de.gerrygames.viarewind.protocol.protocol1_7_6_10to1_8.ClientboundPackets1_7 import de.gerrygames.viarewind.protocol.protocol1_7_6_10to1_8.ClientboundPackets1_7
import java.util.concurrent.ConcurrentHashMap
class EntityTracker(user: UserConnection) : StoredObject(user) { class EntityTracker(user: UserConnection) : StoredObject(user) {
val clientEntityTypes = ConcurrentHashMap<Int, Entity1_10Types.EntityType>() private val clientEntityTypes = HashMap<Int, Entity1_10Types.EntityType>()
private val metadataBuffer = ConcurrentHashMap<Int, MutableList<Metadata>>() private val metadataBuffer = HashMap<Int, MutableList<Metadata>>()
fun removeEntity(entityId: Int) { fun removeEntity(entityId: Int) {
clientEntityTypes.remove(entityId) clientEntityTypes.remove(entityId)
metadataBuffer.remove(entityId)
} }
fun getType(entityId: Int) = clientEntityTypes[entityId]
fun addEntity(entityId: Int, type: Entity1_10Types.EntityType) {
clientEntityTypes[entityId] = type
}
fun hasEntity(entityId: Int) = clientEntityTypes.containsKey(entityId)
fun addMetadataToBuffer(entityID: Int, metadataList: MutableList<Metadata>) { fun addMetadataToBuffer(entityID: Int, metadataList: MutableList<Metadata>) {
metadataBuffer.computeIfAbsent(entityID) { mutableListOf() }.addAll(metadataList) metadataBuffer.computeIfAbsent(entityID) { mutableListOf() }.addAll(metadataList)
} }
fun getBufferedMetadata(entityId: Int): List<Metadata> { fun flushMetadataBuffer(entityId: Int) {
return metadataBuffer[entityId]!! val buffer = metadataBuffer[entityId] ?: return
}
fun sendMetadataBuffer(entityId: Int) {
if (!metadataBuffer.containsKey(entityId)) return
val wrapper = PacketWrapper.create(ClientboundPackets1_7.ENTITY_METADATA, null, this.user) val wrapper = PacketWrapper.create(ClientboundPackets1_7.ENTITY_METADATA, null, this.user)
wrapper.write(Type.VAR_INT, entityId) wrapper.write(Type.VAR_INT, entityId)
wrapper.write(Types1_8.METADATA_LIST, metadataBuffer[entityId]) wrapper.write(Types1_8.METADATA_LIST, buffer)
MetadataRewriter.transform(clientEntityTypes[entityId], metadataBuffer[entityId]!!)
if (metadataBuffer[entityId]!!.isNotEmpty()) { MetadataRewriter.transform(clientEntityTypes[entityId], buffer)
if (buffer.isNotEmpty()) {
try { try {
wrapper.send(Protocol1_8To1_7_6::class.java) wrapper.scheduleSend(Protocol1_8To1_7_6::class.java)
} catch (ex: Exception) { } catch (ex: Exception) {
ex.printStackTrace() ex.printStackTrace()
} }