Lua 腳本:道具 API
本頁說明 FreeMinecraftModels 道具腳本的 context.prop、context.event、context.player、context.projectile、context.world、context.zones、context.scheduler、context.state、context.cooldowns 與 context.log。初次使用請先閱讀入門。
context.prop
提供道具資訊與動畫操作。FMM 會為每個道具快取此表格;current_location 等欄位在讀取時查詢,所以仍反映目前狀態。
欄位
| 欄位 | 類型 | 說明 |
|---|---|---|
prop.model_id | 字串 | 藍圖模型名稱,例如 "torch_01" |
prop.current_location | location 表格 | 讀取時的道具位置,不是固定快照 |
位置表格包含 x、y、z、world、yaw、pitch。
範例:讀取道具資訊
return {
api_version = 1,
on_spawn = function(context)
context.log:info("Prop spawned: " .. (context.prop.model_id or "unknown"))
local loc = context.prop.current_location
if loc then
context.log:info("Location: " .. loc.x .. ", " .. loc.y .. ", " .. loc.z)
end
end
}
prop:play_animation(name, blend, loop)
要求道具模型播放指定名稱的動畫。
| 參數 | 類型 | 預設值 | 說明 |
|---|---|---|---|
name | 字串 | 必填 | 模型檔案中的動畫名稱 |
blend | 布林 | true | true 在目前狀態的 tick 後排入切換,false 立即中斷。不是交叉淡化 |
loop | 布林 | true | 是否循環自訂動畫;內建狀態使用各自的規則 |
接受要求時回傳 true,無法接受時回傳 false。排隊或被抑制的要求也可能被接受。終止狀態 death 會拒絕後續要求。自訂動畫期間的攻擊要求會被接受,但不會中斷該動畫。佇列只有一個位置,新排隊要求會取代舊要求。接受要求不表示用戶端已經顯示動畫,詳見動畫。
範例
return {
api_version = 1,
on_right_click = function(context)
local success = context.prop:play_animation("open", true, false)
if not success then
context.log:warn("Animation 'open' not found on this model!")
end
end
}
prop:stop_animation()
清空佇列,有 idle 時回到該狀態,否則停止共用動畫引擎的目前狀態。終止狀態 death 仍會保留,不過 Bedrock 後端會收到停止要求。不接受參數。
範例
return {
api_version = 1,
on_right_click = function(context)
context.prop:stop_animation()
end
}
prop:hurt_visual()
顯示紅色受傷閃爍,不造成實際傷害。不接受參數。
範例
return {
api_version = 1,
on_left_click = function(context)
-- Flash red when punched, but don't actually take damage
if context.event then
context.event.cancel()
end
context.prop:hurt_visual()
end
}
prop:pickup()
從世界移除道具,在原位置掉落放置用的紙張物品。用紙右鍵點擊方塊可以重新放置道具。
不接受參數,也沒有回傳值。移除與掉落操作會排入 Bukkit 主執行緒。此方法不檢查權限,也不把已儲存的物品欄或書本資料轉移到紙上。呼叫前請檢查存取權限並處理儲存內容。回收已經排隊時,不要重複呼叫 pickup()。
範例
return {
api_version = 1,
on_right_click = function(context)
-- Let players pick up the prop by right-clicking it
context.prop:pickup()
end
}
prop:mount(player)
讓玩家坐到第一個空閒的騎乘點。模型必須有騎乘點骨骼。
| 參數 | 類型 | 說明 |
|---|---|---|
player | 實體表格 | 玩家,例如 context.player 或 context.event.player |
找到玩家、道具有騎乘點且乘坐動作已排隊時回傳 true。基本參考無效時回傳 false。true 不保證執行時仍有空位。
右鍵腳本自行控制座位時,請取消 context.event,避免 FMM 的預設騎乘處理也嘗試讓玩家入座。
範例
return {
api_version = 1,
on_right_click = function(context)
if context.event then context.event.cancel() end
local player = context.event and context.event.player
if player then
context.prop:mount(player)
end
end
}
prop:dismount(player)
讓玩家離開道具上的座位。
| 參數 | 類型 | 說明 |
|---|---|---|
player | 實體表格 | 玩家 |
找到玩家、道具有騎乘管理器且離座檢查已排隊時回傳 true;基本參考無效時回傳 false。
範例
return {
api_version = 1,
on_right_click = function(context)
if context.event then context.event.cancel() end
local player = context.event and context.event.player
if player then
-- Toggle mount/dismount
local passengers = context.prop:get_passengers()
for i = 1, #passengers do
if passengers[i].uuid == player.uuid then
context.prop:dismount(player)
return
end
end
context.prop:mount(player)
end
end
}
prop:get_passengers()
回傳目前所有乘客實體表格組成的 Lua 陣列。不接受參數。
範例
return {
api_version = 1,
on_game_tick = function(context)
local passengers = context.prop:get_passengers()
if #passengers > 0 then
context.log:info("Prop has " .. #passengers .. " passenger(s)")
end
end
}
prop:has_mount_points()
以 true 或 false 回傳模型是否有騎乘點骨骼。不接受參數。
範例
return {
api_version = 1,
on_right_click = function(context)
if context.event then context.event.cancel() end
local player = context.event and context.event.player
if player and context.prop:has_mount_points() then
context.prop:mount(player)
end
end
}
prop:spawn_elitemobs_boss(filename, x, y, z)
在指定位置生成 EliteMobs 自訂 Boss,需要安裝 EliteMobs。
| 參數 | 類型 | 說明 |
|---|---|---|
filename | 字串 | Boss 檔名,例如 "my_boss.yml" |
x | 數字 | X 座標 |
y | 數字 | Y 座標 |
z | 數字 | Z 座標 |
回傳生成的 Boss 的生物實體表格。外掛無法使用、缺少設定或生成失敗等情況,使整合無法回傳存活 Boss 時,會回傳 nil。nil 本身無法指出原因。
範例
return {
api_version = 1,
on_right_click = function(context)
local loc = context.prop.current_location
if loc then
local boss = context.prop:spawn_elitemobs_boss("dungeon_guardian.yml", loc.x, loc.y + 1, loc.z)
if boss then
context.log:info("Spawned boss: " .. (boss.name or "unknown"))
else
context.log:warn("Could not spawn boss -- is EliteMobs installed?")
end
end
end
}
prop:open_inventory(player, title, rows)
為玩家排隊開啟箱子物品欄介面。每個道具只有一個共用的物品欄:第一次開啟時會從道具 PersistentDataContainer 中儲存的內容建立,之後的開啟則向每位檢視者顯示同一個即時物品欄。FMM 會在最後一位檢視者關閉時、道具所在區塊卸載時,以及 drop_inventory() 讀取之前,將它存回道具。
| 參數 | 類型 | 預設值 | 說明 |
|---|---|---|---|
player | 實體表格 | 必填 | 要顯示介面的玩家 |
title | 字串 | 必填 | 標題,支援 & 顏色代碼 |
rows | 整數 | 3 | 1 到 6 列;6 列為 54 格,相當於大型箱子 |
參考有效且開啟動作已排隊時回傳 true,否則回傳 false。建立前會將列數限制在 1 到 6。
大小與標題取自建立物品欄的那次呼叫;物品欄開啟期間,之後的呼叫會原樣沿用。若儲存的內容格數多於要求的列數,物品欄會擴大以容納它們,因此較小的 rows 值絕不會丟棄已儲存的物品。若無法讀取儲存的資料,物品欄不會開啟。若道具在動作執行前已被移除,動作會被略過。回傳值不保證物品欄已開啟。
prop:is_viewing_inventory(player)
回傳物品欄監聽器是否將玩家追蹤為此道具的檢視者,不保證玩家實際上仍開著該介面。
| 參數 | 類型 | 說明 |
|---|---|---|
player | 實體表格 | 要檢查的玩家 |
回傳 true 或 false。
範例:關閉物品欄後播放動畫
context.state["task_" .. player.uuid] = context.scheduler:run_repeating(5, 5, function(tick_context)
if not tick_context.prop:is_viewing_inventory(player) then
tick_context.prop:play_animation("close", true, false)
tick_context.scheduler:cancel(tick_context.state["task_" .. player.uuid])
end
end)
prop:place_book(player)
取走玩家主手已寫成或可寫的書,存入道具。
| 參數 | 類型 | 說明 |
|---|---|---|
player | 實體表格 | 手持書本的玩家 |
參考有效且動作已排隊時回傳 true。後續主執行緒動作只在玩家仍持有適合的書、道具還沒有書時存入。
prop:read_book(player)
向玩家開啟儲存的書。
| 參數 | 類型 | 說明 |
|---|---|---|
player | 實體表格 | 閱讀的玩家 |
參考有效且閱讀已排隊時回傳 true。執行時需要已儲存且可反序列化的 WRITTEN_BOOK。儲存的 WRITABLE_BOOK 不會開啟。
prop:take_book(player)
將儲存的書歸還玩家物品欄,並從道具移除。
| 參數 | 類型 | 說明 |
|---|---|---|
player | 實體表格 | 接收書本的玩家 |
參考有效且取書已排隊時回傳 true,不保證有書。
請先確保物品欄有空位。加入物品前會刪除儲存紀錄,放不下的部分不會掉落。place_book 會序列化整個手持堆疊,再扣除一件物品,因此請使用正常的單本書。
prop:has_book()
只檢查底層盔甲座的 PDC 是否有書本鍵,不驗證序列化內容。不接受參數。
prop:drop_inventory()
排隊儲存開啟中的物品欄(若有),並為每位檢視者關閉它,接著讀取儲存的內容、刪除其 PDC 紀錄,並在道具位置掉落物品。到那一刻為止在開啟中物品欄所做的變更都會包含在內。刪除紀錄後若解碼失敗,可能沒有任何物品掉落。
不接受參數。底層盔甲座有效且掉落動作已排隊時回傳 true,不保證存在已儲存的物品。
prop:drop_book()
排隊將儲存的書掉落在道具位置。解碼前先移除儲存紀錄,因此解碼失敗可能導致書本遺失。
不接受參數。底層盔甲座有效且動作已排隊時回傳 true,不保證存在書本。
prop:set_persistent_data(key, value)
在道具盔甲座的 PersistentDataContainer 儲存字串。正常儲存世界和卸載區塊時,資料會隨該盔甲座保留。永久移除道具或換成放置用紙不會轉移這些資料。
| 參數 | 類型 | 說明 |
|---|---|---|
key | 字串 | 有效的 Bukkit 鍵後綴,可用小寫字母、數字和 ._-/。內部儲存為 fmm_lua_<key>;無效字元會報錯 |
value | 字串 | 儲存值;數字與布林值請使用 tostring() |
成功回傳 true,沒有底層盔甲座則回傳 false。
prop:get_persistent_data(key)
讀取由 set_persistent_data 儲存的字串;鍵不存在時回傳 nil。
| 參數 | 類型 | 說明 |
|---|---|---|
key | 字串 | 儲存時使用的鍵 |
範例:儲存切換狀態
return {
api_version = 1,
on_spawn = function(context)
local saved = context.prop:get_persistent_data("active")
context.state.active = saved == "true"
end,
on_right_click = function(context)
context.state.active = not context.state.active
context.prop:set_persistent_data("active", tostring(context.state.active))
end
}
物品效果
裝備物品的 context.item API 已停用。請用自訂附魔定義效果,再透過物品的 enchantments: 清單與含命名空間的 ID 關聯。
context.event
目前鉤子的事件資料,在道具點擊、投射物命中和一般區域鉤子中可用。on_spawn、on_game_tick、on_destroy 等沒有關聯事件或玩家的鉤子中為 nil。
FMM 點擊使用外掛自己的取消旗標控制道具預設行為。Lua 包裝層只公開下列欄位和方法。
欄位與方法
| 欄位或方法 | 類型 | 說明 |
|---|---|---|
event.player | 玩家實體表格 | 點擊道具或穿越監聽區域邊界的玩家。用於 on_left_click、on_right_click、on_zone_enter、on_zone_leave。在 on_projectile_hit 中則是射出投射物的生物實體(可能是怪物),射擊者不是生物實體時則不存在;詳見玩家實體方法 |
event.is_cancelled | 布林 | 建立上下文時的取消狀態,呼叫 cancel() 或 uncancel() 後不更新 |
event.cancel() | 函式 | 取消事件,阻止預設傷害或互動 |
event.uncancel() | 函式 | 恢復已取消的事件 |
cancel 和 uncancel 忽略所有傳入參數,因此 context.event.cancel() 與 context.event:cancel() 相同。本頁使用點號,兩種形式都能運作。
一般區域鉤子有玩家但沒有取消旗標,因此不存在 event.cancel() 和 event.uncancel(),且 event.is_cancelled 為 false。取消道具點擊會阻止 FMM 對應的預設操作。
event.is_cancelled 是初始快照。若要在同一鉤子後面記住取消狀態的變化,請用區域變數記錄。
事件表格不提供 Bukkit 專屬的 target、block、projectile 或 item。需要額外資訊時,請使用 context.player、context.event.player、context.projectile(在 on_projectile_hit 中)、player:get_target_entity(range)、context.world:raycast(...) 或附近實體查詢。
on_projectile_hit
當投射物擊中道具的碰撞箱時觸發,每個投射物觸發一次。
| 上下文值 | 說明 |
|---|---|
context.projectile | 投射物的實體表格(箭矢、三叉戟、雪球等)。僅在此鉤子中設定 |
context.event.player | 射出投射物的生物實體(若有) |
context.player | 射擊者是玩家時為該玩家,否則為 nil |
此鉤子在 FMM 處理完命中後才執行,而 FMM 對道具的預設投射物處理不會做任何事。在此呼叫 context.event.cancel() 無法阻止非穿透投射物因命中而消耗。若其他外掛已取消該命中,此鉤子不會觸發。
return {
api_version = 1,
on_projectile_hit = function(context)
local shooter = context.player
if shooter then
shooter:send_message("&eYou hit the target!")
end
context.prop:play_animation("hit", false, false)
end
}
範例:取消左鍵傷害
範例
return {
api_version = 1,
on_left_click = function(context)
if context.event then
context.event.cancel()
end
end
}
範例:檢查取消狀態
範例
return {
api_version = 1,
on_left_click = function(context)
if context.event and not context.event.is_cancelled then
context.event.cancel()
context.log:info("Damage cancelled!")
end
end
}
scheduler:run_later 與 scheduler:run_repeating 的回呼中,context.event 永遠為 nil。只能在事件鉤子執行期間修改事件。
context.world
這是 FMM/MagmaCore 的世界 API,完整說明見 context.world。
共用頁面的 get_block_at、set_block_at、spawn_particle、play_sound、strike_lightning、get_time、set_time、get_nearby_entities、get_nearby_players、spawn_entity、get_highest_block_y、raycast、place_temporary_block、drop_item、spawn_firework 在 FMM 中都能使用。MagmaCore 世界 API說明了偵測實體和方塊的 world:raycast()、暫時替換方塊的 world:place_temporary_block(),以及自訂煙火的 world:spawn_firework()。EliteMobs Boss 能力從相同基礎擴充出使用位置表格的 Boss、增援、下落方塊、暫時方塊等操作,詳見 EliteMobs 世界與環境。
FMM 專屬的世界擴充
FMM 加入三個可選的 EliteMobs 戰利品方法。它們永遠存在,但未安裝 EliteMobs 時會回傳 false,不執行操作。
| 方法 | 說明 |
|---|---|
world:drop_elitemobs_procedural_loot(player, level, location?) | 生成程序化戰利品。遵循 EliteMobs 的直接放入物品欄設定,放不下的物品掉落在玩家位置;否則使用指定位置。程序化掉落停用時回傳 false |
world:drop_elitemobs_random_loot(player, level, location?) | 依指定等級為玩家抽取 EliteMobs 戰利品表 |
world:drop_elitemobs_custom_loot(player, file, level, location?) | 掉落指定 EliteMobs 自訂物品。無法解析檔案時回傳 false |
完整簽章見 Lua API 參考。道具生成 Boss 的方法是前述 prop:spawn_elitemobs_boss(...)。
玩家實體方法
玩家表格來自 context.player、context.event.player 和 context.world:get_nearby_players()。MagmaCore 一般區域鉤子 on_zone_enter 與 on_zone_leave 會把進入或離開的玩家放入前兩個欄位。
FMM 使用共用頁面中的實體、生物實體、玩家與 UI 方法。EliteMobs Boss 能力使用相似但專用於 Boss 的表格,見 Boss 與實體。FMM 的完整欄位與方法見 MagmaCore Lua 引擎與玩家 UI 方法。player:get_target_entity() 的射線選取、player:get_eye_location()、player:get_look_direction()、向單一玩家顯示假方塊的 player:send_block_change() 以及 player:reset_block(),詳見玩家專屬方法。
FMM 專屬的實體欄位
LuaEntityEnricher 為 FMM 實體表格加入以下欄位。旗標與模型參考是建立表格時的快照;改變模型綁定後請重新取得實體表格。玩家的 has_permission 查詢目前權限,is_op 則是快照。
| 欄位 | 類型 | 說明 |
|---|---|---|
entity.is_modeled | 布林 | Bukkit 實體是 ModeledEntity 的底層實體時為 true |
entity.is_prop | 布林 | 實體是 PropEntity 的底層盔甲座時為 true |
entity.model | 表格或 nil | 只在 is_modeled = true 時提供 |
模型表格提供以下內容。
| 欄位或方法 | 說明 |
|---|---|
model.model_id | 藍圖模型名稱,例如 "dragon" |
model.is_dynamic | 附加到生物實體的 DynamicEntity 為 true |
model:play_animation(name, blend, loop) | 要求動畫;此整合的 blend 與 loop 預設皆為 false。true 表示接受要求,不證明已經顯示 |
model:stop_animations() | 清空佇列,有 idle 時回到該狀態,不中斷終止死亡狀態 |
model:remove() | 立即刪除模型實體及全部骨骼 |
on_right_click = function(context)
local player = context.event and context.event.player
if not player then return end
local target = player:get_target_entity(8)
if target and target.is_modeled then
target.model:play_animation("hurt", true, false)
end
end
EliteMobs 實體欄位
安裝 EliteMobs 後,FMM 透過其 enricher 提供以下欄位。
| 欄位 | 類型 | 說明 |
|---|---|---|
entity.is_elite | 布林 | 實體由 EliteMobs 追蹤時為 true |
entity.is_custom_boss | 布林 | 使用自訂 Boss 設定時為 true |
entity.is_significant_boss | 布林 | 自訂 Boss 的 healthMultiplier > 1 時為 true,用於排除有名稱的雜兵 |
entity.elite | 表格或 nil | 只在 is_elite = true 時提供,包含 level、name、health、max_health、health_multiplier、damage_multiplier、is_custom_boss 和 elite:remove() |
旗標與多數 elite 欄位是快照,health 和 max_health 在讀取時查詢。啟用 EliteMobs 時,entity:can_receive_hostile_effect(player_uuid) 在共用敵對目標檢查之後,還會執行 EliteMobs 的魔法目標授權檢查。配接器無法使用時會拒絕,不會把盟友當成獨立目標處理。
context.zones
FMM/MagmaCore 的區域 API 見 context.zones。EliteMobs Boss 能力使用另一個有原生區域定義的表格,詳見 EliteMobs 區域與目標選擇。
context.scheduler
FMM 和 EliteMobs NPC 腳本使用 MagmaCore 排程器。run_after、run_every、cancel_task 也是共用排程器的別名,兩套名稱皆可使用。Boss 能力透過專屬上下文提供相同別名。詳見 context.scheduler。
context.state
FMM、EliteMobs Boss 能力與 NPC 腳本共用此狀態 API,詳見 context.state。
context.log
FMM/MagmaCore 提供 info、warn、error。EliteMobs NPC 使用同一記錄器,Boss 能力提供 info、warn、debug。詳見 context.log。
context.cooldowns
FMM 與 EliteMobs NPC 使用共用的參數順序 check_local(key?, duration)。Boss 能力順序相同,但使用專屬儲存。詳見 context.cooldowns。
| 方法 | 說明 |
|---|---|
local_ready(key?) | 檢查本地冷卻是否就緒 |
local_remaining(key?) | 回傳本地剩餘 tick 數,沒有則為 0 |
check_local(key?, duration) | 以原子方式檢查並開始本地冷卻 |
set_local(duration, key?) | 不檢查,直接設定本地冷卻 |
global_ready() | 檢查腳本擁有者共用的全域冷卻 |
set_global(duration) | 設定全域冷卻 |
一般道具操作請用 context.cooldowns:check_local("my_key", 40)。
執行階段模型
每個腳本實例獨立執行
道具 scripts: 清單中的每個項目都有獨立 Lua 執行環境。FMM 註冊提供者時尋找並驗證原始碼,再為每個綁定在新沙箱中執行快取原始碼。修改或加入 Lua 檔案後,需要成功重新載入,新綁定才會使用變更。回呼依設定清單順序執行,解析出的 priority 不會重新排序。移除道具時會關閉其腳本實例。
物品附魔有獨立生命週期,不會為裝備物品建立道具腳本實例。
- 檔案範圍的區域變數只屬於目前實例。
- 即使用相同腳本檔案,
context.state也在實例之間完全隔離。
排程任務歸屬
context.scheduler 建立的任務屬於建立它的執行環境。移除道具時會執行以下步驟。
- 關閉執行環境。
- 自動取消所有一次性與重複任務。
- 清除所有區域監聽。
只有在道具被永久移除時(被拾取、被破壞、以 /fmm deleteall 刪除,或被外掛移除),才會先執行 on_destroy。當道具所在的區塊或世界卸載,或 FMM 重新載入或關閉時,執行環境會停止而不呼叫 on_destroy。區塊再次載入時,道具會以新的執行環境回來,並再次觸發 on_spawn。
冷卻範圍
共用引擎提供本地方法 local_ready、local_remaining、check_local、set_local,以及全域方法 global_ready、set_global。
| 腳本類型 | 本地範圍 | 全域範圍 |
|---|---|---|
| 道具腳本 | 每個 ScriptInstance,即道具與腳本檔案 | 每個 PropEntity,其所有綁定腳本共用 |
取消道具註冊,或在成功重新載入、停用時關閉腳本管理器,都會清除道具的全域冷卻。重新載入的準備遭拒時會保留目前執行環境。冷卻使用單調經過時間,每個指定 tick 換算成 50 毫秒;排程器延遲則遵循伺服器 tick,伺服器延遲時兩者可能不同。
執行預算
鉤子、排程回呼與腳本初始執行皆有硬性預算,由 Lua VM 內部在執行過程中限制。
| 限制 | 值 |
|---|---|
| 目前執行緒 CPU 時間 | 50 毫秒 |
| Lua 指令數 | 250,000 |
先達到的上限會以 Lua 錯誤終止呼叫,並停用腳本實例。訊息如下。
Lua instruction budget exceeded (250000 instruction limit)
Lua CPU-time budget exceeded (50ms current-thread CPU limit)
指令計數器能限制 while true do end 這類純 Lua 迴圈。時間在每 1,024 條 Lua 指令及呼叫回傳時檢查,無法中斷正在執行的阻塞 Java/Bukkit 方法。
CPU 時間不包括伺服器執行緒未獲排程的時段。JVM 無法提供目前執行緒 CPU 計時時,改用 250 毫秒經過時間,錯誤為 Lua elapsed-time fallback budget exceeded (250ms fallback; current-thread CPU time unavailable);250,000 條指令上限仍保留。
巢狀呼叫共用一份預算。鉤子呼叫回呼、回呼再呼叫其他函式時,整條鏈共用 50 毫秒 CPU 與 250,000 條指令。
尋找提供者時的執行會在註冊前拒絕無效定義。快取原始碼會對每個新實例再次執行,使用相同預算。
- 避免無界迴圈。
on_game_tick每 tick 執行,請保持輕量。- 使用
context.scheduler:run_repeating(...)將工作分散到多個 tick。
完整鉤子參考
下表為目前啟用的道具鉤子。context.event 表示 FMM 取消旗標或區域玩家;Lua 視情況提供 event.player、event.is_cancelled、event.cancel()、event.uncancel()。
八個有效道具鉤子
| 鉤子 | 觸發時機 | context.event |
|---|---|---|
on_spawn | 道具生成到世界,或隨其區塊再次載入 | nil |
on_game_tick | 每個伺服器 tick,20 TPS 時為 50 毫秒 | nil |
on_destroy | 道具被永久移除(區塊卸載或重新載入時不會觸發) | nil |
on_left_click | 玩家左鍵點擊道具 | 預設傷害取消旗標 |
on_right_click | 玩家右鍵點擊道具 | 預設互動取消旗標 |
on_zone_enter | 玩家進入監聽區域 | context.player / context.event.player,不可取消 |
on_zone_leave | 玩家離開監聽區域 | context.player / context.event.player,不可取消 |
on_projectile_hit | 投射物擊中道具 | 投射物命中事件;event.player 是射擊者。請參閱 on_projectile_hit |
物品效果
手持物品效果請使用自訂附魔。舊的 22 個物品鉤子已不是目前執行介面。
後續閱讀
EliteMobs 交通路線
context.world:start_elitemobs_transport(player, route_id) 為玩家啟動上下文世界中儲存的 EliteMobs 路線。回傳值表示要求是否被接受,需要 EliteMobs 與已載入的路線。ID 不包含 .yml。詳見交通路線。