From c99cd45f93a7dfdc6a424f115af35c70649e94db Mon Sep 17 00:00:00 2001 From: Andrew Bastien Date: Sun, 10 Jul 2022 19:36:57 -0400 Subject: [PATCH] Added move_type to obj.move_to and its many hooks and what calls it. --- docs/source/Howtos/NPC-shop-Tutorial.md | 2 +- docs/source/Howtos/Tutorial-Vehicles.md | 4 +- evennia/commands/default/building.py | 5 ++- evennia/commands/default/general.py | 8 ++-- .../full_systems/evscaperoom/commands.py | 2 +- .../contrib/game_systems/clothing/clothing.py | 6 +-- evennia/contrib/grid/slow_exit/slow_exit.py | 2 +- .../contrib/tutorials/tutorial_world/rooms.py | 10 ++--- .../contrib/tutorials/tutorial_world/tests.py | 4 +- evennia/objects/objects.py | 42 ++++++++++++------- 10 files changed, 48 insertions(+), 37 deletions(-) diff --git a/docs/source/Howtos/NPC-shop-Tutorial.md b/docs/source/Howtos/NPC-shop-Tutorial.md index db37508f95..209f2d17f3 100644 --- a/docs/source/Howtos/NPC-shop-Tutorial.md +++ b/docs/source/Howtos/NPC-shop-Tutorial.md @@ -130,7 +130,7 @@ def menunode_inspect_and_buy(caller, raw_string): if wealth >= value: rtext = f"You pay {value} gold and purchase {ware.key}!" caller.db.gold -= value - ware.move_to(caller, quiet=True) + ware.move_to(caller, quiet=True, move_type="buy") else: rtext = f"You cannot afford {value} gold for {ware.key}!" caller.msg(rtext) diff --git a/docs/source/Howtos/Tutorial-Vehicles.md b/docs/source/Howtos/Tutorial-Vehicles.md index a62aa485f3..acb074de6a 100644 --- a/docs/source/Howtos/Tutorial-Vehicles.md +++ b/docs/source/Howtos/Tutorial-Vehicles.md @@ -86,7 +86,7 @@ class CmdEnterTrain(Command): def func(self): train = self.obj self.caller.msg("You board the train.") - self.caller.move_to(train) + self.caller.move_to(train, move_type="board") class CmdLeaveTrain(Command): @@ -107,7 +107,7 @@ class CmdLeaveTrain(Command): def func(self): train = self.obj parent = train.location - self.caller.move_to(parent) + self.caller.move_to(parent, move_type="disembark") class CmdSetTrain(CmdSet): diff --git a/evennia/commands/default/building.py b/evennia/commands/default/building.py index c81c320b3e..feac9de984 100644 --- a/evennia/commands/default/building.py +++ b/evennia/commands/default/building.py @@ -603,7 +603,7 @@ class CmdCreate(ObjManipCommand): if "drop" in self.switches: if caller.location: obj.home = caller.location - obj.move_to(caller.location, quiet=True) + obj.move_to(caller.location, quiet=True, move_type="drop") if string: caller.msg(string) @@ -993,7 +993,7 @@ class CmdDig(ObjManipCommand): ) caller.msg("%s%s%s" % (room_string, exit_to_string, exit_back_string)) if new_room and "teleport" in self.switches: - caller.move_to(new_room) + caller.move_to(new_room, move_type="teleport") class CmdTunnel(COMMAND_DEFAULT_CLASS): @@ -3709,6 +3709,7 @@ class CmdTeleport(COMMAND_DEFAULT_CLASS): quiet="quiet" in self.switches, emit_to_obj=caller, use_destination="intoexit" not in self.switches, + move_type="teleport" ): if obj_to_teleport == caller: diff --git a/evennia/commands/default/general.py b/evennia/commands/default/general.py index ca66727d94..98ad671e7a 100644 --- a/evennia/commands/default/general.py +++ b/evennia/commands/default/general.py @@ -49,7 +49,7 @@ class CmdHome(COMMAND_DEFAULT_CLASS): caller.msg("You are already home!") else: caller.msg("There's no place like home ...") - caller.move_to(home) + caller.move_to(home, move_type="teleport") class CmdLook(COMMAND_DEFAULT_CLASS): @@ -434,7 +434,7 @@ class CmdGet(COMMAND_DEFAULT_CLASS): if not obj.at_pre_get(caller): return - success = obj.move_to(caller, quiet=True) + success = obj.move_to(caller, quiet=True, move_type="get") if not success: caller.msg("This can't be picked up.") else: @@ -484,7 +484,7 @@ class CmdDrop(COMMAND_DEFAULT_CLASS): if not obj.at_pre_drop(caller): return - success = obj.move_to(caller.location, quiet=True) + success = obj.move_to(caller.location, quiet=True, move_type="drop") if not success: caller.msg("This couldn't be dropped.") else: @@ -538,7 +538,7 @@ class CmdGive(COMMAND_DEFAULT_CLASS): return # give object - success = to_give.move_to(target, quiet=True) + success = to_give.move_to(target, quiet=True, move_type="get") if not success: caller.msg("This could not be given.") else: diff --git a/evennia/contrib/full_systems/evscaperoom/commands.py b/evennia/contrib/full_systems/evscaperoom/commands.py index 15695e7caa..16a5706ecf 100644 --- a/evennia/contrib/full_systems/evscaperoom/commands.py +++ b/evennia/contrib/full_systems/evscaperoom/commands.py @@ -236,7 +236,7 @@ class CmdGiveUp(CmdEvscapeRoom): # manually call move hooks self.room.msg_room(self.caller, f"|r{self.caller.key} gave up and was whisked away!|n") self.room.at_object_leave(self.caller, self.caller.home) - self.caller.move_to(self.caller.home, quiet=True, move_hooks=False) + self.caller.move_to(self.caller.home, quiet=True, move_hooks=False, move_type="teleport") # back to menu run_evscaperoom_menu(self.caller) diff --git a/evennia/contrib/game_systems/clothing/clothing.py b/evennia/contrib/game_systems/clothing/clothing.py index 04554f7580..8c11f27d4e 100644 --- a/evennia/contrib/game_systems/clothing/clothing.py +++ b/evennia/contrib/game_systems/clothing/clothing.py @@ -611,7 +611,7 @@ class CmdDrop(MuxCommand): if obj.db.worn: obj.remove(caller, quiet=True) - obj.move_to(caller.location, quiet=True) + obj.move_to(caller.location, quiet=True, move_type="drop") caller.msg("You drop %s." % (obj.name,)) caller.location.msg_contents("%s drops %s." % (caller.name, obj.name), exclude=caller) # Call the object script's at_drop() method. @@ -664,10 +664,10 @@ class CmdGive(MuxCommand): # Remove clothes if they're given. if to_give.db.worn: to_give.remove(caller) - to_give.move_to(caller.location, quiet=True) + to_give.move_to(caller.location, quiet=True, move_type="remove") # give object caller.msg("You give %s to %s." % (to_give.key, target.key)) - to_give.move_to(target, quiet=True) + to_give.move_to(target, quiet=True, move_type="give") target.msg("%s gives you %s." % (caller.key, to_give.key)) # Call the object script's at_give() method. to_give.at_give(caller, target) diff --git a/evennia/contrib/grid/slow_exit/slow_exit.py b/evennia/contrib/grid/slow_exit/slow_exit.py index 2b4ff0f003..e5050e3f76 100644 --- a/evennia/contrib/grid/slow_exit/slow_exit.py +++ b/evennia/contrib/grid/slow_exit/slow_exit.py @@ -82,7 +82,7 @@ class SlowExit(DefaultExit): def move_callback(): "This callback will be called by utils.delay after move_delay seconds." source_location = traversing_object.location - if traversing_object.move_to(target_location): + if traversing_object.move_to(target_location, move_type="traverse"): self.at_post_traverse(traversing_object, source_location) else: if self.db.err_traverse: diff --git a/evennia/contrib/tutorials/tutorial_world/rooms.py b/evennia/contrib/tutorials/tutorial_world/rooms.py index 8f23363134..620f8c0ce4 100644 --- a/evennia/contrib/tutorials/tutorial_world/rooms.py +++ b/evennia/contrib/tutorials/tutorial_world/rooms.py @@ -225,7 +225,7 @@ class CmdTutorialGiveUp(default_cmds.MuxCommand): ) return - self.caller.move_to(outro_room) + self.caller.move_to(outro_room, move_type="teleport") class TutorialRoomCmdSet(CmdSet): @@ -523,7 +523,7 @@ class CmdEast(Command): # Move to the east room. eexit = search_object(self.obj.db.east_exit) if eexit: - caller.move_to(eexit[0]) + caller.move_to(eexit[0], move_type="traverse") else: caller.msg("No east exit was found for this room. Contact an admin.") return @@ -570,7 +570,7 @@ class CmdWest(Command): # Move to the west room. wexit = search_object(self.obj.db.west_exit) if wexit: - caller.move_to(wexit[0]) + caller.move_to(wexit[0], move_type="traverse") else: caller.msg("No west exit was found for this room. Contact an admin.") return @@ -658,7 +658,7 @@ class CmdLookBridge(Command): fall_exit = search_object(self.obj.db.fall_exit) if fall_exit: self.caller.msg("|r%s|n" % FALL_MESSAGE) - self.caller.move_to(fall_exit[0], quiet=True) + self.caller.move_to(fall_exit[0], quiet=True, move_type="fall") # inform others on the bridge self.obj.msg_contents( "A plank gives way under %s's feet and " @@ -1130,7 +1130,7 @@ class TeleportRoom(TutorialRoom): else: character.msg(self.db.failure_teleport_msg) # teleport quietly to the new place - character.move_to(results[0], quiet=True, move_hooks=False) + character.move_to(results[0], quiet=True, move_hooks=False, move_type="teleport") # we have to call this manually since we turn off move_hooks # - this is necessary to make the target dark room aware of an # already carried light. diff --git a/evennia/contrib/tutorials/tutorial_world/tests.py b/evennia/contrib/tutorials/tutorial_world/tests.py index 07f4391a72..8a0b722cf9 100644 --- a/evennia/contrib/tutorials/tutorial_world/tests.py +++ b/evennia/contrib/tutorials/tutorial_world/tests.py @@ -160,7 +160,7 @@ class TestTutorialWorldRooms(BaseEvenniaCommandTest): def test_bridgeroom(self): room = create_object(tutrooms.BridgeRoom, key="bridgeroom") room.update_weather() - self.char1.move_to(room) + self.char1.move_to(room, move_type="teleport") self.call( tutrooms.CmdBridgeHelp(), "", @@ -181,7 +181,7 @@ class TestTutorialWorldRooms(BaseEvenniaCommandTest): def test_darkroom(self): room = create_object(tutrooms.DarkRoom, key="darkroom") - self.char1.move_to(room) + self.char1.move_to(room, move_type="teleport") self.call(tutrooms.CmdDarkHelp(), "", "Can't help you until") def test_teleportroom(self): diff --git a/evennia/objects/objects.py b/evennia/objects/objects.py index d2a2b6e8a4..0497152258 100644 --- a/evennia/objects/objects.py +++ b/evennia/objects/objects.py @@ -836,6 +836,7 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase): use_destination=True, to_none=False, move_hooks=True, + move_type="move", **kwargs, ): """ @@ -857,6 +858,10 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase): move_hooks (bool): If False, turn off the calling of move-related hooks (at_pre/post_move etc) with quiet=True, this is as quiet a move as can be done. + move_type (str): Will be used for generating the text tuple {"type": move_type}, + and can be used for log filtering in hooks. Evennia has only a few + move_types for move_to to start with, like "teleport", "traverse", + "get", "give", and "drop". Keyword Args: Passed on to announce_move_to and announce_move_from hooks. @@ -906,7 +911,7 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase): # Before the move, call eventual pre-commands. if move_hooks: try: - if not self.at_pre_move(destination, **kwargs): + if not self.at_pre_move(destination, move_type=move_type, **kwargs): return False except Exception as err: logerr(errtxt.format(err="at_pre_move()"), err) @@ -918,7 +923,7 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase): # Call hook on source location if move_hooks and source_location: try: - source_location.at_object_leave(self, destination, **kwargs) + source_location.at_object_leave(self, destination, move_type=move_type, **kwargs) except Exception as err: logerr(errtxt.format(err="at_object_leave()"), err) return False @@ -926,7 +931,7 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase): if not quiet: # tell the old room we are leaving try: - self.announce_move_from(destination, **kwargs) + self.announce_move_from(destination, move_type=move_type, **kwargs) except Exception as err: logerr(errtxt.format(err="announce_move_from()"), err) return False @@ -941,7 +946,7 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase): if not quiet: # Tell the new room we are there. try: - self.announce_move_to(source_location, **kwargs) + self.announce_move_to(source_location, move_type=move_type, **kwargs) except Exception as err: logerr(errtxt.format(err="announce_move_to()"), err) return False @@ -950,7 +955,7 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase): # Perform eventual extra commands on the receiving location # (the object has already arrived at this point) try: - destination.at_object_receive(self, source_location, **kwargs) + destination.at_object_receive(self, source_location, move_type=move_type, **kwargs) except Exception as err: logerr(errtxt.format(err="at_object_receive()"), err) return False @@ -959,7 +964,7 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase): # (usually calling 'look') if move_hooks: try: - self.at_post_move(source_location, **kwargs) + self.at_post_move(source_location, move_type=move_type, **kwargs) except Exception as err: logerr(errtxt.format(err="at_post_move"), err) return False @@ -1020,7 +1025,7 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase): # Famous last words: The account should never see this. string = "This place should not exist ... contact an admin." obj.msg(_(string)) - obj.move_to(home) + obj.move_to(home, move_type="teleport") @classmethod def create(cls, key, account=None, **kwargs): @@ -1472,13 +1477,14 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase): # hooks called when moving the object - def at_pre_move(self, destination, **kwargs): + def at_pre_move(self, destination, move_type="move", **kwargs): """ Called just before starting to move this object to destination. Args: destination (Object): The object we are moving to + move_type (str): The type of move. "give", "traverse", etc. **kwargs (dict): Arbitrary, optional arguments for users overriding the call (unused by default). @@ -1496,7 +1502,7 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase): # deprecated alias at_before_move = at_pre_move - def announce_move_from(self, destination, msg=None, mapping=None, **kwargs): + def announce_move_from(self, destination, msg=None, mapping=None, move_type="move", **kwargs): """ Called if the move is to be announced. This is called while we are still standing in the old @@ -1506,6 +1512,7 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase): destination (Object): The place we are going to. msg (str, optional): a replacement message. mapping (dict, optional): additional mapping objects. + move_type (str): The type of move. "give", "traverse", etc. **kwargs (dict): Arbitrary, optional arguments for users overriding the call (unused by default). @@ -1541,9 +1548,9 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase): } ) - location.msg_contents(string, exclude=(self,), from_obj=self, mapping=mapping) + location.msg_contents((string, {"type": move_type}), exclude=(self,), from_obj=self, mapping=mapping) - def announce_move_to(self, source_location, msg=None, mapping=None, **kwargs): + def announce_move_to(self, source_location, msg=None, mapping=None, move_type="move", **kwargs): """ Called after the move if the move was not quiet. At this point we are standing in the new location. @@ -1552,6 +1559,7 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase): source_location (Object): The place we came from msg (str, optional): the replacement message if location. mapping (dict, optional): additional mapping objects. + move_type (str): The type of move. "give", "traverse", etc. **kwargs (dict): Arbitrary, optional arguments for users overriding the call (unused by default). @@ -1605,7 +1613,7 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase): } ) - destination.msg_contents(string, exclude=(self,), from_obj=self, mapping=mapping) + destination.msg_contents((string, {"type": move_type}), exclude=(self,), from_obj=self, mapping=mapping) def at_post_move(self, source_location, **kwargs): """ @@ -1624,20 +1632,21 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase): # deprecated at_after_move = at_post_move - def at_object_leave(self, moved_obj, target_location, **kwargs): + def at_object_leave(self, moved_obj, target_location, move_type="move", **kwargs): """ Called just before an object leaves from inside this object Args: moved_obj (Object): The object leaving target_location (Object): Where `moved_obj` is going. + move_type (str): The type of move. "give", "traverse", etc. **kwargs (dict): Arbitrary, optional arguments for users overriding the call (unused by default). """ pass - def at_object_receive(self, moved_obj, source_location, **kwargs): + def at_object_receive(self, moved_obj, source_location, move_type="move", **kwargs): """ Called after an object has been moved into this object. @@ -1645,6 +1654,7 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase): moved_obj (Object): The object moved into this one source_location (Object): Where `moved_object` came from. Note that this could be `None`. + move_type (str): The type of move. "give", "traverse", etc. **kwargs (dict): Arbitrary, optional arguments for users overriding the call (unused by default). @@ -2381,7 +2391,7 @@ class DefaultCharacter(DefaultObject): # add the default cmdset self.cmdset.add_default(settings.CMDSET_CHARACTER, persistent=True) - def at_post_move(self, source_location, **kwargs): + def at_post_move(self, source_location, move_type="move", **kwargs): """ We make sure to look around after a move. @@ -2859,7 +2869,7 @@ class DefaultExit(DefaultObject): """ source_location = traversing_object.location - if traversing_object.move_to(target_location): + if traversing_object.move_to(target_location, move_type="traverse"): self.at_post_traverse(traversing_object, source_location) else: if self.db.err_traverse: