diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
index 5c50d54da46..76da698a27a 100644
--- a/code/__DEFINES/preferences.dm
+++ b/code/__DEFINES/preferences.dm
@@ -29,8 +29,9 @@
#define CHAT_GHOSTWHISPER (1<<7)
#define CHAT_GHOSTPDA (1<<8)
#define CHAT_GHOSTRADIO (1<<9)
+#define CHAT_BANKCARD (1<<10)
-#define TOGGLES_DEFAULT_CHAT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_PULLR|CHAT_GHOSTWHISPER|CHAT_GHOSTPDA|CHAT_GHOSTRADIO)
+#define TOGGLES_DEFAULT_CHAT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_PULLR|CHAT_GHOSTWHISPER|CHAT_GHOSTPDA|CHAT_GHOSTRADIO|CHAT_BANKCARD)
#define PARALLAX_INSANE -1 //for show offs
#define PARALLAX_HIGH 0 //default.
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index 62cff3e6bb7..cb5187b91a5 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -498,11 +498,15 @@
//Recursively checks if an item is inside a given type, even through layers of storage. Returns the atom if it finds it.
/proc/recursive_loc_check(atom/movable/target, type)
var/atom/A = target
+ if(istype(A, type))
+ return A
+
while(!istype(A.loc, type))
if(!A.loc)
return
A = A.loc
- return A
+
+ return A.loc
/proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank)
if(!SSticker.IsRoundInProgress() || QDELETED(character))
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index afcdb14d18a..e2647fae86b 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -493,6 +493,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Ghosts of Others: [button_name]
"
dat += "
"
+ dat += "Income Updates: [(chat_toggles & CHAT_BANKCARD) ? "Allowed" : "Muted"]
"
+ dat += "
"
+
dat += "FPS: [clientfps]
"
dat += "Parallax (Fancy Space): "
@@ -1462,6 +1465,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("ghost_pda")
chat_toggles ^= CHAT_GHOSTPDA
+ if("income_pings")
+ chat_toggles ^= CHAT_BANKCARD
+
if("pull_requests")
chat_toggles ^= CHAT_PULLR
diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm
index 3b717a329b2..0d40d5c6fb3 100644
--- a/code/modules/client/preferences_toggles.dm
+++ b/code/modules/client/preferences_toggles.dm
@@ -235,6 +235,17 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings, listen_ooc)()
/datum/verbs/menu/Settings/listen_ooc/Get_checked(client/C)
return C.prefs.chat_toggles & CHAT_OOC
+TOGGLE_CHECKBOX(/datum/verbs/menu/Settings, listen_bank_card)()
+ set name = "Show/Hide Income Updates"
+ set category = "Preferences"
+ set desc = "Show or hide updates to your income"
+ usr.client.prefs.chat_toggles ^= CHAT_BANKCARD
+ usr.client.prefs.save_preferences()
+ to_chat(usr, "You will [(usr.client.prefs.chat_toggles & CHAT_BANKCARD) ? "now" : "no longer"] be notified when you get paid.")
+ SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Income Notifications", "[(usr.client.prefs.chat_toggles & CHAT_BANKCARD) ? "Enabled" : "Disabled"]"))
+/datum/verbs/menu/Settings/listen_bank_card/Get_checked(client/C)
+ return C.prefs.chat_toggles & CHAT_BANKCARD
+
GLOBAL_LIST_INIT(ghost_forms, list("ghost","ghostking","ghostian2","skeleghost","ghost_red","ghost_black", \
"ghost_blue","ghost_yellow","ghost_green","ghost_pink", \
diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm
index a9206045cd5..a85299cf63c 100644
--- a/code/modules/economy/account.dm
+++ b/code/modules/economy/account.dm
@@ -50,7 +50,7 @@
bank_card_talk("ERROR: Payday aborted, departmental funds insufficient.")
return FALSE
else
- bank_card_talk("Payday processed, account now holds $[account_balance].")
+ bank_card_talk("Payday processed, account now holds $[account_balance].")
return TRUE
bank_card_talk("ERROR: Payday aborted, unable to contact departmental account.")
return FALSE
@@ -59,22 +59,29 @@
/datum/bank_account/proc/add_neetbux()
account_job.paycheck += PAYCHECK_WELFARE
-/datum/bank_account/proc/bank_card_talk(message)
+/datum/bank_account/proc/bank_card_talk(message, force)
if(!message || !bank_cards.len)
return
for(var/obj/A in bank_cards)
var/mob/card_holder = recursive_loc_check(A, /mob)
if(ismob(card_holder)) //If on a mob
+ if(card_holder.client && !(card_holder.client.prefs.chat_toggles & CHAT_BANKCARD) && !force)
+ return
+
card_holder.playsound_local(get_turf(card_holder), 'sound/machines/twobeep.ogg', 50, TRUE)
if(card_holder.can_hear())
to_chat(card_holder, "[icon2html(A, card_holder)] *[message]*")
else if(isturf(A.loc)) //If on the ground
for(var/mob/M in hearers(1,get_turf(A)))
+ if(M.client && !(M.client.prefs.chat_toggles & CHAT_BANKCARD) && !force)
+ return
playsound(A, 'sound/machines/twobeep.ogg', 50, TRUE)
A.audible_message("[icon2html(A, hearers(A))] *[message]*", null, 1)
break
else
for(var/mob/M in A.loc) //If inside a container with other mobs (e.g. locker)
+ if(M.client && !(M.client.prefs.chat_toggles & CHAT_BANKCARD) && !force)
+ return
M.playsound_local(get_turf(M), 'sound/machines/twobeep.ogg', 50, TRUE)
if(M.can_hear())
to_chat(M, "[icon2html(A, M)] *[message]*")
@@ -88,4 +95,4 @@
department_id = dep_id
account_balance = budget
account_holder = SSeconomy.department_accounts[dep_id]
- SSeconomy.generated_accounts += src
\ No newline at end of file
+ SSeconomy.generated_accounts += src