Files
ngzz-mc/cmd/client/multiplayer_gl.go

53 lines
1.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//go:build gl
// 客户端联机netclient 接入(多人同步.md §2 权威链路客户端侧)。
package main
import (
"mc/internal/block"
"mc/internal/netclient"
"mc/internal/netproto"
"mc/internal/save"
)
// mpHandler 联机回调:区块安装与方块变更应用(多人同步.md §4§5
type mpHandler struct {
app *clientApp
}
// OnLogin 登录结果。
func (h *mpHandler) OnLogin(code uint8) {
if code != 0 {
h.app.logf("服务器拒绝登录(码 %d", code)
h.app.net.Close()
h.app.net = nil
h.app.screen = 0
}
}
// OnChunk 收到区块:反序列化并安装到世界(多人同步.md §4
func (h *mpHandler) OnChunk(data []byte) {
c, err := save.DecodeChunk(data)
if err != nil {
h.app.logf("区块解码失败: %v", err)
return
}
h.app.sess.World.InstallChunk(c)
}
// OnBlockChange 方块变更(服务器权威广播,多人同步.md §5
func (h *mpHandler) OnBlockChange(m netproto.BlockChange) {
h.app.sess.World.SetBlock(m.X, m.Y, m.Z, block.NewState(m.BlockID, m.Meta))
}
// dialServer 连接服务器(多人游戏按钮,多人同步.md §2
func dialServer(a *clientApp, addr string, name string) error {
h := &mpHandler{app: a}
nc, err := netclient.Dial(addr, netproto.Handshake{ProtocolVersion: 1, ClientID: name}, h)
if err != nil {
return err
}
a.net = nc
return nil
}