Karma refactor (#17070)

* Karma refactor

* This too

* Fixes recursion

* Fixes bugs

* Fixes bad usr

* Update code/modules/karma/karma_holder.dm

Co-authored-by: SteelSlayer <42044220+SteelSlayer@users.noreply.github.com>

* Logic tweak

Co-authored-by: SteelSlayer <42044220+SteelSlayer@users.noreply.github.com>
This commit is contained in:
AffectedArc07
2021-11-15 13:52:56 +01:00
committed by GitHub
co-authored by SteelSlayer
parent 5e41a1e1d1
commit ab92435be0
20 changed files with 528 additions and 582 deletions
+3
View File
@@ -142,6 +142,9 @@ GLOBAL_PROTECT(log_end)
/proc/log_tgui(text)
rustg_log_write(GLOB.tgui_log, "[text][GLOB.log_end]")
/proc/log_karma(text)
rustg_log_write(GLOB.karma_log, "[text][GLOB.log_end]")
#ifdef REFERENCE_TRACKING
/proc/log_gc(text)
rustg_log_write(GLOB.gc_log, "[text][GLOB.log_end]")
+2
View File
@@ -23,6 +23,8 @@ GLOBAL_VAR(chat_debug_log)
GLOBAL_PROTECT(chat_debug_log)
GLOBAL_VAR(round_id)
GLOBAL_PROTECT(round_id)
GLOBAL_VAR(karma_log)
GLOBAL_PROTECT(karma_log)
#ifdef REFERENCE_TRACKING
GLOBAL_VAR(gc_log)
+1 -1
View File
@@ -266,7 +266,7 @@
/datum/job/proc/would_accept_job_transfer_from_player(mob/player)
if(!transfer_allowed)
return FALSE
if(!guest_jobbans(title)) // actually checks if job is a whitelisted position
if(!check_job_karma(title))
return TRUE
if(!istype(player))
return FALSE
+1 -1
View File
@@ -100,7 +100,7 @@ GLOBAL_LIST_INIT(whitelisted_positions, list(
))
/proc/guest_jobbans(job)
/proc/check_job_karma(job)
return (job in GLOB.whitelisted_positions)
/proc/get_job_datums()
+14 -58
View File
@@ -1,66 +1,22 @@
/proc/is_job_whitelisted(mob/M, rank)
if(guest_jobbans(rank))
if(!GLOB.configuration.general.enable_karma)
return TRUE
if(check_rights(R_ADMIN, 0, M))
return TRUE
if(!SSdbcore.IsConnected())
return FALSE
else
var/datum/db_query/job_read = SSdbcore.NewQuery(
"SELECT job FROM whitelist WHERE ckey=:ckey",
list("ckey" = M.ckey)
)
if(!job_read.warn_execute(async = FALSE)) // Dont async this. Youll make roundstart slow.
qdel(job_read)
return FALSE
. = FALSE
while(job_read.NextRow())
var/joblist = job_read.item[1]
if(joblist != "*")
var/allowed_jobs = splittext(joblist, ",")
if(rank in allowed_jobs)
. = TRUE
break
else
. = TRUE
break
qdel(job_read)
else
if(!check_job_karma(rank)) // If it aint a karma job, let them play
return TRUE
if(!GLOB.configuration.general.enable_karma)
return TRUE
if(check_rights(R_ADMIN, FALSE, M))
return TRUE
if(rank in M.client.karmaholder.unlocked_jobs)
return TRUE
/proc/is_alien_whitelisted(mob/M, species)
return FALSE
/proc/can_use_species(mob/M, species)
if(!GLOB.configuration.general.enable_karma)
return TRUE
if(species == "human" || species == "Human")
return TRUE
if(check_rights(R_ADMIN, 0))
if(check_rights(R_ADMIN, FALSE))
return TRUE
if(!SSdbcore.IsConnected())
return FALSE
else
var/datum/db_query/species_read = SSdbcore.NewQuery(
"SELECT species FROM whitelist WHERE ckey=:ckey",
list("ckey" = M.ckey)
)
if(!species_read.warn_execute(async = FALSE)) // Dont async this one. It makes roundstart take 10 years.
qdel(species_read)
return FALSE
. = FALSE
while(species_read.NextRow())
var/specieslist = species_read.item[1]
if(specieslist != "*")
var/allowed_species = splittext(specieslist, ",")
if(species in allowed_species)
. = TRUE
break
else
. = TRUE
break
qdel(species_read)
if(species in M.client.karmaholder.unlocked_species)
return TRUE
return FALSE
+1 -1
View File
@@ -119,7 +119,7 @@
if("Body")
var/list/race_list = list("Human", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin")
for(var/species in GLOB.whitelisted_species)
if(is_alien_whitelisted(H, species))
if(can_use_species(H, species))
race_list += species
var/datum/ui_module/appearance_changer/AC = ui_users[user]
+2
View File
@@ -248,6 +248,7 @@ GLOBAL_LIST_EMPTY(world_topic_handlers)
GLOB.http_log = "[GLOB.log_directory]/http.log"
GLOB.sql_log = "[GLOB.log_directory]/sql.log"
GLOB.chat_debug_log = "[GLOB.log_directory]/chat_debug.log"
GLOB.karma_log = "[GLOB.log_directory]/karma.log"
start_log(GLOB.world_game_log)
start_log(GLOB.world_href_log)
start_log(GLOB.world_runtime_log)
@@ -256,6 +257,7 @@ GLOBAL_LIST_EMPTY(world_topic_handlers)
start_log(GLOB.http_log)
start_log(GLOB.sql_log)
start_log(GLOB.chat_debug_log)
start_log(GLOB.karma_log)
#ifdef REFERENCE_TRACKING
GLOB.gc_log = "[GLOB.log_directory]/gc_debug.log"
+2 -2
View File
@@ -33,7 +33,7 @@ GLOBAL_DATUM_INIT(jobban_regex, /regex, regex("(\[\\S]+) - (\[^#]+\[^# ])(?: ##
if(!M || !rank)
return 0
if(GLOB.configuration.jobs.guest_job_ban && guest_jobbans(rank))
if(GLOB.configuration.jobs.guest_job_ban && check_job_karma(rank))
if(IsGuestKey(M.key))
return "Guest Job-ban"
@@ -46,7 +46,7 @@ GLOBAL_DATUM_INIT(jobban_regex, /regex, regex("(\[\\S]+) - (\[^#]+\[^# ])(?: ##
if(!ckey || !rank)
return null
if(GLOB.configuration.jobs.guest_job_ban && guest_jobbans(rank))
if(GLOB.configuration.jobs.guest_job_ban && check_job_karma(rank))
if(IsGuestKey(ckey))
return "Guest Job-ban"
+8 -37
View File
@@ -3522,51 +3522,22 @@
if(!check_rights(R_ADMIN))
return
var/target_ckey = href_list["viewkarma"]
var/total_karma = 0
var/spent_karma = 0
var/unlocked_jobs = ""
var/unlocked_species = ""
// Get their totals
var/datum/db_query/query_get_totals = SSdbcore.NewQuery("SELECT karma, karmaspent FROM karmatotals WHERE byondkey=:ckey", list(
"ckey" = target_ckey
))
if(!query_get_totals.warn_execute())
qdel(query_get_totals)
var/client/C = GLOB.directory[href_list["viewkarma"]]
if(!C)
return
// Even if there aint a row, we can still assume the defaults of 0 above
if(query_get_totals.NextRow())
total_karma = query_get_totals.item[1]
spent_karma = query_get_totals.item[2]
qdel(query_get_totals)
// Now get their unlocks
var/datum/db_query/query_get_unlocks = SSdbcore.NewQuery("SELECT job, species FROM whitelist WHERE ckey=:ckey", list(
"ckey" = target_ckey
))
if(!query_get_unlocks.warn_execute())
qdel(query_get_unlocks)
return
if(query_get_unlocks.NextRow())
unlocked_jobs = query_get_unlocks.item[1]
unlocked_species = query_get_unlocks.item[2]
qdel(query_get_unlocks)
// Pack it into a dat
var/dat = {"
<ul>
<li>Total Karma: [total_karma]</li>
<li>Spent Karma: [spent_karma]</li>
<li>Available Karma: [total_karma - spent_karma]</li>
<li>Unlocked Jobs: [unlocked_jobs]</li>
<li>Unlocked Species: [unlocked_species]</li>
<li>Total Karma: [C.karmaholder.karma_earned]</li>
<li>Spent Karma: [C.karmaholder.karma_spent]</li>
<li>Available Karma: [C.karmaholder.karma_earned - C.karmaholder.karma_spent]</li>
<li>Unlocked Jobs: [C.karmaholder.unlocked_jobs.Join(", ")]</li>
<li>Unlocked Species: [C.karmaholder.unlocked_species.Join(", ")]</li>
</ul>
"}
var/datum/browser/popup = new(usr, "view_karma", "Karma stats for [target_ckey]", 600, 300)
var/datum/browser/popup = new(usr, "view_karma", "Karma stats for [C.ckey]", 600, 300)
popup.set_content(dat)
popup.open(FALSE)
else if(href_list["who_advanced"])
+6 -3
View File
@@ -56,9 +56,6 @@
var/global/obj/screen/click_catcher/void
var/karma_spent = 0
var/karma_tab = 0
control_freak = CONTROL_FREAK_ALL | CONTROL_FREAK_SKIN | CONTROL_FREAK_MACROS
var/ip_intel = "Disabled"
@@ -120,6 +117,9 @@
/// List of the clients CUIs
var/list/datum/custom_user_item/cui_entries = list()
/// The client's karma holder
var/datum/karma_holder/karmaholder
/client/vv_edit_var(var_name, var_value)
switch(var_name)
// I know we will never be in a world where admins are editing client vars to let people bypass TOS
@@ -129,4 +129,7 @@
// Dont fuck with this
if("cui_entries")
return FALSE
// or this
if("karmaholder")
return FALSE
return ..()
-52
View File
@@ -125,58 +125,6 @@
if(GLOB.configuration.logging.href_logging)
log_href("[src] (usr:[usr]\[[COORD(usr)]\]) : [hsrc ? "[hsrc] " : ""][href]")
if(href_list["karmashop"])
if(!GLOB.configuration.general.enable_karma)
to_chat(src, "Karma is disabled on this server.")
return
switch(href_list["karmashop"])
if("tab")
karma_tab = text2num(href_list["tab"])
karmashopmenu()
return
if("shop")
if(href_list["KarmaBuy"])
var/karma=verify_karma()
if(isnull(karma)) //Doesn't display anything if karma database is down.
return
switch(href_list["KarmaBuy"])
if("1")
karma_purchase(karma,5,"job","Barber")
if("2")
karma_purchase(karma,5,"job","Brig Physician")
if("3")
karma_purchase(karma,30,"job","Nanotrasen Representative")
if("4")
karma_purchase(karma,30,"job","Blueshield")
return
if(href_list["KarmaBuy2"])
var/karma=verify_karma()
if(isnull(karma)) //Doesn't display anything if karma database is down.
return
switch(href_list["KarmaBuy2"])
if("1")
karma_purchase(karma,15,"species","Machine People","Machine")
if("2")
karma_purchase(karma,30,"species","Kidan")
if("3")
karma_purchase(karma,30,"species","Grey")
if("4")
karma_purchase(karma,45,"species","Vox")
if("5")
karma_purchase(karma,45,"species","Slime People")
if("6")
karma_purchase(karma,45,"species","Plasmaman")
if("7")
karma_purchase(karma,30,"species","Drask")
return
if(href_list["KarmaRefund"])
var/type = href_list["KarmaRefundType"]
var/job = href_list["KarmaRefund"]
var/cost = href_list["KarmaRefundCost"]
karmarefund(type,job,cost)
return
switch(href_list["_src_"])
if("holder") hsrc = holder
if("usr") hsrc = mob
@@ -0,0 +1,14 @@
/datum/client_login_processor/karma_numbers
priority = 42
/datum/client_login_processor/karma_numbers/get_query(client/C)
var/datum/db_query/query = SSdbcore.NewQuery("SELECT karma, karmaspent FROM karmatotals WHERE byondkey=:ckey", list(
"ckey" = C.ckey
))
return query
/datum/client_login_processor/karma_numbers/process_result(datum/db_query/Q, client/C)
C.karmaholder = new()
while(Q.NextRow())
C.karmaholder.karma_earned = Q.item[1]
C.karmaholder.karma_spent = Q.item[2]
@@ -0,0 +1,20 @@
/datum/client_login_processor/karma_unlocks
priority = 43
/datum/client_login_processor/karma_unlocks/get_query(client/C)
var/datum/db_query/query = SSdbcore.NewQuery("SELECT job, species FROM whitelist WHERE ckey=:ckey", list(
"ckey" = C.ckey
))
return query
/datum/client_login_processor/karma_unlocks/process_result(datum/db_query/Q, client/C)
while(Q.NextRow())
// Lets split stuff apart
C.karmaholder.unlocked_jobs = splittext(Q.item[1], ",")
C.karmaholder.unlocked_species = splittext(Q.item[2], ",") // these should really be JSON
for(var/i in 1 to length(C.karmaholder.unlocked_jobs))
C.karmaholder.unlocked_jobs[i] = trim(C.karmaholder.unlocked_jobs[i]) // Trim whitespace
for(var/i in 1 to length(C.karmaholder.unlocked_species))
C.karmaholder.unlocked_species[i] = trim(C.karmaholder.unlocked_species[i]) // Trim whitespace
@@ -220,7 +220,7 @@
var/prev_species = active_character.species
for(var/_species in GLOB.whitelisted_species)
if(is_alien_whitelisted(user, _species))
if(can_use_species(user, _species))
new_species += _species
active_character.species = input("Please select a species", "Character Generation", null) in sortTim(new_species, /proc/cmp_text_asc)
+22 -421
View File
@@ -1,7 +1,4 @@
/* KARMA
Everything karma related is here.
Part of karma purchase is handled in client_procs.dm */
// All karma procs that arent confined to the [/datum/karma_holder] are in here
/proc/sql_report_karma(mob/spender, mob/receiver)
var/receiverrole = "None"
var/receiverspecial = "None"
@@ -34,25 +31,25 @@
qdel(log_query)
var/datum/db_query/select_spender = SSdbcore.NewQuery("SELECT id, karma FROM karmatotals WHERE byondkey=:rkey", list(
var/datum/db_query/select_recv = SSdbcore.NewQuery("SELECT id, karma FROM karmatotals WHERE byondkey=:rkey", list(
"rkey" = receiver.ckey
))
if(!select_spender.warn_execute())
qdel(select_spender)
if(!select_recv.warn_execute())
qdel(select_recv)
return
var/karma
var/id
while(select_spender.NextRow())
id = select_spender.item[1]
karma = text2num(select_spender.item[2])
while(select_recv.NextRow())
id = select_recv.item[1]
karma = text2num(select_recv.item[2])
qdel(select_spender)
qdel(select_recv)
// They dont exist, lets make them exist
if(karma == null)
karma = 1
var/datum/db_query/insert_query = SSdbcore.NewQuery("INSERT INTO karmatotals (byondkey, karma) VALUES (:rkey, :karma)", list(
"rkey" = receiver.ckey,
"karma" = karma
@@ -60,7 +57,10 @@
if(!insert_query.warn_execute())
qdel(insert_query)
return
qdel(insert_query)
// They do exist. Update it.
else
karma++
var/datum/db_query/update_query = SSdbcore.NewQuery("UPDATE karmatotals SET karma=:karma WHERE id=:id", list(
@@ -70,8 +70,11 @@
if(!update_query.warn_execute())
qdel(update_query)
return
qdel(update_query)
receiver?.client.karmaholder.sync_karma(receiver) // Refresh their end
GLOBAL_LIST_EMPTY(karma_spenders)
// Returns TRUE if mob can give karma at all; if not, tells them why
@@ -85,7 +88,7 @@ GLOBAL_LIST_EMPTY(karma_spenders)
if(!SSticker || !GLOB.player_list.len || (SSticker.current_state == GAME_STATE_PREGAME))
to_chat(src, "<span class='warning'>You can't award karma until the game has started.</span>")
return FALSE
if(client.karma_spent || (ckey in GLOB.karma_spenders))
if(ckey in GLOB.karma_spenders)
to_chat(src, "<span class='warning'>You've already spent your karma for the round.</span>")
return FALSE
return TRUE
@@ -162,7 +165,6 @@ GLOBAL_LIST_EMPTY(karma_spenders)
return // Check again, just in case things changed while the alert box was up
to_chat(usr, "Good karma spent on [M.name].")
client.karma_spent = TRUE
GLOB.karma_spenders += ckey
var/special_role = "None"
@@ -173,9 +175,9 @@ GLOBAL_LIST_EMPTY(karma_spenders)
if(M.mind.assigned_role)
assigned_role = M.mind.assigned_role
rustg_log_write("[GLOB.log_directory]/karma.log", "Karma awarded to [M.name] ([M.key]) (Role: [assigned_role] | Special: [special_role]) - Awarded by [ckey]")
log_karma("Karma awarded to [M.name] ([M.key]) (Role: [assigned_role] | Special: [special_role]) - Awarded by [ckey]")
sql_report_karma(src, M)
sql_report_karma(src, M) // This proc doesnt just report the purchase. It actually updates their balances.
/client/verb/check_karma()
set name = "Check Karma"
@@ -186,418 +188,17 @@ GLOBAL_LIST_EMPTY(karma_spenders)
to_chat(src, "<span class='warning'>Karma is disabled.</span>")
return
var/currentkarma = verify_karma()
if(!isnull(currentkarma))
to_chat(usr, {"<br>You have <b>[currentkarma]</b> available."})
/client/proc/verify_karma()
var/currentkarma = 0
if(!SSdbcore.IsConnected())
to_chat(usr, "<span class='warning'>Unable to connect to karma database. Please try again later.<br></span>")
return
var/datum/db_query/query = SSdbcore.NewQuery("SELECT karma, karmaspent FROM karmatotals WHERE byondkey=:ckey", list(
"ckey" = ckey
))
if(!query.warn_execute())
qdel(query)
return
var/totalkarma
var/karmaspent
while(query.NextRow())
totalkarma = query.item[1]
karmaspent = query.item[2]
qdel(query)
currentkarma = (text2num(totalkarma) - text2num(karmaspent))
return currentkarma
var/available_karma = karmaholder.karma_earned - karmaholder.karma_spent
to_chat(usr, "You have ["<b>[available_karma]</b>" || "a database error. Contact the host if they are"] available.")
/client/verb/karmashop()
set name = "karmashop"
set desc = "Spend your hard-earned karma here"
set desc = "Spend your karma here"
set hidden = TRUE
if(!GLOB.configuration.general.enable_karma)
to_chat(src, "<span class='warning'>Karma is disabled.</span>")
return
karmashopmenu()
/client/proc/karmashopmenu()
var/datum/db_query/query = SSdbcore.NewQuery("SELECT ckey, job, species FROM whitelist WHERE ckey=:ckey", list(
"ckey" = ckey
))
if(!query.warn_execute())
qdel(query)
return
karmaholder.open_shop_menu()
var/list/joblist
var/list/specieslist
var/dbjob
var/dbspecies
var/dbckey
while(query.NextRow())
dbckey = query.item[1]
dbjob = query.item[2]
dbspecies = query.item[3]
qdel(query)
if(dbckey)
joblist = splittext(dbjob,",")
specieslist = splittext(dbspecies,",")
var/dat = "<html><body><center>"
dat += "<a href='?src=[UID()];karmashop=tab;tab=0' [karma_tab == 0 ? "class='linkOn'" : ""]>Job Unlocks</a>"
dat += "<a href='?src=[UID()];karmashop=tab;tab=1' [karma_tab == 1 ? "class='linkOn'" : ""]>Species Unlocks</a>"
dat += "<a href='?src=[UID()];karmashop=tab;tab=2' [karma_tab == 2 ? "class='linkOn'" : ""]>Karma Refunds</a>"
dat += "</center>"
dat += "<HR>"
var/currentkarma = verify_karma()
dat += "You have <b>[currentkarma]</b> available.<br><HR>"
switch(karma_tab)
if(0) // Job Unlocks
if(!("Barber" in joblist))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=1'>Unlock Barber -- 5KP</a><br>"
else
dat += "Barber - <font color='green'>Unlocked</font><br>"
if(!("Brig Physician" in joblist))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=2'>Unlock Brig Physician -- 5KP</a><br>"
else
dat += "Brig Physician - <font color='green'>Unlocked</font><br>"
if(!("Nanotrasen Representative" in joblist))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=3'>Unlock Nanotrasen Representative -- 30KP</a><br>"
else
dat += "Nanotrasen Representative - <font color='green'>Unlocked</font><br>"
if(!("Blueshield" in joblist))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=4'>Unlock Blueshield -- 30KP</a><br>"
else
dat += "Blueshield - <font color='green'>Unlocked</font><br>"
if(1) // Species Unlocks
if(!("Machine" in specieslist))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=1'>Unlock Machine People -- 15KP</a><br>"
else
dat += "Machine People - <font color='green'>Unlocked</font><br>"
if(!("Kidan" in specieslist))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=2'>Unlock Kidan -- 30KP</a><br>"
else
dat += "Kidan - <font color='green'>Unlocked</font><br>"
if(!("Grey" in specieslist))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=3'>Unlock Grey -- 30KP</a><br>"
else
dat += "Grey - <font color='green'>Unlocked</font><br>"
if(!("Drask" in specieslist))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=7'>Unlock Drask -- 30KP</a><br>"
else
dat += "Drask - <font color='green'>Unlocked</font><br>"
if(!("Vox" in specieslist))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=4'>Unlock Vox -- 45KP</a><br>"
else
dat += "Vox - <font color='green'>Unlocked</font><br>"
if(!("Slime People" in specieslist))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=5'>Unlock Slime People -- 45KP</a><br>"
else
dat += "Slime People - <font color='green'>Unlocked</font><br>"
if(!("Plasmaman" in specieslist))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=6'>Unlock Plasmaman -- 45KP</a><br>"
else
dat += "Plasmaman - <font color='green'>Unlocked</font><br>"
if(2) // Karma Refunds
var/list/refundable = list()
var/list/purchased = checkpurchased()
if("Tajaran Ambassador" in purchased)
refundable += "Tajaran Ambassador"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Tajaran Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Tajaran Ambassador -- 30KP</a><br>"
if("Unathi Ambassador" in purchased)
refundable += "Unathi Ambassador"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Unathi Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Unathi Ambassador -- 30KP</a><br>"
if("Skrell Ambassador" in purchased)
refundable += "Skrell Ambassador"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Skrell Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Skrell Ambassador -- 30KP</a><br>"
if("Diona Ambassador" in purchased)
refundable += "Diona Ambassador"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Diona Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Diona Ambassador -- 30KP</a><br>"
if("Kidan Ambassador" in purchased)
refundable += "Kidan Ambassador"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Kidan Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Kidan Ambassador -- 30KP</a><br>"
if("Slime People Ambassador" in purchased)
refundable += "Slime People Ambassador"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Slime People Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Slime People Ambassador -- 30KP</a><br>"
if("Grey Ambassador" in purchased)
refundable += "Grey Ambassador"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Grey Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Grey Ambassador -- 30KP</a><br>"
if("Vox Ambassador" in purchased)
refundable += "Vox Ambassador"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Vox Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Vox Ambassador -- 30KP</a><br>"
if("Customs Officer" in purchased)
refundable += "Customs Officer"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Customs Officer;KarmaRefundType=job;KarmaRefundCost=30'>Refund Customs Officer -- 30KP</a><br>"
if("Nanotrasen Recruiter" in purchased)
refundable += "Nanotrasen Recruiter"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Nanotrasen Recruiter;KarmaRefundType=job;KarmaRefundCost=10'>Refund Nanotrasen Recruiter -- 10KP</a><br>"
if("Mechanic" in purchased)
refundable += "Mechanic"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Mechanic;KarmaRefundType=job;KarmaRefundCost=30'>Refund Mechanic -- 30KP</a><br>"
if("Security Pod Pilot" in purchased)
refundable += "Security Pod Pilot"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Security Pod Pilot;KarmaRefundType=job;KarmaRefundCost=30'>Refund Security Pod Pilot -- 30KP</a><br>"
if("Magistrate" in purchased)
refundable += "Magistrate"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Magistrate;KarmaRefundType=job;KarmaRefundCost=45'>Refund Magistrate -- 45KP</a><br>"
if(!refundable.len)
dat += "You do not have any refundable karma purchases.<br>"
dat += "<br><B>PLEASE NOTE THAT PEOPLE WHO TRY TO GAME THE KARMA SYSTEM WILL END UP ON THE WALL OF SHAME. THIS INCLUDES BUT IS NOT LIMITED TO TRADES, OOC KARMA BEGGING, CODE EXPLOITS, ETC.</B>"
dat += "</center></body></html>"
var/datum/browser/popup = new(usr, "karmashop", "<div align='center'>Karma Shop</div>", 400, 400)
popup.set_content(dat)
popup.open(0)
//Checks if can afford, what you're purchasing, then purchases. (used in client_procs.dm)
/client/proc/karma_purchase(karma = 0, price = 1, category, name, DBname = null)
if(karma < price)
to_chat(usr, "You do not have enough karma!")
return
if(alert("Are you sure you want to unlock [name]?", "Confirmation", "No", "Yes") != "Yes")
return
if(karma < price) //Check one more time. (definitely not repeated code)
to_chat(usr, "You do not have enough karma!")
return
if(!isnull(DBname)) //In case database uses another name for logging. (Machine, Machine People)
name = DBname
if(category == "job")
DB_job_unlock(name,price)
karmashopmenu()
else if(category == "species")
DB_species_unlock(name,price)
karmashopmenu()
/client/proc/DB_job_unlock(job, cost)
var/datum/db_query/select_query = SSdbcore.NewQuery("SELECT ckey, job FROM whitelist WHERE ckey=:ckey", list(
"ckey" = ckey
))
if(!select_query.warn_execute())
qdel(select_query)
return
var/dbjob
var/dbckey
while(select_query.NextRow())
dbckey = select_query.item[1]
dbjob = select_query.item[2]
qdel(select_query)
if(!dbckey)
var/datum/db_query/insert_query = SSdbcore.NewQuery("INSERT INTO whitelist (ckey, job) VALUES (:ckey, :job)", list(
"ckey" = ckey,
"job" = job
))
if(!insert_query.warn_execute())
qdel(insert_query)
return
else
to_chat(usr, "You have unlocked [job].")
message_admins("[key_name(usr)] has unlocked [job].") // why do we admin log this
karmacharge(cost)
qdel(insert_query)
if(dbckey)
var/list/joblist = splittext(dbjob,",")
if(!(job in joblist))
joblist += job
var/newjoblist = jointext(joblist,",")
var/datum/db_query/update_query = SSdbcore.NewQuery("UPDATE whitelist SET job=:newjoblist WHERE ckey=:ckey", list(
"newjoblist" = newjoblist,
"ckey" = ckey
))
if(!update_query.warn_execute())
qdel(update_query)
return
else
to_chat(usr, "You have unlocked [job].")
message_admins("[key_name(usr)] has unlocked [job].")
karmacharge(cost)
qdel(update_query)
else
to_chat(usr, "You already have this job unlocked!")
return
/client/proc/DB_species_unlock(species, cost)
var/datum/db_query/select_query = SSdbcore.NewQuery("SELECT ckey, species FROM whitelist WHERE ckey=:ckey", list(
"ckey" = ckey
))
if(!select_query.warn_execute())
qdel(select_query)
return
var/dbspecies
var/dbckey
while(select_query.NextRow())
dbckey = select_query.item[1]
dbspecies = select_query.item[2]
qdel(select_query)
if(!dbckey)
var/datum/db_query/insert_query = SSdbcore.NewQuery("INSERT INTO whitelist (ckey, species) VALUES (:ckey, :species)", list(
"ckey" = ckey,
"species" = species
))
if(!insert_query.warn_execute())
qdel(insert_query)
return
else
to_chat(usr, "You have unlocked [species].")
message_admins("[key_name(usr)] has unlocked [species].")
qdel(insert_query)
karmacharge(cost)
if(dbckey)
var/list/specieslist = splittext(dbspecies,",")
if(!(species in specieslist))
specieslist += species
var/newspecieslist = jointext(specieslist,",")
var/datum/db_query/update_query = SSdbcore.NewQuery("UPDATE whitelist SET species=:newspecieslist WHERE ckey=:ckey", list(
"newspecieslist" = newspecieslist,
"ckey" = ckey
))
if(!update_query.warn_execute())
qdel(update_query)
return
else
to_chat(usr, "You have unlocked [species].")
message_admins("[key_name(usr)] has unlocked [species].")
qdel(update_query)
karmacharge(cost)
else
to_chat(usr, "You already have this species unlocked!")
return
/client/proc/karmacharge(cost, refund = FALSE)
var/datum/db_query/select_query = SSdbcore.NewQuery("SELECT karmaspent FROM karmatotals WHERE byondkey=:ckey", list(
"ckey" = ckey
))
if(!select_query.warn_execute())
qdel(select_query)
return
while(select_query.NextRow())
var/spent = text2num(select_query.item[1])
if(refund)
spent -= cost
else
spent += cost
var/datum/db_query/update_query = SSdbcore.NewQuery("UPDATE karmatotals SET karmaspent=:spent WHERE byondkey=:ckey", list(
"spent" = spent,
"ckey" = ckey
))
if(!update_query.warn_execute())
qdel(select_query)
qdel(update_query)
return
else
to_chat(usr, "You have been [refund ? "refunded" : "charged"] [cost] karma.")
message_admins("[key_name(usr)] has been [refund ? "refunded" : "charged"] [cost] karma.")
qdel(select_query)
qdel(update_query)
return
/client/proc/karmarefund(type, name, cost)
switch(name)
if("Tajaran Ambassador","Unathi Ambassador","Skrell Ambassador","Diona Ambassador","Kidan Ambassador",
"Slime People Ambassador","Grey Ambassador","Vox Ambassador","Customs Officer", "Mechanic", "Security Pod Pilot")
cost = 30
if("Nanotrasen Recruiter")
cost = 10
if("Magistrate")
cost = 45
else
to_chat(usr, "<span class='warning'>That job is not refundable.</span>")
return
var/datum/db_query/query = SSdbcore.NewQuery("SELECT ckey, job, species FROM whitelist WHERE ckey=:ckey", list(
"ckey" = ckey
))
if(!query.warn_execute())
qdel(query)
return
var/dbjob
var/dbspecies
var/dbckey
while(query.NextRow())
dbckey = query.item[1]
dbjob = query.item[2]
dbspecies = query.item[3]
qdel(query)
if(dbckey)
var/list/typelist = list()
var/statement
switch(type)
if("job")
typelist = splittext(dbjob,",")
statement = "UPDATE whitelist SET job=:newtypelist WHERE ckey=:ckey"
if("species")
typelist = splittext(dbspecies,",")
statement = "UPDATE whitelist SET species=:newtypelist WHERE ckey=:ckey"
else
to_chat(usr, "<span class='warning'>Type [type] is not a valid column.</span>")
if(name in typelist)
typelist -= name
var/newtypelist = jointext(typelist,",")
var/datum/db_query/update_query = SSdbcore.NewQuery(statement, list(
"ckey" = ckey,
"newtypelist" = newtypelist
))
if(!update_query.warn_execute())
qdel(update_query)
return
else
to_chat(usr, "You have been refunded [cost] karma for [type] [name].")
message_admins("[key_name(usr)] has been refunded [cost] karma for [type] [name].")
qdel(update_query)
karmacharge(text2num(cost),1)
else
to_chat(usr, "<span class='warning'>You have not bought [name].</span>")
else
to_chat(usr, "<span class='warning'>Your ckey ([dbckey]) was not found.</span>")
/client/proc/checkpurchased(name = null) // If the first parameter is null, return a full list of purchases
var/datum/db_query/query = SSdbcore.NewQuery("SELECT ckey, job, species FROM whitelist WHERE ckey=:ckey", list(
"ckey" = ckey
))
if(!query.warn_execute())
qdel(query)
return
var/dbjob
var/dbspecies
var/dbckey
while(query.NextRow())
dbckey = query.item[1]
dbjob = query.item[2]
dbspecies = query.item[3]
qdel(query)
if(dbckey)
var/list/joblist = splittext(dbjob,",")
var/list/specieslist = splittext(dbspecies,",")
var/list/combinedlist = joblist + specieslist
if(name)
if(name in combinedlist)
return TRUE
else
return FALSE
else
return combinedlist
else
return FALSE
+423
View File
@@ -0,0 +1,423 @@
// This file contains stuff regarding the karma holder datum
// This is attached to a client and holds their info
/datum/karma_holder
/// List of jobs this person has unlocked
var/list/unlocked_jobs = list()
/// List of species this person has unlocked
var/list/unlocked_species = list()
/// Amount of karma earned total
var/karma_earned = 0
/// Amount of karma spent total
var/karma_spent = 0
/// What tab are they on
var/karma_tab = 0
// Safety stuff
/datum/karma_holder/vv_edit_var(var_name, var_value)
return FALSE // no
/datum/karma_holder/CanProcCall(procname)
return FALSE // no
// Opens the karma shop menu
/datum/karma_holder/proc/open_shop_menu()
var/dat = "<html><body><center>"
dat += "<a href='?src=[UID()];karmashop=tab;tab=0' [karma_tab == 0 ? "class='linkOn'" : ""]>Job Unlocks</a>"
dat += "<a href='?src=[UID()];karmashop=tab;tab=1' [karma_tab == 1 ? "class='linkOn'" : ""]>Species Unlocks</a>"
dat += "<a href='?src=[UID()];karmashop=tab;tab=2' [karma_tab == 2 ? "class='linkOn'" : ""]>Karma Refunds</a>"
dat += "</center>"
dat += "<HR>"
var/currentkarma = (karma_earned - karma_spent)
dat += "You have <b>[currentkarma]</b> available.<br><HR>"
switch(karma_tab)
if(0) // Job Unlocks
if(!("Barber" in unlocked_jobs))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=1'>Unlock Barber -- 5KP</a><br>"
else
dat += "Barber - <font color='green'>Unlocked</font><br>"
if(!("Brig Physician" in unlocked_jobs))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=2'>Unlock Brig Physician -- 5KP</a><br>"
else
dat += "Brig Physician - <font color='green'>Unlocked</font><br>"
if(!("Nanotrasen Representative" in unlocked_jobs))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=3'>Unlock Nanotrasen Representative -- 30KP</a><br>"
else
dat += "Nanotrasen Representative - <font color='green'>Unlocked</font><br>"
if(!("Blueshield" in unlocked_jobs))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=4'>Unlock Blueshield -- 30KP</a><br>"
else
dat += "Blueshield - <font color='green'>Unlocked</font><br>"
if(1) // Species Unlocks
if(!("Machine" in unlocked_species))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=1'>Unlock Machine People -- 15KP</a><br>"
else
dat += "Machine People - <font color='green'>Unlocked</font><br>"
if(!("Kidan" in unlocked_species))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=2'>Unlock Kidan -- 30KP</a><br>"
else
dat += "Kidan - <font color='green'>Unlocked</font><br>"
if(!("Grey" in unlocked_species))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=3'>Unlock Grey -- 30KP</a><br>"
else
dat += "Grey - <font color='green'>Unlocked</font><br>"
if(!("Drask" in unlocked_species))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=7'>Unlock Drask -- 30KP</a><br>"
else
dat += "Drask - <font color='green'>Unlocked</font><br>"
if(!("Vox" in unlocked_species))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=4'>Unlock Vox -- 45KP</a><br>"
else
dat += "Vox - <font color='green'>Unlocked</font><br>"
if(!("Slime People" in unlocked_species))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=5'>Unlock Slime People -- 45KP</a><br>"
else
dat += "Slime People - <font color='green'>Unlocked</font><br>"
if(!("Plasmaman" in unlocked_species))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=6'>Unlock Plasmaman -- 45KP</a><br>"
else
dat += "Plasmaman - <font color='green'>Unlocked</font><br>"
if(2) // Karma Refunds
var/list/refundable = list()
// Get both
var/list/purchased = unlocked_jobs + unlocked_species
if("Tajaran Ambassador" in purchased)
refundable += "Tajaran Ambassador"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Tajaran Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Tajaran Ambassador -- 30KP</a><br>"
if("Unathi Ambassador" in purchased)
refundable += "Unathi Ambassador"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Unathi Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Unathi Ambassador -- 30KP</a><br>"
if("Skrell Ambassador" in purchased)
refundable += "Skrell Ambassador"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Skrell Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Skrell Ambassador -- 30KP</a><br>"
if("Diona Ambassador" in purchased)
refundable += "Diona Ambassador"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Diona Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Diona Ambassador -- 30KP</a><br>"
if("Kidan Ambassador" in purchased)
refundable += "Kidan Ambassador"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Kidan Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Kidan Ambassador -- 30KP</a><br>"
if("Slime People Ambassador" in purchased)
refundable += "Slime People Ambassador"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Slime People Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Slime People Ambassador -- 30KP</a><br>"
if("Grey Ambassador" in purchased)
refundable += "Grey Ambassador"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Grey Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Grey Ambassador -- 30KP</a><br>"
if("Vox Ambassador" in purchased)
refundable += "Vox Ambassador"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Vox Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Vox Ambassador -- 30KP</a><br>"
if("Customs Officer" in purchased)
refundable += "Customs Officer"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Customs Officer;KarmaRefundType=job;KarmaRefundCost=30'>Refund Customs Officer -- 30KP</a><br>"
if("Nanotrasen Recruiter" in purchased)
refundable += "Nanotrasen Recruiter"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Nanotrasen Recruiter;KarmaRefundType=job;KarmaRefundCost=10'>Refund Nanotrasen Recruiter -- 10KP</a><br>"
if("Mechanic" in purchased)
refundable += "Mechanic"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Mechanic;KarmaRefundType=job;KarmaRefundCost=30'>Refund Mechanic -- 30KP</a><br>"
if("Security Pod Pilot" in purchased)
refundable += "Security Pod Pilot"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Security Pod Pilot;KarmaRefundType=job;KarmaRefundCost=30'>Refund Security Pod Pilot -- 30KP</a><br>"
if("Magistrate" in purchased)
refundable += "Magistrate"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Magistrate;KarmaRefundType=job;KarmaRefundCost=45'>Refund Magistrate -- 45KP</a><br>"
if(!length(refundable))
dat += "You do not have any refundable karma purchases.<br>"
dat += "<br><b>Please note that people who attempt to game the karma system will be banned from the system and have all their unlocks revoked. \"Gaming\" the system includes, but is not limited to:<ul><li>- Karma trading</li><li>- OOC Karma begging</li><li>- Code exploits</li></ul></b>"
dat += "</center></body></html>"
var/datum/browser/popup = new(usr, "karmashop", "<div align='center'>Karma Shop</div>", 400, 500)
popup.set_content(dat)
popup.open(FALSE)
// Reloads the values from the DB to ensure they havnt been gamed
/datum/karma_holder/proc/sync_karma(mob/M = usr)
var/datum/db_query/select_query = SSdbcore.NewQuery("SELECT karma, karmaspent FROM karmatotals WHERE byondkey=:ckey", list(
"ckey" = M.ckey
))
if(!select_query.warn_execute())
qdel(select_query)
return
while(select_query.NextRow())
karma_earned = select_query.item[1]
karma_spent = select_query.item[2]
qdel(select_query)
//Checks if can afford, what you're purchasing, then purchases. (used in client_procs.dm)
/datum/karma_holder/proc/karma_purchase(price = 0, category, name, DBname = null)
sync_karma() // Ensure its up to date
var/karma_available = karma_earned - karma_spent
if(karma_available < price)
to_chat(usr, "You do not have enough karma!")
return
if(alert("Are you sure you want to unlock [name]?", "Confirmation", "No", "Yes") != "Yes")
return
if(karma_available < price) // This is repeated for a reason. Someone could queue up 10 windows to buy things.
to_chat(usr, "You do not have enough karma!")
return
if(!isnull(DBname)) //In case database uses another name for logging. (Machine, Machine People)
name = DBname
switch(category)
if("job")
DB_job_unlock(name, price)
if("species")
DB_species_unlock(name, price)
else
message_admins("Invalid category used in karma shop by [key_name_admin(usr)] | Possible href exploit.")
open_shop_menu()
/datum/karma_holder/proc/DB_job_unlock(job, cost)
var/datum/db_query/select_query = SSdbcore.NewQuery("SELECT ckey, job FROM whitelist WHERE ckey=:ckey", list(
"ckey" = usr.ckey
))
if(!select_query.warn_execute())
qdel(select_query)
return
var/dbjob
var/dbckey
while(select_query.NextRow())
dbckey = select_query.item[1]
dbjob = select_query.item[2]
qdel(select_query)
// They exist already
if(dbckey)
var/list/joblist = splittext(dbjob,",")
if(!(job in joblist))
joblist += job
var/newjoblist = jointext(joblist,",")
var/datum/db_query/update_query = SSdbcore.NewQuery("UPDATE whitelist SET job=:newjoblist WHERE ckey=:ckey", list(
"newjoblist" = newjoblist,
"ckey" = usr.ckey
))
if(!update_query.warn_execute())
qdel(update_query)
return
to_chat(usr, "You have unlocked [job].")
log_karma("[key_name(usr)] has unlocked [job].")
qdel(update_query)
karmacharge(cost)
usr.client.karmaholder.unlocked_jobs += job
else
to_chat(usr, "You already have this job unlocked!")
// They dont exist. Insert them
else
var/datum/db_query/insert_query = SSdbcore.NewQuery("INSERT INTO whitelist (ckey, job) VALUES (:ckey, :job)", list(
"ckey" = usr.ckey,
"job" = job
))
if(!insert_query.warn_execute())
qdel(insert_query)
return
to_chat(usr, "You have unlocked [job].")
log_karma("[key_name(usr)] has unlocked [job].")
karmacharge(cost)
qdel(insert_query)
/datum/karma_holder/proc/DB_species_unlock(species, cost)
var/datum/db_query/select_query = SSdbcore.NewQuery("SELECT ckey, species FROM whitelist WHERE ckey=:ckey", list(
"ckey" = usr.ckey
))
if(!select_query.warn_execute())
qdel(select_query)
return
var/dbspecies
var/dbckey
while(select_query.NextRow())
dbckey = select_query.item[1]
dbspecies = select_query.item[2]
qdel(select_query)
// They exist
if(dbckey)
var/list/specieslist = splittext(dbspecies,",")
if(!(species in specieslist))
specieslist += species
var/newspecieslist = jointext(specieslist,",")
var/datum/db_query/update_query = SSdbcore.NewQuery("UPDATE whitelist SET species=:newspecieslist WHERE ckey=:ckey", list(
"newspecieslist" = newspecieslist,
"ckey" = usr.ckey
))
if(!update_query.warn_execute())
qdel(update_query)
return
to_chat(usr, "You have unlocked [species].")
log_karma("[key_name(usr)] has unlocked [species].")
qdel(update_query)
karmacharge(cost)
usr.client.karmaholder.unlocked_species += species
else
to_chat(usr, "You already have this species unlocked!")
// They dont. New row.
else
var/datum/db_query/insert_query = SSdbcore.NewQuery("INSERT INTO whitelist (ckey, species) VALUES (:ckey, :species)", list(
"ckey" = usr.ckey,
"species" = species
))
if(!insert_query.warn_execute())
qdel(insert_query)
return
to_chat(usr, "You have unlocked [species].")
log_karma("[key_name(usr)] has unlocked [species].")
qdel(insert_query)
karmacharge(cost)
/datum/karma_holder/proc/karmacharge(cost, refund = FALSE)
sync_karma() // Ensure its up to date
if(refund)
karma_spent -= cost
else
karma_spent += cost
var/datum/db_query/update_query = SSdbcore.NewQuery("UPDATE karmatotals SET karmaspent=:spent WHERE byondkey=:ckey", list(
"spent" = karma_spent,
"ckey" = usr.ckey
))
if(!update_query.warn_execute())
qdel(update_query)
return
to_chat(usr, "You have been [refund ? "refunded" : "charged"] [cost] karma.")
log_karma("[key_name(usr)] has been [refund ? "refunded" : "charged"] [cost] karma.")
qdel(update_query)
/datum/karma_holder/proc/karmarefund(type, name, cost)
switch(name)
if("Tajaran Ambassador","Unathi Ambassador","Skrell Ambassador","Diona Ambassador","Kidan Ambassador",
"Slime People Ambassador","Grey Ambassador","Vox Ambassador","Customs Officer", "Mechanic", "Security Pod Pilot")
cost = 30
if("Nanotrasen Recruiter")
cost = 10
if("Magistrate")
cost = 45
else
to_chat(usr, "<span class='warning'>That job is not refundable.</span>")
return
var/datum/db_query/query = SSdbcore.NewQuery("SELECT ckey, job, species FROM whitelist WHERE ckey=:ckey", list(
"ckey" = usr.ckey
))
if(!query.warn_execute())
qdel(query)
return
var/dbjob
var/dbspecies
var/dbckey
while(query.NextRow())
dbckey = query.item[1]
dbjob = query.item[2]
dbspecies = query.item[3]
qdel(query)
if(dbckey)
var/list/typelist = list()
var/statement
switch(type)
if("job")
typelist = splittext(dbjob,",")
statement = "UPDATE whitelist SET job=:newtypelist WHERE ckey=:ckey"
if("species")
typelist = splittext(dbspecies,",")
statement = "UPDATE whitelist SET species=:newtypelist WHERE ckey=:ckey"
else
to_chat(usr, "<span class='warning'>Type [type] is not a valid column.</span>")
if(name in typelist)
typelist -= name
var/newtypelist = jointext(typelist,",")
var/datum/db_query/update_query = SSdbcore.NewQuery(statement, list(
"ckey" = usr.ckey,
"newtypelist" = newtypelist
))
if(!update_query.warn_execute())
qdel(update_query)
return
else
to_chat(usr, "You have been refunded [cost] karma for [type] [name].")
log_karma("[key_name(usr)] has been refunded [cost] karma for [type] [name].")
switch(type)
if("job")
usr.client.karmaholder.unlocked_jobs -= name
if("species")
usr.client.karmaholder.unlocked_species -= name
qdel(update_query)
karmacharge(text2num(cost), TRUE)
else
to_chat(usr, "<span class='warning'>You have not bought [name].</span>")
else
to_chat(usr, "<span class='warning'>Your ckey ([dbckey]) was not found.</span>")
/datum/karma_holder/Topic(href, href_list)
..()
if(href_list["karmashop"])
if(!GLOB.configuration.general.enable_karma)
to_chat(src, "Karma is disabled on this server.")
return
switch(href_list["karmashop"])
if("tab")
karma_tab = text2num(href_list["tab"])
open_shop_menu()
return
if("shop")
if(href_list["KarmaBuy"])
switch(href_list["KarmaBuy"])
if("1")
karma_purchase(5, "job", "Barber")
if("2")
karma_purchase(5, "job", "Brig Physician")
if("3")
karma_purchase(30, "job", "Nanotrasen Representative")
if("4")
karma_purchase(30, "job", "Blueshield")
return
if(href_list["KarmaBuy2"])
switch(href_list["KarmaBuy2"])
if("1")
karma_purchase(15, "species", "Machine People", "Machine")
if("2")
karma_purchase(30, "species", "Kidan")
if("3")
karma_purchase(30, "species", "Grey")
if("4")
karma_purchase(45, "species", "Vox")
if("5")
karma_purchase(45, "species", "Slime People")
if("6")
karma_purchase(45, "species", "Plasmaman")
if("7")
karma_purchase(30, "species", "Drask")
return
if(href_list["KarmaRefund"])
var/type = href_list["KarmaRefundType"]
var/job = href_list["KarmaRefund"]
var/cost = href_list["KarmaRefundCost"]
karmarefund(type, job, cost)
open_shop_menu()
return
@@ -350,7 +350,7 @@
continue
if(blacklist.len && (current_species_name in blacklist))
continue
if((IS_WHITELISTED in current_species.species_traits) && !is_alien_whitelisted(src, current_species_name))
if((IS_WHITELISTED in current_species.species_traits) && !can_use_species(src, current_species_name))
continue
valid_species += current_species_name
+3 -3
View File
@@ -214,7 +214,7 @@
return
if(client.prefs.active_character.species in GLOB.whitelisted_species)
if(!is_alien_whitelisted(src, client.prefs.active_character.species))
if(!can_use_species(src, client.prefs.active_character.species))
to_chat(src, alert("You are currently not whitelisted to play [client.prefs.active_character.species]."))
return FALSE
@@ -233,7 +233,7 @@
client.prefs.load_random_character_slot(client)
if(client.prefs.active_character.species in GLOB.whitelisted_species)
if(!is_alien_whitelisted(src, client.prefs.active_character.species))
if(!can_use_species(src, client.prefs.active_character.species))
to_chat(src, alert("You are currently not whitelisted to play [client.prefs.active_character.species]."))
return FALSE
@@ -603,7 +603,7 @@
/mob/new_player/proc/is_species_whitelisted(datum/species/S)
if(!S) return 1
return is_alien_whitelisted(src, S.name) || !(IS_WHITELISTED in S.species_traits)
return can_use_species(src, S.name) || !(IS_WHITELISTED in S.species_traits)
/mob/new_player/get_gender()
if(!client || !client.prefs) ..()
+1 -1
View File
@@ -274,7 +274,7 @@
timer = world.time
GLOB.priority_announcement.Announce("The Emergency Shuttle has left the station. Estimate [timeLeft(600)] minutes until the shuttle docks at Central Command.")
for(var/mob/M in GLOB.player_list)
if(!isnewplayer(M) && !M.client.karma_spent && !(M.client.ckey in GLOB.karma_spenders) && !M.get_preference(PREFTOGGLE_DISABLE_KARMA_REMINDER))
if(!isnewplayer(M) && !(M.client.ckey in GLOB.karma_spenders) && !M.get_preference(PREFTOGGLE_DISABLE_KARMA_REMINDER))
to_chat(M, "<i>You have not yet spent your karma for the round; was there a player worthy of receiving your reward? Look under Special Verbs tab, Award Karma.</i>")
if(SHUTTLE_ESCAPE)
+3
View File
@@ -1396,6 +1396,8 @@
#include "code\modules\client\login_processing\38-alts_cid.dm"
#include "code\modules\client\login_processing\39-cid_count.dm"
#include "code\modules\client\login_processing\40-pai_save.dm"
#include "code\modules\client\login_processing\42-karma_numbers.dm"
#include "code\modules\client\login_processing\43-karma_unlocks.dm"
#include "code\modules\client\login_processing\45-cuis.dm"
#include "code\modules\client\login_processing\__client_login_processor.dm"
#include "code\modules\client\preference\character.dm"
@@ -1694,6 +1696,7 @@
#include "code\modules\instruments\songs\play_legacy.dm"
#include "code\modules\instruments\songs\play_synthesized.dm"
#include "code\modules\karma\karma.dm"
#include "code\modules\karma\karma_holder.dm"
#include "code\modules\keybindings\bindings_admin.dm"
#include "code\modules\keybindings\bindings_ai.dm"
#include "code\modules\keybindings\bindings_atom.dm"