diff options
author | Shauren <shauren.trinity@gmail.com> | 2025-04-19 17:50:49 +0200 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2025-05-11 12:09:54 +0200 |
commit | 8e0be127399e82a5082a9e740054b7e9fda259bc (patch) | |
tree | 4587d1242f8c8c01d15573aebc06af8817bc9f59 /src/server/game/Conditions/ConditionMgr.cpp | |
parent | d01f12cc91d3443cb217ba7db0c4f42263dfc53c (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.cpp | 60 |
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) { |