パイクラおじさんの日記

MinecraftでPythonを勉強するおじさんの日記です。

ワールドタイプ:スーパーフラットの世界

ワールドタイプ:スーパーフラットの世界はどうなっていて、どこまでできるのか?

特に高さと深さの制限を調査する。

初期値

項目 備考
Block* 817 4 245 シード値:"Python World"
Facing South 初期値
雲の中 127〜129 雲の高さ
リスポーン位置 817 4 250 初回

Block*値はシード値が同じだと同じ値になる。

方角

方角
X軸プラス
西 X軸マイナス
Z軸プラス
Z軸マイナス
Y軸プラス
Y軸マイナス

地下

草、土、土、地殻の4つしかない。しかも、地殻も壊せるので、地殻を壊すと奈落の底へ落ちて死ぬ。

死ぬたびにリスポーン位置が変わる。

setBlock, setBlocksの座標系

今まで自分の位置とは関係ないグローバルな座標(と思って)を指定していたけど、自分の近くにブロックが設置されていた。 F3キーで表示されるBlockの座標とはかなり違う。 なので、setBlock, setBlocksの座標系がどうなっているのか調べる。

minecraftAPIのgetBlock, setBlock, setBlocksをコールするだけのスクリプトを書いて、それをコールしてみる。

getblock.py

# coding: utf-8

import mcpi.minecraft as minecraft
import mcpi.block as block
import sys

FORMAT = "getBlock({0:d}, {1:d}, {2:d})={3:d}"

mc = minecraft.Minecraft()

if len(sys.argv) < 4:
    sys.exit("getblock.py [x y z]")

pos_x = int(sys.argv[1])
pos_y = int(sys.argv[2])
pos_z = int(sys.argv[3])

blockId = mc.getBlock(pos_x, pos_y, pos_z)

mc.postToChat(FORMAT.format(pos_x, pos_y, pos_z, blockId))

setblock.py

# coding: utf-8

import mcpi.minecraft as minecraft
import mcpi.block as block
import sys

FORMAT = "setBlock({0:d}, {1:d}, {2:d}, {3:d})"

mc = minecraft.Minecraft()

if len(sys.argv) < 5:
    sys.exit("setblock.py [x y z b]")

pos_x = int(sys.argv[1])
pos_y = int(sys.argv[2])
pos_z = int(sys.argv[3])
block_id = int(sys.argv[4])

mc.setBlock(pos_x, pos_y, pos_z, block_id)

mc.postToChat(FORMAT.format(pos_x, pos_y, pos_z, block_id))

setblocks.py

# coding: utf-8

import mcpi.minecraft as minecraft
import mcpi.block as block
import sys

FORMAT = "setBlocks({0:d}, {1:d}, {2:d}, {3:d}, {4:d}, {5:d}, {6:d})"

mc = minecraft.Minecraft()

if len(sys.argv) < 5:
    sys.exit("setblocks.py [x1 y1 z1 x2 y2 z2 b]")

pos1_x = int(sys.argv[1])
pos1_y = int(sys.argv[2])
pos1_z = int(sys.argv[3])
pos2_x = int(sys.argv[4])
pos2_y = int(sys.argv[5])
pos2_z = int(sys.argv[6])
block_id = int(sys.argv[7])

mc.setBlocks(pos1_x, pos1_y, pos1_z, pos2_x, pos2_y, pos2_z, block_id)

mc.postToChat(FORMAT.format(pos1_x, pos1_y, pos1_z, pos2_x, pos2_y, pos2_z, block_id))

どうも関係がよくわからないので、playerの位置に関するAPIも実装してみた。 player.getPos(), player.getTitlePos(), player.setPos(...), player.setTitlePos(...) の4つ。

getpos.py

# coding: utf-8

import mcpi.minecraft as minecraft
import mcpi.block as block
import sys

FORMAT = "player.getPos()=({0:f}, {1:f}, {2:f})"

mc = minecraft.Minecraft()

if len(sys.argv) > 1:
    sys.exit("Usage: getpos.py")

pos = mc.player.getPos()

mc.postToChat(FORMAT.format(pos.x, pos.y, pos.z))

gettilepos.py

# coding: utf-8

import mcpi.minecraft as minecraft
import mcpi.block as block
import sys

FORMAT = "player.getTilePos()=({0:f}, {1:f}, {2:f})"

mc = minecraft.Minecraft()

if len(sys.argv) > 1:
    sys.exit("Usage: gettilepos.py")

pos = mc.player.getTilePos()

mc.postToChat(FORMAT.format(pos.x, pos.y, pos.z))

setpos.py

# coding: utf-8

import mcpi.minecraft as minecraft
import mcpi.block as block
import sys

FORMAT = "player.setPos({0:f}, {1:f}, {2:f})"

mc = minecraft.Minecraft()

if len(sys.argv) < 4:
    sys.exit("Usage: setpos.py [x y z]")

pos_x = float(sys.argv[1])
pos_y = float(sys.argv[2])
pos_z = float(sys.argv[3])

mc.player.setPos(pos_x, pos_y, pos_z)

mc.postToChat(FORMAT.format(pos_x, pos_y, pos_z))

settilepos.py

# coding: utf-8

import mcpi.minecraft as minecraft
import mcpi.block as block
import sys

FORMAT = "player.setTilePos({0:f}, {1:f}, {2:f})"

mc = minecraft.Minecraft()

if len(sys.argv) < 4:
    sys.exit("Usage: settilepos.py [x y z]")

pos_x = float(sys.argv[1])
pos_y = float(sys.argv[2])
pos_z = float(sys.argv[3])

mc.player.setTilePos(pos_x, pos_y, pos_z)

mc.postToChat(FORMAT.format(pos_x, pos_y, pos_z))

試しにplayer.getPos()を実行してみるとわかった!

F3キーで表示される座標系とは違う、独自の座標系で動いていた。

これはクリエイティブモードのスーパーフラットだけじゃなく、サバイバルモードでもそうだった。

だいたい、自分の初期位置は0 0 0の近く(だいたい4マス以内)になる。

だから初期位置にいればスクリプトで0 0 0原点でsetBlockしても見える範囲に設置される。

スーパーフラットでは、0 0 0は地表の1つ上。ここに何かを設置すると、「地表面に何かを置いた状態」になる。

上空の制限

高さ制限は255がMAXのもよう。それを超えるとF3キーの画面でOutside of world...と表示される。

setBlockでは251より上に設置できない。 試しにそのブロックの上に立ったらF3キーの画面のBlockの項のY値が256になった。

地下の制限

地下にsetBlock, setBlocksで-4以上の深さにはブロックを設置できない。