Skip to content

Xenoxiluna/XTerraPacket

Repository files navigation

XTerraPacket

Swift 5.X GitHub license Docs

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(.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("")
}

Encode

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 {}

Dependencies

License

XTerraPacket is licensed under the MIT License