#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 
 
 # メイン処理
 # 東西南北で、向いている方向どれか実行するコードを出力してます
 # 例: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
 for num in 0..3
   write dList[num].ifRot + setStrBlock(strName, dList[num].rotPos(pos), dList[num].clockwize)
 end 
 # redstoneを置いて、実行するコード
 write exePos(0) + setBlock("redstone_block", 3) + "replace"
 # 頭上に置いたredstoneと、ストラクチャーブロックを消去
 write exePos(2) + "run fill ~ ~ ~ ~ ~1 ~ minecraft:air replace"
トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS