feat(Core/Player): Addition of a Hook in CanFlyInZone check (#16590)
--------- Co-authored-by: tmoos <tmoos@meteomatics.com> Co-authored-by: Winfidonarleyan <dowlandtop@yandex.com> Co-authored-by: Kitzunu <24550914+Kitzunu@users.noreply.github.com>
This commit is contained in:
@@ -13550,8 +13550,13 @@ uint32 Player::CalculateTalentsPoints() const
|
|||||||
return uint32(talentPointsForLevel * sWorld->getRate(RATE_TALENT));
|
return uint32(talentPointsForLevel * sWorld->getRate(RATE_TALENT));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Player::canFlyInZone(uint32 mapid, uint32 zone, SpellInfo const* bySpell) const
|
bool Player::canFlyInZone(uint32 mapid, uint32 zone, SpellInfo const* bySpell)
|
||||||
{
|
{
|
||||||
|
if (!sScriptMgr->OnCanPlayerFlyInZone(this, mapid,zone,bySpell))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// continent checked in SpellInfo::CheckLocation at cast and area update
|
// continent checked in SpellInfo::CheckLocation at cast and area update
|
||||||
uint32 v_map = GetVirtualMapForMapAndZone(mapid, zone);
|
uint32 v_map = GetVirtualMapForMapAndZone(mapid, zone);
|
||||||
if (v_map == 571 && !bySpell->HasAttribute(SPELL_ATTR7_IGNORES_COLD_WEATHER_FLYING_REQUIREMENT))
|
if (v_map == 571 && !bySpell->HasAttribute(SPELL_ATTR7_IGNORES_COLD_WEATHER_FLYING_REQUIREMENT))
|
||||||
|
|||||||
@@ -2299,7 +2299,7 @@ public:
|
|||||||
}
|
}
|
||||||
void HandleFall(MovementInfo const& movementInfo);
|
void HandleFall(MovementInfo const& movementInfo);
|
||||||
|
|
||||||
[[nodiscard]] bool canFlyInZone(uint32 mapid, uint32 zone, SpellInfo const* bySpell) const;
|
[[nodiscard]] bool canFlyInZone(uint32 mapid, uint32 zone, SpellInfo const* bySpell);
|
||||||
|
|
||||||
void SetClientControl(Unit* target, bool allowMove, bool packetOnly = false);
|
void SetClientControl(Unit* target, bool allowMove, bool packetOnly = false);
|
||||||
|
|
||||||
|
|||||||
@@ -74,6 +74,21 @@ void ScriptMgr::OnPlayerReleasedGhost(Player* player)
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ScriptMgr::OnCanPlayerFlyInZone(Player* player, uint32 mapId, uint32 zoneId, SpellInfo const* bySpell)
|
||||||
|
{
|
||||||
|
auto ret = IsValidBoolScript<PlayerScript>([player, mapId, zoneId, bySpell](PlayerScript* script)
|
||||||
|
{
|
||||||
|
return !script->OnCanPlayerFlyInZone(player, mapId, zoneId, bySpell);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (ret && *ret)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void ScriptMgr::OnPVPKill(Player* killer, Player* killed)
|
void ScriptMgr::OnPVPKill(Player* killer, Player* killed)
|
||||||
{
|
{
|
||||||
ExecuteScript<PlayerScript>([&](PlayerScript* script)
|
ExecuteScript<PlayerScript>([&](PlayerScript* script)
|
||||||
|
|||||||
@@ -1472,6 +1472,16 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual void OnQuestAbandon(Player* /*player*/, uint32 /*questId*/) { }
|
virtual void OnQuestAbandon(Player* /*player*/, uint32 /*questId*/) { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This hook called before other CanFlyChecks are applied
|
||||||
|
*
|
||||||
|
* @param player Contains information about the Player
|
||||||
|
* @param mapId Contains information about the current map id
|
||||||
|
* @param zoneId Contains information about the current zone
|
||||||
|
* @param bySpell Contains information about the spell that invoked the check
|
||||||
|
*/
|
||||||
|
[[nodiscard]] virtual bool OnCanPlayerFlyInZone(Player* /*player*/, uint32 /*mapId*/, uint32 /*zoneId*/, SpellInfo const* /*bySpell*/) { return true; }
|
||||||
|
|
||||||
// Passive Anticheat System
|
// Passive Anticheat System
|
||||||
virtual void AnticheatSetSkipOnePacketForASH(Player* /*player*/, bool /*apply*/) { }
|
virtual void AnticheatSetSkipOnePacketForASH(Player* /*player*/, bool /*apply*/) { }
|
||||||
virtual void AnticheatSetCanFlybyServer(Player* /*player*/, bool /*apply*/) { }
|
virtual void AnticheatSetCanFlybyServer(Player* /*player*/, bool /*apply*/) { }
|
||||||
@@ -2436,6 +2446,7 @@ public: /* PlayerScript */
|
|||||||
bool CanSendErrorAlreadyLooted(Player* player);
|
bool CanSendErrorAlreadyLooted(Player* player);
|
||||||
void OnAfterCreatureLoot(Player* player);
|
void OnAfterCreatureLoot(Player* player);
|
||||||
void OnAfterCreatureLootMoney(Player* player);
|
void OnAfterCreatureLootMoney(Player* player);
|
||||||
|
bool OnCanPlayerFlyInZone(Player* player, uint32 mapId, uint32 zoneId, SpellInfo const* bySpell);
|
||||||
|
|
||||||
// Anti cheat
|
// Anti cheat
|
||||||
void AnticheatSetSkipOnePacketForASH(Player* player, bool apply);
|
void AnticheatSetSkipOnePacketForASH(Player* player, bool apply);
|
||||||
|
|||||||
@@ -1470,7 +1470,7 @@ SpellCastResult SpellInfo::CheckShapeshift(uint32 form) const
|
|||||||
return SPELL_CAST_OK;
|
return SPELL_CAST_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
SpellCastResult SpellInfo::CheckLocation(uint32 map_id, uint32 zone_id, uint32 area_id, Player const* player /*= nullptr*/, bool strict /*= true*/) const
|
SpellCastResult SpellInfo::CheckLocation(uint32 map_id, uint32 zone_id, uint32 area_id, Player* player /*= nullptr*/, bool strict /*= true*/) const
|
||||||
{
|
{
|
||||||
// normal case
|
// normal case
|
||||||
if (AreaGroupId > 0)
|
if (AreaGroupId > 0)
|
||||||
|
|||||||
@@ -474,7 +474,7 @@ public:
|
|||||||
bool IsAuraExclusiveBySpecificPerCasterWith(SpellInfo const* spellInfo) const;
|
bool IsAuraExclusiveBySpecificPerCasterWith(SpellInfo const* spellInfo) const;
|
||||||
|
|
||||||
SpellCastResult CheckShapeshift(uint32 form) const;
|
SpellCastResult CheckShapeshift(uint32 form) const;
|
||||||
SpellCastResult CheckLocation(uint32 map_id, uint32 zone_id, uint32 area_id, Player const* player = nullptr, bool strict = true) const;
|
SpellCastResult CheckLocation(uint32 map_id, uint32 zone_id, uint32 area_id, Player* player = nullptr, bool strict = true) const;
|
||||||
SpellCastResult CheckTarget(Unit const* caster, WorldObject const* target, bool implicit = true) const;
|
SpellCastResult CheckTarget(Unit const* caster, WorldObject const* target, bool implicit = true) const;
|
||||||
SpellCastResult CheckExplicitTarget(Unit const* caster, WorldObject const* target, Item const* itemTarget = nullptr) const;
|
SpellCastResult CheckExplicitTarget(Unit const* caster, WorldObject const* target, Item const* itemTarget = nullptr) const;
|
||||||
bool CheckTargetCreatureType(Unit const* target) const;
|
bool CheckTargetCreatureType(Unit const* target) const;
|
||||||
|
|||||||
Reference in New Issue
Block a user