From 9fc163df5741721d8f7dfc130eedb6dd24004674 Mon Sep 17 00:00:00 2001 From: Vincent Le Goff Date: Sat, 18 Mar 2017 17:28:02 -0700 Subject: [PATCH] Add a lock on editing events --- evennia/contrib/events/commands.py | 15 +++++++++++++++ evennia/contrib/events/scripts.py | 16 ++++++++++++++++ evennia/contrib/events/typeclasses.py | 4 ++-- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/evennia/contrib/events/commands.py b/evennia/contrib/events/commands.py index e848baff7..1abdb9e5b 100644 --- a/evennia/contrib/events/commands.py +++ b/evennia/contrib/events/commands.py @@ -346,6 +346,12 @@ class CmdEvent(COMMAND_DEFAULT_CLASS): self.msg("You cannot edit this event created by someone else.") return + # If the event is locked (edited by someone else) + if (obj, event_name, parameters) in self.handler.db.locked: + self.msg("This event is locked, you cannot edit it.") + return + self.handler.db.locked.append((obj, event_name, parameters)) + # Check the definition of the event definition = types.get(event_name, (None, "Chained event")) description = definition[1] @@ -407,6 +413,11 @@ class CmdEvent(COMMAND_DEFAULT_CLASS): self.msg("You cannot delete this event created by someone else.") return + # If the event is locked (edited by someone else) + if (obj, event_name, parameters) in self.handler.db.locked: + self.msg("This event is locked, you cannot delete it.") + return + # Delete the event self.handler.del_event(obj, event_name, parameters) self.msg("The event {} {} of {} was deleted.".format( @@ -505,6 +516,10 @@ def _ev_save(caller, buf): caller.msg("Couldn't save this event.") return False + if (event["obj"], event["name"], event["number"]) in handler.db.locked: + handler.db.locked.remove((event["obj"], event["name"], + event["number"])) + handler.edit_event(event["obj"], event["name"], event["number"], buf, caller, valid=autovalid) return True diff --git a/evennia/contrib/events/scripts.py b/evennia/contrib/events/scripts.py index 557bf02ff..d271a0184 100644 --- a/evennia/contrib/events/scripts.py +++ b/evennia/contrib/events/scripts.py @@ -27,6 +27,7 @@ class EventHandler(DefaultScript): # Permanent data to be stored self.db.events = {} self.db.to_valid = [] + self.db.locked = [] # Tasks self.db.task_id = 0 @@ -167,6 +168,10 @@ class EventHandler(DefaultScript): obj_events[event_name] = [] events = obj_events[event_name] + # If locked, don't edit it + if (obj, event_name, number) in self.db.locked: + raise RunTimeError("this event is locked.") + # Edit the event events[number].update({ "updated_on": datetime.now(), @@ -195,6 +200,10 @@ class EventHandler(DefaultScript): obj_events = self.db.events.get(obj, {}) events = obj_events.get(event_name, []) + # If locked, don't edit it + if (obj, event_name, number) in self.db.locked: + raise RunTimeError("this event is locked.") + # Delete the event itself try: code = events[number]["code"] @@ -221,6 +230,13 @@ class EventHandler(DefaultScript): del self.db.to_valid[i + 1] i += 1 + # Update locked event + for line in self.db.locked: + t_obj, t_event_name, t_number = line + if obj is t_obj and event_name == t_event_name: + if number > t_number: + line[2] -= 1 + # Delete time-related events associated with this object for script in list(obj.scripts.all()): if isinstance(script, TimeEventScript): diff --git a/evennia/contrib/events/typeclasses.py b/evennia/contrib/events/typeclasses.py index 286da1ec9..ebe55cb33 100644 --- a/evennia/contrib/events/typeclasses.py +++ b/evennia/contrib/events/typeclasses.py @@ -32,7 +32,7 @@ class PatchedExit(object): is_character = inherits_from(traversing_object, DefaultCharacter) script = ScriptDB.objects.get(db_key="event_handler") if is_character: - allow = script.call_event(exit, "can_traverse", None, traversing_object, + allow = script.call_event(exit, "can_traverse", traversing_object, exit, exit.location) if not allow: return @@ -41,7 +41,7 @@ class PatchedExit(object): # After traversing if is_character: - script.call_event(exit, "traverse", None, traversing_object, + script.call_event(exit, "traverse", traversing_object, exit, exit.location, exit.destination)