Tags¶
_標籤_是一種簡短的文字標籤,人們可以將其「附加」到物體上,以便對其進行組織、分組和快速查詢其屬性,類似於將標籤附加到行李上的方式。
> tag obj = tagname
obj.tags.add("mytag", category="foo")
obj.tags.get("mytag", category="foo")
from evennia import DefaultObject
from evennia import TagProperty, TagCategoryProperty
class Sword(DefaultObject):
# name of property is the tagkey, category as argument
can_be_wielded = TagProperty(category='combat')
has_sharp_edge = TagProperty(category='combat')
# name of property is the category, tag-keys are arguments
damage_type = TagCategoryProperty("piercing", "slashing")
crafting_element = TagCategoryProperty("blade", "hilt", "pommel")
在遊戲中,tags 由預設的 tag 指令控制:
> tag Chair = furniture
> tag Chair = furniture
> tag Table = furniture
> tag/search furniture
Chair, Sofa, Table
Evennia 實體可以由任意數量的 tags 標記。 Tags 比 屬性 更有效,因為在資料庫端,Tags 在具有該特定 tag 的所有物件之間_共享_。 tag 本身不具有值;相反,檢查的內容是 tag 本身是否存在 - 給定的對像要麼具有給定的 tag,要麼沒有。
在程式碼中,您可以使用型別分類實體上的 TagHandler (.tags) 來管理 Tags。您也可以透過 TagProperty(一個 tag,每行一個類別)或 TagCategoryProperty(一個類別,每行多個 tags)在類別層級上分配 Tags。這兩個都在底層使用了 TagHandler,它們只是在定義類別時新增 tags 的便捷方法。
上面的tags告訴我們Sword既鋒利又可以使用。如果這就是他們所做的一切,那麼他們可能只是一個普通的 Python 標誌。當tags變得重要時,如果有很多物件具有不同的tags組合。也許你有一個魔法咒語,可以讓城堡中所有鋒利的物體變鈍——無論是劍、匕首、矛還是菜刀!然後,您可以使用 has_sharp_edge tag 抓取所有物件。
另一個例子是天氣 script 影響所有標記為 outdoors 的房間或尋找標記為 belongs_to_fighter_guild tag 的所有字元。
在Evennia中,Tags在技術上也用於實現Aliases(物件的替代名稱)和Permissions(Locks檢查的簡單字串)。
別名和許可權¶
別名和許可權是使用正常的 TagHandlers 實現的,只需使用 a 即可節省 Tags
不同tagtype。這些處理程式在所有物件上都被命名為 aliases 和 permissions。他們是
使用方式與上面Tags相同:
boy.aliases.add("rascal")
boy.permissions.add("Builders")
boy.permissions.remove("Builders")
all_aliases = boy.aliases.all()
等等。與 tag 在遊戲中的工作方式類似,還有用於分配許可權的 perm 指令和用於別名的 @alias 指令。