赞
踩
Mac OS: 11.2.3
JDK: Java 1.8
Python: 3.9.4,需要pyyaml包
minecraff 客户端: 官方 1.16.5
minecraft 服务器:spigot 1.16.5
Python API:JuicyRaspberryPie 1.16.5
主要的工具服务器、API、客户端都是jar,所以windows/Linux环境无大区别
官方客户端下载地址:
https://minecraft.net/zh-hans/download/
最新1.16.5,官网购买165块钱人民币,下载安装即可。
先下载buildtools,参考 https://hub.spigotmc.org/jenkins/job/BuildTools/
mkdir -p ~/spigot/1.16.5
cd ~/spigot/1.16.5
wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar
再生成spigot-1.16.5.jar,参考https://www.spigotmc.org/wiki/buildtools/#1-16-5
java -jar BuildTools.jar --rev 1.16.5
要编译生成spigot-1.16.5.jar,先运行一次,生成目录以及eula.txt,如果使用图形化界面,移除nogui选项
java -Xms2048M -Xmx2048M -jar spigot-1.16.5.jar nogui
然后关闭,将eula.txt中eula=false改为true
sed -i "" 's/eula=false/eula=true/g' eula.txt
grep -E 'eula' eula.txt
修改server.properties,参考https://minecraft.fandom.com/zh/wiki/Server.properties
a.生存模式修改为创造模式
sed -i "" 's/gamemode=survival/gamemode=creative/g' server.properties
b.离线模式,不会每次校验客户端账号
sed -i "" 's/online-mode=true/online-mode=false/g' server.properties
gamemode四种类型:survival,creative,adventure,spectator
下载源代码并编译juicyraspberrypie-1.16.5.jar,依赖与jdk 1.8 与maven 3.8.1,提前准备
cd ~/spigot/1.16.5
git clone https://github.com/wensheng/JuicyRaspberryPie
cd ./JuicyRaspberryPie/bukkit
mvn clean package
mkdir -p ~/spigot/1.16.5/plugins
mv ./target/juicyraspberrypie-1.16.5.jar ~/spigot/1.16.5/plugins/
若编译通不过,确认pom.xml依赖部分:
<!-- https://mvnrepository.com/artifact/com.google.code.findbugs/jsr305 -->
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>${SpigotVersion}-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
一是增加jsr305依赖,二是将artifactId spigot改为spigot-api。
然后重新启动服务器,展开juicyraspberrypie-1.16.5.jar插件
forge的编译依赖与gradle 6.8.x,千万别用7.0!!
java -Xms2048M -Xmx2048M -jar spigot-1.16.5.jar
启动完成后,马上退出服务器,即关闭spigot-1.16.5.jar进程,修改python3的exec配置
cd ~/spigot/1.16.5
sed -i "" 's/start_cmdsvr: false/start_cmdsvr: true/g' ./plugins/JuicyRaspberryPie/config.yml
确认python路径,默认是/usr/bin/python3,若不正确就修改pyexec的值。
查看Python3路径
where python3
结果:
/Users/xxx/.pyenv/shims/python3
/usr/local/bin/python3
/usr/bin/python3
第一个是pyenv安装的,第二个应该是brew安装的,选一个修改config.yml,这个Python要能运行"cmdsvr/pycmdsvr.py",故环境中要有pyyaml包(pip install pyyaml)。
sed -i "" 's/\/usr\/bin\/python3/\/usr\/local\/bin\/python3/g' ./plugins/JuicyRaspberryPie/config.yml
确认修改后的config.yml
cat ~/spigot/1.16.5/plugins/JuicyRaspberryPie/config.yml
config.yml内容
api_port: 4711
start_cmdsvr: true
cmdsvr_host: "localhost"
cmdsvr_port: 4731
pyexe: "/usr/local/bin/python3"
# windows pyexe example
# pyexe: "C:\\Users\\wensheng\\Anaconda3\\python.exe"
然后重启服务器,客户端进入选择多人游戏模式,添加本地服务器 127.0.0.1,端口默认为25565;若服务器端口改为5565,则直接 127.0.0.1:5565.
mkdir ~/mc_python_dev
cp -r ~/spigot/1.16.5/JuicyRaspberryPie/bukkit/src/main/resources/* ~/mc_python_dev/
查看目录结果
tree ~/mc_python_dev/
结果:
├── cmdsvr
│ └── pycmdsvr.py
├── config.yml
├── mcpi
│ ├── connection.py
│ ├── event.py
│ ├── minecraft.py
│ ├── util.py
│ └── vec3.py
├── plugin.yml
└── pplugins
├── README.txt
├── config.yml
├── examples.py
└── plugin.yml
主要API包mcpi 1.2.0没更新,setblock时在1.12版之前的数字型ID,1.13之后是字符型。
# 主要的API库 mcpi 1.2.0
pip install mcpi
# 绘图库可选
pip install minecraftstuff
修改bug,进入Python命令行环境,导入mcpi,查看/site-packages/mcpi路径
Python 3.9.4 (default, Apr 5 2021, 01:50:46)
[Clang 12.0.0 (clang-1200.0.32.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import mcpi
>>> mcpi.__file__
'/Users/xxx/mc_python_dev/venv/lib/python3.9/site-packages/mcpi/__init__.py'
看到/Users/xxx/mc_python_dev/venv/lib/python3.9/site-packages/mcpi就是,进入目录,修改minecraft.py源文件修改setBlock/setBlocks函数,把intFloor删掉,其他函数没有仔细比对,按需修改。
def setBlock(self, *args):
"""Set block (x,y,z,id,[data])"""
#self.conn.send(b"world.setBlock", intFloor(args))
self.conn.send(b"world.setBlock", args)
def setBlocks(self, *args):
"""Set a cuboid of blocks (x0,y0,z0,x1,y1,z1,id,[data])"""
#self.conn.send(b"world.setBlocks", intFloor(args))
self.conn.send(b"world.setBlocks", args)
原因是1.13之后的blockbox_id已经改为"minecraft:stone"的形式,而不是数字,参考:
https://wiki.biligame.com/mc/Java%E7%89%88%E6%95%B0%E6%8D%AE%E5%80%BC
用任何的编辑器编辑一个Demo,内容如下:
cat ~/mc_python_dev/sayHello.py
内容如下:
# coding:utf8 # 引入mcpi目录下的mcpi.minecraft import mcpi.minecraft as minecraft # 建立mc连接对象 mc = minecraft.Minecraft.create() # 发送消息 mc.postToChat("hello from python") # 获得玩家位置 pos = mc.player.getTilePos() # 创建两个block mc.setBlock(pos.x + 1, pos.y + 1, pos.z, "minecraft:mossy_cobblestone") #注意: "minecraft:mossy_cobblestone" 而不是48 mc.setBlock(pos.x + 1, pos.y + 2, pos.z, "minecraft:magma_block")
运行,运行之前服务器,客服端都有启动,客户端选多人,添加并登录本地服务器
cd ~/mc_python_dev/
Python3 sayHello.py
回到客户端就可以看到结果了!恭喜恭喜,搞定!!
本来以为,通过修改过~/spigot/1.16.5/plugins/JuicyRaspberryPie/config.yml之后start_cmdsvr为true,应该是服务器加载插件后自动启动的,服务器spigot-1.16.5.jar启动日志也有启动提示:
[07:50:32] [Server thread/INFO]: [JuicyRaspberryPie] Enabling JuicyRaspberryPie v1.16.5
[07:50:32] [Server thread/INFO]: ThreadListener Started
[07:50:32] [Server thread/INFO]: Starting Python command server using /usr/local/bin/python3
[07:50:32] [Server thread/INFO]: Server permissions file permissions.yml is empty, ignoring it
但在客户端里输入
/p list
提示"command server not available"
cd ~/spigot/1.16.5/plugins/JuicyRaspberryPie
python3 ./cmdsvr/pycmdsvr.py
运行结果:
registering command: cube
registering command: falling_block
registering command: flatten
registering command: rainbow
registering command: sphere
Command server started at localhost:4731.
现在可以进客户端愉快的玩了!
/p cube 2 minecraft:diamond_block
具体原因还没找到,这么着吧:<
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。