0.1.7 • Published 5 years ago

mc-macros v0.1.7

Weekly downloads
1
License
MIT
Repository
github
Last release
5 years ago

mc-macros : Minecraft Function Macros

English | 日本語

あなたは自分のマクロを手に入れるでしょう。

インストールと実行

実行には Node.js が必要です。

npm install -g mc-macros

実行

mcmacros [-v|--verbose] DatapackDir ...InputFiles

DatapackDir

出力したいデータパックのディレクトリを指定します。

InputFiles

1 つ以上の入力ファイルを指定します。入力ファイルは必ず指定された順序で処理されます。

-v --verbose

-v オプションをつけることでファイルへの出力結果等を表示します。


基本的なマクロ

これらの基本的なマクロは必ずロードされます。これらは defaults.js で定義されています。

namespace

匿名ファンクションを使う場合、最初に namsspace でデフォルトの名前空間を指定する必要があります。

namespace foo

anon (匿名ファンクション)

Minecraft ファンクションでは制御構造を表現したい時に構造に名前を付けて mcfunction ファイルを作成する必要があり、編集が非常に煩雑になります。

function ... コマンドではなく anon マクロとインデントによるブロック化を使用すると、ブロックの内容を別の mcfunction ファイルに出力し、そのファンクションが実行されるように展開されます。

ファンクションの名前空間には namespace マクロで指定された値が使われます。

namespace sweden
anon
  say Mojang.

このマクロが展開されると、おそらく以下のようなmcfuncionが出力されます。

function sweden:anon/0_0
# ========================================
# data/sweden/functions/anon/0_0.mcfunction
say Mojang.

更に匿名ファンクションの有効な例です。

execute as @e[tag=Adios] at @s run anon
  say Adios.
  tp @s ~ ~100 ~

コマンドソースを匿名ファンクションに与えて実行するため、@e[tag=Adios] の処理を一回だけで済ませることができます。

recursive

匿名ファンクションのブロック内部で recursive によって自身を再帰実行できます。

execute as @e[type=cow,limit=1,sort=nearest] run anon
  execute store result score @p tmp run data get entity @s Health
  scoreboard players operation @p HealthCount += @p tmp
  kill @s
  execute if score @p HealthCount matches ..100 as @e[type=cow,limit=1,sort=nearest] run recursive

この例では殺す牛の体力をカウントしその合計が100以上になるまで一体づつ殺していきます。

mcfunction

出力する mcfunction ファイルを切り替えます。 名前空間を省略した場合 namespace で指定された値が使われます。

namespace foo

# output to data/foo/functions/bar.mcfunction
mcfunction bar
say Bar.

# output to data/sweden/functions/mojang.mcfunction
mcfunction sweden:mojang
say Mojang.

switch and case

switchcase 及びその内部ブロックをN分探索木として展開します。

switch Targets Objective N
  case ...
  case ...

N を省略した場合はデフォルト値の 2 (二分探索)が使われます。

switch @s tmp
  case 0
    say Result is zero.
  case 1..2
    say Result is 1 to 2.
  case 3..
    say Result is 3 or more.

注意点

  • case の値は小さい値から大きい値に順序づけされている必要があります。
  • 再帰できません。
  • ブロック内部でスコアを変更したい場合は値のコピーを作成する必要があります。

ファンクションタグの指定

mcfunction myload load

mcfunction mytick tick

mcfunction myloadandtick load tick

ファンクション名に続いてデータパックにおけるファンクションのタグを指定することで loadinit はそれぞれが data/minecraft/tags/functionsload.jsontick.json に登録されます。

初期化機能を使用したマクロを利用する場合、load に登録したファンクションは必須です。

タグ付けされたファンクションが不要になった場合、手動で修正する必要があります。

define

プリプロセッサの現在のスコープにキーと値をセットします。 これにより ES2015/ES6 の Template Literal を使った文字列テンプレートが機能します。

define foo bar
say ${foo}.
# => say bar.

define num 10
say ${num*num}.
# => say 100.

テンプレート文字列はコマンドマクロの出力時に処理されるため、マクロ内で値を内部処理するようなパラメータに define された値を与えた場合、予期しない結果になります。

require

入力ファイルごとにマクロモジュールをいくつでも追加することができます。

require mymacros

この例は入力ファイルと同じディレクトリにある mymacros.js マクロモジュールをプリプロセッサが使用するように設定します。


マクロモジュール

初期化関数やマクロ関数をモジュールにすることで require によるインポートが可能になります。

定義例を参考にして下さい。 https://github.com/rasensuihei/mc-macros/blob/master/test/mymacros.js

初期化関数

exports.init に初期化用コマンドを展開する関数を設定します。

exports.init = cx => {
  cx.appendInitialCommand ('execute unless entity 0-0-0-0-0 run summon minecraft:armor_stand ~ ~ ~ {UUIDMost: 0L, UUIDLeast: 0L, Marker: 1b}')
}

マクロ関数

exports.directives にマクロ関数を設定します。

const directives = {}
directives['greeting'] = {
  command: (cx, words) => cx.appendLine ('say', words)
}
exports.directives = directives

マクロ関数のパラメータ型

ディレクティブに types を指定することでマクロが受けとるパラメータの型を指定できます。 これらは 'number', 'int', 'float', 'string', 'bool', 'json', 'expr' の任意の配列になります。

types を省略した場合、コマンド名を除いたテキスト行の文字列がパラメータになります。

directives['calc'] = {
  types: ['number', 'string', 'number'],
  command: (cx, left, op, right) => {
    if (op === '+') {
      cx.appendLine ('say', left + right)
    }
  }
}

ハンドラ関数

マクロコマンドは最初に command が呼ばれ、マクロコマンドの次の行にインデントされたブロックがあれば blockBeginblockRepeatblockEndが順番に実行されます。

全てのハンドラは省略可能です。

名前説明
command基本的なコマンドマクロのハンドラです。ブロックのあるなしにかかわらず必ず最初に実行します。
blockBeginブロックのマクロ展開を開始する前に実行されるハンドラです。
blockRepeatブロックのマクロを展開する前に実行され、true を返す限りブロックをリピートし続けるハンドラです。省略した場合ブロックは必ず 1 回だけ展開されます。
blockEndブロックのマクロ展開が終了すると一回だけ呼ばれるハンドラです。

PreprocessContext クラス

ディレクティブの具体的な機能は PreprocessContext オブジェクトを操作することで実装できます。

コンテキストにおけるブロック、ファンクション、文字列展開用のスコープは互いに無関係である点に注意して下さい。

メソッド説明
append(...str)現在のファンクションに文字列を追加します。複数の引数であれば join(' ') されます。改行は行いません。
appendLine(...str)現在のファンクションに文字列と改行を追加します。
appendInitialCommand(...str)設定された初期化用ファンクションに文字列と改行を追加します。
enterScope()プリプロセッサの新しいスコープを作成しスタックします。
exitScope()プリプロセッサの現在のスコープを終了します。
boolean initObjective(name)スコアボートのオブジェクティブ name を初期化します。
enterFunction(ns, name)指定した名前空間と名前でファンクションを作成しスタックします。
string enterAnonymousFunction()匿名ファンクションを作成してスタックします。終了するときは exitFunction() を使用します。
exitFunction()現在のファンクションを終了します。