diff options
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 60 | ||||
| -rw-r--r-- | src/server/game/Spells/Auras/SpellAuraDefines.h | 16 | ||||
| -rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 53 | ||||
| -rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.h | 1 |
4 files changed, 97 insertions, 33 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 9170e81005f..23ff0e14c04 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -8767,33 +8767,43 @@ void Unit::UpdateAdvFlyingSpeed(AdvFlyingRateTypeSingle speedType, bool clientUp if (!flightCapabilityEntry) flightCapabilityEntry = sFlightCapabilityStore.AssertEntry(1); - auto [opcode, newValue] = [&] + auto [opcode, newValue, rateAura] = [&] { switch (speedType) { case ADV_FLYING_AIR_FRICTION: - return std::pair(SMSG_MOVE_SET_ADV_FLYING_AIR_FRICTION, flightCapabilityEntry->AirFriction); + return std::tuple(SMSG_MOVE_SET_ADV_FLYING_AIR_FRICTION, flightCapabilityEntry->AirFriction, SPELL_AURA_MOD_ADV_FLYING_AIR_FRICTION); case ADV_FLYING_MAX_VEL: - return std::pair(SMSG_MOVE_SET_ADV_FLYING_MAX_VEL, flightCapabilityEntry->MaxVel); + return std::tuple(SMSG_MOVE_SET_ADV_FLYING_MAX_VEL, flightCapabilityEntry->MaxVel, SPELL_AURA_MOD_ADV_FLYING_MAX_VEL); case ADV_FLYING_LIFT_COEFFICIENT: - return std::pair(SMSG_MOVE_SET_ADV_FLYING_LIFT_COEFFICIENT, flightCapabilityEntry->LiftCoefficient); + return std::tuple(SMSG_MOVE_SET_ADV_FLYING_LIFT_COEFFICIENT, flightCapabilityEntry->LiftCoefficient, SPELL_AURA_MOD_ADV_FLYING_LIFT_COEF); case ADV_FLYING_DOUBLE_JUMP_VEL_MOD: - return std::pair(SMSG_MOVE_SET_ADV_FLYING_DOUBLE_JUMP_VEL_MOD, flightCapabilityEntry->DoubleJumpVelMod); + return std::tuple(SMSG_MOVE_SET_ADV_FLYING_DOUBLE_JUMP_VEL_MOD, flightCapabilityEntry->DoubleJumpVelMod, SPELL_AURA_NONE); case ADV_FLYING_GLIDE_START_MIN_HEIGHT: - return std::pair(SMSG_MOVE_SET_ADV_FLYING_GLIDE_START_MIN_HEIGHT, flightCapabilityEntry->GlideStartMinHeight); + return std::tuple(SMSG_MOVE_SET_ADV_FLYING_GLIDE_START_MIN_HEIGHT, flightCapabilityEntry->GlideStartMinHeight, SPELL_AURA_NONE); case ADV_FLYING_ADD_IMPULSE_MAX_SPEED: - return std::pair(SMSG_MOVE_SET_ADV_FLYING_ADD_IMPULSE_MAX_SPEED, flightCapabilityEntry->AddImpulseMaxSpeed); + return std::tuple(SMSG_MOVE_SET_ADV_FLYING_ADD_IMPULSE_MAX_SPEED, flightCapabilityEntry->AddImpulseMaxSpeed, SPELL_AURA_MOD_ADV_FLYING_ADD_IMPULSE_MAX_SPEED); case ADV_FLYING_SURFACE_FRICTION: - return std::pair(SMSG_MOVE_SET_ADV_FLYING_SURFACE_FRICTION, flightCapabilityEntry->SurfaceFriction); + return std::tuple(SMSG_MOVE_SET_ADV_FLYING_SURFACE_FRICTION, flightCapabilityEntry->SurfaceFriction, SPELL_AURA_NONE); case ADV_FLYING_OVER_MAX_DECELERATION: - return std::pair(SMSG_MOVE_SET_ADV_FLYING_OVER_MAX_DECELERATION, flightCapabilityEntry->OverMaxDeceleration); + return std::tuple(SMSG_MOVE_SET_ADV_FLYING_OVER_MAX_DECELERATION, flightCapabilityEntry->OverMaxDeceleration, SPELL_AURA_MOD_ADV_FLYING_OVER_MAX_DECELERATION); case ADV_FLYING_LAUNCH_SPEED_COEFFICIENT: - return std::pair(SMSG_MOVE_SET_ADV_FLYING_LAUNCH_SPEED_COEFFICIENT, flightCapabilityEntry->LaunchSpeedCoefficient); + return std::tuple(SMSG_MOVE_SET_ADV_FLYING_LAUNCH_SPEED_COEFFICIENT, flightCapabilityEntry->LaunchSpeedCoefficient, SPELL_AURA_NONE); default: - return std::pair<OpcodeServer, float>(); + return std::tuple<OpcodeServer, float, AuraType>(); } }(); + if (rateAura != SPELL_AURA_NONE) + { + // take only lowest negative and highest positive auras - these effects do not stack + if (int32 neg = GetMaxNegativeAuraModifier(rateAura, [](AuraEffect const* mod) { return mod->GetAmount() > 0 && mod->GetAmount() < 100; })) + ApplyPct(newValue, neg); + + if (int32 pos = GetMaxPositiveAuraModifier(rateAura, [](AuraEffect const* mod) { return mod->GetAmount() > 100; })) + ApplyPct(newValue, pos); + } + if (m_advFlyingSpeed[speedType] == newValue) return; @@ -8818,23 +8828,39 @@ void Unit::UpdateAdvFlyingSpeed(AdvFlyingRateTypeRange speedType, bool clientUpd if (!flightCapabilityEntry) flightCapabilityEntry = sFlightCapabilityStore.AssertEntry(1); - auto [opcode, min, max] = [&] + auto [opcode, min, max, rateAura] = [&] { switch (speedType) { case ADV_FLYING_BANKING_RATE: - return std::tuple(SMSG_MOVE_SET_ADV_FLYING_BANKING_RATE, flightCapabilityEntry->BankingRateMin, flightCapabilityEntry->BankingRateMax); + return std::tuple(SMSG_MOVE_SET_ADV_FLYING_BANKING_RATE, flightCapabilityEntry->BankingRateMin, flightCapabilityEntry->BankingRateMax, SPELL_AURA_MOD_ADV_FLYING_BANKING_RATE); case ADV_FLYING_PITCHING_RATE_DOWN: - return std::tuple(SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_DOWN, flightCapabilityEntry->PitchingRateDownMin, flightCapabilityEntry->PitchingRateDownMax); + return std::tuple(SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_DOWN, flightCapabilityEntry->PitchingRateDownMin, flightCapabilityEntry->PitchingRateDownMax, SPELL_AURA_MOD_ADV_FLYING_PITCHING_RATE_DOWN); case ADV_FLYING_PITCHING_RATE_UP: - return std::tuple(SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_UP, flightCapabilityEntry->PitchingRateUpMin, flightCapabilityEntry->PitchingRateUpMax); + return std::tuple(SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_UP, flightCapabilityEntry->PitchingRateUpMin, flightCapabilityEntry->PitchingRateUpMax, SPELL_AURA_MOD_ADV_FLYING_PITCHING_RATE_UP); case ADV_FLYING_TURN_VELOCITY_THRESHOLD: - return std::tuple(SMSG_MOVE_SET_ADV_FLYING_TURN_VELOCITY_THRESHOLD, flightCapabilityEntry->TurnVelocityThresholdMin, flightCapabilityEntry->TurnVelocityThresholdMax); + return std::tuple(SMSG_MOVE_SET_ADV_FLYING_TURN_VELOCITY_THRESHOLD, flightCapabilityEntry->TurnVelocityThresholdMin, flightCapabilityEntry->TurnVelocityThresholdMax, SPELL_AURA_NONE); default: - return std::tuple<OpcodeServer, float, float>(); + return std::tuple<OpcodeServer, float, float, AuraType>(); } }(); + if (rateAura != SPELL_AURA_NONE) + { + // take only lowest negative and highest positive auras - these effects do not stack + if (int32 neg = GetMaxNegativeAuraModifier(rateAura, [](AuraEffect const* mod) { return mod->GetAmount() > 0 && mod->GetAmount() < 100; })) + { + ApplyPct(min, neg); + ApplyPct(max, neg); + } + + if (int32 pos = GetMaxPositiveAuraModifier(rateAura, [](AuraEffect const* mod) { return mod->GetAmount() > 100; })) + { + ApplyPct(min, pos); + ApplyPct(max, pos); + } + } + if (m_advFlyingSpeed[speedType] == min && m_advFlyingSpeed[speedType + 1] == max) return; diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index af7bcc784f5..db2dcaac82e 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -604,18 +604,18 @@ enum AuraType : uint32 SPELL_AURA_MODIFIED_RAID_INSTANCE = 510, // NYI; Related to "Fated" raid affixes SPELL_AURA_APPLY_PROFESSION_EFFECT = 511, // NYI; MiscValue[0] = ProfessionEffectID SPELL_AURA_512 = 512, - SPELL_AURA_513 = 513, - SPELL_AURA_514 = 514, - SPELL_AURA_515 = 515, + SPELL_AURA_MOD_ADV_FLYING_AIR_FRICTION = 513, + SPELL_AURA_MOD_ADV_FLYING_MAX_VEL = 514, + SPELL_AURA_MOD_ADV_FLYING_LIFT_COEF = 515, SPELL_AURA_516 = 516, SPELL_AURA_517 = 517, - SPELL_AURA_518 = 518, + SPELL_AURA_MOD_ADV_FLYING_ADD_IMPULSE_MAX_SPEED = 518, SPELL_AURA_MOD_COOLDOWN_RECOVERY_RATE_ALL = 519, // NYI; applies to all spells, not filtered by familyflags or label - SPELL_AURA_520 = 520, - SPELL_AURA_521 = 521, - SPELL_AURA_522 = 522, + SPELL_AURA_MOD_ADV_FLYING_BANKING_RATE = 520, + SPELL_AURA_MOD_ADV_FLYING_PITCHING_RATE_DOWN = 521, + SPELL_AURA_MOD_ADV_FLYING_PITCHING_RATE_UP = 522, SPELL_AURA_523 = 523, - SPELL_AURA_524 = 524, + SPELL_AURA_MOD_ADV_FLYING_OVER_MAX_DECELERATION = 524, SPELL_AURA_DISPLAY_PROFESSION_EQUIPMENT = 525, // NYI; MiscValue[0] = Profession (enum, not id) SPELL_AURA_526 = 526, SPELL_AURA_527 = 527, diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index e3dbdc50eb6..9f40f1731fc 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -582,18 +582,18 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNULL, //510 SPELL_AURA_MODIFIED_RAID_INSTANCE &AuraEffect::HandleNULL, //511 SPELL_AURA_APPLY_PROFESSION_EFFECT &AuraEffect::HandleNULL, //512 - &AuraEffect::HandleNULL, //513 - &AuraEffect::HandleNULL, //514 - &AuraEffect::HandleNULL, //515 + &AuraEffect::HandleAuraModAdvFlyingSpeed, //513 SPELL_AURA_MOD_ADV_FLYING_AIR_FRICTION + &AuraEffect::HandleAuraModAdvFlyingSpeed, //514 SPELL_AURA_MOD_ADV_FLYING_MAX_VEL + &AuraEffect::HandleAuraModAdvFlyingSpeed, //515 SPELL_AURA_MOD_ADV_FLYING_LIFT_COEF &AuraEffect::HandleNULL, //516 &AuraEffect::HandleNULL, //517 - &AuraEffect::HandleNULL, //518 + &AuraEffect::HandleAuraModAdvFlyingSpeed, //518 SPELL_AURA_MOD_ADV_FLYING_ADD_IMPULSE_MAX_SPEED &AuraEffect::HandleNULL, //519 SPELL_AURA_MOD_COOLDOWN_RECOVERY_RATE_ALL - &AuraEffect::HandleNULL, //520 - &AuraEffect::HandleNULL, //521 - &AuraEffect::HandleNULL, //522 + &AuraEffect::HandleAuraModAdvFlyingSpeed, //520 SPELL_AURA_MOD_ADV_FLYING_BANKING_RATE + &AuraEffect::HandleAuraModAdvFlyingSpeed, //521 SPELL_AURA_MOD_ADV_FLYING_PITCHING_RATE_DOWN + &AuraEffect::HandleAuraModAdvFlyingSpeed, //522 SPELL_AURA_MOD_ADV_FLYING_PITCHING_RATE_UP &AuraEffect::HandleNULL, //523 - &AuraEffect::HandleNULL, //524 + &AuraEffect::HandleAuraModAdvFlyingSpeed, //524 SPELL_AURA_MOD_ADV_FLYING_OVER_MAX_DECELERATION &AuraEffect::HandleNULL, //525 SPELL_AURA_DISPLAY_PROFESSION_EQUIPMENT &AuraEffect::HandleNULL, //526 &AuraEffect::HandleNULL, //527 @@ -3424,6 +3424,43 @@ void AuraEffect::HandleModMovementForceMagnitude(AuraApplication const* aurApp, aurApp->GetTarget()->UpdateMovementForcesModMagnitude(); } +void AuraEffect::HandleAuraModAdvFlyingSpeed(AuraApplication const* aurApp, uint8 mode, bool /*apply*/) const +{ + if (!(mode & AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK)) + return; + + Unit* target = aurApp->GetTarget(); + switch (GetAuraType()) + { + case SPELL_AURA_MOD_ADV_FLYING_AIR_FRICTION: + target->UpdateAdvFlyingSpeed(ADV_FLYING_AIR_FRICTION, true); + break; + case SPELL_AURA_MOD_ADV_FLYING_MAX_VEL: + target->UpdateAdvFlyingSpeed(ADV_FLYING_MAX_VEL, true); + break; + case SPELL_AURA_MOD_ADV_FLYING_LIFT_COEF: + target->UpdateAdvFlyingSpeed(ADV_FLYING_LIFT_COEFFICIENT, true); + break; + case SPELL_AURA_MOD_ADV_FLYING_ADD_IMPULSE_MAX_SPEED: + target->UpdateAdvFlyingSpeed(ADV_FLYING_ADD_IMPULSE_MAX_SPEED, true); + break; + case SPELL_AURA_MOD_ADV_FLYING_BANKING_RATE: + target->UpdateAdvFlyingSpeed(ADV_FLYING_BANKING_RATE, true); + break; + case SPELL_AURA_MOD_ADV_FLYING_PITCHING_RATE_DOWN: + target->UpdateAdvFlyingSpeed(ADV_FLYING_PITCHING_RATE_DOWN, true); + break; + case SPELL_AURA_MOD_ADV_FLYING_PITCHING_RATE_UP: + target->UpdateAdvFlyingSpeed(ADV_FLYING_PITCHING_RATE_UP, true); + break; + case SPELL_AURA_MOD_ADV_FLYING_OVER_MAX_DECELERATION: + target->UpdateAdvFlyingSpeed(ADV_FLYING_OVER_MAX_DECELERATION, true); + break; + default: + break; + } +} + /*********************************************************/ /*** IMMUNITY ***/ /*********************************************************/ diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h index 446f21b6be4..07610b2dff8 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -218,6 +218,7 @@ class TC_GAME_API AuraEffect void HandleAuraModUseNormalSpeed(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleAuraModMinimumSpeedRate(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleModMovementForceMagnitude(AuraApplication const* aurApp, uint8 mode, bool apply) const; + void HandleAuraModAdvFlyingSpeed(AuraApplication const* aurApp, uint8 mode, bool apply) const; // immunity void HandleModMechanicImmunityMask(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleModMechanicImmunity(AuraApplication const* aurApp, uint8 mode, bool apply) const; |
