From 4a48e18d5bdbd2eee5aeaa3e749b7651fa56e1ae Mon Sep 17 00:00:00 2001 From: antony Date: Fri, 26 Jul 2024 11:34:32 +0200 Subject: [PATCH] Playerbot fixes and functionnality to talk in channels --- src/server/game/DataStores/DBCStores.cpp | 53 ++++++++++++++++++++++ src/server/game/DataStores/DBCStores.h | 7 +++ src/server/game/Entities/Player/Player.cpp | 9 ++++ src/server/game/Entities/Player/Player.h | 1 + src/server/game/Server/WorldSession.h | 4 +- 5 files changed, 72 insertions(+), 2 deletions(-) diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index 113199ead..e84c70fba 100644 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -41,6 +41,9 @@ DBCStorage sAreaGroupStore(AreaGroupEntryfmt); DBCStorage sAreaPOIStore(AreaPOIEntryfmt); static WMOAreaInfoByTripple sWMOAreaInfoByTripple; +static AreaFlagByAreaID sAreaFlagByAreaID; +// for instances without generated *.map files +static AreaFlagByMapID sAreaFlagByMapID; DBCStorage sAchievementStore(Achievementfmt); DBCStorage sAchievementCategoryStore(AchievementCategoryfmt); @@ -396,6 +399,19 @@ void LoadDBCStores(const std::string& dataPath) #undef LOAD_DBC + for (uint32 i = 0; i < sAreaTableStore.GetNumRows(); ++i) // areaflag numbered from 0 + { + if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(i)) + { + // fill AreaId->DBC records + sAreaFlagByAreaID.insert(AreaFlagByAreaID::value_type(uint16(area->ID), area->exploreFlag)); + + // fill MapId->DBC records ( skip sub zones and continents ) + if (area->zone == 0 && area->mapid != 0 && area->mapid != 1 && area->mapid != 530) + sAreaFlagByMapID.insert(AreaFlagByMapID::value_type(area->mapid, area->exploreFlag)); + } + } + for (CharStartOutfitEntry const* outfit : sCharStartOutfitStore) sCharStartOutfitMap[outfit->Race | (outfit->Class << 8) | (outfit->Gender << 16)] = outfit; @@ -960,3 +976,40 @@ const std::vector& GetSkillLineAbilitiesBySkillLin } return it->second; } + +uint32 GetAreaFlagByMapId(uint32 mapid) +{ + AreaFlagByMapID::iterator i = sAreaFlagByMapID.find(mapid); + if (i == sAreaFlagByMapID.end()) + return 0; + return i->second; +} + +int32 GetAreaFlagByAreaID(uint32 area_id) +{ + AreaFlagByAreaID::iterator i = sAreaFlagByAreaID.find(area_id); + if (i == sAreaFlagByAreaID.end()) + return -1; + + return i->second; +} + +AreaTableEntry const* GetAreaEntryByAreaID(uint32 area_id) +{ + int32 areaflag = GetAreaFlagByAreaID(area_id); + if (areaflag < 0) + return nullptr; + + return sAreaTableStore.LookupEntry(areaflag); +} + +AreaTableEntry const* GetAreaEntryByAreaFlagAndMap(uint32 area_flag, uint32 map_id) +{ + if (area_flag) + return sAreaTableStore.LookupEntry(area_flag); + + if (MapEntry const* mapEntry = sMapStore.LookupEntry(map_id)) + return GetAreaEntryByAreaID(mapEntry->linked_zone); + + return nullptr; +} \ No newline at end of file diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h index 5e93bce70..bf44025d8 100644 --- a/src/server/game/DataStores/DBCStores.h +++ b/src/server/game/DataStores/DBCStores.h @@ -35,6 +35,13 @@ TalentSpellPos const* GetTalentSpellPos(uint32 spellId); WMOAreaTableEntry const* GetWMOAreaTableEntryByTripple(int32 rootid, int32 adtid, int32 groupid); + +// -1 if not found +int32 GetAreaFlagByAreaID(uint32 area_id); +uint32 GetAreaFlagByMapId(uint32 mapid); +AreaTableEntry const* GetAreaEntryByAreaID(uint32 area_id); +AreaTableEntry const* GetAreaEntryByAreaFlagAndMap(uint32 area_flag, uint32 map_id); + uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId); enum ContentLevels : uint8 diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 261413ca0..65edcad03 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -4955,6 +4955,15 @@ void Player::CleanupChannels() } } +// Playerbot helper if bot talks in a different locale +bool Player::IsInChannel(const Channel* c) +{ + return std::any_of(m_channels.begin(), m_channels.end(), [c](const Channel* chan) + { + return c->GetChannelId() == chan->GetChannelId(); + }); +} + void Player::ClearChannelWatch() { for (JoinedChannelsList::iterator itr = m_channels.begin(); itr != m_channels.end(); ++itr) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 7c8fdf844..0fb1336b9 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2043,6 +2043,7 @@ public: void JoinedChannel(Channel* c); void LeftChannel(Channel* c); + bool IsInChannel(const Channel* c); void CleanupChannels(); void ClearChannelWatch(); void UpdateLocalChannels(uint32 newZone); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 38700b33a..2a99cf92f 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -516,8 +516,8 @@ public: time_t m_muteTime; // Locales - LocaleConstant GetSessionDbcLocale() const { return _isBot? LOCALE_enUS : m_sessionDbcLocale; } - LocaleConstant GetSessionDbLocaleIndex() const { return _isBot? LOCALE_enUS : m_sessionDbLocaleIndex; } + LocaleConstant GetSessionDbcLocale() const { return /*_isBot? LOCALE_enUS : */m_sessionDbcLocale; } + LocaleConstant GetSessionDbLocaleIndex() const { return /*_isBot? LOCALE_enUS : */m_sessionDbLocaleIndex; } char const* GetAcoreString(uint32 entry) const; uint32 GetLatency() const { return m_latency; }