From 73340b94e3dbcc67da8e52ea5ddea06298c2c6d4 Mon Sep 17 00:00:00 2001 From: Anton Popovichenko Date: Thu, 28 Mar 2024 12:57:29 +0100 Subject: [PATCH 1/9] feat(Core/Compression): Move packets compression from map to network thread (#18602) * feat(Code/Compression): Move packets compression from map to network thread. * Code style fix * Remove unicode letter --- .../Battlegrounds/Zones/BattlegroundSA.cpp | 6 +- .../game/Entities/GameObject/GameObject.cpp | 2 +- src/server/game/Entities/Object/Object.cpp | 2 +- .../Entities/Object/Updates/UpdateData.cpp | 97 ++----------------- .../game/Entities/Object/Updates/UpdateData.h | 4 +- .../game/Entities/Player/PlayerUpdates.cpp | 4 +- src/server/game/Entities/Unit/Unit.cpp | 2 +- .../game/Grids/Notifiers/GridNotifiers.cpp | 2 +- src/server/game/Groups/Group.cpp | 4 +- src/server/game/Maps/Map.cpp | 14 +-- src/server/game/Server/WorldSocket.cpp | 85 +++++++++++++++- src/server/game/Server/WorldSocket.h | 12 ++- .../SunwellPlateau/boss_brutallus.cpp | 4 +- src/server/scripts/Spells/spell_priest.cpp | 2 +- 14 files changed, 122 insertions(+), 118 deletions(-) diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp index 8f16108f8..ee160c6e8 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp @@ -305,7 +305,7 @@ void BattlegroundSA::StartShips() UpdateData data; WorldPacket pkt; GetBGObject(i)->BuildValuesUpdateBlockForPlayer(&data, itr->second); - data.BuildPacket(&pkt); + data.BuildPacket(pkt); itr->second->GetSession()->SendPacket(&pkt); } } @@ -1106,7 +1106,7 @@ void BattlegroundSA::SendTransportInit(Player* player) if (BgObjects[BG_SA_BOAT_TWO]) GetBGObject(BG_SA_BOAT_TWO)->BuildCreateUpdateBlockForPlayer(&transData, player); WorldPacket packet; - transData.BuildPacket(&packet); + transData.BuildPacket(packet); player->GetSession()->SendPacket(&packet); } } @@ -1121,7 +1121,7 @@ void BattlegroundSA::SendTransportsRemove(Player* player) if (BgObjects[BG_SA_BOAT_TWO]) GetBGObject(BG_SA_BOAT_TWO)->BuildOutOfRangeUpdateBlock(&transData); WorldPacket packet; - transData.BuildPacket(&packet); + transData.BuildPacket(packet); player->GetSession()->SendPacket(&packet); } } diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index a488acc93..7f9886aa4 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -512,7 +512,7 @@ void GameObject::Update(uint32 diff) UpdateData udata; WorldPacket packet; BuildValuesUpdateBlockForPlayer(&udata, caster->ToPlayer()); - udata.BuildPacket(&packet); + udata.BuildPacket(packet); caster->ToPlayer()->GetSession()->SendPacket(&packet); SendCustomAnim(GetGoAnimProgress()); diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 368f814ae..a831a0804 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -250,7 +250,7 @@ void Object::SendUpdateToPlayer(Player* player) WorldPacket packet; BuildCreateUpdateBlockForPlayer(&upd, player); - upd.BuildPacket(&packet); + upd.BuildPacket(packet); player->GetSession()->SendPacket(&packet); } diff --git a/src/server/game/Entities/Object/Updates/UpdateData.cpp b/src/server/game/Entities/Object/Updates/UpdateData.cpp index a452bc66a..00c565c66 100644 --- a/src/server/game/Entities/Object/Updates/UpdateData.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateData.cpp @@ -22,7 +22,6 @@ #include "Opcodes.h" #include "World.h" #include "WorldPacket.h" -#include "zlib.h" UpdateData::UpdateData() : m_blockCount(0) { @@ -46,103 +45,25 @@ void UpdateData::AddUpdateBlock(const UpdateData& block) m_blockCount += block.m_blockCount; } -void UpdateData::Compress(void* dst, uint32* dst_size, void* src, int src_size) +bool UpdateData::BuildPacket(WorldPacket& packet) { - z_stream c_stream; + ASSERT(packet.empty()); - c_stream.zalloc = (alloc_func)0; - c_stream.zfree = (free_func)0; - c_stream.opaque = (voidpf)0; + packet.reserve(4 + (m_outOfRangeGUIDs.empty() ? 0 : 1 + 4 + 9 * m_outOfRangeGUIDs.size()) + m_data.wpos()); - // default Z_BEST_SPEED (1) - int z_res = deflateInit(&c_stream, sWorld->getIntConfig(CONFIG_COMPRESSION)); - if (z_res != Z_OK) - { - LOG_ERROR("entities.object", "Can't compress update packet (zlib: deflateInit) Error code: {} ({})", z_res, zError(z_res)); - *dst_size = 0; - return; - } - - c_stream.next_out = (Bytef*)dst; - c_stream.avail_out = *dst_size; - c_stream.next_in = (Bytef*)src; - c_stream.avail_in = (uInt)src_size; - - z_res = deflate(&c_stream, Z_NO_FLUSH); - if (z_res != Z_OK) - { - LOG_ERROR("entities.object", "Can't compress update packet (zlib: deflate) Error code: {} ({})", z_res, zError(z_res)); - *dst_size = 0; - return; - } - - if (c_stream.avail_in != 0) - { - LOG_ERROR("entities.object", "Can't compress update packet (zlib: deflate not greedy)"); - *dst_size = 0; - return; - } - - z_res = deflate(&c_stream, Z_FINISH); - if (z_res != Z_STREAM_END) - { - LOG_ERROR("entities.object", "Can't compress update packet (zlib: deflate should report Z_STREAM_END instead {} ({})", z_res, zError(z_res)); - *dst_size = 0; - return; - } - - z_res = deflateEnd(&c_stream); - if (z_res != Z_OK) - { - LOG_ERROR("entities.object", "Can't compress update packet (zlib: deflateEnd) Error code: {} ({})", z_res, zError(z_res)); - *dst_size = 0; - return; - } - - *dst_size = c_stream.total_out; -} - -bool UpdateData::BuildPacket(WorldPacket* packet) -{ - ASSERT(packet->empty()); // shouldn't happen - - ByteBuffer buf(4 + (m_outOfRangeGUIDs.empty() ? 0 : 1 + 4 + 9 * m_outOfRangeGUIDs.size()) + m_data.wpos()); - - buf << (uint32) (!m_outOfRangeGUIDs.empty() ? m_blockCount + 1 : m_blockCount); + packet << (uint32) (!m_outOfRangeGUIDs.empty() ? m_blockCount + 1 : m_blockCount); if (!m_outOfRangeGUIDs.empty()) { - buf << (uint8) UPDATETYPE_OUT_OF_RANGE_OBJECTS; - buf << (uint32) m_outOfRangeGUIDs.size(); + packet << (uint8) UPDATETYPE_OUT_OF_RANGE_OBJECTS; + packet << (uint32) m_outOfRangeGUIDs.size(); for (ObjectGuid const& guid : m_outOfRangeGUIDs) - { - buf << guid.WriteAsPacked(); - } + packet << guid.WriteAsPacked(); } - buf.append(m_data); - - size_t pSize = buf.wpos(); // use real used data size - - if (pSize > 100) // compress large packets - { - uint32 destsize = compressBound(pSize); - packet->resize(destsize + sizeof(uint32)); - - packet->put(0, pSize); - Compress(const_cast(packet->contents()) + sizeof(uint32), &destsize, (void*)buf.contents(), pSize); - if (destsize == 0) - return false; - - packet->resize(destsize + sizeof(uint32)); - packet->SetOpcode(SMSG_COMPRESSED_UPDATE_OBJECT); - } - else // send small packets without compression - { - packet->append(buf); - packet->SetOpcode(SMSG_UPDATE_OBJECT); - } + packet.append(m_data); + packet.SetOpcode(SMSG_UPDATE_OBJECT); return true; } diff --git a/src/server/game/Entities/Object/Updates/UpdateData.h b/src/server/game/Entities/Object/Updates/UpdateData.h index 4b8d9b7a4..6a795bd7e 100644 --- a/src/server/game/Entities/Object/Updates/UpdateData.h +++ b/src/server/game/Entities/Object/Updates/UpdateData.h @@ -56,7 +56,7 @@ public: void AddOutOfRangeGUID(ObjectGuid guid); void AddUpdateBlock(const ByteBuffer& block); void AddUpdateBlock(const UpdateData& block); - bool BuildPacket(WorldPacket* packet); + bool BuildPacket(WorldPacket& packet); [[nodiscard]] bool HasData() const { return m_blockCount > 0 || !m_outOfRangeGUIDs.empty(); } void Clear(); @@ -64,7 +64,5 @@ protected: uint32 m_blockCount; GuidVector m_outOfRangeGUIDs; ByteBuffer m_data; - - void Compress(void* dst, uint32* dst_size, void* src, int src_size); }; #endif diff --git a/src/server/game/Entities/Player/PlayerUpdates.cpp b/src/server/game/Entities/Player/PlayerUpdates.cpp index e56e3e3dc..7bcb5e567 100644 --- a/src/server/game/Entities/Player/PlayerUpdates.cpp +++ b/src/server/game/Entities/Player/PlayerUpdates.cpp @@ -1739,7 +1739,7 @@ void Player::UpdateTriggerVisibility() if (!udata.HasData()) return; - udata.BuildPacket(&packet); + udata.BuildPacket(packet); GetSession()->SendPacket(&packet); } @@ -1791,7 +1791,7 @@ void Player::UpdateForQuestWorldObjects() } } - udata.BuildPacket(&packet); + udata.BuildPacket(packet); GetSession()->SendPacket(&packet); } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index f7576fbdf..f89793acd 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -10595,7 +10595,7 @@ void Unit::SetOwnerGUID(ObjectGuid owner) UpdateData udata; WorldPacket packet; BuildValuesUpdateBlockForPlayer(&udata, player); - udata.BuildPacket(&packet); + udata.BuildPacket(packet); player->SendDirectMessage(&packet); RemoveFieldNotifyFlag(UF_FLAG_OWNER); diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.cpp b/src/server/game/Grids/Notifiers/GridNotifiers.cpp index d69c9386b..db2ad0a67 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.cpp +++ b/src/server/game/Grids/Notifiers/GridNotifiers.cpp @@ -99,7 +99,7 @@ void VisibleNotifier::SendToSelf() return; WorldPacket packet; - i_data.BuildPacket(&packet); + i_data.BuildPacket(packet); i_player.GetSession()->SendPacket(&packet); for (std::vector::const_iterator it = i_visibleNow.begin(); it != i_visibleNow.end(); ++it) diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index f6563042e..8db5f3740 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -520,7 +520,7 @@ bool Group::AddMember(Player* player) player->BuildValuesUpdateBlockForPlayer(&newData, itrMember); if (newData.HasData()) { - newData.BuildPacket(&newDataPacket); + newData.BuildPacket(newDataPacket); itrMember->SendDirectMessage(&newDataPacket); } } @@ -529,7 +529,7 @@ bool Group::AddMember(Player* player) if (groupData.HasData()) { - groupData.BuildPacket(&groupDataPacket); + groupData.BuildPacket(groupDataPacket); player->SendDirectMessage(&groupDataPacket); } diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 905c6632e..8eecf7ced 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -644,7 +644,7 @@ bool Map::AddToMap(MotionTransport* obj, bool /*checkTransport*/) UpdateData data; obj->BuildCreateUpdateBlockForPlayer(&data, itr->GetSource()); WorldPacket packet; - data.BuildPacket(&packet); + data.BuildPacket(packet); itr->GetSource()->SendDirectMessage(&packet); } } @@ -971,7 +971,7 @@ void Map::RemoveFromMap(MotionTransport* obj, bool remove) UpdateData data; obj->BuildOutOfRangeUpdateBlock(&data); WorldPacket packet; - data.BuildPacket(&packet); + data.BuildPacket(packet); for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) if (itr->GetSource()->GetTransport() != obj) itr->GetSource()->SendDirectMessage(&packet); @@ -2536,7 +2536,7 @@ void Map::SendInitSelf(Player* player) player->BuildCreateUpdateBlockForPlayer(&data, player); // build and send self update packet before sending to player his own auras - data.BuildPacket(&packet); + data.BuildPacket(packet); player->SendDirectMessage(&packet); // send to player his own auras (this is needed here for timely initialization of some fields on client) @@ -2552,7 +2552,7 @@ void Map::SendInitSelf(Player* player) if (player != (*itr) && player->HaveAtClient(*itr)) (*itr)->BuildCreateUpdateBlockForPlayer(&data, player); - data.BuildPacket(&packet); + data.BuildPacket(packet); player->SendDirectMessage(&packet); } @@ -2565,7 +2565,7 @@ void Map::SendInitTransports(Player* player) (*itr)->BuildCreateUpdateBlockForPlayer(&transData, player); WorldPacket packet; - transData.BuildPacket(&packet); + transData.BuildPacket(packet); player->GetSession()->SendPacket(&packet); } @@ -2590,7 +2590,7 @@ void Map::SendRemoveTransports(Player* player) } WorldPacket packet; - transData.BuildPacket(&packet); + transData.BuildPacket(packet); player->GetSession()->SendPacket(&packet); } @@ -2621,7 +2621,7 @@ void Map::SendObjectUpdates() WorldPacket packet; // here we allocate a std::vector with a size of 0x10000 for (UpdateDataMapType::iterator iter = update_players.begin(); iter != update_players.end(); ++iter) { - iter->second.BuildPacket(&packet); + iter->second.BuildPacket(packet); iter->first->GetSession()->SendPacket(&packet); packet.clear(); // clean the string } diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index f6317b504..05235bc6f 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -31,9 +31,88 @@ #include "World.h" #include "WorldSession.h" #include +#include "zlib.h" using boost::asio::ip::tcp; +void compressBuff(void* dst, uint32* dst_size, void* src, int src_size) +{ + z_stream c_stream; + + c_stream.zalloc = (alloc_func)0; + c_stream.zfree = (free_func)0; + c_stream.opaque = (voidpf)0; + + // default Z_BEST_SPEED (1) + int z_res = deflateInit(&c_stream, sWorld->getIntConfig(CONFIG_COMPRESSION)); + if (z_res != Z_OK) + { + LOG_ERROR("entities.object", "Can't compress update packet (zlib: deflateInit) Error code: {} ({})", z_res, zError(z_res)); + *dst_size = 0; + return; + } + + c_stream.next_out = (Bytef*)dst; + c_stream.avail_out = *dst_size; + c_stream.next_in = (Bytef*)src; + c_stream.avail_in = (uInt)src_size; + + z_res = deflate(&c_stream, Z_NO_FLUSH); + if (z_res != Z_OK) + { + LOG_ERROR("entities.object", "Can't compress update packet (zlib: deflate) Error code: {} ({})", z_res, zError(z_res)); + *dst_size = 0; + return; + } + + if (c_stream.avail_in != 0) + { + LOG_ERROR("entities.object", "Can't compress update packet (zlib: deflate not greedy)"); + *dst_size = 0; + return; + } + + z_res = deflate(&c_stream, Z_FINISH); + if (z_res != Z_STREAM_END) + { + LOG_ERROR("entities.object", "Can't compress update packet (zlib: deflate should report Z_STREAM_END instead {} ({})", z_res, zError(z_res)); + *dst_size = 0; + return; + } + + z_res = deflateEnd(&c_stream); + if (z_res != Z_OK) + { + LOG_ERROR("entities.object", "Can't compress update packet (zlib: deflateEnd) Error code: {} ({})", z_res, zError(z_res)); + *dst_size = 0; + return; + } + + *dst_size = c_stream.total_out; +} + +void EncryptableAndCompressiblePacket::CompressIfNeeded() +{ + if (!NeedsCompression()) + return; + + uint32 pSize = size(); + + uint32 destsize = compressBound(pSize); + ByteBuffer buf(destsize + sizeof(uint32)); + buf.resize(destsize + sizeof(uint32)); + + buf.put(0, pSize); + compressBuff(const_cast(buf.contents()) + sizeof(uint32), &destsize, (void*)contents(), pSize); + if (destsize == 0) + return; + + buf.resize(destsize + sizeof(uint32)); + + ByteBuffer::operator=(std::move(buf)); + SetOpcode(SMSG_COMPRESSED_UPDATE_OBJECT); +} + WorldSocket::WorldSocket(tcp::socket&& socket) : Socket(std::move(socket)), _OverSpeedPings(0), _worldSession(nullptr), _authed(false), _sendBufferSize(4096) { @@ -81,10 +160,12 @@ void WorldSocket::CheckIpCallback(PreparedQueryResult result) bool WorldSocket::Update() { - EncryptablePacket* queued; + EncryptableAndCompressiblePacket* queued; MessageBuffer buffer(_sendBufferSize); while (_bufferQueue.Dequeue(queued)) { + queued->CompressIfNeeded(); + ServerPktHeader header(queued->size() + 2, queued->GetOpcode()); if (queued->NeedsEncryption()) _authCrypt.EncryptSend(header.header, header.getHeaderLength()); @@ -427,7 +508,7 @@ void WorldSocket::SendPacket(WorldPacket const& packet) if (sPacketLog->CanLogPacket()) sPacketLog->LogPacket(packet, SERVER_TO_CLIENT, GetRemoteIpAddress(), GetRemotePort()); - _bufferQueue.Enqueue(new EncryptablePacket(packet, _authCrypt.IsInitialized())); + _bufferQueue.Enqueue(new EncryptableAndCompressiblePacket(packet, _authCrypt.IsInitialized())); } void WorldSocket::HandleAuthSession(WorldPacket & recvPacket) diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h index dbad55fb5..e1bb554d6 100644 --- a/src/server/game/Server/WorldSocket.h +++ b/src/server/game/Server/WorldSocket.h @@ -30,17 +30,21 @@ using boost::asio::ip::tcp; -class EncryptablePacket : public WorldPacket +class EncryptableAndCompressiblePacket : public WorldPacket { public: - EncryptablePacket(WorldPacket const& packet, bool encrypt) : WorldPacket(packet), _encrypt(encrypt) + EncryptableAndCompressiblePacket(WorldPacket const& packet, bool encrypt) : WorldPacket(packet), _encrypt(encrypt) { SocketQueueLink.store(nullptr, std::memory_order_relaxed); } bool NeedsEncryption() const { return _encrypt; } - std::atomic SocketQueueLink; + bool NeedsCompression() const { return GetOpcode() == SMSG_UPDATE_OBJECT && size() > 100; } + + void CompressIfNeeded(); + + std::atomic SocketQueueLink; private: bool _encrypt; @@ -125,7 +129,7 @@ private: MessageBuffer _headerBuffer; MessageBuffer _packetBuffer; - MPSCQueue _bufferQueue; + MPSCQueue _bufferQueue; std::size_t _sendBufferSize; QueryCallbackProcessor _queryProcessor; diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp index 3124551d6..c368be3e5 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp @@ -430,7 +430,7 @@ public: UpdateData data; WorldPacket pkt; go->BuildValuesUpdateBlockForPlayer(&data, i->GetSource()); - data.BuildPacket(&pkt); + data.BuildPacket(pkt); i->GetSource()->GetSession()->SendPacket(&pkt); } } @@ -473,7 +473,7 @@ public: UpdateData data; WorldPacket pkt; go->BuildValuesUpdateBlockForPlayer(&data, i->GetSource()); - data.BuildPacket(&pkt); + data.BuildPacket(pkt); i->GetSource()->GetSession()->SendPacket(&pkt); } } diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index 116b5cd21..04b7aebce 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -438,7 +438,7 @@ class spell_pri_lightwell_renew : public AuraScript UpdateData data; WorldPacket packet; caster->BuildValuesUpdateBlockForPlayer(&data, player); - data.BuildPacket(&packet); + data.BuildPacket(packet); player->SendDirectMessage(&packet); } } From 4bc373b37f149dac41edfbbe9a37fe9088ea34de Mon Sep 17 00:00:00 2001 From: Mike Delago <32778141+michaeldelago@users.noreply.github.com> Date: Fri, 29 Mar 2024 21:35:30 -0400 Subject: [PATCH 2/9] Fix(CI): Don't use PCH on nopch builds (#18627) gha yaml makes me want to scream --- .github/actions/linux-build/action.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/linux-build/action.yml b/.github/actions/linux-build/action.yml index b3edb12ad..3a8fefd77 100644 --- a/.github/actions/linux-build/action.yml +++ b/.github/actions/linux-build/action.yml @@ -100,8 +100,8 @@ runs: -DCMAKE_CXX_COMPILER_LAUNCHER="ccache" \ -DCMAKE_C_COMPILER_LAUNCHER="ccache" \ -DBUILD_TESTING="ON" \ - -DUSE_SCRIPTPCH=${{ inputs.pch && 'ON' || '' }} \ - -DUSE_COREPCH=${{ inputs.pch && 'ON' || '' }} \ + -DUSE_SCRIPTPCH=${{ inputs.pch == 'true' && 'ON' || '' }} \ + -DUSE_COREPCH=${{ inputs.pch == 'true' && 'ON' || '' }} \ ${{ !inputs.pch && '-DNOPCH=true' || '' }} - name: build From 88be6d8150d00d63e48b067a25b510fc8ab3f04c Mon Sep 17 00:00:00 2001 From: Mike Delago <32778141+michaeldelago@users.noreply.github.com> Date: Sat, 30 Mar 2024 08:08:35 -0400 Subject: [PATCH 3/9] fix(ci): ensure module build clones modules (#18631) --- .github/workflows/core_modules_build.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/core_modules_build.yml b/.github/workflows/core_modules_build.yml index 9efe8d293..090ceae92 100644 --- a/.github/workflows/core_modules_build.yml +++ b/.github/workflows/core_modules_build.yml @@ -26,6 +26,11 @@ jobs: ) steps: - uses: actions/checkout@v4 + # This script installs a general list of modules to compile with + # azerothcore. This is useful for ensuring that module compilation + # functionality works. + - name: Checkout modules + run: bash -x ./apps/ci/ci-install-modules.sh - uses: ./.github/actions/linux-build with: CC: clang-15 From a8701735583ec36568e11df0ecb40e8366c341dd Mon Sep 17 00:00:00 2001 From: Dan <83884799+elthehablo@users.noreply.github.com> Date: Sat, 30 Mar 2024 15:31:41 +0100 Subject: [PATCH 4/9] fix(Scripts/BossAI): add optional variable to BossAI class to make sure the boss calls for help (#18630) init --- src/server/game/AI/ScriptedAI/ScriptedCreature.cpp | 8 ++++++++ src/server/game/AI/ScriptedAI/ScriptedCreature.h | 2 ++ .../scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp | 2 +- .../scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp | 2 +- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index d2ceebc54..dbfd88504 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -571,6 +571,7 @@ BossAI::BossAI(Creature* creature, uint32 bossId) : ScriptedAI(creature), summons(creature), _bossId(bossId) { + callForHelpRange = 0.0f; if (instance) SetBoundary(instance->GetBossBoundary(bossId)); @@ -630,6 +631,13 @@ void BossAI::_JustEngagedWith() me->setActive(true); DoZoneInCombat(); ScheduleTasks(); + if (callForHelpRange) + { + ScheduleTimedEvent(0s, [&] + { + me->CallForHelp(callForHelpRange); + }, 2s); + } if (instance) { // bosses do not respawn, check only on enter combat diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h index de69876f6..55a838d24 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h @@ -462,6 +462,8 @@ public: BossAI(Creature* creature, uint32 bossId); ~BossAI() override {} + float callForHelpRange; + InstanceScript* const instance; bool CanRespawn() override; diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp index d495aac0a..4e9b4e9c2 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp @@ -60,6 +60,7 @@ struct boss_high_astromancer_solarian : public BossAI { boss_high_astromancer_solarian(Creature* creature) : BossAI(creature, DATA_ASTROMANCER) { + callForHelpRange = 105.0f; scheduler.SetValidator([this] { return !me->HasUnitState(UNIT_STATE_CASTING); @@ -118,7 +119,6 @@ struct boss_high_astromancer_solarian : public BossAI { Talk(SAY_AGGRO); BossAI::JustEngagedWith(who); - me->CallForHelp(105.0f); me->GetMotionMaster()->Clear(); scheduler.Schedule(3650ms, [this](TaskContext context) diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp index 4c9c32681..19c7feb76 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp @@ -41,6 +41,7 @@ struct boss_void_reaver : public BossAI { boss_void_reaver(Creature* creature) : BossAI(creature, DATA_REAVER) { + callForHelpRange = 105.0f; scheduler.SetValidator([this] { return !me->HasUnitState(UNIT_STATE_CASTING); @@ -82,7 +83,6 @@ struct boss_void_reaver : public BossAI { BossAI::JustEngagedWith(who); Talk(SAY_AGGRO); - me->CallForHelp(105.0f); scheduler.Schedule(10min, [this](TaskContext) { From 844acb481e3b022024a043c5494419ecb14c63fa Mon Sep 17 00:00:00 2001 From: sudlud Date: Sat, 30 Mar 2024 17:39:44 +0100 Subject: [PATCH 5/9] fix(DB/Gameobject): update initial state of some Brazier spawns (#18633) - sniff sql parses were showing both initial states and apparently the wrong one was chosen when updating all Brazier spawns with sniffed values --- data/sql/updates/pending_db_world/rev_1711804492859268400.sql | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1711804492859268400.sql diff --git a/data/sql/updates/pending_db_world/rev_1711804492859268400.sql b/data/sql/updates/pending_db_world/rev_1711804492859268400.sql new file mode 100644 index 000000000..69ee16fe4 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1711804492859268400.sql @@ -0,0 +1,4 @@ +-- update initial state of some Brazier gameobject spawns +UPDATE `gameobject` SET `state` = 1 WHERE (`id` = 174744) AND (`guid` = 15229); +UPDATE `gameobject` SET `state` = 1 WHERE (`id` = 174745) AND (`guid` = 15544); +UPDATE `gameobject` SET `state` = 1 WHERE (`id` = 178247) AND (`guid` = 47873); From 293555f41d57a1521c0cee8096d78e86af15ea36 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 30 Mar 2024 16:40:35 +0000 Subject: [PATCH 6/9] chore(DB): import pending files Referenced commit(s): 844acb481e3b022024a043c5494419ecb14c63fa --- .../rev_1711804492859268400.sql => db_world/2024_03_30_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1711804492859268400.sql => db_world/2024_03_30_00.sql} (87%) diff --git a/data/sql/updates/pending_db_world/rev_1711804492859268400.sql b/data/sql/updates/db_world/2024_03_30_00.sql similarity index 87% rename from data/sql/updates/pending_db_world/rev_1711804492859268400.sql rename to data/sql/updates/db_world/2024_03_30_00.sql index 69ee16fe4..949f335c6 100644 --- a/data/sql/updates/pending_db_world/rev_1711804492859268400.sql +++ b/data/sql/updates/db_world/2024_03_30_00.sql @@ -1,3 +1,4 @@ +-- DB update 2024_03_24_09 -> 2024_03_30_00 -- update initial state of some Brazier gameobject spawns UPDATE `gameobject` SET `state` = 1 WHERE (`id` = 174744) AND (`guid` = 15229); UPDATE `gameobject` SET `state` = 1 WHERE (`id` = 174745) AND (`guid` = 15544); From 61ee67b95d69ba1fba6ba760b9633f3ebb07d3c8 Mon Sep 17 00:00:00 2001 From: sudlud Date: Sat, 30 Mar 2024 22:16:38 +0100 Subject: [PATCH 7/9] fix(CI): correct name suffix of PCH jobs (#18632) --- .github/workflows/core-build-pch.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/core-build-pch.yml b/.github/workflows/core-build-pch.yml index b1dbb304c..ac1cd73aa 100644 --- a/.github/workflows/core-build-pch.yml +++ b/.github/workflows/core-build-pch.yml @@ -33,7 +33,7 @@ jobs: CC: gcc-13 CXX: g++-13 runs-on: ${{ matrix.os }} - name: ${{ matrix.os }}-${{ matrix.compiler.CC }}-nopch + name: ${{ matrix.os }}-${{ matrix.compiler.CC }}-pch if: github.repository == 'azerothcore/azerothcore-wotlk' && !github.event.pull_request.draft steps: - uses: actions/checkout@v4 From a62eef0dcf6bb172278d0fda894c7dde3b03d31e Mon Sep 17 00:00:00 2001 From: Dan <83884799+elthehablo@users.noreply.github.com> Date: Sat, 30 Mar 2024 23:18:09 +0100 Subject: [PATCH 8/9] fix(DB/TheEye): make Thaladred walk (#18629) * init Co-Authored-By: amed80 <8395873+amed80@users.noreply.github.com> * remove walk from script and walkspeed --------- Co-authored-by: amed80 <8395873+amed80@users.noreply.github.com> --- data/sql/updates/pending_db_world/thaladred-movement.sql | 3 +++ src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp | 2 -- 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 data/sql/updates/pending_db_world/thaladred-movement.sql diff --git a/data/sql/updates/pending_db_world/thaladred-movement.sql b/data/sql/updates/pending_db_world/thaladred-movement.sql new file mode 100644 index 000000000..f0b38ed65 --- /dev/null +++ b/data/sql/updates/pending_db_world/thaladred-movement.sql @@ -0,0 +1,3 @@ +-- +UPDATE `creature_template_movement` SET `Chase` = 2 WHERE `CreatureId` = 20064; +UPDATE `creature_template` SET `speed_walk` = 2 WHERE `entry` = 20064; diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index 1cc901044..77aad57b1 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -1009,7 +1009,6 @@ struct npc_thaladred : public ScriptedAI scheduler.CancelAll(); me->SetReactState(REACT_PASSIVE); _hasDied = false; - me->SetWalk(false); } void JustEngagedWith(Unit* /*who*/) override @@ -1018,7 +1017,6 @@ struct npc_thaladred : public ScriptedAI { Talk(SAY_THALADRED_AGGRO); } - me->SetWalk(true); ScheduleTimedEvent(100ms, [&] { DoResetThreatList(); From 64cdb8bdc0220d82e3b6438e361ff57de261e2db Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 30 Mar 2024 22:18:57 +0000 Subject: [PATCH 9/9] chore(DB): import pending files Referenced commit(s): a62eef0dcf6bb172278d0fda894c7dde3b03d31e --- .../thaladred-movement.sql => db_world/2024_03_30_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/thaladred-movement.sql => db_world/2024_03_30_01.sql} (77%) diff --git a/data/sql/updates/pending_db_world/thaladred-movement.sql b/data/sql/updates/db_world/2024_03_30_01.sql similarity index 77% rename from data/sql/updates/pending_db_world/thaladred-movement.sql rename to data/sql/updates/db_world/2024_03_30_01.sql index f0b38ed65..95e7858e9 100644 --- a/data/sql/updates/pending_db_world/thaladred-movement.sql +++ b/data/sql/updates/db_world/2024_03_30_01.sql @@ -1,3 +1,4 @@ +-- DB update 2024_03_30_00 -> 2024_03_30_01 -- UPDATE `creature_template_movement` SET `Chase` = 2 WHERE `CreatureId` = 20064; UPDATE `creature_template` SET `speed_walk` = 2 WHERE `entry` = 20064;