Core/Instance : Fix instance resetting exploit

Port From (https://github.com/TrinityCore/TrinityCore/commit/1c3c59d7fac0abb02cc1fb433338737ea119831d)
This commit is contained in:
hondacrx
2021-12-22 20:54:24 -05:00
parent 8a64e18f31
commit ff48f2cab9
2 changed files with 38 additions and 0 deletions
@@ -528,6 +528,7 @@ namespace Framework.Database
PrepareStatement(CharStatements.DEL_CHARACTER_SOCIAL, "DELETE FROM character_social WHERE guid = ? AND friend = ?"); 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_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, "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_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_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 = ?"); 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, DEL_CHARACTER_SOCIAL,
UPD_CHARACTER_SOCIAL_NOTE, UPD_CHARACTER_SOCIAL_NOTE,
UPD_CHARACTER_POSITION, UPD_CHARACTER_POSITION,
UPD_CHARACTER_POSITION_BY_MAPID,
INS_LFG_DATA, INS_LFG_DATA,
DEL_LFG_DATA, DEL_LFG_DATA,
+36
View File
@@ -2035,7 +2035,43 @@ namespace Game.Groups
{ {
// do not reset the instance, just unbind if others are permanently bound to it // do not reset the instance, just unbind if others are permanently bound to it
if (instanceSave.CanReset()) 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(); instanceSave.DeleteFromDB();
}
else else
{ {
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_GROUP_INSTANCE_BY_INSTANCE); PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_GROUP_INSTANCE_BY_INSTANCE);