add player package with key client-side player functionality, update protocol codecs, and refactor metadata definitions and slot usage
This commit is contained in:
@ -3698,102 +3698,6 @@ func (a *BoolVarIntArray) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
return n, err
|
||||
}
|
||||
|
||||
// Int32VarIntArray a utility type for encoding/decoding packet.Int -> int32[packet.VarInt] slice.
|
||||
type Int32VarIntArray []int32
|
||||
|
||||
func (a Int32VarIntArray) WriteTo(w io.Writer) (n int64, err error) {
|
||||
size := len(a)
|
||||
nn, err := packet.VarInt(size).WriteTo(w)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
n += nn
|
||||
for i := 0; i < size; i++ {
|
||||
nn, err := packet.Int(a[i]).WriteTo(w)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
return n, nil
|
||||
}
|
||||
|
||||
func (a *Int32VarIntArray) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
var size packet.VarInt
|
||||
nn, err := size.ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
if size < 0 {
|
||||
return n, errors.New("array length less than zero")
|
||||
}
|
||||
|
||||
if cap(*a) >= int(size) {
|
||||
*a = (*a)[:int(size)]
|
||||
} else {
|
||||
*a = make(Int32VarIntArray, int(size))
|
||||
}
|
||||
|
||||
for i := 0; i < int(size); i++ {
|
||||
nn, err = (*packet.Int)(&(*a)[i]).ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
|
||||
return n, err
|
||||
}
|
||||
|
||||
// Int32PrefixedArrayVarIntArray a utility type for encoding/decoding packet.Int -> int32[packet.VarInt] slice.
|
||||
type Int32PrefixedArrayVarIntArray []int32
|
||||
|
||||
func (a Int32PrefixedArrayVarIntArray) WriteTo(w io.Writer) (n int64, err error) {
|
||||
size := len(a)
|
||||
nn, err := packet.VarInt(size).WriteTo(w)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
n += nn
|
||||
for i := 0; i < size; i++ {
|
||||
nn, err := packet.Int(a[i]).WriteTo(w)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
return n, nil
|
||||
}
|
||||
|
||||
func (a *Int32PrefixedArrayVarIntArray) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
var size packet.VarInt
|
||||
nn, err := size.ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
if size < 0 {
|
||||
return n, errors.New("array length less than zero")
|
||||
}
|
||||
|
||||
if cap(*a) >= int(size) {
|
||||
*a = (*a)[:int(size)]
|
||||
} else {
|
||||
*a = make(Int32PrefixedArrayVarIntArray, int(size))
|
||||
}
|
||||
|
||||
for i := 0; i < int(size); i++ {
|
||||
nn, err = (*packet.Int)(&(*a)[i]).ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
|
||||
return n, err
|
||||
}
|
||||
|
||||
// StringVarIntArray a utility type for encoding/decoding packet.String -> string[packet.VarInt] slice.
|
||||
type StringVarIntArray []string
|
||||
|
||||
@ -3889,3 +3793,99 @@ func (a *Int32VarIntVarIntArray) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
|
||||
return n, err
|
||||
}
|
||||
|
||||
// Int32VarIntArray a utility type for encoding/decoding packet.Int -> int32[packet.VarInt] slice.
|
||||
type Int32VarIntArray []int32
|
||||
|
||||
func (a Int32VarIntArray) WriteTo(w io.Writer) (n int64, err error) {
|
||||
size := len(a)
|
||||
nn, err := packet.VarInt(size).WriteTo(w)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
n += nn
|
||||
for i := 0; i < size; i++ {
|
||||
nn, err := packet.Int(a[i]).WriteTo(w)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
return n, nil
|
||||
}
|
||||
|
||||
func (a *Int32VarIntArray) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
var size packet.VarInt
|
||||
nn, err := size.ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
if size < 0 {
|
||||
return n, errors.New("array length less than zero")
|
||||
}
|
||||
|
||||
if cap(*a) >= int(size) {
|
||||
*a = (*a)[:int(size)]
|
||||
} else {
|
||||
*a = make(Int32VarIntArray, int(size))
|
||||
}
|
||||
|
||||
for i := 0; i < int(size); i++ {
|
||||
nn, err = (*packet.Int)(&(*a)[i]).ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
|
||||
return n, err
|
||||
}
|
||||
|
||||
// Int32PrefixedArrayVarIntArray a utility type for encoding/decoding packet.Int -> int32[packet.VarInt] slice.
|
||||
type Int32PrefixedArrayVarIntArray []int32
|
||||
|
||||
func (a Int32PrefixedArrayVarIntArray) WriteTo(w io.Writer) (n int64, err error) {
|
||||
size := len(a)
|
||||
nn, err := packet.VarInt(size).WriteTo(w)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
n += nn
|
||||
for i := 0; i < size; i++ {
|
||||
nn, err := packet.Int(a[i]).WriteTo(w)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
return n, nil
|
||||
}
|
||||
|
||||
func (a *Int32PrefixedArrayVarIntArray) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
var size packet.VarInt
|
||||
nn, err := size.ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
if size < 0 {
|
||||
return n, errors.New("array length less than zero")
|
||||
}
|
||||
|
||||
if cap(*a) >= int(size) {
|
||||
*a = (*a)[:int(size)]
|
||||
} else {
|
||||
*a = make(Int32PrefixedArrayVarIntArray, int(size))
|
||||
}
|
||||
|
||||
for i := 0; i < int(size); i++ {
|
||||
nn, err = (*packet.Int)(&(*a)[i]).ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
|
||||
return n, err
|
||||
}
|
||||
|
@ -46,13 +46,13 @@ const (
|
||||
MetadataQuaternion
|
||||
)
|
||||
|
||||
type entityMetadata interface {
|
||||
type Metadata interface {
|
||||
EntityMetadataType() MetadataType
|
||||
pk.Field
|
||||
}
|
||||
|
||||
type EntityMetadata struct {
|
||||
Data map[uint8]entityMetadata
|
||||
Data map[uint8]Metadata
|
||||
}
|
||||
|
||||
func (m EntityMetadata) WriteTo(w io.Writer) (int64, error) {
|
||||
@ -114,44 +114,44 @@ func (m *EntityMetadata) ReadFrom(r io.Reader) (int64, error) {
|
||||
return n, nil
|
||||
}
|
||||
|
||||
type metadataCreator func() entityMetadata
|
||||
type metadataCreator func() Metadata
|
||||
|
||||
var metadataType = map[MetadataType]metadataCreator{}
|
||||
|
||||
func init() {
|
||||
metadataType[MetadataByte] = func() entityMetadata { return &Byte{} }
|
||||
metadataType[MetadataVarInt] = func() entityMetadata { return &VarInt{} }
|
||||
metadataType[MetadataVarLong] = func() entityMetadata { return &VarLong{} }
|
||||
metadataType[MetadataFloat] = func() entityMetadata { return &Float{} }
|
||||
metadataType[MetadataString] = func() entityMetadata { return &String{} }
|
||||
metadataType[MetadataChat] = func() entityMetadata { return &Chat{} }
|
||||
metadataType[MetadataOptChat] = func() entityMetadata { return &OptChat{} }
|
||||
metadataType[MetadataSlot] = func() entityMetadata { return &Slot{} }
|
||||
metadataType[MetadataBoolean] = func() entityMetadata { return &Boolean{} }
|
||||
metadataType[MetadataRotation] = func() entityMetadata { return &Rotation{} }
|
||||
metadataType[MetadataPosition] = func() entityMetadata { return &Position{} }
|
||||
metadataType[MetadataOptPosition] = func() entityMetadata { return &OptPosition{} }
|
||||
metadataType[MetadataDirection] = func() entityMetadata { return &Direction{} }
|
||||
metadataType[MetadataOptLivingEntity] = func() entityMetadata { return &OptLivingEntity{} }
|
||||
metadataType[MetadataBlockState] = func() entityMetadata { return &BlockState{} }
|
||||
metadataType[MetadataOptBlockState] = func() entityMetadata { return &OptBlockState{} }
|
||||
metadataType[MetadataNBT] = func() entityMetadata { return &NBT{} }
|
||||
metadataType[MetadataParticle] = func() entityMetadata { return &Particle{} }
|
||||
metadataType[MetadataParticles] = func() entityMetadata { return &Particles{} }
|
||||
metadataType[MetadataVillagerData] = func() entityMetadata { return &VillagerData{} }
|
||||
metadataType[MetadataOptVarInt] = func() entityMetadata { return &OptVarInt{} }
|
||||
metadataType[MetadataPose] = func() entityMetadata { return &Pose{} }
|
||||
metadataType[MetadataCatVariant] = func() entityMetadata { return &CatVariant{} }
|
||||
metadataType[MetadataCowVariant] = func() entityMetadata { return &CowVariant{} }
|
||||
metadataType[MetadataWolfVariant] = func() entityMetadata { return &WolfVariant{} }
|
||||
metadataType[MetadataWolfSoundVariant] = func() entityMetadata { return &WolfSoundVariant{} }
|
||||
metadataType[MetadataFrogVariant] = func() entityMetadata { return &FrogVariant{} }
|
||||
metadataType[MetadataPigVariant] = func() entityMetadata { return &PigVariant{} }
|
||||
metadataType[MetadataChickenVariant] = func() entityMetadata { return &ChickenVariant{} }
|
||||
metadataType[MetadataOptGlobalPosition] = func() entityMetadata { return &OptGlobalPosition{} }
|
||||
metadataType[MetadataPaintingVariant] = func() entityMetadata { return &PaintingVariant{} }
|
||||
metadataType[MetadataSnifferVariant] = func() entityMetadata { return &SnifferVariant{} }
|
||||
metadataType[MetadataArmadilloState] = func() entityMetadata { return &ArmadilloState{} }
|
||||
metadataType[MetadataVector3] = func() entityMetadata { return &Vector3{} }
|
||||
metadataType[MetadataQuaternion] = func() entityMetadata { return &Quaternion{} }
|
||||
metadataType[MetadataByte] = func() Metadata { return &Byte{} }
|
||||
metadataType[MetadataVarInt] = func() Metadata { return &VarInt{} }
|
||||
metadataType[MetadataVarLong] = func() Metadata { return &VarLong{} }
|
||||
metadataType[MetadataFloat] = func() Metadata { return &Float{} }
|
||||
metadataType[MetadataString] = func() Metadata { return &String{} }
|
||||
metadataType[MetadataChat] = func() Metadata { return &Chat{} }
|
||||
metadataType[MetadataOptChat] = func() Metadata { return &OptChat{} }
|
||||
metadataType[MetadataSlot] = func() Metadata { return &Slot{} }
|
||||
metadataType[MetadataBoolean] = func() Metadata { return &Boolean{} }
|
||||
metadataType[MetadataRotation] = func() Metadata { return &Rotation{} }
|
||||
metadataType[MetadataPosition] = func() Metadata { return &Position{} }
|
||||
metadataType[MetadataOptPosition] = func() Metadata { return &OptPosition{} }
|
||||
metadataType[MetadataDirection] = func() Metadata { return &Direction{} }
|
||||
metadataType[MetadataOptLivingEntity] = func() Metadata { return &OptLivingEntity{} }
|
||||
metadataType[MetadataBlockState] = func() Metadata { return &BlockState{} }
|
||||
metadataType[MetadataOptBlockState] = func() Metadata { return &OptBlockState{} }
|
||||
metadataType[MetadataNBT] = func() Metadata { return &NBT{} }
|
||||
metadataType[MetadataParticle] = func() Metadata { return &Particle{} }
|
||||
metadataType[MetadataParticles] = func() Metadata { return &Particles{} }
|
||||
metadataType[MetadataVillagerData] = func() Metadata { return &VillagerData{} }
|
||||
metadataType[MetadataOptVarInt] = func() Metadata { return &OptVarInt{} }
|
||||
metadataType[MetadataPose] = func() Metadata { return &Pose{} }
|
||||
metadataType[MetadataCatVariant] = func() Metadata { return &CatVariant{} }
|
||||
metadataType[MetadataCowVariant] = func() Metadata { return &CowVariant{} }
|
||||
metadataType[MetadataWolfVariant] = func() Metadata { return &WolfVariant{} }
|
||||
metadataType[MetadataWolfSoundVariant] = func() Metadata { return &WolfSoundVariant{} }
|
||||
metadataType[MetadataFrogVariant] = func() Metadata { return &FrogVariant{} }
|
||||
metadataType[MetadataPigVariant] = func() Metadata { return &PigVariant{} }
|
||||
metadataType[MetadataChickenVariant] = func() Metadata { return &ChickenVariant{} }
|
||||
metadataType[MetadataOptGlobalPosition] = func() Metadata { return &OptGlobalPosition{} }
|
||||
metadataType[MetadataPaintingVariant] = func() Metadata { return &PaintingVariant{} }
|
||||
metadataType[MetadataSnifferVariant] = func() Metadata { return &SnifferVariant{} }
|
||||
metadataType[MetadataArmadilloState] = func() Metadata { return &ArmadilloState{} }
|
||||
metadataType[MetadataVector3] = func() Metadata { return &Vector3{} }
|
||||
metadataType[MetadataQuaternion] = func() Metadata { return &Quaternion{} }
|
||||
}
|
||||
|
@ -343,54 +343,6 @@ func (c ConfigUpdateEnabledFeatures) WriteTo(w io.Writer) (n int64, err error) {
|
||||
return n, err
|
||||
}
|
||||
|
||||
// StringIdentifierVarIntArray a utility type for encoding/decoding packet.Identifier -> string[packet.VarInt] slice.
|
||||
type StringIdentifierVarIntArray []string
|
||||
|
||||
func (a StringIdentifierVarIntArray) WriteTo(w io.Writer) (n int64, err error) {
|
||||
size := len(a)
|
||||
nn, err := packet.VarInt(size).WriteTo(w)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
n += nn
|
||||
for i := 0; i < size; i++ {
|
||||
nn, err := packet.Identifier(a[i]).WriteTo(w)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
return n, nil
|
||||
}
|
||||
|
||||
func (a *StringIdentifierVarIntArray) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
var size packet.VarInt
|
||||
nn, err := size.ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
if size < 0 {
|
||||
return n, errors.New("array length less than zero")
|
||||
}
|
||||
|
||||
if cap(*a) >= int(size) {
|
||||
*a = (*a)[:int(size)]
|
||||
} else {
|
||||
*a = make(StringIdentifierVarIntArray, int(size))
|
||||
}
|
||||
|
||||
for i := 0; i < int(size); i++ {
|
||||
nn, err = (*packet.Identifier)(&(*a)[i]).ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
|
||||
return n, err
|
||||
}
|
||||
|
||||
// Int8VarIntArray a utility type for encoding/decoding packet.Byte -> int8[packet.VarInt] slice.
|
||||
type Int8VarIntArray []int8
|
||||
|
||||
@ -438,3 +390,51 @@ func (a *Int8VarIntArray) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
|
||||
return n, err
|
||||
}
|
||||
|
||||
// StringIdentifierVarIntArray a utility type for encoding/decoding packet.Identifier -> string[packet.VarInt] slice.
|
||||
type StringIdentifierVarIntArray []string
|
||||
|
||||
func (a StringIdentifierVarIntArray) WriteTo(w io.Writer) (n int64, err error) {
|
||||
size := len(a)
|
||||
nn, err := packet.VarInt(size).WriteTo(w)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
n += nn
|
||||
for i := 0; i < size; i++ {
|
||||
nn, err := packet.Identifier(a[i]).WriteTo(w)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
return n, nil
|
||||
}
|
||||
|
||||
func (a *StringIdentifierVarIntArray) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
var size packet.VarInt
|
||||
nn, err := size.ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
if size < 0 {
|
||||
return n, errors.New("array length less than zero")
|
||||
}
|
||||
|
||||
if cap(*a) >= int(size) {
|
||||
*a = (*a)[:int(size)]
|
||||
} else {
|
||||
*a = make(StringIdentifierVarIntArray, int(size))
|
||||
}
|
||||
|
||||
for i := 0; i < int(size); i++ {
|
||||
nn, err = (*packet.Identifier)(&(*a)[i]).ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
|
||||
return n, err
|
||||
}
|
||||
|
@ -1557,35 +1557,7 @@ func (c Explode) WriteTo(w io.Writer) (n int64, err error) {
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
func (c *ChunkPos) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
var temp int64
|
||||
temp, err = (*packet.Int)(&c.X).ReadFrom(r)
|
||||
n += temp
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
temp, err = (*packet.Int)(&c.Z).ReadFrom(r)
|
||||
n += temp
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
|
||||
func (c ChunkPos) WriteTo(w io.Writer) (n int64, err error) {
|
||||
var temp int64
|
||||
temp, err = (*packet.Int)(&c.X).WriteTo(w)
|
||||
n += temp
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
temp, err = (*packet.Int)(&c.Z).WriteTo(w)
|
||||
n += temp
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
func (c *ForgetLevelChunk) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
var temp int64
|
||||
temp, err = (&c.Pos).ReadFrom(r)
|
||||
@ -1810,45 +1782,6 @@ func (c KeepAlive) WriteTo(w io.Writer) (n int64, err error) {
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
func (c *LevelChunkWithLight) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
var temp int64
|
||||
temp, err = (*packet.Int)(&c.X).ReadFrom(r)
|
||||
n += temp
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
temp, err = (*packet.Int)(&c.Z).ReadFrom(r)
|
||||
n += temp
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
temp, err = (&c.Data).ReadFrom(r)
|
||||
n += temp
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
|
||||
func (c LevelChunkWithLight) WriteTo(w io.Writer) (n int64, err error) {
|
||||
var temp int64
|
||||
temp, err = (*packet.Int)(&c.X).WriteTo(w)
|
||||
n += temp
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
temp, err = (*packet.Int)(&c.Z).WriteTo(w)
|
||||
n += temp
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
temp, err = (&c.Data).WriteTo(w)
|
||||
n += temp
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
func (c *LevelEvent) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
var temp int64
|
||||
temp, err = (*packet.Int)(&c.Type).ReadFrom(r)
|
||||
@ -7157,102 +7090,6 @@ func (c Waypoint) WriteTo(w io.Writer) (n int64, err error) {
|
||||
return n, err
|
||||
}
|
||||
|
||||
// StringIdentifierVarIntArray a utility type for encoding/decoding packet.Identifier -> string[packet.VarInt] slice.
|
||||
type StringIdentifierVarIntArray []string
|
||||
|
||||
func (a StringIdentifierVarIntArray) WriteTo(w io.Writer) (n int64, err error) {
|
||||
size := len(a)
|
||||
nn, err := packet.VarInt(size).WriteTo(w)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
n += nn
|
||||
for i := 0; i < size; i++ {
|
||||
nn, err := packet.Identifier(a[i]).WriteTo(w)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
return n, nil
|
||||
}
|
||||
|
||||
func (a *StringIdentifierVarIntArray) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
var size packet.VarInt
|
||||
nn, err := size.ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
if size < 0 {
|
||||
return n, errors.New("array length less than zero")
|
||||
}
|
||||
|
||||
if cap(*a) >= int(size) {
|
||||
*a = (*a)[:int(size)]
|
||||
} else {
|
||||
*a = make(StringIdentifierVarIntArray, int(size))
|
||||
}
|
||||
|
||||
for i := 0; i < int(size); i++ {
|
||||
nn, err = (*packet.Identifier)(&(*a)[i]).ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
|
||||
return n, err
|
||||
}
|
||||
|
||||
// Int32VarIntVarIntArray a utility type for encoding/decoding packet.VarInt -> int32[packet.VarInt] slice.
|
||||
type Int32VarIntVarIntArray []int32
|
||||
|
||||
func (a Int32VarIntVarIntArray) WriteTo(w io.Writer) (n int64, err error) {
|
||||
size := len(a)
|
||||
nn, err := packet.VarInt(size).WriteTo(w)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
n += nn
|
||||
for i := 0; i < size; i++ {
|
||||
nn, err := packet.VarInt(a[i]).WriteTo(w)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
return n, nil
|
||||
}
|
||||
|
||||
func (a *Int32VarIntVarIntArray) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
var size packet.VarInt
|
||||
nn, err := size.ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
if size < 0 {
|
||||
return n, errors.New("array length less than zero")
|
||||
}
|
||||
|
||||
if cap(*a) >= int(size) {
|
||||
*a = (*a)[:int(size)]
|
||||
} else {
|
||||
*a = make(Int32VarIntVarIntArray, int(size))
|
||||
}
|
||||
|
||||
for i := 0; i < int(size); i++ {
|
||||
nn, err = (*packet.VarInt)(&(*a)[i]).ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
|
||||
return n, err
|
||||
}
|
||||
|
||||
// StringVarIntArray a utility type for encoding/decoding packet.String -> string[packet.VarInt] slice.
|
||||
type StringVarIntArray []string
|
||||
|
||||
@ -7349,6 +7186,54 @@ func (a *UuidUUIDUUIDVarIntArray) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
return n, err
|
||||
}
|
||||
|
||||
// Int32VarIntVarIntArray a utility type for encoding/decoding packet.VarInt -> int32[packet.VarInt] slice.
|
||||
type Int32VarIntVarIntArray []int32
|
||||
|
||||
func (a Int32VarIntVarIntArray) WriteTo(w io.Writer) (n int64, err error) {
|
||||
size := len(a)
|
||||
nn, err := packet.VarInt(size).WriteTo(w)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
n += nn
|
||||
for i := 0; i < size; i++ {
|
||||
nn, err := packet.VarInt(a[i]).WriteTo(w)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
return n, nil
|
||||
}
|
||||
|
||||
func (a *Int32VarIntVarIntArray) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
var size packet.VarInt
|
||||
nn, err := size.ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
if size < 0 {
|
||||
return n, errors.New("array length less than zero")
|
||||
}
|
||||
|
||||
if cap(*a) >= int(size) {
|
||||
*a = (*a)[:int(size)]
|
||||
} else {
|
||||
*a = make(Int32VarIntVarIntArray, int(size))
|
||||
}
|
||||
|
||||
for i := 0; i < int(size); i++ {
|
||||
nn, err = (*packet.VarInt)(&(*a)[i]).ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
|
||||
return n, err
|
||||
}
|
||||
|
||||
// Int64VarLongVarIntArray a utility type for encoding/decoding packet.VarLong -> int64[packet.VarInt] slice.
|
||||
type Int64VarLongVarIntArray []int64
|
||||
|
||||
@ -7397,102 +7282,6 @@ func (a *Int64VarLongVarIntArray) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
return n, err
|
||||
}
|
||||
|
||||
// Int8ByteVarIntArray a utility type for encoding/decoding packet.Byte -> int8[packet.VarInt] slice.
|
||||
type Int8ByteVarIntArray []int8
|
||||
|
||||
func (a Int8ByteVarIntArray) WriteTo(w io.Writer) (n int64, err error) {
|
||||
size := len(a)
|
||||
nn, err := packet.VarInt(size).WriteTo(w)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
n += nn
|
||||
for i := 0; i < size; i++ {
|
||||
nn, err := packet.Byte(a[i]).WriteTo(w)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
return n, nil
|
||||
}
|
||||
|
||||
func (a *Int8ByteVarIntArray) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
var size packet.VarInt
|
||||
nn, err := size.ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
if size < 0 {
|
||||
return n, errors.New("array length less than zero")
|
||||
}
|
||||
|
||||
if cap(*a) >= int(size) {
|
||||
*a = (*a)[:int(size)]
|
||||
} else {
|
||||
*a = make(Int8ByteVarIntArray, int(size))
|
||||
}
|
||||
|
||||
for i := 0; i < int(size); i++ {
|
||||
nn, err = (*packet.Byte)(&(*a)[i]).ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
|
||||
return n, err
|
||||
}
|
||||
|
||||
// StringStringVarIntArray a utility type for encoding/decoding packet.String -> string[packet.VarInt] slice.
|
||||
type StringStringVarIntArray []string
|
||||
|
||||
func (a StringStringVarIntArray) WriteTo(w io.Writer) (n int64, err error) {
|
||||
size := len(a)
|
||||
nn, err := packet.VarInt(size).WriteTo(w)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
n += nn
|
||||
for i := 0; i < size; i++ {
|
||||
nn, err := packet.String(a[i]).WriteTo(w)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
return n, nil
|
||||
}
|
||||
|
||||
func (a *StringStringVarIntArray) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
var size packet.VarInt
|
||||
nn, err := size.ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
if size < 0 {
|
||||
return n, errors.New("array length less than zero")
|
||||
}
|
||||
|
||||
if cap(*a) >= int(size) {
|
||||
*a = (*a)[:int(size)]
|
||||
} else {
|
||||
*a = make(StringStringVarIntArray, int(size))
|
||||
}
|
||||
|
||||
for i := 0; i < int(size); i++ {
|
||||
nn, err = (*packet.String)(&(*a)[i]).ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
|
||||
return n, err
|
||||
}
|
||||
|
||||
// Int8VarIntArray a utility type for encoding/decoding packet.Byte -> int8[packet.VarInt] slice.
|
||||
type Int8VarIntArray []int8
|
||||
|
||||
@ -7588,3 +7377,147 @@ func (a *Int64VarIntArray) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
|
||||
return n, err
|
||||
}
|
||||
|
||||
// StringIdentifierVarIntArray a utility type for encoding/decoding packet.Identifier -> string[packet.VarInt] slice.
|
||||
type StringIdentifierVarIntArray []string
|
||||
|
||||
func (a StringIdentifierVarIntArray) WriteTo(w io.Writer) (n int64, err error) {
|
||||
size := len(a)
|
||||
nn, err := packet.VarInt(size).WriteTo(w)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
n += nn
|
||||
for i := 0; i < size; i++ {
|
||||
nn, err := packet.Identifier(a[i]).WriteTo(w)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
return n, nil
|
||||
}
|
||||
|
||||
func (a *StringIdentifierVarIntArray) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
var size packet.VarInt
|
||||
nn, err := size.ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
if size < 0 {
|
||||
return n, errors.New("array length less than zero")
|
||||
}
|
||||
|
||||
if cap(*a) >= int(size) {
|
||||
*a = (*a)[:int(size)]
|
||||
} else {
|
||||
*a = make(StringIdentifierVarIntArray, int(size))
|
||||
}
|
||||
|
||||
for i := 0; i < int(size); i++ {
|
||||
nn, err = (*packet.Identifier)(&(*a)[i]).ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
|
||||
return n, err
|
||||
}
|
||||
|
||||
// Int8ByteVarIntArray a utility type for encoding/decoding packet.Byte -> int8[packet.VarInt] slice.
|
||||
type Int8ByteVarIntArray []int8
|
||||
|
||||
func (a Int8ByteVarIntArray) WriteTo(w io.Writer) (n int64, err error) {
|
||||
size := len(a)
|
||||
nn, err := packet.VarInt(size).WriteTo(w)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
n += nn
|
||||
for i := 0; i < size; i++ {
|
||||
nn, err := packet.Byte(a[i]).WriteTo(w)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
return n, nil
|
||||
}
|
||||
|
||||
func (a *Int8ByteVarIntArray) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
var size packet.VarInt
|
||||
nn, err := size.ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
if size < 0 {
|
||||
return n, errors.New("array length less than zero")
|
||||
}
|
||||
|
||||
if cap(*a) >= int(size) {
|
||||
*a = (*a)[:int(size)]
|
||||
} else {
|
||||
*a = make(Int8ByteVarIntArray, int(size))
|
||||
}
|
||||
|
||||
for i := 0; i < int(size); i++ {
|
||||
nn, err = (*packet.Byte)(&(*a)[i]).ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
|
||||
return n, err
|
||||
}
|
||||
|
||||
// StringStringVarIntArray a utility type for encoding/decoding packet.String -> string[packet.VarInt] slice.
|
||||
type StringStringVarIntArray []string
|
||||
|
||||
func (a StringStringVarIntArray) WriteTo(w io.Writer) (n int64, err error) {
|
||||
size := len(a)
|
||||
nn, err := packet.VarInt(size).WriteTo(w)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
n += nn
|
||||
for i := 0; i < size; i++ {
|
||||
nn, err := packet.String(a[i]).WriteTo(w)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
return n, nil
|
||||
}
|
||||
|
||||
func (a *StringStringVarIntArray) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
var size packet.VarInt
|
||||
nn, err := size.ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
if size < 0 {
|
||||
return n, errors.New("array length less than zero")
|
||||
}
|
||||
|
||||
if cap(*a) >= int(size) {
|
||||
*a = (*a)[:int(size)]
|
||||
} else {
|
||||
*a = make(StringStringVarIntArray, int(size))
|
||||
}
|
||||
|
||||
for i := 0; i < int(size); i++ {
|
||||
nn, err = (*packet.String)(&(*a)[i]).ReadFrom(r)
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
|
||||
return n, err
|
||||
}
|
||||
|
@ -2,18 +2,14 @@ package client
|
||||
|
||||
import (
|
||||
"github.com/Tnze/go-mc/data/packetid"
|
||||
"github.com/Tnze/go-mc/level"
|
||||
)
|
||||
|
||||
var _ ClientboundPacket = (*ForgetLevelChunk)(nil)
|
||||
|
||||
//codec:gen
|
||||
type ChunkPos struct {
|
||||
X, Z int32
|
||||
}
|
||||
|
||||
//codec:gen
|
||||
type ForgetLevelChunk struct {
|
||||
Pos ChunkPos
|
||||
Pos level.ChunkPos
|
||||
}
|
||||
|
||||
func (ForgetLevelChunk) ClientboundPacketID() packetid.ClientboundPacketID {
|
||||
|
@ -1,12 +1,45 @@
|
||||
package client
|
||||
|
||||
import "github.com/Tnze/go-mc/level"
|
||||
import (
|
||||
"io"
|
||||
|
||||
"github.com/Tnze/go-mc/level"
|
||||
)
|
||||
|
||||
var _ ClientboundPacket = (*LevelChunkWithLight)(nil)
|
||||
|
||||
//codec:gen
|
||||
type LevelChunkWithLight struct {
|
||||
X int32
|
||||
Z int32
|
||||
Data level.Chunk
|
||||
Pos level.ChunkPos
|
||||
Data *level.Chunk
|
||||
}
|
||||
|
||||
func (c *LevelChunkWithLight) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
temp, err := c.Pos.ReadFrom(r)
|
||||
if err != nil {
|
||||
return temp, err
|
||||
}
|
||||
c.Data = level.EmptyChunk(36)
|
||||
|
||||
temp, err = (c.Data).ReadFrom(r)
|
||||
n += temp
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
|
||||
func (c LevelChunkWithLight) WriteTo(w io.Writer) (n int64, err error) {
|
||||
var temp int64
|
||||
temp, err = c.Pos.WriteTo(w)
|
||||
n += temp
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
|
||||
temp, err = (*level.Chunk)(c.Data).WriteTo(w)
|
||||
n += temp
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
|
51
pkg/protocol/position.go
Normal file
51
pkg/protocol/position.go
Normal file
@ -0,0 +1,51 @@
|
||||
package protocol
|
||||
|
||||
import "math"
|
||||
|
||||
type Position [3]int32
|
||||
|
||||
func (p Position) DistanceTo(other Position) float64 {
|
||||
dx := float64(p[0] - other[0])
|
||||
dy := float64(p[1] - other[1])
|
||||
dz := float64(p[2] - other[2])
|
||||
return math.Sqrt(dx*dx + dy*dy + dz*dz)
|
||||
}
|
||||
|
||||
func (p Position) DistanceToSquared(other Position) float64 {
|
||||
dx := float64(p[0] - other[0])
|
||||
dy := float64(p[1] - other[1])
|
||||
dz := float64(p[2] - other[2])
|
||||
return dx*dx + dy*dy + dz*dz
|
||||
}
|
||||
|
||||
func (p Position) Add(other Position) Position {
|
||||
return Position{p[0] + other[0], p[1] + other[1], p[2] + other[2]}
|
||||
}
|
||||
|
||||
func (p Position) Sub(other Position) Position {
|
||||
return Position{p[0] - other[0], p[1] - other[1], p[2] - other[2]}
|
||||
}
|
||||
|
||||
func (p Position) Mul(scalar float64) Position {
|
||||
return Position{int32(float64(p[0]) * scalar), int32(float64(p[1]) * scalar), int32(float64(p[2]) * scalar)}
|
||||
}
|
||||
|
||||
func (p Position) Div(scalar float64) Position {
|
||||
return Position{int32(float64(p[0]) / scalar), int32(float64(p[1]) / scalar), int32(float64(p[2]) / scalar)}
|
||||
}
|
||||
|
||||
func (p Position) IsZero() bool {
|
||||
return p[0] == 0 && p[1] == 0 && p[2] == 0
|
||||
}
|
||||
|
||||
func (p Position) Clone() Position {
|
||||
return Position{p[0], p[1], p[2]}
|
||||
}
|
||||
|
||||
func (p Position) String() string {
|
||||
return "(" + string(p[0]) + ", " + string(p[1]) + ", " + string(p[2]) + ")"
|
||||
}
|
||||
|
||||
func (p Position) Equals(other Position) bool {
|
||||
return p[0] == other[0] && p[1] == other[1] && p[2] == other[2]
|
||||
}
|
@ -3,12 +3,13 @@ package slot
|
||||
import (
|
||||
"io"
|
||||
|
||||
"github.com/Tnze/go-mc/level/item"
|
||||
pk "github.com/Tnze/go-mc/net/packet"
|
||||
)
|
||||
|
||||
type Slot struct {
|
||||
Count int32
|
||||
ItemID int32
|
||||
ItemID item.ID
|
||||
AddComponent []Component
|
||||
RemoveComponent []ComponentID
|
||||
}
|
||||
@ -64,12 +65,16 @@ func (s *Slot) ReadFrom(r io.Reader) (n int64, err error) {
|
||||
return temp, err
|
||||
}
|
||||
n += temp
|
||||
temp, err = (*pk.VarInt)(&s.ItemID).ReadFrom(r)
|
||||
|
||||
var itemID int32
|
||||
temp, err = (*pk.VarInt)(&itemID).ReadFrom(r)
|
||||
n += temp
|
||||
if err != nil {
|
||||
return temp, err
|
||||
}
|
||||
|
||||
s.ItemID = item.ID(itemID)
|
||||
|
||||
addLens := int32(0)
|
||||
temp, err = (*pk.VarInt)(&addLens).ReadFrom(r)
|
||||
n += temp
|
||||
|
Reference in New Issue
Block a user