diff options
| author | ModoX <moardox@gmail.com> | 2021-11-06 22:02:35 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-11-06 22:02:35 +0100 |
| commit | 3010f2ca5dea532c851d5472157bbfdf0531e0d0 (patch) | |
| tree | 80478b3af4fb7ce3458789c1b41f6f93fc76b55a /src/server/game/Entities | |
| parent | 3917c2ad01882d43265e38c66e35b0a7fe3f087f (diff) | |
Core/Auras: Mount speed auras are now properly selected when teleporting (dungeon enter/exit, regular teleport, ...) (#27159)
* Update mount speed when learning new riding skill level
* Update mount speed on SPELL_AURA_MOUNT_RESTRICTIONS
Co-authored-by: Ovah <dreadkiller@gmx.de>
Co-authored-by: Shauren <shauren.trinity@gmail.com>
Diffstat (limited to 'src/server/game/Entities')
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 6 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 22 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 1 |
3 files changed, 27 insertions, 2 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 24d2fd3f033..34bd02f261a 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -5715,7 +5715,11 @@ void Player::SetSkill(uint16 id, uint16 step, uint16 newVal, uint16 maxVal) LearnSkillRewardedSpells(id, newVal); // if skill value is going up, update enchantments after setting the new value if (newVal > currVal) + { UpdateSkillEnchantments(id, currVal, newVal); + if (id == SKILL_RIDING) + UpdateMountCapability(); + } UpdateCriteria(CriteriaType::SkillRaised, id); UpdateCriteria(CriteriaType::AchieveSkillStep, id); @@ -7220,6 +7224,8 @@ void Player::UpdateArea(uint32 newArea) PushQuests(); UpdateCriteria(CriteriaType::EnterTopLevelArea, newArea); + + UpdateMountCapability(); } void Player::UpdateZone(uint32 newZone, uint32 newArea) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index e01a53f65db..ef3e30948f1 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3043,7 +3043,7 @@ void Unit::SetInWater(bool inWater) void Unit::ProcessTerrainStatusUpdate(ZLiquidStatus status, Optional<LiquidData> const& liquidData) { - if (IsFlying() || (!IsControlledByPlayer())) + if (!IsControlledByPlayer()) return; SetInWater(status & MAP_LIQUID_STATUS_SWIMMING); @@ -3060,6 +3060,9 @@ void Unit::ProcessTerrainStatusUpdate(ZLiquidStatus status, Optional<LiquidData> if (curLiquid && curLiquid->SpellID && (!player || !player->IsGameMaster())) CastSpell(this, curLiquid->SpellID, true); _lastLiquid = curLiquid; + + // mount capability depends on liquid state change + UpdateMountCapability(); } } @@ -7623,7 +7626,8 @@ MountCapabilityEntry const* Unit::GetMountCapability(uint32 mountType) const if (!(mountCapability->Flags & MOUNT_CAPABILITY_FLAG_GROUND)) continue; } - else if (!(mountCapability->Flags & MOUNT_CAPABILITY_FLAG_UNDERWATER)) + // player is on water surface + else if (!(mountCapability->Flags & MOUNT_CAPABILITY_FLAG_FLOAT)) continue; } else if (isInWater) @@ -7660,6 +7664,20 @@ MountCapabilityEntry const* Unit::GetMountCapability(uint32 mountType) const return nullptr; } +void Unit::UpdateMountCapability() +{ + AuraEffectList mounts = GetAuraEffectsByType(SPELL_AURA_MOUNTED); + for (AuraEffect* aurEff : mounts) + { + aurEff->RecalculateAmount(); + if (!aurEff->GetAmount()) + aurEff->GetBase()->Remove(); + else if (MountCapabilityEntry const* capability = sMountCapabilityStore.LookupEntry(aurEff->GetAmount())) // aura may get removed by interrupt flag, reapply + if (!HasAura(capability->ModSpellAuraID)) + CastSpell(this, capability->ModSpellAuraID, aurEff); + } +} + bool Unit::IsServiceProvider() const { return HasNpcFlag(NPCFlags( diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 874a69da264..b05419ead5f 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -993,6 +993,7 @@ class TC_GAME_API Unit : public WorldObject void Mount(uint32 mount, uint32 vehicleId = 0, uint32 creatureEntry = 0); void Dismount(); MountCapabilityEntry const* GetMountCapability(uint32 mountType) const; + void UpdateMountCapability(); void SendDurabilityLoss(Player* receiver, uint32 percent); void PlayOneShotAnimKitId(uint16 animKitId); |
