diff --git a/src/client/ClientServices.cpp b/src/client/ClientServices.cpp index f3fbeab..f6b9af1 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 254b9a9..52c7cec 100644 --- a/src/client/ClientServices.hpp +++ b/src/client/ClientServices.hpp @@ -33,6 +33,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 0f5efea..d19c6e1 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/CGUnit_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 6591a9e..afeee97 100644 --- a/src/glue/CGlueMgr.cpp +++ b/src/glue/CGlueMgr.cpp @@ -146,6 +146,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; diff --git a/src/glue/CGlueMgr.hpp b/src/glue/CGlueMgr.hpp index 258fbee..92dbec5 100644 --- a/src/glue/CGlueMgr.hpp +++ b/src/glue/CGlueMgr.hpp @@ -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 66434c0..7837295 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) { @@ -160,3 +161,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 c24fa3a..a6c6641 100644 --- a/src/net/connection/ClientConnection.hpp +++ b/src/net/connection/ClientConnection.hpp @@ -43,6 +43,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