go-mc

Go libraries of everything in Minecraft
授权协议 MIT License
开发语言 Python
所属分类 应用工具、 IM/聊天/语音工具
软件类型 开源软件
地区 不详
投 递 者 夏青青
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

Go-MC

Require Go version: 1.16

There's some library in Go support you to create your Minecraft client or server.
这是一些Golang库,用于帮助你编写自己的Minecraft客户端或服务器。

  • Chat Message (Support Json or old §)
  • NBT (Based on reflection)
  • SNBT -> NBT
  • Yggdrasil
  • Realms Server
  • RCON protocol (Server & Client)
  • Saves decoding & encoding
  • Minecraft network protocol
  • Robot framework

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

1.13.2 version is at gomcbot.

Getting start

After you install golang:
To get the latest version: go get github.com/Tnze/go-mc@master
To get old versions (e.g. 1.14.3): go get github.com/Tnze/go-mc@v1.14.3

First, 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 the local server at localhost:25565 as Steve on the offline mode.

Basic Usage

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

这个库最核心的便是实现了Minecraft底层的网络通信协议,可以用与构造、发送、接收和解读MC数据包。这是靠 go-mc/netgo-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 sendsa 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)即可。而要读取包内数据则需要使用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
}

Advanced usage

Sometimes you are handling packet like this:

Field Name Field Type Notes
World Count VarInt Size of the following array.
World Names Array of Identifier Identifiers for all worlds on the server.

That is, the first field is an integer type and the second field is an array (a []string in this case). The integerrepresents the length of array.

Traditionally, you can use the following method to read such a field:

r := bytes.Reader(p.Data)
// Read WorldCount
var WorldCount pk.VarInt
if err := WorldCount.ReadFrom(r); err != nil {
    return err
}
// Read WorldNames
WorldNames := make([]pk.Identifier, WorldCount)
for i := 0; i < int(WorldCount); i++ {
    if err := WorldNames[i].ReadFrom(r); err != nil {
        return err
    }
}

But this is tediously long an not compatible with p.Scan() method.

In the latest version, two new types is added: pk.Ary and pk.Opt. Dedicated to handling "Array of ...." and "Optional ...." fields.

var WorldCount pk.VarInt
var WorldNames = []pk.Identifier{}
if err := p.Scan(&WorldCount, pk.Ary{&WorldCount, &WorldNames}); err != nil {
    return err
}

As the go-mc/net package implements the minecraft network protocol, there is no update between the versions at thislevel. So net package actually supports any version. It's just that the ID and content of the package are differentbetween 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 notcross-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 examples!

  • 背景介绍 由于历史原因,我们部门的 MySQL 中间件既有 MySTART TRA 和 BEGIN 显式地开启事务。 单库事务完全支持, 执行阶段:把前端连接上当前事务所使用到的后端连接绑定下来,并执行SQL语句 提交阶段:将commit命令分发到这些绑定的后端连接中。 在整个事务过程中,执行阶段出错,可以回滚。提交阶段出错不可以回滚。可以说只要是commit之前,执行出现不一致,cobar会自动

  • 说明 目前 golang crypto/x509 这个库针对 ECC 的密钥只支持 P224 / P256 / P384 / P521 这四条曲线, 区块链开发通常使用 secp256k1 曲线,也不只是 golang 不支持这条曲线,貌似目前能够直接支持使用 这条曲线生成密钥和数字证书的就只有 libssl.so 这个库,当我们想要为 secp256k1 密钥签发证书时可以选择在 go 中引用

  • 如何打通工业自动化即工控设备(PLC)与PC系列的通道,主要还是靠通信协议。通过研究通信协议,真正的做到IT+AT。 MELSEC协议是三菱的通信协议,简称MC。使用此协议可以直接对寄存器进行读写,简单直接。还可以远程Run/Stop/Pause/锁存清除/复位。 这里是关于三菱MC协议的相关学习  http://i.scwy.net/ai/2020/010522-mit/ 实际还是并不复杂,现在

 相关资料
  • Go!

    Go! 是一个 PHP 5.4 库,让 PHP 支持 AOP 面向方面编程方法,无需 PECL 扩展、Runkit、evals 或者 DI 容器支持。可使用 XDebug 轻松调试。 示例代码: // Aspect/MonitorAspect.phpnamespace Aspect;use Go\Aop\Aspect;use Go\Aop\Intercept\FieldAccess;use Go\

  • 命令go vet是一个用于检查Go语言源码中静态错误的简单工具。与大多数Go命令一样,go vet命令可以接受-n标记和-x标记。-n标记用于只打印流程中执行的命令而不真正执行它们。-n标记也用于打印流程中执行的命令,但不会取消这些命令的执行。示例如下: hc@ubt:~$ go vet -n pkgtool /usr/local/go/pkg/tool/linux_386/vet golang/

  • 命令go fix会把指定代码包的所有Go语言源码文件中的旧版本代码修正为新版本的代码。这里所说的版本即Go语言的版本。代码包的所有Go语言源码文件不包括其子代码包(如果有的话)中的文件。修正操作包括把对旧程序调用的代码更换为对新程序调用的代码、把旧的语法更换为新的语法,等等。 这个工具其实非常有用。在编程语言的升级和演进的过程中,难免会对过时的和不够优秀的语法及标准库进行改进。这样的改进对于编程语

  • Pact Go的版本目前支持Pact v2规范,访问网站开始学习。 Go-Kit例子 Pact Go代码库中有一个详细的Go Kit 例子,介绍如何使用Pact去测试Go Kit微服务。 原生Go实现 还有一个Go版本的Pact(兼容pact v1.1),不需要运行一个守护进程。如果你不需要v2+的匹配以及运行守护进程,可以考虑使用或者为Pact Go贡献。

  • Panic表示的意思就是有些意想不到的错误发生了。通常我们用来表示程序正常运行过程中不应该出现的,或者我们没有处理好的错误。 package main import "os" func main() { // 我们使用panic来检查预期不到的错误 panic("a problem") // Panic的通常使用方法就是如果一个函数 // 返回一个我们不知道怎么处理

  • 使用os.Exit可以给定一个状态,然后立刻退出程序运行。 package main import "fmt" import "os" func main() { // 当使用`os.Exit`的时候defer操作不会被运行, // 所以这里的``fmt.Println`将不会被调用 defer fmt.Println("!") // 退出程序并设置退出状态值

  • Defer 用来保证一个函数调用会在程序执行的最后被调用。通常用于资源清理工作。 package main import "fmt" import "os" // 假设我们想创建一个文件,然后写入数据,最后关闭文件 func main() { // 在使用createFile得到一个文件对象之后,我们使用defer // 来调用关闭文件的方法closeFile,这个方法将在main

  • 11.1. go test go test命令是一个按照一定的约定和组织来测试代码的程序。在包目录内,所有以_test.go为后缀名的源文件在执行go build时不会被构建成包的一部分,它们是go test测试的一部分。 在*_test.go文件中,有三种类型的函数:测试函数、基准测试(benchmark)函数、示例函数。一个测试函数是以Test为函数名前缀的函数,用于测试程序的一些逻辑行为是否