@@ -155,11 +156,19 @@ import and inherit the ComponentHolderMixin, similar to this
# ...
-
Components need to inherit the Component class directly and require a name.
+
Components need to inherit the Component class and require a unique name.
+Components may inherit from other components but must specify another name.
+You can assign the same ‘slot’ to both components to have alternative implementations.
Keep in mind that all components must be imported to be visible in the listing.
@@ -239,6 +251,14 @@ You only need to import each module/file from there but importing the right clas
Assigning mutable default values such as a list to a DBField will share it across instances.
+To avoid this, you must set autocreate=True on the field, like this.
Source code for evennia.contrib.base_systems.components
-"""
-Components - ChrisLR 2022
-
-This is a basic Component System.
-It allows you to use components on typeclasses using a simple syntax.
-This helps writing isolated code and reusing it over multiple objects.
-
-See the docs for more information.
-"""
-
-fromevennia.contrib.base_systems.components.componentimportComponent
-fromevennia.contrib.base_systems.components.dbfieldimportDBField,NDBField,TagField
-fromevennia.contrib.base_systems.components.holderimport(
- ComponentHolderMixin,
- ComponentProperty,
-)
-
-
-
[docs]defget_component_class(component_name):
- subclasses=Component.__subclasses__()
- component_class=next((scforscinsubclassesifsc.name==component_name),None)
- ifcomponent_classisNone:
- message=(
- f"Component named {component_name} has not been found. "
- f"Make sure it has been imported before being used."
- )
- raiseException(message)
-
- returncomponent_class
@@ -94,10 +93,41 @@
This file contains the base class to inherit for creating new components."""
-importitertools
+
+fromevennia.commands.cmdsetimportCmdSet
+fromevennia.contrib.base_systems.componentsimportCOMPONENT_LISTING,exceptions
-
[docs]classBaseComponent(type):
+"""
+ This is the metaclass for components,
+ responsible for registering components to the listing.
+ """
+ @classmethod
+ def__new__(cls,*args):
+"""
+ Every class that uses this metaclass will be registered
+ as a component in the Component Listing using its name.
+ All of them require a unique name.
+ """
+ new_type=super().__new__(*args)
+ ifnew_type.__base__==object:
+ returnnew_type
+
+ name=getattr(new_type,"name",None)
+ ifnotname:
+ raiseValueError(f"Component {new_type} requires a name.")
+
+ ifexisting_type:=COMPONENT_LISTING.get(name):
+ ifnotstr(new_type)==str(existing_type):
+ raiseValueError(f"Component name {name} is a duplicate, must be unique.")
+ else:
+ COMPONENT_LISTING[name]=new_type
+
+ returnnew_type
+
+
+
[docs]classComponent(metaclass=BaseComponent):""" This is the base class for components. Any component must inherit from this class to be considered for usage.
@@ -105,10 +135,15 @@
Each Component must supply the name, it is used as a slot name but also part of the attribute key. """
+ __slots__=('host',)
+
name=""
+ slot=None
+
+ _fields={}
[docs]def__init__(self,host=None):
- assertself.name,"All Components must have a Name"
+ assertself.name,"All Components must have a name"self.host=host
[docs]@classmethod
@@ -152,8 +187,8 @@
""" This deletes all component attributes from the host's db """
- forattributeinself._all_db_field_names:
- delattr(self,attribute)
[docs]@classmethoddefload(cls,host):
@@ -168,7 +203,6 @@
Component: The loaded instance of the component """
-
returncls(host)
[docs]defat_added(self,host):
@@ -179,12 +213,8 @@
host (object): The host typeclass instance """
-
- ifself.host:
- ifself.host==host:
- return
- else:
- raiseComponentRegisterError("Components must not register twice!")
+ ifself.hostandself.host!=host:
+ raiseexceptions.InvalidComponentError("Components must not register twice!")self.host=host
@@ -197,7 +227,8 @@
"""ifhost!=self.host:
- raiseComponentRegisterError("Component attempted to remove from the wrong host.")
+ raiseValueError("Component attempted to remove from the wrong host.")
+
self.host=None
@@ -94,8 +93,13 @@
This file contains the Descriptors used to set Fields in Components"""
+importtyping
+
fromevennia.typeclasses.attributesimportAttributeProperty,NAttributeProperty
+iftyping.TYPE_CHECKING:
+ fromevennia.contrib.base_systems.componentsimportComponent
+
[docs]classDBField(AttributeProperty):"""
@@ -104,21 +108,40 @@
It uses AttributeProperty under the hood but prefixes the key with the component name. """
- def__set_name__(self,owner,name):
+
+
+ def__set_name__(self,owner:'Component',name):""" Called when descriptor is first assigned to the class. Args:
- owner (object): The component classF on which this is set
+ owner (Component): The component classF on which this is set name (str): The name that was used to set the DBField. """
- key=f"{owner.name}::{name}"
- self._key=key
- db_fields=getattr(owner,"_db_fields",None)
- ifdb_fieldsisNone:
- db_fields={}
- setattr(owner,"_db_fields",db_fields)
- db_fields[name]=self
[docs]defat_added(self,component):
+"""
+ Called when the parent component is added to a host.
+
+ Args:
+ component (Component): The component instance being added.
+ """
+
+ ifself._autocreate:
+ self.__get__(component,type(component))
+
+
[docs]defat_removed(self,component):
+"""
+ Called when the parent component is removed from a host.
+
+ Args:
+ component (Component): The component instance being removed.
+ """
+
+ self.__delete__(component)
[docs]classNDBField(NAttributeProperty):
@@ -128,21 +151,35 @@
It uses NAttributeProperty under the hood but prefixes the key with the component name. """
- def__set_name__(self,owner,name):
+ def__set_name__(self,owner:'Component',name):""" Called when descriptor is first assigned to the class. Args:
- owner (object): The component class on which this is set
+ owner (Component): The component class on which this is set name (str): The name that was used to set the DBField. """
- key=f"{owner.name}::{name}"
- self._key=key
- ndb_fields=getattr(owner,"_ndb_fields",None)
- ifndb_fieldsisNone:
- ndb_fields={}
- setattr(owner,"_ndb_fields",ndb_fields)
- ndb_fields[name]=self
[docs]defat_added(self,component):
+"""
+ Called when the parent component is added to a host.
+
+ Args:
+ component (Component): The component instance being added.
+ """
+ ifself._autocreate:
+ self.__set__(component,self._default)
+
+
[docs]defat_removed(self,component):
+"""
+ Called when the parent component is removed from a host.
+
+ Args:
+ component (Component): The component instance being removed.
+ """
+ self.__delete__(component)
- def__set_name__(self,owner,name):
+ def__set_name__(self,owner:'Component',name):""" Called when TagField is first assigned to the class. It is called with the component class and the name of the field. """
- self._category_key=f"{owner.name}::{name}"
- tag_fields=getattr(owner,"_tag_fields",None)
- iftag_fieldsisNone:
- tag_fields={}
- setattr(owner,"_tag_fields",tag_fields)
- tag_fields[name]=self
+ self._category_key=f"{owner.get_component_slot()}::{name}"
+ owner.add_field(name,self)def__get__(self,instance,owner):"""
@@ -204,7 +237,26 @@
Used when 'del' is called on the TagField. It is called with the component instance. """
- instance.host.tags.clear(category=self._category_key)
+ instance.host.tags.clear(category=self._category_key)
+
+
[docs]defat_added(self,component):
+"""
+ Called when the parent component is added to a host.
+
+ Args:
+ component (Component): The component instance being added.
+ """
+ ifself._default:
+ self.__set__(component,self._default)
+
+
[docs]defat_removed(self,component):
+"""
+ Called when the parent component is removed from a host.
+
+ Args:
+ component (Component): The component instance being removed.
+ """
+ self.__delete__(component)
[docs]def__init__(self,name,**kwargs):""" Initializes the descriptor Args:
- component_name (str): The name of the component
+ name (str): The name of the component **kwargs (any): Key=Values overriding default values of the component """
- self.component_name=component_name
- self.values=kwargs
def__get__(self,instance,owner):
- component=instance.components.get(self.component_name)
+ ifnotself.component_class:
+ component_class=get_component_class(self.name)
+ self.component_class=component_class
+ self.slot_name=component_class.get_component_slot()
+
+ component=instance.components.get(self.slot_name)returncomponentdef__set__(self,instance,value):
@@ -128,13 +134,11 @@
def__set_name__(self,owner,name):# Retrieve the class_components set on the direct class only
- class_components=owner.__dict__.get("_class_components")
+ class_components=owner.__dict__.get("_class_components",[])ifnotclass_components:
- # Create a new list, including inherited class components
- class_components=list(getattr(owner,"_class_components",[]))setattr(owner,"_class_components",class_components)
- class_components.append((self.component_name,self.values))
[docs]defadd(self,component:components.Component):""" Method to add a Component to a host. It caches the loaded component and appends its name to the host's component name list.
@@ -158,16 +162,19 @@
component (object): The 'loaded' component instance to add. """
+ component_name=component.name
+ self.db_names.append(component_name)
+ self.host.tags.add(component_name,category="components")self._set_component(component)
- self.db_names.append(component.name)
- self._add_component_tags(component)
- component.at_added(self.host)
- self.host.signals.add_object_listeners_and_responders(component)
[docs]defadd_default(self,name):""" Method to add a Component initialized to default values on a host.
- It will retrieve the proper component and instanciate it with 'default_create'.
+ It will retrieve the proper component and instantiate it with 'default_create'. It will cache this new component and add it to its list. It will also call the component's 'at_added' method, passing its host.
@@ -175,33 +182,11 @@
name (str): The name of the component class to add. """
- component=components.get_component_class(name)
- ifnotcomponent:
- raiseComponentDoesNotExist(f"Component {name} does not exist.")
+ component_class=components.get_component_class(name)
+ component_instance=component_class.default_create(self.host)
+ self.add(component_instance)
- new_component=component.default_create(self.host)
- self._set_component(new_component)
- self.db_names.append(name)
- self._add_component_tags(new_component)
- new_component.at_added(self.host)
- self.host.signals.add_object_listeners_and_responders(new_component)
-
- def_add_component_tags(self,component):
-"""
- Private method that adds the Tags set on a Component via TagFields
- It will also add the name of the component so objects can be filtered
- by the components the implement.
-
- Args:
- component (object): The component instance that is added.
- """
- self.host.tags.add(component.name,category="components")
- fortag_field_nameincomponent.tag_field_names:
- default_tag=type(component).__dict__[tag_field_name]._default
- ifdefault_tag:
- setattr(component,tag_field_name,default_tag)
-
-
[docs]defremove(self,component:components.Component):""" Method to remove a component instance from a host. It removes the component from the cache and listing.
@@ -211,18 +196,24 @@
component (object): The component instance to remove. """
- component_name=component.name
- ifcomponent_nameinself._loaded_components:
- self._remove_component_tags(component)
- component.at_removed(self.host)
- self.db_names.remove(component_name)
- self.host.signals.remove_object_listeners_and_responders(component)
- delself._loaded_components[component_name]
- else:
+ name=component.name
+ slot_name=component.get_component_slot()
+ ifnotself.has(slot_name):message=(
- f"Cannot remove {component_name} from {self.host.name} as it is not registered."
+ f"Cannot remove {name} from {self.host.name} as it is not registered.")
- raiseComponentIsNotRegistered(message)
[docs]defremove_by_name(self,name):"""
@@ -231,49 +222,25 @@
It will call the component's 'at_removed' method. Args:
- name (str): The name of the component to remove.
+ name (str): The name of the component to remove or its slot. """instance=self.get(name)ifnotinstance:message=f"Cannot remove {name} from {self.host.name} as it is not registered."
- raiseComponentIsNotRegistered(message)
+ raiseexceptions.ComponentIsNotRegistered(message)
- self._remove_component_tags(instance)
- instance.at_removed(self.host)
- self.host.signals.remove_object_listeners_and_responders(instance)
- self.db_names.remove(name)
+ self.remove(instance)
- delself._loaded_components[name]
-
- def_remove_component_tags(self,component):
-"""
- Private method that will remove the Tags set on a Component via TagFields
- It will also remove the component name tag.
-
- Args:
- component (object): The component instance that is removed.
- """
- self.host.tags.remove(component.name,category="components")
- fortag_field_nameincomponent.tag_field_names:
- delattr(component,tag_field_name)
-
-
[docs]defget(self,name):
-"""
- Method to retrieve a cached Component instance by its name.
-
- Args:
- name (str): The name of the component to retrieve.
-
- """
+
[docs]defhas(self,name:str)->bool:""" Method to check if a component is registered and ready. Args:
- name (str): The name of the component.
+ name (str): The name of the component or the slot. """returnnameinself._loaded_components
@@ -294,26 +261,35 @@
ifcomponent:component_instance=component.load(self.host)self._set_component(component_instance)
- self.host.signals.add_object_listeners_and_responders(component_instance)else:message=(f"Could not initialize runtime component {component_name} of {self.host.name}")
- raiseComponentDoesNotExist(message)
+ raiseexceptions.ComponentDoesNotExist(message)
def_set_component(self,component):
- self._loaded_components[component.name]=component
+"""
+ Sets the loaded component in this instance.
+ """
+ slot_name=component.get_component_slot()
+ self._loaded_components[slot_name]=component
+ self.host.signals.add_object_listeners_and_responders(component)@propertydefdb_names(self):"""
- Property shortcut to retrieve the registered component names
+ Property shortcut to retrieve the registered component keys Returns: component_names (iterable): The name of each component that is registered """
- returnself.host.attributes.get("component_names")
+ names=self.host.attributes.get("component_names")
+ ifnamesisNone:
+ self.host.db.component_names=[]
+ names=self.host.db.component_names
+
+ returnnamesdef__getattr__(self,name):returnself.get(name)
@@ -327,7 +303,6 @@
All registered components are initialized on the typeclass. They will be of None value if not present in the class components or runtime components. """
-
[docs]defat_init(self):""" Method that initializes the ComponentHandler.
@@ -352,28 +327,16 @@
components that were set on the typeclass using ComponentProperty. """super().basetype_setup()
- component_names=[]setattr(self,"_component_handler",ComponentHandler(self))setattr(self,"_signal_handler",signals.SignalsHandler(self))
- class_components=getattr(self,"_class_components",())
+ class_components=self._get_class_components()forcomponent_name,valuesinclass_components:component_class=components.get_component_class(component_name)component=component_class.create(self,**values)
- component_names.append(component_name)
- self.components._loaded_components[component_name]=component
- self.signals.add_object_listeners_and_responders(component)
+ self.components.add(component)
- self.db.component_names=component_namesself.signals.trigger("at_basetype_setup")
-
[docs]defbasetype_posthook_setup(self):
-"""
- Method that add component related tags that were set using ComponentProperty.
- """
- super().basetype_posthook_setup()
- forcomponentinself.components._loaded_components.values():
- self.components._add_component_tags(component)
diff --git a/docs/latest/_sources/Coding/Changelog.md.txt b/docs/latest/_sources/Coding/Changelog.md.txt
index 0a8e5e399d..c7331c75be 100644
--- a/docs/latest/_sources/Coding/Changelog.md.txt
+++ b/docs/latest/_sources/Coding/Changelog.md.txt
@@ -9,9 +9,21 @@
- [Fix] `services` command with no args would traceback (regression) (Griatch)
- [Feature][pull3412]: Make it possible to add custom webclient css in
`webclient/css/custom.css`, same as for website (InspectorCaracal)
+- [Fix][pull3423]: Fix wilderness contrib error moving to an already existing
+ wilderness room (InspectorCaracal)
+- [Fix][pull3425]: Don't always include example the crafting recipe when
+ using the crafting contrib (InspectorCaracal)
+- [pull3426]: Traceback banning a channel using with only one nick
+ (InspectorCaracal)
+- [pull3434]: Adjust lunr search weights to void clashing of cmd-aliases over
+ keys which caused some help entries to shadow others (InspectorCaracal)
- Doc fixes (InspectorCaracal, Griatch)
[pull3412]: https://github.com/evennia/evennia/pull/3412
+[pull3423]: https://github.com/evennia/evennia/pull/3423
+[pull3425]: https://github.com/evennia/evennia/pull/3425
+[pull3426]: https://github.com/evennia/evennia/pull/3426
+[pull3434]: https://github.com/evennia/evennia/pull/3434
## Evennia 3.1.1
diff --git a/docs/latest/_sources/Contribs/Contrib-Components.md.txt b/docs/latest/_sources/Contribs/Contrib-Components.md.txt
index 2e12a11cef..521d10c44a 100644
--- a/docs/latest/_sources/Contribs/Contrib-Components.md.txt
+++ b/docs/latest/_sources/Contribs/Contrib-Components.md.txt
@@ -30,12 +30,20 @@ class Character(ComponentHolderMixin, DefaultCharacter):
# ...
```
-Components need to inherit the Component class directly and require a name.
+Components need to inherit the Component class and require a unique name.
+Components may inherit from other components but must specify another name.
+You can assign the same 'slot' to both components to have alternative implementations.
```python
from evennia.contrib.base_systems.components import Component
+
class Health(Component):
name = "health"
+
+
+class ItemHealth(Health):
+ name = "item_health"
+ slot = "health"
```
Components may define DBFields or NDBFields at the class level.
@@ -103,7 +111,10 @@ character.components.add(vampirism)
...
-vampirism_from_elsewhere = character.components.get("vampirism")
+vampirism = character.components.get("vampirism")
+
+# Alternatively
+vampirism = character.cmp.vampirism
```
Keep in mind that all components must be imported to be visible in the listing.
@@ -128,6 +139,14 @@ from typeclasses.components import health
```
Both of the above examples will work.
+## Known Issues
+
+Assigning mutable default values such as a list to a DBField will share it across instances.
+To avoid this, you must set autocreate=True on the field, like this.
+```python
+health = DBField(default=[], autocreate=True)
+```
+
## Full Example
```python
from evennia.contrib.base_systems import components
diff --git a/docs/latest/api/evennia.commands.default.account.html b/docs/latest/api/evennia.commands.default.account.html
index e86f477900..375f6c988e 100644
--- a/docs/latest/api/evennia.commands.default.account.html
+++ b/docs/latest/api/evennia.commands.default.account.html
@@ -145,7 +145,7 @@ method. Otherwise all text will be returned to all connected sessions.
-search_index_entry = {'aliases': 'pemit remit', 'category': 'admin', 'key': 'emit', 'no_prefix': ' pemit remit', 'tags': '', 'text': '\n admin command for emitting message to multiple objects\n\n Usage:\n emit[/switches] [<obj>, <obj>, ... =] <message>\n remit [<obj>, <obj>, ... =] <message>\n pemit [<obj>, <obj>, ... =] <message>\n\n Switches:\n room - limit emits to rooms only (default)\n accounts - limit emits to accounts only\n contents - send to the contents of matched objects too\n\n Emits a message to the selected objects or to\n your immediate surroundings. If the object is a room,\n send to its contents. remit and pemit are just\n limited forms of emit, for sending to rooms and\n to accounts respectively.\n '}¶
+search_index_entry = {'aliases': 'remit pemit', 'category': 'admin', 'key': 'emit', 'no_prefix': ' remit pemit', 'tags': '', 'text': '\n admin command for emitting message to multiple objects\n\n Usage:\n emit[/switches] [<obj>, <obj>, ... =] <message>\n remit [<obj>, <obj>, ... =] <message>\n pemit [<obj>, <obj>, ... =] <message>\n\n Switches:\n room - limit emits to rooms only (default)\n accounts - limit emits to accounts only\n contents - send to the contents of matched objects too\n\n Emits a message to the selected objects or to\n your immediate surroundings. If the object is a room,\n send to its contents. remit and pemit are just\n limited forms of emit, for sending to rooms and\n to accounts respectively.\n '}¶
diff --git a/docs/latest/api/evennia.commands.default.building.html b/docs/latest/api/evennia.commands.default.building.html
index 45128ed884..97a03caa3e 100644
--- a/docs/latest/api/evennia.commands.default.building.html
+++ b/docs/latest/api/evennia.commands.default.building.html
@@ -1409,7 +1409,7 @@ server settings.
-search_index_entry = {'aliases': '@type @typeclasses @parent @swap @update', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass type typeclasses parent swap update', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}¶
+search_index_entry = {'aliases': '@type @swap @typeclasses @parent @update', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass type swap typeclasses parent update', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}¶
@@ -1595,7 +1595,7 @@ If object is not specified, the current location is examined.
@@ -1868,7 +1868,7 @@ the cases, see the module doc.
-search_index_entry = {'aliases': '@ex @exam', 'category': 'building', 'key': '@examine', 'no_prefix': 'examine ex exam', 'tags': '', 'text': '\n get detailed information about an object\n\n Usage:\n examine [<object>[/attrname]]\n examine [*<account>[/attrname]]\n\n Switch:\n account - examine an Account (same as adding *)\n object - examine an Object (useful when OOC)\n script - examine a Script\n channel - examine a Channel\n\n The examine command shows detailed game info about an\n object and optionally a specific attribute on it.\n If object is not specified, the current location is examined.\n\n Append a * before the search string to examine an account.\n\n '}¶
+search_index_entry = {'aliases': '@exam @ex', 'category': 'building', 'key': '@examine', 'no_prefix': 'examine exam ex', 'tags': '', 'text': '\n get detailed information about an object\n\n Usage:\n examine [<object>[/attrname]]\n examine [*<account>[/attrname]]\n\n Switch:\n account - examine an Account (same as adding *)\n object - examine an Object (useful when OOC)\n script - examine a Script\n channel - examine a Channel\n\n The examine command shows detailed game info about an\n object and optionally a specific attribute on it.\n If object is not specified, the current location is examined.\n\n Append a * before the search string to examine an account.\n\n '}¶
-search_index_entry = {'aliases': '@search @locate', 'category': 'building', 'key': '@find', 'no_prefix': 'find search locate', 'tags': '', 'text': '\n search the database for objects\n\n Usage:\n find[/switches] <name or dbref or *account> [= dbrefmin[-dbrefmax]]\n locate - this is a shorthand for using the /loc switch.\n\n Switches:\n room - only look for rooms (location=None)\n exit - only look for exits (destination!=None)\n char - only look for characters (BASE_CHARACTER_TYPECLASS)\n exact - only exact matches are returned.\n loc - display object location if exists and match has one result\n startswith - search for names starting with the string, rather than containing\n\n Searches the database for an object of a particular name or exact #dbref.\n Use *accountname to search for an account. The switches allows for\n limiting object matches to certain game entities. Dbrefmin and dbrefmax\n limits matches to within the given dbrefs range, or above/below if only\n one is given.\n '}¶
+search_index_entry = {'aliases': '@locate @search', 'category': 'building', 'key': '@find', 'no_prefix': 'find locate search', 'tags': '', 'text': '\n search the database for objects\n\n Usage:\n find[/switches] <name or dbref or *account> [= dbrefmin[-dbrefmax]]\n locate - this is a shorthand for using the /loc switch.\n\n Switches:\n room - only look for rooms (location=None)\n exit - only look for exits (destination!=None)\n char - only look for characters (BASE_CHARACTER_TYPECLASS)\n exact - only exact matches are returned.\n loc - display object location if exists and match has one result\n startswith - search for names starting with the string, rather than containing\n\n Searches the database for an object of a particular name or exact #dbref.\n Use *accountname to search for an account. The switches allows for\n limiting object matches to certain game entities. Dbrefmin and dbrefmax\n limits matches to within the given dbrefs range, or above/below if only\n one is given.\n '}¶
diff --git a/docs/latest/api/evennia.commands.default.comms.html b/docs/latest/api/evennia.commands.default.comms.html
index 39be8775a2..3a319d4365 100644
--- a/docs/latest/api/evennia.commands.default.comms.html
+++ b/docs/latest/api/evennia.commands.default.comms.html
@@ -268,7 +268,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
-search_index_entry = {'aliases': '@channels @chan', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel channels chan', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
+search_index_entry = {'aliases': '@chan @channels', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel chan channels', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
@@ -946,7 +946,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
@@ -966,7 +966,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
-search_index_entry = {'aliases': '@channels @chan', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel channels chan', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
+search_index_entry = {'aliases': '@chan @channels', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel chan channels', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
-search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\n '}¶
+search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\n '}¶
@@ -610,7 +610,7 @@ placing it in their inventory.
@@ -641,7 +641,7 @@ placing it in their inventory.
-search_index_entry = {'aliases': '" \'', 'category': 'general', 'key': 'say', 'no_prefix': ' " \'', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
+search_index_entry = {'aliases': '\' "', 'category': 'general', 'key': 'say', 'no_prefix': ' \' "', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
@@ -721,7 +721,7 @@ automatically begin with your name.
-search_index_entry = {'aliases': 'emote :', 'category': 'general', 'key': 'pose', 'no_prefix': ' emote :', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n "}¶
+search_index_entry = {'aliases': ': emote', 'category': 'general', 'key': 'pose', 'no_prefix': ' : emote', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n "}¶
diff --git a/docs/latest/api/evennia.commands.default.system.html b/docs/latest/api/evennia.commands.default.system.html
index 3da57e3e28..537be7e371 100644
--- a/docs/latest/api/evennia.commands.default.system.html
+++ b/docs/latest/api/evennia.commands.default.system.html
@@ -695,7 +695,7 @@ See |luhttps://ww
@@ -741,7 +741,7 @@ to all the variables defined therein.
-search_index_entry = {'aliases': '@delays @task', 'category': 'system', 'key': '@tasks', 'no_prefix': 'tasks delays task', 'tags': '', 'text': "\n Display or terminate active tasks (delays).\n\n Usage:\n tasks[/switch] [task_id or function_name]\n\n Switches:\n pause - Pause the callback of a task.\n unpause - Process all callbacks made since pause() was called.\n do_task - Execute the task (call its callback).\n call - Call the callback of this task.\n remove - Remove a task without executing it.\n cancel - Stop a task from automatically executing.\n\n Notes:\n A task is a single use method of delaying the call of a function. Calls are created\n in code, using `evennia.utils.delay`.\n See |luhttps://www.evennia.com/docs/latest/Command-Duration.html|ltthe docs|le for help.\n\n By default, tasks that are canceled and never called are cleaned up after one minute.\n\n Examples:\n - `tasks/cancel move_callback` - Cancels all movement delays from the slow_exit contrib.\n In this example slow exits creates it's tasks with\n `utils.delay(move_delay, move_callback)`\n - `tasks/cancel 2` - Cancel task id 2.\n\n "}¶
+search_index_entry = {'aliases': '@task @delays', 'category': 'system', 'key': '@tasks', 'no_prefix': 'tasks task delays', 'tags': '', 'text': "\n Display or terminate active tasks (delays).\n\n Usage:\n tasks[/switch] [task_id or function_name]\n\n Switches:\n pause - Pause the callback of a task.\n unpause - Process all callbacks made since pause() was called.\n do_task - Execute the task (call its callback).\n call - Call the callback of this task.\n remove - Remove a task without executing it.\n cancel - Stop a task from automatically executing.\n\n Notes:\n A task is a single use method of delaying the call of a function. Calls are created\n in code, using `evennia.utils.delay`.\n See |luhttps://www.evennia.com/docs/latest/Command-Duration.html|ltthe docs|le for help.\n\n By default, tasks that are canceled and never called are cleaned up after one minute.\n\n Examples:\n - `tasks/cancel move_callback` - Cancels all movement delays from the slow_exit contrib.\n In this example slow exits creates it's tasks with\n `utils.delay(move_delay, move_callback)`\n - `tasks/cancel 2` - Cancel task id 2.\n\n "}¶
diff --git a/docs/latest/api/evennia.commands.default.tests.html b/docs/latest/api/evennia.commands.default.tests.html
index f0de7d8ba8..cc874c24ed 100644
--- a/docs/latest/api/evennia.commands.default.tests.html
+++ b/docs/latest/api/evennia.commands.default.tests.html
@@ -973,7 +973,7 @@ main test suite started with
Test the batch processor.
-red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmpuchruimt/772d4c21b5716c3f29d3307f2a078439169ae53c/evennia/contrib/tutorials/red_button/red_button.py'>¶
+red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmppnsswh9b/0edcebea0fdd67c4ba5c58f3b0d589b02a6bea3e/evennia/contrib/tutorials/red_button/red_button.py'>¶
@@ -169,7 +169,7 @@ there is no object yet before the account has logged in)
-search_index_entry = {'aliases': 'con conn co', 'category': 'general', 'key': 'connect', 'no_prefix': ' con conn co', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect "account name" "pass word"\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶
+search_index_entry = {'aliases': 'co conn con', 'category': 'general', 'key': 'connect', 'no_prefix': ' co conn con', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect "account name" "pass word"\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶
-search_index_entry = {'aliases': 'cr cre', 'category': 'general', 'key': 'create', 'no_prefix': ' cr cre', 'tags': '', 'text': '\n create a new account account\n\n Usage (at login screen):\n create <accountname> <password>\n create "account name" "pass word"\n\n This creates a new account account.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶
+search_index_entry = {'aliases': 'cre cr', 'category': 'general', 'key': 'create', 'no_prefix': ' cre cr', 'tags': '', 'text': '\n create a new account account\n\n Usage (at login screen):\n create <accountname> <password>\n create "account name" "pass word"\n\n This creates a new account account.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶
@@ -304,7 +304,7 @@ All it does is display the connect screen.
@@ -330,7 +330,7 @@ All it does is display the connect screen.
-search_index_entry = {'aliases': 'look l', 'category': 'general', 'key': '__unloggedin_look_command', 'no_prefix': ' look l', 'tags': '', 'text': '\n look when in unlogged-in state\n\n Usage:\n look\n\n This is an unconnected version of the look command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}¶
+search_index_entry = {'aliases': 'l look', 'category': 'general', 'key': '__unloggedin_look_command', 'no_prefix': ' l look', 'tags': '', 'text': '\n look when in unlogged-in state\n\n Usage:\n look\n\n This is an unconnected version of the look command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}¶
@@ -353,7 +353,7 @@ for simplicity. It shows a pane of info.
@@ -379,7 +379,7 @@ for simplicity. It shows a pane of info.
-search_index_entry = {'aliases': '? h', 'category': 'general', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶
+search_index_entry = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶
Component Attribute Descriptor.
Allows you to set attributes related to a component on the class.
It uses AttributeProperty under the hood but prefixes the key with the component name.
Allows for specifying Attributes as Django-like ‘fields’ on the class level. Note that while
+one can set a lock on the Attribute, there is no way to check said lock when accessing via
+the property - use the full AttributeHandler if you need to do access checks. Note however
+that if you use the full AttributeHandler to access this Attribute, the at_get/at_set
+methods on this class will _not_ fire (because you are bypassing the AttributeProperty
+entirely in that case).
+
Initialize an Attribute as a property descriptor.
+
+
Keyword Arguments
+
+
default (any) – A default value if the attr is not set. If a callable, this will be
+run without any arguments and is expected to return the default value.
+
category (str) – The attribute’s category. If unset, use class default.
+
strattr (bool) – If set, this Attribute must be a simple string, and will be
+stored more efficiently.
+
lockstring (str) – This is not itself useful with the property, but only if
+using the full AttributeHandler.get(accessing_obj=…) to access the
+Attribute.
+
autocreate (bool) – True by default; this means Evennia makes sure to create a new
+copy of the Attribute (with the default value) whenever a new object with this
+property is created. If False, no Attribute will be created until the property
+is explicitly assigned a value. This makes it more efficient while it retains
+its default (there’s no db access), but without an actual Attribute generated,
+one cannot access it via .db, the AttributeHandler or see it with examine.
Called when the parent component is removed from a host.
+
+
Parameters
+
component (Component) – The component instance being removed.
+
+
+
+
@@ -133,6 +192,28 @@ It uses AttributeProperty under the hood but prefixes the key with the component
Component In-Memory Attribute Descriptor.
Allows you to set in-memory attributes related to a component on the class.
It uses NAttributeProperty under the hood but prefixes the key with the component name.
This allows you to register a component on a typeclass.
Components registered with this property are automatically added
@@ -127,12 +127,12 @@ to any instance of this typeclass.
Defaults can be overridden for this typeclass by passing kwargs
Method to add a Component to a host.
It caches the loaded component and appends its name to the host’s component name list.
It will also call the component’s ‘at_added’ method, passing its host.
@@ -171,7 +171,7 @@ It will also call the component’s ‘at_added’ method, passing its host.
Method to add a Component initialized to default values on a host.
-It will retrieve the proper component and instanciate it with ‘default_create’.
+It will retrieve the proper component and instantiate it with ‘default_create’.
It will cache this new component and add it to its list.
It will also call the component’s ‘at_added’ method, passing its host.
@@ -183,7 +183,7 @@ It will also call the component’s ‘at_added’ method, passing its host.
Method to remove a component instance from a host.
It removes the component from the cache and listing.
It will call the component’s ‘at_removed’ method.
@@ -202,29 +202,23 @@ It removes the component from the cache and listing.
It will call the component’s ‘at_removed’ method.
Parameters
-
name (str) – The name of the component to remove.
+
name (str) – The name of the component to remove or its slot.
Property shortcut to retrieve the registered component names
+
Property shortcut to retrieve the registered component keys
Returns
component_names (iterable) – The name of each component that is registered
@@ -281,12 +275,6 @@ They will be of None value if not present in the class components or runtime com
components that were set on the typeclass using ComponentProperty.
-
diff --git a/docs/latest/api/evennia.contrib.base_systems.components.html b/docs/latest/api/evennia.contrib.base_systems.components.html
index 9a45aafb1f..759fc33816 100644
--- a/docs/latest/api/evennia.contrib.base_systems.components.html
+++ b/docs/latest/api/evennia.contrib.base_systems.components.html
@@ -119,11 +119,6 @@
It allows you to use components on typeclasses using a simple syntax.
This helps writing isolated code and reusing it over multiple objects.
diff --git a/docs/latest/api/evennia.contrib.base_systems.components.tests.html b/docs/latest/api/evennia.contrib.base_systems.components.tests.html
index a0dcab3d5e..5d49be5db5 100644
--- a/docs/latest/api/evennia.contrib.base_systems.components.tests.html
+++ b/docs/latest/api/evennia.contrib.base_systems.components.tests.html
@@ -140,6 +140,90 @@ Allows you to set attributes related to a component on the class.
It uses AttributeProperty under the hood but prefixes the key with the component name.
+
Component Attribute Descriptor.
+Allows you to set attributes related to a component on the class.
+It uses AttributeProperty under the hood but prefixes the key with the component name.
Component Attribute Descriptor.
+Allows you to set attributes related to a component on the class.
+It uses AttributeProperty under the hood but prefixes the key with the component name.
Component Attribute Descriptor.
+Allows you to set attributes related to a component on the class.
+It uses AttributeProperty under the hood but prefixes the key with the component name.
This allows you to register a component on a typeclass.
+Components registered with this property are automatically added
+to any instance of this typeclass.
+
Defaults can be overridden for this typeclass by passing kwargs
This allows you to register a component on a typeclass.
+Components registered with this property are automatically added
+to any instance of this typeclass.
+
Defaults can be overridden for this typeclass by passing kwargs
This allows you to register a component on a typeclass.
+Components registered with this property are automatically added
+to any instance of this typeclass.
+
Defaults can be overridden for this typeclass by passing kwargs
This allows you to register a component on a typeclass.
+Components registered with this property are automatically added
+to any instance of this typeclass.
+
Defaults can be overridden for this typeclass by passing kwargs
diff --git a/docs/latest/api/evennia.contrib.base_systems.email_login.email_login.html b/docs/latest/api/evennia.contrib.base_systems.email_login.email_login.html
index 99a7e23593..3ea0de2a7e 100644
--- a/docs/latest/api/evennia.contrib.base_systems.email_login.email_login.html
+++ b/docs/latest/api/evennia.contrib.base_systems.email_login.email_login.html
@@ -151,7 +151,7 @@ the module given by settings.CONNECTION_SCREEN_MODULE.
@@ -181,7 +181,7 @@ there is no object yet before the account has logged in)
-search_index_entry = {'aliases': 'con conn co', 'category': 'general', 'key': 'connect', 'no_prefix': ' con conn co', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect <email> <password>\n\n Use the create command to first create an account before logging in.\n '}¶
+search_index_entry = {'aliases': 'co conn con', 'category': 'general', 'key': 'connect', 'no_prefix': ' co conn con', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect <email> <password>\n\n Use the create command to first create an account before logging in.\n '}¶
@@ -203,7 +203,7 @@ there is no object yet before the account has logged in)
@@ -329,7 +329,7 @@ All it does is display the connect screen.
-search_index_entry = {'aliases': 'look l', 'category': 'general', 'key': '__unloggedin_look_command', 'no_prefix': ' look l', 'tags': '', 'text': '\n This is an unconnected version of the `look` command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}¶
+search_index_entry = {'aliases': 'l look', 'category': 'general', 'key': '__unloggedin_look_command', 'no_prefix': ' l look', 'tags': '', 'text': '\n This is an unconnected version of the `look` command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}¶
@@ -347,7 +347,7 @@ for simplicity. It shows a pane of info.
@@ -373,7 +373,7 @@ for simplicity. It shows a pane of info.
-search_index_entry = {'aliases': '? h', 'category': 'general', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶
+search_index_entry = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶
@@ -203,7 +203,7 @@ aliases to an already joined channel.
-search_index_entry = {'aliases': 'chanalias aliaschan', 'category': 'comms', 'key': 'addcom', 'no_prefix': ' chanalias aliaschan', 'tags': '', 'text': '\n Add a channel alias and/or subscribe to a channel\n\n Usage:\n addcom [alias=] <channel>\n\n Joins a given channel. If alias is given, this will allow you to\n refer to the channel by this alias rather than the full channel\n name. Subsequent calls of this command can be used to add multiple\n aliases to an already joined channel.\n '}¶
+search_index_entry = {'aliases': 'aliaschan chanalias', 'category': 'comms', 'key': 'addcom', 'no_prefix': ' aliaschan chanalias', 'tags': '', 'text': '\n Add a channel alias and/or subscribe to a channel\n\n Usage:\n addcom [alias=] <channel>\n\n Joins a given channel. If alias is given, this will allow you to\n refer to the channel by this alias rather than the full channel\n name. Subsequent calls of this command can be used to add multiple\n aliases to an already joined channel.\n '}¶
-search_index_entry = {'aliases': 'delaliaschan delchanalias', 'category': 'comms', 'key': 'delcom', 'no_prefix': ' delaliaschan delchanalias', 'tags': '', 'text': "\n remove a channel alias and/or unsubscribe from channel\n\n Usage:\n delcom <alias or channel>\n delcom/all <channel>\n\n If the full channel name is given, unsubscribe from the\n channel. If an alias is given, remove the alias but don't\n unsubscribe. If the 'all' switch is used, remove all aliases\n for that channel.\n "}¶
+search_index_entry = {'aliases': 'delchanalias delaliaschan', 'category': 'comms', 'key': 'delcom', 'no_prefix': ' delchanalias delaliaschan', 'tags': '', 'text': "\n remove a channel alias and/or unsubscribe from channel\n\n Usage:\n delcom <alias or channel>\n delcom/all <channel>\n\n If the full channel name is given, unsubscribe from the\n channel. If an alias is given, remove the alias but don't\n unsubscribe. If the 'all' switch is used, remove all aliases\n for that channel.\n "}¶
diff --git a/docs/latest/api/evennia.contrib.full_systems.evscaperoom.commands.html b/docs/latest/api/evennia.contrib.full_systems.evscaperoom.commands.html
index 4f78e95313..d0f582b851 100644
--- a/docs/latest/api/evennia.contrib.full_systems.evscaperoom.commands.html
+++ b/docs/latest/api/evennia.contrib.full_systems.evscaperoom.commands.html
@@ -223,7 +223,7 @@ the operation will be general or on the room.
-search_index_entry = {'aliases': 'q chicken out abort quit', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' q chicken out abort quit', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}¶
+search_index_entry = {'aliases': 'chicken out abort quit q', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' chicken out abort quit q', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}¶
-search_index_entry = {'aliases': 'ls l', 'category': 'evscaperoom', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n Look at the room, an object or the currently focused object\n\n Usage:\n look [obj]\n\n '}¶
+search_index_entry = {'aliases': 'l ls', 'category': 'evscaperoom', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n Look at the room, an object or the currently focused object\n\n Usage:\n look [obj]\n\n '}¶
@@ -440,7 +440,7 @@ emote /me points to /box and /lever.
-search_index_entry = {'aliases': 'pose :', 'category': 'general', 'key': 'emote', 'no_prefix': ' pose :', 'tags': '', 'text': '\n Perform a free-form emote. Use /me to\n include yourself in the emote and /name\n to include other objects or characters.\n Use "..." to enact speech.\n\n Usage:\n emote <emote>\n :<emote\n\n Example:\n emote /me smiles at /peter\n emote /me points to /box and /lever.\n\n '}¶
+search_index_entry = {'aliases': ': pose', 'category': 'general', 'key': 'emote', 'no_prefix': ' : pose', 'tags': '', 'text': '\n Perform a free-form emote. Use /me to\n include yourself in the emote and /name\n to include other objects or characters.\n Use "..." to enact speech.\n\n Usage:\n emote <emote>\n :<emote\n\n Example:\n emote /me smiles at /peter\n emote /me points to /box and /lever.\n\n '}¶
@@ -502,7 +502,7 @@ looks and what actions is available.
-search_index_entry = {'aliases': 'e unfocus examine ex', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' e unfocus examine ex', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus <obj>\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}¶
+search_index_entry = {'aliases': 'unfocus examine ex e', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' unfocus examine ex e', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus <obj>\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}¶
-search_index_entry = {'aliases': 'i give inventory inv', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' i give inventory inv', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶
+search_index_entry = {'aliases': 'give i inventory inv', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' give i inventory inv', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶
diff --git a/docs/latest/api/evennia.contrib.game_systems.barter.barter.html b/docs/latest/api/evennia.contrib.game_systems.barter.barter.html
index cb25c8dc15..cf98b83048 100644
--- a/docs/latest/api/evennia.contrib.game_systems.barter.barter.html
+++ b/docs/latest/api/evennia.contrib.game_systems.barter.barter.html
@@ -757,7 +757,7 @@ try to influence the other part in the deal.
@@ -783,7 +783,7 @@ try to influence the other part in the deal.
-search_index_entry = {'aliases': 'offers deal', 'category': 'trading', 'key': 'status', 'no_prefix': ' offers deal', 'tags': '', 'text': "\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n "}¶
+search_index_entry = {'aliases': 'deal offers', 'category': 'trading', 'key': 'status', 'no_prefix': ' deal offers', 'tags': '', 'text': "\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n "}¶
diff --git a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_basic.html b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
index 9adfd36d1a..062632c0b1 100644
--- a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
+++ b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
@@ -684,7 +684,7 @@ if there are still any actions you can take.
@@ -710,7 +710,7 @@ if there are still any actions you can take.
-search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_equip.html b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
index b4d3094806..862b0c29e9 100644
--- a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
+++ b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
@@ -579,7 +579,7 @@ if there are still any actions you can take.
@@ -599,7 +599,7 @@ if there are still any actions you can take.
-search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_items.html b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_items.html
index 5cc91fba32..09dab4a90a 100644
--- a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_items.html
+++ b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_items.html
@@ -702,7 +702,7 @@ if there are still any actions you can take.
@@ -722,7 +722,7 @@ if there are still any actions you can take.
-search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_magic.html b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
index 141a08f0fe..0421235f60 100644
--- a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
+++ b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
@@ -481,7 +481,7 @@ if there are still any actions you can take.
@@ -501,7 +501,7 @@ if there are still any actions you can take.
-search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_range.html b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_range.html
index 7bb7801b25..ed043f705a 100644
--- a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_range.html
+++ b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_range.html
@@ -941,7 +941,7 @@ if there are still any actions you can take.
@@ -961,7 +961,7 @@ if there are still any actions you can take.
-search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
-search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n look\n\n Usage:\n look\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects in your vicinity.\n '}¶
+search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n look\n\n Usage:\n look\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects in your vicinity.\n '}¶
diff --git a/docs/latest/api/evennia.contrib.rpg.rpsystem.rpsystem.html b/docs/latest/api/evennia.contrib.rpg.rpsystem.rpsystem.html
index 13f41c8258..a3c4298827 100644
--- a/docs/latest/api/evennia.contrib.rpg.rpsystem.rpsystem.html
+++ b/docs/latest/api/evennia.contrib.rpg.rpsystem.rpsystem.html
@@ -734,7 +734,7 @@ commands the caller can use.
-search_index_entry = {'aliases': '" \'', 'category': 'general', 'key': 'say', 'no_prefix': ' " \'', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
+search_index_entry = {'aliases': '\' "', 'category': 'general', 'key': 'say', 'no_prefix': ' \' "', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
-search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\n '}¶
+search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\n '}¶
-search_index_entry = {'aliases': 'unwield unwear', 'category': 'general', 'key': 'remove', 'no_prefix': ' unwield unwear', 'tags': '', 'text': '\n Remove a remove a weapon/shield, armor or helmet.\n\n Usage:\n remove <item>\n unwield <item>\n unwear <item>\n\n To remove an item from the backpack, use |wdrop|n instead.\n\n '}¶
+search_index_entry = {'aliases': 'unwear unwield', 'category': 'general', 'key': 'remove', 'no_prefix': ' unwear unwield', 'tags': '', 'text': '\n Remove a remove a weapon/shield, armor or helmet.\n\n Usage:\n remove <item>\n unwield <item>\n unwear <item>\n\n To remove an item from the backpack, use |wdrop|n instead.\n\n '}¶
diff --git a/docs/latest/api/evennia.contrib.tutorials.red_button.red_button.html b/docs/latest/api/evennia.contrib.tutorials.red_button.red_button.html
index 92ef04c7bb..e334a46a1c 100644
--- a/docs/latest/api/evennia.contrib.tutorials.red_button.red_button.html
+++ b/docs/latest/api/evennia.contrib.tutorials.red_button.red_button.html
@@ -165,7 +165,7 @@ such as when closing the lid and un-blinding a character.
-search_index_entry = {'aliases': 'smash lid break lid smash', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' smash lid break lid smash', 'tags': '', 'text': '\n Smash the protective glass.\n\n Usage:\n smash glass\n\n Try to smash the glass of the button.\n\n '}¶
+search_index_entry = {'aliases': 'break lid smash lid smash', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' break lid smash lid smash', 'tags': '', 'text': '\n Smash the protective glass.\n\n Usage:\n smash glass\n\n Try to smash the glass of the button.\n\n '}¶
-search_index_entry = {'aliases': 'feel examine listen get l ex', 'category': 'general', 'key': 'look', 'no_prefix': ' feel examine listen get l ex', 'tags': '', 'text': "\n Looking around in darkness\n\n Usage:\n look <obj>\n\n ... not that there's much to see in the dark.\n\n "}¶
+search_index_entry = {'aliases': 'ex l get examine listen feel', 'category': 'general', 'key': 'look', 'no_prefix': ' ex l get examine listen feel', 'tags': '', 'text': "\n Looking around in darkness\n\n Usage:\n look <obj>\n\n ... not that there's much to see in the dark.\n\n "}¶
diff --git a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.objects.html b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.objects.html
index 2d1bbcb38f..d4241a55cf 100644
--- a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.objects.html
+++ b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.objects.html
@@ -437,7 +437,7 @@ of the object. We overload it with our own version.
@@ -817,7 +817,7 @@ parry - forgoes your attack but will make you harder to hit on next
-search_index_entry = {'aliases': 'bash thrust chop hit kill slash parry defend fight stab pierce', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' bash thrust chop hit kill slash parry defend fight stab pierce', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}¶
+search_index_entry = {'aliases': 'pierce slash fight parry defend kill chop stab thrust bash hit', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' pierce slash fight parry defend kill chop stab thrust bash hit', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}¶
diff --git a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html
index e6e5282bc8..2d1c39c424 100644
--- a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html
+++ b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html
@@ -260,7 +260,7 @@ code except for adding in the details.
@@ -275,7 +275,7 @@ code except for adding in the details.
-search_index_entry = {'aliases': 'ls l', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n looks at the room and on details\n\n Usage:\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects\n in your vicinity.\n\n Tutorial: This is a child of the default Look command, that also\n allows us to look at "details" in the room. These details are\n things to examine and offers some extra description without\n actually having to be actual database objects. It uses the\n return_detail() hook on TutorialRooms for this.\n '}¶
+search_index_entry = {'aliases': 'l ls', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n looks at the room and on details\n\n Usage:\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects\n in your vicinity.\n\n Tutorial: This is a child of the default Look command, that also\n allows us to look at "details" in the room. These details are\n things to examine and offers some extra description without\n actually having to be actual database objects. It uses the\n return_detail() hook on TutorialRooms for this.\n '}¶
@@ -1008,7 +1008,7 @@ random chance of eventually finding a light source.
-search_index_entry = {'aliases': 'feel fiddle feel around l search', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' feel fiddle feel around l search', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}¶
+search_index_entry = {'aliases': 'feel around search l fiddle feel', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' feel around search l fiddle feel', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}¶
-search_index_entry = {'aliases': 'yes abort y __nomatch_command no a n', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' yes abort y __nomatch_command no a n', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
+search_index_entry = {'aliases': 'abort no __nomatch_command y yes a n', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' abort no __nomatch_command y yes a n', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
diff --git a/docs/latest/api/evennia.utils.evmore.html b/docs/latest/api/evennia.utils.evmore.html
index bd7f5961d2..ae19944f40 100644
--- a/docs/latest/api/evennia.utils.evmore.html
+++ b/docs/latest/api/evennia.utils.evmore.html
@@ -149,7 +149,7 @@ the caller.msg() construct every time the page is updated.
@@ -175,7 +175,7 @@ the caller.msg() construct every time the page is updated.
-search_index_entry = {'aliases': 'next quit end abort t previous top q e a p n', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' next quit end abort t previous top q e a p n', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
+search_index_entry = {'aliases': 'end abort quit top t q e p next previous a n', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' end abort quit top t q e p next previous a n', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶