From 47b8dbc8dd98682d3811a40c0cc253915b295bb2 Mon Sep 17 00:00:00 2001 From: iThorgrim Date: Sat, 25 Jan 2025 14:58:36 +0100 Subject: [PATCH] Feat(LuaEngine/PlayerHooks): Add Skill base player hooks --- src/ElunaLuaEngine_SC.cpp | 15 +++++++++ src/LuaEngine/Hooks.h | 3 ++ src/LuaEngine/LuaEngine.h | 3 ++ src/LuaEngine/hooks/PlayerHooks.cpp | 47 +++++++++++++++++++++++++++++ 4 files changed, 68 insertions(+) diff --git a/src/ElunaLuaEngine_SC.cpp b/src/ElunaLuaEngine_SC.cpp index 9016ab89ab..aa4028c519 100644 --- a/src/ElunaLuaEngine_SC.cpp +++ b/src/ElunaLuaEngine_SC.cpp @@ -812,6 +812,21 @@ class Eluna_PlayerScript : public PlayerScript { sEluna->OnCreatureKilledByPet(player, killed); } + + bool CanPlayerUpdateSkill(Player* player, uint32 skill_id) override + { + return sEluna->OnCanPlayerUpdateSkill(player, skill_id); + } + + void OnBeforePlayerUpdateSkill(Player* player, uint32 skill_id, uint32& value, uint32 max, uint32 step) override + { + sEluna->OnBeforePlayerUpdateSkill(player, skill_id, value, max, step); + } + + void OnPlayerUpdateSkill(Player* player, uint32 skill_id, uint32 value, uint32 max, uint32 step, uint32 new_value) override + { + sEluna->OnPlayerUpdateSkill(player, skill_id, value, max, step, new_value); + } }; class Eluna_ServerScript : public ServerScript diff --git a/src/LuaEngine/Hooks.h b/src/LuaEngine/Hooks.h index fb537a85a0..418a513bac 100644 --- a/src/LuaEngine/Hooks.h +++ b/src/LuaEngine/Hooks.h @@ -221,6 +221,9 @@ namespace Hooks PLAYER_EVENT_ON_GROUP_ROLL_REWARD_ITEM = 56, // (event, player, item, count, voteType, roll) PLAYER_EVENT_ON_BG_DESERTION = 57, // (event, player, type) PLAYER_EVENT_ON_PET_KILL = 58, // (event, player, killer) + PLAYER_EVENT_ON_CAN_UPDATE_SKILL = 59, // (event, player, skill_id) -- Can return true or false + PLAYER_EVENT_ON_BEFORE_UPDATE_SKILL = 60, // (event, player, skill_id, value, max, step) -- Can return new amount + PLAYER_EVENT_ON_UPDATE_SKILL = 61, // (event, player, skill_id, value, max, step, new_value) PLAYER_EVENT_COUNT }; diff --git a/src/LuaEngine/LuaEngine.h b/src/LuaEngine/LuaEngine.h index f8a9bf7281..cf9bb06bab 100644 --- a/src/LuaEngine/LuaEngine.h +++ b/src/LuaEngine/LuaEngine.h @@ -447,6 +447,9 @@ class ELUNA_GAME_API Eluna void OnGroupRollRewardItem(Player* player, Item* item, uint32 count, RollVote voteType, Roll* roll); void OnBattlegroundDesertion(Player* player, const BattlegroundDesertionType type); void OnCreatureKilledByPet(Player* player, Creature* killed); + bool OnCanPlayerUpdateSkill(Player* player, uint32 skill_id); + void OnBeforePlayerUpdateSkill(Player* player, uint32 skill_id, uint32& value, uint32 max, uint32 step); + void OnPlayerUpdateSkill(Player* player, uint32 skill_id, uint32 value, uint32 max, uint32 step, uint32 new_value); /* Vehicle */ void OnInstall(Vehicle* vehicle); diff --git a/src/LuaEngine/hooks/PlayerHooks.cpp b/src/LuaEngine/hooks/PlayerHooks.cpp index 62a5d63159..f370849904 100644 --- a/src/LuaEngine/hooks/PlayerHooks.cpp +++ b/src/LuaEngine/hooks/PlayerHooks.cpp @@ -706,3 +706,50 @@ void Eluna::OnCreatureKilledByPet(Player* player, Creature* killed) Push(killed); CallAllFunctions(PlayerEventBindings, key); } + +bool Eluna::OnCanPlayerUpdateSkill(Player* player, uint32 skill_id) +{ + START_HOOK_WITH_RETVAL(PLAYER_EVENT_ON_CAN_UPDATE_SKILL, true); + Push(player); + Push(skill_id); + return CallAllFunctionsBool(PlayerEventBindings, key); +} + +void Eluna::OnBeforePlayerUpdateSkill(Player* player, uint32 skill_id, uint32& value, uint32 max, uint32 step) +{ + START_HOOK(PLAYER_EVENT_ON_BEFORE_UPDATE_SKILL); + Push(player); + Push(skill_id); + Push(value); + Push(max); + Push(step); + + int valueIndex = lua_gettop(L) -2; + int n = SetupStack(PlayerEventBindings, key, 5); + while (n > 0) + { + int r = CallOneFunction(n--, 5, 1); + if (lua_isnumber(L, r)) + { + value = CHECKVAL(L, r); + // Update the stack for subsequent calls. + ReplaceArgument(value, valueIndex); + } + + lua_pop(L, 1); + } + + CleanUpStack(5); +} + +void Eluna::OnPlayerUpdateSkill(Player* player, uint32 skill_id, uint32 value, uint32 max, uint32 step, uint32 new_value) +{ + START_HOOK(PLAYER_EVENT_ON_UPDATE_SKILL); + Push(player); + Push(skill_id); + Push(value); + Push(max); + Push(step); + Push(new_value); + CallAllFunctions(PlayerEventBindings, key); +}