mirror of https://github.com/ViaVersion/VIAaaS.git
409 lines
16 KiB
Kotlin
409 lines
16 KiB
Kotlin
package com.viaversion.aas.protocol.id47toid5.packets
|
|
|
|
import com.viaversion.aas.protocol.id47toid5.Protocol1_8To1_7_6
|
|
import com.viaversion.aas.protocol.id47toid5.metadata.MetadataRewriter
|
|
import com.viaversion.aas.protocol.id47toid5.storage.EntityTracker
|
|
import com.viaversion.aas.protocol.id47toid5.type.CustomIntType
|
|
import com.viaversion.aas.protocol.xyzToPosition
|
|
import com.viaversion.viaversion.api.minecraft.entities.Entity1_10Types
|
|
import com.viaversion.viaversion.api.protocol.packet.State
|
|
import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper
|
|
import com.viaversion.viaversion.api.protocol.remapper.TypeRemapper
|
|
import com.viaversion.viaversion.api.type.Type
|
|
import com.viaversion.viaversion.api.type.types.version.Types1_8
|
|
import de.gerrygames.viarewind.protocol.protocol1_7_6_10to1_8.types.Types1_7_6_10
|
|
import kotlin.experimental.and
|
|
|
|
fun Protocol1_8To1_7_6.registerEntityPackets() {
|
|
//Entity Equipment
|
|
this.registerClientbound(State.PLAY, 0x04, 0x04, object : PacketRemapper() {
|
|
override fun registerMap() {
|
|
map(Type.INT, Type.VAR_INT) //Entity Id
|
|
map(Type.SHORT) //Slot
|
|
map(Types1_7_6_10.COMPRESSED_NBT_ITEM, Type.ITEM) //Item
|
|
}
|
|
})
|
|
|
|
//Animation
|
|
this.registerClientbound(State.PLAY, 0x0B, 0x0B, object : PacketRemapper() {
|
|
override fun registerMap() {
|
|
handler { packetWrapper ->
|
|
val entityId = packetWrapper.read(Type.VAR_INT) //Entity Id
|
|
val animation = packetWrapper.read(Type.UNSIGNED_BYTE) //Animation
|
|
packetWrapper.clearInputBuffer()
|
|
if (animation.toInt() == 104 || animation.toInt() == 105) {
|
|
packetWrapper.id = 0x1C //Entity Metadata
|
|
packetWrapper.write(Type.VAR_INT, entityId) //Entity Id
|
|
packetWrapper.write(Type.UNSIGNED_BYTE, 0.toShort()) //Index
|
|
packetWrapper.write(Type.UNSIGNED_BYTE, 0.toShort()) //Type
|
|
packetWrapper.write(
|
|
Type.BYTE,
|
|
(if (animation.toInt() == 104) 0x02 else 0x00).toByte()
|
|
) //Value (sneaking/not sneaking)
|
|
packetWrapper.write(Type.UNSIGNED_BYTE, 255.toShort()) //end
|
|
} else {
|
|
packetWrapper.write(Type.VAR_INT, entityId) //Entity Id
|
|
packetWrapper.write(Type.UNSIGNED_BYTE, animation) //Animation
|
|
}
|
|
}
|
|
}
|
|
})
|
|
|
|
//Collect Item
|
|
this.registerClientbound(State.PLAY, 0x0D, 0x0D, object : PacketRemapper() {
|
|
override fun registerMap() {
|
|
map(Type.INT, Type.VAR_INT) //Collected Entity ID
|
|
map(Type.INT, Type.VAR_INT) //Collector Entity ID
|
|
}
|
|
})
|
|
|
|
|
|
//Spawn Object
|
|
this.registerClientbound(State.PLAY, 0x0E, 0x0E, object : PacketRemapper() {
|
|
override fun registerMap() {
|
|
map(Type.VAR_INT)
|
|
map(Type.BYTE)
|
|
map(Type.INT)
|
|
map(Type.INT)
|
|
map(Type.INT)
|
|
map(Type.BYTE)
|
|
map(Type.BYTE)
|
|
map(Type.INT)
|
|
handler { packetWrapper ->
|
|
val type = packetWrapper.get(Type.BYTE, 0)
|
|
var x = packetWrapper.get(Type.INT, 0)
|
|
var y = packetWrapper.get(Type.INT, 1)
|
|
var z = packetWrapper.get(Type.INT, 2)
|
|
var yaw = packetWrapper.get(Type.BYTE, 2)
|
|
var data = packetWrapper.get(Type.INT, 3)
|
|
if (type.toInt() == 71) {
|
|
when (data) {
|
|
0 -> {
|
|
z += 32
|
|
yaw = 0
|
|
}
|
|
1 -> {
|
|
x -= 32
|
|
yaw = 64.toByte()
|
|
}
|
|
2 -> {
|
|
z -= 32
|
|
yaw = 128.toByte()
|
|
}
|
|
3 -> {
|
|
x += 32
|
|
yaw = 192.toByte()
|
|
}
|
|
}
|
|
}
|
|
if (type.toInt() == 70) {
|
|
val id = data
|
|
val metadata = data shr 16
|
|
data = id.or(metadata shl 12)
|
|
}
|
|
if (type.toInt() == 50 || type.toInt() == 70 || type.toInt() == 74) y -= 16
|
|
packetWrapper.set(Type.INT, 0, x)
|
|
packetWrapper.set(Type.INT, 1, y)
|
|
packetWrapper.set(Type.INT, 2, z)
|
|
packetWrapper.set(Type.BYTE, 2, yaw)
|
|
packetWrapper.set(Type.INT, 3, data)
|
|
}
|
|
handler { packetWrapper ->
|
|
val entityID: Int = packetWrapper.get(Type.VAR_INT, 0)
|
|
val typeID = packetWrapper.get(Type.BYTE, 0).toInt()
|
|
val tracker = packetWrapper.user().get(EntityTracker::class.java)!!
|
|
val type: Entity1_10Types.EntityType = Entity1_10Types.getTypeFromId(typeID, true)
|
|
tracker.clientEntityTypes[entityID] = type
|
|
tracker.sendMetadataBuffer(entityID)
|
|
}
|
|
}
|
|
})
|
|
|
|
//Spawn Mob
|
|
this.registerClientbound(State.PLAY, 0x0F, 0x0F, object : PacketRemapper() {
|
|
override fun registerMap() {
|
|
map(Type.VAR_INT)
|
|
map(Type.UNSIGNED_BYTE)
|
|
map(Type.INT)
|
|
map(Type.INT)
|
|
map(Type.INT)
|
|
map(Type.BYTE)
|
|
map(Type.BYTE)
|
|
map(Type.BYTE)
|
|
map(Type.SHORT)
|
|
map(Type.SHORT)
|
|
map(Type.SHORT)
|
|
map(Types1_7_6_10.METADATA_LIST, Types1_8.METADATA_LIST)
|
|
handler { packetWrapper ->
|
|
val entityID: Int = packetWrapper.get(Type.VAR_INT, 0)
|
|
val typeID = packetWrapper.get(Type.UNSIGNED_BYTE, 0).toInt()
|
|
val tracker = packetWrapper.user().get(EntityTracker::class.java)!!
|
|
tracker.clientEntityTypes.put(entityID, Entity1_10Types.getTypeFromId(typeID, false))
|
|
tracker.sendMetadataBuffer(entityID)
|
|
}
|
|
handler { wrapper ->
|
|
val metadataList = wrapper.get(Types1_8.METADATA_LIST, 0)
|
|
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()
|
|
}
|
|
}
|
|
}
|
|
})
|
|
|
|
//Spawn Painting
|
|
this.registerClientbound(State.PLAY, 0x10, 0x10, object : PacketRemapper() {
|
|
override fun registerMap() {
|
|
map(Type.VAR_INT) //Entity Id
|
|
map(Type.STRING) //Title
|
|
map(xyzToPosition, TypeRemapper(Type.POSITION)) //Position
|
|
map(Type.INT, Type.BYTE) //Rotation
|
|
handler { packetWrapper ->
|
|
val entityID = packetWrapper.get(Type.VAR_INT, 0)
|
|
val tracker = packetWrapper.user().get(EntityTracker::class.java)!!
|
|
tracker.clientEntityTypes.put(entityID, Entity1_10Types.EntityType.PAINTING)
|
|
tracker.sendMetadataBuffer(entityID)
|
|
}
|
|
}
|
|
})
|
|
|
|
//Spawn Experience Orb
|
|
this.registerClientbound(State.PLAY, 0x11, 0x11, object : PacketRemapper() {
|
|
override fun registerMap() {
|
|
map(Type.VAR_INT)
|
|
map(Type.INT)
|
|
map(Type.INT)
|
|
map(Type.INT)
|
|
map(Type.SHORT)
|
|
handler { packetWrapper ->
|
|
val entityID: Int = packetWrapper.get(Type.VAR_INT, 0)
|
|
val tracker = packetWrapper.user().get(EntityTracker::class.java)!!
|
|
tracker.clientEntityTypes.put(entityID, Entity1_10Types.EntityType.EXPERIENCE_ORB)
|
|
tracker.sendMetadataBuffer(entityID)
|
|
}
|
|
}
|
|
})
|
|
|
|
//Entity Velocity
|
|
this.registerClientbound(State.PLAY, 0x12, 0x12, object : PacketRemapper() {
|
|
override fun registerMap() {
|
|
map(Type.INT, Type.VAR_INT) //Entity Id
|
|
map(Type.SHORT) //velX
|
|
map(Type.SHORT) //velY
|
|
map(Type.SHORT) //velZ
|
|
}
|
|
})
|
|
|
|
//Destroy Entities
|
|
this.registerClientbound(State.PLAY, 0x13, 0x13, object : PacketRemapper() {
|
|
override fun registerMap() {
|
|
handler { packetWrapper ->
|
|
val amount = packetWrapper.read(Type.BYTE).toInt()
|
|
val customIntType = CustomIntType(amount)
|
|
val entityIds = packetWrapper.read(customIntType)
|
|
packetWrapper.write(Type.VAR_INT_ARRAY_PRIMITIVE, entityIds)
|
|
} //Entity Id Array
|
|
handler { packetWrapper ->
|
|
val tracker = packetWrapper.user().get(EntityTracker::class.java)!!
|
|
for (entityId in packetWrapper.get(Type.VAR_INT_ARRAY_PRIMITIVE, 0)) tracker.removeEntity(entityId)
|
|
}
|
|
}
|
|
})
|
|
|
|
//Entity
|
|
this.registerClientbound(State.PLAY, 0x14, 0x14, object : PacketRemapper() {
|
|
override fun registerMap() {
|
|
map(Type.INT, Type.VAR_INT) //Entity Id
|
|
}
|
|
})
|
|
|
|
//Entity Relative Move
|
|
this.registerClientbound(State.PLAY, 0x15, 0x15, object : PacketRemapper() {
|
|
override fun registerMap() {
|
|
map(Type.INT, Type.VAR_INT) //Entity Id
|
|
map(Type.BYTE) //x
|
|
map(Type.BYTE) //y
|
|
map(Type.BYTE) //z
|
|
create { packetWrapper ->
|
|
packetWrapper.write(Type.BOOLEAN, true) //OnGround
|
|
}
|
|
}
|
|
})
|
|
|
|
//Entity Look
|
|
this.registerClientbound(State.PLAY, 0x16, 0x16, object : PacketRemapper() {
|
|
override fun registerMap() {
|
|
map(Type.INT, Type.VAR_INT) //Entity Id
|
|
map(Type.BYTE) //yaw
|
|
map(Type.BYTE) //pitch
|
|
create { packetWrapper ->
|
|
packetWrapper.write(Type.BOOLEAN, true) //OnGround
|
|
}
|
|
}
|
|
})
|
|
|
|
//Entity Look and Relative Move
|
|
this.registerClientbound(State.PLAY, 0x17, 0x17, object : PacketRemapper() {
|
|
override fun registerMap() {
|
|
map(Type.INT, Type.VAR_INT) //Entity Id
|
|
map(Type.BYTE) //x
|
|
map(Type.BYTE) //y
|
|
map(Type.BYTE) //z
|
|
map(Type.BYTE) //yaw
|
|
map(Type.BYTE) //pitch
|
|
create { packetWrapper ->
|
|
packetWrapper.write(Type.BOOLEAN, true) //OnGround
|
|
}
|
|
}
|
|
})
|
|
|
|
//Entity Teleport
|
|
this.registerClientbound(State.PLAY, 0x18, 0x18, object : PacketRemapper() {
|
|
override fun registerMap() {
|
|
map(Type.INT, Type.VAR_INT) //Entity Id
|
|
map(Type.INT) //x
|
|
map(Type.INT) //y
|
|
map(Type.INT) //z
|
|
map(Type.BYTE) //yaw
|
|
map(Type.BYTE) //pitch
|
|
create { packetWrapper ->
|
|
packetWrapper.write(Type.BOOLEAN, true) //OnGround
|
|
}
|
|
}
|
|
})
|
|
|
|
//Entity Head Look
|
|
this.registerClientbound(State.PLAY, 0x19, 0x19, object : PacketRemapper() {
|
|
override fun registerMap() {
|
|
map(Type.INT, Type.VAR_INT) //Entity Id
|
|
map(Type.BYTE) //Head yaw
|
|
}
|
|
})
|
|
|
|
//Entity MetadataType
|
|
this.registerClientbound(State.PLAY, 0x1C, 0x1C, object : PacketRemapper() {
|
|
override fun registerMap() {
|
|
map(Type.INT, Type.VAR_INT) //Entity Id
|
|
map(Types1_7_6_10.METADATA_LIST, Types1_8.METADATA_LIST) //MetadataType
|
|
handler { wrapper ->
|
|
val metadataList = wrapper.get(Types1_8.METADATA_LIST, 0)
|
|
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)
|
|
if (metadataList.isEmpty()) wrapper.cancel()
|
|
} else {
|
|
tracker.addMetadataToBuffer(entityID, metadataList)
|
|
wrapper.cancel()
|
|
}
|
|
}
|
|
}
|
|
})
|
|
|
|
//Entity Effect
|
|
this.registerClientbound(State.PLAY, 0x1D, 0x1D, object : PacketRemapper() {
|
|
override fun registerMap() {
|
|
map(Type.INT, Type.VAR_INT) //Entity Id
|
|
map(Type.BYTE) //Effect Id
|
|
map(Type.BYTE) //Amplifier
|
|
map(Type.SHORT, Type.VAR_INT) //Duration
|
|
create { packetWrapper -> packetWrapper.write(Type.BOOLEAN, false) } //Hide Particles
|
|
}
|
|
})
|
|
|
|
//Remove Entity Effect
|
|
this.registerClientbound(State.PLAY, 0x1E, 0x1E, object : PacketRemapper() {
|
|
override fun registerMap() {
|
|
map(Type.INT, Type.VAR_INT) //Entity Id
|
|
map(Type.BYTE) //Effect Id
|
|
}
|
|
})
|
|
|
|
//Entity Properties
|
|
this.registerClientbound(State.PLAY, 0x20, 0x20, object : PacketRemapper() {
|
|
override fun registerMap() {
|
|
map(Type.INT, Type.VAR_INT) //Entity Id
|
|
handler { packetWrapper ->
|
|
val amount: Int = packetWrapper.read(Type.INT)
|
|
packetWrapper.write(Type.INT, amount)
|
|
for (i in 0 until amount) {
|
|
packetWrapper.passthrough(Type.STRING)
|
|
packetWrapper.passthrough(Type.DOUBLE)
|
|
val modifierlength = packetWrapper.read(Type.SHORT).toInt()
|
|
packetWrapper.write(Type.VAR_INT, modifierlength)
|
|
for (j in 0 until modifierlength) {
|
|
packetWrapper.passthrough(Type.UUID)
|
|
packetWrapper.passthrough(Type.DOUBLE)
|
|
packetWrapper.passthrough(Type.BYTE)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
})
|
|
|
|
|
|
//Spawn Global Entity
|
|
this.registerClientbound(State.PLAY, 0x2C, 0x2C, object : PacketRemapper() {
|
|
override fun registerMap() {
|
|
map(Type.VAR_INT)
|
|
map(Type.BYTE)
|
|
map(Type.INT)
|
|
map(Type.INT)
|
|
map(Type.INT)
|
|
handler { packetWrapper ->
|
|
val entityID: Int = packetWrapper.get(Type.VAR_INT, 0)
|
|
val tracker = packetWrapper.user().get(EntityTracker::class.java)!!
|
|
tracker.clientEntityTypes[entityID] = Entity1_10Types.EntityType.LIGHTNING
|
|
tracker.sendMetadataBuffer(entityID)
|
|
}
|
|
}
|
|
})
|
|
|
|
//Use Entity
|
|
this.registerServerbound(State.PLAY, 0x02, 0x02, object : PacketRemapper() {
|
|
override fun registerMap() {
|
|
map(Type.VAR_INT, Type.INT)
|
|
handler { packetWrapper ->
|
|
val mode: Int = packetWrapper.read(Type.VAR_INT)
|
|
if (mode == 2) {
|
|
packetWrapper.write(Type.BYTE, 0.toByte())
|
|
packetWrapper.read(Type.FLOAT)
|
|
packetWrapper.read(Type.FLOAT)
|
|
packetWrapper.read(Type.FLOAT)
|
|
} else {
|
|
packetWrapper.write(Type.BYTE, mode.toByte())
|
|
}
|
|
}
|
|
}
|
|
})
|
|
|
|
//Entity Action
|
|
this.registerServerbound(State.PLAY, 0x0B, 0x0B, object : PacketRemapper() {
|
|
override fun registerMap() {
|
|
map(Type.VAR_INT, Type.INT) //Entity Id
|
|
handler { packetWrapper ->
|
|
packetWrapper.write(
|
|
Type.BYTE,
|
|
(packetWrapper.read(Type.VAR_INT) + 1).toByte()
|
|
)
|
|
} //Action Id
|
|
map(Type.VAR_INT, Type.INT) //Action Paramter
|
|
}
|
|
})
|
|
|
|
//Steer Vehicle
|
|
this.registerServerbound(State.PLAY, 0x0C, 0x0C, object : PacketRemapper() {
|
|
override fun registerMap() {
|
|
map(Type.FLOAT) //Sideways
|
|
map(Type.FLOAT) //Forwards
|
|
handler { packetWrapper ->
|
|
val flags = packetWrapper.read(Type.UNSIGNED_BYTE)
|
|
packetWrapper.write(Type.BOOLEAN, flags and 1 == 1.toShort()) //Jump
|
|
packetWrapper.write(Type.BOOLEAN, flags and 2 == 2.toShort()) //Unmount
|
|
}
|
|
}
|
|
})
|
|
} |