diff --git a/server/area_manager.py b/server/area_manager.py index d12da701..f3e7b5fb 100644 --- a/server/area_manager.py +++ b/server/area_manager.py @@ -13,7 +13,6 @@ class AreaManager: """Holds the list of all areas.""" - class Timer: """Represents a single instance of a timer in the area.""" @@ -107,6 +106,8 @@ def __init__(self, hub_manager, name): self.can_spectate = True self.can_getareas = True self.passing_msg = False + # If the characters are persistent or not (their area is recorded) + self.character_persistance = False # /prefs # optimization memes @@ -137,6 +138,29 @@ def __init__(self, hub_manager, name): ["spock", "scissors", "rock"], ] + # Which prefs to save/load in yaml + self.save_list = [ + "name", + "abbreviation", + "move_delay", + "arup_enabled", + "hide_clients", + "info", + "can_gm", + "music_ref", + "replace_music", + "client_music", + "max_areas", + "single_cm", + "censor_ic", + "censor_ooc", + "can_spectate", + "can_getareas", + "passing_msg", + "char_list_ref", + "character_persistance", + ] + @property def name(self): """Area's name string. Abbreviation is also updated according to this.""" @@ -189,27 +213,7 @@ def load(self, hub, destructive=False, ignore=[]): if "hub" in hub: hub["name"] = hub["hub"] - load_list = [ - "name", - "abbreviation", - "move_delay", - "arup_enabled", - "hide_clients", - "info", - "can_gm", - "music_ref", - "replace_music", - "client_music", - "max_areas", - "single_cm", - "censor_ic", - "censor_ooc", - "can_spectate", - "can_getareas", - "passing_msg", - "char_list_ref", - ] - for entry in list(set(load_list) - set(ignore)): + for entry in list(set(self.save_list) - set(ignore)): if entry in hub: setattr(self, entry, hub[entry]) if entry == "music_ref": @@ -294,27 +298,7 @@ def get_char_id_by_name(self, name): def save(self, ignore=[]): hub = OrderedDict() - save_list = [ - "name", - "abbreviation", - "move_delay", - "arup_enabled", - "hide_clients", - "info", - "can_gm", - "music_ref", - "replace_music", - "client_music", - "max_areas", - "single_cm", - "censor_ic", - "censor_ooc", - "can_spectate", - "can_getareas", - "passing_msg", - "char_list_ref", - ] - for entry in list(set(save_list) - set(ignore)): + for entry in list(set(self.save_list) - set(ignore)): hub[entry] = getattr(self, entry) if "areas" not in ignore: diff --git a/server/client_manager.py b/server/client_manager.py index 240d31ae..976c80b3 100644 --- a/server/client_manager.py +++ b/server/client_manager.py @@ -916,6 +916,10 @@ def set_area(self, area, target_pos=""): if target_pos != "": self.pos = target_pos + # set our character's recorded area + if self.char_id != -1 and self.area.area_manager.character_persistance: + self.c_area = self.area + # If we're using /evidence_present, reset it due to area change (evidence will be different most likely) self.presenting = 0 @@ -945,7 +949,6 @@ def set_area(self, area, target_pos=""): ], ], ) - # Update everyone's available characters list # Commented out due to potentially causing clientside lag... # self.area.send_command('CharsCheck', @@ -1898,6 +1901,17 @@ def desc(self, value): self.area.area_manager.set_character_data( self.char_id, "desc", value) + @property + def c_area(self): + """Get the character's area.""" + return self.area.area_manager.get_character_data(self.char_id, "area", "") + + @c_area.setter + def area(self, value): + """Set the character's area character data.""" + self.area.area_manager.set_character_data( + self.char_id, "area", value) + @property def hidden(self): """Return if the character is hidden or not. Always True if char_id is -1 (spectator)""" diff --git a/server/commands/hubs.py b/server/commands/hubs.py index 701df3b1..4876903c 100644 --- a/server/commands/hubs.py +++ b/server/commands/hubs.py @@ -36,6 +36,7 @@ "ooc_cmd_toggle_getareas", "ooc_cmd_toggle_spectate", "ooc_cmd_toggle_passing_ic", + "ooc_cmd_toggle_character_persistance", "ooc_cmd_hide_clients", "ooc_cmd_unhide_clients", # General @@ -634,6 +635,19 @@ def ooc_cmd_toggle_passing_ic(client, arg): ) +@mod_only(hub_owners=True) +def ooc_cmd_toggle_character_persistance(client, arg): + """ + Toggle character persistence, remembering their last known location. + Usage: /toggle_character_persistance + """ + client.area.area_manager.character_persistance = not client.area.area_manager.character_persistance + toggle = "enabled" if client.area.area_manager.character_persistance else "disabled" + client.area.area_manager.broadcast_ooc( + f"Persistent Characters are now {toggle} for this hub." + ) + + @mod_only(hub_owners=True) def ooc_cmd_arup_enable(client, arg): """