Core/Auras: Updated mount capability check and implemented SPELL_AURA_MOUNT_RESTRICTIONS
This commit is contained in:
@@ -7215,13 +7215,6 @@ namespace Game.Entities
|
||||
|
||||
public bool CanTameExoticPets() { return IsGameMaster() || HasAuraType(AuraType.AllowTamePetType); }
|
||||
|
||||
public bool CanFlyInZone(uint mapid, uint zone)
|
||||
{
|
||||
// continent checked in SpellInfo.CheckLocation at cast and area update
|
||||
uint v_map = Global.DB2Mgr.GetVirtualMapForMapAndZone(mapid, zone);
|
||||
return v_map != 571 || HasSpell(54197); // 54197 = Cold Weather Flying
|
||||
}
|
||||
|
||||
void SendAttackSwingDeadTarget() { SendPacket(new AttackSwingError(AttackSwingErr.DeadTarget)); }
|
||||
void SendAttackSwingCantAttack() { SendPacket(new AttackSwingError(AttackSwingErr.CantAttack)); }
|
||||
public void SendAttackSwingNotInRange() { SendPacket(new AttackSwingError(AttackSwingErr.NotInRange)); }
|
||||
|
||||
@@ -24,6 +24,7 @@ using Game.Movement;
|
||||
using Game.Network.Packets;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Game.Spells;
|
||||
|
||||
namespace Game.Entities
|
||||
{
|
||||
@@ -650,12 +651,32 @@ namespace Game.Entities
|
||||
if (capabilities == null)
|
||||
return null;
|
||||
|
||||
uint zoneId, areaId;
|
||||
GetZoneAndAreaId(out zoneId, out areaId);
|
||||
uint areaId = GetAreaId();
|
||||
uint ridingSkill = 5000;
|
||||
AreaMountFlags mountFlags = 0;
|
||||
bool isSubmerged = false;
|
||||
bool isInWater = false;
|
||||
|
||||
if (IsTypeId(TypeId.Player))
|
||||
ridingSkill = ToPlayer().GetSkillValue(SkillType.Riding);
|
||||
|
||||
if (HasAuraType(AuraType.MountRestrictions))
|
||||
{
|
||||
foreach (AuraEffect auraEffect in GetAuraEffectsByType(AuraType.MountRestrictions))
|
||||
mountFlags |= (AreaMountFlags)auraEffect.GetMiscValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
AreaTableRecord areaTable = CliDB.AreaTableStorage.LookupByKey(areaId);
|
||||
if (areaTable != null)
|
||||
mountFlags = (AreaMountFlags)areaTable.MountFlags;
|
||||
}
|
||||
|
||||
LiquidData liquid;
|
||||
ZLiquidStatus liquidStatus = GetMap().getLiquidStatus(GetPositionX(), GetPositionY(), GetPositionZ(), MapConst.MapAllLiquidTypes, out liquid);
|
||||
isSubmerged = liquidStatus.HasAnyFlag(ZLiquidStatus.UnderWater) || HasUnitMovementFlag(MovementFlag.Swimming);
|
||||
isInWater = liquidStatus.HasAnyFlag(ZLiquidStatus.InWater | ZLiquidStatus.UnderWater);
|
||||
|
||||
foreach (var mountTypeXCapability in capabilities)
|
||||
{
|
||||
MountCapabilityRecord mountCapability = CliDB.MountCapabilityStorage.LookupByKey(mountTypeXCapability.MountCapabilityID);
|
||||
@@ -665,32 +686,50 @@ namespace Game.Entities
|
||||
if (ridingSkill < mountCapability.RequiredRidingSkill)
|
||||
continue;
|
||||
|
||||
if (HasUnitMovementFlag2(MovementFlag2.FullSpeedPitching))
|
||||
if (!mountCapability.Flags.HasAnyFlag(MountCapabilityFlags.IgnoreRestrictions))
|
||||
{
|
||||
if (!mountCapability.Flags.HasAnyFlag(MountCapabilityFlags.CanPitch))
|
||||
if (mountCapability.Flags.HasAnyFlag(MountCapabilityFlags.Ground) && !mountFlags.HasAnyFlag(AreaMountFlags.GroundAllowed))
|
||||
continue;
|
||||
}
|
||||
else if (HasUnitMovementFlag(MovementFlag.Swimming))
|
||||
{
|
||||
if (!mountCapability.Flags.HasAnyFlag(MountCapabilityFlags.CanSwim))
|
||||
if (mountCapability.Flags.HasAnyFlag(MountCapabilityFlags.Flying) && !mountFlags.HasAnyFlag(AreaMountFlags.FlyingAllowed))
|
||||
continue;
|
||||
}
|
||||
else if (!mountCapability.Flags.HasAnyFlag(MountCapabilityFlags.Unk1)) // unknown flags, checked in 4.2.2 14545 client
|
||||
{
|
||||
if (!mountCapability.Flags.HasAnyFlag(MountCapabilityFlags.Unk2))
|
||||
if (mountCapability.Flags.HasAnyFlag(MountCapabilityFlags.Float) && !mountFlags.HasAnyFlag(AreaMountFlags.FloatAllowed))
|
||||
continue;
|
||||
if (mountCapability.Flags.HasAnyFlag(MountCapabilityFlags.Underwater) && !mountFlags.HasAnyFlag(AreaMountFlags.UnderwaterAllowed))
|
||||
continue;
|
||||
}
|
||||
|
||||
if (mountCapability.RequiredMap != -1 && (GetMapId()) != mountCapability.RequiredMap)
|
||||
if (!isSubmerged)
|
||||
{
|
||||
if (!isInWater)
|
||||
{
|
||||
// player is completely out of water
|
||||
if (!mountCapability.Flags.HasAnyFlag(MountCapabilityFlags.Ground))
|
||||
continue;
|
||||
}
|
||||
else if (!mountCapability.Flags.HasAnyFlag(MountCapabilityFlags.Underwater))
|
||||
continue;
|
||||
}
|
||||
else if (isInWater)
|
||||
{
|
||||
if (!mountCapability.Flags.HasAnyFlag(MountCapabilityFlags.Underwater))
|
||||
continue;
|
||||
}
|
||||
else if (!mountCapability.Flags.HasAnyFlag(MountCapabilityFlags.Float))
|
||||
continue;
|
||||
|
||||
if (mountCapability.RequiredArea != 0 && (mountCapability.RequiredArea != zoneId && mountCapability.RequiredArea != areaId))
|
||||
if (mountCapability.RequiredMap != -1 &&
|
||||
GetMapId() != mountCapability.RequiredMap &&
|
||||
GetMap().GetEntry().CosmeticParentMapID != mountCapability.RequiredMap &&
|
||||
GetMap().GetEntry().ParentMapID != mountCapability.RequiredMap)
|
||||
continue;
|
||||
|
||||
if (mountCapability.RequiredArea != 0 && !Global.DB2Mgr.IsInArea(areaId, mountCapability.RequiredArea))
|
||||
continue;
|
||||
|
||||
if (mountCapability.RequiredAura != 0 && !HasAura(mountCapability.RequiredAura))
|
||||
continue;
|
||||
|
||||
if (mountCapability.RequiredSpell != 0 && (!IsTypeId(TypeId.Player) || !ToPlayer().HasSpell(mountCapability.RequiredSpell)))
|
||||
if (mountCapability.RequiredSpell != 0 && !HasSpell(mountCapability.RequiredSpell))
|
||||
continue;
|
||||
|
||||
return mountCapability;
|
||||
|
||||
Reference in New Issue
Block a user