#contents * はじめに [#yac3daf2] あるきながら、ダンジョンの通路や部屋を作ったら、楽だろうなぁ。 そうがんがえ、マイクラ で、 歩くスピードで、ダンジョンつくるやり方を作りました。 ストラクチャーブロックの配置って、置く方角を気をつけるのが 面倒なので、それを、簡単にしちゃう方法の紹介となります。 * なんで、この記事をかいているのか [#eff31a5f] ちょっと、ややこしいので、メモしたら、たくさん喜ぶ人が多いとおもったので マイクラのストラクチャーブロックと、functionコマンドをつかうので、 いま(2019/10/19)のところ、マイクラのJava版です。 * 準備は、だいたいこんなやり方 [#ad90fb4e] 大変だけど、これができたら、高位な錬金術師みたいになりますよ。 + 実験用の新しいワールドを作成します。 + ストラクチャーブロックでは、登録するだけで方角が、だいじなので、F3キーを押して、北を向きます。 + ダンジョンの通路とか、階段とかのサンプルをつくります。 + ストラクチャーブロックに登録します。 + 自作のコマンドを作るプログラムに、ストラクチャーの名前、自分の立ち位置を入れます。 + コマンドのテキストファイルができるので、functionが読めるフォルダに保存します。 + reloadコマンドでよみこみます。 + function コマンドで、建築 + 大体、立ち位置が気に入らないとか言って、微調整します。 + reloadコマンドで、読み込みます。 + 微調整をくりかえして、完成 * コマンド [#ja058d3b] 自分が作った建築の部品を、マイクラではストラクチャーと呼んでいます。 以下に示すコマンドは、自分の立っている場所と、向きを逆算して、 ストラクチャーを、あるきながら、配置するように、するコマンドです。 ** 引数 [#g629c0a7] name: ストラクチャー名 x: ストラクチャーを配置したときの自分の相対位置 z: y: ** コマンド例 [#h3938962] 実際に、どんなコマンドをつくるのかみてみましょう。 たとえば、 name: ストラクチャー名 : bath x: 3 z: -1 y: -3 だとすると、 つくるコマンドは、次の6行になります。 最初の4行は、 - 北を向いているときは、北向きで登録してあるストラクチャーブロックを配置 - 同様に、東 - 同様に、南 - 同様に、西 なので、上記のいずれかのストラクチャーブロックが、置かれます。 つづく2行の意味は、 - レッドストーンを置いて、ストラクチャーブロックを置きます。 - ストラクチャーが動いて、もういらないから、ストラクチャーブロックと、レッドストーンブロックを空気に置き換えて消します。 execute if entity @p[y_rotation=-45..44] as @p positioned ~ ~ ~ run setblock ~ ~2 ~ minecraft:structure_block{mode:"LOAD", name:"bath", posX:-3 ,posZ:1, posY:-5} replace execute if entity @p[y_rotation=45..135] as @p positioned ~ ~ ~ run setblock ~ ~2 ~ minecraft:structure_block{mode:"LOAD", name:"bath", posX:-1, posZ:-3, posY:-5, rotation:CLOCKWISE_90} replace execute if entity @p[y_rotation=135..224] as @p positioned ~ ~ ~ run setblock ~ ~2 ~ minecraft:structure_block{mode:"LOAD", name:"bath", posX:3, posZ:-1, posY:-5, rotation:CLOCKWISE_180} replace execute if entity @p[y_rotation=-135..-44] as @p positioned ~ ~ ~ run setblock ~ ~2 ~ minecraft:structure_block{mode:"LOAD", name:"bath", posX:1, posZ:3, posY:-5, rotation:COUNTERCLOCKWISE_90} replace execute as @p positioned ~ ~ ~ run setblock ~ ~3 ~ minecraft:redstone_block replace execute at @p positioned ~ ~2 ~ run fill ~ ~ ~ ~ ~1 ~ minecraft:air replace 毎回これを作るのは、大変なので、自分は、excelやrubyなどで、上記のめんどくさいのを、自動で作るようにしています。 これをテキストファイルに保存して、ファイルを保存するのですが、 保存先が、最近のバージョンで、変更されまくって、特定するのに時間がかかりました。 今のバージョン(1.14)ですと。 自分は C:\Users\kh\AppData\Roaming\.minecraft\saves\structure\datapacks\kh\data\ns01\functions というフォルダに、 bath.mcfunction というファイル名で保存しています。 自分で調節できるのは、上記の - kh - ns01 - bath ですね。ここに、自由に好きな名前が入れれます。 - khは、自分はパソコンに登録してある名前にしてますが、適当でいいです。 - ns01は、登録するストラクチャーの種類を自分で勝手に入れれます。 - bathは、たまたま、登録したストラクチャーがお風呂だったので、ストラクチャー名がbathだったので、bath.mcfunctionにしてます。ストラクチャー名と合わせたほうが、じぶんは、わかりやすいです。 登録後は、reloadコマンドを使って、マイクラで使える状態になります。 使うときは、上記の 名前の例ですと function ns01:bath となります。 * おまけ Rubyで、生成する箇所をオブジェクト指向でかいてみた [#rdb60037] 回転行列を使っている感じを、伝えたかったので、 もっと、コンパクトにかけるのですが、意味が、分かるようにするため あえて、オブジェクト指向的に書いてみました。 ** makeMcFunction.rb [#j0197cb1] *** 実行方法 [#v5ef495b] 例: 配置したいストラクチャー名がbathだとします。 配置後の自分のそのストラクチャーの場所のx座標が3 配置後の自分のそのストラクチャーの場所のz座標が-1 配置後の自分のy座標が5だとしますと、下記のようにコマンドを実行します。 ruby makeMcFunction.rb bath 3 5 -1 すると、テキストがコンソールに表示されるのです。 *** コード [#u5dfacbb] # 引数をまとめます strName = ARGV[0] #座標のクラス class Pos def initialize(x, y, z) @x = x @y = y @z = z end attr_accessor :x, :y, :z def p puts "x:" + x.to_s + ", y:" + y.to_s + ", z:" + z.to_s end end pos = Pos.new(ARGV[1].to_i, ARGV[2].to_i, ARGV[3].to_i) # マイクラの方角についてのクラス class Direction def initialize(angle, clockwize) # 向いている方向の範囲 @rs = angle - 45 @re = angle + 44 # 角度 @angle = angle # マイクラの向きを意味する文字列 @clockwize = clockwize end attr_accessor :rs, :re, :angle, :clockwize #向いている方向の時だけ実行するコマンド def ifRot return "execute if entity @p[y_rotation=" + rs.to_s + ".." + re.to_s + "] as @p positioned ~ ~ ~ " end # 簡易 三角関数 def sin(x) case x when 0 then return 0 when 90 then return 1 when 180 then return 0 when -90 then return -1 end end # 簡易 三角関数 def cos(x) case x when 0 then return 1 when 90 then return 0 when 180 then return -1 when -90 then return 0 end end # 回転行列 def rotPos(pos) x = pos.x * cos(@angle) - pos.z * sin(@angle) z = pos.x * sin(@angle) + pos.z * cos(@angle) return Pos.new(x.to_i, pos.y, z.to_i) end end #東西南北 dList = [] dList[0] = Direction.new(0,"") dList[1] = Direction.new(90,"CLOCKWISE_90") dList[2] = Direction.new(180,"CLOCKWISE_180") dList[3] = Direction.new(-90,"COUNTERCLOCKWISE_90") # 文字列書き出し def write(message) puts message end # 自分の頭の上にブロックを置きます def setBlock(name, y) return "run setblock ~ ~#{y} ~ minecraft:#{name} " end # 自分の頭の上にストラクチャーブロックを置きます。 def setStrBlock(name, pos, rotation) if rotation != "" then rotation = ", rotation:" + rotation end return setBlock("structure_block", 2) + '{mode:"LOAD", name:"' + name + '"' + ", posX:#{-pos.x} ,posZ:#{-pos.z}, posY:#{-pos.y} #{rotation}} replace" end #自分の頭のどの辺で、コマンドを実行するのか指定します。 def exePos(y) if (y==0) then y="" end return "execute as @p positioned ~ ~#{y} ~ " end # メイン処理 for num in 0..3 write dList[num].ifRot + setStrBlock(strName, dList[num].rotPos(pos), dList[num].clockwize) end write exePos(0) + setBlock("redstone_block", 3) + "replace" write exePos(2) + "run fill ~ ~ ~ ~ ~1 ~ minecraft:air replace"