Calcファンクションの使い方 - TUSB/TheUnusualSkyBlock GitHub Wiki

Calcファンクションの使い方

名前空間calc:には、各種計算を行うファンクションがたくさん入っている。
ここでは、それぞれできることと使い方についてまとめる。

目次

乱数生成

  • 使用用途
    0~65535の乱数を取得する。
    functionからはstore resultで取得、チャット・コマンドブロックからは $RndMWC Randomを参照する(変更禁止)。
  • 使用方法
    function calc:random
    execute store result score _ _ run function calc:random

投てき物速度方向指定

  • 使用用途 このfunctionを実行したエンティティのPosMotionに代入する。
    NoGravityを付与していると2tick後に解除されるが、NoGravityをTagsに入れておくとその後再付与される。
  • 使用方法

投てき物を近くのプレイヤーに向かって飛ばす。

execute as <projectile> facing entity @a[limit=1,sort=nearest] feet positioned 0.0 0.0 0.0 positioned ^ ^ ^1.15 run function calc:throw_projectile/

幾何学計算

距離取得

  • 使用用途
    エンティティ間の距離を取得する。
    store resultや_ Retの参照で距離の100倍を取得することができる。
  • 使用方法
    基準となるエンティティをasに、距離を取りたいエンティティをatに指定してfunctionを実行する。

モブ(敵)を基準に、プレイヤーとの距離を計算する。

execute as @e[type=Enemy,limit=1] at @a[limit=1,sort=nearest] store result score _ _ run function calc:geometry/distance/

前方探索

  • 使用用途
    エンティティの視点方向前方に(Blockがある|モブがいる)かを確認する。
    探索を終了した地点には0-0-0-0-0が存在する。
  • 使用方法
    calc:ストレージにデータを指定する。
SearchForward:{
  Loop: double 探索距離(m)
  Stop: [Block,Mob] 探索を終了する条件
  Align: byte 1bのときalign xyz
}

Loop
探索する距離を0.01単位で指定する。

Stop
探索を終了する条件を指定する。[],[Block],[Mob],[Block,Mob]が有効。

Align
1bのとき0-0-0-0-0の位置がalign xyz positioned ~0.5 ~ ~0.5と同じように調整される。

目線の高さから5mのうちブロックに当たるまで探索する。

data modify storage calc: SearchForward set value {Loop:5d,Stop:[Block]}
execute anchored eyes positioned ^ ^ ^ anchored feet run function calc:geometry/search_forward/

上方探索

  • 使用用途
    エンティティの上方にBlockがあるかを確認する。 search/above/: loopの分だけ探索する。 search/above/to_limit:高度限界に達するまで探索する。 探索を終了した地点(現在のY座標+Loop-1)には0-0-0-0-0が存在する。
  • 使用方法
    calc:ストレージにデータを指定する。

search/above/

SearchAbove:{
  Loop: int 探索距離(m)
  Align: byte 1bのときalign xyz
}

search/above/to_limit

SearchAbove:{
  Pos: int 現在のY座標
  Align: byte 1bのときalign xyz
}

Loop 探索する距離を決定する。(現在のY座標+Loop)まで探索、その1m下に0-0-0-0-0が存在する。

Pos
現在のY座標を代入する。

Align
1bのとき0-0-0-0-0の位置がalign xyz positioned ~0.5 ~ ~0.5と同じように調整される。

NothingAbove
search/above/to_limitを実行した後、0-0-0-0-0が高度限界以上の座標に存在する(探索を停止させるブロックが実行地点より上にない、空に面している)場合には1b,そうでなければ0bとなる。

実行地点からnマス上、もしくはブロックに当たるまで探索する。

data modify storage calc: SearchForward set value {Loop:5d,Stop:[Block]}
function calc:geometry/search_above/

実行者が存在する場所から高度限界、もしくはブロックに当たるまで探索する。

execute store result storage calc: SearchAbove.Pos int 1 run data get entity @s Pos[1]
function calc:geometry/search_above/to_limit

UUIDエンティティのtp・返却

function calc:geometry/tp_00000function calc:geometry/tp_00001を実行すると、実行位置にUUIDエンティティがtpする。
execute as <UUIDエンティティ> run function calc:geometry/return_markerを実行すると、UUIDエンティティがarea:control_area 5 5 5にtpする。

総和・総積計算

  • 使用用途
    与えられた数値の総和・総積を計算する。
    store resultや_ Retの参照で取得することができる。
  • 使用方法
    calc:ストレージにデータを指定する。
List: List 計算するための数字群

基本コマンド

function calc:list/%1%/%2%
%1%
計算方法を指定する。sum(総和)、product(総積)を指定できる。
%2%
返り値の精度を指定する。x1(1倍)、x100(100倍)を指定できる。

以下の数列の総和を100倍で取得する。

data modify storage calc: List set value [2,7,1,9,5,6]
execute store result score _ _ run function calc:list/sum/x100

累乗計算

  • 使用用途
    底と指数を指定することで、累乗計算をする。
    store resultや_ Calcの参照で取得することができる。
  • 使用方法
    calc:ストレージにデータを指定する。
Power: {
  Base: int 底
  value: int 指数
}

2の10乗を計算する

data modify storage calc: Power set value {Base:2,value:10}
function calc:power/

bit演算

  • 使用用途
    特定桁のフラグを立てたり落としたり、上からN番目に出てくるBitの桁を計算したりする。
    store resultや_ Retの参照で取得することができる。
  • 使用方法
    calc:ストレージにデータを指定する。
Bit: {
  Flags : Int 対象のデータを入力
  Digit : Int フラグを立てたり落としたり確認をするときの指定桁を入力
  Number : Int 上から何番目に出てくるBitの桁を探すか入力
  Operation : Int 以下で説明する数値を入力
}

Operationの説明

Operation 内容 必須入力 出力
1 FlagsのDigit桁にフラグを立てる Flags,Digit フラグを立てた後のFlags
2 FlagsのDigit桁のフラグを落とす Flags,Digit フラグを落とした後のFlags
3 Flagsの上からNumber番目に出てくるBitの桁を返す Flags,Number Number番目に出てきたBitの桁
4 FlagsのDigit桁のフラグを返す Flags,Digit Digit桁のフラグの状態(0 or 1)

Flags110001001の3桁目にフラグを立てる。

data modify storage Bit set value {Flags:393,Digit:3,Operation:1}
function calc:bit/

Flags110011101の上から5番目に出てくるBitの桁を取得する。

data modify storage Bit set value {Flags:413,Number:5,Operation:3}
function calc:bit/

Flags110011101の4桁目のフラグを取得する。

data modify storage Bit set value {Flags:413,Digit:4,Operation:4}
function calc:bit/

テキスト表示

  • 使用用途
    サブタイトル・アクションバーに指定文字列を表示する。
    プレイヤーが設定できる"テキスト現在位置"の設定位置に表示する。
  • 使用方法
    calc:ストレージにデータを指定する。
TextLength : int 指定文字列の長さを指定
Text : String 表示させる文字列を指定  JSONテキストでもよい

基本コマンド

function calc:show_text/%1%
%1%
表示する場所を指定する。subtitleactionbarを指定できる。

subtitleに"TEST"と表示させる。

data modify storage calc: Text set value '{"translate":"TEST"}'
data modify storage calc: TextLength set value 4
function calc:show_text/subtitle

各種取得

特定方向角取得

  • 使用用途
    asで指定したエンティティが別のエンティティや座標に視線を向けているときのRotationを取得する。
    取得したデータはストレージのcalc: Rotaion.<1~3>に記録される。
    格納先に指定した番号にデータが記録される。
  • 使用方法

基本コマンド

function calc:get/angle/%1%
%1%
格納するデータの番号を指定する。1から3が使用可能。

execute as <SourceEntity> at <Destination> run function calc:get/angle/1
data get storage calc: Rotation.1

execute as <SourceEntity> positioned xyz run function calc:get/angle/3
data get storage calc: Rotation.3

各種セット

視点ランダム

  • 使用用途
    asで指定したエンティティのRotationをランダムに指定する。
  • 使用方法
    execute as <entity> run function calc:set/random_rotation

頭の向きランダム

* 使用用途
asで指定した防具たてのPose.Headをランダムな向きにする。

  • 使用方法
    execute as @e[type=armor_stand] run functino calc:set/random_pose_head

ターゲット特定

遠距離ターゲット特定

  • 使用用途
    10mずつ視線上にいる一番近いEnemyもしくはMobを特定する。
    特定された敵の位置に0-0-0-0-0が移動する。
  • 使用方法 calc:ストレージにデータを指定する。
Depth : int 探索する最長距離を指定する。Depth*10mまで探索する。

基本コマンド

function calc:target/caster/%1%/catch
%1%
探索対象を指定。enemymobが使用可能。

data modify storage calc: Depth set value 10
function calc:target/caster/enemy/catch

フリップ操作

角度範囲変更

  • 使用用途
    Rotation.<1..3>[0]の角度の範囲を0~360に、Rotation.<1..3>[1]の角度の範囲を-90~90に変更する。
  • 使用方法 calc:ストレージにデータを指定する。
Rotation: {
  <1..3>: [     : 使用するデータ。
    XRotation,  : float 水平方向の角度。
    YRotation   : float 垂直方向の角度。
  ]
}

基本コマンド

function calc:flip/round/%1%
%1%
使用するデータを指定する。1から3が使用可能。

data modify storage calc: Rotation.2 set value [-60.0f,-40.0f]
function calc:flip/round/2
# -> calc: Rotation.2:[300.0f,-40.0f]

各種フリップ

  • 使用用途
    複数のRotationデータを用いて角度を求める。
  • 使用方法 calc:ストレージにデータを指定する。
Rotation: {
  <1..3>: [     : 使用するデータ。
    XRotation,  : float 水平方向の角度。
    YRotation   : float 垂直方向の角度。
  ]
}

base0flip3

Rotation.3のデータを操作する。
[0]は180°反転、[1]は上下反転する。
結果にはroundで範囲変更されたものになる。

data modify storage calc: Rotation.3 set value [-40.0f,30.0f]
function calc:flip/base0flip3
# -> calc: Rotation{3:[140.0f,-30.0f]}
base2flip1to3

Rotation.2のデータとRotation.1のデータを使用して計算した結果をRotation.3に反映する。
大雑把な計算は以下の通りになる。
Rotation.3 = (Rotation.2 * 2) - Rotation.1

function calc:flip/base2flip1to3
# 計算例は省略

配列操作

配列反転

  • 使用用途
    配列の中身を反転させる。
  • 使用方法
    calc:ストレージにデータを指定する。
Array: {
  reverse: {
    Input  : list 操作対象の配列
    Output : list 反転結果の配列
  }
}

コマンド例

data modify storage calc: Array.reverse.Input set value [1,2,3,4,5]
function calc:array/reverse/
tellraw @a {"storage":"calc:","nbt":"Array.reverse.Output"}
# -> [5,4,3,2,1]

三角関数

  • 使用用途
    sin、cos、またはその両方を取得する。
  • 使用方法
    calc:ストレージにデータを指定する。

入力

Triangle: {
  Rotation : float  角度(度数法)
}

出力

Triangle: {
  Sin      : double sinの計算結果。
  Cos      : double cosの計算結果。
  SinCos   : list   [0]がsin、[1]がcosの計算結果。
}

sinとcosはexecute store resultでスコアやストレージに直接返すことが可能。この場合10000倍で返される。

コマンド例

function calc:triangle/%1%

  • %1%
    計算する三角関数の種類を指定する。
    sin,cos,sincosが計算可能。
data modify storage calc: Triangle.Rotation set value 30.0f
excute store result _: Result double 0.0001 run function calc:triangle/sin
tellraw @a {"storage":"_:","nbt":"Result"}
# -> 0.4999d

回転操作

  • 使用用途
    0-0-0-0-1をその座標から原点(0.0 0.0 0.0)中心に回転させる。
    0-0-0-0-1がarea:control_areaにいてかつ、原点から30m以内にいないと実行しない。

  • 使用方法
    調査中!十分に情報が集まっていません
    後述の入力を行ってから function calc:rotate/quaternion/

入力
calc:ストレージにデータを指定する。 0-0-0-0-1に回転前の座標を指定する。

Rotate : {
  Quaternion: {
    Axis[X,Y] : 回転軸を度数法で指定 Rotationと同じ 
    Angle[Z] : 回転角を度数法(60°など)で指定
  }
}

出力
function実行後、0-0-0-0-1の座標が回転後の座標となる。

コマンド例

execute in area:control_area positioned 0.0 1.0 0.0 run teleport ~ ~ ~
data modify storage calc: Rotate.Quaternion.Axis set value [30,45] 
data modify storage calc: Rotate.Quaternion.Angle set value [60] 
function calc:rotate/quaternion/
tellraw @a {"nbt":"Pos","entity":"0-0-0-0-1"}

参考リンク

直接関連はないですが、3次元の回転のイメージをつかむのに有用です。 オイラー角可視化ツール

攻略数取得

  • 使用用途
    現在の攻略数を取得する。
    store resultや_ Calcの参照で攻略数を取得することができる。
  • 使用方法
    execute store result score _ _ run function calc:island_clear_count
⚠️ **GitHub.com Fallback** ⚠️