diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 206d01e07..dbfc27b93 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -634,7 +634,7 @@ void GameObject::Update(uint32 diff) WorldPacket data(SMSG_FISH_ESCAPED, 0); caster->ToPlayer()->SendDirectMessage(&data); } - // can be delete + // can be deleted m_lootState = GO_JUST_DEACTIVATED; return; } @@ -1775,10 +1775,8 @@ void GameObject::Use(Unit* user) // but you will likely cause junk in areas that require a high fishing skill (not yet implemented) if (chance >= roll) { - //TODO: I do not understand this hack. Need some explanation. - // prevent removing GO at spell cancel - RemoveFromOwner(); - SetOwnerGUID(player->GetGUID()); + // Keep the bobber owned while loot is open, but clear the + // spell id so finishing the fishing channel does not delete it. SetSpellId(0); // prevent removing unintended auras at Unit::RemoveGameObject // fishing pool catch diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index e76d6597b..3aefb59a4 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6640,6 +6640,32 @@ void Unit::RemoveGameObject(uint32 spellid, bool del) } } +void Unit::RemoveGameObjectsByType(GameobjectTypes type, bool del) +{ + if (m_gameObj.empty()) + return; + + for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();) + { + if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr)) + { + if (go->GetGoType() != type) + { + ++itr; + continue; + } + + go->SetOwnerGUID(ObjectGuid::Empty); + if (del) + { + go->SetRespawnTime(0); + go->Delete(); + } + } + m_gameObj.erase(itr++); + } +} + void Unit::RemoveAllGameObjects() { while(!m_gameObj.empty()) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 9f71cd725..f3086462b 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1698,6 +1698,7 @@ public: void AddGameObject(GameObject* gameObj); void RemoveGameObject(GameObject* gameObj, bool del); void RemoveGameObject(uint32 spellid, bool del); + void RemoveGameObjectsByType(GameobjectTypes type, bool del); void RemoveAllGameObjects(); /*********************************************************/ diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 0a441a881..0c57476a5 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -5447,6 +5447,9 @@ void Spell::EffectTransmitted(SpellEffIndex effIndex) { case GAMEOBJECT_TYPE_FISHINGNODE: { + if (m_caster->IsPlayer()) + m_caster->RemoveGameObjectsByType(GAMEOBJECT_TYPE_FISHINGNODE, true); + m_caster->SetGuidValue(UNIT_FIELD_CHANNEL_OBJECT, pGameObj->GetGUID()); m_caster->AddGameObject(pGameObj); // will removed at spell cancel