From f2d954acef685e9fc49338663b4b7b949410688b Mon Sep 17 00:00:00 2001
From: Evennia docbuilder action
Date: Mon, 11 Nov 2024 19:13:15 +0000
Subject: [PATCH] Updated HTML docs.
---
docs/latest/.buildinfo | 2 +-
.../Part3/Beginner-Tutorial-AI.html | 2 +-
.../evennia/commands/default/tests.html | 9 +++++
.../_modules/evennia/objects/objects.html | 34 +++++++++++++-----
.../evennia/server/serversession.html | 3 --
.../Part3/Beginner-Tutorial-AI.md.txt | 2 +-
.../evennia.commands.default.building.html | 12 +++----
.../api/evennia.commands.default.comms.html | 8 ++---
.../api/evennia.commands.default.general.html | 8 ++---
.../api/evennia.commands.default.tests.html | 7 +++-
.../evennia.commands.default.unloggedin.html | 8 ++---
....base_systems.email_login.email_login.html | 8 ++---
...b.base_systems.ingame_python.commands.html | 4 +--
...b.base_systems.ingame_reports.reports.html | 4 +--
...systems.mux_comms_cmds.mux_comms_cmds.html | 4 +--
...rib.full_systems.evscaperoom.commands.html | 20 +++++------
...ontrib.game_systems.clothing.clothing.html | 4 +--
...trib.game_systems.turnbattle.tb_basic.html | 4 +--
...trib.game_systems.turnbattle.tb_equip.html | 4 +--
...trib.game_systems.turnbattle.tb_items.html | 4 +--
...trib.game_systems.turnbattle.tb_magic.html | 4 +--
...trib.game_systems.turnbattle.tb_range.html | 4 +--
...evennia.contrib.rpg.rpsystem.rpsystem.html | 4 +--
...ntrib.tutorials.red_button.red_button.html | 16 ++++-----
...trib.tutorials.tutorial_world.objects.html | 12 +++----
...ontrib.tutorials.tutorial_world.rooms.html | 8 ++---
...utils.git_integration.git_integration.html | 4 +--
docs/latest/api/evennia.objects.objects.html | 23 +++++++++++-
docs/latest/api/evennia.utils.eveditor.html | 4 +--
docs/latest/api/evennia.utils.evmenu.html | 4 +--
docs/latest/api/evennia.utils.evmore.html | 4 +--
docs/latest/genindex.html | 10 +++++-
docs/latest/objects.inv | Bin 172486 -> 172516 bytes
docs/latest/searchindex.js | 2 +-
34 files changed, 153 insertions(+), 97 deletions(-)
diff --git a/docs/latest/.buildinfo b/docs/latest/.buildinfo
index 605d77d0fb..743b31c451 100644
--- a/docs/latest/.buildinfo
+++ b/docs/latest/.buildinfo
@@ -1,4 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
-config: 0e2d7f46b43b430f85340fd648f3c079
+config: f57d227028020745d272e9c489a80581
tags: 645f666f9bcd5a90fca523b33c5a78b7
diff --git a/docs/latest/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-AI.html b/docs/latest/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-AI.html
index de64e6cf88..653ec0d6d3 100644
--- a/docs/latest/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-AI.html
+++ b/docs/latest/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-AI.html
@@ -367,7 +367,7 @@ At regular intervals, the AI entity will be ‘ticked’ by Evennia. This ‘tic
Or in code:
exit_obj.locks.add(
- "traverse:attr(is_ic, True)")
+ "traverse:attr(is_pc, True)")
See Locks for a lot more information about Evennia locks.
diff --git a/docs/latest/_modules/evennia/commands/default/tests.html b/docs/latest/_modules/evennia/commands/default/tests.html
index a706ca01ec..2103cc4985 100644
--- a/docs/latest/_modules/evennia/commands/default/tests.html
+++ b/docs/latest/_modules/evennia/commands/default/tests.html
@@ -1359,6 +1359,15 @@
)
self.call(building.CmdName(), "Obj4=", "No names or aliases defined!")
+[docs] def test_name_clears_plural(self):
+
box, _ = DefaultObject.create("Opened Box", location=self.char1)
+
+
# Force update of plural aliases (set in get_numbered_name)
+
self.char1.execute_cmd("inventory")
+
self.assertIn("one opened box", box.aliases.get(category=box.plural_category))
+
self.char1.execute_cmd("@name box=closed box")
+
self.assertIsNone(box.aliases.get(category=box.plural_category))
+
[docs] def test_desc(self):
oid = self.obj2.id
self.call(building.CmdDesc(), "Obj2=TestDesc", "The description was set on Obj2.")
diff --git a/docs/latest/_modules/evennia/objects/objects.html b/docs/latest/_modules/evennia/objects/objects.html
index 76e672ab79..c8cc518ff0 100644
--- a/docs/latest/_modules/evennia/objects/objects.html
+++ b/docs/latest/_modules/evennia/objects/objects.html
@@ -323,6 +323,7 @@
has_account (bool, read-only) - True is this object has an associated account.
is_superuser (bool, read-only): True if this object has an account and that
account is a superuser.
+
plural_category (string) - Alias category for the plural strings of this object
* Handlers available
@@ -474,6 +475,7 @@
at_look(target, **kwargs)
at_desc(looker=None)
+
at_rename(oldname, newname)
"""
@@ -499,6 +501,8 @@
{things}
{footer}
"""
+
+
plural_category = "plural_key"
# on-object properties
[docs] @lazy_property
@@ -1785,7 +1789,6 @@
obj.get_numbered_name(1, looker, key="Foobert", return_string=True, no_article=True)
-> "Foobert"
"""
-
plural_category = "plural_key"
key = kwargs.get("key", self.get_display_name(looker))
raw_key = self.name
key = ansi.ANSIString(key) # this is needed to allow inflection of colored names
@@ -1796,13 +1799,13 @@
# this is raised by inflect if the input is not a proper noun
plural = key
singular = _INFLECT.an(key)
-
if not self.aliases.get(plural, category=plural_category):
+
if not self.aliases.get(plural, category=self.plural_category):
# we need to wipe any old plurals/an/a in case key changed in the interrim
-
self.aliases.clear(category=plural_category)
-
self.aliases.add(plural, category=plural_category)
+
self.aliases.clear(category=self.plural_category)
+
self.aliases.add(plural, category=self.plural_category)
# save the singular form as an alias here too so we can display "an egg" and also
# look at 'an egg'.
-
self.aliases.add(singular, category=plural_category)
+
self.aliases.add(singular, category=self.plural_category)
if kwargs.get("no_article") and count == 1:
if kwargs.get("return_string"):
@@ -2020,7 +2023,7 @@
if hasattr(self, "_createdict"):
# this will be set if the object was created by the utils.create function
-
# or the spawner. We want these kwargs to override the values set by
+
# or the spawner. We want these kwargs to override the values set by
# the initial hooks.
cdict = self._createdict
updates = []
@@ -2064,7 +2067,7 @@
self.nattributes.add(key, value)
del self._createdict
-
+
# run the post-setup hook
self.at_object_post_creation()
@@ -2147,7 +2150,7 @@
"""
Called when this object is spawned or updated from a prototype, after all other
hooks have been run.
-
+
Keyword Args:
prototype (dict): The prototype that was used to spawn or update this object.
"""
@@ -3070,7 +3073,20 @@
from_obj=self,
exclude=exclude,
mapping=location_mapping,
-
)
+ )
+
+[docs] def at_rename(self, oldname, newname):
+
"""
+
This Hook is called by @name on a successful rename.
+
+
Args:
+
oldname (str): The instance's original name.
+
newname (str): The new name for the instance.
+
+
"""
+
+
# Clear plural aliases set by DefaultObject.get_numbered_name
+
self.aliases.clear(category=self.plural_category)
#
diff --git a/docs/latest/_modules/evennia/server/serversession.html b/docs/latest/_modules/evennia/server/serversession.html
index a36302033c..75ba85cfea 100644
--- a/docs/latest/_modules/evennia/server/serversession.html
+++ b/docs/latest/_modules/evennia/server/serversession.html
@@ -253,9 +253,6 @@
account = self.account
if self.puppet:
account.unpuppet_object(self)
- uaccount = account
- uaccount.last_login = timezone.now()
- uaccount.save()
# calling account hook
account.at_disconnect(reason)
self.logged_in = False
diff --git a/docs/latest/_sources/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-AI.md.txt b/docs/latest/_sources/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-AI.md.txt
index 4e35e2b2c4..58661a1ddd 100644
--- a/docs/latest/_sources/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-AI.md.txt
+++ b/docs/latest/_sources/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-AI.md.txt
@@ -172,7 +172,7 @@ In game:
Or in code:
exit_obj.locks.add(
- "traverse:attr(is_ic, True)")
+ "traverse:attr(is_pc, True)")
See [Locks](../../../Components/Locks.md) for a lot more information about Evennia locks.
```
diff --git a/docs/latest/api/evennia.commands.default.building.html b/docs/latest/api/evennia.commands.default.building.html
index 72e1d9dc89..7ddc3b3015 100644
--- a/docs/latest/api/evennia.commands.default.building.html
+++ b/docs/latest/api/evennia.commands.default.building.html
@@ -651,7 +651,7 @@ You can specify the /force switch to bypass this confirmation.
-
-
aliases = ['@delete', '@del']
+aliases = ['@del', '@delete']
@@ -692,7 +692,7 @@ You can specify the /force switch to bypass this confirmation.
-
-
search_index_entry = {'aliases': '@delete @del', 'category': 'building', 'key': '@destroy', 'no_prefix': 'destroy delete del', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}
+search_index_entry = {'aliases': '@del @delete', 'category': 'building', 'key': '@destroy', 'no_prefix': 'destroy del delete', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}
@@ -1419,7 +1419,7 @@ server settings.
-
-
aliases = ['@typeclasses', '@parent', '@update', '@swap', '@type']
+aliases = ['@parent', '@type', '@update', '@typeclasses', '@swap']
@@ -1450,7 +1450,7 @@ server settings.
-
-
search_index_entry = {'aliases': '@typeclasses @parent @update @swap @type', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass typeclasses parent update swap type', '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': '@parent @type @update @typeclasses @swap', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass parent type update typeclasses swap', '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 "}
@@ -1605,7 +1605,7 @@ If object is not specified, the current location is examined.
-
-
aliases = ['@ex', '@exam']
+aliases = ['@exam', '@ex']
@@ -1878,7 +1878,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 '}
diff --git a/docs/latest/api/evennia.commands.default.comms.html b/docs/latest/api/evennia.commands.default.comms.html
index 0fa48db791..e1cd9627c3 100644
--- a/docs/latest/api/evennia.commands.default.comms.html
+++ b/docs/latest/api/evennia.commands.default.comms.html
@@ -270,7 +270,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
-
-
aliases = ['@chan', '@channels']
+aliases = ['@channels', '@chan']
@@ -795,7 +795,7 @@ don’t actually sub to yet.
-
-
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': '@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 "}
@@ -948,7 +948,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
-
-
aliases = ['@chan', '@channels']
+aliases = ['@channels', '@chan']
@@ -968,7 +968,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
-
-
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': '@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 "}
diff --git a/docs/latest/api/evennia.commands.default.general.html b/docs/latest/api/evennia.commands.default.general.html
index b49ff4bd75..e32a006c59 100644
--- a/docs/latest/api/evennia.commands.default.general.html
+++ b/docs/latest/api/evennia.commands.default.general.html
@@ -337,7 +337,7 @@ inv
-
-
aliases = ['i', 'inv']
+aliases = ['inv', 'i']
@@ -368,7 +368,7 @@ inv
-
-
search_index_entry = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'no_prefix': ' i inv', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}
+search_index_entry = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}
@@ -786,7 +786,7 @@ which permission groups you are a member of.
-
-
aliases = ['groups', 'hierarchy']
+aliases = ['hierarchy', 'groups']
@@ -817,7 +817,7 @@ which permission groups you are a member of.
-
-
search_index_entry = {'aliases': 'groups hierarchy', 'category': 'general', 'key': 'access', 'no_prefix': ' groups hierarchy', 'tags': '', 'text': '\n show your current game access\n\n Usage:\n access\n\n This command shows you the permission hierarchy and\n which permission groups you are a member of.\n '}
+search_index_entry = {'aliases': 'hierarchy groups', 'category': 'general', 'key': 'access', 'no_prefix': ' hierarchy groups', 'tags': '', 'text': '\n show your current game access\n\n Usage:\n access\n\n This command shows you the permission hierarchy and\n which permission groups you are a member of.\n '}
diff --git a/docs/latest/api/evennia.commands.default.tests.html b/docs/latest/api/evennia.commands.default.tests.html
index c255ab6d5f..3995a79470 100644
--- a/docs/latest/api/evennia.commands.default.tests.html
+++ b/docs/latest/api/evennia.commands.default.tests.html
@@ -699,6 +699,11 @@ main test suite started with
test_name()[source]
+
+-
+
test_name_clears_plural()[source]
+
+
-
test_desc()[source]
@@ -980,7 +985,7 @@ main test suite started with
Test the batch processor.
-
-
red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmp3s59yh22/f0071998780096bec0b43682835d1fd72f907651/evennia/contrib/tutorials/red_button/red_button.py'>
+red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmp9nk5yl4y/e601fe746c50fbc1621ca62f3917f72987e2235f/evennia/contrib/tutorials/red_button/red_button.py'>
diff --git a/docs/latest/api/evennia.commands.default.unloggedin.html b/docs/latest/api/evennia.commands.default.unloggedin.html
index ad7dbecd84..339d25ffec 100644
--- a/docs/latest/api/evennia.commands.default.unloggedin.html
+++ b/docs/latest/api/evennia.commands.default.unloggedin.html
@@ -136,7 +136,7 @@ connect “account name” “pass word”
-
-
aliases = ['con', 'conn', 'co']
+aliases = ['con', 'co', 'conn']
@@ -171,7 +171,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': 'con co conn', 'category': 'general', 'key': 'connect', 'no_prefix': ' con co conn', '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 '}
@@ -355,7 +355,7 @@ for simplicity. It shows a pane of info.
-
-
aliases = ['h', '?']
+aliases = ['?', 'h']
@@ -381,7 +381,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 '}
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 1ff93a0f1c..608e247c36 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
@@ -153,7 +153,7 @@ the module given by settings.CONNECTION_SCREEN_MODULE.
-
-
aliases = ['con', 'conn', 'co']
+aliases = ['con', 'co', 'conn']
@@ -183,7 +183,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': 'con co conn', 'category': 'general', 'key': 'connect', 'no_prefix': ' con co conn', '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 '}
@@ -355,7 +355,7 @@ for simplicity. It shows a pane of info.
-
-
aliases = ['h', '?']
+aliases = ['?', 'h']
@@ -381,7 +381,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 '}
diff --git a/docs/latest/api/evennia.contrib.base_systems.ingame_python.commands.html b/docs/latest/api/evennia.contrib.base_systems.ingame_python.commands.html
index 111f869f23..c003ff99f6 100644
--- a/docs/latest/api/evennia.contrib.base_systems.ingame_python.commands.html
+++ b/docs/latest/api/evennia.contrib.base_systems.ingame_python.commands.html
@@ -130,7 +130,7 @@
-
-
aliases = ['@callbacks', '@calls', '@callback']
+aliases = ['@calls', '@callback', '@callbacks']
@@ -211,7 +211,7 @@ on user permission.
-
-
search_index_entry = {'aliases': '@callbacks @calls @callback', 'category': 'building', 'key': '@call', 'no_prefix': 'call callbacks calls callback', 'tags': '', 'text': '\n Command to edit callbacks.\n '}
+search_index_entry = {'aliases': '@calls @callback @callbacks', 'category': 'building', 'key': '@call', 'no_prefix': 'call calls callback callbacks', 'tags': '', 'text': '\n Command to edit callbacks.\n '}
diff --git a/docs/latest/api/evennia.contrib.base_systems.ingame_reports.reports.html b/docs/latest/api/evennia.contrib.base_systems.ingame_reports.reports.html
index 8748ba38db..65b2e0da9d 100644
--- a/docs/latest/api/evennia.contrib.base_systems.ingame_reports.reports.html
+++ b/docs/latest/api/evennia.contrib.base_systems.ingame_reports.reports.html
@@ -174,7 +174,7 @@ players
-
-
aliases = ['manage bugs', 'manage players', 'manage ideas']
+aliases = ['manage bugs', 'manage ideas', 'manage players']
@@ -208,7 +208,7 @@ to all the variables defined therein.
-
-
search_index_entry = {'aliases': 'manage bugs manage players manage ideas', 'category': 'general', 'key': 'manage reports', 'no_prefix': ' manage bugs manage players manage ideas', 'tags': '', 'text': '\n manage the various reports\n\n Usage:\n manage [report type]\n\n Available report types:\n bugs\n ideas\n players\n\n Initializes a menu for reviewing and changing the status of current reports.\n '}
+search_index_entry = {'aliases': 'manage bugs manage ideas manage players', 'category': 'general', 'key': 'manage reports', 'no_prefix': ' manage bugs manage ideas manage players', 'tags': '', 'text': '\n manage the various reports\n\n Usage:\n manage [report type]\n\n Available report types:\n bugs\n ideas\n players\n\n Initializes a menu for reviewing and changing the status of current reports.\n '}
diff --git a/docs/latest/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html b/docs/latest/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
index bd9f03dcd2..b9451a0983 100644
--- a/docs/latest/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
+++ b/docs/latest/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
@@ -174,7 +174,7 @@ aliases to an already joined channel.
-
-
aliases = ['chanalias', 'aliaschan']
+aliases = ['aliaschan', 'chanalias']
@@ -205,7 +205,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 '}
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 b3f2b90ede..12ca0b2f9b 100644
--- a/docs/latest/api/evennia.contrib.full_systems.evscaperoom.commands.html
+++ b/docs/latest/api/evennia.contrib.full_systems.evscaperoom.commands.html
@@ -225,7 +225,7 @@ the operation will be general or on the room.
-
-
aliases = ['q', 'quit', 'abort', 'chicken out']
+aliases = ['quit', 'chicken out', 'q', 'abort']
@@ -249,7 +249,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'q quit abort chicken out', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' q quit abort chicken out', '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': 'quit chicken out q abort', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' quit chicken out q abort', '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 '}
@@ -385,7 +385,7 @@ shout
-
-
aliases = ['whisper', ';', 'shout']
+aliases = ['shout', 'whisper', ';']
@@ -414,7 +414,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'whisper ; shout', 'category': 'general', 'key': 'say', 'no_prefix': ' whisper ; shout', 'tags': '', 'text': '\n Perform an communication action.\n\n Usage:\n say <text>\n whisper\n shout\n\n '}
+search_index_entry = {'aliases': 'shout whisper ;', 'category': 'general', 'key': 'say', 'no_prefix': ' shout whisper ;', 'tags': '', 'text': '\n Perform an communication action.\n\n Usage:\n say <text>\n whisper\n shout\n\n '}
@@ -504,7 +504,7 @@ looks and what actions is available.
-
-
aliases = ['ex', 'examine', 'e', 'unfocus']
+aliases = ['ex', 'unfocus', 'examine', 'e']
@@ -533,7 +533,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'ex examine e unfocus', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' ex examine e unfocus', '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': 'ex unfocus examine e', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' ex unfocus examine 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 '}
@@ -595,7 +595,7 @@ set in self.parse())
-
-
aliases = ['inventory', 'give', 'i', 'inv']
+aliases = ['give', 'inventory', 'i', 'inv']
@@ -619,7 +619,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'inventory give i inv', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' inventory give i inv', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}
+search_index_entry = {'aliases': 'give inventory i inv', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' give inventory i inv', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}
@@ -640,7 +640,7 @@ set in self.parse())
-
-
aliases = ['@dig', '@open']
+aliases = ['@open', '@dig']
@@ -663,7 +663,7 @@ to all the variables defined therein.
-
-
search_index_entry = {'aliases': '@dig @open', 'category': 'general', 'key': 'open', 'no_prefix': ' dig open', 'tags': '', 'text': '\n Interact with an object in focus.\n\n Usage:\n <action> [arg]\n\n '}
+search_index_entry = {'aliases': '@open @dig', 'category': 'general', 'key': 'open', 'no_prefix': ' open dig', 'tags': '', 'text': '\n Interact with an object in focus.\n\n Usage:\n <action> [arg]\n\n '}
diff --git a/docs/latest/api/evennia.contrib.game_systems.clothing.clothing.html b/docs/latest/api/evennia.contrib.game_systems.clothing.clothing.html
index 8c8be515bb..158896c484 100644
--- a/docs/latest/api/evennia.contrib.game_systems.clothing.clothing.html
+++ b/docs/latest/api/evennia.contrib.game_systems.clothing.clothing.html
@@ -636,7 +636,7 @@ inv
-
-
aliases = ['i', 'inv']
+aliases = ['inv', 'i']
@@ -667,7 +667,7 @@ inv
-
-
search_index_entry = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'no_prefix': ' i inv', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}
+search_index_entry = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\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 9dd6a535f0..c662d4ed02 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
@@ -686,7 +686,7 @@ if there are still any actions you can take.
-
-
aliases = ['hold', 'wait']
+aliases = ['wait', 'hold']
@@ -712,7 +712,7 @@ if there are still any actions you can take.
-
-
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': '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 '}
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 0bed424fda..b43d0f5a48 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
@@ -581,7 +581,7 @@ if there are still any actions you can take.
-
-
aliases = ['hold', 'wait']
+aliases = ['wait', 'hold']
@@ -601,7 +601,7 @@ if there are still any actions you can take.
-
-
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': '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 '}
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 9b7607f915..1e2a340556 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
@@ -704,7 +704,7 @@ if there are still any actions you can take.
-
-
aliases = ['hold', 'wait']
+aliases = ['wait', 'hold']
@@ -724,7 +724,7 @@ if there are still any actions you can take.
-
-
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': '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 '}
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 0f29530eac..62ecd7c88e 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
@@ -483,7 +483,7 @@ if there are still any actions you can take.
-
-
aliases = ['hold', 'wait']
+aliases = ['wait', 'hold']
@@ -503,7 +503,7 @@ if there are still any actions you can take.
-
-
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': '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 '}
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 d06a19f299..66eedd87ae 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
@@ -943,7 +943,7 @@ if there are still any actions you can take.
-
-
aliases = ['hold', 'wait']
+aliases = ['wait', 'hold']
@@ -963,7 +963,7 @@ if there are still any actions you can take.
-
-
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': '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 '}
diff --git a/docs/latest/api/evennia.contrib.rpg.rpsystem.rpsystem.html b/docs/latest/api/evennia.contrib.rpg.rpsystem.rpsystem.html
index 97a20164de..1a2e68d9d2 100644
--- a/docs/latest/api/evennia.contrib.rpg.rpsystem.rpsystem.html
+++ b/docs/latest/api/evennia.contrib.rpg.rpsystem.rpsystem.html
@@ -908,7 +908,7 @@ Using the command without arguments will list all current recogs.
-
-
aliases = ['recognize', 'forget']
+aliases = ['forget', 'recognize']
@@ -935,7 +935,7 @@ Using the command without arguments will list all current recogs.
-
-
search_index_entry = {'aliases': 'recognize forget', 'category': 'general', 'key': 'recog', 'no_prefix': ' recognize forget', 'tags': '', 'text': '\n Recognize another person in the same room.\n\n Usage:\n recog\n recog sdesc as alias\n forget alias\n\n Example:\n recog tall man as Griatch\n forget griatch\n\n This will assign a personal alias for a person, or forget said alias.\n Using the command without arguments will list all current recogs.\n\n '}
+search_index_entry = {'aliases': 'forget recognize', 'category': 'general', 'key': 'recog', 'no_prefix': ' forget recognize', 'tags': '', 'text': '\n Recognize another person in the same room.\n\n Usage:\n recog\n recog sdesc as alias\n forget alias\n\n Example:\n recog tall man as Griatch\n forget griatch\n\n This will assign a personal alias for a person, or forget said alias.\n Using the command without arguments will list all current recogs.\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 e5fdee2e22..700859c7a8 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
@@ -167,7 +167,7 @@ such as when closing the lid and un-blinding a character.
-
-
aliases = ['press', 'press button', 'push']
+aliases = ['press button', 'press', 'push']
@@ -196,7 +196,7 @@ check if the lid is open or closed.
-
-
search_index_entry = {'aliases': 'press press button push', 'category': 'general', 'key': 'push button', 'no_prefix': ' press press button push', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}
+search_index_entry = {'aliases': 'press button press push', 'category': 'general', 'key': 'push button', 'no_prefix': ' press button press push', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}
@@ -266,7 +266,7 @@ check if the lid is open or closed.
-
-
aliases = ['smash lid', 'smash', 'break lid']
+aliases = ['break lid', 'smash', 'smash lid']
@@ -293,7 +293,7 @@ break.
-
-
search_index_entry = {'aliases': 'smash lid smash break lid', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' smash lid smash break lid', '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 smash lid', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' break lid smash smash lid', '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 '}
@@ -393,7 +393,7 @@ be mutually exclusive.
-
-
aliases = ['press', 'press button', 'push']
+aliases = ['press button', 'press', 'push']
@@ -422,7 +422,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'press press button push', 'category': 'general', 'key': 'push button', 'no_prefix': ' press press button push', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}
+search_index_entry = {'aliases': 'press button press push', 'category': 'general', 'key': 'push button', 'no_prefix': ' press button press push', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}
@@ -520,7 +520,7 @@ be mutually exclusive.
-
-
aliases = ['get', 'feel', 'ex', 'examine', 'l', 'listen']
+aliases = ['ex', 'l', 'examine', 'listen', 'get', 'feel']
@@ -546,7 +546,7 @@ be mutually exclusive.
-
-
search_index_entry = {'aliases': 'get feel ex examine l listen', 'category': 'general', 'key': 'look', 'no_prefix': ' get feel ex examine l listen', '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 examine listen get feel', 'category': 'general', 'key': 'look', 'no_prefix': ' ex l examine listen get 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 2ec3c119a2..20b55e1fed 100644
--- a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.objects.html
+++ b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.objects.html
@@ -570,7 +570,7 @@ shift green root up/down
-
-
aliases = ['shiftroot', 'push', 'move', 'pull']
+aliases = ['pull', 'move', 'shiftroot', 'push']
@@ -606,7 +606,7 @@ yellow/green - horizontal roots
-
-
search_index_entry = {'aliases': 'shiftroot push move pull', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' shiftroot push move pull', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}
+search_index_entry = {'aliases': 'pull move shiftroot push', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' pull move shiftroot push', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}
@@ -623,7 +623,7 @@ yellow/green - horizontal roots
-
-
aliases = ['button', 'press button', 'push button']
+aliases = ['button', 'push button', 'press button']
@@ -649,7 +649,7 @@ yellow/green - horizontal roots
-
-
search_index_entry = {'aliases': 'button press button push button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' button press button push button', 'tags': '', 'text': '\n Presses a button.\n '}
+search_index_entry = {'aliases': 'button push button press button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' button push button press button', 'tags': '', 'text': '\n Presses a button.\n '}
@@ -793,7 +793,7 @@ parry - forgoes your attack but will make you harder to hit on next
-
-
aliases = ['stab', 'parry', 'kill', 'hit', 'fight', 'thrust', 'chop', 'pierce', 'bash', 'slash', 'defend']
+aliases = ['pierce', 'chop', 'kill', 'hit', 'bash', 'slash', 'defend', 'thrust', 'stab', 'fight', 'parry']
@@ -819,7 +819,7 @@ parry - forgoes your attack but will make you harder to hit on next
-
-
search_index_entry = {'aliases': 'stab parry kill hit fight thrust chop pierce bash slash defend', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' stab parry kill hit fight thrust chop pierce bash slash defend', '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 chop kill hit bash slash defend thrust stab fight parry', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' pierce chop kill hit bash slash defend thrust stab fight parry', '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 4be73995bd..d63c7b89d4 100644
--- a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html
+++ b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html
@@ -830,7 +830,7 @@ if they fall off the bridge.
-
-
aliases = ['h', '?']
+aliases = ['?', 'h']
@@ -856,7 +856,7 @@ if they fall off the bridge.
-
-
search_index_entry = {'aliases': 'h ?', 'category': 'tutorial world', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}
+search_index_entry = {'aliases': '? h', 'category': 'tutorial world', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}
@@ -982,7 +982,7 @@ to find something.
-
-
aliases = ['search', 'feel', 'l', 'fiddle', 'feel around']
+aliases = ['feel around', 'l', 'fiddle', 'feel', 'search']
@@ -1010,7 +1010,7 @@ random chance of eventually finding a light source.
-
-
search_index_entry = {'aliases': 'search feel l fiddle feel around', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' search feel l fiddle feel around', '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 l fiddle feel search', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' feel around l fiddle feel 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 '}
diff --git a/docs/latest/api/evennia.contrib.utils.git_integration.git_integration.html b/docs/latest/api/evennia.contrib.utils.git_integration.git_integration.html
index 2ec5565829..eabd2a4ec5 100644
--- a/docs/latest/api/evennia.contrib.utils.git_integration.git_integration.html
+++ b/docs/latest/api/evennia.contrib.utils.git_integration.git_integration.html
@@ -222,7 +222,7 @@ git evennia pull - Pull the latest evennia code.
-
-
directory = '/tmp/tmp3s59yh22/f0071998780096bec0b43682835d1fd72f907651/evennia'
+directory = '/tmp/tmp9nk5yl4y/e601fe746c50fbc1621ca62f3917f72987e2235f/evennia'
@@ -283,7 +283,7 @@ git pull - Pull the latest code from your current branch.
-
-
directory = '/tmp/tmp3s59yh22/f0071998780096bec0b43682835d1fd72f907651/evennia/game_template'
+directory = '/tmp/tmp9nk5yl4y/e601fe746c50fbc1621ca62f3917f72987e2235f/evennia/game_template'
diff --git a/docs/latest/api/evennia.objects.objects.html b/docs/latest/api/evennia.objects.objects.html
index e820e71176..01705f7637 100644
--- a/docs/latest/api/evennia.objects.objects.html
+++ b/docs/latest/api/evennia.objects.objects.html
@@ -259,6 +259,7 @@ is_superuser (bool, read-only): True if this object has an account and that
+plural_category (string) - Alias category for the plural strings of this object
Handlers available
@@ -440,7 +441,8 @@ at_drop(dropper, **
at_pre_say(speaker, message, **kwargs)
at_say(message, msg_self=None, msg_location=None, receivers=None, msg_receivers=None, **kwargs)
at_look(target, **kwargs)
-at_desc(looker=None)
+at_desc(looker=None)
+at_rename(oldname, newname)
-
@@ -467,6 +469,11 @@ at_desc(looker=None)
appearance_template = '\n{header}\n|c{name}{extra_name_info}|n\n{desc}\n{exits}\n{characters}\n{things}\n{footer}\n '
+
+-
+
plural_category = 'plural_key'
+
+
-
cmdset[source]
@@ -2422,6 +2429,20 @@ if more than one, otherwise same as receiver
+
+-
+
at_rename(oldname, newname)[source]
+This Hook is called by @name on a successful rename.
+
+- Parameters
+-
+
+
+
+
-
exception
DoesNotExist
diff --git a/docs/latest/api/evennia.utils.eveditor.html b/docs/latest/api/evennia.utils.eveditor.html
index b7dc8ef8ee..eedb512c2a 100644
--- a/docs/latest/api/evennia.utils.eveditor.html
+++ b/docs/latest/api/evennia.utils.eveditor.html
@@ -356,7 +356,7 @@ indentation.
-
-
aliases = [':uu', ':A', ':echo', ':u', ':r', ':fd', ':UU', ':=', ':s', ':h', ':DD', ':', ':!', ':wq', ':I', ':dw', ':y', ':x', ':q!', ':fi', ':dd', ':f', ':j', ':>', ':p', ':::', ':q', ':w', '::', ':S', ':<', ':i']
+aliases = [':p', ':S', ':y', ':echo', ':::', ':u', ':x', ':r', ':i', ':fi', ':s', ':', ':h', ':q', ':fd', ':w', ':!', ':f', ':I', ':dd', ':>', ':UU', ':<', ':q!', '::', ':DD', ':j', ':wq', ':dw', ':=', ':A', ':uu']
@@ -384,7 +384,7 @@ efficient presentation.
-
-
search_index_entry = {'aliases': ':uu :A :echo :u :r :fd :UU := :s :h :DD : :! :wq :I :dw :y :x :q! :fi :dd :f :j :> :p ::: :q :w :: :S :< :i', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :uu :A :echo :u :r :fd :UU := :s :h :DD : :! :wq :I :dw :y :x :q! :fi :dd :f :j :> :p ::: :q :w :: :S :< :i', 'tags': '', 'text': '\n Commands for the editor\n '}
+search_index_entry = {'aliases': ':p :S :y :echo ::: :u :x :r :i :fi :s : :h :q :fd :w :! :f :I :dd :> :UU :< :q! :: :DD :j :wq :dw := :A :uu', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :p :S :y :echo ::: :u :x :r :i :fi :s : :h :q :fd :w :! :f :I :dd :> :UU :< :q! :: :DD :j :wq :dw := :A :uu', 'tags': '', 'text': '\n Commands for the editor\n '}
diff --git a/docs/latest/api/evennia.utils.evmenu.html b/docs/latest/api/evennia.utils.evmenu.html
index 016589d844..20f1cc5c76 100644
--- a/docs/latest/api/evennia.utils.evmenu.html
+++ b/docs/latest/api/evennia.utils.evmenu.html
@@ -955,7 +955,7 @@ single question.
+aliases = ['abort', 'yes', 'no', 'a', 'n', 'y', '__nomatch_command']
@@ -981,7 +981,7 @@ single question.
+search_index_entry = {'aliases': 'abort yes no a n y __nomatch_command', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' abort yes no a n y __nomatch_command', '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 94182101f6..ae88d39b6d 100644
--- a/docs/latest/api/evennia.utils.evmore.html
+++ b/docs/latest/api/evennia.utils.evmore.html
@@ -151,7 +151,7 @@ the caller.msg() construct every time the page is updated.
-
-
aliases = ['previous', 'e', 'quit', 'q', 'a', 'p', 't', 'next', 'n', 'end', 'abort', 'top']
+aliases = ['quit', 'previous', 'e', 't', 'q', 'abort', 'next', 'a', 'end', 'n', 'p', 'top']
@@ -177,7 +177,7 @@ the caller.msg() construct every time the page is updated.
-
-
search_index_entry = {'aliases': 'previous e quit q a p t next n end abort top', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' previous e quit q a p t next n end abort top', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}
+search_index_entry = {'aliases': 'quit previous e t q abort next a end n p top', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' quit previous e t q abort next a end n p top', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}
diff --git a/docs/latest/genindex.html b/docs/latest/genindex.html
index 825da7fbb1..c349758d9b 100644
--- a/docs/latest/genindex.html
+++ b/docs/latest/genindex.html
@@ -2627,8 +2627,12 @@
(evennia.contrib.base_systems.components.dbfield.TagField method)
- at_rename() (evennia.typeclasses.models.TypedObject method)
+ at_rename() (evennia.objects.objects.DefaultObject method)
+
+
at_repeat() (evennia.accounts.bots.BotStarter method)
playtime() (evennia.contrib.rpg.buffs.buff.BuffHandler property)
+
+ plural_category (evennia.objects.objects.DefaultObject attribute)
PlusMapLink (class in evennia.contrib.grid.xyzgrid.xymap_legend)
@@ -22666,6 +22672,8 @@
test_mux_markup() (evennia.contrib.base_systems.color_markups.tests.TestColorMarkup method)
test_name() (evennia.commands.default.tests.TestBuilding method)
+
+ test_name_clears_plural() (evennia.commands.default.tests.TestBuilding method)
test_nested_attribute_commands() (evennia.commands.default.tests.TestBuilding method)
diff --git a/docs/latest/objects.inv b/docs/latest/objects.inv
index a5832e3669be4d08369fbf598034afdc53bd54a3..b9f2d135affb3419bab33129b4804b6587eb30de 100644
GIT binary patch
delta 164312
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/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