diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index b7c26acf375ee..1c519e8aff159 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -274,6 +274,15 @@ SUBSYSTEM_DEF(vote) return FALSE return TRUE + +/datum/controller/subsystem/vote/proc/toggle_dead_voting(mob/toggle_initiator) + var/switch_deadvote_config = !CONFIG_GET(flag/no_dead_vote) + CONFIG_SET(flag/no_dead_vote, switch_deadvote_config) + var/text_verb = !switch_deadvote_config ? "enabled" : "disabled" + log_admin("[key_name(toggle_initiator)] [text_verb] Dead Vote.") + message_admins("[key_name_admin(toggle_initiator)] [text_verb] Dead Vote.") + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Dead Vote", text_verb)) + /datum/controller/subsystem/vote/ui_state() return GLOB.always_state @@ -293,6 +302,7 @@ SUBSYSTEM_DEF(vote) data["user"] = list( "ckey" = user.client?.ckey, + "isGhost" = CONFIG_GET(flag/no_dead_vote) && user.stat == DEAD && !user.client?.holder, "isLowerAdmin" = is_lower_admin, "isUpperAdmin" = is_upper_admin, // What the current user has selected in any ongoing votes. @@ -377,6 +387,15 @@ SUBSYSTEM_DEF(vote) end_vote() return TRUE + if("toggleDeadVote") + if(!check_rights_for(voter.client, R_ADMIN)) + message_admins("[key_name(voter)] tried to toggle vote abillity for ghosts while having improper rights, \ + this is potentially a malicious exploit and worth noting.") + return + + toggle_dead_voting(voter) + return TRUE + if("toggleVote") var/datum/vote/selected = possible_votes[params["voteName"]] if(!istype(selected)) diff --git a/code/modules/admin/verbs/server.dm b/code/modules/admin/verbs/server.dm index eb5684252f8c9..fb7bc16cf24e0 100644 --- a/code/modules/admin/verbs/server.dm +++ b/code/modules/admin/verbs/server.dm @@ -74,6 +74,9 @@ ADMIN_VERB(toggle_ooc_dead, R_ADMIN, "Toggle Dead OOC", "Toggle the OOC channel message_admins("[key_name_admin(user)] toggled Dead OOC.") SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Dead OOC", "[GLOB.dooc_allowed ? "Enabled" : "Disabled"]")) +ADMIN_VERB(toggle_vote_dead, R_ADMIN, "Toggle Dead Vote", "Toggle the vote for dead players on or off.", ADMIN_CATEGORY_SERVER) + SSvote.toggle_dead_voting(user) + ADMIN_VERB(start_now, R_SERVER, "Start Now", "Start the round RIGHT NOW.", ADMIN_CATEGORY_SERVER) var/static/list/waiting_states = list(GAME_STATE_PREGAME, GAME_STATE_STARTUP) if(!(SSticker.current_state in waiting_states)) diff --git a/tgui/packages/tgui/interfaces/VotePanel.tsx b/tgui/packages/tgui/interfaces/VotePanel.tsx index 949751f2226db..9de9b2b3a05e5 100644 --- a/tgui/packages/tgui/interfaces/VotePanel.tsx +++ b/tgui/packages/tgui/interfaces/VotePanel.tsx @@ -43,6 +43,7 @@ type ActiveVote = { type UserData = { ckey: string; + isGhost: BooleanLike; isLowerAdmin: BooleanLike; isUpperAdmin: BooleanLike; singleSelection: string | null; @@ -88,12 +89,24 @@ export const VotePanel = (props) => { title="Create Vote" buttons={ !!user.isLowerAdmin && ( -