aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Conditions/ConditionMgr.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-04-19 17:50:49 +0200
committerOvahlord <dreadkiller@gmx.de>2025-05-11 12:09:54 +0200
commit8e0be127399e82a5082a9e740054b7e9fda259bc (patch)
tree4587d1242f8c8c01d15573aebc06af8817bc9f59 /src/server/game/Conditions/ConditionMgr.cpp
parentd01f12cc91d3443cb217ba7db0c4f42263dfc53c (diff)
Core/Conditions: Added conditions for automatic learning spells with SkillLineAbility::AcquireMethod = 4
(cherry picked from commit 7eaa695581589e8cb9a277f9c13ad0e3daf669a7) # Conflicts: # sql/updates/world/cata_classic/2025_04_19_01_world.sql # src/server/game/Conditions/ConditionMgr.cpp
Diffstat (limited to 'src/server/game/Conditions/ConditionMgr.cpp')
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp60
1 files changed, 35 insertions, 25 deletions
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index efe0d2ec725..a5943a1a38d 100644
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -93,7 +93,8 @@ char const* const ConditionMgr::StaticSourceTypeData[CONDITION_SOURCE_TYPE_MAX_D
"Trainer Spell",
"Object Visibility (by ID)",
"Spawn Group",
- "Player Condition"
+ "Player Condition",
+ "Skill Line Ability"
};
ConditionMgr::ConditionTypeInfo const ConditionMgr::StaticConditionTypeData[CONDITION_MAX] =
@@ -159,27 +160,20 @@ ConditionMgr::ConditionTypeInfo const ConditionMgr::StaticConditionTypeData[COND
{ "String ID", false, false, false, true }
};
-ConditionSourceInfo::ConditionSourceInfo(WorldObject const* target0, WorldObject const* target1, WorldObject const* target2)
+ConditionSourceInfo::ConditionSourceInfo(WorldObject const* target0, WorldObject const* target1, WorldObject const* target2) :
+ mConditionTargets({ target0, target1, target2 }),
+ mConditionMap(nullptr),
+ mLastFailedCondition(nullptr)
{
- mConditionTargets[0] = target0;
- mConditionTargets[1] = target1;
- mConditionTargets[2] = target2;
- if (target0)
- mConditionMap = target0->GetMap();
- else if (target1)
- mConditionMap = target1->GetMap();
- else if (target2)
- mConditionMap = target2->GetMap();
- else
- mConditionMap = nullptr;
- mLastFailedCondition = nullptr;
+ if (WorldObject const* target = Coalesce<WorldObject const>(target0, target1, target2))
+ mConditionMap = target->GetMap();
}
-ConditionSourceInfo::ConditionSourceInfo(Map const* map)
+ConditionSourceInfo::ConditionSourceInfo(Map const* map) :
+ mConditionTargets(),
+ mConditionMap(map),
+ mLastFailedCondition(nullptr)
{
- std::fill(std::begin(mConditionTargets), std::end(mConditionTargets), nullptr);
- mConditionMap = map;
- mLastFailedCondition = nullptr;
}
std::size_t ConditionId::GetHash() const
@@ -946,7 +940,7 @@ std::string Condition::ToString(bool ext /*= false*/) const
}
ss << "]";
- return ss.str();
+ return std::move(ss).str();
}
ConditionMgr::ConditionMgr() { }
@@ -2067,6 +2061,22 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond) const
}
break;
}
+ case CONDITION_SOURCE_TYPE_SKILL_LINE_ABILITY:
+ {
+ SkillLineAbilityEntry const* skillLineAbility = sSkillLineAbilityStore.LookupEntry(cond->SourceEntry);
+ if (!skillLineAbility)
+ {
+ TC_LOG_ERROR("sql.sql", "{} SourceEntry in `condition` table, does not exist in SkillLineAbility.db2, ignoring.", cond->ToString());
+ return false;
+ }
+ if (skillLineAbility->GetAcquireMethod() != SkillLineAbilityAcquireMethod::LearnedOrAutomaticCharLevel)
+ {
+ TC_LOG_ERROR("sql.sql", "{} in SkillLineAbility.db2 does not have AcquireMethod = {} (LearnedOrAutomaticCharLevel), ignoring.",
+ cond->ToString(), SkillLineAbilityAcquireMethod::LearnedOrAutomaticCharLevel);
+ return false;
+ }
+ break;
+ }
case CONDITION_SOURCE_TYPE_GOSSIP_MENU:
case CONDITION_SOURCE_TYPE_GOSSIP_MENU_OPTION:
case CONDITION_SOURCE_TYPE_SMART_EVENT:
@@ -3228,7 +3238,7 @@ static int32(* const WorldStateExpressionFunctions[WSE_FUNCTION_MAX])(Map const*
// WSE_FUNCTION_CLOCK_HOUR
[](Map const* /*map*/, uint32 /*arg1*/, uint32 /*arg2*/) -> int32
{
- uint32 currentHour = GameTime::GetDateAndTime()->tm_hour + 1;
+ int32 currentHour = GameTime::GetDateAndTime()->tm_hour + 1;
return currentHour <= 12 ? (currentHour ? currentHour : 12) : currentHour - 12;
},
@@ -3456,7 +3466,7 @@ int32 EvalSingleValue(ByteBuffer& buffer, Map const* map)
}
case WorldStateExpressionValueType::WorldState:
{
- uint32 worldStateId = buffer.read<uint32>();
+ int32 worldStateId = buffer.read<int32>();
value = sWorldStateMgr->GetValue(worldStateId, map);
break;
}
@@ -3661,7 +3671,7 @@ int32 GetUnitConditionVariable(Unit const* unit, Unit const* otherUnit, UnitCond
case UnitConditionVariable::IsChannelingSpell: // this is supposed to return spell id by client code but data always has 0 or 1
return unit->GetChannelSpellId() != 0;
case UnitConditionVariable::NumberOfMeleeAttackers:
- return std::count_if(unit->getAttackers().begin(), unit->getAttackers().end(), [unit](Unit* attacker)
+ return std::ranges::count_if(unit->getAttackers(), [unit](Unit const* attacker)
{
float distance = std::max(unit->GetCombatReach() + attacker->GetCombatReach() + 1.3333334f, 5.0f);
if (unit->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) || attacker->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
@@ -3710,7 +3720,7 @@ int32 GetUnitConditionVariable(Unit const* unit, Unit const* otherUnit, UnitCond
case UnitConditionVariable::NumberOfAttackers:
return unit->getAttackers().size();
case UnitConditionVariable::NumberOfRangedAttackers:
- return std::count_if(unit->getAttackers().begin(), unit->getAttackers().end(), [unit](Unit* attacker)
+ return std::ranges::count_if(unit->getAttackers(), [unit](Unit const* attacker)
{
float distance = std::max(unit->GetCombatReach() + attacker->GetCombatReach() + 1.3333334f, 5.0f);
if (unit->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) || attacker->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
@@ -3810,10 +3820,10 @@ int32 GetUnitConditionVariable(Unit const* unit, Unit const* otherUnit, UnitCond
case UnitConditionVariable::IsHovering:
return unit->IsHovering();
case UnitConditionVariable::HasHelpfulAuraEffect:
- return value >= 0 && value < int32(TOTAL_AURAS) && std::find_if(unit->GetAuraEffectsByType(AuraType(value)).begin(), unit->GetAuraEffectsByType(AuraType(value)).end(), [unit](AuraEffect const* aurEff)
+ return value >= 0 && value < int32(TOTAL_AURAS) && std::ranges::any_of(unit->GetAuraEffectsByType(AuraType(value)), [unit](AuraEffect const* aurEff)
{
return (aurEff->GetBase()->GetApplicationOfTarget(unit->GetGUID())->GetFlags() & AFLAG_NEGATIVE) == 0;
- }) != unit->GetAuraEffectsByType(AuraType(value)).end();
+ });
case UnitConditionVariable::HasHelpfulAuraSchool:
return unit->GetAuraApplication([value](AuraApplication const* aurApp)
{