退出¶
繼承樹:
┌─────────────┐
│DefaultObject│
└─────▲───────┘
│
┌─────┴─────┐
│DefaultExit│
└─────▲─────┘
│ ┌────────────┐
│ ┌─────►ObjectParent│
│ │ └────────────┘
┌─┴─┴┐
│Exit│
└────┘
請注意,出口是單向物件,因此為了使兩個房間雙向連結,需要有兩個出口。
名為 north 或 in 的物件可能是出口,以及 door、portal 或 jump out the window。
出口有兩個東西將它們與其他物件分開。
它們的
.destination屬性已設定並指向有效的目標位置。這一事實使得在資料庫中定位出口變得容易和快速。出口在建立時為其自身定義了一個特殊的傳輸指令。該指令的名稱與出口物件相同,並且在呼叫時將處理將角色移動到出口的
.destination的實用性 - 這允許您只需輸入出口的名稱即可四處移動,正如您所期望的那樣。
預設退出功能均在 DefaultExit typeclass 上定義。原則上你可以透過覆蓋這個來完全改變退出在你的遊戲中的工作方式 - 但不建議這樣做,除非你真的知道你在做什麼)。
使用稱為遍歷的access_type鎖定退出,並且還使用一些鉤子方法在遍歷失敗時提供回饋。 有關詳細資訊,請參閱 evennia.DefaultExit。
出口通常會根據具體情況進行覆蓋,但如果您想更改 dig、tunnel 或 open 等房間建立的預設出口,您可以在設定中更改它:
BASE_EXIT_TYPECLASS = "typeclasses.exits.Exit"
在mygame/typeclasses/exits.py中有一個空的Exit類供您修改。
退出詳情¶
遍歷出口的過程如下:
遍歷
obj傳送與 Exit 物件上的 Exit-command 名稱相符的指令。 cmdhandler 偵測到這一點並觸發在 Exit 上定義的指令。遍歷始終涉及「來源」(目前位置)和destination(儲存在 Exit 物件上)。Exit 指令檢查 Exit 物件上的
traverselockExit 指令在 Exit 物件上觸發
at_traverse(obj, destination)。在
at_traverse中,object.move_to(destination)被觸發。這將按順序觸發以下鉤子:obj.at_pre_move(destination)- 如果傳回 False,移動將中止。origin.at_pre_leave(obj, destination)obj.announce_move_from(destination)透過將
obj.location從來源位置變更為destination來執行移動。obj.announce_move_to(source)destination.at_object_receive(obj, source)obj.at_post_move(source)
在 Exit 物件上,
at_post_traverse(obj, source)被觸發。
如果移動因某種原因失敗,退出將在其自身上查詢 Attribute err_traverse 並將其顯示為錯誤訊息。如果沒有找到,Exit 將自行呼叫 at_failed_traverse(obj)。
在程式碼中建立退出¶
有關如何以程式設計方式建立退出的範例,請參閱本指南。