切換
舊版
前往
大廳
主題

【雪色】【指令】右鍵村民系統延伸:玩家對多村民、多玩家對村民 的處理方式

雪色 | 2018-02-06 10:14:38 | 巴幣 0 | 人氣 1153

(如果需要前往之前的村民右鍵對話系統文章請點下方圖片前往)


!》請先理解右鍵村民對話原理後在進入內文《


》當有兩個以上的村民時我該怎麼處理?
如果A村民在右鍵對話完之後就清除talk的分數的話,
會衍伸出一個問題:在和另一個B村民右鍵對話"產生訊息"之前,talk分數就先被清掉了
也就是你永遠也不能跟第二個村民產生右鍵對話的問題。

(這意味著如果你使用原本的村民對話機關
並使用兩個的時候會導致其中一個對話始終無法顯示)

可以看到第一個電源接收端由於比第二個電源接收端優先接收並消耗電
固然第二個電源接收端無法收到任何訊號


》那麼我該怎麼去解決這個問題?
很簡單,先用上面的那張圖來做解釋,
跟原本的機關一樣,由於每串機關後都會清除分數,
那固然我們在「最後一串被執行的機關」後面才清除分數不就好了:

可以看到電源直到第二個電源接收端後才會消耗電源
因此這兩個電源接收端都可以收到電源的訊號

- 》方法一
我們亦可以將其連接成一串作為執行(以function 1.12版格式舉例)
#已先創建記分板:/scoreboard objectives add talk stat.talkedToVillager
#已先生成村民A:/summon villager 0 70 0 {Offers:{},CustomName:"VillagerA"}
#已先生成村民B:/summon villager 0 70 10 {Offers:{},CustomName:"VillagerB"}

  1. execute @a[score_talk_min=1] ~ ~ ~ execute @e[c=1,name=VillagerA,r=4] ~ ~ ~ tellraw @p[score_talk_min=1] ["\u00a72》\u00a7f你好,我是村民A"]
  2. execute @a[score_talk_min=1] ~ ~ ~ execute @e[c=1,name=VillagerB,r=4] ~ ~ ~ tellraw @p[score_talk_min=1] ["\u00a72》\u00a7f你好,我是村民B"]
  3. scoreboard players reset @a[score_talk_min=1] talk
這個做法雖然比較簡單和簡短,
但是當你距離村民A和村民B都在四格以內時,那麼你就會收到兩次對話
如果是用普通的指令方塊串這樣製作的話基本上是最簡潔和最有效率的了。

- 》方法二
利用execute採用優先對話的方式處理(以function 1.12版格式舉例)
#已先創建記分板:/scoreboard objectives add talk stat.talkedToVillager
#已先生成村民A:/summon villager 0 70 0 {Offers:{},CustomName:"VillagerA"}
#已先生成村民B:/summon villager 0 70 10 {Offers:{},CustomName:"VillagerB"}

  1. execute @a[score_talk_min=1] ~ ~ ~ execute @e[c=1,name=VillagerA,r=4] ~ ~ ~ tellraw @p[score_talk_min=1] ["\u00a72》\u00a7f你好,我是村民A"]
  2. execute @a[score_talk_min=1] ~ ~ ~ execute @e[c=1,name=VillagerA,r=4] ~ ~ ~ scoreboard players reset @p[score_talk_min=1] talk
  3. execute @a[score_talk_min=1] ~ ~ ~ execute @e[c=1,name=VillagerB,r=4] ~ ~ ~ tellraw @p[score_talk_min=1] ["\u00a72》\u00a7f你好,我是村民B"]
  4. execute @a[score_talk_min=1] ~ ~ ~ execute @e[c=1,name=VillagerB,r=4] ~ ~ ~ scoreboard players reset @p[score_talk_min=1] talk
這是一個採用如果距離村民A和村民B都在四格以內時
那麼當與村民A對話完後就清除分數,因此不會與B村民對話
相較下這個指令串會需要比較多次的清除分數處理,但不會產生有兩次對話的問題。

- 》方法三
適用於普通世界的延遲訊號方法(利用比較器特性進行延遲輸出)

●左側重複執行指令方塊:/testfor @a[score_talk_min=1]
●右側被動執行指令方塊:/scoreboard players reset @a[score_talk_min=1] talk

當你使用了這類方式時,你可以任意放置村民對話系統(機關後面不需要清除分數)
而且也可以輕鬆做到清除分數的問題(他會在1tick過後才執行清除分數)
但這會比方法一還要來的沒有效率。

- 》方法四
以4格之內與最近村民進行對話(以function 1.12版格式舉例)
#已先創建記分板:/scoreboard objectives add talk stat.talkedToVillager
#已先創建記分板:/scoreboard objectives add message dummy
#已先生成村民A:/summon villager 0 70 0 {Offers:{},CustomName:"VillagerA"}
#已先生成村民B:/summon villager 0 70 10 {Offers:{},CustomName:"VillagerB"}
#已將兩個村民都給予tag:NPC
  1. execute @a[score_talk_min=1] ~ ~ ~ execute @e[c=1,tag=NPC,r=4] ~ ~ ~ execute @s[name=VillagerA] ~ ~ ~ scoreboard players set @p[score_talk_min=1] message 1
  2. execute @a[score_talk_min=1] ~ ~ ~ execute @e[c=1,tag=NPC,r=4] ~ ~ ~ execute @s[name=VillagerB] ~ ~ ~ scoreboard players set @p[score_talk_min=1] message 2
  3. scoreboard players reset @a[score_talk_min=1] talk
  4. tellraw @a[score_message_min=1,score_message=1] ["》你好,我是村民A"]
  5. tellraw @a[score_message_min=2,score_message=2] ["》你好,我是村民B"]
  6. scoreboard players reset @a[score_message_min=1] message
這是一個採用如果距離村民A和村民B都在四格以內時
會以最近的村民進行對話,而不是兩次對話或著是以其中之一的村民優先對話,
相對的這種方式的複雜性會很高,而且會占用比較多的數據(記分板)


》有關於多人模式的村民對話錯誤?
如果有兩個人同時和村民對話的話,
會衍伸出一個問題:兩個同時右鍵玩家中距離比較遠的玩家會無法收到訊息
也就是同時對話時只會有一個玩家收到訊息

》那麼我該怎麼去解決這個問題?
我們可以利用排序處理法中的距離排序來處理這個問題

(以世界中心(0,0,0)作為距離排序的中心)
當有玩家進行右鍵對話的時候,會利用距離排序法的方式,
離世界中心最近的玩家先執行右鍵對話機關,如果還有玩家則在循環一次(循環function)
或是令機關再次執行一次。


利用距離排序處理的指令示意(以function 1.12版格式舉例)
假設此function名稱是main:talk
#已先創建記分板:/scoreboard objectives add talk stat.talkedToVillager
#已先生成村民:/summon villager 0 70 0 {Offers:{},CustomName:"Villager"}

  1. execute @p[x=0,y=0,z=0,score_talk_min=1] ~ ~ ~ execute @e[c=1,name=Villager,r=4] ~ ~ ~ tellraw @p[x=0,y=0,z=0,score_talk_min=1,score_talk_min=1] ["\u00a72》\u00a7f蒸蚌"]
  2. scoreboard players reset @p[x=0,y=0,z=0,score_talk_min=1] talk
  3. function main:talk if @a[score_talk_min=1]
以上(function)指令他會不斷迴圈重複執行直到所有玩家的talk分數都沒有為止,
也就是他每次執行只會針對離世界中心最近的玩家
而不會影響到其他的玩家或是訊息的輸出。


》那麼多玩家對多村民你想的到嗎?
(如果需要講解多玩家對多村民的處理方法的話可以到下方留言問我喔)

創作回應

追蹤 創作集

作者相關創作

更多創作