From d6b99bb994be419713ef4f9925f46cec0788804f Mon Sep 17 00:00:00 2001 From: Abyll Date: Wed, 14 Apr 2021 07:03:53 -0600 Subject: [PATCH] Fix summoning multiple guardians exploit (#15882) * Check for existing guardian after picking observer. Repeat existing guardian check after picking observer, before finalizing creation. Refactor existing guardian check into separate proc * Fix indentation * Reset guardian item to unused if it cancels in the second has_guardian check Co-authored-by: Farie82 Co-authored-by: Farie82 --- .../gamemodes/miniantags/guardian/guardian.dm | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index b0194c53f33..c2a72b12b1e 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -250,10 +250,9 @@ var/name_list = list("Aries", "Leo", "Sagittarius", "Taurus", "Virgo", "Capricorn", "Gemini", "Libra", "Aquarius", "Cancer", "Scorpio", "Pisces") /obj/item/guardiancreator/attack_self(mob/living/user) - for(var/mob/living/simple_animal/hostile/guardian/G in GLOB.alive_mob_list) - if(G.summoner == user) - to_chat(user, "You already have a [mob_name]!") - return + if(has_guardian(user)) + to_chat(user, "You already have a [mob_name]!") + return if(user.mind && (user.mind.changeling || user.mind.vampire)) to_chat(user, "[ling_failure]") return @@ -285,6 +284,10 @@ if(candidates.len) theghost = pick(candidates) + if(has_guardian(user)) + to_chat(user, "You already have a [mob_name]!") + used = FALSE + return spawn_guardian(user, theghost.key, guardian_type) else to_chat(user, "[failure_message]") @@ -295,6 +298,13 @@ if(used) . += "[used_message]" +/obj/item/guardiancreator/proc/has_guardian(mob/living/user) + for(var/mob/living/simple_animal/hostile/guardian/G in GLOB.alive_mob_list) + if(G.summoner == user) + return TRUE + return FALSE + + /obj/item/guardiancreator/proc/spawn_guardian(mob/living/user, key, guardian_type) var/pickedtype = /mob/living/simple_animal/hostile/guardian/punch switch(guardian_type)