diff options
Diffstat (limited to 'src/server/game/Groups/Group.cpp')
-rw-r--r-- | src/server/game/Groups/Group.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 2c010c7d2a..5b08d774ef 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -744,6 +744,8 @@ void Group::Disband(bool hideDestroy /* = false */) sScriptMgr->OnGroupDisband(this); Player* player; + uint32 instanceId = 0; + for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { if (!isBGGroup() && !isBFGroup()) @@ -753,6 +755,11 @@ void Group::Disband(bool hideDestroy /* = false */) player = ObjectAccessor::FindConnectedPlayer(citr->guid); + if (player && !instanceId && !isBGGroup() && !isBFGroup()) + { + instanceId = player->GetInstanceId(); + } + _homebindIfInstance(player); if (!isBGGroup() && !isBFGroup()) Player::ResetInstances(citr->guid, INSTANCE_RESET_GROUP_LEAVE, false); @@ -821,6 +828,14 @@ void Group::Disband(bool hideDestroy /* = false */) CharacterDatabase.Execute(stmt); } + // Cleaning up instance saved data for gameobjects when a group is disbanded + if (instanceId) + { + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DELETE_INSTANCE_SAVED_DATA); + stmt->SetData(0, instanceId); + CharacterDatabase.Execute(stmt); + } + sGroupMgr->RemoveGroup(this); delete this; } @@ -2022,6 +2037,16 @@ void Group::SetRaidDifficulty(Difficulty difficulty) } } +void Group::ResetInstanceSavedGameobjects(uint32 instanceId) +{ + if (instanceId) + { + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DELETE_INSTANCE_SAVED_DATA); + stmt->SetData(0, instanceId); + CharacterDatabase.Execute(stmt); + } +} + void Group::ResetInstances(uint8 method, bool isRaid, Player* leader) { if (isBGGroup() || isBFGroup() || isLFGGroup()) @@ -2049,7 +2074,11 @@ void Group::ResetInstances(uint8 method, bool isRaid, Player* leader) toUnbind.push_back(instanceSave); } else + { leader->SendResetInstanceFailed(0, instanceSave->GetMapId()); + } + + ResetInstanceSavedGameobjects(instanceSave->GetInstanceId()); } for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr) sInstanceSaveMgr->UnbindAllFor(*itr); @@ -2073,7 +2102,11 @@ void Group::ResetInstances(uint8 method, bool isRaid, Player* leader) toUnbind.push_back(instanceSave); } else + { leader->SendResetInstanceFailed(0, instanceSave->GetMapId()); + } + + ResetInstanceSavedGameobjects(instanceSave->GetInstanceId()); } for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr) sInstanceSaveMgr->UnbindAllFor(*itr); |