trelay

package module
v0.5.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 12, 2023 License: MIT Imports: 5 Imported by: 0

README

Trelay - a set of utilities to simplify work with Terraria Networking.

Use trelay.Fscan to read data from a reader (network) as sent by Terraria.

var ln uint16
var id byte
_, err := trelay.Fscan(r, &ln, &id)
if err != nil { /* ... */ }
switch id {
case 1:
  var ver string
  _, err := trelay.Fscan(r, &ver)
/* ... */

Or use trelay.Packet to read an entire packet into a buffer.

var p trelay.Packet
_, err := trelay.Fscan(r, &p) // p.ReadFrom(r) also works!
if err != nil { /* ... */ }

switch p.ID {
case 1:
  var ver string
  _, err := trelay.Fscan(p, &ver)
/* ... */

Use trelay.Fprint to write data as expected by Terraria.

// do not forget to cast constants to correct types
_, err := trelay.Fprint(w, uint16(15), byte(1), "Terraria123")

Or write to trelay.Packet to build a packet in memory when length is not known in advance.

p := &trelay.Packet{ID: 1}
trelay.Fprint(p, "Terraria123") // writes to Packet never* fail

_, err := trelay.Fprint(w, p) // no need to p.Bytes(), Fprint will use p.WriteTo
if err != nil { /* ... */ }

*Assumes Fprint-supported types and no memory issues.

Reuse trelay.Packet whenever possible to avoid unnecessary memory allocations.

_, err := trelay.Fscan(conn, &packet) // Fscan into Packet clears it
if err != nil { /* ... */ }

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Fprint

func Fprint(w io.Writer, v ...any) (n int, err error)

fmt.Fprint-ish helper to write data as Terraria expects it. Supported types: io.WriterTo, encoding.BinaryMarshaler, []byte, [u]int[8/16/32/64], float[32/64], string.

Does not write packet header, it is assumed to be written earlier. Use *Builder to build a packet prior to sending it.

func Fscan

func Fscan(r io.Reader, ptrs ...any) (n int, err error)

fmt.Fscan-ish helper to read data from Terraria packets. Supported types: io.ReaderFrom, *[]byte, *byte, *[u]int[8/16/32/64], *float[32/64], string. Note that values implementing io.ReaderFrom should stop before EOF or error, otherwise they will consume the entire reader.

Types

type Packet

type Packet struct {
	ID byte
	// contains filtered or unexported fields
}

Writing to Packet helps avoid manual bookkeeping of length and id as opposed to bytes.Buffer. Do not copy a non-zero packet, as buffer will be shared.

func (*Packet) Bytes added in v0.5.0

func (p *Packet) Bytes() []byte

Returns a copy of the internal buffer + header.

func (*Packet) Len

func (p *Packet) Len() uint16

Len includes length of packet header (3 bytes)

func (*Packet) RReset added in v0.5.0

func (p *Packet) RReset()

Resets internal read pointer to the start.

func (*Packet) Read

func (p *Packet) Read(b []byte) (n int, err error)

Implements io.Reader. Skips packet header.

func (*Packet) ReadFrom

func (p *Packet) ReadFrom(r io.Reader) (n int64, err error)

Will read an entire packet from r and overwrite current data, assuming first three bytes read form a valid packet header.

As opposed to definition of io.ReaderFrom, reads only up to length given in the header. Will reuse internal buffer when possible.

func (*Packet) Reset added in v0.5.0

func (p *Packet) Reset()

Clears internal buffer, but retains space.

func (*Packet) Write added in v0.5.0

func (p *Packet) Write(b []byte) (n int, err error)

Imlements io.Writer. Writes data to the end of the packet.

func (*Packet) WriteTo added in v0.4.2

func (p *Packet) WriteTo(w io.Writer) (n int64, err error)

Implements io.WriterTo. Writes the entire packet, including header, even when Read pointer is not at the start. Avoids unnecessary allocations.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL