update to 1.18.2 & fix bug in snbt encoding
This commit is contained in:
@ -1,6 +1,6 @@
|
||||
# Go-MC
|
||||
|
||||

|
||||

|
||||
[](https://pkg.go.dev/github.com/Tnze/go-mc)
|
||||
[](https://goreportcard.com/report/github.com/Tnze/go-mc)
|
||||
[](https://travis-ci.org/Tnze/go-mc)
|
||||
|
@ -10,11 +10,8 @@ import (
|
||||
|
||||
// WorldInfo content player info in server.
|
||||
type WorldInfo struct {
|
||||
DimensionCodec struct {
|
||||
DimensionType interface{} `nbt:"minecraft:dimension_type"`
|
||||
WorldgenBiome interface{} `nbt:"minecraft:worldgen/biome"`
|
||||
}
|
||||
Dimension interface{}
|
||||
DimensionCodec nbt.StringifiedMessage
|
||||
Dimension nbt.StringifiedMessage
|
||||
WorldNames []string // Identifiers for all worlds on the server.
|
||||
WorldName string // Name of the world being spawned into.
|
||||
HashedSeed int64 // First 8 bytes of the SHA-256 hash of the world's seed. Used client side for biome noise
|
||||
@ -49,8 +46,8 @@ func (p *Player) handleLoginPacket(packet pk.Packet) error {
|
||||
(*pk.Byte)(&p.PrevGamemode),
|
||||
&WorldCount,
|
||||
pk.Ary{Len: &WorldCount, Ary: &WorldNames},
|
||||
pk.NBT(new(nbt.RawMessage)),
|
||||
pk.NBT(new(nbt.RawMessage)),
|
||||
pk.NBT(&p.WorldInfo.DimensionCodec),
|
||||
pk.NBT(&p.WorldInfo.Dimension),
|
||||
(*pk.Identifier)(&p.WorldName),
|
||||
(*pk.Long)(&p.HashedSeed),
|
||||
(*pk.VarInt)(&p.MaxPlayers),
|
||||
|
20
bot/mcbot.go
20
bot/mcbot.go
@ -6,6 +6,7 @@ package bot
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"net"
|
||||
"strconv"
|
||||
|
||||
@ -16,7 +17,7 @@ import (
|
||||
)
|
||||
|
||||
// ProtocolVersion is the protocol version number of minecraft net protocol
|
||||
const ProtocolVersion = 757
|
||||
const ProtocolVersion = 758
|
||||
const DefaultPort = mcnet.DefaultPort
|
||||
|
||||
// JoinServer connect a Minecraft server for playing the game.
|
||||
@ -27,21 +28,32 @@ func (c *Client) JoinServer(addr string) (err error) {
|
||||
|
||||
// JoinServerWithDialer is similar to JoinServer but using a Dialer.
|
||||
func (c *Client) JoinServerWithDialer(d *net.Dialer, addr string) (err error) {
|
||||
return c.join(context.Background(), &mcnet.Dialer{Dialer: d}, addr)
|
||||
var dialer *mcnet.Dialer
|
||||
if d != nil {
|
||||
dialer = &mcnet.Dialer{Dialer: *d}
|
||||
}
|
||||
return c.join(context.Background(), dialer, addr)
|
||||
}
|
||||
|
||||
func (c *Client) join(ctx context.Context, d *mcnet.Dialer, addr string) error {
|
||||
const Handshake = 0x00
|
||||
|
||||
// Split Host and Port
|
||||
host, portStr, err := net.SplitHostPort(addr)
|
||||
var port uint64
|
||||
if err != nil {
|
||||
var addrErr *net.AddrError
|
||||
const missingPort = "missing port in address"
|
||||
if errors.As(err, &addrErr) && addrErr.Err == missingPort {
|
||||
port = 25565
|
||||
} else {
|
||||
return LoginErr{"split address", err}
|
||||
}
|
||||
port, err := strconv.ParseUint(portStr, 0, 16)
|
||||
} else {
|
||||
port, err = strconv.ParseUint(portStr, 0, 16)
|
||||
if err != nil {
|
||||
return LoginErr{"parse port", err}
|
||||
}
|
||||
}
|
||||
|
||||
// Dial connection
|
||||
c.Conn, err = d.DialMCContext(ctx, addr)
|
||||
|
@ -39,7 +39,7 @@ func main() {
|
||||
|
||||
func readBlockStates(states *[]State) {
|
||||
// open block_states data file
|
||||
f, err := os.Open("testdata/blocks.nbt")
|
||||
f, err := os.Open("blocks.nbt")
|
||||
if err != nil {
|
||||
log.Panic(err)
|
||||
}
|
||||
|
@ -94,7 +94,7 @@ func (m *StringifiedMessage) encode(d *Decoder, sb *strings.Builder, tagType byt
|
||||
return err
|
||||
case TagInt:
|
||||
i, err := d.readInt32()
|
||||
sb.WriteString(strconv.FormatInt(int64(i), 10) + "I")
|
||||
sb.WriteString(strconv.FormatInt(int64(i), 10))
|
||||
return err
|
||||
case TagFloat:
|
||||
i, err := d.readInt32()
|
||||
|
3
nbt/snbt_encode_test.go
Normal file
3
nbt/snbt_encode_test.go
Normal file
@ -0,0 +1,3 @@
|
||||
package nbt
|
||||
|
||||
//TODO: Test SNBT encode
|
@ -63,11 +63,11 @@ func DialMCTimeout(addr string, timeout time.Duration) (*Conn, error) {
|
||||
}
|
||||
|
||||
type Dialer struct {
|
||||
*net.Dialer
|
||||
net.Dialer
|
||||
}
|
||||
|
||||
func (d *Dialer) resolver() *net.Resolver {
|
||||
if d.Resolver != nil {
|
||||
if d != nil && d.Resolver != nil {
|
||||
return d.Resolver
|
||||
}
|
||||
return net.DefaultResolver
|
||||
|
@ -1,17 +1,17 @@
|
||||
{
|
||||
piglin_safe: 0b,
|
||||
natural: 1b,
|
||||
ambient_light: 0.0f,
|
||||
infiniburn: "minecraft:infiniburn_overworld",
|
||||
respawn_anchor_works: 0b,
|
||||
has_skylight: 1b,
|
||||
bed_works: 1b,
|
||||
piglin_safe:0B,
|
||||
natural:1B,
|
||||
ambient_light:0.0000000000F,
|
||||
infiniburn:"#minecraft:infiniburn_overworld",
|
||||
respawn_anchor_works:0B,
|
||||
has_skylight:1B,
|
||||
bed_works:1B,
|
||||
effects:"minecraft:overworld",
|
||||
has_raids: 1b,
|
||||
min_y: 0,
|
||||
height: 256,
|
||||
logical_height: 256,
|
||||
coordinate_scale: 1.0d,
|
||||
ultrawarm: 0b,
|
||||
has_ceiling: 0b
|
||||
has_raids:1B,
|
||||
logical_height:384,
|
||||
coordinate_scale:1.0000000000D,
|
||||
min_y:-64,
|
||||
has_ceiling:0B,
|
||||
ultrawarm:0B,
|
||||
height:384
|
||||
}
|
File diff suppressed because one or more lines are too long
@ -35,7 +35,7 @@ func NewGlobalChat() *GlobalChat {
|
||||
func (g *GlobalChat) Init(game *Game) {
|
||||
game.AddHandler(&PacketHandler{
|
||||
ID: packetid.ServerboundChat,
|
||||
F: func(player *Player, packet Packet757) error {
|
||||
F: func(player *Player, packet Packet758) error {
|
||||
var msg pk.String
|
||||
if err := pk.Packet(packet).Scan(&msg); err != nil {
|
||||
return err
|
||||
@ -59,14 +59,14 @@ func (g *GlobalChat) Run(ctx context.Context) {
|
||||
case <-ctx.Done():
|
||||
return
|
||||
case item := <-g.msg:
|
||||
g.broadcast(Packet757(pk.Marshal(
|
||||
g.broadcast(Packet758(pk.Marshal(
|
||||
packetid.ClientboundChat,
|
||||
item.toMessage(),
|
||||
pk.Byte(chatPosChat),
|
||||
pk.UUID(item.p.UUID),
|
||||
)))
|
||||
case p := <-g.join:
|
||||
g.broadcast(Packet757(pk.Marshal(
|
||||
g.broadcast(Packet758(pk.Marshal(
|
||||
packetid.ClientboundChat,
|
||||
chat.TranslateMsg("multiplayer.player.joined", chat.Text(p.Name)).SetColor(chat.Yellow),
|
||||
pk.Byte(chatPosSystem),
|
||||
@ -74,7 +74,7 @@ func (g *GlobalChat) Run(ctx context.Context) {
|
||||
)))
|
||||
g.players[p.UUID] = p
|
||||
case p := <-g.quit:
|
||||
g.broadcast(Packet757(pk.Marshal(
|
||||
g.broadcast(Packet758(pk.Marshal(
|
||||
packetid.ClientboundChat,
|
||||
chat.TranslateMsg("multiplayer.player.left", chat.Text(p.Name)).SetColor(chat.Yellow),
|
||||
pk.Byte(chatPosSystem),
|
||||
@ -85,7 +85,7 @@ func (g *GlobalChat) Run(ctx context.Context) {
|
||||
}
|
||||
}
|
||||
|
||||
func (g *GlobalChat) broadcast(packet Packet757) {
|
||||
func (g *GlobalChat) broadcast(packet Packet758) {
|
||||
for _, p := range g.players {
|
||||
p.WritePacket(packet)
|
||||
}
|
||||
|
@ -13,7 +13,7 @@ import (
|
||||
func (g *Graph) Init(game *server.Game) {
|
||||
game.AddHandler(&server.PacketHandler{
|
||||
ID: packetid.ServerboundChat,
|
||||
F: func(player *server.Player, packet server.Packet757) error {
|
||||
F: func(player *server.Player, packet server.Packet758) error {
|
||||
var msg pk.String
|
||||
if err := pk.Packet(packet).Scan(&msg); err != nil {
|
||||
return err
|
||||
@ -35,7 +35,7 @@ func (g *Graph) Run(ctx context.Context) {}
|
||||
|
||||
// AddPlayer implement server.Component for Graph
|
||||
func (g *Graph) AddPlayer(p *server.Player) {
|
||||
p.WritePacket(server.Packet757(pk.Marshal(
|
||||
p.WritePacket(server.Packet758(pk.Marshal(
|
||||
packetid.ClientboundCommands, g,
|
||||
)))
|
||||
}
|
||||
|
@ -50,10 +50,10 @@ func (s *SimpleDim) PlayerJoin(p *Player) {
|
||||
)
|
||||
column.Unlock()
|
||||
|
||||
p.WritePacket(Packet757(packet))
|
||||
p.WritePacket(Packet758(packet))
|
||||
}
|
||||
|
||||
p.WritePacket(Packet757(pk.Marshal(
|
||||
p.WritePacket(Packet758(pk.Marshal(
|
||||
packetid.ClientboundPlayerPosition,
|
||||
pk.Double(0), pk.Double(143), pk.Double(0),
|
||||
pk.Float(0), pk.Float(0),
|
||||
|
@ -42,7 +42,7 @@ type PacketHandler struct {
|
||||
F packetHandlerFunc
|
||||
}
|
||||
|
||||
type packetHandlerFunc func(player *Player, packet Packet757) error
|
||||
type packetHandlerFunc func(player *Player, packet Packet758) error
|
||||
|
||||
//go:embed DimensionCodec.snbt
|
||||
var dimensionCodecSNBT string
|
||||
@ -95,7 +95,9 @@ func (g *Game) AcceptPlayer(name string, id uuid.UUID, protocol int32, conn *net
|
||||
pk.Boolean(false), // Is hardcore
|
||||
pk.Byte(p.Gamemode), // Gamemode
|
||||
pk.Byte(-1), // Prev Gamemode
|
||||
pk.Array([]pk.Identifier{pk.Identifier(dimInfo.Name)}),
|
||||
pk.Array([]pk.Identifier{
|
||||
pk.Identifier(dimInfo.Name),
|
||||
}),
|
||||
pk.NBT(nbt.StringifiedMessage(dimensionCodecSNBT)),
|
||||
pk.NBT(nbt.StringifiedMessage(dimensionSNBT)),
|
||||
pk.Identifier(dimInfo.Name), // World Name
|
||||
@ -145,7 +147,7 @@ func (g *Game) AcceptPlayer(name string, id uuid.UUID, protocol int32, conn *net
|
||||
return
|
||||
}
|
||||
for _, ph := range g.handlers[packet.ID] {
|
||||
if err := ph.F(p, Packet757(packet)); err != nil {
|
||||
if err := ph.F(p, Packet758(packet)); err != nil {
|
||||
return
|
||||
}
|
||||
if err := p.GetErr(); err != nil {
|
||||
|
@ -60,7 +60,7 @@ func (k *KeepAlive) AddPlayerDelayUpdateHandler(f func(p *Player, delay time.Dur
|
||||
func (k *KeepAlive) Init(g *Game) {
|
||||
g.AddHandler(&PacketHandler{
|
||||
ID: packetid.ServerboundKeepAlive,
|
||||
F: func(player *Player, packet Packet757) error {
|
||||
F: func(player *Player, packet Packet758) error {
|
||||
var KeepAliveID pk.Long
|
||||
if err := pk.Packet(packet).Scan(&KeepAliveID); err != nil {
|
||||
return err
|
||||
@ -121,7 +121,7 @@ func (k *KeepAlive) pingPlayer(now time.Time) {
|
||||
if elem := k.pingList.Front(); elem != nil {
|
||||
p := k.pingList.Remove(elem).(keepAliveItem).player
|
||||
// Send Clientbound KeepAlive packet.
|
||||
p.WritePacket(Packet757(pk.Marshal(
|
||||
p.WritePacket(Packet758(pk.Marshal(
|
||||
packetid.ClientboundKeepAlive,
|
||||
pk.Long(k.keepAliveID),
|
||||
)))
|
||||
|
@ -22,12 +22,13 @@ type Player struct {
|
||||
errChan chan error
|
||||
}
|
||||
|
||||
// Packet757 is a packet in protocol 757.
|
||||
// Packet758 is a packet in protocol 757.
|
||||
// We are using type system to force programmers to update packets.
|
||||
type Packet758 pk.Packet
|
||||
type Packet757 pk.Packet
|
||||
|
||||
// WritePacket to player client. The type of parameter will update per version.
|
||||
func (p *Player) WritePacket(packet Packet757) {
|
||||
func (p *Player) WritePacket(packet Packet758) {
|
||||
p.packetQueue.Push(pk.Packet(packet))
|
||||
}
|
||||
|
||||
|
@ -42,7 +42,7 @@ func (p *PlayerList) AddPlayer(player *Player) {
|
||||
defer p.playersLock.Unlock()
|
||||
|
||||
if len(p.players) >= p.maxPlayer {
|
||||
player.WritePacket(Packet757(pk.Marshal(
|
||||
player.WritePacket(Packet758(pk.Marshal(
|
||||
packetid.ClientboundDisconnect,
|
||||
chat.TranslateMsg("multiplayer.disconnect.server_full"),
|
||||
)))
|
||||
|
@ -30,8 +30,8 @@ import (
|
||||
"github.com/Tnze/go-mc/net"
|
||||
)
|
||||
|
||||
const ProtocolName = "1.18.1"
|
||||
const ProtocolVersion = 757
|
||||
const ProtocolName = "1.18.2"
|
||||
const ProtocolVersion = 758
|
||||
|
||||
type Server struct {
|
||||
ListPingHandler
|
||||
|
Reference in New Issue
Block a user