退出

繼承樹:

┌─────────────┐
│DefaultObject│
└─────▲───────┘
      │
┌─────┴─────┐
│DefaultExit│
└─────▲─────┘
      │       ┌────────────┐
      │ ┌─────►ObjectParent│
      │ │     └────────────┘
    ┌─┴─┴┐
    │Exit│
    └────┘

出口是遊戲中的物件,將其他物件(通常是房間)連線在一起。

請注意,出口是單向物件,因此為了使兩個房間雙向連結,需要有兩個出口。

名為 northin 的物件可能是出口,以及 doorportaljump out the window

出口有兩個東西將它們與其他物件分開。

  1. 它們的 .destination 屬性已設定並指向有效的目標位置。這一事實使得在資料庫中定位出口變得容易和快速。

  2. 出口在建立時為其自身定義了一個特殊的傳輸指令。該指令的名稱與出口物件相同,並且在呼叫時將處理將角色移動到出口的 .destination 的實用性 - 這允許您只需輸入出口的名稱即可四處移動,正如您所期望的那樣。

預設退出功能均在 DefaultExit typeclass 上定義。原則上你可以透過覆蓋這個來完全改變退出在你的遊戲中的工作方式 - 但不建議這樣做,除非你真的知道你在做什麼)。

使用稱為遍歷access_type鎖定退出,並且還使用一些鉤子方法在遍歷失敗時提供回饋。 有關詳細資訊,請參閱 evennia.DefaultExit

出口通常會根據具體情況進行覆蓋,但如果您想更改 digtunnelopen 等房間建立的預設出口,您可以在設定中更改它:

BASE_EXIT_TYPECLASS = "typeclasses.exits.Exit"

mygame/typeclasses/exits.py中有一個空的Exit類供您修改。

退出詳情

遍歷出口的過程如下:

  1. 遍歷 obj 傳送與 Exit 物件上的 Exit-command 名稱相符的指令。 cmdhandler 偵測到這一點並觸發在 Exit 上定義的指令。遍歷始終涉及「來源」(目前位置)和 destination(儲存在 Exit 物件上)。

  2. Exit 指令檢查 Exit 物件上的 traverse lock

  3. Exit 指令在 Exit 物件上觸發 at_traverse(obj, destination)

  4. at_traverse中,object.move_to(destination)被觸發。這將按順序觸發以下鉤子:

    1. obj.at_pre_move(destination) - 如果傳回 False,移動將中止。

    2. origin.at_pre_leave(obj, destination)

    3. obj.announce_move_from(destination)

    4. 透過將 obj.location 從來源位置變更為 destination 來執行移動。

    5. obj.announce_move_to(source)

    6. destination.at_object_receive(obj, source)

    7. obj.at_post_move(source)

  5. 在 Exit 物件上,at_post_traverse(obj, source) 被觸發。

如果移動因某種原因失敗,退出將在其自身上查詢 Attribute err_traverse 並將其顯示為錯誤訊息。如果沒有找到,Exit 將自行呼叫 at_failed_traverse(obj)

在程式碼中建立退出

有關如何以程式設計方式建立退出的範例,請參閱本指南