Core/Players: update mount capabilties when the liquid status of players change

* simplified checks for liquid restrictions in mount capability helper
* handle missing case for liquid exclusive mounts
* update position data on character login to avoid some edge case outdoors checks

closes #95
This commit is contained in:
Ovahlord committed 2020-06-01 15:10:13 +02:00
1 parent 91c0f13f77
commit f1bd380b20
4 files changed
+32 -25

No files matched your search

+15 -3
View File
@@ -160,6 +160,7 @@ Player::Player(WorldSession* session): Unit(true)
m_comboPoints = 0;
m_foodEmoteTimerCount = 0;
m_previousLiquidStatus = GetLiquidStatus();
m_weaponChangeTimer = 0;
m_zoneUpdateId = uint32(-1);
@@ -6037,6 +6038,13 @@ bool Player::UpdatePosition(float x, float y, float z, float orientation, bool t
CheckAreaExploreAndOutdoor();
// Update mount capabilities
if (m_previousLiquidStatus != GetLiquidStatus())
{
UpdateMountCapabilities();
m_previousLiquidStatus = GetLiquidStatus();
}
return true;
}
@@ -18586,11 +18594,17 @@ void Player::UpdateMountCapabilities()
{
if (HasAuraType(SPELL_AURA_MOUNTED))
{
for (AuraEffect* aurEff : GetAuraEffectsByType(SPELL_AURA_MOUNTED))
AuraEffectList mountEffects = GetAuraEffectsByType(SPELL_AURA_MOUNTED);
for (AuraEffect* aurEff : mountEffects)
{
MountCapabilityEntry const* capability = GetMountCapability(uint32(aurEff->GetMiscValueB()));
if (!capability)
{
// No mount capabilitiy found, remove aura
if (Aura* aura = aurEff->GetBase())
aura->Remove();
continue;
}
if (capability->ID != uint32(aurEff->GetAmount()))
{
@@ -23441,8 +23455,6 @@ void Player::SendInitialPacketsAfterAddToMap()
auraList.front()->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
}
UpdateMountCapabilities();
if (CanFly())
SendMovementSetCanTransitionBetweenSwimAndFly(true);
+2
View File
@@ -84,6 +84,7 @@ enum ItemClass : uint8;
enum LootError : uint8;
enum LootType : uint8;
enum UpdateCollisionHeightReason : uint8;
enum ZLiquidStatus : uint32;
typedef std::deque<Mail*> PlayerMails;
@@ -2401,6 +2402,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
GuidList WhisperList;
uint32 m_foodEmoteTimerCount;
uint32 m_contestedPvPTimer;
ZLiquidStatus m_previousLiquidStatus;
/*********************************************************/
/*** BATTLEGROUND SYSTEM ***/
+14 -22
View File
@@ -8319,7 +8319,7 @@ MountCapabilityEntry const* Unit::GetMountCapability(uint32 mountType) const
uint32 areaId = GetAreaId();
uint32 ridingSkill = 5000;
uint32 mountFlags = 0;
bool isSubmerged = false;
bool isUnderwater = false;
bool isInWater = false;
if (GetTypeId() == TYPEID_PLAYER)
@@ -8333,10 +8333,9 @@ MountCapabilityEntry const* Unit::GetMountCapability(uint32 mountType) const
else if (AreaTableEntry const* areaTable = sAreaTableStore.LookupEntry(areaId))
mountFlags = areaTable->MountFlags;
LiquidData liquid;
ZLiquidStatus liquidStatus = GetMap()->GetLiquidStatus(GetPhaseShift(), GetPositionX(), GetPositionY(), GetPositionZ(), MAP_ALL_LIQUIDS, &liquid);
isSubmerged = (liquidStatus & LIQUID_MAP_UNDER_WATER) != 0 || HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING);
isInWater = (liquidStatus & (LIQUID_MAP_IN_WATER | LIQUID_MAP_UNDER_WATER)) != 0;
ZLiquidStatus liquidStatus = GetLiquidStatus();
isUnderwater = (liquidStatus & LIQUID_MAP_UNDER_WATER) != 0;
isInWater = (liquidStatus & LIQUID_MAP_IN_WATER) != 0;
for (uint32 i = MAX_MOUNT_CAPABILITIES; i > 0; --i)
{
@@ -8359,23 +8358,16 @@ MountCapabilityEntry const* Unit::GetMountCapability(uint32 mountType) const
continue;
}
if (!isSubmerged)
{
if (!isInWater)
{
// player is completely out of water
if (!(mountCapability->Flags & MOUNT_CAPABILITY_FLAG_GROUND))
continue;
}
else if (!(mountCapability->Flags & MOUNT_CAPABILITY_FLAG_UNDERWATER))
continue;
}
else if (isInWater)
{
if (!(mountCapability->Flags & MOUNT_CAPABILITY_FLAG_UNDERWATER))
continue;
}
else if (!(mountCapability->Flags & MOUNT_CAPABILITY_FLAG_FLOAT))
// Do not allow underwater restricted capabilities when not underwater
if (!(mountCapability->Flags & MOUNT_CAPABILITY_FLAG_UNDERWATER) && isUnderwater)
continue;
// Do not allow water surface restricted capabilities when not on water surface
if (!(mountCapability->Flags & MOUNT_CAPABILITY_FLAG_FLOAT) && isInWater)
continue;
// Do not allow liquid restricted mounts on ground or in air
if (!(mountCapability->Flags & (MOUNT_CAPABILITY_FLAG_GROUND | MOUNT_CAPABILITY_FLAG_FLYING)) && !isUnderwater && !isInWater)
continue;
if (mountCapability->ReqMapID != -1 &&
@@ -980,6 +980,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder)
}
}
pCurrChar->UpdatePositionData();
pCurrChar->SendInitialPacketsAfterAddToMap();
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_ONLINE);