diff --git a/source/WorldServer/LuaInterface.h b/source/WorldServer/LuaInterface.h index 4b5defa..7590319 100644 --- a/source/WorldServer/LuaInterface.h +++ b/source/WorldServer/LuaInterface.h @@ -128,7 +128,9 @@ struct LuaSpell{ void AddTarget(int32 target_id) { std::unique_lock lock(targets_mutex); - targets.push_back(target_id); + bool hasTarget = std::find(targets.begin(), targets.end(), target_id) != targets.end(); + if(!hasTarget) + targets.push_back(target_id); } int32 GetPrimaryTargetID() const { @@ -209,7 +211,18 @@ struct LuaSpell{ void AddCharIDTarget(int32 char_id, int8 value) { std::unique_lock lock(char_id_targets_mutex); - char_id_targets.insert({char_id, value}); + + bool exists = false; + auto range = char_id_targets.equal_range(char_id); + for (auto it = range.first; it != range.second; ++it) { + if (it->second == value) { + exists = true; + break; + } + } + + if(!exists) + char_id_targets.insert({char_id, value}); } bool HasNoCharIDTargets() const { diff --git a/source/WorldServer/SpellProcess.cpp b/source/WorldServer/SpellProcess.cpp index 61d71fa..25a639f 100644 --- a/source/WorldServer/SpellProcess.cpp +++ b/source/WorldServer/SpellProcess.cpp @@ -3105,11 +3105,11 @@ void SpellProcess::AddSelfAndPetToCharTargets(LuaSpell* spell, Spawn* caster, bo int32 charID = player->GetCharacterID(); if(player->HasPet() && player->GetPet()) - spell->char_id_targets.insert(make_pair(charID, player->GetPet()->GetPetType())); + spell->AddCharIDTarget(charID, player->GetPet()->GetPetType()); if(player->HasPet() && player->GetCharmedPet()) - spell->char_id_targets.insert(make_pair(charID, player->GetPet()->GetPetType())); + spell->AddCharIDTarget(charID, player->GetPet()->GetPetType()); if(!onlyPet) - spell->char_id_targets.insert(make_pair(charID, 0x00)); + spell->AddCharIDTarget(charID, 0x00); } void SpellProcess::DeleteActiveSpell(LuaSpell* spell, bool skipRemoveCurrent) {