ワールドタイプ:スーパーフラットの世界
ワールドタイプ:スーパーフラットの世界はどうなっていて、どこまでできるのか?
特に高さと深さの制限を調査する。
初期値
項目 | 値 | 備考 |
---|---|---|
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の座標系がどうなっているのか調べる。
minecraftのAPIの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以上の深さにはブロックを設置できない。