Tags¶
> tag obj = tagname
obj.tags.add("mytag", category="foo")
obj.tags.get("mytag", category="foo")
from evennia import DefaultObject
from evennia import TagProperty
class Sword(DefaultObject):
can_be_wielded = TagProperty(category='combat')
has_sharp_edge = TagProperty(category='combat')
Tags are short text lables one can ‘hang’ on objects in order to organize, group and quickly find out their properties. An Evennia entity can be tagged by any number of tags. They are more efficient than Attributes since on the database-side, Tags are shared between all objects with that particular tag. A tag does not carry a value in itself; it either sits on the entity
Above, the tags inform us that the Sword
is both sharp and can be wielded. If that’s all they do, they could just be a normal Python flag. When tags become important is if there are a lot of objects with different combinations of tags. Maybe you have a magical spell that dulls all sharp-edged objects in the castle - whether sword, dagger, spear or kitchen knife! You can then just grab all objects with the has_sharp_edge
tag.
Another example would be a weather script affecting all rooms tagged as outdoors
or finding all characters tagged with belongs_to_fighter_guild
.
In Evennia, Tags are technically also used to implement Aliases
(alternative names for objects) and Permissions
(simple strings for Locks to check for).
Searching for objects with a given tag¶
Usually tags are used as a quick way to find tagged database entities. You can retrieve all objects with a given Tag like this in code:
import evennia
# all methods return Querysets
# search for objects
objs = evennia.search_tag("furniture")
objs2 = evennia.search_tag("furniture", category="luxurious")
dungeon = evennia.search_tag("dungeon#01")
forest_rooms = evennia.search_tag(category="forest")
forest_meadows = evennia.search_tag("meadow", category="forest")
magic_meadows = evennia.search_tag("meadow", category="magical")
# search for scripts
weather = evennia.search_tag_script("weather")
climates = evennia.search_tag_script(category="climate")
# search for accounts
accounts = evennia.search_tag_account("guestaccount")
Note that searching for just “furniture” will only return the objects tagged with the “furniture” tag that has a category of
None
. We must explicitly give the category to get the “luxurious” furniture.
Using any of the search_tag
variants will all return Django
Querysets, including if you only have
one match. You can treat querysets as lists and iterate over them, or continue building search
queries with them.
Remember when searching that not setting a category means setting it to None
- this does not
mean that category is undefined, rather None
is considered the default, unnamed category.
import evennia
myobj1.tags.add("foo") # implies category=None
myobj2.tags.add("foo", category="bar")
# this returns a queryset with *only* myobj1
objs = evennia.search_tag("foo")
# these return a queryset with *only* myobj2
objs = evennia.search_tag("foo", category="bar")
# or
objs = evennia.search_tag(category="bar")
There is also an in-game command that deals with assigning and using (Object-) tags:
@tag/search furniture
Using Aliases and Permissions¶
Aliases and Permissions are implemented using normal TagHandlers that simply save Tags with a
different tagtype
. These handlers are named aliases
and permissions
on all Objects. They are
used in the same way as Tags above:
boy.aliases.add("rascal")
boy.permissions.add("Builders")
boy.permissions.remove("Builders")
all_aliases = boy.aliases.all()
and so on. Similarly to how @tag
works in-game, there is also the @perm
command for assigning
permissions and @alias
command for aliases.
Assorted notes¶
Generally, tags are enough on their own for grouping objects. Having no tag category
is perfectly
fine and the normal operation. Simply adding a new Tag for grouping objects is often better than
making a new category. So think hard before deciding you really need to categorize your Tags.
That said, tag categories can be useful if you build some game system that uses tags. You can then use tag categories to make sure to separate tags created with this system from any other tags created elsewhere. You can then supply custom search methods that only find objects tagged with tags of that category. An example of this is found in the Zone tutorial.