Core/Graveyards: Drop Faction column and replace it with conditions

Port From (https://github.com/TrinityCore/TrinityCore/commit/c1df555e1691d788918845f95252358f25e54bb5)
This commit is contained in:
hondacrx
2023-06-13 04:20:54 -04:00
parent 2a12697cb2
commit 31ffbf3512
18 changed files with 131 additions and 123 deletions
@@ -14,8 +14,8 @@ namespace Framework.Database
PrepareStatement(WorldStatements.SEL_SMART_SCRIPTS, "SELECT entryorguid, source_type, id, link, event_type, event_phase_mask, event_chance, event_flags, event_param1, event_param2, event_param3, event_param4, event_param5, event_param_string, action_type, action_param1, action_param2, action_param3, action_param4, action_param5, action_param6, action_param7, target_type, target_param1, target_param2, target_param3, target_param4, target_x, target_y, target_z, target_o FROM smart_scripts ORDER BY entryorguid, source_type, id, link"); PrepareStatement(WorldStatements.SEL_SMART_SCRIPTS, "SELECT entryorguid, source_type, id, link, event_type, event_phase_mask, event_chance, event_flags, event_param1, event_param2, event_param3, event_param4, event_param5, event_param_string, action_type, action_param1, action_param2, action_param3, action_param4, action_param5, action_param6, action_param7, target_type, target_param1, target_param2, target_param3, target_param4, target_x, target_y, target_z, target_o FROM smart_scripts ORDER BY entryorguid, source_type, id, link");
PrepareStatement(WorldStatements.DEL_GAMEOBJECT, "DELETE FROM gameobject WHERE guid = ?"); PrepareStatement(WorldStatements.DEL_GAMEOBJECT, "DELETE FROM gameobject WHERE guid = ?");
PrepareStatement(WorldStatements.DEL_EVENT_GAMEOBJECT, "DELETE FROM game_event_gameobject WHERE guid = ?"); PrepareStatement(WorldStatements.DEL_EVENT_GAMEOBJECT, "DELETE FROM game_event_gameobject WHERE guid = ?");
PrepareStatement(WorldStatements.INS_GRAVEYARD_ZONE, "INSERT INTO graveyard_zone (ID, GhostZone, faction) VALUES (?, ?, ?)"); PrepareStatement(WorldStatements.INS_GRAVEYARD_ZONE, "INSERT INTO graveyard_zone (ID, GhostZone) VALUES (?, ?)");
PrepareStatement(WorldStatements.DEL_GRAVEYARD_ZONE, "DELETE FROM graveyard_zone WHERE ID = ? AND GhostZone = ? AND faction = ?"); PrepareStatement(WorldStatements.DEL_GRAVEYARD_ZONE, "DELETE FROM graveyard_zone WHERE ID = ? AND GhostZone = ?");
PrepareStatement(WorldStatements.INS_GAME_TELE, "INSERT INTO game_tele (id, position_x, position_y, position_z, orientation, map, name) VALUES (?, ?, ?, ?, ?, ?, ?)"); PrepareStatement(WorldStatements.INS_GAME_TELE, "INSERT INTO game_tele (id, position_x, position_y, position_z, orientation, map, name) VALUES (?, ?, ?, ?, ?, ?, ?)");
PrepareStatement(WorldStatements.DEL_GAME_TELE, "DELETE FROM game_tele WHERE name = ?"); PrepareStatement(WorldStatements.DEL_GAME_TELE, "DELETE FROM game_tele WHERE name = ?");
PrepareStatement(WorldStatements.INS_NPC_VENDOR, "INSERT INTO npc_vendor (entry, item, maxcount, incrtime, extendedcost, type) VALUES(?, ?, ?, ?, ?, ?)"); PrepareStatement(WorldStatements.INS_NPC_VENDOR, "INSERT INTO npc_vendor (entry, item, maxcount, incrtime, extendedcost, type) VALUES(?, ?, ?, ?, ?, ?)");
@@ -77,6 +77,7 @@ namespace Framework.Database
PrepareStatement(WorldStatements.DEL_SPAWNGROUP_MEMBER, "DELETE FROM spawn_group WHERE spawnType = ? AND spawnId = ?"); PrepareStatement(WorldStatements.DEL_SPAWNGROUP_MEMBER, "DELETE FROM spawn_group WHERE spawnType = ? AND spawnId = ?");
PrepareStatement(WorldStatements.DEL_GAMEOBJECT_ADDON, "DELETE FROM gameobject_addon WHERE guid = ?"); PrepareStatement(WorldStatements.DEL_GAMEOBJECT_ADDON, "DELETE FROM gameobject_addon WHERE guid = ?");
PrepareStatement(WorldStatements.SEL_GUILD_REWARDS_REQ_ACHIEVEMENTS, "SELECT AchievementRequired FROM guild_rewards_req_achievements WHERE ItemID = ?"); PrepareStatement(WorldStatements.SEL_GUILD_REWARDS_REQ_ACHIEVEMENTS, "SELECT AchievementRequired FROM guild_rewards_req_achievements WHERE ItemID = ?");
PrepareStatement(WorldStatements.INS_CONDITION, "INSERT INTO conditions (SourceTypeOrReferenceId, SourceGroup, SourceEntry, SourceId, ElseGroup, ConditionTypeOrReference, ConditionTarget, ConditionValue1, ConditionValue2, ConditionValue3, NegativeCondition, ErrorType, ErrorTextId, ScriptName, Comment) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
} }
} }
@@ -153,6 +154,7 @@ namespace Framework.Database
DEL_SPAWNGROUP_MEMBER, DEL_SPAWNGROUP_MEMBER,
DEL_GAMEOBJECT_ADDON, DEL_GAMEOBJECT_ADDON,
SEL_GUILD_REWARDS_REQ_ACHIEVEMENTS, SEL_GUILD_REWARDS_REQ_ACHIEVEMENTS,
INS_CONDITION,
MAX_WORLDDATABASE_STATEMENTS MAX_WORLDDATABASE_STATEMENTS
} }
+1 -1
View File
@@ -557,7 +557,7 @@ namespace Game.BattleFields
return null; return null;
} }
public WorldSafeLocsEntry GetClosestGraveYard(Player player) public WorldSafeLocsEntry GetClosestGraveyard(Player player)
{ {
BfGraveyard closestGY = null; BfGraveyard closestGY = null;
float maxdist = -1; float maxdist = -1;
+2 -2
View File
@@ -1714,9 +1714,9 @@ namespace Game.BattleGrounds
m_BgRaids[GetTeamIndexByTeamId(team)] = bg_raid; m_BgRaids[GetTeamIndexByTeamId(team)] = bg_raid;
} }
public virtual WorldSafeLocsEntry GetClosestGraveYard(Player player) public virtual WorldSafeLocsEntry GetClosestGraveyard(Player player)
{ {
return Global.ObjectMgr.GetClosestGraveYard(player, GetPlayerTeam(player.GetGUID()), player); return Global.ObjectMgr.GetClosestGraveyard(player, GetPlayerTeam(player.GetGUID()), player);
} }
public override void TriggerGameEvent(uint gameEventId, WorldObject source = null, WorldObject target = null) public override void TriggerGameEvent(uint gameEventId, WorldObject source = null, WorldObject target = null)
@@ -614,7 +614,7 @@ namespace Game.BattleGrounds.Zones
base.EndBattleground(winner); base.EndBattleground(winner);
} }
public override WorldSafeLocsEntry GetClosestGraveYard(Player player) public override WorldSafeLocsEntry GetClosestGraveyard(Player player)
{ {
int teamIndex = GetTeamIndexByTeamId(GetPlayerTeam(player.GetGUID())); int teamIndex = GetTeamIndexByTeamId(GetPlayerTeam(player.GetGUID()));
@@ -766,10 +766,10 @@ namespace Game.BattleGrounds.Zones
if (!BgCreatures[Point].IsEmpty()) if (!BgCreatures[Point].IsEmpty())
DelCreature(Point); DelCreature(Point);
WorldSafeLocsEntry sg = Global.ObjectMgr.GetWorldSafeLoc(EotSMisc.m_CapturingPointTypes[Point].GraveYardId); WorldSafeLocsEntry sg = Global.ObjectMgr.GetWorldSafeLoc(EotSMisc.m_CapturingPointTypes[Point].GraveyardId);
if (sg == null || !AddSpiritGuide(Point, sg.Loc.GetPositionX(), sg.Loc.GetPositionY(), sg.Loc.GetPositionZ(), 3.124139f, GetTeamIndexByTeamId(Team))) if (sg == null || !AddSpiritGuide(Point, sg.Loc.GetPositionX(), sg.Loc.GetPositionY(), sg.Loc.GetPositionZ(), 3.124139f, GetTeamIndexByTeamId(Team)))
Log.outError(LogFilter.Battleground, "BatteGroundEY: Failed to spawn spirit guide. point: {0}, team: {1}, graveyard_id: {2}", Log.outError(LogFilter.Battleground, "BatteGroundEY: Failed to spawn spirit guide. point: {0}, team: {1}, graveyard_id: {2}",
Point, Team, EotSMisc.m_CapturingPointTypes[Point].GraveYardId); Point, Team, EotSMisc.m_CapturingPointTypes[Point].GraveyardId);
// SpawnBGCreature(Point, RESPAWN_IMMEDIATELY); // SpawnBGCreature(Point, RESPAWN_IMMEDIATELY);
@@ -847,7 +847,7 @@ namespace Game.BattleGrounds.Zones
return true; return true;
} }
public override WorldSafeLocsEntry GetClosestGraveYard(Player player) public override WorldSafeLocsEntry GetClosestGraveyard(Player player)
{ {
uint g_id; uint g_id;
Team team = GetPlayerTeam(player.GetGUID()); Team team = GetPlayerTeam(player.GetGUID());
@@ -881,9 +881,9 @@ namespace Game.BattleGrounds.Zones
{ {
if (m_PointOwnedByTeam[i] == team && m_PointState[i] == EotSPointState.UnderControl) if (m_PointOwnedByTeam[i] == team && m_PointState[i] == EotSPointState.UnderControl)
{ {
entry = Global.ObjectMgr.GetWorldSafeLoc(EotSMisc.m_CapturingPointTypes[i].GraveYardId); entry = Global.ObjectMgr.GetWorldSafeLoc(EotSMisc.m_CapturingPointTypes[i].GraveyardId);
if (entry == null) if (entry == null)
Log.outError(LogFilter.Battleground, "BattlegroundEY: Graveyard {0} could not be found.", EotSMisc.m_CapturingPointTypes[i].GraveYardId); Log.outError(LogFilter.Battleground, "BattlegroundEY: Graveyard {0} could not be found.", EotSMisc.m_CapturingPointTypes[i].GraveyardId);
else else
{ {
distance = (entry.Loc.GetPositionX() - plr_x) * (entry.Loc.GetPositionX() - plr_x) + (entry.Loc.GetPositionY() - plr_y) * (entry.Loc.GetPositionY() - plr_y) + (entry.Loc.GetPositionZ() - plr_z) * (entry.Loc.GetPositionZ() - plr_z); distance = (entry.Loc.GetPositionX() - plr_x) * (entry.Loc.GetPositionX() - plr_x) + (entry.Loc.GetPositionY() - plr_y) * (entry.Loc.GetPositionY() - plr_y) + (entry.Loc.GetPositionZ() - plr_z) * (entry.Loc.GetPositionZ() - plr_z);
@@ -1011,14 +1011,14 @@ namespace Game.BattleGrounds.Zones
struct BattlegroundEYCapturingPointStruct struct BattlegroundEYCapturingPointStruct
{ {
public BattlegroundEYCapturingPointStruct(int _DespawnNeutralObjectType, int _SpawnObjectTypeAlliance, uint _MessageIdAlliance, int _SpawnObjectTypeHorde, uint _MessageIdHorde, uint _GraveYardId) public BattlegroundEYCapturingPointStruct(int _DespawnNeutralObjectType, int _SpawnObjectTypeAlliance, uint _MessageIdAlliance, int _SpawnObjectTypeHorde, uint _MessageIdHorde, uint _GraveyardId)
{ {
DespawnNeutralObjectType = _DespawnNeutralObjectType; DespawnNeutralObjectType = _DespawnNeutralObjectType;
SpawnObjectTypeAlliance = _SpawnObjectTypeAlliance; SpawnObjectTypeAlliance = _SpawnObjectTypeAlliance;
MessageIdAlliance = _MessageIdAlliance; MessageIdAlliance = _MessageIdAlliance;
SpawnObjectTypeHorde = _SpawnObjectTypeHorde; SpawnObjectTypeHorde = _SpawnObjectTypeHorde;
MessageIdHorde = _MessageIdHorde; MessageIdHorde = _MessageIdHorde;
GraveYardId = _GraveYardId; GraveyardId = _GraveyardId;
} }
public int DespawnNeutralObjectType; public int DespawnNeutralObjectType;
@@ -1026,7 +1026,7 @@ namespace Game.BattleGrounds.Zones
public uint MessageIdAlliance; public uint MessageIdAlliance;
public int SpawnObjectTypeHorde; public int SpawnObjectTypeHorde;
public uint MessageIdHorde; public uint MessageIdHorde;
public uint GraveYardId; public uint GraveyardId;
} }
struct EotSMisc struct EotSMisc
@@ -640,7 +640,7 @@ namespace Game.BattleGrounds.Zones
{ {
} }
public override WorldSafeLocsEntry GetClosestGraveYard(Player player) public override WorldSafeLocsEntry GetClosestGraveyard(Player player)
{ {
uint safeloc; uint safeloc;
@@ -797,7 +797,7 @@ namespace Game.BattleGrounds.Zones
return true; return true;
} }
public override WorldSafeLocsEntry GetClosestGraveYard(Player player) public override WorldSafeLocsEntry GetClosestGraveyard(Player player)
{ {
//if status in progress, it returns main graveyards with spiritguides //if status in progress, it returns main graveyards with spiritguides
//else it will return the graveyard in the flagroom - this is especially good //else it will return the graveyard in the flagroom - this is especially good
+3 -3
View File
@@ -684,14 +684,14 @@ namespace Game.Chat
{ {
Battleground bg = player.GetBattleground(); Battleground bg = player.GetBattleground();
if (bg) if (bg)
nearestLoc = bg.GetClosestGraveYard(player); nearestLoc = bg.GetClosestGraveyard(player);
else else
{ {
BattleField bf = Global.BattleFieldMgr.GetBattlefieldToZoneId(player.GetMap(), player.GetZoneId()); BattleField bf = Global.BattleFieldMgr.GetBattlefieldToZoneId(player.GetMap(), player.GetZoneId());
if (bf != null) if (bf != null)
nearestLoc = bf.GetClosestGraveYard(player); nearestLoc = bf.GetClosestGraveyard(player);
else else
nearestLoc = Global.ObjectMgr.GetClosestGraveYard(player, player.GetTeam(), player); nearestLoc = Global.ObjectMgr.GetClosestGraveyard(player, player.GetTeam(), player);
} }
} }
else else
+3 -5
View File
@@ -790,7 +790,7 @@ namespace Game.Chat
return false; return false;
} }
if (Global.ObjectMgr.AddGraveYardLink(graveyardId, zoneId, team)) if (Global.ObjectMgr.AddGraveyardLink(graveyardId, zoneId, team, true))
handler.SendSysMessage(CypherStrings.CommandGraveyardlinked, graveyardId, zoneId); handler.SendSysMessage(CypherStrings.CommandGraveyardlinked, graveyardId, zoneId);
else else
handler.SendSysMessage(CypherStrings.CommandGraveyardalrlinked, graveyardId, zoneId); handler.SendSysMessage(CypherStrings.CommandGraveyardalrlinked, graveyardId, zoneId);
@@ -1060,20 +1060,18 @@ namespace Game.Chat
Player player = handler.GetSession().GetPlayer(); Player player = handler.GetSession().GetPlayer();
uint zoneId = player.GetZoneId(); uint zoneId = player.GetZoneId();
WorldSafeLocsEntry graveyard = Global.ObjectMgr.GetClosestGraveYard(player, team, null); WorldSafeLocsEntry graveyard = Global.ObjectMgr.GetClosestGraveyard(player, team, null);
if (graveyard != null) if (graveyard != null)
{ {
uint graveyardId = graveyard.Id; uint graveyardId = graveyard.Id;
GraveYardData data = Global.ObjectMgr.FindGraveYardData(graveyardId, zoneId); GraveyardData data = Global.ObjectMgr.FindGraveyardData(graveyardId, zoneId);
if (data == null) if (data == null)
{ {
handler.SendSysMessage(CypherStrings.CommandGraveyarderror, graveyardId); handler.SendSysMessage(CypherStrings.CommandGraveyarderror, graveyardId);
return false; return false;
} }
team = (Team)data.team;
string team_name = handler.GetCypherString(CypherStrings.CommandGraveyardNoteam); string team_name = handler.GetCypherString(CypherStrings.CommandGraveyardNoteam);
if (team == 0) if (team == 0)
+19 -2
View File
@@ -148,6 +148,7 @@ namespace Game
sourceType == ConditionSourceType.SmartEvent || sourceType == ConditionSourceType.SmartEvent ||
sourceType == ConditionSourceType.NpcVendor || sourceType == ConditionSourceType.NpcVendor ||
sourceType == ConditionSourceType.Phase || sourceType == ConditionSourceType.Phase ||
sourceType == ConditionSourceType.Graveyard ||
sourceType == ConditionSourceType.AreaTrigger || sourceType == ConditionSourceType.AreaTrigger ||
sourceType == ConditionSourceType.TrainerSpell || sourceType == ConditionSourceType.TrainerSpell ||
sourceType == ConditionSourceType.ObjectIdVisibility; sourceType == ConditionSourceType.ObjectIdVisibility;
@@ -561,6 +562,9 @@ namespace Game
case ConditionSourceType.Phase: case ConditionSourceType.Phase:
valid = AddToPhases(cond); valid = AddToPhases(cond);
break; break;
case ConditionSourceType.Graveyard:
valid = AddToGraveyardData(cond);
break;
case ConditionSourceType.AreaTrigger: case ConditionSourceType.AreaTrigger:
areaTriggerConditionContainerStorage.Add(Tuple.Create(cond.SourceGroup, cond.SourceEntry != 0), cond); areaTriggerConditionContainerStorage.Add(Tuple.Create(cond.SourceGroup, cond.SourceEntry != 0), cond);
++count; ++count;
@@ -807,6 +811,19 @@ namespace Game
return false; return false;
} }
bool AddToGraveyardData(Condition cond)
{
GraveyardData graveyard = Global.ObjectMgr.FindGraveyardData((uint)cond.SourceEntry, cond.SourceGroup);
if (graveyard != null)
{
graveyard.Conditions.Add(cond);
return true;
}
Log.outError(LogFilter.Sql, $"{cond}, Graveyard {cond.SourceEntry} does not have ghostzone {cond.SourceGroup}.");
return false;
}
bool IsSourceTypeValid(Condition cond) bool IsSourceTypeValid(Condition cond)
{ {
switch (cond.SourceType) switch (cond.SourceType)
@@ -1176,9 +1193,9 @@ namespace Game
case ConditionSourceType.SmartEvent: case ConditionSourceType.SmartEvent:
break; break;
case ConditionSourceType.Graveyard: case ConditionSourceType.Graveyard:
if (Global.ObjectMgr.GetWorldSafeLoc((uint)cond.SourceEntry) == null) if (Global.ObjectMgr.FindGraveyardData((uint)cond.SourceEntry, cond.SourceGroup) == null)
{ {
Log.outError(LogFilter.Sql, $"{cond.ToString()} SourceEntry in `condition` table, does not exist in WorldSafeLocs.db2, ignoring."); Log.outError(LogFilter.Sql, $"{cond.ToString()} SourceEntry in `condition` table, does not exist in `graveyard_zone`, ignoring.");
return false; return false;
} }
break; break;
+1 -1
View File
@@ -632,7 +632,7 @@ namespace Game.Entities
if (!ok) if (!ok)
{ {
WorldSafeLocsEntry loc = Global.ObjectMgr.GetDefaultGraveYard(GetTeam()); WorldSafeLocsEntry loc = Global.ObjectMgr.GetDefaultGraveyard(GetTeam());
if (loc == null && GetRace() == Race.PandarenNeutral) if (loc == null && GetRace() == Race.PandarenNeutral)
loc = Global.ObjectMgr.GetWorldSafeLoc(3295); // The Wandering Isle, Starting Area GY loc = Global.ObjectMgr.GetWorldSafeLoc(3295); // The Wandering Isle, Starting Area GY
+1 -1
View File
@@ -562,7 +562,7 @@ namespace Game.Entities
// If map is dungeon find linked graveyard // If map is dungeon find linked graveyard
if (GetMap().IsDungeon()) if (GetMap().IsDungeon())
{ {
WorldSafeLocsEntry entry = Global.ObjectMgr.GetClosestGraveYard(this, GetTeam(), this); WorldSafeLocsEntry entry = Global.ObjectMgr.GetClosestGraveyard(this, GetTeam(), this);
if (entry != null) if (entry != null)
m_bgData.joinPos = entry.Loc; m_bgData.joinPos = entry.Loc;
else else
+3 -3
View File
@@ -4211,14 +4211,14 @@ namespace Game.Entities
// Special handle for Battlegroundmaps // Special handle for Battlegroundmaps
Battleground bg = GetBattleground(); Battleground bg = GetBattleground();
if (bg) if (bg)
ClosestGrave = bg.GetClosestGraveYard(this); ClosestGrave = bg.GetClosestGraveyard(this);
else else
{ {
BattleField bf = BattleFieldMgr.GetBattlefieldToZoneId(GetMap(), GetZoneId()); BattleField bf = BattleFieldMgr.GetBattlefieldToZoneId(GetMap(), GetZoneId());
if (bf != null) if (bf != null)
ClosestGrave = bf.GetClosestGraveYard(this); ClosestGrave = bf.GetClosestGraveyard(this);
else else
ClosestGrave = ObjectMgr.GetClosestGraveYard(this, GetTeam(), this); ClosestGrave = ObjectMgr.GetClosestGraveyard(this, GetTeam(), this);
} }
// stop countdown until repop // stop countdown until repop
+72 -85
View File
@@ -754,10 +754,10 @@ namespace Game
{ {
uint oldMSTime = Time.GetMSTime(); uint oldMSTime = Time.GetMSTime();
GraveYardStorage.Clear(); // need for reload case GraveyardStorage.Clear(); // need for reload case
// 0 1 2 // 0 1
SQLResult result = DB.World.Query("SELECT ID, GhostZone, faction FROM graveyard_zone"); SQLResult result = DB.World.Query("SELECT ID, GhostZone FROM graveyard_zone");
if (result.IsEmpty()) if (result.IsEmpty())
{ {
@@ -769,10 +769,8 @@ namespace Game
do do
{ {
++count;
uint safeLocId = result.Read<uint>(0); uint safeLocId = result.Read<uint>(0);
uint zoneId = result.Read<uint>(1); uint zoneId = result.Read<uint>(1);
Team team = (Team)result.Read<uint>(2);
WorldSafeLocsEntry entry = GetWorldSafeLoc(safeLocId); WorldSafeLocsEntry entry = GetWorldSafeLoc(safeLocId);
if (entry == null) if (entry == null)
@@ -788,18 +786,15 @@ namespace Game
continue; continue;
} }
if (team != 0 && team != Team.Horde && team != Team.Alliance) if (!AddGraveyardLink(safeLocId, zoneId, 0, false))
{
Log.outError(LogFilter.Sql, "Table `graveyard_zone` has a record for non player faction ({0}), skipped.", team);
continue;
}
if (!AddGraveYardLink(safeLocId, zoneId, team, false))
Log.outError(LogFilter.Sql, "Table `graveyard_zone` has a duplicate record for Graveyard (ID: {0}) and Zone (ID: {1}), skipped.", safeLocId, zoneId); Log.outError(LogFilter.Sql, "Table `graveyard_zone` has a duplicate record for Graveyard (ID: {0}) and Zone (ID: {1}), skipped.", safeLocId, zoneId);
++count;
} while (result.NextRow()); } while (result.NextRow());
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} graveyard-zone links in {1} ms", count, Time.GetMSTimeDiffToNow(oldMSTime)); Log.outInfo(LogFilter.ServerLoading, "Loaded {0} graveyard-zone links in {1} ms", count, Time.GetMSTimeDiffToNow(oldMSTime));
} }
public void LoadWorldSafeLocs() public void LoadWorldSafeLocs()
{ {
uint oldMSTime = Time.GetMSTime(); uint oldMSTime = Time.GetMSTime();
@@ -831,7 +826,7 @@ namespace Game
Log.outInfo(LogFilter.ServerLoading, $"Loaded {_worldSafeLocs.Count} world locations {Time.GetMSTimeDiffToNow(oldMSTime)} ms"); Log.outInfo(LogFilter.ServerLoading, $"Loaded {_worldSafeLocs.Count} world locations {Time.GetMSTimeDiffToNow(oldMSTime)} ms");
} }
public WorldSafeLocsEntry GetDefaultGraveYard(Team team) public WorldSafeLocsEntry GetDefaultGraveyard(Team team)
{ {
if (team == Team.Horde) if (team == Team.Horde)
return GetWorldSafeLoc(10); return GetWorldSafeLoc(10);
@@ -840,7 +835,7 @@ namespace Game
else return null; else return null;
} }
public WorldSafeLocsEntry GetClosestGraveYard(WorldLocation location, Team team, WorldObject conditionObject) public WorldSafeLocsEntry GetClosestGraveyard(WorldLocation location, Team team, WorldObject conditionObject)
{ {
float x, y, z; float x, y, z;
location.GetPosition(out x, out y, out z); location.GetPosition(out x, out y, out z);
@@ -853,7 +848,7 @@ namespace Game
if (z > -500) if (z > -500)
{ {
Log.outError(LogFilter.Server, "ZoneId not found for map {0} coords ({1}, {2}, {3})", MapId, x, y, z); Log.outError(LogFilter.Server, "ZoneId not found for map {0} coords ({1}, {2}, {3})", MapId, x, y, z);
return GetDefaultGraveYard(team); return GetDefaultGraveyard(team);
} }
} }
@@ -884,7 +879,7 @@ namespace Game
// then check faction // then check faction
// if mapId != graveyard.mapId (ghost in instance) and search any graveyard associated // if mapId != graveyard.mapId (ghost in instance) and search any graveyard associated
// then check faction // then check faction
var range = GraveYardStorage.LookupByKey(zoneId); var range = GraveyardStorage.LookupByKey(zoneId);
MapRecord mapEntry = CliDB.MapStorage.LookupByKey(MapId); MapRecord mapEntry = CliDB.MapStorage.LookupByKey(MapId);
ConditionSourceInfo conditionSource = new(conditionObject); ConditionSourceInfo conditionSource = new(conditionObject);
@@ -894,7 +889,7 @@ namespace Game
{ {
if (zoneId != 0) // zone == 0 can't be fixed, used by bliz for bugged zones if (zoneId != 0) // zone == 0 can't be fixed, used by bliz for bugged zones
Log.outError(LogFilter.Sql, "Table `game_graveyard_zone` incomplete: Zone {0} Team {1} does not have a linked graveyard.", zoneId, team); Log.outError(LogFilter.Sql, "Table `game_graveyard_zone` incomplete: Zone {0} Team {1} does not have a linked graveyard.", zoneId, team);
return GetDefaultGraveYard(team); return GetDefaultGraveyard(team);
} }
// at corpse map // at corpse map
@@ -912,26 +907,38 @@ namespace Game
foreach (var data in range) foreach (var data in range)
{ {
WorldSafeLocsEntry entry = GetWorldSafeLoc(data.safeLocId); WorldSafeLocsEntry entry = GetWorldSafeLoc(data.SafeLocId);
if (entry == null) if (entry == null)
{ {
Log.outError(LogFilter.Sql, "Table `game_graveyard_zone` has record for not existing graveyard (WorldSafeLocs.dbc id) {0}, skipped.", data.safeLocId); Log.outError(LogFilter.Sql, "Table `game_graveyard_zone` has record for not existing graveyard (WorldSafeLocs.dbc id) {0}, skipped.", data.SafeLocId);
continue; continue;
} }
// skip enemy faction graveyard
// team == 0 case can be at call from .neargrave
if (data.team != 0 && team != 0 && data.team != (uint)team)
continue;
if (conditionObject) if (conditionObject)
{ {
if (!Global.ConditionMgr.IsObjectMeetingNotGroupedConditions(ConditionSourceType.Graveyard, data.safeLocId, conditionSource)) if (!Global.ConditionMgr.IsObjectMeetToConditions(conditionSource, data.Conditions))
continue; continue;
if (entry.Loc.GetMapId() == mapEntry.ParentMapID && !conditionObject.GetPhaseShift().HasVisibleMapId(entry.Loc.GetMapId())) if (entry.Loc.GetMapId() == mapEntry.ParentMapID && !conditionObject.GetPhaseShift().HasVisibleMapId(entry.Loc.GetMapId()))
continue; continue;
} }
else if (team != 0)
{
bool teamConditionMet = true;
foreach (Condition cond in data.Conditions)
{
if (cond.ConditionType != ConditionTypes.Team)
continue;
if (cond.ConditionValue1 == (uint)team)
continue;
teamConditionMet = false;
}
if (!teamConditionMet)
continue;
}
// find now nearest graveyard at other map // find now nearest graveyard at other map
if (MapId != entry.Loc.GetMapId() && entry.Loc.GetMapId() != mapEntry.ParentMapID) if (MapId != entry.Loc.GetMapId() && entry.Loc.GetMapId() != mapEntry.ParentMapID)
@@ -995,12 +1002,12 @@ namespace Game
return entryFar; return entryFar;
} }
public GraveYardData FindGraveYardData(uint id, uint zoneId) public GraveyardData FindGraveyardData(uint id, uint zoneId)
{ {
var range = GraveYardStorage.LookupByKey(zoneId); var range = GraveyardStorage.LookupByKey(zoneId);
foreach (var data in range) foreach (var data in range)
{ {
if (data.safeLocId == id) if (data.SafeLocId == id)
return data; return data;
} }
return null; return null;
@@ -1010,22 +1017,22 @@ namespace Game
{ {
return _worldSafeLocs.LookupByKey(id); return _worldSafeLocs.LookupByKey(id);
} }
public Dictionary<uint, WorldSafeLocsEntry> GetWorldSafeLocs() public Dictionary<uint, WorldSafeLocsEntry> GetWorldSafeLocs()
{ {
return _worldSafeLocs; return _worldSafeLocs;
} }
public bool AddGraveYardLink(uint id, uint zoneId, Team team, bool persist = true) public bool AddGraveyardLink(uint id, uint zoneId, Team team, bool persist = true)
{ {
if (FindGraveYardData(id, zoneId) != null) if (FindGraveyardData(id, zoneId) != null)
return false; return false;
// add link to loaded data // add link to loaded data
GraveYardData data = new(); GraveyardData data = new();
data.safeLocId = id; data.SafeLocId = id;
data.team = (uint)team;
GraveYardStorage.Add(zoneId, data); GraveyardStorage.Add(zoneId, data);
// add link to DB // add link to DB
if (persist) if (persist)
@@ -1034,59 +1041,39 @@ namespace Game
stmt.AddValue(0, id); stmt.AddValue(0, id);
stmt.AddValue(1, zoneId); stmt.AddValue(1, zoneId);
stmt.AddValue(2, (uint)team);
DB.World.Execute(stmt); DB.World.Execute(stmt);
// Store graveyard condition if team is set
if (team != 0)
{
PreparedStatement conditionStmt = WorldDatabase.GetPreparedStatement(WorldStatements.INS_CONDITION);
conditionStmt.AddValue(0, (uint)ConditionSourceType.Graveyard); // SourceTypeOrReferenceId
conditionStmt.AddValue(1, zoneId); // SourceGroup
conditionStmt.AddValue(2, id); // SourceEntry
conditionStmt.AddValue(3, 0); // SourceId
conditionStmt.AddValue(4, 0); // ElseGroup
conditionStmt.AddValue(5, (uint)ConditionTypes.Team); // ConditionTypeOrReference
conditionStmt.AddValue(6, 0); // ConditionTarget
conditionStmt.AddValue(7, (uint)team); // ConditionValue1
conditionStmt.AddValue(8, 0); // ConditionValue2
conditionStmt.AddValue(9, 0); // ConditionValue3
conditionStmt.AddValue(10, 0); // NegativeCondition
conditionStmt.AddValue(11, 0); // ErrorType
conditionStmt.AddValue(12, 0); // ErrorTextId
conditionStmt.AddValue(13, ""); // ScriptName
conditionStmt.AddValue(14, ""); // Comment
DB.World.Execute(conditionStmt);
// reload conditions to make sure everything is loaded as it should be
Global.ConditionMgr.LoadConditions(true);
//Global.ScriptMgr.NotifyScriptIDUpdate();
}
} }
return true; return true;
} }
public void RemoveGraveYardLink(uint id, uint zoneId, Team team, bool persist = false)
{
var range = GraveYardStorage.LookupByKey(zoneId);
if (range.Empty())
{
Log.outError(LogFilter.Sql, "Table `game_graveyard_zone` incomplete: Zone {0} Team {1} does not have a linked graveyard.", zoneId, team);
return;
}
bool found = false;
foreach (var data in range)
{
// skip not matching safezone id
if (data.safeLocId != id)
continue;
// skip enemy faction graveyard at same map (normal area, city, or Battleground)
// team == 0 case can be at call from .neargrave
if (data.team != 0 && team != 0 && data.team != (uint)team)
continue;
found = true;
break;
}
// no match, return
if (!found)
return;
// remove from links
GraveYardStorage.Remove(zoneId);
// remove link from DB
if (persist)
{
PreparedStatement stmt = WorldDatabase.GetPreparedStatement(WorldStatements.DEL_GRAVEYARD_ZONE);
stmt.AddValue(0, id);
stmt.AddValue(1, zoneId);
stmt.AddValue(2, (uint)team);
DB.World.Execute(stmt);
}
}
//Scripts //Scripts
public void LoadAreaTriggerScripts() public void LoadAreaTriggerScripts()
@@ -10893,7 +10880,7 @@ namespace Game
Dictionary<(uint mapId, Difficulty difficulty), Dictionary<uint, CellObjectGuids>> mapObjectGuidsStore = new(); Dictionary<(uint mapId, Difficulty difficulty), Dictionary<uint, CellObjectGuids>> mapObjectGuidsStore = new();
Dictionary<(uint mapId, Difficulty diffuculty, uint phaseId), Dictionary<uint, CellObjectGuids>> mapPersonalObjectGuidsStore = new(); Dictionary<(uint mapId, Difficulty diffuculty, uint phaseId), Dictionary<uint, CellObjectGuids>> mapPersonalObjectGuidsStore = new();
Dictionary<uint, InstanceTemplate> instanceTemplateStorage = new(); Dictionary<uint, InstanceTemplate> instanceTemplateStorage = new();
public MultiMap<uint, GraveYardData> GraveYardStorage = new(); public MultiMap<uint, GraveyardData> GraveyardStorage = new();
List<ushort> _transportMaps = new(); List<ushort> _transportMaps = new();
Dictionary<uint, SpawnGroupTemplateData> _spawnGroupDataStorage = new(); Dictionary<uint, SpawnGroupTemplateData> _spawnGroupDataStorage = new();
MultiMap<uint, SpawnMetadata> _spawnGroupMapStorage = new(); MultiMap<uint, SpawnMetadata> _spawnGroupMapStorage = new();
@@ -11402,10 +11389,10 @@ namespace Game
public WorldLocation Loc; public WorldLocation Loc;
} }
public class GraveYardData public class GraveyardData
{ {
public uint safeLocId; public uint SafeLocId;
public uint team; public List<Condition> Conditions;
} }
public class QuestPOIBlobData public class QuestPOIBlobData
+7 -3
View File
@@ -5,6 +5,7 @@ using Framework.Collections;
using Framework.Constants; using Framework.Constants;
using Framework.Database; using Framework.Database;
using Game.Cache; using Game.Cache;
using Game.Conditions;
using Game.DataStorage; using Game.DataStorage;
using Game.Entities; using Game.Entities;
using Game.Groups; using Game.Groups;
@@ -2403,13 +2404,16 @@ namespace Game
uint team = (uint)GetPlayer().GetTeam(); uint team = (uint)GetPlayer().GetTeam();
List<uint> graveyardIds = new(); List<uint> graveyardIds = new();
var range = Global.ObjectMgr.GraveYardStorage.LookupByKey(zoneId); var range = Global.ObjectMgr.GraveyardStorage.LookupByKey(zoneId);
for (uint i = 0; i < range.Count && graveyardIds.Count < 16; ++i) // client max for (uint i = 0; i < range.Count && graveyardIds.Count < 16; ++i) // client max
{ {
var gYard = range[(int)i]; var gYard = range[(int)i];
if (gYard.team == 0 || gYard.team == team) ConditionSourceInfo conditionSource = new(_player);
graveyardIds.Add(i); if (!Global.ConditionMgr.IsObjectMeetToConditions(conditionSource, gYard.Conditions))
continue;
graveyardIds.Add(i);
} }
if (graveyardIds.Empty()) if (graveyardIds.Empty())
+2 -2
View File
@@ -260,7 +260,7 @@ namespace Game
WorldLocation corpseLocation = GetPlayer().GetCorpseLocation(); WorldLocation corpseLocation = GetPlayer().GetCorpseLocation();
if (GetPlayer().HasCorpse()) if (GetPlayer().HasCorpse())
{ {
corpseGrave = Global.ObjectMgr.GetClosestGraveYard(corpseLocation, GetPlayer().GetTeam(), GetPlayer()); corpseGrave = Global.ObjectMgr.GetClosestGraveyard(corpseLocation, GetPlayer().GetTeam(), GetPlayer());
} }
// now can spawn bones // now can spawn bones
@@ -269,7 +269,7 @@ namespace Game
// teleport to nearest from corpse graveyard, if different from nearest to player ghost // teleport to nearest from corpse graveyard, if different from nearest to player ghost
if (corpseGrave != null) if (corpseGrave != null)
{ {
WorldSafeLocsEntry ghostGrave = Global.ObjectMgr.GetClosestGraveYard(GetPlayer(), GetPlayer().GetTeam(), GetPlayer()); WorldSafeLocsEntry ghostGrave = Global.ObjectMgr.GetClosestGraveyard(GetPlayer(), GetPlayer().GetTeam(), GetPlayer());
if (corpseGrave != ghostGrave) if (corpseGrave != ghostGrave)
GetPlayer().TeleportTo(corpseGrave.Loc); GetPlayer().TeleportTo(corpseGrave.Loc);
+1 -1
View File
@@ -67,7 +67,7 @@ namespace Game.BattleFields
Global.WorldStateMgr.SetValue(WorldStates.BattlefieldWgAttacker, (int)GetAttackerTeam(), false, m_Map); Global.WorldStateMgr.SetValue(WorldStates.BattlefieldWgAttacker, (int)GetAttackerTeam(), false, m_Map);
Global.WorldStateMgr.SetValue(WGConst.ClockWorldState[1], (int)(GameTime.GetGameTime() + m_Timer / Time.InMilliseconds), false, m_Map); Global.WorldStateMgr.SetValue(WGConst.ClockWorldState[1], (int)(GameTime.GetGameTime() + m_Timer / Time.InMilliseconds), false, m_Map);
foreach (var gy in WGConst.WGGraveYard) foreach (var gy in WGConst.WGGraveyard)
{ {
BfGraveyardWG graveyard = new(this); BfGraveyardWG graveyard = new(this);
@@ -16,7 +16,7 @@ namespace Game.BattleFields
public const byte MaxWorkshops = 6; public const byte MaxWorkshops = 6;
#region Data #region Data
public static BfWGCoordGY[] WGGraveYard = public static BfWGCoordGY[] WGGraveyard =
{ {
new BfWGCoordGY(5104.750f, 2300.940f, 368.579f, 0.733038f, 1329, WGGossipText.GYNE, TeamId.Neutral), new BfWGCoordGY(5104.750f, 2300.940f, 368.579f, 0.733038f, 1329, WGGossipText.GYNE, TeamId.Neutral),
new BfWGCoordGY(5099.120f, 3466.036f, 368.484f, 5.317802f, 1330, WGGossipText.GYNW, TeamId.Neutral), new BfWGCoordGY(5099.120f, 3466.036f, 368.484f, 5.317802f, 1330, WGGossipText.GYNW, TeamId.Neutral),