在Python中玩Minecraft-将结构转换成CSV格式-

首先

2022-02-18_17.02.39.png

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

寻找建筑物

2022-02-18_17.20.24.png

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はこちらにまとまっています。

取得整个结构的块数据。

2022-02-18_18.39.42.png

程序如下所示。

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文件,以便将其保存为设计图纸。