diff --git a/CHANGELOG.md b/CHANGELOG.md index 49cd68462c..b04b182dab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,11 +5,14 @@ [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) [Docs][issue3591]: Fix of NPC reaction tutorial code (Griatch) [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/evennia/scripts/scripts.py b/evennia/scripts/scripts.py index 64d279e414..1f2da85513 100644 --- a/evennia/scripts/scripts.py +++ b/evennia/scripts/scripts.py @@ -6,13 +6,12 @@ ability to run timers. """ 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"] @@ -423,7 +422,12 @@ class ScriptBase(ScriptDB, metaclass=TypeclassBase): 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/evennia/utils/containers.py b/evennia/utils/containers.py index 4eec3f042c..53496e5a0c 100644 --- a/evennia/utils/containers.py +++ b/evennia/utils/containers.py @@ -14,7 +14,7 @@ from pickle import dumps 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 @@ -217,7 +217,7 @@ class GlobalScriptContainer(Container): """ 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 @@ -230,8 +230,12 @@ class GlobalScriptContainer(Container): 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 def all(self): """ @@ -239,12 +243,19 @@ class GlobalScriptContainer(Container): 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