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 <farie82@users.noreply.github.com>

Co-authored-by: Farie82 <farie82@users.noreply.github.com>
This commit is contained in:
Abyll
2021-04-14 14:03:53 +01:00
committed by GitHub
co-authored by Farie82
parent df656ed43f
commit d6b99bb994
@@ -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)
. += "<span class='notice'>[used_message]</span>"
/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)