我的世界服务器连接协议,go-mc: Minecraft(我的世界)各种协议的Go实现

Go-MC

Minecraft-1.15.2-blue.svg

Protocol-578-blue.svg

go-mc?status.svg

go-mc

go-mc.svg?branch=master

There's some library in Go support you to create your Minecraft client or server.

这是一些Golang库,用于帮助你编写自己的Minecraft客户端或服务器,

Chat

NBT

Yggdrasil

Realms Server

RCON protocol

Saves decoding /encoding

Minecraft network protocol

Simple MC robot lib

bot:

Swing arm

Get inventory

Pick item

Drop item

Swap item in hands

Use item

Use entity

Attack entity

Use/Place block

Mine block

Custom packets

Record entities

由于仍在开发中,部分API在未来版本中可能会变动

Some examples are at /cmd folder.

有一些例子在cmd目录下

1.13.2 version is at gomcbot.

Getting start

After you install golang:

To get latest version: go get github.com/Tnze/go-mc@master

To get old versions (eg. 1.14.3): go get github.com/Tnze/go-mc@v1.14.3

First of all, you might have a try of the simple examples. It's a good start.

Run Examples

Run go run github.com/Tnze/go-mc/cmd/mcping localhost to ping and list the localhost mc server.

Run go run github.com/Tnze/go-mc/cmd/daze to join local server at localhost:25565 as Steve on offline mode.

Basic Useage

One of the most useful functions of this lib is that it implements the network communication protocol of minecraft. It allows you to construct, send, receive, and parse network packets. All of them are encapsulated in go-mc/net and go-mc/net/packet.

这个库最核心的便是实现了Minecraft底层的网络通信协议,可以用与构造、发送、接收和解读MC数据包。这是靠 go-mc/net 和 go-mc/net/packet这两个包实现的。

import "github.com/Tnze/go-mc/net"

import pk "github.com/Tnze/go-mc/net/packet"

It's very easy to create a packet. For example, after any client connected the server, it sends a Handshake Packet. You can create this package with the following code:

构造一个数据包很简单,例如客户端连接时会发送一个握手包,你就可以用下面这段代码来生成这个包:

p := pk.Marshal(

0x00, // Handshake packet ID

pk.VarInt(ProtocolVersion), // Protocol version

pk.String("localhost"), // Server's address

pk.UnsignedShort(25565), // Server's port

pk.Byte(1), // 1 for status ping, 2 for login

)

Then you can send it to server using conn.WritePacket(p). The conn is a net.Conn which is returned by net.Dial(). And don't forget to handle the error.^_^

然后就可以调用conn.WritePacket(p)来发送这个p了,其中conn是连接对象。发数据包的时候记得不要忘记处理错误噢!

Receiving packet is quite easy too. To read a packet, call p.Scan() like this:

接收包也非常简单,只要调用conn.ReadPacket()即可。而要读取包内数据则需要使用p.Scan()函数,就像这样:

var (

x, y, z pk.Double

yaw, pitch pk.Float

flags pk.Byte

TeleportID pk.VarInt

)

err := p.Scan(&x, &y, &z, &yaw, &pitch, &flags, &TeleportID)

if err != nil {

return err

}

As the go-mc/net package implements the minecraft network protocol, there is no update between the versions at this level. So net package actually supports any version. It's just that the ID and content of the package are different between different versions.

由于go-mc/net实现的是MC底层的网络协议,而这个协议在MC更新时其实并不会有改动,MC更新时其实只是包的ID和内容的定义发生了变化,所以net包本身是跨版本的。

Originally it's all right to write a bot with only go-mc/net package. But considering that the process of handshake, login and encryption is not difficult but complicated, I have implemented it in go-mc/bot package, which is not cross-versions. You may use it directly or as a reference for your own implementation.

理论上讲,只用go-mc/net包实现一个bot是完全可行的,但是为了节省大家从头去理解MC握手、登录、加密等协议的过程,在go-mc/bot中我已经把这些都实现了,只不过它不是跨版本的。你可以直接使用,或者作为自己实现的参考。

Now, go and have a look at the example!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值