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
This commit is contained in:
zartech22 authored and Ovahlord committed 2019-11-16 13:44:04 +01:00
1 parent e68c171667
commit 7353b97426
3 files changed
+36

No files matched your search

@@ -442,6 +442,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_DEL_CHARACTER_SOCIAL, "DELETE FROM character_social WHERE guid = ? AND friend = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_UPD_CHARACTER_SOCIAL_NOTE, "UPDATE character_social SET note = ? WHERE guid = ? AND friend = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_UPD_CHARACTER_POSITION, "UPDATE characters SET position_x = ?, position_y = ?, position_z = ?, orientation = ?, map = ?, zone = ?, trans_x = 0, trans_y = 0, trans_z = 0, transguid = 0, taxi_path = '', cinematic = 1 WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_UPD_CHARACTER_POSITION_BY_MAPID, "UPDATE characters SET position_x = ?, position_y = ?, position_z = ?, orientation = ?, map = ?, zone = ?, trans_x = 0, trans_y = 0, trans_z = 0, transguid = 0, taxi_path = '', cinematic = 1 WHERE guid = ? AND map = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_SEL_CHARACTER_AURA_FROZEN, "SELECT characters.name, character_aura.remainTime FROM characters LEFT JOIN character_aura ON (characters.guid = character_aura.guid) WHERE character_aura.spell = 9454", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_CHARACTER_ONLINE, "SELECT name, account, map, zone FROM characters WHERE online > 0", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_CHAR_DEL_INFO_BY_GUID, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND guid = ?", CONNECTION_SYNCH);
@@ -366,6 +366,7 @@ enum CharacterDatabaseStatements : uint32
CHAR_DEL_CHARACTER_SOCIAL,
CHAR_UPD_CHARACTER_SOCIAL_NOTE,
CHAR_UPD_CHARACTER_POSITION,
CHAR_UPD_CHARACTER_POSITION_BY_MAPID,
CHAR_INS_LFG_DATA,
CHAR_DEL_LFG_DATA,
+34
View File
@@ -2355,7 +2355,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);