Refactoring package go-mc/bot
This commit is contained in:
BIN
net/packet/joingame_test.bin
Normal file
BIN
net/packet/joingame_test.bin
Normal file
Binary file not shown.
@ -3,8 +3,10 @@ package packet
|
||||
import (
|
||||
"bytes"
|
||||
"compress/zlib"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
)
|
||||
|
||||
// Packet define a net data package
|
||||
@ -25,8 +27,9 @@ func Marshal(id int32, fields ...FieldEncoder) (pk Packet) {
|
||||
//Scan decode the packet and fill data into fields
|
||||
func (p Packet) Scan(fields ...FieldDecoder) error {
|
||||
r := bytes.NewReader(p.Data)
|
||||
rr := io.TeeReader(r, hex.Dumper(os.Stdout))
|
||||
for _, v := range fields {
|
||||
_, err := v.ReadFrom(r)
|
||||
_, err := v.ReadFrom(rr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -82,25 +85,25 @@ func (p *Packet) UnPack(r io.Reader, threshold int) error {
|
||||
if length < 1 {
|
||||
return fmt.Errorf("packet length too short")
|
||||
}
|
||||
|
||||
buf := bytes.NewBuffer(p.Data[:0])
|
||||
if _, err := io.CopyN(buf, r, int64(length)); err != nil {
|
||||
buf := make([]byte, length)
|
||||
if _, err := io.ReadFull(r, buf); err != nil {
|
||||
return fmt.Errorf("read content of packet fail: %w", err)
|
||||
}
|
||||
buffer := bytes.NewBuffer(buf)
|
||||
|
||||
//解压数据
|
||||
if threshold > 0 {
|
||||
if err := unCompress(buf); err != nil {
|
||||
if err := unCompress(buffer); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
var packetID VarInt
|
||||
if _, err := packetID.ReadFrom(buf); err != nil {
|
||||
if _, err := packetID.ReadFrom(buffer); err != nil {
|
||||
return fmt.Errorf("read packet id fail: %v", err)
|
||||
}
|
||||
p.ID = int32(packetID)
|
||||
p.Data = buf.Bytes()
|
||||
p.Data = buffer.Bytes()
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -1,11 +1,14 @@
|
||||
package packet
|
||||
package packet_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
_ "embed"
|
||||
"testing"
|
||||
|
||||
pk "github.com/Tnze/go-mc/net/packet"
|
||||
)
|
||||
|
||||
var VarInts = []VarInt{0, 1, 2, 127, 128, 255, 2147483647, -1, -2147483648}
|
||||
var VarInts = []pk.VarInt{0, 1, 2, 127, 128, 255, 2147483647, -1, -2147483648}
|
||||
|
||||
var PackedVarInts = [][]byte{
|
||||
{0x00},
|
||||
@ -35,7 +38,7 @@ func TestPackVarInt(t *testing.T) {
|
||||
}
|
||||
func TestUnpackVarInt(t *testing.T) {
|
||||
for i, v := range PackedVarInts {
|
||||
var vi VarInt
|
||||
var vi pk.VarInt
|
||||
if _, err := vi.ReadFrom(bytes.NewReader(v)); err != nil {
|
||||
t.Errorf("unpack \"% x\" error: %v", v, err)
|
||||
}
|
||||
@ -46,7 +49,7 @@ func TestUnpackVarInt(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestUnpackVarInt_TooLongData(t *testing.T) {
|
||||
var vi VarInt
|
||||
var vi pk.VarInt
|
||||
var data = []byte{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01}
|
||||
if _, err := vi.ReadFrom(bytes.NewReader(data)); err != nil {
|
||||
t.Logf("unpack \"% x\" error: %v", data, err)
|
||||
@ -55,7 +58,7 @@ func TestUnpackVarInt_TooLongData(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
var VarLongs = []VarLong{0, 1, 2, 127, 128, 255, 2147483647, 9223372036854775807, -1, -2147483648, -9223372036854775808}
|
||||
var VarLongs = []pk.VarLong{0, 1, 2, 127, 128, 255, 2147483647, 9223372036854775807, -1, -2147483648, -9223372036854775808}
|
||||
|
||||
var PackedVarLongs = [][]byte{
|
||||
{0x00},
|
||||
@ -81,7 +84,7 @@ func TestPackVarLong(t *testing.T) {
|
||||
}
|
||||
func TestUnpackVarLong(t *testing.T) {
|
||||
for i, v := range PackedVarLongs {
|
||||
var vi VarLong
|
||||
var vi pk.VarLong
|
||||
if _, err := vi.ReadFrom(bytes.NewReader(v)); err != nil {
|
||||
t.Errorf("unpack \"% x\" error: %v", v, err)
|
||||
}
|
||||
@ -90,3 +93,46 @@ func TestUnpackVarLong(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//go:embed joingame_test.bin
|
||||
var joingame []byte
|
||||
|
||||
func TestJoinGamePacket(t *testing.T) {
|
||||
p := pk.Packet{ID: 0x24, Data: joingame}
|
||||
var (
|
||||
EID pk.Int
|
||||
Hardcore pk.Boolean
|
||||
Gamemode pk.UnsignedByte
|
||||
PreGamemode pk.Byte
|
||||
WorldCount pk.VarInt
|
||||
WorldNames = pk.Ary{Len: &WorldCount, Ary: &[]pk.String{}}
|
||||
DimensionCodec struct {
|
||||
DimensionType interface{} `nbt:"minecraft:dimension_type"`
|
||||
WorldgenBiome interface{} `nbt:"minecraft:worldgen/biome"`
|
||||
}
|
||||
Dimension interface{}
|
||||
WorldName pk.Identifier
|
||||
HashedSeed pk.Long
|
||||
MaxPlayers pk.VarInt
|
||||
ViewDistance pk.VarInt
|
||||
RDI, ERS, IsDebug, IsFlat pk.Boolean
|
||||
)
|
||||
err := p.Scan(
|
||||
&EID,
|
||||
&Hardcore,
|
||||
&Gamemode,
|
||||
&PreGamemode,
|
||||
&WorldCount,
|
||||
WorldNames,
|
||||
&pk.NBT{V: &DimensionCodec},
|
||||
&pk.NBT{V: &Dimension},
|
||||
&WorldName,
|
||||
&HashedSeed,
|
||||
&MaxPlayers,
|
||||
&ViewDistance,
|
||||
&RDI, &ERS, &IsDebug, &IsFlat,
|
||||
)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
}
|
||||
|
@ -6,13 +6,13 @@ import (
|
||||
)
|
||||
|
||||
type Ary struct {
|
||||
Len Field // One of VarInt, VarLong, Int or Long
|
||||
Ary interface{} // FieldEncoder, FieldDecoder or both (Field)
|
||||
Len Field // Pointer of VarInt, VarLong, Int or Long
|
||||
Ary interface{} // Slice of FieldEncoder, FieldDecoder or both (Field)
|
||||
}
|
||||
|
||||
func (a Ary) WriteTo(r io.Writer) (n int64, err error) {
|
||||
length := int(reflect.ValueOf(a.Len).Int())
|
||||
array := reflect.ValueOf(a.Ary).Elem()
|
||||
array := reflect.ValueOf(a.Ary)
|
||||
for i := 0; i < length; i++ {
|
||||
elem := array.Index(i)
|
||||
nn, err := elem.Interface().(FieldEncoder).WriteTo(r)
|
||||
@ -25,11 +25,15 @@ func (a Ary) WriteTo(r io.Writer) (n int64, err error) {
|
||||
}
|
||||
|
||||
func (a Ary) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
length := int(reflect.ValueOf(a.Len).Int())
|
||||
length := int(reflect.ValueOf(a.Len).Elem().Int())
|
||||
array := reflect.ValueOf(a.Ary).Elem()
|
||||
if array.Cap() < length {
|
||||
array = reflect.MakeSlice(array.Type(), length, length)
|
||||
a.Ary = array.Interface()
|
||||
}
|
||||
for i := 0; i < length; i++ {
|
||||
elem := array.Index(i)
|
||||
nn, err := elem.Interface().(FieldDecoder).ReadFrom(r)
|
||||
nn, err := elem.Addr().Interface().(FieldDecoder).ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
|
Reference in New Issue
Block a user