From ce899c6430d159eac7e7b141abd43b3c139b37df Mon Sep 17 00:00:00 2001
From: Evennia docbuilder action
Date: Sun, 11 Aug 2024 18:07:20 +0000
Subject: [PATCH] Updated HTML docs.
---
docs/latest/.buildinfo | 2 +-
docs/latest/Coding/Changelog.html | 12 +-
.../evennia/commands/default/building.html | 113 +++++++++++------
.../evennia/commands/default/tests.html | 51 ++++----
.../_modules/evennia/objects/models.html | 15 ++-
.../evennia/scripts/scripthandler.html | 24 ++--
.../_modules/evennia/scripts/scripts.html | 12 +-
.../evennia/typeclasses/attributes.html | 3 +-
.../_modules/evennia/utils/containers.html | 21 +++-
docs/latest/_sources/Coding/Changelog.md.txt | 16 ++-
.../api/evennia.commands.default.account.html | 4 +-
.../evennia.commands.default.building.html | 114 +++++++++++++++---
.../api/evennia.commands.default.general.html | 12 +-
.../api/evennia.commands.default.tests.html | 2 +-
.../evennia.commands.default.unloggedin.html | 4 +-
....base_systems.email_login.email_login.html | 4 +-
...b.base_systems.ingame_reports.reports.html | 4 +-
...systems.mux_comms_cmds.mux_comms_cmds.html | 8 +-
...rib.full_systems.evscaperoom.commands.html | 24 ++--
...ame_systems.achievements.achievements.html | 4 +-
...ia.contrib.game_systems.barter.barter.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 +-
...trib.grid.extended_room.extended_room.html | 4 +-
.../api/evennia.contrib.rpg.dice.dice.html | 4 +-
...evennia.contrib.rpg.rpsystem.rpsystem.html | 4 +-
...b.tutorials.evadventure.combat_twitch.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.utils.containers.html | 7 +-
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 | 2 +
docs/latest/objects.inv | Bin 171676 -> 171682 bytes
docs/latest/searchindex.js | 2 +-
41 files changed, 364 insertions(+), 188 deletions(-)
diff --git a/docs/latest/.buildinfo b/docs/latest/.buildinfo
index 306a7ae781..d87357397f 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: 95425e40c23b458d3565e4cd0db6b534
+config: 9376053b798170d6a094a1e427a0e3e4
tags: 645f666f9bcd5a90fca523b33c5a78b7
diff --git a/docs/latest/Coding/Changelog.html b/docs/latest/Coding/Changelog.html
index 6c3d28bdd4..5571fd0ac9 100644
--- a/docs/latest/Coding/Changelog.html
+++ b/docs/latest/Coding/Changelog.html
@@ -200,7 +200,17 @@
Changelog
Main branch
-[Docs][issue3591]: Fix of NPC reaction tutorial code (Griatch)
+Feat: Support scripts key:typeclass form to create global scripts
+with dynamic keys (rather than just relying on typeclass’ key). Support
+searching using the same syntax (Griatch)
+Fix: Better error if trying to treat ObjectDB as a typeclass (Griatch)
+Fix: Make examine command properly show strattr type
+Attribute values (Griatch)
+Fix: GLOBAL_SCRIPTS container didn’t list global scripts not
+defined explicitly to be restarted/recrated in settings.py (Griatch)
+Fix: Passing an already instantiated Script to obj.scripts.add (ScriptHandler.add)
+did not add it to the handler’s object (Griatch)
+Docs: Fix of NPC reaction tutorial code (Griatch)
Evennia 4.3.0
diff --git a/docs/latest/_modules/evennia/commands/default/building.html b/docs/latest/_modules/evennia/commands/default/building.html
index 3e89bd3833..823a1bd15a 100644
--- a/docs/latest/_modules/evennia/commands/default/building.html
+++ b/docs/latest/_modules/evennia/commands/default/building.html
@@ -97,11 +97,10 @@
import re
import typing
+import evennia
from django.conf import settings
from django.core.paginator import Paginator
from django.db.models import Max, Min, Q
-
-import evennia
from evennia import InterruptCommand
from evennia.commands.cmdhandler import generate_cmdset_providers, get_and_merge_cmdsets
from evennia.locks.lockhandler import LockException
@@ -2923,8 +2922,12 @@
_FUNCPARSER = funcparser.FuncParser(settings.FUNCPARSER_OUTGOING_MESSAGES_MODULES)
key, category, value = attr.db_key, attr.db_category, attr.value
+ valuetype = ""
+ if value is None and attr.strvalue is not None:
+ value = attr.strvalue
+ valuetype = " |B[strvalue]|n"
typ = self._get_attribute_value_type(value)
- typ = f" |B[type: {typ}]|n" if typ else ""
+ typ = f" |B[type:{typ}]|n{valuetype}" if typ else f"{valuetype}"
value = utils.to_str(value)
value = _FUNCPARSER.parse(ansi_raw(value), escape=True)
return (
@@ -2938,8 +2941,12 @@
_FUNCPARSER = funcparser.FuncParser(settings.FUNCPARSER_OUTGOING_MESSAGES_MODULES)
key, category, value = attr.db_key, attr.db_category, attr.value
+ valuetype = ""
+ if value is None and attr.strvalue is not None:
+ value = attr.strvalue
+ valuetype = " |B[strvalue]|n"
typ = self._get_attribute_value_type(value)
- typ = f" |B[type: {typ}]|n" if typ else ""
+ typ = f" |B[type: {typ}]|n{valuetype}" if typ else f"{valuetype}"
value = utils.to_str(value)
value = _FUNCPARSER.parse(ansi_raw(value), escape=True)
value = utils.crop(value)
@@ -3531,7 +3538,7 @@
if (hasattr(script, "obj") and script.obj)
else "<Global>"
),
- script.key,
+ script.db_key,
script.interval if script.interval > 0 else "--",
nextrep,
rept,
@@ -3552,17 +3559,20 @@
script[/start||stop] <obj> = [<script.path or script-key>]
Switches:
- start - start/unpause an existing script's timer.
- stop - stops an existing script's timer
- pause - pause a script's timer
+ start - start/unpause an existing script's timer.
+ stop - stops an existing script's timer
+ pause - pause a script's timer
delete - deletes script. This will also stop the timer as needed
Examples:
- script - list all scripts
- script foo.bar.Script - create a new global Script
- script/pause foo.bar.Script - pause global script
- script scriptname|#dbref - examine named existing global script
- script/delete #dbref[-#dbref] - delete script or range by #dbref
+ script - list all scripts
+ script key:foo.bar.Script - create a new global Script with typeclass
+ and key 'key'
+ script foo.bar.Script - create a new global Script with typeclass
+ (key taken from typeclass or auto-generated)
+ script/pause foo.bar.Script - pause global script
+ script typeclass|name|#dbref - examine named existing global script
+ script/delete #dbref[-#dbref] - delete script or range by #dbref
script myobj = - list all scripts on object
script myobj = foo.bar.Script - create and assign script to object
@@ -3587,14 +3597,13 @@
key = "@scripts"
aliases = ["@script"]
- switch_options = ("create", "start", "stop", "pause", "delete")
+ switch_options = ("start", "stop", "pause", "delete")
locks = "cmd:perm(scripts) or perm(Builder)"
help_category = "System"
excluded_typeclass_paths = ["evennia.prototypes.prototypes.DbPrototype"]
switch_mapping = {
- "create": "|gCreated|n",
"start": "|gStarted|n",
"stop": "|RStopped|n",
"pause": "|Paused|n",
@@ -3603,21 +3612,32 @@
# never show these script types
hide_script_paths = ("evennia.prototypes.prototypes.DbPrototype",)
- def _search_script(self, args):
- # test first if this is a script match
- scripts = ScriptDB.objects.get_all_scripts(key=args).exclude(
- db_typeclass_path__in=self.hide_script_paths
- )
- if scripts:
- return scripts
- # try typeclass path
+ def _search_script(self):
+
+ # see if a dbref was provided
+ if dbref(self.typeclass_query):
+ scripts = ScriptDB.objects.get_all_scripts(self.typeclass_query)
+ if scripts:
+ return scripts
+ self.caller.msg(f"No script found with dbref {self.typeclass_query}")
+ raise InterruptCommand
+
+ # if we provided a key, we must find an exact match, otherwise we're creating that anew
+ if self.key_query:
+ return ScriptDB.objects.filter(
+ db_key__iexact=self.key_query, db_typeclass_path__iendswith=self.typeclass_query
+ ).exclude(db_typeclass_path__in=self.hide_script_paths)
+
+ # the more general case - try typeclass path
scripts = (
- ScriptDB.objects.filter(db_typeclass_path__iendswith=args)
+ ScriptDB.objects.filter(db_typeclass_path__iendswith=self.typeclass_query)
.exclude(db_typeclass_path__in=self.hide_script_paths)
.order_by("id")
)
if scripts:
return scripts
+
+ args = self.typeclass_query
if "-" in args:
# may be a dbref-range
val1, val2 = (dbref(part.strip()) for part in args.split("-", 1))
@@ -3630,6 +3650,29 @@
if scripts:
return scripts
+[docs] def parse(self):
+
super().parse()
+
+
if not self.args:
+
return
+
+
def _separate_key_typeclass(part):
+
part1, *part2 = part.split(":", 1)
+
return (part1, part2[0]) if part2 else (None, part1)
+
+
if self.rhs:
+
# arg with "="
+
self.obj_query = self.lhs
+
self.key_query, self.typeclass_query = _separate_key_typeclass(self.rhs)
+
elif self.rhs is not None:
+
# an empty "="
+
self.obj_query = self.lhs
+
self.key_query, self.typeclass_query = None, None
+
else:
+
# arg without "="
+
self.obj_query = None
+
self.key_query, self.typeclass_query = _separate_key_typeclass(self.args)
+
[docs] def func(self):
"""implement method"""
@@ -3645,20 +3688,8 @@
return
# find script or object to operate on
-
scripts, obj = None, None
-
if self.rhs:
-
obj_query = self.lhs
-
script_query = self.rhs
-
elif self.rhs is not None:
-
# an empty "="
-
obj_query = self.lhs
-
script_query = None
-
else:
-
obj_query = None
-
script_query = self.args
-
-
scripts = self._search_script(script_query) if script_query else None
-
objects = caller.search(obj_query, quiet=True) if obj_query else None
+
scripts = self._search_script() if self.typeclass_query else None
+
objects = caller.search(self.obj_query, quiet=True) if self.obj_query else None
obj = objects[0] if objects else None
if not self.switches:
@@ -3667,7 +3698,7 @@
# we have an object
if self.rhs:
# creation mode
-
if obj.scripts.add(self.rhs, autostart=True):
+
if obj.scripts.add(self.typeclass_query, key=self.key_query, autostart=True):
caller.msg(
f"Script |w{self.rhs}|n successfully added and "
f"started on {obj.get_display_name(caller)}."
@@ -3695,7 +3726,9 @@
else:
# create global script
try:
-
new_script = create.create_script(self.args)
+
new_script = create.create_script(
+
typeclass=self.typeclass_query, key=self.key_query
+
)
except ImportError:
logger.log_trace()
new_script = None
diff --git a/docs/latest/_modules/evennia/commands/default/tests.html b/docs/latest/_modules/evennia/commands/default/tests.html
index 52025f2807..167f282588 100644
--- a/docs/latest/_modules/evennia/commands/default/tests.html
+++ b/docs/latest/_modules/evennia/commands/default/tests.html
@@ -106,13 +106,10 @@
import datetime
from unittest.mock import MagicMock, Mock, patch
+
import evennia
from anything import Anything
from django.conf import settings
from django.test import override_settings
-
from parameterized import parameterized
-
from twisted.internet import task
-
-
import evennia
from evennia import (
DefaultCharacter,
DefaultExit,
@@ -124,14 +121,7 @@
from evennia.commands import cmdparser
from evennia.commands.cmdset import CmdSet
from evennia.commands.command import Command, InterruptCommand
-
from evennia.commands.default import (
-
account,
-
admin,
-
batchprocess,
-
building,
-
comms,
-
general,
-
)
+
from evennia.commands.default import account, admin, batchprocess, building, comms, general
from evennia.commands.default import help as help_module
from evennia.commands.default import syscommands, system, unloggedin
from evennia.commands.default.cmdset_character import CharacterCmdSet
@@ -140,6 +130,8 @@
from evennia.utils import create, gametime, utils
from evennia.utils.test_resources import BaseEvenniaCommandTest # noqa
from evennia.utils.test_resources import BaseEvenniaTest, EvenniaCommandTest
+
from parameterized import parameterized
+
from twisted.internet import task
# ------------------------------------------------------------
# Command testing
@@ -538,7 +530,7 @@
args = f"/pause {self.task.get_id()}"
wanted_msg = "Pause task 1 with completion date"
cmd_result = self.call(system.CmdTasks(), args, wanted_msg)
-
self.assertRegex(cmd_result, " \(func_test_cmd_tasks\) ")
+
self.assertRegex(cmd_result, r" \(func_test_cmd_tasks\) ")
self.char1.execute_cmd("y")
self.assertTrue(self.task.paused)
self.task_handler.clock.advance(self.timedelay + 1)
@@ -547,7 +539,7 @@
self.assertTrue(self.task.exists())
wanted_msg = "Unpause task 1 with completion date"
cmd_result = self.call(system.CmdTasks(), args, wanted_msg)
-
self.assertRegex(cmd_result, " \(func_test_cmd_tasks\) ")
+
self.assertRegex(cmd_result, r" \(func_test_cmd_tasks\) ")
self.char1.execute_cmd("y")
# verify task continues after unpause
self.task_handler.clock.advance(1)
@@ -557,7 +549,7 @@
args = f"/do_task {self.task.get_id()}"
wanted_msg = "Do_task task 1 with completion date"
cmd_result = self.call(system.CmdTasks(), args, wanted_msg)
-
self.assertRegex(cmd_result, " \(func_test_cmd_tasks\) ")
+
self.assertRegex(cmd_result, r" \(func_test_cmd_tasks\) ")
self.char1.execute_cmd("y")
self.assertFalse(self.task.exists())
@@ -565,7 +557,7 @@
args = f"/remove {self.task.get_id()}"
wanted_msg = "Remove task 1 with completion date"
cmd_result = self.call(system.CmdTasks(), args, wanted_msg)
- self.assertRegex(cmd_result, " \(func_test_cmd_tasks\) ")
+ self.assertRegex(cmd_result, r" \(func_test_cmd_tasks\) ")
self.char1.execute_cmd("y")
self.assertFalse(self.task.exists())
@@ -573,7 +565,7 @@
args = f"/call {self.task.get_id()}"
wanted_msg = "Call task 1 with completion date"
cmd_result = self.call(system.CmdTasks(), args, wanted_msg)
- self.assertRegex(cmd_result, " \(func_test_cmd_tasks\) ")
+ self.assertRegex(cmd_result, r" \(func_test_cmd_tasks\) ")
self.char1.execute_cmd("y")
# make certain the task is still active
self.assertTrue(self.task.active())
@@ -585,7 +577,7 @@
args = f"/cancel {self.task.get_id()}"
wanted_msg = "Cancel task 1 with completion date"
cmd_result = self.call(system.CmdTasks(), args, wanted_msg)
- self.assertRegex(cmd_result, " \(func_test_cmd_tasks\) ")
+ self.assertRegex(cmd_result, r" \(func_test_cmd_tasks\) ")
self.char1.execute_cmd("y")
self.assertTrue(self.task.exists())
self.assertFalse(self.task.active())
@@ -889,13 +881,20 @@
self.call(
building.CmdExamine(),
"self/test2",
- "Attribute Char/test2 [category=None]:\n\nthis is a \$random() value.",
+ "Attribute Char/test2 [category=None]:\n\nthis is a \\$random() value.",
)
self.room1.scripts.add(self.script.__class__)
self.call(building.CmdExamine(), "")
self.account.scripts.add(self.script.__class__)
- self.call(building.CmdExamine(), "*TestAccount")
+ self.call(building.CmdExamine(), "*TestAccount")
+
+ self.char1.attributes.add("strattr", "testval", strattr=True)
+ self.call(
+ building.CmdExamine(),
+ "self/strattr",
+ "Attribute Char/strattr [category=None] [strvalue]:\n\ntestval",
+ )
[docs] def test_set_obj_alias(self):
self.call(building.CmdSetObjAlias(), "Obj =", "Cleared aliases from Obj")
@@ -1746,17 +1745,17 @@
)
[docs] def test_script_multi_delete(self):
-
script1 = create.create_script()
-
script2 = create.create_script()
-
script3 = create.create_script()
+
script1 = create.create_script(key="script1")
+
script2 = create.create_script(key="script2")
+
script3 = create.create_script(key="script3")
self.call(
building.CmdScripts(),
"/delete #{}-#{}".format(script1.id, script3.id),
(
-
f"Global Script Deleted - #{script1.id} (evennia.scripts.scripts.DefaultScript)|"
-
f"Global Script Deleted - #{script2.id} (evennia.scripts.scripts.DefaultScript)|"
-
f"Global Script Deleted - #{script3.id} (evennia.scripts.scripts.DefaultScript)"
+
f"Global Script Deleted - script1 (evennia.scripts.scripts.DefaultScript)|"
+
f"Global Script Deleted - script2 (evennia.scripts.scripts.DefaultScript)|"
+
f"Global Script Deleted - script3 (evennia.scripts.scripts.DefaultScript)"
),
inputs=["y"],
)
diff --git a/docs/latest/_modules/evennia/objects/models.html b/docs/latest/_modules/evennia/objects/models.html
index f3c336c1ae..2ba117e623 100644
--- a/docs/latest/_modules/evennia/objects/models.html
+++ b/docs/latest/_modules/evennia/objects/models.html
@@ -112,7 +112,6 @@
from django.core.exceptions import ObjectDoesNotExist
from django.core.validators import validate_comma_separated_integer_list
from django.db import models
-
from evennia.objects.manager import ObjectDBManager
from evennia.typeclasses.models import TypedObject
from evennia.utils import logger
@@ -163,8 +162,18 @@
objects = self.load()
self._pkcache = {obj.pk: True for obj in objects}
for obj in objects:
-
for ctype in obj._content_types:
-
self._typecache[ctype][obj.pk] = True
+ try:
+ ctypes = obj._content_types
+ except AttributeError:
+ logger.log_err(
+ f"Object {obj} has no `_content_types` property. Skipping content-cache setup. "
+ "This error suggests it is not a valid Evennia Typeclass but maybe a root model "
+ "like `ObjectDB`. Investigate the `db_typeclass_path` of the object and make sure "
+ "it points to a proper, existing Typeclass."
+ )
+ else:
+ for ctype in obj._content_types:
+ self._typecache[ctype][obj.pk] = True
[docs] def get(self, exclude=None, content_type=None):
"""
diff --git a/docs/latest/_modules/evennia/scripts/scripthandler.html b/docs/latest/_modules/evennia/scripts/scripthandler.html
index cbe1d4e58b..579fe6dab2 100644
--- a/docs/latest/_modules/evennia/scripts/scripthandler.html
+++ b/docs/latest/_modules/evennia/scripts/scripthandler.html
@@ -99,7 +99,6 @@
"""
from django.utils.translation import gettext as _
-
from evennia.scripts.models import ScriptDB
from evennia.utils import create, logger
@@ -165,18 +164,27 @@
Script: The newly created Script.
"""
-
if self.obj.__dbclass__.__name__ == "AccountDB":
-
# we add to an Account, not an Object
-
script = create.create_script(
-
scriptclass, key=key, account=self.obj, autostart=autostart
-
)
-
elif isinstance(scriptclass, str) or callable(scriptclass):
+
if isinstance(scriptclass, str) or callable(scriptclass):
# a str or class to use create before adding to an Object. We wait to autostart
# so we can differentiate a failing creation from a script that immediately starts/stops.
-
script = create.create_script(scriptclass, key=key, obj=self.obj, autostart=False)
+
if self.obj.__dbclass__.__name__ == "AccountDB":
+
# we add to an Account, not an Object
+
script = create.create_script(
+
scriptclass, key=key, account=self.obj, autostart=False
+
)
+
else:
+
script = create.create_script(scriptclass, key=key, obj=self.obj, autostart=False)
else:
# already an instantiated class
script = scriptclass
+
if script.db_obj and script.db_obj != self.obj:
+
logger.log_err(
+
f"Script instance {script} already belongs to "
+
f"another object: {script.db_obj}."
+
)
+
return None
+
script.db_obj = self.obj
+
script.save()
if not script:
logger.log_err(f"Script {scriptclass} failed to be created.")
diff --git a/docs/latest/_modules/evennia/scripts/scripts.html b/docs/latest/_modules/evennia/scripts/scripts.html
index 92d3c810e0..72714f0120 100644
--- a/docs/latest/_modules/evennia/scripts/scripts.html
+++ b/docs/latest/_modules/evennia/scripts/scripts.html
@@ -98,13 +98,12 @@
"""
from django.utils.translation import gettext as _
-
from twisted.internet.defer import Deferred, maybeDeferred
-
from twisted.internet.task import LoopingCall
-
from evennia.scripts.manager import ScriptManager
from evennia.scripts.models import ScriptDB
from evennia.typeclasses.models import TypeclassBase
from evennia.utils import create, logger
+
from twisted.internet.defer import Deferred, maybeDeferred
+
from twisted.internet.task import LoopingCall
__all__ = ["DefaultScript", "DoNothing", "Store"]
@@ -515,7 +514,12 @@
updates = []
if not cdict.get("key"):
if not self.db_key:
-
self.db_key = "#%i" % self.dbid
+
if hasattr(self, "key"):
+
# take key from the object typeclass
+
self.db_key = self.key
+
else:
+
# no key set anywhere, use class+dbid as key
+
self.db_key = f"{self.__class__.__name__}(#{self.dbid})"
updates.append("db_key")
elif self.db_key != cdict["key"]:
self.db_key = cdict["key"]
diff --git a/docs/latest/_modules/evennia/typeclasses/attributes.html b/docs/latest/_modules/evennia/typeclasses/attributes.html
index c1ff260210..827c30f6e8 100644
--- a/docs/latest/_modules/evennia/typeclasses/attributes.html
+++ b/docs/latest/_modules/evennia/typeclasses/attributes.html
@@ -109,7 +109,6 @@
from django.conf import settings
from django.db import models
from django.utils.encoding import smart_str
-
from evennia.locks.lockhandler import LockHandler
from evennia.utils.dbserialize import from_pickle, to_pickle
from evennia.utils.idmapper.models import SharedMemoryModel
@@ -234,6 +233,8 @@
# Value and locks are special. We must call the wrappers.
if key == "value":
self.value = value
+
elif key == "strvalue":
+
self.db_strvalue = value
elif key == "lock_storage":
self.lock_storage = value
else:
diff --git a/docs/latest/_modules/evennia/utils/containers.html b/docs/latest/_modules/evennia/utils/containers.html
index b844378e5c..672fd84bba 100644
--- a/docs/latest/_modules/evennia/utils/containers.html
+++ b/docs/latest/_modules/evennia/utils/containers.html
@@ -106,7 +106,7 @@
from django.conf import settings
from django.db.utils import OperationalError, ProgrammingError
-
+
from evennia.scripts.models import ScriptDB
from evennia.utils import logger
from evennia.utils.utils import callables_from_module, class_from_module
@@ -309,7 +309,7 @@
"""
if not self.loaded:
self.load_data()
-
out_value = default
+
script_found = None
if key in self.loaded_data:
if key not in self.typeclass_storage:
# this means we are trying to load in a loop
@@ -322,8 +322,12 @@
script_found = self._load_script(key)
if script_found:
out_value = script_found
+
else:
+
# script not found in settings, see if one exists in database (not
+
# auto-started/recreated)
+
script_found = ScriptDB.objects.filter(db_key__iexact=key, db_obj__isnull=True).first()
-
return out_value
+ return script_found if script_found is not None else default
[docs] def all(self):
"""
@@ -331,12 +335,19 @@
scripts defined in settings.
Returns:
-
scripts (list): All global script objects stored on the container.
+
list: All global script objects in game (both managed and unmanaged),
+
sorted alphabetically.
"""
if not self.loaded:
self.load_data()
-
return list(self.loaded_data.values())
+ managed_scripts = list(self.loaded_data.values())
+ unmanaged_scripts = list(
+ ScriptDB.objects.filter(db_obj__isnull=True).exclude(
+ id__in=[scr.id for scr in managed_scripts]
+ )
+ )
+ return list(sorted(managed_scripts + unmanaged_scripts, key=lambda scr: scr.db_key))
# Create all singletons
diff --git a/docs/latest/_sources/Coding/Changelog.md.txt b/docs/latest/_sources/Coding/Changelog.md.txt
index aa4243e8ec..533de8ca14 100644
--- a/docs/latest/_sources/Coding/Changelog.md.txt
+++ b/docs/latest/_sources/Coding/Changelog.md.txt
@@ -2,9 +2,23 @@
## Main branch
+Feat: Support `scripts key:typeclass` form to create global scripts
+with dynamic keys (rather than just relying on typeclass' key). Support
+searching using the same syntax (Griatch)
+[Fix][issue3556]: Better error if trying to treat ObjectDB as a typeclass (Griatch)
+[Fix][issue3590]: Make `examine` command properly show `strattr` type
+Attribute values (Griatch)
+[Fix][issue3519]: `GLOBAL_SCRIPTS` container didn't list global scripts not
+defined explicitly to be restarted/recrated in settings.py (Griatch)
+Fix: Passing an already instantiated Script to `obj.scripts.add` (`ScriptHandler.add`)
+did not add it to the handler's object (Griatch)
[Docs][issue3591]: Fix of NPC reaction tutorial code (Griatch)
-[issue3592]: https://github.com/evennia/evennia/issues/3591
+[issue3591]: https://github.com/evennia/evennia/issues/3591
+[issue3590]: https://github.com/evennia/evennia/issues/3590
+[issue3556]: https://github.com/evennia/evennia/issues/3556
+[issue3519]: https://github.com/evennia/evennia/issues/3519
+
## Evennia 4.3.0
diff --git a/docs/latest/api/evennia.commands.default.account.html b/docs/latest/api/evennia.commands.default.account.html
index 8daf6e14d2..b87d5b9fb8 100644
--- a/docs/latest/api/evennia.commands.default.account.html
+++ b/docs/latest/api/evennia.commands.default.account.html
@@ -147,7 +147,7 @@ method. Otherwise all text will be returned to all connected sessions.
-
-
aliases = ['ls', 'l']
+aliases = ['l', 'ls']
@@ -178,7 +178,7 @@ method. Otherwise all text will be returned to all connected sessions.
-
-
search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n look while out-of-character\n\n Usage:\n look\n\n Look in the ooc state.\n '}
+search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n look while out-of-character\n\n Usage:\n look\n\n Look in the ooc state.\n '}
diff --git a/docs/latest/api/evennia.commands.default.building.html b/docs/latest/api/evennia.commands.default.building.html
index 0ce4849f41..c0a18969f3 100644
--- a/docs/latest/api/evennia.commands.default.building.html
+++ b/docs/latest/api/evennia.commands.default.building.html
@@ -647,7 +647,7 @@ You can specify the /force switch to bypass this confirmation.
-
-
aliases = ['@delete', '@del']
+aliases = ['@del', '@delete']
@@ -688,7 +688,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 '}
@@ -1415,7 +1415,7 @@ server settings.
-
-
aliases = ['@swap', '@parent', '@typeclasses', '@update', '@type']
+aliases = ['@typeclasses', '@type', '@parent', '@update', '@swap']
@@ -1446,7 +1446,7 @@ server settings.
-
-
search_index_entry = {'aliases': '@swap @parent @typeclasses @update @type', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass swap parent typeclasses update 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': '@typeclasses @type @parent @update @swap', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass typeclasses type parent update 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 "}
@@ -1908,7 +1908,7 @@ one is given.
-
-
aliases = ['@search', '@locate']
+aliases = ['@locate', '@search']
@@ -1939,7 +1939,7 @@ one is given.
-
-
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 '}
@@ -2043,18 +2043,25 @@ scripts.
Usage:script[/switches] [script-#dbref, key, script.path]
script[/start||stop] <obj> = [<script.path or script-key>]
-Switches:start - start/unpause an existing script’s timer.
-stop - stops an existing script’s timer
-pause - pause a script’s timer
+
Switches:start - start/unpause an existing script’s timer.
+stop - stops an existing script’s timer
+pause - pause a script’s timer
delete - deletes script. This will also stop the timer as needed
Examples
-script - list all scripts
-script foo.bar.Script - create a new global Script
-script/pause foo.bar.Script - pause global script
-script scriptname|#dbref - examine named existing global script
-script/delete #dbref[-#dbref] - delete script or range by #dbref
+script - list all scripts
+script key:foo.bar.Script - create a new global Script with typeclass
+
+
+
+- script foo.bar.Script - create a new global Script with typeclass
(key taken from typeclass or auto-generated)
+
+
+script/pause foo.bar.Script - pause global script
+script typeclass|name|#dbref - examine named existing global script
+script/delete #dbref[-#dbref] - delete script or range by #dbref
script myobj = - list all scripts on object
script myobj = foo.bar.Script - create and assign script to object
script/stop myobj = name|#dbref - stop named script on object
@@ -2082,7 +2089,7 @@ objects.
-
-
switch_options = ('create', 'start', 'stop', 'pause', 'delete')
+switch_options = ('start', 'stop', 'pause', 'delete')
@@ -2102,7 +2109,7 @@ objects.
-
-
switch_mapping = {'create': '|gCreated|n', 'delete': '|rDeleted|n', 'pause': '|Paused|n', 'start': '|gStarted|n', 'stop': '|RStopped|n'}
+switch_mapping = {'delete': '|rDeleted|n', 'pause': '|Paused|n', 'start': '|gStarted|n', 'stop': '|RStopped|n'}
@@ -2110,6 +2117,79 @@ objects.
hide_script_paths = ('evennia.prototypes.prototypes.DbPrototype',)
+
+-
+
parse()[source]
+This method is called by the cmdhandler once the command name
+has been identified. It creates a new set of member variables
+that can be later accessed from self.func() (see below)
+The following variables are available for our use when entering this
+method (from the command definition, and assigned on the fly by the
+cmdhandler):
+
+self.key - the name of this command (‘look’)
+self.aliases - the aliases of this cmd (‘l’)
+self.permissions - permission string for this command
+self.help_category - overall category of command
+
self.caller - the object calling this command
+self.cmdstring - the actual command name used to call this
+
+
+- (this allows you to know which alias was used,
for example)
+
+
+
+
self.args - the raw input; everything following self.cmdstring.
+self.cmdset - the cmdset from which this command was picked. Not
+
+often used (useful for commands like ‘help’ or to
+list all available commands etc)
+
+
+- self.obj - the object on which this command was defined. It is often
the same as self.caller.
+
+
+
+A MUX command has the following possible syntax:
+
+name[ with several words][/switch[/switch..]] arg1[,arg2,…] [[=|,] arg[,..]]
+
+The ‘name[ with several words]’ part is already dealt with by the
+cmdhandler at this point, and stored in self.cmdname (we don’t use
+it here). The rest of the command is stored in self.args, which can
+start with the switch indicator /.
+
+- Optional variables to aid in parsing, if set:
+- self.switch_options - (tuple of valid /switches expected by this
command (without the /))
+
+- self.rhs_split - Alternate string delimiter or tuple of strings
to separate left/right hand sides. tuple form
+gives priority split to first string delimiter.
+
+
+
+
+This parser breaks self.args into its constituents and stores them in the
+following variables:
+
+self.switches = [list of /switches (without the /)]
+self.raw = This is the raw argument input, including switches
+self.args = This is re-defined to be everything except the switches
+self.lhs = Everything to the left of = (lhs:’left-hand side’). If
+
+no = is found, this is identical to self.args.
+
+
+- self.rhs: Everything to the right of = (rhs:’right-hand side’).
If no ‘=’ is found, this is None.
+
+
+
self.lhslist - [self.lhs split into a list by comma]
+self.rhslist - [list of self.rhs split into a list by comma]
+self.arglist = [list of space-separated args (stripped, including ‘=’ if it exists)]
+
All args and list members are stripped of excess whitespace around the
+strings, but case is preserved.
+
+
+
-
func()[source]
@@ -2123,7 +2203,7 @@ objects.
-
-
search_index_entry = {'aliases': '@script', 'category': 'system', 'key': '@scripts', 'no_prefix': 'scripts script', 'tags': '', 'text': "\n List and manage all running scripts. Allows for creating new global\n scripts.\n\n Usage:\n script[/switches] [script-#dbref, key, script.path]\n script[/start||stop] <obj> = [<script.path or script-key>]\n\n Switches:\n start - start/unpause an existing script's timer.\n stop - stops an existing script's timer\n pause - pause a script's timer\n delete - deletes script. This will also stop the timer as needed\n\n Examples:\n script - list all scripts\n script foo.bar.Script - create a new global Script\n script/pause foo.bar.Script - pause global script\n script scriptname|#dbref - examine named existing global script\n script/delete #dbref[-#dbref] - delete script or range by #dbref\n\n script myobj = - list all scripts on object\n script myobj = foo.bar.Script - create and assign script to object\n script/stop myobj = name|#dbref - stop named script on object\n script/delete myobj = name|#dbref - delete script on object\n script/delete myobj = - delete ALL scripts on object\n\n When given with an `<obj>` as left-hand-side, this creates and\n assigns a new script to that object. Without an `<obj>`, this\n manages and inspects global scripts.\n\n If no switches are given, this command just views all active\n scripts. The argument can be either an object, at which point it\n will be searched for all scripts defined on it, or a script name\n or #dbref. For using the /stop switch, a unique script #dbref is\n required since whole classes of scripts often have the same name.\n\n Use the `script` build-level command for managing scripts attached to\n objects.\n\n "}
+search_index_entry = {'aliases': '@script', 'category': 'system', 'key': '@scripts', 'no_prefix': 'scripts script', 'tags': '', 'text': "\n List and manage all running scripts. Allows for creating new global\n scripts.\n\n Usage:\n script[/switches] [script-#dbref, key, script.path]\n script[/start||stop] <obj> = [<script.path or script-key>]\n\n Switches:\n start - start/unpause an existing script's timer.\n stop - stops an existing script's timer\n pause - pause a script's timer\n delete - deletes script. This will also stop the timer as needed\n\n Examples:\n script - list all scripts\n script key:foo.bar.Script - create a new global Script with typeclass\n and key 'key'\n script foo.bar.Script - create a new global Script with typeclass\n (key taken from typeclass or auto-generated)\n script/pause foo.bar.Script - pause global script\n script typeclass|name|#dbref - examine named existing global script\n script/delete #dbref[-#dbref] - delete script or range by #dbref\n\n script myobj = - list all scripts on object\n script myobj = foo.bar.Script - create and assign script to object\n script/stop myobj = name|#dbref - stop named script on object\n script/delete myobj = name|#dbref - delete script on object\n script/delete myobj = - delete ALL scripts on object\n\n When given with an `<obj>` as left-hand-side, this creates and\n assigns a new script to that object. Without an `<obj>`, this\n manages and inspects global scripts.\n\n If no switches are given, this command just views all active\n scripts. The argument can be either an object, at which point it\n will be searched for all scripts defined on it, or a script name\n or #dbref. For using the /stop switch, a unique script #dbref is\n required since whole classes of scripts often have the same name.\n\n Use the `script` build-level command for managing scripts attached to\n objects.\n\n "}
diff --git a/docs/latest/api/evennia.commands.default.general.html b/docs/latest/api/evennia.commands.default.general.html
index 57420a8a95..d7a84ce7c2 100644
--- a/docs/latest/api/evennia.commands.default.general.html
+++ b/docs/latest/api/evennia.commands.default.general.html
@@ -189,7 +189,7 @@ look *<account&g
-
-
aliases = ['ls', 'l']
+aliases = ['l', 'ls']
@@ -220,7 +220,7 @@ look *<account&g
-
-
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 '}
@@ -722,7 +722,7 @@ automatically begin with your name.
-
-
aliases = ['emote', ':']
+aliases = [':', 'emote']
@@ -763,7 +763,7 @@ space.
-
-
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 "}
@@ -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 d135c62745..be41e480a9 100644
--- a/docs/latest/api/evennia.commands.default.tests.html
+++ b/docs/latest/api/evennia.commands.default.tests.html
@@ -980,7 +980,7 @@ main test suite started with
Test the batch processor.
-
-
red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmpkk33rwpf/61374b10ff59d2988cdf42ae6cdf11ccef487dd6/evennia/contrib/tutorials/red_button/red_button.py'>
+red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmpeezfqz24/310a895bb5d2dc80bcb280aa06424d929b7aec91/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 dd71c256fb..21ffe1c5aa 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 = ['conn', 'co', 'con']
+aliases = ['con', 'conn', 'co']
@@ -171,7 +171,7 @@ there is no object yet before the account has logged in)
-
-
search_index_entry = {'aliases': 'conn co con', 'category': 'general', 'key': 'connect', 'no_prefix': ' conn co 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': '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 '}
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 71ff9b8ded..fbe6682b10 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 = ['conn', 'co', 'con']
+aliases = ['con', 'conn', 'co']
@@ -183,7 +183,7 @@ there is no object yet before the account has logged in)
-
-
search_index_entry = {'aliases': 'conn co con', 'category': 'general', 'key': 'connect', 'no_prefix': ' conn co 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 '}
+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 '}
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 0e21045dc4..55e754b6c1 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 players', 'manage ideas', 'manage bugs']
+aliases = ['manage ideas', 'manage players', 'manage bugs']
@@ -208,7 +208,7 @@ to all the variables defined therein.
-
-
search_index_entry = {'aliases': 'manage players manage ideas manage bugs', 'category': 'general', 'key': 'manage reports', 'no_prefix': ' manage players manage ideas manage bugs', '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 ideas manage players manage bugs', 'category': 'general', 'key': 'manage reports', 'no_prefix': ' manage ideas manage players manage bugs', '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 6f78c0d57a..ca9f71eb11 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 = ['aliaschan', 'chanalias']
+aliases = ['chanalias', 'aliaschan']
@@ -205,7 +205,7 @@ aliases to an already joined channel.
-
-
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': '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 '}
@@ -231,7 +231,7 @@ for that channel.
-
-
aliases = ['delaliaschan', 'delchanalias']
+aliases = ['delchanalias', 'delaliaschan']
@@ -262,7 +262,7 @@ for that channel.
-
-
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 6caec86df6..be1fc0d239 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 = ['abort', 'q', 'chicken out', 'quit']
+aliases = ['quit', 'chicken out', 'q', 'abort']
@@ -249,7 +249,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'abort q chicken out quit', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' abort q chicken out 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': '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 '}
@@ -270,7 +270,7 @@ set in self.parse())
-
-
aliases = ['ls', 'l']
+aliases = ['l', 'ls']
@@ -304,7 +304,7 @@ set in self.parse())
-
-
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 '}
@@ -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 '}
@@ -442,7 +442,7 @@ emote /me points to /box and /lever.
-
-
aliases = ['pose', ':']
+aliases = [':', 'pose']
@@ -481,7 +481,7 @@ set in self.parse())
-
-
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 '}
@@ -504,7 +504,7 @@ looks and what actions is available.
-
-
aliases = ['ex', 'unfocus', 'e', 'examine']
+aliases = ['e', 'ex', 'unfocus', 'examine']
@@ -533,7 +533,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'ex unfocus e examine', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' ex unfocus e examine', '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': 'e ex unfocus examine', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' e ex unfocus examine', '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 = ['inv', 'i', 'give', 'inventory']
+aliases = ['inv', 'give', 'inventory', 'i']
@@ -619,7 +619,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'inv i give inventory', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' inv i give inventory', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}
+search_index_entry = {'aliases': 'inv give inventory i', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' inv give inventory i', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}
diff --git a/docs/latest/api/evennia.contrib.game_systems.achievements.achievements.html b/docs/latest/api/evennia.contrib.game_systems.achievements.achievements.html
index 3ddd51ff94..2e8ab78baa 100644
--- a/docs/latest/api/evennia.contrib.game_systems.achievements.achievements.html
+++ b/docs/latest/api/evennia.contrib.game_systems.achievements.achievements.html
@@ -289,7 +289,7 @@ achievements/progress rats
-
-
aliases = ['achieve', 'achievement', 'achieves']
+aliases = ['achievement', 'achieves', 'achieve']
@@ -337,7 +337,7 @@ to all the variables defined therein.
-
-
search_index_entry = {'aliases': 'achieve achievement achieves', 'category': 'general', 'key': 'achievements', 'no_prefix': ' achieve achievement achieves', 'tags': '', 'text': '\n view achievements\n\n Usage:\n achievements[/switches] [args]\n\n Switches:\n all View all achievements, including locked ones.\n completed View achievements you\'ve completed.\n progress View achievements you have partially completed\n\n Check your achievement statuses or browse the list. Providing a command argument\n will search all your currently unlocked achievements for matches, and the switches\n will filter the list to something other than "all unlocked". Combining a command\n argument with a switch will search only in that list.\n\n Examples:\n achievements apples\n achievements/all\n achievements/progress rats\n '}
+search_index_entry = {'aliases': 'achievement achieves achieve', 'category': 'general', 'key': 'achievements', 'no_prefix': ' achievement achieves achieve', 'tags': '', 'text': '\n view achievements\n\n Usage:\n achievements[/switches] [args]\n\n Switches:\n all View all achievements, including locked ones.\n completed View achievements you\'ve completed.\n progress View achievements you have partially completed\n\n Check your achievement statuses or browse the list. Providing a command argument\n will search all your currently unlocked achievements for matches, and the switches\n will filter the list to something other than "all unlocked". Combining a command\n argument with a switch will search only in that list.\n\n Examples:\n achievements apples\n achievements/all\n achievements/progress rats\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 995664a60e..180d50f58c 100644
--- a/docs/latest/api/evennia.contrib.game_systems.barter.barter.html
+++ b/docs/latest/api/evennia.contrib.game_systems.barter.barter.html
@@ -759,7 +759,7 @@ try to influence the other part in the deal.
-
-
aliases = ['deal', 'offers']
+aliases = ['offers', 'deal']
@@ -785,7 +785,7 @@ try to influence the other part in the deal.
-
-
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 "}
+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 "}
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.grid.extended_room.extended_room.html b/docs/latest/api/evennia.contrib.grid.extended_room.extended_room.html
index 3f01341f75..712938071f 100644
--- a/docs/latest/api/evennia.contrib.grid.extended_room.extended_room.html
+++ b/docs/latest/api/evennia.contrib.grid.extended_room.extended_room.html
@@ -657,7 +657,7 @@ look *<account&g
-
-
aliases = ['ls', 'l']
+aliases = ['l', 'ls']
@@ -677,7 +677,7 @@ look *<account&g
-
-
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.dice.dice.html b/docs/latest/api/evennia.contrib.rpg.dice.dice.html
index 3d7ee8d157..fad4cb5e02 100644
--- a/docs/latest/api/evennia.contrib.rpg.dice.dice.html
+++ b/docs/latest/api/evennia.contrib.rpg.dice.dice.html
@@ -340,7 +340,7 @@ everyone but the person rolling.
-
-
aliases = ['@dice', 'roll']
+aliases = ['roll', '@dice']
@@ -366,7 +366,7 @@ everyone but the person rolling.
-
-
search_index_entry = {'aliases': '@dice roll', 'category': 'general', 'key': 'dice', 'no_prefix': ' dice roll', 'tags': '', 'text': "\n roll dice\n\n Usage:\n dice[/switch] <nr>d<sides> [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 < 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (<,>,<=,>=,==,!=). So e.g. 2d6 + 3 > 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\n "}
+search_index_entry = {'aliases': 'roll @dice', 'category': 'general', 'key': 'dice', 'no_prefix': ' roll dice', 'tags': '', 'text': "\n roll dice\n\n Usage:\n dice[/switch] <nr>d<sides> [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 < 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (<,>,<=,>=,==,!=). So e.g. 2d6 + 3 > 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\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.evadventure.combat_twitch.html b/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_twitch.html
index b4a3e80767..439688cc0f 100644
--- a/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_twitch.html
+++ b/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_twitch.html
@@ -395,7 +395,7 @@ look *<account&g
-
-
aliases = ['ls', 'l']
+aliases = ['l', 'ls']
@@ -415,7 +415,7 @@ look *<account&g
-
-
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 '}
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 6587209180..7746963e2e 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 = ['push', 'press button', 'press']
+aliases = ['press', 'push', 'press button']
@@ -196,7 +196,7 @@ check if the lid is open or closed.
-
-
search_index_entry = {'aliases': 'push press button press', 'category': 'general', 'key': 'push button', 'no_prefix': ' push press button press', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}
+search_index_entry = {'aliases': 'press push press button', 'category': 'general', 'key': 'push button', 'no_prefix': ' press push press button', '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 = ['break lid', 'smash', 'smash lid']
+aliases = ['smash lid', 'break lid', 'smash']
@@ -293,7 +293,7 @@ break.
-
-
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 '}
+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 '}
@@ -393,7 +393,7 @@ be mutually exclusive.
-
-
aliases = ['push', 'press button', 'press']
+aliases = ['press', 'push', 'press button']
@@ -422,7 +422,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'push press button press', 'category': 'general', 'key': 'push button', 'no_prefix': ' push press button press', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}
+search_index_entry = {'aliases': 'press push press button', 'category': 'general', 'key': 'push button', 'no_prefix': ' press push press button', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}
@@ -520,7 +520,7 @@ be mutually exclusive.
-
-
aliases = ['ex', 'listen', 'l', 'examine', 'get', 'feel']
+aliases = ['ex', 'feel', 'l', 'listen', 'get', 'examine']
@@ -546,7 +546,7 @@ be mutually exclusive.
-
-
search_index_entry = {'aliases': 'ex listen l examine get feel', 'category': 'general', 'key': 'look', 'no_prefix': ' ex listen l examine 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 "}
+search_index_entry = {'aliases': 'ex feel l listen get examine', 'category': 'general', 'key': 'look', 'no_prefix': ' ex feel l listen get examine', '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 d5d940a221..3614427d78 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 = ['push', 'shiftroot', 'move', 'pull']
+aliases = ['shiftroot', 'move', 'pull', 'push']
@@ -606,7 +606,7 @@ yellow/green - horizontal roots
-
-
search_index_entry = {'aliases': 'push shiftroot move pull', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' push shiftroot 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': 'shiftroot move pull push', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' shiftroot move pull 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 = ['push button', 'press button', 'button']
+aliases = ['button', 'push button', 'press button']
@@ -649,7 +649,7 @@ yellow/green - horizontal roots
-
-
search_index_entry = {'aliases': 'push button press button button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' push button press button 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 = ['slash', 'kill', 'bash', 'pierce', 'fight', 'hit', 'parry', 'thrust', 'chop', 'stab', 'defend']
+aliases = ['defend', 'thrust', 'parry', 'kill', 'fight', 'bash', 'stab', 'slash', 'chop', 'pierce', 'hit']
@@ -819,7 +819,7 @@ parry - forgoes your attack but will make you harder to hit on next
-
-
search_index_entry = {'aliases': 'slash kill bash pierce fight hit parry thrust chop stab defend', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' slash kill bash pierce fight hit parry thrust chop stab 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': 'defend thrust parry kill fight bash stab slash chop pierce hit', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' defend thrust parry kill fight bash stab slash chop pierce 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 0f4f67316f..bdf295fe36 100644
--- a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html
+++ b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html
@@ -262,7 +262,7 @@ code except for adding in the details.
-
-
aliases = ['ls', 'l']
+aliases = ['l', 'ls']
@@ -277,7 +277,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 '}
@@ -982,7 +982,7 @@ to find something.
-
-
aliases = ['search', 'feel around', 'l', 'fiddle', 'feel']
+aliases = ['fiddle', 'search', 'l', 'feel', 'feel around']
@@ -1010,7 +1010,7 @@ random chance of eventually finding a light source.
-
-
search_index_entry = {'aliases': 'search feel around l fiddle feel', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' search feel around 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': 'fiddle search l feel feel around', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' fiddle search l feel 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 '}
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 7e7a870e86..7dbcd32043 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/tmpkk33rwpf/61374b10ff59d2988cdf42ae6cdf11ccef487dd6/evennia'
+directory = '/tmp/tmpeezfqz24/310a895bb5d2dc80bcb280aa06424d929b7aec91/evennia'
@@ -283,7 +283,7 @@ git pull - Pull the latest code from your current branch.
-
-
directory = '/tmp/tmpkk33rwpf/61374b10ff59d2988cdf42ae6cdf11ccef487dd6/evennia/game_template'
+directory = '/tmp/tmpeezfqz24/310a895bb5d2dc80bcb280aa06424d929b7aec91/evennia/game_template'
diff --git a/docs/latest/api/evennia.utils.containers.html b/docs/latest/api/evennia.utils.containers.html
index 2a94c05e32..5cefdf5311 100644
--- a/docs/latest/api/evennia.utils.containers.html
+++ b/docs/latest/api/evennia.utils.containers.html
@@ -255,7 +255,12 @@ at all on this container (i.e it cannot be loaded at all).
scripts defined in settings.
- Returns
-scripts (list) – All global script objects stored on the container.
+list –
+
+- All global script objects in game (both managed and unmanaged),
sorted alphabetically.
+
+
+
diff --git a/docs/latest/api/evennia.utils.eveditor.html b/docs/latest/api/evennia.utils.eveditor.html
index 1599b41a7d..98ac29079e 100644
--- a/docs/latest/api/evennia.utils.eveditor.html
+++ b/docs/latest/api/evennia.utils.eveditor.html
@@ -356,7 +356,7 @@ indentation.
-
-
aliases = [':r', '::', ':p', ':dw', ':x', ':DD', ':j', ':fi', ':echo', ':>', ':fd', ':f', ':wq', ':!', ':s', ':y', ':=', ':h', ':w', ':uu', ':q!', ':<', ':u', ':', ':S', ':UU', ':dd', ':::', ':i', ':A', ':q', ':I']
+aliases = [':u', ':q', ':y', ':i', ':>', ':!', ':f', ':h', ':fd', ':I', ':=', ':r', ':UU', ':::', ':w', '::', ':x', ':<', ':q!', ':DD', ':s', ':j', ':dw', ':A', ':wq', ':dd', ':', ':uu', ':p', ':echo', ':S', ':fi']
@@ -384,7 +384,7 @@ efficient presentation.
-
-
search_index_entry = {'aliases': ':r :: :p :dw :x :DD :j :fi :echo :> :fd :f :wq :! :s :y := :h :w :uu :q! :< :u : :S :UU :dd ::: :i :A :q :I', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :r :: :p :dw :x :DD :j :fi :echo :> :fd :f :wq :! :s :y := :h :w :uu :q! :< :u : :S :UU :dd ::: :i :A :q :I', 'tags': '', 'text': '\n Commands for the editor\n '}
+search_index_entry = {'aliases': ':u :q :y :i :> :! :f :h :fd :I := :r :UU ::: :w :: :x :< :q! :DD :s :j :dw :A :wq :dd : :uu :p :echo :S :fi', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :u :q :y :i :> :! :f :h :fd :I := :r :UU ::: :w :: :x :< :q! :DD :s :j :dw :A :wq :dd : :uu :p :echo :S :fi', '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 7596d85f98..a0e55c4097 100644
--- a/docs/latest/api/evennia.utils.evmenu.html
+++ b/docs/latest/api/evennia.utils.evmenu.html
@@ -955,7 +955,7 @@ single question.
+aliases = ['n', 'yes', 'y', 'abort', 'a', 'no', '__nomatch_command']
@@ -981,7 +981,7 @@ single question.
+search_index_entry = {'aliases': 'n yes y abort a no __nomatch_command', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' n yes y abort a no __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 9861548214..40760337e4 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 = ['abort', 'top', 'n', 'end', 'e', 'q', 't', 'next', 'previous', 'quit', 'p', 'a']
+aliases = ['q', 't', 'p', 'e', 'quit', 'n', 'abort', 'next', 'a', 'top', 'previous', 'end']
@@ -177,7 +177,7 @@ the caller.msg() construct every time the page is updated.
-
-
search_index_entry = {'aliases': 'abort top n end e q t next previous quit p a', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' abort top n end e q t next previous quit p a', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}
+search_index_entry = {'aliases': 'q t p e quit n abort next a top previous end', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' q t p e quit n abort next a top previous end', '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 0d15390194..083a5c40be 100644
--- a/docs/latest/genindex.html
+++ b/docs/latest/genindex.html
@@ -17188,6 +17188,8 @@
(evennia.commands.default.building.CmdExamine method)
(evennia.commands.default.building.CmdOpen method)
+
+ (evennia.commands.default.building.CmdScripts method)
(evennia.commands.default.building.CmdTeleport method)
diff --git a/docs/latest/objects.inv b/docs/latest/objects.inv
index 1091657487b4b8a4ae1ab9f46d9ea665d0f79022..5ea0a4535ba89331e63b6f6f26fa846d29ea4887 100644
GIT binary patch
delta 168470
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