From e88dfe857b5903bdc56ce99d07030e14c15bbdf3 Mon Sep 17 00:00:00 2001 From: Gary Lafortune Date: Wed, 4 Mar 2020 15:18:24 -0600 Subject: [PATCH 01/15] Adds an achievement for surviving as a cargonian --- code/__HELPERS/roundend.dm | 3 +++ code/datums/achievements/achievements.dm | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 87799bb075f7..5718a7112d0c 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -337,6 +337,9 @@ parts += "You managed to survive the events on [station_name()] as [M.real_name]." if(M.mind.assigned_role in GLOB.engineering_positions) // We don't actually need to even really do a check to see if assigned_role is set to anything. SSachievements.unlock_achievement(/datum/achievement/engineering, C) + else if(M.mind.assigned_role in GLOB.supply_positions) // We don't actually need to even really do a check to see if assigned_role is set to anything. + SSachievements.unlock_achievement(/datum/achievement/cargo, C) + else parts += "
" diff --git a/code/datums/achievements/achievements.dm b/code/datums/achievements/achievements.dm index 458bf0476cfc..25dee549f562 100644 --- a/code/datums/achievements/achievements.dm +++ b/code/datums/achievements/achievements.dm @@ -4,6 +4,7 @@ #define GREENTEXT 256 // An offset for new greentext-related achievements, to keep the incremental pattern. #define REDTEXT 512 // Offset for redtexts. #define ENGIEDEPT 768 // Offset for engineering-related achievements. +#define CARGODEPT 1028 // Offset for Cargo-related achievements /datum/achievement var/name = "achievement" @@ -271,6 +272,15 @@ id = ENGIEDEPT + 4 //end-engineering +//start-cargo +/datum/achievement/cargo + name = "Glory to Cargonia" + desc = "Survive a full round as part of the Supply department." + id = CARGODEPT + 1 + +//end-cargo + #undef GREENTEXT #undef REDTEXT #undef ENGIEDEPT +#undef CARGODEPT From dd36d37a1aa983a9b652f21f469facab595555cf Mon Sep 17 00:00:00 2001 From: Gary Lafortune Date: Wed, 4 Mar 2020 15:32:13 -0600 Subject: [PATCH 02/15] Adds an achievement for getting 1,000,000 credits --- code/datums/achievements/achievements.dm | 4 ++++ code/modules/economy/account.dm | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/code/datums/achievements/achievements.dm b/code/datums/achievements/achievements.dm index 25dee549f562..1f3b85f10ddb 100644 --- a/code/datums/achievements/achievements.dm +++ b/code/datums/achievements/achievements.dm @@ -277,6 +277,10 @@ name = "Glory to Cargonia" desc = "Survive a full round as part of the Supply department." id = CARGODEPT + 1 +/datum/achievement/cargo/bourgeois + name = "Top 1%" + desc = "Have one million credits on your ID." + id = CARGODEPT + 2 //end-cargo diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm index 6f2f8f8a6e8e..cca92ae18336 100644 --- a/code/modules/economy/account.dm +++ b/code/modules/economy/account.dm @@ -9,6 +9,7 @@ var/account_id var/being_dumped = FALSE //pink levels are rising var/withdrawDelay = 0 + var/is_bourgeois = FALSE // Marks whether we've tried giving them the achievement already, this round. /datum/bank_account/New(newname, job) if(add_to_accounts) @@ -30,6 +31,14 @@ account_balance += amt if(account_balance < 0) account_balance = 0 + else if(account_balance > 1000000 && !is_bourgeois) // if we are now a millionaire, give the achievement + //So we currently only know what is *supposed* to be the real_name of the client's mob. If we can find them, we can get them this achievement. + for(var/x in GLOB.player_list) + var/mob/M = x + if(M.real_name == account_holder) + SSachievements.unlock_achievement(/datum/achievement/cargo/bourgeois, M.client) + is_bourgeois = TRUE + break /datum/bank_account/proc/has_money(amt) return account_balance >= amt From d58d7dd0968939ea0072e2245f7fadf34875cca5 Mon Sep 17 00:00:00 2001 From: Gary Lafortune Date: Wed, 4 Mar 2020 15:39:54 -0600 Subject: [PATCH 03/15] Adds an achievement for claiming the 10th cargo bounty --- code/datums/achievements/achievements.dm | 4 ++++ code/modules/cargo/bounty.dm | 5 ++++- code/modules/cargo/bounty_console.dm | 2 +- code/modules/economy/account.dm | 1 + 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/code/datums/achievements/achievements.dm b/code/datums/achievements/achievements.dm index 1f3b85f10ddb..d6ced7da478a 100644 --- a/code/datums/achievements/achievements.dm +++ b/code/datums/achievements/achievements.dm @@ -281,6 +281,10 @@ name = "Top 1%" desc = "Have one million credits on your ID." id = CARGODEPT + 2 +/datum/achievement/cargo/bounties + name = "Five Year Plan" + desc = "As a member of the Supply department, complete ten bounties." + id = CARGODEPT + 3 //end-cargo diff --git a/code/modules/cargo/bounty.dm b/code/modules/cargo/bounty.dm index 845e6f1b5262..211c2eb6b381 100644 --- a/code/modules/cargo/bounty.dm +++ b/code/modules/cargo/bounty.dm @@ -19,11 +19,14 @@ GLOBAL_LIST_EMPTY(bounties_list) return !claimed // Called when the claim button is clicked. Override to provide fancy rewards. -/datum/bounty/proc/claim() +/datum/bounty/proc/claim(mob/user) if(can_claim()) var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) if(D) D.adjust_money(reward) + D.bounties_claimed += 1 + if(D.bounties_claimed == 10) + SSachievements.unlock_achievement(/datum/achievement/cargo/bounties, user.client) claimed = TRUE // If an item sent in the cargo shuttle can satisfy the bounty. diff --git a/code/modules/cargo/bounty_console.dm b/code/modules/cargo/bounty_console.dm index 3e01faf874f6..31c3ec30c17f 100644 --- a/code/modules/cargo/bounty_console.dm +++ b/code/modules/cargo/bounty_console.dm @@ -88,7 +88,7 @@ if("Claim") var/datum/bounty/B = locate(href_list["d_rec"]) in GLOB.bounties_list if(B) - B.claim() + B.claim(usr) if(href_list["refresh"]) playsound(src, "terminal_type", 25, 0) diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm index cca92ae18336..be9180ee712f 100644 --- a/code/modules/economy/account.dm +++ b/code/modules/economy/account.dm @@ -10,6 +10,7 @@ var/being_dumped = FALSE //pink levels are rising var/withdrawDelay = 0 var/is_bourgeois = FALSE // Marks whether we've tried giving them the achievement already, this round. + var/bounties_claimed = 0 // Marks how many bounties this person has successfully claimed /datum/bank_account/New(newname, job) if(add_to_accounts) From 6161d3ae9824fbda53903eef288fdf0919724268 Mon Sep 17 00:00:00 2001 From: Gary Lafortune Date: Wed, 4 Mar 2020 16:05:13 -0600 Subject: [PATCH 04/15] Adds an achievement for firing the BSA --- code/datums/achievements/achievements.dm | 4 ++++ code/modules/awaymissions/bluespaceartillery.dm | 2 ++ 2 files changed, 6 insertions(+) diff --git a/code/datums/achievements/achievements.dm b/code/datums/achievements/achievements.dm index d6ced7da478a..ecc7396cb654 100644 --- a/code/datums/achievements/achievements.dm +++ b/code/datums/achievements/achievements.dm @@ -285,6 +285,10 @@ name = "Five Year Plan" desc = "As a member of the Supply department, complete ten bounties." id = CARGODEPT + 3 +/datum/achievement/cargo/bsa + name = '"Glass them."' + desc = "Fire the Bluespace artillery." + id = CARGODEPT + 4 //end-cargo diff --git a/code/modules/awaymissions/bluespaceartillery.dm b/code/modules/awaymissions/bluespaceartillery.dm index deb05920e229..315e0230ba73 100644 --- a/code/modules/awaymissions/bluespaceartillery.dm +++ b/code/modules/awaymissions/bluespaceartillery.dm @@ -47,6 +47,8 @@ if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr)) priority_announce("Bluespace artillery fire detected. Brace for impact.") message_admins("[ADMIN_LOOKUPFLW(usr)] has launched an artillery strike.") + if(usr.client) + SSachievements.unlock_achievement(/datum/achievement/cargo/bsa, usr.client) var/list/L = list() for(var/turf/T in get_area_turfs(thearea.type)) L+=T From f212a33da07fd3b3e580478b2ef4f5f76419d025 Mon Sep 17 00:00:00 2001 From: Gary Lafortune Date: Wed, 4 Mar 2020 17:03:35 -0600 Subject: [PATCH 05/15] Fixes compiletime due to bad string --- code/datums/achievements/achievements.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/achievements/achievements.dm b/code/datums/achievements/achievements.dm index ecc7396cb654..c97f0ceb2eed 100644 --- a/code/datums/achievements/achievements.dm +++ b/code/datums/achievements/achievements.dm @@ -286,7 +286,7 @@ desc = "As a member of the Supply department, complete ten bounties." id = CARGODEPT + 3 /datum/achievement/cargo/bsa - name = '"Glass them."' + name = "\"Glass them.\"" desc = "Fire the Bluespace artillery." id = CARGODEPT + 4 From 83a0a388d1565dad651ec577d8583db89bfa73ee Mon Sep 17 00:00:00 2001 From: Gary Lafortune Date: Wed, 4 Mar 2020 17:03:47 -0600 Subject: [PATCH 06/15] Fixes BSA achievement not always firing when firing --- code/modules/station_goals/bsa.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index 353fc90b21c1..22569a172521 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -182,7 +182,8 @@ T.ex_act(EXPLODE_DEVASTATE) point.Beam(get_target_turf(),icon_state="bsa_beam",time=50,maxdistance = world.maxx) //ZZZAP new /obj/effect/temp_visual/bsa_splash(point, dir) - + if(user.client) + SSachievements.unlock_achievement(/datum/achievement/cargo/bsa, user.client) message_admins("[ADMIN_LOOKUPFLW(user)] has launched an artillery strike.") explosion(bullseye,ex_power,ex_power*2,ex_power*4) From f6f2b329f9d3e0c5db5e88f5ee299f94dbbae2cf Mon Sep 17 00:00:00 2001 From: Gary Lafortune Date: Wed, 4 Mar 2020 18:49:42 -0600 Subject: [PATCH 07/15] Fixes bad indentation in bsa.dm --- code/modules/station_goals/bsa.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index 22569a172521..65ff18856a28 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -183,7 +183,7 @@ point.Beam(get_target_turf(),icon_state="bsa_beam",time=50,maxdistance = world.maxx) //ZZZAP new /obj/effect/temp_visual/bsa_splash(point, dir) if(user.client) - SSachievements.unlock_achievement(/datum/achievement/cargo/bsa, user.client) + SSachievements.unlock_achievement(/datum/achievement/cargo/bsa, user.client) message_admins("[ADMIN_LOOKUPFLW(user)] has launched an artillery strike.") explosion(bullseye,ex_power,ex_power*2,ex_power*4) From 12e990dc5ef3d19859fe9aa8cc2066718d4aa5ba Mon Sep 17 00:00:00 2001 From: Gary Lafortune Date: Wed, 4 Mar 2020 18:55:53 -0600 Subject: [PATCH 08/15] Attempts to fix the "achievements not reading nor writing to DB" problem --- code/controllers/subsystem/achievements.dm | 14 +++++++------- code/datums/achievements/achievements.dm | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/code/controllers/subsystem/achievements.dm b/code/controllers/subsystem/achievements.dm index 7cecbdea6d57..49d5f01757c2 100644 --- a/code/controllers/subsystem/achievements.dm +++ b/code/controllers/subsystem/achievements.dm @@ -12,14 +12,14 @@ SUBSYSTEM_DEF(achievements) var/datum/achievement/A = new i achievements[A] = A.id - var/datum/DBQuery/medalQuery = SSdbcore.NewQuery("SELECT name, descr FROM [format_table_name("achievements")] WHERE id = '[sanitizeSQL(A.id)]'") + var/datum/DBQuery/medalQuery = SSdbcore.NewQuery("SELECT name, descr FROM [format_table_name("achievements")] WHERE id = '[A.id]'") medalQuery.Execute() if(!medalQuery.NextRow()) - var/datum/DBQuery/medalQuery2 = SSdbcore.NewQuery("INSERT INTO [format_table_name("achievements")] (name, id, descr) VALUES ('[sanitizeSQL(A.name)]', '[sanitizeSQL(A.id)]', '[sanitizeSQL(A.desc)]')") + var/datum/DBQuery/medalQuery2 = SSdbcore.NewQuery("INSERT INTO [format_table_name("achievements")] (name, id, descr) VALUES ('[A.name]', '[A.id]', '[A.desc]')") medalQuery2.Execute() qdel(medalQuery2) else if(medalQuery.item[1] != A.name || medalQuery.item[2] != A.desc) - var/datum/DBQuery/medalQuery2 = SSdbcore.NewQuery("UPDATE [format_table_name("achievements")] SET name = '[sanitizeSQL(A.name)]', descr = '[sanitizeSQL(A.desc)]' WHERE id = '[sanitizeSQL(A.id)]'") + var/datum/DBQuery/medalQuery2 = SSdbcore.NewQuery("UPDATE [format_table_name("achievements")] SET name = '[A.name]', descr = '[A.desc]' WHERE id = '[A.id]'") medalQuery2.Execute() qdel(medalQuery2) @@ -38,9 +38,9 @@ SUBSYSTEM_DEF(achievements) found_achievement = TRUE if(!found_achievement) log_sql("Old achievement [id] found in database, removing") - var/datum/DBQuery/getRidOfOldStuff = SSdbcore.NewQuery("DELETE FROM [format_table_name("achievements")] WHERE id = '[sanitizeSQL(id)]'") + var/datum/DBQuery/getRidOfOldStuff = SSdbcore.NewQuery("DELETE FROM [format_table_name("achievements")] WHERE id = '[id]'") getRidOfOldStuff.Execute() - var/datum/DBQuery/ridTheOtherTableAsWell = SSdbcore.NewQuery("DELETE FROM [format_table_name("earned_achievements")] WHERE id = '[sanitizeSQL(id)]'") + var/datum/DBQuery/ridTheOtherTableAsWell = SSdbcore.NewQuery("DELETE FROM [format_table_name("earned_achievements")] WHERE id = '[id]'") ridTheOtherTableAsWell.Execute() qdel(ridTheOtherTableAsWell) qdel(getRidOfOldStuff) @@ -73,7 +73,7 @@ SUBSYSTEM_DEF(achievements) if(istype(achievement,/datum/achievement/greentext) && achievementPath != /datum/achievement/greentext) unlock_achievement(/datum/achievement/greentext,C) // Oooh, a little bit recursive! if(!has_achievement(achievementPath, C)) - var/datum/DBQuery/medalQuery = SSdbcore.NewQuery("INSERT INTO [format_table_name("earned_achievements")] (ckey, id) VALUES ('[sanitizeSQL(C.ckey)]', '[sanitizeSQL(achievement.id)]')") + var/datum/DBQuery/medalQuery = SSdbcore.NewQuery("INSERT INTO [format_table_name("earned_achievements")] (ckey, id) VALUES ('[C.ckey]', '[achievement.id]')") medalQuery.Execute() qdel(medalQuery) cached_achievements[C.ckey] += achievement @@ -94,7 +94,7 @@ SUBSYSTEM_DEF(achievements) return (achievement in cached_achievements[C.ckey]) /datum/controller/subsystem/achievements/proc/cache_achievements(client/C) - var/datum/DBQuery/cacheQuery = SSdbcore.NewQuery("SELECT id FROM [format_table_name("earned_achievements")] WHERE ckey = '[sanitizeSQL(C.ckey)]'") + var/datum/DBQuery/cacheQuery = SSdbcore.NewQuery("SELECT id FROM [format_table_name("earned_achievements")] WHERE ckey = '[C.ckey]'") cacheQuery.Execute() cached_achievements[C.ckey] = list() while(cacheQuery.NextRow()) diff --git a/code/datums/achievements/achievements.dm b/code/datums/achievements/achievements.dm index c97f0ceb2eed..a7c6fecd295a 100644 --- a/code/datums/achievements/achievements.dm +++ b/code/datums/achievements/achievements.dm @@ -7,10 +7,10 @@ #define CARGODEPT 1028 // Offset for Cargo-related achievements /datum/achievement - var/name = "achievement" - var/desc = "Please make an issue on github, including this achievement's name and how you got it." - var/id = 0 //Should be incremented so every achievement has a unique ID - var/hidden = FALSE // Whether or not this achievement's description is hidden untill you accomplish this (doesn't apply to the online viewer) + var/const/name = "achievement" + var/const/desc = "Please make an issue on github, including this achievement's name and how you got it." + var/const/id = 0 //Should be incremented so every achievement has a unique ID + var/const/hidden = FALSE // Whether or not this achievement's description is hidden untill you accomplish this (doesn't apply to the online viewer) /datum/achievement/bubblegum name = "Kick Ass and Chew Bubblegum" From e433374761772c333eda69eedfde423b0221c5bc Mon Sep 17 00:00:00 2001 From: Gary Lafortune Date: Fri, 6 Mar 2020 02:30:33 -0600 Subject: [PATCH 09/15] Attempt #2 at fixing achievements wholesale not working --- code/controllers/subsystem/achievements.dm | 4 ++-- code/datums/achievements/achievements.dm | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/controllers/subsystem/achievements.dm b/code/controllers/subsystem/achievements.dm index 49d5f01757c2..06760808d07a 100644 --- a/code/controllers/subsystem/achievements.dm +++ b/code/controllers/subsystem/achievements.dm @@ -12,7 +12,7 @@ SUBSYSTEM_DEF(achievements) var/datum/achievement/A = new i achievements[A] = A.id - var/datum/DBQuery/medalQuery = SSdbcore.NewQuery("SELECT name, descr FROM [format_table_name("achievements")] WHERE id = '[A.id]'") + var/datum/DBQuery/medalQuery = SSdbcore.NewQuery("SELECT name, descr FROM [format_table_name("achievements")] WHERE id = '[A.id]'") // No sanitation of A is needed for these calls because we instantiated A right here in this proc. medalQuery.Execute() if(!medalQuery.NextRow()) var/datum/DBQuery/medalQuery2 = SSdbcore.NewQuery("INSERT INTO [format_table_name("achievements")] (name, id, descr) VALUES ('[A.name]', '[A.id]', '[A.desc]')") @@ -73,7 +73,7 @@ SUBSYSTEM_DEF(achievements) if(istype(achievement,/datum/achievement/greentext) && achievementPath != /datum/achievement/greentext) unlock_achievement(/datum/achievement/greentext,C) // Oooh, a little bit recursive! if(!has_achievement(achievementPath, C)) - var/datum/DBQuery/medalQuery = SSdbcore.NewQuery("INSERT INTO [format_table_name("earned_achievements")] (ckey, id) VALUES ('[C.ckey]', '[achievement.id]')") + var/datum/DBQuery/medalQuery = SSdbcore.NewQuery("INSERT INTO [format_table_name("earned_achievements")] (ckey, id) VALUES ('[C.ckey]', '[initial(achievement.id)]')") medalQuery.Execute() qdel(medalQuery) cached_achievements[C.ckey] += achievement diff --git a/code/datums/achievements/achievements.dm b/code/datums/achievements/achievements.dm index a7c6fecd295a..c97f0ceb2eed 100644 --- a/code/datums/achievements/achievements.dm +++ b/code/datums/achievements/achievements.dm @@ -7,10 +7,10 @@ #define CARGODEPT 1028 // Offset for Cargo-related achievements /datum/achievement - var/const/name = "achievement" - var/const/desc = "Please make an issue on github, including this achievement's name and how you got it." - var/const/id = 0 //Should be incremented so every achievement has a unique ID - var/const/hidden = FALSE // Whether or not this achievement's description is hidden untill you accomplish this (doesn't apply to the online viewer) + var/name = "achievement" + var/desc = "Please make an issue on github, including this achievement's name and how you got it." + var/id = 0 //Should be incremented so every achievement has a unique ID + var/hidden = FALSE // Whether or not this achievement's description is hidden untill you accomplish this (doesn't apply to the online viewer) /datum/achievement/bubblegum name = "Kick Ass and Chew Bubblegum" From 7050c3221d2e8015e2926ea56a63d6bf4579403e Mon Sep 17 00:00:00 2001 From: Gary Lafortune Date: Fri, 6 Mar 2020 02:30:59 -0600 Subject: [PATCH 10/15] Adds like a submicrosecond optimization --- code/controllers/subsystem/achievements.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/controllers/subsystem/achievements.dm b/code/controllers/subsystem/achievements.dm index 06760808d07a..2b8ae1bdcee6 100644 --- a/code/controllers/subsystem/achievements.dm +++ b/code/controllers/subsystem/achievements.dm @@ -33,9 +33,9 @@ SUBSYSTEM_DEF(achievements) var/found_achievement = FALSE for(var/I in achievements) var/datum/achievement/A = I - if(A.id != id) - continue - found_achievement = TRUE + if(A.id == id) + found_achievement = TRUE + break if(!found_achievement) log_sql("Old achievement [id] found in database, removing") var/datum/DBQuery/getRidOfOldStuff = SSdbcore.NewQuery("DELETE FROM [format_table_name("achievements")] WHERE id = '[id]'") From 537d07b35cd0fc08c918451b971dd8404529e246 Mon Sep 17 00:00:00 2001 From: Gary Lafortune Date: Sat, 7 Mar 2020 09:31:22 -0600 Subject: [PATCH 11/15] Sanitizes ckeys that're input into achievement queries The use of ckey() is actually enough to ensure an inability to do SQL injection. --- code/controllers/subsystem/achievements.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/controllers/subsystem/achievements.dm b/code/controllers/subsystem/achievements.dm index 2b8ae1bdcee6..b96d82500ecb 100644 --- a/code/controllers/subsystem/achievements.dm +++ b/code/controllers/subsystem/achievements.dm @@ -29,7 +29,7 @@ SUBSYSTEM_DEF(achievements) var/datum/DBQuery/ridOldChieves = SSdbcore.NewQuery("SELECT id FROM [format_table_name("achievements")]") ridOldChieves.Execute() while(ridOldChieves.NextRow()) - var/id = text2num(ridOldChieves.item[1]) + var/id = text2num(ridOldChieves.item[1]) // This id var also doesn't need to be sanitized because it's from the actual database var/found_achievement = FALSE for(var/I in achievements) var/datum/achievement/A = I @@ -68,12 +68,12 @@ SUBSYSTEM_DEF(achievements) /datum/controller/subsystem/achievements/proc/unlock_achievement(achievementPath, client/C) var/datum/achievement/achievement = get_achievement(achievementPath) if(!achievement) - log_sql("Achievement [achievementPath] not found in list of achievements when trying to unlock for [C.ckey]") + log_sql("Achievement [achievementPath] not found in list of achievements when trying to unlock for [ckey(C.ckey)]") return FALSE if(istype(achievement,/datum/achievement/greentext) && achievementPath != /datum/achievement/greentext) unlock_achievement(/datum/achievement/greentext,C) // Oooh, a little bit recursive! if(!has_achievement(achievementPath, C)) - var/datum/DBQuery/medalQuery = SSdbcore.NewQuery("INSERT INTO [format_table_name("earned_achievements")] (ckey, id) VALUES ('[C.ckey]', '[initial(achievement.id)]')") + var/datum/DBQuery/medalQuery = SSdbcore.NewQuery("INSERT INTO [format_table_name("earned_achievements")] (ckey, id) VALUES ('[ckey(C.ckey)]', '[initial(achievement.id)]')") medalQuery.Execute() qdel(medalQuery) cached_achievements[C.ckey] += achievement @@ -94,7 +94,7 @@ SUBSYSTEM_DEF(achievements) return (achievement in cached_achievements[C.ckey]) /datum/controller/subsystem/achievements/proc/cache_achievements(client/C) - var/datum/DBQuery/cacheQuery = SSdbcore.NewQuery("SELECT id FROM [format_table_name("earned_achievements")] WHERE ckey = '[C.ckey]'") + var/datum/DBQuery/cacheQuery = SSdbcore.NewQuery("SELECT id FROM [format_table_name("earned_achievements")] WHERE ckey = '[ckey(C.ckey)]'") cacheQuery.Execute() cached_achievements[C.ckey] = list() while(cacheQuery.NextRow()) From b5fabfac18798cdc897dd654dbe97bc856fcbbfc Mon Sep 17 00:00:00 2001 From: Gary Lafortune Date: Thu, 26 Mar 2020 10:25:09 -0500 Subject: [PATCH 12/15] Makes unlock_achievement always check if client exists --- code/controllers/subsystem/achievements.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/controllers/subsystem/achievements.dm b/code/controllers/subsystem/achievements.dm index b96d82500ecb..e004d88090ca 100644 --- a/code/controllers/subsystem/achievements.dm +++ b/code/controllers/subsystem/achievements.dm @@ -66,6 +66,8 @@ SUBSYSTEM_DEF(achievements) //Ad-hoc procs /datum/controller/subsystem/achievements/proc/unlock_achievement(achievementPath, client/C) + if(!C) + return FALSE var/datum/achievement/achievement = get_achievement(achievementPath) if(!achievement) log_sql("Achievement [achievementPath] not found in list of achievements when trying to unlock for [ckey(C.ckey)]") From 39a2e27f269370b8eec222d82ac18df5b161459e Mon Sep 17 00:00:00 2001 From: Gary Lafortune Date: Thu, 26 Mar 2020 10:27:01 -0500 Subject: [PATCH 13/15] Removes the BSA achievement granting when firing thru artillerycontrol --- code/modules/awaymissions/bluespaceartillery.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/modules/awaymissions/bluespaceartillery.dm b/code/modules/awaymissions/bluespaceartillery.dm index 315e0230ba73..deb05920e229 100644 --- a/code/modules/awaymissions/bluespaceartillery.dm +++ b/code/modules/awaymissions/bluespaceartillery.dm @@ -47,8 +47,6 @@ if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr)) priority_announce("Bluespace artillery fire detected. Brace for impact.") message_admins("[ADMIN_LOOKUPFLW(usr)] has launched an artillery strike.") - if(usr.client) - SSachievements.unlock_achievement(/datum/achievement/cargo/bsa, usr.client) var/list/L = list() for(var/turf/T in get_area_turfs(thearea.type)) L+=T From 0234f436197670dbad3162af4146a44408de398e Mon Sep 17 00:00:00 2001 From: Gary Lafortune Date: Thu, 26 Mar 2020 10:30:51 -0500 Subject: [PATCH 14/15] Makes the bourgeois achievement grant on all with same real_name as millionaire --- code/modules/economy/account.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm index be9180ee712f..337f28d7ab9e 100644 --- a/code/modules/economy/account.dm +++ b/code/modules/economy/account.dm @@ -39,7 +39,7 @@ if(M.real_name == account_holder) SSachievements.unlock_achievement(/datum/achievement/cargo/bourgeois, M.client) is_bourgeois = TRUE - break + //break would result in the possibility of this being given to changeling who has duplicated the millionaire, and not to the actual millionaire /datum/bank_account/proc/has_money(amt) return account_balance >= amt From d60a0a4fca875d8b1aac9cd7643a9ec5cfae91ca Mon Sep 17 00:00:00 2001 From: alexkar598 <25136265+alexkar598@users.noreply.github.com> Date: Fri, 27 Mar 2020 09:26:51 -0400 Subject: [PATCH 15/15] Update account.dm --- code/modules/economy/account.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm index 337f28d7ab9e..1da6816f65d7 100644 --- a/code/modules/economy/account.dm +++ b/code/modules/economy/account.dm @@ -39,7 +39,7 @@ if(M.real_name == account_holder) SSachievements.unlock_achievement(/datum/achievement/cargo/bourgeois, M.client) is_bourgeois = TRUE - //break would result in the possibility of this being given to changeling who has duplicated the millionaire, and not to the actual millionaire + //break would result in the possibility of this being given to changeling who has duplicated the millionaire, and not to the actual millionaire. /datum/bank_account/proc/has_money(amt) return account_balance >= amt