From 82d5a42402d9ce9f3babd91014644f6a97d2738e Mon Sep 17 00:00:00 2001 From: Walter Pagani Date: Sun, 9 Jun 2024 08:45:17 -0300 Subject: [PATCH] chore(Command/unstuck) use command with offline players (#18913) Co-authored-by: Andrew <47818697+Nyeriah@users.noreply.github.com> Co-authored-by: Anton Popovichenko --- .../Implementation/CharacterDatabase.cpp | 2 +- src/server/scripts/Commands/cs_misc.cpp | 21 ++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index c3794fef4..eaa1ffc10 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -95,7 +95,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_MAIL_SERVER_CHARACTER, "SELECT mailId from mail_server_character WHERE guid = ? and mailId = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_REP_MAIL_SERVER_CHARACTER, "REPLACE INTO mail_server_character (guid, mailId) values (?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_SOCIALLIST, "SELECT friend, flags, note FROM character_social JOIN characters ON characters.guid = character_social.friend WHERE character_social.guid = ? AND deleteinfos_name IS NULL LIMIT 255", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHARACTER_HOMEBIND, "SELECT mapId, zoneId, posX, posY, posZ, posO FROM character_homebind WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHARACTER_HOMEBIND, "SELECT mapId, zoneId, posX, posY, posZ, posO FROM character_homebind WHERE guid = ?", CONNECTION_BOTH); PrepareStatement(CHAR_SEL_CHARACTER_SPELLCOOLDOWNS, "SELECT spell, category, item, time, needSend FROM character_spell_cooldown WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_DECLINEDNAMES, "SELECT genitive, dative, accusative, instrumental, prepositional FROM character_declinedname WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_ACHIEVEMENTS, "SELECT achievement, date FROM character_achievement WHERE guid = ?", CONNECTION_ASYNC); diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 0dc93612c..14cac42ad 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -1386,7 +1386,26 @@ public: if (!target || !target->IsConnected()) { - return false; + if (handler->HasLowerSecurity(nullptr, target->GetGUID())) + return false; + + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_HOMEBIND); + stmt->SetData(0, target->GetGUID().GetCounter()); + + PreparedQueryResult result = CharacterDatabase.Query(stmt); + + if (result) + { + Field* fieldsDB = result->Fetch(); + WorldLocation loc(fieldsDB[0].Get(), fieldsDB[2].Get(), fieldsDB[3].Get(), fieldsDB[4].Get(), 0.0f); + uint32 zoneId = fieldsDB[1].Get(); + + Player::SavePositionInDB(loc, zoneId, target->GetGUID(), nullptr); + + handler->PSendSysMessage(LANG_SUMMONING, target->GetName(), handler->GetAcoreString(LANG_OFFLINE)); + } + + return true; } Player* player = target->GetConnectedPlayer();