фиксы для режима предатель: приглашение в гильдию и группу

This commit is contained in:
2026-04-16 17:51:58 +04:00
parent 7a32675298
commit 4d8a2a20e1
6 changed files with 56 additions and 14 deletions
@@ -4772,7 +4772,10 @@ uint32 PlayerbotAI::AutoScaleActivity(uint32 mod)
return static_cast<uint32>(mod * (1 - lagProgress)); return static_cast<uint32>(mod * (1 - lagProgress));
} }
bool PlayerbotAI::IsOpposing(Player* player) { return IsOpposing(player->getRace(), bot->getRace()); } bool PlayerbotAI::IsOpposing(Player* player)
{
return player && bot && player->GetTeamId() != bot->GetTeamId();
}
bool PlayerbotAI::IsOpposing(uint8 race1, uint8 race2) bool PlayerbotAI::IsOpposing(uint8 race1, uint8 race2)
{ {
+41 -7
View File
@@ -28,6 +28,16 @@ namespace
{ {
std::unordered_map<ObjectGuid, CharacterCacheEntry> _characterCacheStore; std::unordered_map<ObjectGuid, CharacterCacheEntry> _characterCacheStore;
std::unordered_map<std::string, CharacterCacheEntry*> _characterCacheByNameStore; std::unordered_map<std::string, CharacterCacheEntry*> _characterCacheByNameStore;
TeamId GetEffectiveCharacterTeam(uint8 race, uint32 playerFlags, uint8 gameMode)
{
TeamId teamId = Player::TeamIdForRace(race);
if (Player::ResolveGameModeFromStorage(playerFlags, gameMode) == PLAYER_GAMEMODE_TRAITOR)
return teamId == TEAM_ALLIANCE ? TEAM_HORDE : TEAM_ALLIANCE;
return teamId;
}
} }
CharacterCache* CharacterCache::instance() CharacterCache* CharacterCache::instance()
@@ -62,7 +72,11 @@ void CharacterCache::LoadCharacterCacheStorage()
_characterCacheStore.clear(); _characterCacheStore.clear();
uint32 oldMSTime = getMSTime(); uint32 oldMSTime = getMSTime();
QueryResult result = CharacterDatabase.Query("SELECT guid, name, account, race, gender, class, level FROM characters"); QueryResult result = CharacterDatabase.Query(R"(
SELECT c.guid, c.name, c.account, c.race, c.gender, c.class, c.level, c.playerFlags, COALESCE(mgc.game_mode, 0)
FROM characters c
LEFT JOIN mod_gamemodes_characters mgc ON mgc.guid = c.guid
)");
if (!result) if (!result)
{ {
LOG_INFO("server.loading", "No character name data loaded, empty query!"); LOG_INFO("server.loading", "No character name data loaded, empty query!");
@@ -73,7 +87,8 @@ void CharacterCache::LoadCharacterCacheStorage()
{ {
Field* fields = result->Fetch(); Field* fields = result->Fetch();
AddCharacterCacheEntry(ObjectGuid::Create<HighGuid::Player>(fields[0].Get<uint32>()) /*guid*/, fields[2].Get<uint32>() /*account*/, fields[1].Get<std::string>() /*name*/, AddCharacterCacheEntry(ObjectGuid::Create<HighGuid::Player>(fields[0].Get<uint32>()) /*guid*/, fields[2].Get<uint32>() /*account*/, fields[1].Get<std::string>() /*name*/,
fields[4].Get<uint8>() /*gender*/, fields[3].Get<uint8>() /*race*/, fields[5].Get<uint8>() /*class*/, fields[6].Get<uint8>() /*level*/); fields[4].Get<uint8>() /*gender*/, fields[3].Get<uint8>() /*race*/, fields[5].Get<uint8>() /*class*/, fields[6].Get<uint8>() /*level*/,
fields[7].Get<uint32>() /*playerFlags*/, fields[8].Get<uint8>() /*gameMode*/);
} while (result->NextRow()); } while (result->NextRow());
QueryResult mailCountResult = CharacterDatabase.Query("SELECT receiver, COUNT(receiver) FROM mail GROUP BY receiver"); QueryResult mailCountResult = CharacterDatabase.Query("SELECT receiver, COUNT(receiver) FROM mail GROUP BY receiver");
@@ -92,7 +107,12 @@ void CharacterCache::LoadCharacterCacheStorage()
void CharacterCache::RefreshCacheEntry(uint32 lowGuid) void CharacterCache::RefreshCacheEntry(uint32 lowGuid)
{ {
QueryResult result = CharacterDatabase.Query("SELECT guid, name, account, race, gender, class, level FROM characters WHERE guid = {}", lowGuid); QueryResult result = CharacterDatabase.Query(R"(
SELECT c.guid, c.name, c.account, c.race, c.gender, c.class, c.level, c.playerFlags, COALESCE(mgc.game_mode, 0)
FROM characters c
LEFT JOIN mod_gamemodes_characters mgc ON mgc.guid = c.guid
WHERE c.guid = {}
)", lowGuid);
if (!result) if (!result)
{ {
return; return;
@@ -102,7 +122,9 @@ void CharacterCache::RefreshCacheEntry(uint32 lowGuid)
{ {
Field* fields = result->Fetch(); Field* fields = result->Fetch();
DeleteCharacterCacheEntry(ObjectGuid::Create<HighGuid::Player>(lowGuid), fields[1].Get<std::string>()); DeleteCharacterCacheEntry(ObjectGuid::Create<HighGuid::Player>(lowGuid), fields[1].Get<std::string>());
AddCharacterCacheEntry(ObjectGuid::Create<HighGuid::Player>(fields[0].Get<uint32>()) /*guid*/, fields[2].Get<uint32>() /*account*/, fields[1].Get<std::string>() /*name*/, fields[4].Get<uint8>() /*gender*/, fields[3].Get<uint8>() /*race*/, fields[5].Get<uint8>() /*class*/, fields[6].Get<uint8>() /*level*/); AddCharacterCacheEntry(ObjectGuid::Create<HighGuid::Player>(fields[0].Get<uint32>()) /*guid*/, fields[2].Get<uint32>() /*account*/, fields[1].Get<std::string>() /*name*/,
fields[4].Get<uint8>() /*gender*/, fields[3].Get<uint8>() /*race*/, fields[5].Get<uint8>() /*class*/, fields[6].Get<uint8>() /*level*/,
fields[7].Get<uint32>() /*playerFlags*/, fields[8].Get<uint8>() /*gameMode*/);
} while (result->NextRow()); } while (result->NextRow());
QueryResult mailCountResult = CharacterDatabase.Query("SELECT receiver, COUNT(receiver) FROM mail WHERE receiver = {} GROUP BY receiver", lowGuid); QueryResult mailCountResult = CharacterDatabase.Query("SELECT receiver, COUNT(receiver) FROM mail WHERE receiver = {} GROUP BY receiver", lowGuid);
@@ -119,16 +141,18 @@ void CharacterCache::RefreshCacheEntry(uint32 lowGuid)
/* /*
Modifying functions Modifying functions
*/ */
void CharacterCache::AddCharacterCacheEntry(ObjectGuid const& guid, uint32 accountId, std::string const& name, uint8 gender, uint8 race, uint8 playerClass, uint8 level) void CharacterCache::AddCharacterCacheEntry(ObjectGuid const& guid, uint32 accountId, std::string const& name, uint8 gender, uint8 race, uint8 playerClass, uint8 level, uint32 playerFlags, uint8 gameMode)
{ {
CharacterCacheEntry& data = _characterCacheStore[guid]; CharacterCacheEntry& data = _characterCacheStore[guid];
data.Guid = guid; data.Guid = guid;
data.Name = name; data.Name = name;
data.AccountId = accountId; data.AccountId = accountId;
data.PlayerFlags = playerFlags;
data.Race = race; data.Race = race;
data.Sex = gender; data.Sex = gender;
data.Class = playerClass; data.Class = playerClass;
data.Level = level; data.Level = level;
data.GameMode = gameMode;
data.GuildId = 0; // Will be set in guild loading or guild setting data.GuildId = 0; // Will be set in guild loading or guild setting
for (uint8 i = 0; i < MAX_ARENA_SLOT; ++i) for (uint8 i = 0; i < MAX_ARENA_SLOT; ++i)
{ {
@@ -145,7 +169,7 @@ void CharacterCache::DeleteCharacterCacheEntry(ObjectGuid const& guid, std::stri
_characterCacheByNameStore.erase(name); _characterCacheByNameStore.erase(name);
} }
void CharacterCache::UpdateCharacterData(ObjectGuid const& guid, std::string const& name, Optional<uint8> gender /*= {}*/, Optional<uint8> race /*= {}*/) void CharacterCache::UpdateCharacterData(ObjectGuid const& guid, std::string const& name, Optional<uint8> gender /*= {}*/, Optional<uint8> race /*= {}*/, Optional<uint32> playerFlags /*= {}*/, Optional<uint8> gameMode /*= {}*/)
{ {
auto itr = _characterCacheStore.find(guid); auto itr = _characterCacheStore.find(guid);
if (itr == _characterCacheStore.end()) if (itr == _characterCacheStore.end())
@@ -164,6 +188,16 @@ void CharacterCache::UpdateCharacterData(ObjectGuid const& guid, std::string con
itr->second.Race = *race; itr->second.Race = *race;
} }
if (playerFlags)
{
itr->second.PlayerFlags = *playerFlags;
}
if (gameMode)
{
itr->second.GameMode = *gameMode;
}
//WorldPackets::Misc::InvalidatePlayer packet(guid); //WorldPackets::Misc::InvalidatePlayer packet(guid);
//sWorld->SendGlobalMessage(packet.Write()); //sWorld->SendGlobalMessage(packet.Write());
@@ -311,7 +345,7 @@ uint32 CharacterCache::GetCharacterTeamByGuid(ObjectGuid guid) const
return 0; return 0;
} }
return Player::TeamIdForRace(itr->second.Race); return GetEffectiveCharacterTeam(itr->second.Race, itr->second.PlayerFlags, itr->second.GameMode);
} }
uint32 CharacterCache::GetCharacterAccountIdByGuid(ObjectGuid guid) const uint32 CharacterCache::GetCharacterAccountIdByGuid(ObjectGuid guid) const
+4 -2
View File
@@ -29,10 +29,12 @@ struct CharacterCacheEntry
ObjectGuid Guid; ObjectGuid Guid;
std::string Name; std::string Name;
uint32 AccountId; uint32 AccountId;
uint32 PlayerFlags = 0;
uint8 Class; uint8 Class;
uint8 Race; uint8 Race;
uint8 Sex; uint8 Sex;
uint8 Level; uint8 Level;
uint8 GameMode = 0;
uint8 MailCount; uint8 MailCount;
ObjectGuid::LowType GuildId; ObjectGuid::LowType GuildId;
std::array<uint32, MAX_ARENA_SLOT> ArenaTeamId; std::array<uint32, MAX_ARENA_SLOT> ArenaTeamId;
@@ -49,10 +51,10 @@ class AC_GAME_API CharacterCache
void LoadCharacterCacheStorage(); void LoadCharacterCacheStorage();
void RefreshCacheEntry(uint32 lowGuid); void RefreshCacheEntry(uint32 lowGuid);
void AddCharacterCacheEntry(ObjectGuid const& guid, uint32 accountId, std::string const& name, uint8 gender, uint8 race, uint8 playerClass, uint8 level); void AddCharacterCacheEntry(ObjectGuid const& guid, uint32 accountId, std::string const& name, uint8 gender, uint8 race, uint8 playerClass, uint8 level, uint32 playerFlags = 0, uint8 gameMode = 0);
void DeleteCharacterCacheEntry(ObjectGuid const& guid, std::string const& name); void DeleteCharacterCacheEntry(ObjectGuid const& guid, std::string const& name);
void UpdateCharacterData(ObjectGuid const& guid, std::string const& name, Optional<uint8> gender = {}, Optional<uint8> race = {}); void UpdateCharacterData(ObjectGuid const& guid, std::string const& name, Optional<uint8> gender = {}, Optional<uint8> race = {}, Optional<uint32> playerFlags = {}, Optional<uint8> gameMode = {});
void UpdateCharacterLevel(ObjectGuid const& guid, uint8 level); void UpdateCharacterLevel(ObjectGuid const& guid, uint8 level);
void UpdateCharacterAccountId(ObjectGuid const& guid, uint32 accountId); void UpdateCharacterAccountId(ObjectGuid const& guid, uint32 accountId);
void UpdateCharacterGuildId(ObjectGuid const& guid, ObjectGuid::LowType guildId); void UpdateCharacterGuildId(ObjectGuid const& guid, ObjectGuid::LowType guildId);
+1 -1
View File
@@ -1483,7 +1483,7 @@ void Guild::HandleInviteMember(WorldSession* session, std::string const& name)
return; return;
} }
if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && pInvitee->GetTeamId(true) != player->GetTeamId(true)) if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && pInvitee->GetTeamId() != player->GetTeamId())
{ {
SendCommandResult(session, GUILD_COMMAND_INVITE, ERR_GUILD_NOT_ALLIED, name); SendCommandResult(session, GUILD_COMMAND_INVITE, ERR_GUILD_NOT_ALLIED, name);
return; return;
@@ -582,7 +582,8 @@ void WorldSession::HandleCharCreateOpcode(WorldPacket& recvData)
{ {
LOG_INFO("entities.player.character", "Account: {} (IP: {}) Create Character: {} {}", GetAccountId(), GetRemoteAddress(), newChar->GetName(), newChar->GetGUID().ToString()); LOG_INFO("entities.player.character", "Account: {} (IP: {}) Create Character: {} {}", GetAccountId(), GetRemoteAddress(), newChar->GetName(), newChar->GetGUID().ToString());
sScriptMgr->OnPlayerCreate(newChar.get()); sScriptMgr->OnPlayerCreate(newChar.get());
sCharacterCache->AddCharacterCacheEntry(newChar->GetGUID(), GetAccountId(), newChar->GetName(), newChar->getGender(), newChar->getRace(), newChar->getClass(), newChar->GetLevel()); sCharacterCache->AddCharacterCacheEntry(newChar->GetGUID(), GetAccountId(), newChar->GetName(), newChar->getGender(), newChar->getRace(), newChar->getClass(), newChar->GetLevel(),
newChar->GetUInt32Value(PLAYER_FLAGS), static_cast<uint8>(newChar->GetGameMode()));
SendCharCreate(CHAR_CREATE_SUCCESS); SendCharCreate(CHAR_CREATE_SUCCESS);
} }
else else
+4 -2
View File
@@ -111,12 +111,14 @@ public:
{ {
if (sCharacterCache->HasCharacterCacheEntry(cPlayer->GetGUID())) if (sCharacterCache->HasCharacterCacheEntry(cPlayer->GetGUID()))
{ {
sCharacterCache->UpdateCharacterData(cPlayer->GetGUID(), cPlayer->GetName(), cPlayer->getGender(), cPlayer->getRace()); sCharacterCache->UpdateCharacterData(cPlayer->GetGUID(), cPlayer->GetName(), cPlayer->getGender(), cPlayer->getRace(),
cPlayer->GetUInt32Value(PLAYER_FLAGS), static_cast<uint8>(cPlayer->GetGameMode()));
} }
else else
{ {
sCharacterCache->AddCharacterCacheEntry(cPlayer->GetGUID(), cPlayer->GetSession()->GetAccountId(), cPlayer->GetName(), sCharacterCache->AddCharacterCacheEntry(cPlayer->GetGUID(), cPlayer->GetSession()->GetAccountId(), cPlayer->GetName(),
cPlayer->getGender(), cPlayer->getRace(), cPlayer->getClass(), cPlayer->GetLevel()); cPlayer->getGender(), cPlayer->getRace(), cPlayer->getClass(), cPlayer->GetLevel(),
cPlayer->GetUInt32Value(PLAYER_FLAGS), static_cast<uint8>(cPlayer->GetGameMode()));
} }
sCharacterCache->UpdateCharacterAccountId(cPlayer->GetGUID(), cPlayer->GetSession()->GetAccountId()); sCharacterCache->UpdateCharacterAccountId(cPlayer->GetGUID(), cPlayer->GetSession()->GetAccountId());