summaryrefslogtreecommitdiff
path: root/src/server/game/Groups/Group.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Groups/Group.cpp')
-rw-r--r--src/server/game/Groups/Group.cpp33
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);