XTerraPacket
A Packet Library for encoding and decoding Terraria's network protocol packets.
NOTE: Currently this supports only Terraria 1.4.X
Usage
Brief example using SwiftNIO for now... You can also look at TerraProxy-CLI for inspiration/uses.
Decode
You can decode an incoming packet's raw bytes like this:
let packetData = bb.getBytes(at: 0, length: bb.readableBytes)!
guard var packet = try? TerrariaPacketFactory.decodePacket(packet: packetData) else {
print("Parse failed!")
print("Failed bytes: \(packetData))")
channel.writeAndFlush(NIOAny.init(bb), promise: nil)
return
}
Once you have a valid packet, you can view its type using the swifts dynamic type(of:) function or using the provided getType() protocol extension.
print("Swift Packet type: \(type(of: packet))")
print("Packet Type: \(packet.getType())")
Form there, its possible to run the decode again to translate the payload. You could also just use the packets decodePayload() function.
do{
try packet.decode()
print("Decoded Packet Bytes: \(packet.bytes))")
}catch{
print("Decode failed...")
print("Failed Packet Bytes: \(packet.bytes))")
return
}
switch packet.getType(){
case TerrariaPacketType.ConnectApproval:
let appPacket = packet as! PacketConnectApproval
connection.setPlayerId(playerId: Int(appPacket.playerId))
default:
print("")
}
Encode
TODO For now, See API Documentation for encode functionality.
Dependencies
License
XTerraPacket
is licensed under the MIT License