Minecraft(我的世界)中文論壇

 找回密碼
 注冊(register)
查看: 2266|回復: 22
打印 上一主題 下一主題

[新版本預覽] 【CBL|SPG】[1.15] 新出的斷言是什么東西

[復制鏈接]
SPGoding 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
15686
鉆石
性別
保密
注冊時間
2018-1-18
查看詳細資料
跳轉到指定樓層
#
 樓主| 發表于 2019-9-21 15:58:01 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式

您尚未登錄,立即登錄享受更好的瀏覽體驗!

您需要 登錄 才可以下載或查看,沒有帳號?注冊(register)

x
本帖最后由 SPGoding 于 2019-9-28 10:41 編輯

【CBL|SPG】[1.15] 新出的斷言是什么東西



何為斷言

斷言(predicate),社區常見譯名「判據」「謂詞」「條件」「特征函數」「皮迪凱特」,在平常交流時可以任意采用合適的、不易與其他詞語產生混淆的叫法。其是在 19w38a 中加入的新內容。

說是新內容,其實斷言就是原先戰利品表中的條件,只不過現在可以被單獨抽離出來形成新的文件而已。沒有接觸過戰利品表?沒關系,本文將從零開始。

簡單來講,斷言儲存的是一系列對實體的判定條件。首先寫好一個斷言,再給定一個實體,游戲就能判定該實體是否是你想要的。好了,我說完了,大概沒什么難理解的。



文件格式

所有斷言文件均為 JSON 格式,放置在數據包的 ./data/<命名空間>/predicates 文件夾下。

該文件內容是一個對象。其中含有 condition 字段,指明所用條件的名稱;同時還需含有該條件所需的各種附加參數:

  • (對象)根對象。
    • (字符串)condition:所用條件的名稱。詳細條件列表請見附錄。
    • (任意)參數名:該條件所指定的附加參數。



應用

命令 execute (if|unless) predicate <斷言的命名空間 ID>

該命令能夠檢測命令的執行者和執行位置等是否滿足指定的斷言。在 if 模式下,只有滿足指定斷言時,測試才能通過;在 unless 模式下則相反。特別地,當命令執行者并不是實體(例如命令方塊、控制臺等),且斷言中有對實體的限定條件時,在 unless 模式下也能導致測試通過。

實體選擇器參數 predicate

通過指定該選擇器參數,能夠篩選出滿足(或不滿足)指定斷言的實體。例如 @a[predicate=minecraft:test] 能夠選中所有滿足放置在數據包下 ./data/minecraft/predicates/test.json 的文件中條件的玩家,而在等號后方添加一個半角感嘆號(!)則將選中所有滿足該斷言的玩家。

tag 等選擇器參數一樣,選擇器中能夠指定多個 predicate 參數,只有滿足所有參數的實體才能被選中。例如,@e[predicate=do,predicate=!not,sort=nearest,limit=1] 會選中最近的、滿足 do 斷言、且不滿足 not 斷言的實體。

相比于用 nbt 選擇器參數,predicate 選擇器參數在大多數情況下性能都會更好。這是因為,nbt 選擇器參數的檢測原理是,先把實體的所有數據轉換為 NBT,再將轉換后的 NBT 與用戶輸入的 NBT 進行比較,這些操作十分耗時。而斷言會在游戲加載數據包以后就初始化完畢,在選擇實體時會直接調用實體的各種方法進行比較,省去了轉換為 NBT 的過程。

戰利品表

戰利品表的條件(conditions)數組中的每一個對象就是斷言。有關戰利品表的詳細內容可以參閱【CBL|SPG】[1.15]戰利品表:從入門到重新入門



附錄 1:條件列表

該列表最終更新時間:19w38b

說明

通常,斷言中的參數大多是可以省略的。一旦省略該參數,表明你對該參數的值沒有任何要求:即不論實際情況中該參數為何值,甚至在該參數沒有值的情況下,斷言都絕不會因為這個參數的原因而不通過。但是,有些參數是不能省略的,一旦省略游戲就會報錯。可以在斷言沒有正確讀取時,打開游戲日志查看報錯信息,并回帖提醒本人為該參數添加注釋。

適用范圍

每個條件都只能在一定的范圍下使用。在本文中,將使用 [E] 表示能在 execute (if|unless) predicate 命令中正常運作,用 [S] 表示能在體選擇器(selector)參數中正常運作,用 [L:xxx] 表示能在 minecraft:xxx 以及 minecraft:generic 類型的戰利品表(loot table)正常運作。

在不適用的地方使用某個條件,會導致該條件永遠不通過。如果用在不合適的戰利品表中,還會引起游戲在加載該數據包時在日志中顯示警告:Found validation problem in {戰利品表的命名空間 ID}.出現該錯誤的 JSON 路徑: Parameters [<parameter 出問題的參數名>] are not provided in this context

特殊類型:范圍

「范圍」表示該字段的值可以是一個數字,以表示精確匹配。

也可以是一個表示數字取值范圍的對象,其格式如下:

  • (數字)min:最小值(含)。
  • (數字)max:最大值(含)。

以下是幾個例子。

用數字表示精確的「等于」

  1. "xxx": 5
復制代碼

xxx 的值確實為 5 時,條件滿足。

用對象表示精確的「等于」

  1. "xxx": { "min": 5, "max": 5 }
復制代碼

xxx 的值確實為 5 時,條件滿足。

用對象表示「大于等于」

  1. "xxx": { "min": 5 }
復制代碼

xxx 的值大于等于 5 時,條件滿足。

用對象表示「小于等于」

  1. "xxx": { "max": 5 }
復制代碼

xxx 的值大于等于 5 時,條件滿足。

用對象表示「在兩數之間」

  1. "xxx": { "min": 5, "max": 10 }
復制代碼

xxx 的值大于等于 5 并且小于等于 10 時,條件滿足。

minecraft:alternative [E|S|L:*]

析取范式。即,若指定的條件中只要有任一個通過,則該條件通過;如果指定的所有條件都不通過,則該條件不通過。

  • (數組)terms:條件列表。
    • (對象)一個條件。格式同條件的格式。

例子:

  1. {
  2.     "condition": "minecraft:alternative",
  3.     "terms": [
  4.         {
  5.             "condition": "minecraft:weather_check",
  6.             "raining": false
  7.         },
  8.         {
  9.             "condition": "minecraft:match_tool",
  10.             "predicate": {
  11.                 "item": "minecraft:diamond_axe"
  12.             }
  13.         }
  14.     ]
  15. }
復制代碼

當玩家使用的工具為鉆石斧,或當前天氣為晴天時,條件通過。

minecraft:block_state_property [L:block]

匹配被破壞方塊。

  • (字符串)block:方塊 ID。
  • (對象)properties:方塊狀態。
    • (字符串)方塊狀態名:方塊狀態值。

例子:

  1. {
  2.     "condition": "minecraft:block_state_property",
  3.     "block": "minecraft:yellow_bed",
  4.     "properties": {
  5.         "part": "head"
  6.     }
  7. }
復制代碼

當被破壞的方塊是黃色床的頭的一部分時,條件通過。床在被破壞時,頭和腳兩部分會分別執行戰利品表。為了避免掉落兩個床,Minecraft 在寫床的戰利品表的時候加了一個 "part": "head" 的限制。

minecraft:damage_source_properties [L:entity]

匹配該實體死亡時受到的傷害。

  • (對象)predicate:對該傷害的判定條件。
    • (布爾)blocked:傷害是否被盾牌阻擋。
    • (范圍)dealt:被防御前的傷害大小。
    • (范圍)taken:實際造成的傷害大小(可能被盔甲.減免等)。
    • (對象)direct_entity:傷害的直接來源實體(如彈射物)。格式同 minecraft:entity_properties 中的 predicate
    • (對象)source_entity:傷害的根本來源實體(如射箭的骷髏)。格式同 minecraft:entity_properties 中的 predicate
    • (對象)type:傷害的類型。
      • (布爾)bypasses_armor:是否破甲。
      • (布爾)bypasses_invulnerability:是否無視無敵狀態(如虛空傷害)。
      • (布爾)bypasses_magic:是否由饑餓引起。
      • (布爾)is_explosion:是否由爆炸引起。
      • (布爾)is_fire:是否由火焰引起。
      • (布爾)is_magic:是否由魔法引起。
      • (布爾)is_projectile:是否由彈射物引起。
      • (布爾)is_lightning:是否由閃電引起。
      • (對象)direct_entity:傷害的直接來源實體(如彈射物)。格式同 minecraft:entity_properties 中的 predicate
      • (對象)source_entity:傷害的根本來源實體(如射箭的骷髏)。格式同 minecraft:entity_properties 中的 predicate

例子:

  1. {
  2.     "condition": "minecraft:damage_source_properties",
  3.     "predicate": {
  4.         "taken": {
  5.             "min": 20
  6.         }
  7.     }
  8. }
復制代碼

當實際造成傷害大于等于 20 時,條件通過。

minecraft:entity_properties [E|S|L:entity]

在指定的實體滿足指定條件時,該條件通過。

  • (字符串)entity:檢測的實體。使用 this 指代命令的執行者 [E];使用 this 指代被選擇的實體 [S];使用 this 指代死亡的實體,killer 指代擊殺此實體的實體,killer_player 指代擊殺此實體的玩家 [L:entity]
  • (對象)predicate:對指定實體的判據。(注:雖然這個參數的名字叫做 predicate,但它與我們本文中所講述的 predicate 并不是一個東西,它只是 minecraft:entity_properties 這一條件的一個參數而已。)
    • (字符串)catType:當前貓應當滿足的種類。應為一個指向相應貓的材質的路徑,例如 minecraft:textures/entity/cat/tabby.png
    • (對象)distanceentity 中指定實體所在坐標到執行位置的距離。執行位置即為命令的執行位置 [E|S];執行位置即為擊殺此實體的實體所在的坐標 [L:entity]
      • (范圍)absolute:絕對距離。
      • (范圍)horizontal:水平距離。
      • (范圍)x:在 X 軸方向上的距離。
      • (范圍)y:在 Y 軸方向上的距離。
      • (范圍)z:在 Z 軸方向上的距離。
    • (數組)effects:檢測的實體所需具有的狀態效果列表。
      • (對象)一個狀態效果。
        • (字符串)id:狀態效果名稱。
        • (范圍)amplifier:效果倍率。
        • (范圍)duration:效果持續時間,以刻為單位。
    • (對象)equipment:檢測的實體所需穿有的裝備。
      • (對象)一個裝備欄位。鍵可選值:headchestlegsfeetmainhandoffhand格式同 minecraft:match_tool 中的 predicate
    • (對象)flags:檢測的實體具備的特質。
      • (布爾)is_on_fire:正在著火。
      • (布爾)is_sneaking:正在潛行。
      • (布爾)is_sprinting:正在疾跑。
      • (布爾)is_swimming:正在游泳。
      • (布爾)is_baby:是幼體。
    • (對象)location:檢測的實體所在位置。格式同 minecraft:location_check 中的 predicate
    • (字符串)nbt:檢測的實體所需有的 NBT。
    • (對象)player:對玩家實體的各種判定條件。一旦指定了該參數,即使內容完全為空,也會要求當前實體必須為一名玩家。
      • (對象)advancements:進度。
        • (布爾)進度 ID:玩家是否完成了該進度。
        • (對象)進度 ID:對該進度中各判據的完成情況進行進一步判斷。
          • (布爾)進度判據名稱:玩家是否完成了該進度的該判據。
      • (字符串)gamemode:游戲模式。可選值:adventure(冒險模式)、creative(創造模式)、spectator(旁觀者模式)、survival(生存模式)。
      • (范圍)level:經驗等級的范圍。
      • (對象)recipes:配方。
        • (布爾)配方 ID:玩家是否解鎖了該配方。
      • (數組)stats:統計信息。
        • (對象)一個統計信息
          • (字符串)type:統計信息所屬種類。可選值與記分板判據中的一致,但請注意分割符號為冒號(:),而不是記分板判據中的點(.):minecraft:customminecraft:craftedminecraft:usedminecraft:brokenminecraft:minedminecraft:killedminecraft:picked_upminecraft:droppedminecraft:killed_by
          • (字符串)stat:統計信息的 ID。可選值與記分板判據中的一致,但請注意分割符號為冒號(:),而不是記分板判據中的點(.)。如 minecraft:leave_game 等。
          • (范圍)value:玩家在該統計信息上的數值范圍。該數值可以通過 ESC → 「統計信息」菜單查詢。
    • (字符串)team:檢測的實體需所在隊伍的隊伍名。
    • (字符串)type:檢測的實體需滿足的 ID。

例子:

  1. {
  2.     "condition": "minecraft:entity_properties",
  3.     "predicate": {
  4.         "flags": {
  5.             "is_on_fire": true
  6.         }
  7.     },
  8.     "entity": "this"
  9. }
復制代碼

該條件會在 this 指定的實體著火時通過。可以在戰利品表中利用它做出生物被燒死后掉落熟食的效果。

  1. {
  2.     "condition": "minecraft:entity_properties",
  3.     "predicate": {
  4.         "equipment": {
  5.             "mainhand": {
  6.                 "item": "minecraft:air"
  7.             }
  8.         }
  9.     },
  10.     "entity": "this"
  11. }
復制代碼

該條件會在 this 指定的實體主手中沒有拿任何物品時通過。

minecraft:entity_scores [E|S|L:entity]

在指定的實體的分數滿足指定條件時,該條件通過。

  • (字符串)entity:檢測的實體。使用 this 指代命令的執行者 [E];使用 this 指代被選擇的實體 [S];使用 this 指代死亡的實體,killer 指代擊殺此實體的實體,killer_player 指代擊殺此實體的玩家 [L:entity]
  • (對象)scores:要檢測的分數。必須全部滿足,條件才能通過。
    • (范圍)_分數名_:該分數的值。

例子:

  1. {
  2.     "condition": "minecraft:entity_scores",
  3.     "entity": "killer_player",
  4.     "scores": {
  5.         "foo": {
  6.             "min": 10
  7.         },
  8.         "bar": 15
  9.     }
  10. }
復制代碼

在擊殺該實體的玩家 foo 分數大于 10,且 bar 分數等于 15 時,條件通過 [L:entity]

minecraft:inverted [E|S|L:*]

取反。即,若指定的條件通過,則該條件不通過;否則,該條件通過。

  • (對象)term:指定的條件。格式同條件的格式。

例子:

  1. {
  2.     "condition": "minecraft:inverted",
  3.     "term": {
  4.         "condition": "minecraft:random_chance",
  5.         "chance": 0.3
  6.     }
  7. }
復制代碼

term 內指定的條件有 30% 的概率通過,因此整個 inverted 條件有 70% 的概率通過。

minecraft:killed_by_player [L:entity]

當前實體被玩家擊殺時,條件通過。

  • (布爾)inverse:如果設置為 true,則變為擊殺者不是玩家時條件通過。

例子:

  1. {
  2.     "condition": "minecraft:killed_by_player"
  3. }
復制代碼

minecraft:location_check [E|S|L:*]

當前位置滿足指定條件時,條件通過。

  • (數字)offsetX:在檢測位置前,先將當前位置在 X 軸上進行的偏移。
  • (數字)offsetY:在檢測位置前,先將當前位置在 Y 軸上進行的偏移。
  • (數字)offsetZ:在檢測位置前,先將當前位置在 Z 軸上進行的偏移。
  • (對象)predicate:對該位置的判定條件。
    • (字符串)biome:該位置所屬的生態群系的 ID。
    • (對象)block:對該位置所處方塊的判定條件。
      • (字符串)block:方塊 ID。
      • (字符串)nbt:方塊實體所需具有的 NBT。
      • (對象)state:方塊所需具有的方塊狀態。
        • (范圍或布爾或字符串)方塊狀態名:方塊狀態值。
      • (字符串)tag:方塊標簽 ID。
    • (字符串)dimension:該位置所屬的維度的 ID。
    • (字符串)feature:該位置所屬的結構的 ID。
    • (對象)fluid:對該位置所處流體的判定條件。
      • (字符串)fluid:流體 ID。
      • (對象)state:流體所需具有的流體狀態。
        • (范圍或布爾或字符串)流體狀態名:流體狀態值。
      • (字符串)tag:流體標簽 ID。
    • (對象)light:對光照的檢測。
      • (范圍)light:該位置可見光所需滿足的范圍。可見光計算公式為 max{天空亮度 - 衰減, 方塊亮度}
    • (對象)position:坐標。
      • (范圍)x:X 坐標。
      • (范圍)y:Y 坐標。
      • (范圍)z:Z 坐標。

例子:

  1. {
  2.     "condition": "minecraft:location_check",
  3.     "predicate": {
  4.         "biome": "minecraft:jungle"
  5.     },
  6.     "offsetX": -10
  7. }
復制代碼

將當前位置向 X 軸負方向偏移 10 米后如果處于叢林生態群系,則條件通過。

minecraft:match_tool [L:block,fishing]

匹配玩家使用的工具。

  • (對象)predicate:對該工具的判定條件。
    • (范圍)count:物品數量。
    • (范圍)durability:物品耐久度。
    • (數組)enchantments:魔咒列表。
      • (對象)一個魔咒。如果該對象為空,則任何魔咒都能成功匹配。
        • (字符串)enchantment:魔咒ID。
        • (范圍)levels:魔咒等級。
    • (字符串)item:物品 ID。
    • (字符串)nbt:物品 NBT。
    • (字符串)potion:藥水 ID,即物品的 Potion 標簽中指定的內容。就算該物品不是藥水,只要有這個標簽并且內容匹配,即可通過。
    • (字符串)tag:數據包物品標簽 ID。

例子:

  1. {
  2.     "condition": "minecraft:match_tool",
  3.     "predicate": {
  4.         "enchantments": [
  5.             {
  6.                 "enchantment": "minecraft:silk_touch",
  7.                 "levels": {
  8.                     "min": 1
  9.                 }
  10.             }
  11.         ]
  12.     }
  13. }
復制代碼

當玩家使用的工具具有「精準采集Ⅰ」及以上的魔咒,條件通過。

minecraft:random_chance [E|S|L:*]

游戲會生成一個 0.0 到 1.0 的隨機數,當該數字小于等于被比數時,條件通過。

  • (數字)chance:被比數。值域 [0.0, 1.0]。

例子:

  1. {
  2.     "condition": "minecraft:random_chance",
  3.     "chance": 0.3
  4. }
復制代碼

該條件有 30% 的幾率通過

minecraft:random_chance_with_looting [E|S|L:entity]

游戲會生成一個 0.0 到 1.0 的隨機數,當該數字小于等于被比數時,條件通過 [E|S|L:entity]

擊殺者的搶奪附魔等級會影響被比數的大小 [L:entity]

  • (數字)chance:被比數的基礎值。值域 [0.0, 1.0] [E|S|L:entity]
  • (數字)looting_multiplier:每一級搶奪附魔所增加的被比數 [L:entity]

例子:

  1. {
  2.     "condition": "minecraft:random_chance_with_looting",
  3.     "chance": 0.3,
  4.     "looting_multiplier": 0.1
  5. }
復制代碼

該條件有 30% 的幾率通過 [E|S|L:entity]。每多一級搶奪魔咒,通過幾率增加 10 個百分點 [L:entity]

minecraft:reference [E|S|L:*]

引用定義的其他斷言文件。

  • (字符串)name:判據的命名空間 ID。

例子:

  1. {
  2.     "condition": "minecraft:reference",
  3.     "name": "test:abc"
  4. }
復制代碼

該條件將會引用定義在數據包 ./data/test/predicates/abc.json 文件中的斷言。當被引用的斷言能夠通過時,該條件通過。

minecraft:survives_explosion [E|S|L:block]

如果該方塊是被爆炸破壞的,該條件有 1/爆炸半徑 的幾率通過;如果該方塊是被玩家正常挖掘的,該條件永遠通過 [L:block]

該條件永遠通過 [E|S]

例子:

  1. {
  2.     "condition": "minecraft:survives_explosion"
  3. }
復制代碼

minecraft:table_bonus [L:block]

分別定義不同級別的附魔等級下條件的通過幾率。

  • (字符串)enchantment:探測的魔咒 ID。
  • (數組)chances:每個魔咒等級下的通過幾率。
    • (數字)無該魔咒的幾率
    • (數字)該魔咒為 1 級的幾率
    • (數字)該魔咒為 2 級的幾率
    • ...
    • (數字)該魔咒為 (n-1) 級的幾率

例子:

  1. {
  2.     "condition": "minecraft:table_bonus",
  3.     "enchantment": "minecraft:fortune",
  4.     "chances": [
  5.         0.05,
  6.         0.0625,
  7.         0.083333336,
  8.         0.1
  9.     ]
  10. }
復制代碼

當玩家沒有時運附魔時,有 5% 的幾率通過;當玩家有 1 級時運時,有 6.25% 的幾率通過;當玩家有 2 級時運時,有 8.3333336% 的幾率通過;當玩家有 3 級及以上的時運時,有 10% 的幾率通過。

minecraft:time_check [E|S|L:*]

檢測當前游戲內的時間。

  • (范圍)value:允許的值。
  • (數字)period:可選。如果指定,在比較前會先將游戲的時間以該數取模。

例子:

  1. {
  2.     "condition": "minecraft:time_check",
  3.     "value": 6000
  4. }
復制代碼

該條件會在游戲內每天正午(6000)的那一刻通過。

  1. {
  2.     "condition": "minecraft:time_check",
  3.     "value": 6000,
  4.     "period": 12000
  5. }
復制代碼

該條件會在游戲內每天正午(6000)或午夜(18000)的那一刻通過。

minecraft:weather_check [E|S|L:*]

檢測當時的天氣。

  • (布爾)raining:是否下雨。
  • (布爾)thundering:是否打雷。

例子:

  1. {
  2.     "condition": "minecraft:weather_check",
  3.     "raining": true,
  4.     "thundering": false
  5. }
復制代碼

該條件會在普通的雨天通過,在晴天或雷雨天均不會通過。



附錄 2:Datapack Helper Plus (JSON)

Datapack Helper Plus (JSON)(簡稱 DHP (JSON),中文名大憨批杰森)是一款優秀的 VSCode 插件,提供適用于 Minecraft 1.15 數據包 JSON 文件的自動補全與格式校驗。在該款插件的幫助下,編寫斷言以及其他各種文件(如進度、配方、戰利品表、各種標簽)將變得十分方便。請您坐和放寬,前往該插件的發布帖一覽究竟。





致謝

  • chyx - 挑錯
  • ruhuasiyu - 幫忙補充了點東西
  • 玄素 - 我斷言了
  • 柘木鈴 - 挑錯

來自群組: Command Block Logic

評分

參與人數 15人氣 +32 金粒 +280 貢獻 +1 收起 理由
RanEr5438 + 1 神乎其技,不服不行!
巧虎樂 + 30 大憨批杰森還行
隱退 + 2 MCBBS有你更精彩~
模仿... + 2 MCBBS有你更精彩~
00ll00 + 1 + 20
雷鳴·翾鶚 + 2 皮迪凱特
liach + 2 + 40 厲害
chyx + 3 速查
玄素 + 4 大憨批杰森
CHElover_C60 + 2 + 30 MCBBS有你更精彩~
夜之暗夜 + 2 + 50 MCBBS有你更精彩~
ItIsEnderman + 4 + 50 MCBBS有你更精彩~
ruhuasiyu + 4 + 40 + 1 MCBBS有你更精彩~
Jokey_鑰匙 + 2 spg辛苦了!
HerobrineXia + 1 + 20 整理的真快(

查看全部評分

帖子永久鏈接: 

Minecraft中文論壇 - 論壇版權1、本主題所有言論和圖片純屬會員個人意見,與本論壇立場無關
2、本站所有主題由該帖子作者發表,該帖子作者享有帖子相關版權
3、其他單位或個人使用、轉載或引用本文時必須同時征得該帖子作者的同意
4、帖子作者須承擔一切因本文發表而直接或間接導致的民事或刑事法律責任
5、本帖若有內容轉載自其它媒體,不代表本站贊同其觀點和對其真實性負責
6、若本帖涉及任何版權問題,請立即告知本站,本站將及時予以刪除并致以最深的歉意
7、Minecraft(我的世界)中文論壇管理員和版主有權不事先通知發貼者而刪除本文

chyx 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
17521
鉆石
性別
保密
注冊時間
2014-3-20
查看詳細資料
來自 22#
發表于 2019-9-27 00:59:35 | 只看該作者
本帖最后由 SPGoding 于 2019-10-7 00:34 編輯
SPGoding 發表于 2019-9-21 23:14
不太可以(

因為目前 predicate 沒有比較方便的表示 AND 關系的方法(只能用 inverted + alternatives) ...


上次寫了一個,能夠像alternative一樣使用and。
把帶有and的對象丟到最下面那個函數里,它就會自動把and轉成not->or->not。
這樣就能被mc認了。

拋磚引玉。希望大家指正或者改寫。

眾所周知,
A & B

!(!A | !B)
是完全等價的(其中 ! 表示取反,& 表示且,| 表示或)

因此盡管斷言本身不支持寫多個條件,利用 inverted(取反)和 alternative(或)我們完全可以做出「且」的效果。

chyx 所給出的這段 python 代碼可以幫助使用者不必手動寫 inverted 和 alternative 的嵌套,可以自動生成出相應 JSON。

—— SPGoding 注

評分

參與人數 1人氣 +2 金粒 +30 收起 理由
Jokey_鑰匙 + 2 + 30 非常感謝!

查看全部評分

回復

使用道具 舉報

陌上塵客 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
24
鉆石
性別
保密
注冊時間
2019-11-14
查看詳細資料
頭像被屏蔽
受到警告 21#
發表于 3 天前 | 只看該作者
mcbbs有你更精彩

評分

參與人數 1人氣 -2 金粒 -20 收起 理由
SPGoding -2 -20 版規 2-4 萬用回復

查看全部評分

回復

使用道具 舉報

MinecraftPeace 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
64
鉆石
性別
保密
注冊時間
2019-8-18
查看詳細資料
20#
發表于 2019-11-10 19:29:49 | 只看該作者
皮迪凱特可還行awa
回復

使用道具 舉報

臨郢夏望 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
74
鉆石
性別
保密
注冊時間
2019-10-28
查看詳細資料
19#
發表于 2019-11-8 12:09:33 | 只看該作者
萌新選擇入土為安
回復

使用道具 舉報

121236738 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
79
鉆石
性別
保密
注冊時間
2019-10-26
查看詳細資料
18#
發表于 2019-11-2 15:05:01 | 只看該作者
1.15終于等到了
回復

使用道具 舉報

121236738 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
79
鉆石
性別
保密
注冊時間
2019-10-26
查看詳細資料
17#
發表于 2019-11-2 15:04:22 | 只看該作者
等啊等,終于等到了
回復

使用道具 舉報

wkscb12 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
70
鉆石
性別
保密
注冊時間
2019-10-1
查看詳細資料
16#
發表于 2019-11-1 15:00:12 | 只看該作者
這一打鉆代碼。。。
回復

使用道具 舉報

chyx 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
17521
鉆石
性別
保密
注冊時間
2014-3-20
查看詳細資料
15#
發表于 2019-10-31 15:09:44 來自手機 | 只看該作者
chyx 發表于 2019-9-27 00:59
上次寫了一個,能夠像alternative一樣使用and。
把帶有and的對象丟到最下面那個函數里,它就會自動把and ...

關于包含于我回復中的spgoding的注
我聲明我不同意其中將predicate翻譯成斷言的行為



回復

使用道具 舉報

chyx 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
17521
鉆石
性別
保密
注冊時間
2014-3-20
查看詳細資料
14#
發表于 2019-10-21 18:59:26 | 只看該作者
本帖最后由 chyx 于 2019-10-25 03:50 編輯
Jokey_鑰匙 發表于 2019-10-20 20:41
那個好用的and轉notornot的腳步可以在哪下載呢?(

你是說我寫的被置頂的那個嗎?

===================================================

上傳到github了。
https://github.com/ch-yx/not-or-not/blob/master/m.py

我已經在后面加了一個搜索同文件夾里的所有json文件并統統修改的功能了。
把這個py放在和json文件一個文件夾里,雙擊運行就好了。


(我知道數據包里的json 通常幾個文件放在一個文件夾里。所以即使是裝在若干層文件夾里的json也會被修改。)

@Jokey_鑰匙   

評分

參與人數 1人氣 +2 收起 理由
Jokey_鑰匙 + 2 是的

查看全部評分

回復

使用道具 舉報

Jokey_鑰匙 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
1851
鉆石
性別
保密
注冊時間
2014-6-24
查看詳細資料
13#
發表于 2019-10-20 20:41:05 | 只看該作者
那個好用的and轉notornot的腳步可以在哪下載呢?(

評分

參與人數 1人氣 +1 收起 理由
chyx + 1 上傳到GitHub了。鏈接也發了

查看全部評分

回復

使用道具 舉報

lashidedongxi 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
66
鉆石
性別
保密
注冊時間
2014-10-5
查看詳細資料
12#
發表于 2019-10-19 08:19:25 | 只看該作者
這斷言,你說了這么多我屬實不太懂
回復

使用道具 舉報

雷小達 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
105
鉆石
性別
保密
注冊時間
2016-1-25
查看詳細資料
受到警告 11#
發表于 2019-10-4 09:57:27 | 只看該作者
66666666666666

評分

參與人數 1人氣 -1 金粒 -10 收起 理由
SPGoding -1 -10 版規 2-4 無意義

查看全部評分

回復

使用道具 舉報

SPGoding 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
15686
鉆石
性別
保密
注冊時間
2018-1-18
查看詳細資料
10#
 樓主| 發表于 2019-9-22 13:31:08 | 只看該作者
chyx 發表于 2019-9-21 19:07
我昨晚發現match_tool不能直接被命令用時氣的要死。

我剛剛檢查了下源碼,發現 entity_properties 里面有個 equipment 參數,可以用和 match_tool 一樣的格式檢測玩家物品!不過可惜的是只限于六個欄位,不是背包里所有地方都能檢測。

另外從源碼實現可以確認,predicate 選擇器參數的性能會比 nbt 參數高。因為 predicate 的判定直接調用的是實體上的方法;而 nbt 的判定卻是先把實體變成 NBT,再按 NBT 的那一套測試,會慢很多。

評分

參與人數 1人氣 +3 收起 理由
chyx + 3 給個示例吧~

查看全部評分

回復

使用道具 舉報

SPGoding 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
15686
鉆石
性別
保密
注冊時間
2018-1-18
查看詳細資料
9#
 樓主| 發表于 2019-9-21 23:14:17 | 只看該作者
RF_Tar_Railt 發表于 2019-9-21 23:05
可以認為以前exe后面跟的一大堆if可以放在單獨的文件里面了?

不太可以(

因為目前 predicate 沒有比較方便的表示 AND 關系的方法(只能用 inverted + alternatives),想把一系列的條件移入一個文件還是有些復雜
回復

使用道具 舉報

chyx 當前離線
帖子
主題
精華
貢獻
最后登錄
1970-1-1
愛心
積分
17521
鉆石
性別
保密
注冊時間
2014-3-20
查看詳細資料
8#
發表于 2019-9-21 23:14:12 | 只看該作者
RF_Tar_Railt 發表于 2019-9-21 23:05
可以認為以前exe后面跟的一大堆if可以放在單獨的文件里面了?

不。是以前loottable的一些東西可以了

評分

參與人數 1人氣 +1 收起 理由
SPGoding + 1 見鬼,為什么你比我快 5 秒

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊(register)

本版積分規則

Archiver|小黑屋|Mcbbs.net ( 京ICP備15023768號-1 ) | 京公網安備 11010502037624號 | 手機版

GMT+8, 2019-11-20 07:52 , Processed in 0.052759 second(s), Total 26, Slave 25 queries , Gzip On, MemCached On.

"Minecraft"以及"我的世界"為Mojang Synergies AB的商標 本站與Mojang以及微軟公司沒有從屬關系

© 2010-2019 我的世界中文論壇 版權所有 本站原創圖文內容版權屬于原創作者,未經許可不得轉載

快速回復 返回頂部 返回列表
20码必中