From 4c42bcbb34c75dfc3e49a8d216c3dacad20412d2 Mon Sep 17 00:00:00 2001 From: Aleos Date: Mon, 19 Sep 2022 16:35:42 -0400 Subject: [PATCH] Fixes petautobonus issues (#7272) * Fixes #7271. * Fixes a missing check that looks to see if the bonus already exists before adding it again to the vector. * Fixes the removal of pet autobonuses. Thanks to @mazvi, @vstumpf, and @Lemongrass3110! --- src/map/pet.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/map/pet.cpp b/src/map/pet.cpp index 765a945926..5d3a6268af 100644 --- a/src/map/pet.cpp +++ b/src/map/pet.cpp @@ -2345,6 +2345,14 @@ void pet_evolution(struct map_session_data *sd, int16 pet_id) { * @return True on success or false otherwise */ bool pet_addautobonus(std::vector> &bonus, const std::string &script, int16 rate, uint32 dur, uint16 flag, const std::string &other_script, bool onskill) { + // Check if the same bonus already exists + for (auto &autobonus : bonus) { + // Compare based on bonus script + if (script == autobonus->bonus_script) { + return false; + } + } + if (bonus.size() == MAX_PC_BONUS) { ShowWarning("pet_addautobonus: Reached max (%d) number of petautobonus per pet!\n", MAX_PC_BONUS); return false; @@ -2395,9 +2403,14 @@ void pet_delautobonus(map_session_data &sd, std::vectortimer != INVALID_TIMER && !b->bonus_script.empty() && restore) { script_run_petautobonus(b->bonus_script, sd); - - it = bonus.erase(it); } + + if (restore) { + it++; + continue; + } + + it = bonus.erase(it); } }