From a82628adaadb50b9574409d104bcb90aac849dfb Mon Sep 17 00:00:00 2001 From: Tristan Cormier Date: Mon, 5 Jan 2026 22:34:45 -0500 Subject: [PATCH] feat(glue): implement Script_DeleteCharacter --- src/client/ClientServices.cpp | 4 ++++ src/client/ClientServices.hpp | 1 + src/glue/CCharacterSelectionScript.cpp | 13 ++++++++++++- src/glue/CGlueMgr.cpp | 13 ++++++++++++- src/glue/CGlueMgr.hpp | 3 ++- src/net/connection/ClientConnection.cpp | 19 ++++++++++++++++++- src/net/connection/ClientConnection.hpp | 1 + 7 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/client/ClientServices.cpp b/src/client/ClientServices.cpp index eda3306..4018e9b 100644 --- a/src/client/ClientServices.cpp +++ b/src/client/ClientServices.cpp @@ -160,6 +160,10 @@ ClientConnection* ClientServices::Connection() { return ClientServices::s_currentConnection; } +void ClientServices::CharacterDelete(uint64_t guid) { + ClientServices::Connection()->RequestCharacterDelete(guid); +} + void ClientServices::Disconnect() { ClientServices::Connection()->Disconnect(); } diff --git a/src/client/ClientServices.hpp b/src/client/ClientServices.hpp index 46898da..67ff42b 100644 --- a/src/client/ClientServices.hpp +++ b/src/client/ClientServices.hpp @@ -31,6 +31,7 @@ class ClientServices : public LoginResponse { // Static functions static void ConnectToSelectedServer(); static ClientConnection* Connection(); + static void CharacterDelete(uint64_t guid); static void Disconnect(); static const char* GetCurrentLoginPortal(); static const char* GetCurrentLoginServer(); diff --git a/src/glue/CCharacterSelectionScript.cpp b/src/glue/CCharacterSelectionScript.cpp index 72cc6ae..bb77aea 100644 --- a/src/glue/CCharacterSelectionScript.cpp +++ b/src/glue/CCharacterSelectionScript.cpp @@ -1,4 +1,5 @@ #include "glue/CCharacterSelectionScript.hpp" +#include "CGlueMgr.hpp" #include "db/Db.hpp" #include "glue/CCharacterSelection.hpp" #include "object/client/Unit_C.hpp" @@ -157,7 +158,17 @@ int32_t Script_SelectCharacter(lua_State* L) { } int32_t Script_DeleteCharacter(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + if (!lua_isnumber(L, 1)) { + luaL_error(L, "Usage: DeleteCharacter(index)"); + } + + int32_t index = static_cast(lua_tonumber(L, 1)) - 1; + + if (index >= 0 && index < CCharacterSelection::s_characterList.Count()) { + CGlueMgr::DeleteCharacter(CCharacterSelection::s_characterList.m_data[index].m_info.guid); + } + + return 0; } int32_t Script_RenameCharacter(lua_State* L) { diff --git a/src/glue/CGlueMgr.cpp b/src/glue/CGlueMgr.cpp index 0c579a0..7fac4be 100644 --- a/src/glue/CGlueMgr.cpp +++ b/src/glue/CGlueMgr.cpp @@ -140,6 +140,17 @@ void CGlueMgr::ChangeRealm(const REALM_INFO* realmInfo) { ClientServices::Connection()->Connect(); } +void CGlueMgr::DeleteCharacter(uint64_t guid) { + if (guid) { + CGlueMgr::SetIdleState(IDLE_DELETE_CHARACTER); + + auto text = FrameScript_GetText(ClientServices::GetErrorToken(70), -1, GENDER_NOT_APPLICABLE); + FrameScript_SignalEvent(OPEN_STATUS_DIALOG, "%s%s", "CANCEL", text); + + ClientServices::CharacterDelete(guid); + } +} + void CGlueMgr::EnterWorld() { if (!ClientServices::GetSelectedRealm()) { return; @@ -1106,7 +1117,7 @@ void CGlueMgr::StatusDialogClick() { case IDLE_REALM_LIST: case IDLE_5: - case IDLE_6: + case IDLE_DELETE_CHARACTER: case IDLE_ENTER_WORLD: { ClientServices::Connection()->Cancel(2); CGlueMgr::SetIdleState(IDLE_NONE); diff --git a/src/glue/CGlueMgr.hpp b/src/glue/CGlueMgr.hpp index 6b3f96e..2ef942b 100644 --- a/src/glue/CGlueMgr.hpp +++ b/src/glue/CGlueMgr.hpp @@ -21,7 +21,7 @@ class CGlueMgr { IDLE_CHARACTER_LIST = 3, IDLE_REALM_LIST = 4, IDLE_5 = 5, - IDLE_6 = 6, + IDLE_DELETE_CHARACTER = 6, IDLE_7 = 7, IDLE_8 = 8, IDLE_9 = 9, @@ -66,6 +66,7 @@ class CGlueMgr { // Static functions static void CancelRealmListQuery(); static void ChangeRealm(const REALM_INFO* realmInfo); + static void DeleteCharacter(uint64_t guid); static void DisplayLoginStatus(); static void EnterWorld(); static void GetCharacterList(); diff --git a/src/net/connection/ClientConnection.cpp b/src/net/connection/ClientConnection.cpp index 28b9a96..971e8cc 100644 --- a/src/net/connection/ClientConnection.cpp +++ b/src/net/connection/ClientConnection.cpp @@ -1,6 +1,7 @@ #include "net/connection/ClientConnection.hpp" -#include "net/Login.hpp" #include "client/ClientServices.hpp" +#include "common/datastore/CDataStore.hpp" +#include "net/Login.hpp" #include "ui/FrameScript.hpp" void ClientConnection::AccountLogin(const char* name, const char* password, int32_t region, WOW_LOCALE locale) { @@ -156,3 +157,19 @@ int32_t ClientConnection::PollStatus(WOWCS_OPS& op, const char** msg, int32_t& r return this->m_statusComplete; } + +void ClientConnection::RequestCharacterDelete(uint64_t guid) { + this->Initiate(COP_DELETE_CHARACTER, 70, nullptr); + + if (this->IsConnected()) { + CDataStore netMsg; + netMsg.Put(static_cast(CMSG_CHAR_DELETE)); + netMsg.Put(guid); + netMsg.Finalize(); + + this->Send(&netMsg); + } + else { + this->Cancel(4); + } +} diff --git a/src/net/connection/ClientConnection.hpp b/src/net/connection/ClientConnection.hpp index f96a16f..0be7d2e 100644 --- a/src/net/connection/ClientConnection.hpp +++ b/src/net/connection/ClientConnection.hpp @@ -42,6 +42,7 @@ class ClientConnection : public RealmConnection { void Initiate(WOWCS_OPS op, int32_t errorCode, void (*cleanup)()); int32_t IsConnected(); int32_t PollStatus(WOWCS_OPS& op, const char** msg, int32_t& result, int32_t& errorCode); + void RequestCharacterDelete(uint64_t guid); }; #endif