Core/Conditions: Implemented conditions for spawn groups

Port From (https://github.com/TrinityCore/TrinityCore/commit/5d27939667cf3ca985a33b93646fa4e34445c8d3)
This commit is contained in:
hondacrx
2022-06-24 22:08:58 -04:00
parent a0d4a4f522
commit e56f3792de
6 changed files with 166 additions and 64 deletions
+90 -62
View File
@@ -37,23 +37,100 @@ namespace Game.Conditions
public bool Meets(ConditionSourceInfo sourceInfo)
{
Cypher.Assert(ConditionTarget < SharedConst.MaxConditionTargets);
Map map = sourceInfo.mConditionMap;
bool condMeets = false;
bool needsObject = false;
switch (ConditionType)
{
case ConditionTypes.None:
condMeets = true; // empty condition, always met
break;
case ConditionTypes.ActiveEvent:
condMeets = Global.GameEventMgr.IsActiveEvent((ushort)ConditionValue1);
break;
case ConditionTypes.InstanceInfo:
{
if (map.IsDungeon())
{
InstanceScript instance = ((InstanceMap)map).GetInstanceScript();
if (instance != null)
{
switch ((InstanceInfo)ConditionValue3)
{
case InstanceInfo.Data:
condMeets = instance.GetData(ConditionValue1) == ConditionValue2;
break;
//case INSTANCE_INFO_GUID_DATA:
// condMeets = instance->GetGuidData(ConditionValue1) == ObjectGuid(uint64(ConditionValue2));
// break;
case InstanceInfo.BossState:
condMeets = instance.GetBossState(ConditionValue1) == (EncounterState)ConditionValue2;
break;
case InstanceInfo.Data64:
condMeets = instance.GetData64(ConditionValue1) == ConditionValue2;
break;
default:
condMeets = false;
break;
}
}
}
break;
}
case ConditionTypes.Mapid:
condMeets = map.GetId() == ConditionValue1;
break;
case ConditionTypes.WorldState:
{
condMeets = ConditionValue2 == Global.WorldMgr.GetWorldState(ConditionValue1);
break;
}
case ConditionTypes.RealmAchievement:
{
var achievement = CliDB.AchievementStorage.LookupByKey(ConditionValue1);
if (achievement != null && Global.AchievementMgr.IsRealmCompleted(achievement))
condMeets = true;
break;
}
case ConditionTypes.DifficultyId:
{
condMeets = (uint)map.GetDifficultyID() == ConditionValue1;
break;
}
case ConditionTypes.ScenarioStep:
{
InstanceMap instanceMap = map.ToInstanceMap();
if (instanceMap != null)
{
Scenario scenario = instanceMap.GetInstanceScenario();
if (scenario != null)
{
ScenarioStepRecord step = scenario.GetStep();
if (step != null)
condMeets = step.Id == ConditionValue1;
}
}
break;
}
default:
needsObject = true;
break;
}
WorldObject obj = sourceInfo.mConditionTargets[ConditionTarget];
// object not present, return false
if (obj == null)
if (needsObject && obj == null)
{
Log.outDebug(LogFilter.Condition, "Condition object not found for condition (Entry: {0} Type: {1} Group: {2})", SourceEntry, SourceType, SourceGroup);
return false;
}
bool condMeets = false;
Player player = obj.ToPlayer();
Unit unit = obj.ToUnit();
switch (ConditionType)
{
case ConditionTypes.None:
condMeets = true; // empty condition, always met
break;
case ConditionTypes.Aura:
if (unit != null)
condMeets = unit.HasAuraEffect(ConditionValue1, (byte)ConditionValue2);
@@ -131,36 +208,6 @@ namespace Game.Conditions
condMeets = (status == QuestStatus.None);
}
break;
case ConditionTypes.ActiveEvent:
condMeets = Global.GameEventMgr.IsActiveEvent((ushort)ConditionValue1);
break;
case ConditionTypes.InstanceInfo:
{
var map = obj.GetMap();
if (map.IsDungeon())
{
InstanceScript instance = ((InstanceMap)map).GetInstanceScript();
if (instance != null)
{
switch ((InstanceInfo)ConditionValue3)
{
case InstanceInfo.Data:
condMeets = instance.GetData(ConditionValue1) == ConditionValue2;
break;
case InstanceInfo.Data64:
condMeets = instance.GetData64(ConditionValue1) == ConditionValue2;
break;
case InstanceInfo.BossState:
condMeets = instance.GetBossState(ConditionValue1) == (EncounterState)ConditionValue2;
break;
}
}
}
break;
}
case ConditionTypes.Mapid:
condMeets = obj.GetMapId() == ConditionValue1;
break;
case ConditionTypes.Areaid:
condMeets = obj.GetAreaId() == ConditionValue1;
break;
@@ -267,9 +314,6 @@ namespace Game.Conditions
if (unit != null)
condMeets = MathFunctions.CompareValues((ComparisionType)ConditionValue2, unit.GetHealthPct(), ConditionValue1);
break;
case ConditionTypes.WorldState:
condMeets = (ConditionValue2 == Global.WorldMgr.GetWorldState((WorldStates)ConditionValue1));
break;
case ConditionTypes.PhaseId:
condMeets = obj.GetPhaseShift().HasPhase(ConditionValue1);
break;
@@ -288,13 +332,6 @@ namespace Game.Conditions
condMeets = (uint)creature.GetCreatureTemplate().CreatureType == ConditionValue1;
break;
}
case ConditionTypes.RealmAchievement:
{
AchievementRecord achievement = CliDB.AchievementStorage.LookupByKey(ConditionValue1);
if (achievement != null && Global.AchievementMgr.IsRealmCompleted(achievement))
condMeets = true;
break;
}
case ConditionTypes.InWater:
if (unit)
condMeets = unit.IsInWater();
@@ -378,11 +415,6 @@ namespace Game.Conditions
}
break;
}
case ConditionTypes.DifficultyId:
{
condMeets = (uint)obj.GetMap().GetDifficultyID() == ConditionValue1;
break;
}
case ConditionTypes.Gamemaster:
{
if (player != null)
@@ -400,17 +432,6 @@ namespace Game.Conditions
condMeets = MathFunctions.CompareValues((ComparisionType)ConditionValue3, player.GetSession().GetBattlePetMgr().GetPetCount(CliDB.BattlePetSpeciesStorage.LookupByKey(ConditionValue1), player.GetGUID()), ConditionValue2);
break;
}
case ConditionTypes.ScenarioStep:
{
Scenario scenario = obj.GetScenario();
if (scenario != null)
{
ScenarioStepRecord step = scenario.GetStep();
if (step != null)
condMeets = step.Id == ConditionValue1;
}
break;
}
case ConditionTypes.SceneInProgress:
{
if (player != null)
@@ -418,7 +439,6 @@ namespace Game.Conditions
break;
}
default:
condMeets = false;
break;
}
@@ -620,10 +640,18 @@ namespace Game.Conditions
mConditionTargets[0] = target0;
mConditionTargets[1] = target1;
mConditionTargets[2] = target2;
mConditionMap = target0 != null ? target0.GetMap() : null;
mLastFailedCondition = null;
}
public ConditionSourceInfo(Map map)
{
mConditionMap = map;
mLastFailedCondition = null;
}
public WorldObject[] mConditionTargets = new WorldObject[SharedConst.MaxConditionTargets]; // an array of targets available for conditions
public Map mConditionMap;
public Condition mLastFailedCondition;
}
}
@@ -23,6 +23,7 @@ using Game.DataStorage;
using Game.Entities;
using Game.Groups;
using Game.Loots;
using Game.Maps;
using Game.Spells;
using System;
using System.Collections.Generic;
@@ -171,6 +172,31 @@ namespace Game
return (sourceType == ConditionSourceType.SmartEvent);
}
bool CanHaveConditionType(ConditionSourceType sourceType, ConditionTypes conditionType)
{
switch (sourceType)
{
case ConditionSourceType.SpawnGroup:
switch (conditionType)
{
case ConditionTypes.None:
case ConditionTypes.ActiveEvent:
case ConditionTypes.InstanceInfo:
case ConditionTypes.Mapid:
case ConditionTypes.WorldState:
case ConditionTypes.RealmAchievement:
case ConditionTypes.DifficultyId:
case ConditionTypes.ScenarioStep:
return true;
default:
return false;
}
default:
break;
}
return true;
}
public bool IsObjectMeetingNotGroupedConditions(ConditionSourceType sourceType, uint entry, ConditionSourceInfo sourceInfo)
{
if (sourceType > ConditionSourceType.None && sourceType < ConditionSourceType.Max)
@@ -192,6 +218,12 @@ namespace Game
return IsObjectMeetingNotGroupedConditions(sourceType, entry, conditionSource);
}
public bool IsMapMeetingNotGroupedConditions(ConditionSourceType sourceType, uint entry, Map map)
{
ConditionSourceInfo conditionSource = new(map);
return IsObjectMeetingNotGroupedConditions(sourceType, entry, conditionSource);
}
public bool HasConditionsForNotGroupedEntry(ConditionSourceType sourceType, uint entry)
{
if (sourceType > ConditionSourceType.None && sourceType < ConditionSourceType.Max)
@@ -1234,6 +1266,21 @@ namespace Game
}
break;
}
case ConditionSourceType.SpawnGroup:
{
SpawnGroupTemplateData spawnGroup = Global.ObjectMgr.GetSpawnGroupData((uint)cond.SourceEntry);
if (spawnGroup == null)
{
Log.outError(LogFilter.Sql, $"{cond.ToString()} SourceEntry in `condition` table, does not exist in `spawn_group_template`, ignoring.");
return false;
}
if (spawnGroup.flags.HasAnyFlag(SpawnGroupFlags.System | SpawnGroupFlags.ManualSpawn))
{
Log.outError(LogFilter.Sql, $"{cond.ToString()} in `spawn_group_template` table cannot have SPAWNGROUP_FLAG_SYSTEM or SPAWNGROUP_FLAG_MANUAL_SPAWN flags, ignoring.");
return false;
}
break;
}
default:
Log.outError(LogFilter.Sql, $"{cond.ToString()} Invalid ConditionSourceType in `condition` table, ignoring.");
return false;