From c53112d820e4fb250d8370bb2f11a6500d4112e4 Mon Sep 17 00:00:00 2001 From: iThorgrim <125808072+iThorgrim@users.noreply.github.com> Date: Mon, 3 Feb 2025 18:28:19 +0100 Subject: [PATCH] Feat(Core/Scripting): Add new hook CanPlayerResurrect to simplify HardCore mod etc. (#21272) --- src/server/game/Entities/Player/Player.cpp | 3 +++ .../game/Scripting/ScriptDefines/PlayerScript.cpp | 5 +++++ src/server/game/Scripting/ScriptDefines/PlayerScript.h | 10 ++++++++++ src/server/game/Scripting/ScriptMgr.h | 1 + 4 files changed, 19 insertions(+) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index e7bf8f71a97c60..6770bd064ce0e0 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -4491,6 +4491,9 @@ void Player::BuildPlayerRepop() void Player::ResurrectPlayer(float restore_percent, bool applySickness) { + if (!sScriptMgr->CanPlayerResurrect(this)) + return; + WorldPacket data(SMSG_DEATH_RELEASE_LOC, 4 * 4); // remove spirit healer position data << uint32(-1); data << float(0); diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp index 30d8021c6ca0b9..9d69dc3ba801ea 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp @@ -895,6 +895,11 @@ bool ScriptMgr::AnticheatCheckMovementInfo(Player* player, MovementInfo const& m CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_ANTICHEAT_CHECK_MOVEMENT_INFO, !script->AnticheatCheckMovementInfo(player, movementInfo, mover, jump)); } +bool ScriptMgr::CanPlayerResurrect(Player* player) +{ + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_RESURRECT, !script->CanPlayerResurrect(player)); +} + PlayerScript::PlayerScript(const char* name, std::vector enabledHooks) : ScriptObject(name, PLAYERHOOK_END) { diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.h b/src/server/game/Scripting/ScriptDefines/PlayerScript.h index 388203b4095a96..3ffffadf917879 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.h +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.h @@ -204,6 +204,7 @@ enum PlayerHook PLAYERHOOK_CAN_SEND_ERROR_ALREADY_LOOTED, PLAYERHOOK_ON_AFTER_CREATURE_LOOT, PLAYERHOOK_ON_AFTER_CREATURE_LOOT_MONEY, + PLAYERHOOK_CAN_RESURRECT, PLAYERHOOK_END }; @@ -765,6 +766,15 @@ class PlayerScript : public ScriptObject * @param player Contains information about the Player */ virtual void OnAfterCreatureLootMoney(Player* /*player*/) { } + + /** + * @brief This hook is called, to avoid player resurrect + * + * @param player Contains information about the Player + * + * @return true if player is authorized to resurect + */ + virtual bool CanPlayerResurrect(Player* /*player*/) { return true; } }; #endif diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 44382936a4d7fa..0d1f04eb68cd4b 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -459,6 +459,7 @@ class ScriptMgr void OnAfterCreatureLoot(Player* player); void OnAfterCreatureLootMoney(Player* player); bool OnCanPlayerFlyInZone(Player* player, uint32 mapId, uint32 zoneId, SpellInfo const* bySpell); + bool CanPlayerResurrect(Player* player); // Anti cheat void AnticheatSetCanFlybyServer(Player* player, bool apply);