在Python中玩Minecraft-将结构转换成CSV格式-
首先
1. 実行環境
・Windows 11
・minecraft java Edition 1.12.2
・minecraft Forge 14.23.5.2855
・Raspberry Jam Mod 0.92
・Python 3.9.10
・mcpi 1.12.1
寻找建筑物
3. mcpiの導入
您可以使用pip命令安装mcpi。
pip install mcpi
在程序中导入并初始化这个。
from mcpi.minecraft import minecraft
mc = minecraft.Minecraft.create()
4. 获取区块数据:getBlockWithData
構造物を構成するブロックのデータ取得します。ブロックデータの取得にはgetBlockWithData(x, y, z)を使います。これで座標(x,y,z)のブロックidとブロックDataが取得できます。例えば座標(0,0,0)のブロックが石だった場合Pythonで実行すると以下のようになります。
block = mc.getBlockWithData(0, 0, 0)
print(f"ID = {block.id}")
print(f"Data = {block.data}")
# ID = 1
# Data = 0
ブロックid,dataはこちらにまとまっています。
取得整个结构的块数据。
程序如下所示。
def get_building_data(x, y, z, x_range, y_range, z_range):
"""
建造物をcsvデータとして出力する
:param x: 建造物の角 x座標の最小値
:param y: 建造物の角 y座標の最小値
:param z: 建造物の角 z座標の最小値
:param x_range: 建造物の大きさ x方向
:param y_range: 建造物の大きさ y方向
:param z_range: 建造物の大きさ z方向
:return: out 座標とブロックデータのリスト[[x, y, z, id, data]]
"""
out = [["x", "y", "z", "id", "data"]]
for y_ in range(y_range):
for x_ in range(x_range):
for z_ in range(z_range):
x_pos = x + x_
y_pos = y + y_
z_pos = z + z_
block = mc.getBlockWithData(x_pos, y_pos, z_pos)
out.append([x_, y_, z_, block.id, block.data])
return out
6. 不要删除块
当指定一个立方体的范围来获取方块数据时,会记录下不必要的方块。对于海底神殿而言,这些方块包括水、昆布和砂砾等。为了避免记录这些数据,可以选择仅获取指定的方块数据,或者不获取指定的方块数据。
要仅获取指定的方块,可以按照以下方式进行。对于海底神殿而言,指定的方块包括海洋方块系列、海绵和金块。
# get_blocks = [[168, 0], [168, 1], [168, 2], [19, 1], [41, 0]]
# 168,0:海洋ブロック 168,1:海洋レンガ, 168,2:シーランタン
# 19,1:濡れたスポンジ, 41,0:金ブロック
def judge_get_block(get_blocks, target_block):
"""
取得するブロックかどうかの判定
:param get_blocks: 取得するブロックの種類を限定する ブロックid,dataのリスト
:param target_block: minecraft内で配置されているブロック
:return: target_blockがget_blocksに含まれているならTrue、含まれていないならFalse
"""
for get_block in get_blocks:
if get_block[0] == target_block.id and get_block[1] == target_block.data:
return True
return False
为了避免获取指定的区块,可以按照以下方式操作。对于海底神殿而言,这些区块包括水、砂砾、沙、石头和矿石。
# ignore_blocks = [[8, 0], [13, 0], [12, 0], [16, 1], [15, 0]]
# 8,0:水 13,0:砂利, 12,0:砂
# 16,0:石炭鉱石, 15,0:鉄鉱石
def judge_ignore_block(ignore_blocks, target_block):
"""
取得しないブロックかどうかの判定
:param ignore_blocks: 取得しないブロックの種類を指定する ブロックidのリスト
:param target_block: minecraft内で配置されているブロックid
:return: target_blockがignore_blocksに含まれているならFalse、含まれていないならTrue
"""
for ignore_block in ignore_blocks:
if ignore_block[0] == target_block.id and ignore_block[1] == target_block.data:
return False
return True
7. 程序完成
在第5个程序中,将第6个获取块的选择和保存为CSV文件的功能集成进去,就完成了!
def get_building_data(x, y, z, x_range, y_range, z_range, output_path, get_blocks=None, ignore_blocks=None):
"""
建造物をcsvデータとして出力する
:param x: 建造物の角 x座標の最小値
:param y: 建造物の角 y座標の最小値
:param z: 建造物の角 z座標の最小値
:param x_range: 建造物の大きさ x方向
:param y_range: 建造物の大きさ y方向
:param z_range: 建造物の大きさ z方向
:param output_path: csvの出力先
:param get_blocks: 取得するブロックの種類を限定する ブロックidのリスト
:param ignore_blocks: 取得しないブロックの種類を指定する ブロックidのリスト
:return:
"""
out = [["x", "y", "z", "id", "data"]]
for y_ in range(y_range):
for x_ in range(x_range):
for z_ in range(z_range):
#ブロックデータの取得
x_pos = x + x_
y_pos = y + y_
z_pos = z + z_
block = mc.getBlockWithData(x_pos, y_pos, z_pos)
#取得するブロックかどうかの判定
if get_blocks is not None:
if judge_get_block(get_blocks, block) is False:
continue
if ignore_blocks is not None:
if judge_ignore_block(ignore_blocks, block) is True:
continue
out.append([x_, y_, z_, block.id, block.data])
with open(output_path, "w", newline='') as f:
writer = csv.writer(f)
writer.writerows(out)
保存海底神殿将生成以下的CSV文件。
# 0,0,0は建造物の角
x,y,z,id,data
0,0,0,168,1
0,0,1,168,1
0,0,2,168,1
...
30,28,28,168,0
30,28,29,168,0
30,28,30,168,1
通过这个方法,可以将《我的世界》内的建筑设计图转化为CSV文件!只需按照CSV文件中的指示放置方块,就可以在任意地点建造所喜欢的建筑物。
此外,还有一种通过读取CSV文件并复制建筑的程序,我会在另一篇文章中进行介绍。
8. 安装
我已经在PyPi上注册了模块,您可以通过以下方式进行安装。
pip install minecraft_get_building
关于使用方法,请参考以下的GitHub链接。如果方便的话,可以尝试使用一下。
https://github.com/konishi0125/minecraft_get_building
最后
本次向大家介绍了一个将Minecraft内部结构转化为csv文件的程序。
Minecraft中除了海底神殿外,还有森林豪宅和末地城等等许多令人着迷的建筑物。通过将它们转化为csv文件,我们可以在Minecraft中自由地选择位置和数量进行游戏。此外,我们还可以将我们自己建造的建筑物转化为csv文件,以便将其保存为设计图纸。