Created
April 7, 2023 16:58
-
-
Save ultraviolet-jordan/56be0b7d7c66a9936171a28d90b1967c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class PlayerAppearanceBlockBuilder : RenderBlockBuilder<Appearance>( | |
index = 1, | |
mask = 0x4 | |
) { | |
private val builders = arrayOf( | |
HeadBuilder(), | |
BackBuilder(), | |
NeckBuilder(), | |
MainHandBuilder(), | |
TorsoBuilder(), | |
OffHandBuilder(), | |
ArmsBuilder(), | |
LegsBuilder(), | |
HairBuilder(), | |
HandsBuilder(), | |
FeetBuilder(), | |
JawBuilder() | |
) | |
override fun build(buffer: RSByteBuffer, render: Appearance) { | |
val block = RSByteBuffer(ByteBuffer.allocate(size(render) - 1)).apply { | |
writeByte(render.gender.id) | |
writeByte(render.skullIcon) | |
writeByte(render.headIcon) | |
if (render.transform != -1) { | |
writeTransmog(render) | |
} else { | |
writeIdentityKit(render) | |
} | |
writeColors(render.bodyPartColors) | |
writeAnimations(render) | |
writeStringCp1252NullTerminated(render.displayName) | |
writeByte(126) | |
writeShort(0) | |
writeByte(0) // Hidden | |
writeShort(0) | |
repeat(3) { writeStringCp1252NullTerminated("") } | |
writeByte(0) | |
} | |
buffer.writeByteAdd(block.position()) | |
buffer.writeBytesReversedAdd(block.array()) | |
} | |
private fun RSByteBuffer.writeAnimations(render: Appearance) = if (render.transform != -1) { | |
// TODO NPC transmog | |
} else { | |
render.renderSequences.forEach { writeShort(it) } | |
} | |
private fun RSByteBuffer.writeTransmog(render: Appearance) { | |
writeShort(65535) | |
writeShort(render.transform) | |
} | |
private fun RSByteBuffer.writeIdentityKit(render: Appearance) { | |
// If a builder is not of an appearance body part, we send 0 as default | |
// but this will be overwritten with their equipped item if applicable. | |
builders.forEach { it.build(this, render.gender, render.bodyParts.getOrNull(it.appearanceIndex) ?: 0) } | |
} | |
private fun RSByteBuffer.writeColors(colors: IntArray) { | |
colors.forEach { writeByte(it) } | |
} | |
override fun size(render: Appearance): Int { | |
val gender = 1 | |
val skull = 1 | |
val headIcon = 1 | |
val identity = if (render.transform != -1) { | |
4 | |
} else { | |
val arm = 2 | |
val cape = 1 | |
val foot = 2 | |
val hair = 2 | |
val hand = 2 | |
val head = 1 | |
val jaw = if (render.isMale()) 2 else 1 | |
val leg = 2 | |
val neck = 1 | |
val shield = 1 | |
val torso = 2 | |
val weapon = 1 | |
arm + cape + foot + hair + hand + head + jaw + leg + neck + shield + torso + weapon | |
} | |
val colors = 5 | |
val animations = if (render.transform != -1) 0 else 14 | |
val displayName = render.displayName.length + 1 | |
val combatLevel = 1 | |
val unknown1 = 2 | |
val hidden = 1 | |
val unknown2 = 2 | |
val strings = 3 * ("".length + 1) | |
val unknown3 = 1 | |
return 1 + gender + skull + headIcon + identity + colors + animations + displayName + combatLevel + unknown1 + hidden + unknown2 + strings + unknown3 | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment