はじめに

あるきながら、ダンジョンの通路や部屋を作ったら、楽だろうなぁ。

そうがんがえ、マイクラ で、

歩くスピードで、ダンジョンつくるやり方を作りました。

ストラクチャーブロックの配置って、置く方角を気をつけるのが

面倒なので、それを、簡単にしちゃう方法の紹介となります。

なんで、この記事をかいているのか

ちょっと、ややこしいので、メモしたら、たくさん喜ぶ人が多いとおもったので

マイクラのストラクチャーブロックと、functionコマンドをつかうので、

いま(2019/10/19)のところ、マイクラのJava版です。

準備は、だいたいこんなやり方

大変だけど、これができたら、高位な錬金術師みたいになりますよ。

  1. 実験用の新しいワールドを作成します。
  2. ストラクチャーブロックでは、登録するだけで方角が、だいじなので、F3キーを押して、北を向きます。
  3. ダンジョンの通路とか、階段とかのサンプルをつくります。
  4. ストラクチャーブロックに登録します。
  5. 自作のコマンドを作るプログラムに、ストラクチャーの名前、自分の立ち位置を入れます。
  6. コマンドのテキストファイルができるので、functionが読めるフォルダに保存します。
  7. reloadコマンドでよみこみます。
  8. function コマンドで、建築
  9. 大体、立ち位置が気に入らないとか言って、微調整します。
  10. reloadコマンドで、読み込みます。
  11. 微調整をくりかえして、完成

コマンド

自分が作った建築の部品を、マイクラではストラクチャーと呼んでいます。

以下に示すコマンドは、自分の立っている場所と、向きを逆算して、

ストラクチャーを、あるきながら、配置するように、するコマンドです。

引数

name: ストラクチャー名

x: ストラクチャーを配置したときの自分の相対位置

z:

y:

コマンド例

実際に、どんなコマンドをつくるのかみてみましょう。

たとえば、

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

というファイル名で保存しています。

自分で調節できるのは、上記の

ですね。ここに、自由に好きな名前が入れれます。

登録後は、reloadコマンドを使って、マイクラで使える状態になります。

使うときは、上記の 名前の例ですと

function ns01:bath

となります。

おまけ Rubyで、生成する箇所をオブジェクト指向でかいてみた

回転行列を使っている感じを、伝えたかったので、

もっと、コンパクトにかけるのですが、意味が、分かるようにするため

あえて、オブジェクト指向的に書いてみました。

makeMcFunction?.rb

実行方法

例:

配置したいストラクチャー名がbathだとします。

配置後の自分のそのストラクチャーの場所のx座標が3

配置後の自分のそのストラクチャーの場所のz座標が-1

配置後の自分のy座標が5だとしますと、下記のようにコマンドを実行します。

ruby makeMcFunction.rb bath 3 5 -1

すると、テキストがコンソールに表示されるのです。

コード

# 引数をまとめます
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"
トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS