diff --git a/evennia/contrib/events/handler.py b/evennia/contrib/events/handler.py index 5a85623afb..f6bd7ae986 100644 --- a/evennia/contrib/events/handler.py +++ b/evennia/contrib/events/handler.py @@ -151,14 +151,15 @@ class EventsHandler(object): Returns: True to report the event was called without interruption, - False otherwise. + False otherwise. If the EventHandler isn't found, return + None. """ handler = type(self).script if handler: return handler.call_event(self.obj, event_name, *args, **kwargs) - return False + return None @staticmethod def format_event(event): diff --git a/evennia/contrib/events/scripts.py b/evennia/contrib/events/scripts.py index a3b7d2e3b3..18cd59b100 100644 --- a/evennia/contrib/events/scripts.py +++ b/evennia/contrib/events/scripts.py @@ -75,7 +75,7 @@ class EventHandler(DefaultScript): # Place the script in the EventsHandler Handler.script = self - DefaultObject.events = typeclasses.PatchedObject.events + DefaultObject.events = typeclasses.EventObject.events # Create the channel if non-existent try: diff --git a/evennia/contrib/events/tests.py b/evennia/contrib/events/tests.py index 0dd2bbf8ff..09c5b5c942 100644 --- a/evennia/contrib/events/tests.py +++ b/evennia/contrib/events/tests.py @@ -13,6 +13,7 @@ from evennia.utils import ansi, utils from evennia.utils.create import create_object, create_script from evennia.utils.test_resources import EvenniaTest from evennia.contrib.events.commands import CmdEvent +from evennia.contrib.events.handler import EventsHandler # Force settings settings.EVENTS_CALENDAR = "standard" @@ -32,6 +33,7 @@ class TestEventHandler(EvenniaTest): def tearDown(self): """Stop the event handler.""" self.handler.stop() + EventsHandler.script = None super(TestEventHandler, self).tearDown() def test_start(self): @@ -265,6 +267,7 @@ class TestCmdEvent(CommandTest): db_typeclass_path="evennia.contrib.events.scripts.TimeEventScript"): script.stop() + EventsHandler.script = None super(TestCmdEvent, self).tearDown() def test_list(self): @@ -412,6 +415,7 @@ class TestDefaultEvents(CommandTest): def tearDown(self): """Stop the event handler.""" self.handler.stop() + EventsHandler.script = None super(TestDefaultEvents, self).tearDown() def test_exit(self): diff --git a/evennia/contrib/events/typeclasses.py b/evennia/contrib/events/typeclasses.py index 4e11725137..1b5177de95 100644 --- a/evennia/contrib/events/typeclasses.py +++ b/evennia/contrib/events/typeclasses.py @@ -1,5 +1,16 @@ """ Patched typeclasses for Evennia. + +These typeclasses are not inherited from DefaultObject and other +Evennia default types. They softly "patch" some of these object hooks +however. While this adds a new layer in this module, it's (normally) +more simple to use from game designers, since it doesn't require a +new inheritance. These replaced hooks are only active if the event +system is active. You shouldn't need to change this module, just +override the hooks as you usually do in your custom typeclasses. +Calling super() would call the Default hooks (which would call the +event hook without further ado). + """ from evennia import DefaultCharacter, DefaultExit, DefaultObject, DefaultRoom @@ -9,7 +20,7 @@ from evennia.contrib.events.custom import ( create_event_type, patch_hook, create_time_event) from evennia.contrib.events.handler import EventsHandler -class PatchedCharacter: +class EventCharacter: """Patched typeclass for DefaultCharcter.""" @@ -86,6 +97,7 @@ class PatchedCharacter: origin = source_location destination = character.location + exits = [] if origin: exits = [o for o in destination.contents if o.location is destination and o.destination is origin] if exits: @@ -133,6 +145,9 @@ class PatchedCharacter: if can: can = origin.events.call("can_move", character, origin) + if can is None: + return True + return can return True @@ -212,13 +227,7 @@ class PatchedCharacter: hook(character) -class PatchedObject(object): - @lazy_property - def events(self): - """Return the EventsHandler.""" - return EventsHandler(self) - -class PatchedExit(object): +class EventExit(object): """Patched exit to patch some hooks of DefaultExit.""" @@ -254,7 +263,7 @@ class PatchedExit(object): exit, exit.location, exit.destination) -class PatchedRoom: +class EventRoom: """Soft-patching of room's default hooks.""" @@ -273,6 +282,16 @@ class PatchedRoom: room.events.call("delete", room) return True + +class EventObject(object): + + """Patched default object.""" + + @lazy_property + def events(self): + """Return the EventsHandler.""" + return EventsHandler(self) + ## Default events # Character events create_event_type(DefaultCharacter, "can_move", ["character",