From 6ecc0ae762e6ca0e63302041e0b36a70a807da35 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Sun, 18 Mar 2018 11:43:59 -0400 Subject: [PATCH] Core/Misc: Graveyards can now use conditions, SourceType = 27, SourceEntry = graveyard_zone.ID --- Source/Framework/Constants/ConditionConst.cs | 3 ++- Source/Game/BattleGrounds/BattleGround.cs | 2 +- Source/Game/Chat/Commands/DebugCommands.cs | 2 +- Source/Game/Chat/Commands/MiscCommands.cs | 2 +- Source/Game/Conditions/ConditionManager.cs | 7 +++++++ Source/Game/Entities/Player/Player.PvP.cs | 2 +- Source/Game/Entities/Player/Player.cs | 2 +- Source/Game/Globals/ObjectManager.cs | 11 ++++++++++- Source/Game/Handlers/NPCHandler.cs | 6 ++---- 9 files changed, 26 insertions(+), 11 deletions(-) diff --git a/Source/Framework/Constants/ConditionConst.cs b/Source/Framework/Constants/ConditionConst.cs index 8ed904ce9..391997ef5 100644 --- a/Source/Framework/Constants/ConditionConst.cs +++ b/Source/Framework/Constants/ConditionConst.cs @@ -100,7 +100,8 @@ namespace Framework.Constants SpellProc = 24, TerrainSwap = 25, Phase = 26, - Max = 27 + Graveyard = 27, + Max = 28 } public enum RelationType diff --git a/Source/Game/BattleGrounds/BattleGround.cs b/Source/Game/BattleGrounds/BattleGround.cs index 73fdf7423..8ac243f29 100644 --- a/Source/Game/BattleGrounds/BattleGround.cs +++ b/Source/Game/BattleGrounds/BattleGround.cs @@ -1743,7 +1743,7 @@ namespace Game.BattleGrounds public virtual WorldSafeLocsRecord GetClosestGraveYard(Player player) { - return Global.ObjectMgr.GetClosestGraveYard(player.GetPositionX(), player.GetPositionY(), player.GetPositionZ(), player.GetMapId(), player.GetTeam()); + return Global.ObjectMgr.GetClosestGraveYard(player, player.GetTeam(), player); } public void StartCriteriaTimer(CriteriaTimedTypes type, uint entry) diff --git a/Source/Game/Chat/Commands/DebugCommands.cs b/Source/Game/Chat/Commands/DebugCommands.cs index 1531a958d..58fcb58e9 100644 --- a/Source/Game/Chat/Commands/DebugCommands.cs +++ b/Source/Game/Chat/Commands/DebugCommands.cs @@ -660,7 +660,7 @@ namespace Game.Chat if (bf != null) nearestLoc = bf.GetClosestGraveYard(player); else - nearestLoc = Global.ObjectMgr.GetClosestGraveYard(player.GetPositionX(), player.GetPositionY(), player.GetPositionZ(), player.GetMapId(), player.GetTeam()); + nearestLoc = Global.ObjectMgr.GetClosestGraveYard(player, player.GetTeam(), player); } } else diff --git a/Source/Game/Chat/Commands/MiscCommands.cs b/Source/Game/Chat/Commands/MiscCommands.cs index 474ed12fa..f86632f7f 100644 --- a/Source/Game/Chat/Commands/MiscCommands.cs +++ b/Source/Game/Chat/Commands/MiscCommands.cs @@ -1123,7 +1123,7 @@ namespace Game.Chat Player player = handler.GetSession().GetPlayer(); uint zone_id = player.GetZoneId(); - WorldSafeLocsRecord graveyard = Global.ObjectMgr.GetClosestGraveYard(player.GetPositionX(), player.GetPositionY(), player.GetPositionZ(), player.GetMapId(), team); + WorldSafeLocsRecord graveyard = Global.ObjectMgr.GetClosestGraveYard(player, team, null); if (graveyard != null) { uint graveyardId = graveyard.Id; diff --git a/Source/Game/Conditions/ConditionManager.cs b/Source/Game/Conditions/ConditionManager.cs index ccf22e5d4..935db62f2 100644 --- a/Source/Game/Conditions/ConditionManager.cs +++ b/Source/Game/Conditions/ConditionManager.cs @@ -1074,6 +1074,13 @@ namespace Game case ConditionSourceType.GossipMenuOption: case ConditionSourceType.SmartEvent: break; + case ConditionSourceType.Graveyard: + if (!CliDB.WorldSafeLocsStorage.ContainsKey(cond.SourceEntry)) + { + Log.outError(LogFilter.Sql, $"{cond.ToString()} SourceEntry in `condition` table, does not exist in WorldSafeLocs.db2, ignoring."); + return false; + } + break; default: Log.outError(LogFilter.Sql, $"{cond.ToString()} Invalid ConditionSourceType in `condition` table, ignoring."); break; diff --git a/Source/Game/Entities/Player/Player.PvP.cs b/Source/Game/Entities/Player/Player.PvP.cs index 9909d9f7b..c1fd5c8be 100644 --- a/Source/Game/Entities/Player/Player.PvP.cs +++ b/Source/Game/Entities/Player/Player.PvP.cs @@ -727,7 +727,7 @@ namespace Game.Entities // If map is dungeon find linked graveyard if (GetMap().IsDungeon()) { - WorldSafeLocsRecord entry = Global.ObjectMgr.GetClosestGraveYard(GetPositionX(), GetPositionY(), GetPositionZ(), GetMapId(), GetTeam()); + WorldSafeLocsRecord entry = Global.ObjectMgr.GetClosestGraveYard(this, GetTeam(), this); if (entry != null) m_bgData.joinPos = new WorldLocation(entry.MapID, entry.Loc.X, entry.Loc.Y, entry.Loc.Z, 0.0f); else diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index c7fe52d5b..0de04feab 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -4657,7 +4657,7 @@ namespace Game.Entities if (bf != null) ClosestGrave = bf.GetClosestGraveYard(this); else - ClosestGrave = Global.ObjectMgr.GetClosestGraveYard(GetPositionX(), GetPositionY(), GetPositionZ(), GetMapId(), GetTeam()); + ClosestGrave = Global.ObjectMgr.GetClosestGraveYard(this, GetTeam(), this); } // stop countdown until repop diff --git a/Source/Game/Globals/ObjectManager.cs b/Source/Game/Globals/ObjectManager.cs index 7d49995ec..bcabfd96c 100644 --- a/Source/Game/Globals/ObjectManager.cs +++ b/Source/Game/Globals/ObjectManager.cs @@ -835,8 +835,12 @@ namespace Game return CliDB.WorldSafeLocsStorage.LookupByKey(4); else return null; } - public WorldSafeLocsRecord GetClosestGraveYard(float x, float y, float z, uint MapId, Team team) + public WorldSafeLocsRecord GetClosestGraveYard(WorldLocation location, Team team, WorldObject conditionObject) { + float x, y, z; + location.GetPosition(out x, out y, out z); + uint MapId = location.GetMapId(); + // search for zone associated closest graveyard uint zoneId = Global.MapMgr.GetZoneId(MapId, x, y, z); if (zoneId == 0) @@ -858,6 +862,8 @@ namespace Game var range = GraveYardStorage.LookupByKey(zoneId); MapRecord mapEntry = CliDB.MapStorage.LookupByKey(MapId); + ConditionSourceInfo conditionSource = new ConditionSourceInfo(conditionObject); + // not need to check validity of map object; MapId _MUST_ be valid here if (range.Empty() && !mapEntry.IsBattlegroundOrArena()) { @@ -893,6 +899,9 @@ namespace Game if (data.team != 0 && team != 0 && data.team != (uint)team) continue; + if (conditionObject != null && !Global.ConditionMgr.IsObjectMeetingNotGroupedConditions(ConditionSourceType.Graveyard, data.safeLocId, conditionSource)) + continue; + // find now nearest graveyard at other map if (MapId != entry.MapID) { diff --git a/Source/Game/Handlers/NPCHandler.cs b/Source/Game/Handlers/NPCHandler.cs index 2ff806a58..ea0c157fa 100644 --- a/Source/Game/Handlers/NPCHandler.cs +++ b/Source/Game/Handlers/NPCHandler.cs @@ -276,8 +276,7 @@ namespace Game WorldLocation corpseLocation = GetPlayer().GetCorpseLocation(); if (GetPlayer().HasCorpse()) { - corpseGrave = Global.ObjectMgr.GetClosestGraveYard(corpseLocation.GetPositionX(), corpseLocation.GetPositionY(), - corpseLocation.GetPositionZ(), corpseLocation.GetMapId(), GetPlayer().GetTeam()); + corpseGrave = Global.ObjectMgr.GetClosestGraveYard(corpseLocation, GetPlayer().GetTeam(), GetPlayer()); } // now can spawn bones @@ -286,8 +285,7 @@ namespace Game // teleport to nearest from corpse graveyard, if different from nearest to player ghost if (corpseGrave != null) { - WorldSafeLocsRecord ghostGrave = Global.ObjectMgr.GetClosestGraveYard( - GetPlayer().GetPositionX(), GetPlayer().GetPositionY(), GetPlayer().GetPositionZ(), GetPlayer().GetMapId(), GetPlayer().GetTeam()); + WorldSafeLocsRecord ghostGrave = Global.ObjectMgr.GetClosestGraveYard(GetPlayer(), GetPlayer().GetTeam(), GetPlayer()); if (corpseGrave != ghostGrave) GetPlayer().TeleportTo(corpseGrave.MapID, corpseGrave.Loc.X, corpseGrave.Loc.Y, corpseGrave.Loc.Z, GetPlayer().GetOrientation());