mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-23 02:25:38 +01:00
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
(cherry picked from commit 678e0e606a)
This commit is contained in:
@@ -539,6 +539,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_BOTH);
|
||||
|
||||
@@ -423,6 +423,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,
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
#include "ObjectMgr.h"
|
||||
#include "PartyPackets.h"
|
||||
#include "Pet.h"
|
||||
#include "PhasingHandler.h"
|
||||
#include "Player.h"
|
||||
#include "Random.h"
|
||||
#include "UpdateData.h"
|
||||
@@ -2150,7 +2151,44 @@ void Group::ResetInstances(uint8 method, bool isRaid, bool isLegacy, Player* Sen
|
||||
{
|
||||
// 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)
|
||||
{
|
||||
AreaTriggerStruct 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(
|
||||
WorldLocation(instanceEntrance->target_mapId, instanceEntrance->target_X, instanceEntrance->target_Y, instanceEntrance->target_Z),
|
||||
SendMsgTo->GetTeam(), nullptr);
|
||||
uint32 const zoneId = sMapMgr->GetZoneId(PhasingHandler::GetEmptyPhaseShift(), graveyardLocation->Loc.GetMapId(),
|
||||
graveyardLocation->Loc.GetPositionX(), graveyardLocation->Loc.GetPositionY(), graveyardLocation->Loc.GetPositionZ());
|
||||
|
||||
for (MemberSlot const& member : GetMemberSlots())
|
||||
{
|
||||
if (!ObjectAccessor::FindConnectedPlayer(member.guid))
|
||||
{
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHARACTER_POSITION_BY_MAPID);
|
||||
|
||||
stmt->setFloat(0, graveyardLocation->Loc.GetPositionX());
|
||||
stmt->setFloat(1, graveyardLocation->Loc.GetPositionY());
|
||||
stmt->setFloat(2, graveyardLocation->Loc.GetPositionZ());
|
||||
stmt->setFloat(3, instanceEntrance->target_Orientation);
|
||||
stmt->setUInt32(4, graveyardLocation->Loc.GetMapId());
|
||||
stmt->setUInt32(5, zoneId);
|
||||
stmt->setUInt64(6, member.guid.GetCounter());
|
||||
stmt->setUInt32(7, map->GetId());
|
||||
|
||||
CharacterDatabase.Execute(stmt);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
instanceSave->DeleteFromDB();
|
||||
}
|
||||
else
|
||||
{
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GROUP_INSTANCE_BY_INSTANCE);
|
||||
|
||||
Reference in New Issue
Block a user