From 7dc598f364113c6a6d1d8d435785a77fc2824da1 Mon Sep 17 00:00:00 2001 From: ZhengPeiRu21 <98835050+ZhengPeiRu21@users.noreply.github.com> Date: Sun, 18 Sep 2022 21:58:18 -0600 Subject: [PATCH] feat(Core): CanAccountCreateCharacter hook (#13020) --- src/server/game/Handlers/CharacterHandler.cpp | 5 +++++ .../Scripting/ScriptDefines/AccountScript.cpp | 15 +++++++++++++++ src/server/game/Scripting/ScriptMgr.h | 5 +++++ 3 files changed, 25 insertions(+) diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index e159441c8..ae84e8347 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -432,6 +432,11 @@ void WorldSession::HandleCharCreateOpcode(WorldPacket& recvData) std::function finalizeCharacterCreation = [this, createInfo](PreparedQueryResult result) { + if (!sScriptMgr->CanAccountCreateCharacter(createInfo, GetAccountId())) + { + SendCharCreate(CHAR_CREATE_DISABLED); + return; + } bool haveSameRace = false; uint32 heroicReqLevel = sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_HEROIC_CHARACTER); bool hasHeroicReqLevel = (heroicReqLevel == 0); diff --git a/src/server/game/Scripting/ScriptDefines/AccountScript.cpp b/src/server/game/Scripting/ScriptDefines/AccountScript.cpp index 99ac4c799..4368e87d0 100644 --- a/src/server/game/Scripting/ScriptDefines/AccountScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/AccountScript.cpp @@ -81,3 +81,18 @@ void ScriptMgr::OnFailedPasswordChange(uint32 accountId) script->OnFailedPasswordChange(accountId); }); } + +bool ScriptMgr::CanAccountCreateCharacter(std::shared_ptr createInfo, uint32 accountId) +{ + auto ret = IsValidBoolScript([&](AccountScript* script) + { + return !script->CanAccountCreateCharacter(createInfo, accountId); + }); + + if (ret && *ret) + { + return false; + } + + return true; +} diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 864fe978f..ec4fa798e 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -73,6 +73,7 @@ class Vehicle; class WorldObject; class WorldPacket; class WorldSocket; +class CharacterCreateInfo; struct AchievementCriteriaData; struct AuctionEntry; @@ -1458,6 +1459,9 @@ public: // Called when Password failed to change for Account virtual void OnFailedPasswordChange(uint32 /*accountId*/) { } + + // Called when creating a character on the Account + [[nodiscard]] virtual bool CanAccountCreateCharacter(std::shared_ptr /*createInfo*/, uint32 /*accountId*/) { return true;} }; class GuildScript : public ScriptObject @@ -2356,6 +2360,7 @@ public: /* AccountScript */ void OnFailedEmailChange(uint32 accountId); void OnPasswordChange(uint32 accountId); void OnFailedPasswordChange(uint32 accountId); + bool CanAccountCreateCharacter(std::shared_ptr createInfo, uint32 accountId); public: /* GuildScript */ void OnGuildAddMember(Guild* guild, Player* player, uint8& plRank);