【エンティティプロパティ】

はじめに

エンティティプロパティというのは、各エンティティが独自で保持できるビヘイビアパック上のデータ領域です。
オブジェクト指向型言語で言うところのクラスのプロパティと同じようなニュアンスだと考えて頂ければ分かり易いかと思いますが、アクセス方法が特殊なので注意が必要です。
ここではプロパティの定義方法とアクセス方法をご紹介します。

定義方法

まずは以下のファイルをご覧ください。
▶ダミーエンティティのページでご紹介したファイルにプロパティ定義(黄色の部分)を追加したものです。

{
    "format_version": "1.17.10",
    "minecraft:entity": {
        "description": {
            "identifier": "customize:dummy_entity",
            "is_spawnable": false,
            "is_summonable": true,

            "properties": {
                "customize:bool_dummy": {
                    "type": "bool",
                    "default": false
                }
            }

        },
        "components": {}
    }
}
                    

プロパティは上記のようにdescriptionブロックの中でpropertiesブロックとして定義します。
"<ネームスペース>:<プロパティ名>": { 
    <データ型別のステートメント>
}
                    


データの種類

使えるデータ型はbool型も含めて以下の4種類です。
残念ながら文字列型は存在しないようです。
"customize:int_dummy": { 
    "type": "int", 
    "range": [0, 4], 
    "default": 0 
}
                    
type
固定でintを指定します。
range
配列形式で[最小値,最大値]を指定します。
default
デフォルト値を指定します。
"customize:float_dummy": { 
    "type": "float", 
    "range": [0.0, 30.0], 
    "default": "math.random(20, 25)" 
}
                    
type
固定でfloatを指定します。
range
配列形式で[最小値,最大値]を指定します。
default
デフォルト値を指定します。
上記の例ではMolangのmath.random(20, 25)を使って20~25のランダム値を指定しています。
"customize:bool_dummy": { 
    "type": "bool", 
    "default": false 
} 
                    
type
固定でboolを指定します。
default
デフォルト値をtrue、またはfalseで指定します。
"customize:enum_dummy": { 
    "type": "enum", 
    "values": ["park", "reverse", "neutral", "drive"], 
    "default": "park", 
    "client_sync": true 
}
                    

type
固定でenumを指定します。
values
enum値を文字列の配列形式で指定します。
default
values内の中からデフォルト値にするものを指定します。
client_sync(他のデータ型でも使用可)
trueの場合、リソースパックのminecraft:client_entityブロックで使用可能になります。

アクセス方法

エンティティ内部では以下の方法でアクセスできます。
Molangで参照
query.property('<プロパティ名>')の形式で指定。
データ定義でclient_syncをtrueにしておけばリソースパックでも使えます。

filterで参照
test項目に型の種類、domain項目にプロパティ名を指定します。
{"test":"int_property", "subject":"self", "domain":"customize:int_dummy", "value":4, "operator":">"}
                            
{"test":"float_property", "subject":"self", "domain":"customize:float_dummy", "value":4.5, "operator":">"}
                            
{"test":"bool_property", "subject":"self", "domain":"customize:bool_dummy", "value":true, "operator":"=="}
                            
{"test":"enum_property", "subject":"self", "domain":"customize:enum_dummy", "value":"park", "operator":"!="}
                            
{"test":"has_property", "subject":"self", "value":"customize:bool_dummy", "operator":"=="}
                            

※上記のいずれの場合もsubjectはselfをデフォルトとして、operatorは==またはequalsをデフォルトとして省略できます。

set_propertyで設定
"set_property": { 
    "customize:int_dummy": "query.property('customize:int_dummy') + 1" 
}
                            

外部から設定するには以下の黄色の部分ようにイベントとして定義します。
{
    "format_version": "1.17.10",
    "minecraft:entity": {
        "description": {
            "identifier": "customize:dummy_entity",
            "is_spawnable": false,
            "is_summonable": true,
            "properties": {
                "customize:bool_dummy": {
                    "type": "bool",
                    "default": false
                }
            }
        },
        "components": {},
        "events": {

            "customize:bool_dummy_set": {
                "set_property": {
                    "customize:bool_dummy": true
                }
            },
            "customize:bool_dummy_reset": {
                "set_property": {
                    "customize:bool_dummy": false
                }
            }

        }
    }
}
                            

各種制限事項


プロパティ数の制限

エンティティの各タイプごとに32個までと決められているようです。

int型

使える範囲は-16,777,216~16,777,215のようですが、-1,000,000~1,000,000の範囲で使う事が推奨されています。

enum型

一つのenum型プロパティに対して16エントリまで許容されます。
enum値の文字列の長さは1~32文字です。
最初の文字はアルファベット、それ以降はアルファベット・数字・アンダースコアの構成である必要があります。

おわりに

本環境では以下のページでご紹介させて頂いたコンテンツ内で、Websocketサーバーと連携する形でエンティティプロパティを利用しています。

▶召雷の魔石