From 24c09edd03d48c4f7cd59e38e4aa81c6b4e9774f Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sat, 12 Dec 2020 11:12:37 -0700 Subject: [PATCH] stuff --- code/modules/admin/admin_verbs.dm | 5 +- code/modules/client/preferences.dm | 2 + .../modules/mob/dead/new_player/new_player.dm | 1 + code/modules/mob/dead/observer/respawn.dm | 120 ++++++++++++++++++ 4 files changed, 127 insertions(+), 1 deletion(-) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 52b4fa05b1..e2c12353f7 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -78,8 +78,11 @@ GLOBAL_PROTECT(admin_verbs_admin) /client/proc/mark_datum_mapview, /client/proc/hide_verbs, /*hides all our adminverbs*/ /client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/ - /datum/admins/proc/open_borgopanel + /datum/admins/proc/open_borgopanel, + /client/proc/admin_cmd_respawn_return_to_lobby, + /client/proc/admin_cmd_remove_ghost_respawn_timer ) + GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel, /client/proc/DB_ban_panel, /client/proc/stickybanpanel)) GLOBAL_PROTECT(admin_verbs_ban) GLOBAL_LIST_INIT(admin_verbs_sounds, list(/client/proc/play_local_sound, /client/proc/play_sound, /client/proc/manual_play_web_sound, /client/proc/set_round_end_sound)) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index dddb78a729..e73808cad7 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -27,6 +27,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/list/slots_joined_as /// Are we currently subject to respawn restrictions? Usually set by us using the "respawn" verb, but can be lifted by admins. var/respawn_restrictions_active = FALSE + /// time of death we consider for respawns + var/respawn_time_of_death = -INFINITY // Intra-round persistence end diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index a06fee2cf7..6d619c4fd1 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -316,6 +316,7 @@ stack_trace("There's no freaking observer landmark available on this map or you're making observers before the map is initialised") transfer_ckey(observer, FALSE) observer.client = client + observer.client.prefs?.respawn_time_of_death = world.time observer.set_ghost_appearance() if(observer.client && observer.client.prefs) observer.real_name = observer.client.prefs.real_name diff --git a/code/modules/mob/dead/observer/respawn.dm b/code/modules/mob/dead/observer/respawn.dm index d162e19531..fb1873adff 100644 --- a/code/modules/mob/dead/observer/respawn.dm +++ b/code/modules/mob/dead/observer/respawn.dm @@ -5,11 +5,72 @@ * If a lobby player is selected, their restrictions are removed. */ /client/proc/admin_cmd_respawn_return_to_lobby() + set name = "Respawn Player (Unrestricted)" + set desc = "Gives a player an unrestricted respawn, resetting all respawn restrictions for them." + set category = "Admin" + + var/list/mob/valid = list() + for(var/mob/dead/observer/I in GLOB.dead_mob_list) + if(!I.client) + continue + valid["[I.ckey] - Observing: [I]"] = I.ckey + for(var/mob/dead/new_player/I in GLOB.dead_mob_list) + if(!I.client || !I.prefs.respawn_restrictions_active) + continue + valid["[I.ckey] - IN LOBBY"] = I.ckey + var/ckey = valid[input(src, "Choose a player (only showing logged in players who have restrictions)", "Unrestricted Respawn") as null|anything in valid] + var/client/player = GLOB.directory[ckey] + if(!player) + to_chat(src, "Client not found.") + return + var/mob/M = player.mob + if(istype(M, /mob/dead/observer)) + var/mob/dead/observer/O = M + var/confirm = alert(src, "Send [O]([ckey]) back to the lobby without respawn restrictions?", "Send to Lobby", "Yes", "No") + if(confirm != "Yes") + return + message_admins("[key_name_admin(src)] gave [key_name_admin(O)] a full respawn and sent them back to the lobby.") + log_admin("[key_name(src)] gave [key_name(O)] a full respawn and sent them back to the lobby.") + to_chat(O, "You have been given a full respawn.") + O.do_respawn(FALSE) + else if(istype(M, /mob/dead/new_player)) + var/mob/dead/new_player/NP = M + var/confirm = alert(src, "Remove [NP]'s respawn restrictions?", "Remove Restrictions", "Yes", "No") + if(confirm != "Yes") + return + message_admins("[key_name_admin(src)] removed [ckey]'s respawn restrictions.") + log_admins("[key_name(src)] removed [ckey]'s respawn restrictions") + NP.client.prefs.respawn_restrictions_active = FALSE + to_chat(NP, "Your respawn restrictions have been removed.") + else + CRASH("Invalid mobtype") /** * Allows a ghost to bypass respawn delay without lifting respawn restrictions */ /client/proc/admin_cmd_remove_ghost_respawn_timer() + set name = "Remove Respawn Timer for Player" + set desc = "Removes a player's respawn timer without removing their respawning restrictions." + set category = "Admin" + + var/list/mob/dead/observer/valid = list() + for(var/mob/dead/observer/i in GLOB.dead_mob_list) + if(!I.client) + continue + valid["[I.ckey] - [I.name]"] = I + var/mob/dead/observer/O = valid[input(src, "Choose a player (only showing logged in)", "Remove Respawn Timer") as null|anything in valid] + + if(!O.client) + to_chat(src, "[O] has no client.") + return + var/timeleft = O.time_left_to_respawn() + if(!timeleft) + to_chat(src, "[O] can already respawn.") + return + message_admins("[key_name_admin(src)] removed [key_name_admin(O)]'s respawn timer.") + log_admin("[key_name(src)] removed [key_name(O)]'s respawn timer.") + O.client.prefs.respawn_time_of_death = -INFINITY + to_chat(O, "Your respawn timer has been removed.") // ADMIN VERBS END @@ -17,6 +78,19 @@ * Checks if we can latejoin on the currently selected slot, taking into account respawn status. */ /mob/dead/new_player/proc/respawn_latejoin_check(notify = FALSE) + var/can_same_person = CONFIG_GET(flag/allow_same_character_respawn) + if(can_same_person) + return TRUE + var/nameless = client.prefs.nameless + var/randomname = client.prefs.be_random_name + var/randombody = client.prefs.be_random_body + if(randombody && (nameless || randomname)) + return TRUE // somewhat unrecognizable + if(client.prefs.slots_joined_as && (client.prefs.default_slot in client.prefs.slots_joined_as)) + return FALSE + if((!nameless && !randomname) && (client.prefs.characters_joined_as && (client.prefs.real_name in client.prefs.characters_joined_as))) + return FALSE + return TRUE /** * Attempts to respawn. @@ -25,6 +99,52 @@ set name = "Respawn" set category = "OOC" + var/timeleft = time_left_to_respawn() + if(timeleft) + to_chat(src, "It's been too short of a time since you died/observed! Please wait [round(timeleft / 600, 0.1)] more minutes.") + return + do_respawn(TRUE) + +/** + * Gets time left until we can respawn. Returns 0 if we can respawn now. + */ +/mob/dead/observer/verb/time_left_to_respawn() + ASSERT(client) + return max(0, (CONFIG_GET(number/respawn_delay) MINUTES + client.prefs.respawn_time_of_death) - world.time) + +/** + * Handles respawning + */ +/mob/dead/observer/proc/do_respawn(penalize) + if(!client) + return + if(isnull(penalize)) + penalize = client.prefs.respawn_restrictions_active + client.prefs.respawn_restrictions_active = penalize + + to_chat(src, "You have been respawned to the lobby. \ + Remember to take heed of rules regarding round knowledge - notably, that ALL past lives are forgotten. \ + Any character you join as has NO knowledge of round events unless specified otherwise by an admin.") + + log_game("[key_name(src)] was respawned to lobby [penalize? "with" : "without"] restrictions.") + transfer_to_lobby() + +/** + * Actual proc that removes us and puts us back on lobby + */ +/mob/dead/observer/proc/transfer_to_lobby() + if(!client) // if no one's in us we can just be deleted + qdel(src) + return + client.screen.Cut() + client.view_size.resetToDefault() + client.generate_clickcatcher() + client.apply_clickcatcher() + client.view_size.setDefault(getScreenSize(client.prefs.widescreenpref)) + client.view_size.resetToDefault() + + var/mob/dead/new_player/M = new /mob/dead/new_player + M.ckey = ckey /mob/verb/abandon_mob() set name = "Respawn"