aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorModoX <moardox@gmail.com>2021-11-06 22:02:35 +0100
committerGitHub <noreply@github.com>2021-11-06 22:02:35 +0100
commit3010f2ca5dea532c851d5472157bbfdf0531e0d0 (patch)
tree80478b3af4fb7ce3458789c1b41f6f93fc76b55a /src/server/game/Entities
parent3917c2ad01882d43265e38c66e35b0a7fe3f087f (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.cpp6
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp22
-rw-r--r--src/server/game/Entities/Unit/Unit.h1
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);