Core/Instance : Fix instance resetting exploit
Port From (https://github.com/TrinityCore/TrinityCore/commit/1c3c59d7fac0abb02cc1fb433338737ea119831d)
This commit is contained in:
@@ -528,6 +528,7 @@ namespace Framework.Database
|
||||
PrepareStatement(CharStatements.DEL_CHARACTER_SOCIAL, "DELETE FROM character_social WHERE guid = ? AND friend = ?");
|
||||
PrepareStatement(CharStatements.UPD_CHARACTER_SOCIAL_NOTE, "UPDATE character_social SET note = ? WHERE guid = ? AND friend = ?");
|
||||
PrepareStatement(CharStatements.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 = ?");
|
||||
PrepareStatement(CharStatements.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 = ?");
|
||||
PrepareStatement(CharStatements.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");
|
||||
PrepareStatement(CharStatements.SEL_CHARACTER_ONLINE, "SELECT name, account, map, zone FROM characters WHERE online > 0");
|
||||
PrepareStatement(CharStatements.SEL_CHAR_DEL_INFO_BY_GUID, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND guid = ?");
|
||||
@@ -1191,6 +1192,7 @@ namespace Framework.Database
|
||||
DEL_CHARACTER_SOCIAL,
|
||||
UPD_CHARACTER_SOCIAL_NOTE,
|
||||
UPD_CHARACTER_POSITION,
|
||||
UPD_CHARACTER_POSITION_BY_MAPID,
|
||||
|
||||
INS_LFG_DATA,
|
||||
DEL_LFG_DATA,
|
||||
|
||||
@@ -2035,7 +2035,43 @@ namespace Game.Groups
|
||||
{
|
||||
// do not reset the instance, just unbind if others are permanently bound to it
|
||||
if (instanceSave.CanReset())
|
||||
{
|
||||
if (map != null && IsRaidGroup() && map.IsDungeon() && SendMsgTo)
|
||||
{
|
||||
AreaTriggerStruct instanceEntrance = Global.ObjectMgr.GetGoBackTrigger(map.GetId());
|
||||
|
||||
if (instanceEntrance == null)
|
||||
Log.outDebug(LogFilter.Misc, $"Instance entrance not found for map {map.GetId()}");
|
||||
else
|
||||
{
|
||||
WorldSafeLocsEntry graveyardLocation = Global.ObjectMgr.GetClosestGraveYard(
|
||||
new WorldLocation(instanceEntrance.target_mapId, instanceEntrance.target_X, instanceEntrance.target_Y, instanceEntrance.target_Z),
|
||||
SendMsgTo.GetTeam(), null);
|
||||
uint zoneId = Global.MapMgr.GetZoneId(PhasingHandler.EmptyPhaseShift, graveyardLocation.Loc.GetMapId(),
|
||||
graveyardLocation.Loc.GetPositionX(), graveyardLocation.Loc.GetPositionY(), graveyardLocation.Loc.GetPositionZ());
|
||||
|
||||
foreach (MemberSlot member in GetMemberSlots())
|
||||
{
|
||||
if (!Global.ObjAccessor.FindConnectedPlayer(member.guid))
|
||||
{
|
||||
var stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_CHARACTER_POSITION_BY_MAPID);
|
||||
|
||||
stmt.AddValue(0, graveyardLocation.Loc.GetPositionX());
|
||||
stmt.AddValue(1, graveyardLocation.Loc.GetPositionY());
|
||||
stmt.AddValue(2, graveyardLocation.Loc.GetPositionZ());
|
||||
stmt.AddValue(3, instanceEntrance.target_Orientation);
|
||||
stmt.AddValue(4, graveyardLocation.Loc.GetMapId());
|
||||
stmt.AddValue(5, zoneId);
|
||||
stmt.AddValue(6, member.guid.GetCounter());
|
||||
stmt.AddValue(7, map.GetId());
|
||||
|
||||
DB.Characters.Execute(stmt);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
instanceSave.DeleteFromDB();
|
||||
}
|
||||
else
|
||||
{
|
||||
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_GROUP_INSTANCE_BY_INSTANCE);
|
||||
|
||||
Reference in New Issue
Block a user