diff options
author | Gildor <gildor55@gmail.com> | 2023-03-11 19:17:00 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2023-08-23 18:51:38 +0200 |
commit | f108a50abf82abd0973878ef88fdab47a408238c (patch) | |
tree | 1a6ca9d30788bda94ea10d95b11994a7b1e38f4d | |
parent | 7b48268e2cfc7fddeba8fe55721aaab4234cc152 (diff) |
Core/Players: Remove player from group on faction change if two side interaction group is not allowed. (#28835)
(cherry picked from commit 3dda65c53aaaf0a29eca180d8de2d825923364cc)
-rw-r--r-- | src/server/database/Database/Implementation/CharacterDatabase.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 8 |
2 files changed, 9 insertions, 1 deletions
diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index bef3fa0b778..ba3449db560 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -532,7 +532,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_CHAR_HOMEBIND, "SELECT mapId, zoneId, posX, posY, posZ, orientation FROM character_homebind WHERE guid = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHAR_GUID_NAME_BY_ACC, "SELECT guid, name, online FROM characters WHERE account = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHAR_CUSTOMIZE_INFO, "SELECT name, race, class, gender, at_login FROM characters WHERE guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHAR_RACE_OR_FACTION_CHANGE_INFOS, "SELECT at_login, knownTitles FROM characters WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHAR_RACE_OR_FACTION_CHANGE_INFOS, "SELECT c.at_login, c.knownTitles, gm.guid FROM characters c LEFT JOIN group_member gm ON c.guid = gm.memberGuid WHERE c.guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHAR_COD_ITEM_MAIL, "SELECT id, messageType, mailTemplateId, sender, subject, body, money, has_items FROM mail WHERE receiver = ? AND has_items <> 0 AND cod <> 0", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHAR_SOCIAL, "SELECT DISTINCT guid FROM character_social WHERE friend = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHAR_OLD_CHARS, "SELECT guid, deleteInfos_Account FROM characters WHERE deleteDate IS NOT NULL AND deleteDate < ?", CONNECTION_SYNCH); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index e7f44b18640..f4723aadb07 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -38,6 +38,7 @@ #include "GameTime.h" #include "GitRevision.h" #include "Group.h" +#include "GroupMgr.h" #include "Guild.h" #include "GuildMgr.h" #include "Item.h" @@ -2120,6 +2121,7 @@ void WorldSession::HandleCharRaceOrFactionChangeCallback(std::shared_ptr<WorldPa Field* fields = result->Fetch(); uint16 atLoginFlags = fields[0].GetUInt16(); std::string knownTitlesStr = fields[1].GetString(); + uint32 groupId = !fields[2].IsNull() ? fields[2].GetUInt32() : 0; uint16 usedLoginFlag = (factionChangeInfo->FactionChange ? AT_LOGIN_CHANGE_FACTION : AT_LOGIN_CHANGE_RACE); if (!(atLoginFlags & usedLoginFlag)) @@ -2348,6 +2350,12 @@ void WorldSession::HandleCharRaceOrFactionChangeCallback(std::shared_ptr<WorldPa Player::LeaveAllArenaTeams(factionChangeInfo->Guid); } + if (groupId && !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP)) + { + if (Group* group = sGroupMgr->GetGroupByDbStoreId(groupId)) + group->RemoveMember(factionChangeInfo->Guid); + } + if (!HasPermission(rbac::RBAC_PERM_TWO_SIDE_ADD_FRIEND)) { // Delete Friend List |