A Packet Library for encoding and decoding Terraria's network protocol packets.
Brief example using SwiftNIO for now... You can also look at TerraProxy-CLI for inspiration/uses.
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(.ClientToServer)
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("")
}
See API Documentation for encode functionality.
Chat Message Example:
var load = PacketLoadNetModule()
load.netModuleType = .Chat
load.context = .ClientToServer
load.netModule = NetModuleChat(command: .Say, message: "this is a test")
do{
try load.encode()
}catch {}
XTerraPacket
is licensed under the MIT License