aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Groups/Group.cpp
diff options
context:
space:
mode:
authorzartech22 <kevin.plestan@outlook.fr>2019-06-22 19:23:42 +0200
committerGiacomo Pozzoni <giacomopoz@gmail.com>2019-06-22 19:23:42 +0200
commit678e0e606aa38e18fd361c33bc91833fdae76735 (patch)
tree184aebeb2e8cb5bc1a14cea2e4ab3d93c1749a51 /src/server/game/Groups/Group.cpp
parentac7c72d63392cc246d2cd4ab64f558f2bf0970bf (diff)
Core/Instance : Fix instance resetting exploit (#23263)
* Push offline players out of instance Push offline players out of instance when reseting dungeon with a raid mode group * Add SQL request to character Add a SQL request to update the position of a player in a specified map * Teleport to graveyard instead
Diffstat (limited to 'src/server/game/Groups/Group.cpp')
-rw-r--r--src/server/game/Groups/Group.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index 24bc91aad16..b46fe069cfb 100644
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -2172,7 +2172,41 @@ void Group::ResetInstances(uint8 method, bool isRaid, Player* SendMsgTo)
{
// do not reset the instance, just unbind if others are permanently bound to it
if (isEmpty && instanceSave->CanReset())
+ {
+ if (map && this->isRaidGroup() && map->IsDungeon() && SendMsgTo)
+ {
+ AreaTrigger const * const instanceEntrance = sObjectMgr->GetGoBackTrigger(map->GetId());
+
+ if (!instanceEntrance)
+ TC_LOG_DEBUG("root", "Instance entrance not found for maps %u", map->GetId());
+ else
+ {
+ WorldSafeLocsEntry const * graveyardLocation = sObjectMgr->GetClosestGraveyard(instanceEntrance->target_X, instanceEntrance->target_Y, instanceEntrance->target_Z, instanceEntrance->target_mapId, SendMsgTo->GetTeam());;
+ uint32 const zoneId = sMapMgr->GetZoneId(graveyardLocation->map_id, graveyardLocation->x, graveyardLocation->y, graveyardLocation->z);
+
+ for (const MemberSlot &member : this->GetMemberSlots())
+ {
+ if (!ObjectAccessor::FindConnectedPlayer(member.guid))
+ {
+ PreparedStatement *stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHARACTER_POSITION_BY_MAPID);
+
+ stmt->setFloat(0, graveyardLocation->x);
+ stmt->setFloat(1, graveyardLocation->y);
+ stmt->setFloat(2, graveyardLocation->z);
+ stmt->setFloat(3, instanceEntrance->target_Orientation);
+ stmt->setUInt32(4, graveyardLocation->map_id);
+ stmt->setUInt32(5, zoneId);
+ stmt->setUInt32(6, member.guid);
+ stmt->setUInt32(7, map->GetId());
+
+ CharacterDatabase.Execute(stmt);
+ }
+ }
+ }
+ }
+
instanceSave->DeleteFromDB();
+ }
else
{
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GROUP_INSTANCE_BY_INSTANCE);