From fba1c068471036364871c5ab5097637d3f37b0be Mon Sep 17 00:00:00 2001 From: dannuic Date: Sat, 25 Apr 2026 01:03:48 -0600 Subject: [PATCH] changed pointer into unique pointer and addressed review concerns --- common/patches/IMessage.h | 10 +++--- common/patches/client_version.cpp | 18 +++++------ common/patches/client_version.h | 2 +- common/patches/titanium.cpp | 19 +++++------ common/patches/titanium.h | 11 ++++--- common/patches/tob.cpp | 15 +++++---- common/patches/tob.h | 9 ++++-- zone/client_version.h | 53 ++++++++++++++++--------------- 8 files changed, 75 insertions(+), 62 deletions(-) diff --git a/common/patches/IMessage.h b/common/patches/IMessage.h index 57ab52286..80bd15501 100644 --- a/common/patches/IMessage.h +++ b/common/patches/IMessage.h @@ -37,12 +37,14 @@ public: virtual ~IMessage() = default; // these two are the basic string message packets - [[nodiscard]] virtual EQApplicationPacket* Simple(uint32_t color, uint32_t id) const = 0; - [[nodiscard]] virtual EQApplicationPacket* Formatted(uint32_t color, uint32_t id, const std::array& args) const = 0; + virtual std::unique_ptr Simple(uint32_t color, uint32_t id) const = 0; + virtual std::unique_ptr Formatted(uint32_t color, uint32_t id, + const std::array& args) const = 0; // These aren't technically messages, but they use the same format and are similar enough to include here - virtual EQApplicationPacket* InterruptSpell(uint32_t message, uint32_t spawn_id, const char* spell_link) const = 0; - virtual EQApplicationPacket* InterruptSpellOther(Mob* sender, uint32_t message, uint32_t spawn_id, + virtual std::unique_ptr InterruptSpell(uint32_t message, uint32_t spawn_id, + const char* spell_link) const = 0; + virtual std::unique_ptr InterruptSpellOther(Mob* sender, uint32_t message, uint32_t spawn_id, const char* name, const char* spell_link) const = 0; }; diff --git a/common/patches/client_version.cpp b/common/patches/client_version.cpp index 20a506899..a4faebf59 100644 --- a/common/patches/client_version.cpp +++ b/common/patches/client_version.cpp @@ -34,31 +34,31 @@ struct ClientComponents { switch (version) { case Version::TOB: - messageComponent = std::make_shared(); + messageComponent = std::make_unique(); break; case Version::RoF2: - messageComponent = std::make_shared(); + messageComponent = std::make_unique(); break; case Version::RoF: - messageComponent = std::make_shared(); + messageComponent = std::make_unique(); break; case Version::UF: - messageComponent = std::make_shared(); + messageComponent = std::make_unique(); break; case Version::SoD: - messageComponent = std::make_shared(); + messageComponent = std::make_unique(); break; case Version::SoF: - messageComponent = std::make_shared(); + messageComponent = std::make_unique(); break; default: - messageComponent = std::make_shared(); + messageComponent = std::make_unique(); break; } } const Version version; - std::shared_ptr messageComponent; + std::unique_ptr messageComponent; }; static const ClientComponents& GetComponents(Version version) @@ -78,7 +78,7 @@ static const ClientComponents& GetComponents(Version version) return patches.at(version); } -const std::shared_ptr& GetMessageComponent(Version version) +const std::unique_ptr& GetMessageComponent(Version version) { return GetComponents(version).messageComponent; } diff --git a/common/patches/client_version.h b/common/patches/client_version.h index 5c1ede856..054cd2a7d 100644 --- a/common/patches/client_version.h +++ b/common/patches/client_version.h @@ -10,4 +10,4 @@ namespace Message { class IMessage; } // store all static functions for the different patches here -const std::shared_ptr& GetMessageComponent(EQ::versions::ClientVersion version); +const std::unique_ptr& GetMessageComponent(EQ::versions::ClientVersion version); diff --git a/common/patches/titanium.cpp b/common/patches/titanium.cpp index 49ead949e..731cc1488 100644 --- a/common/patches/titanium.cpp +++ b/common/patches/titanium.cpp @@ -3922,12 +3922,11 @@ namespace Titanium } /*Titanium*/ namespace Message { - -EQApplicationPacket* Titanium::Simple(uint32_t color, uint32_t id) const +std::unique_ptr Titanium::Simple(uint32_t color, uint32_t id) const { uint32_t string_id = ResolveID(id); if (string_id > 0) { - auto outapp = new EQApplicationPacket(OP_SimpleMessage, sizeof(SimpleMessage_Struct)); + auto outapp = std::make_unique(OP_SimpleMessage, sizeof(SimpleMessage_Struct)); auto* sms = reinterpret_cast(outapp->pBuffer); sms->string_id = string_id; sms->color = color; @@ -3939,7 +3938,7 @@ EQApplicationPacket* Titanium::Simple(uint32_t color, uint32_t id) const return nullptr; } -EQApplicationPacket* Titanium::Formatted( +std::unique_ptr Titanium::Formatted( uint32_t color, uint32_t id, const std::array& args) const { uint32_t string_id = ResolveID(id); @@ -3961,15 +3960,16 @@ EQApplicationPacket* Titanium::Formatted( buf.WriteUInt8(0); - return new EQApplicationPacket(OP_FormattedMessage, std::move(buf)); + return std::make_unique(OP_FormattedMessage, std::move(buf)); } return nullptr; } -EQApplicationPacket* Titanium::InterruptSpell(uint32_t message, uint32_t spawn_id, const char* spell_link) const +std::unique_ptr Titanium::InterruptSpell(uint32_t message, uint32_t spawn_id, + const char* spell_link) const { - auto outapp = new EQApplicationPacket(OP_InterruptCast, sizeof(InterruptCast_Struct)); + auto outapp = std::make_unique(OP_InterruptCast, sizeof(InterruptCast_Struct)); auto ic = reinterpret_cast(outapp->pBuffer); ic->messageid = ResolveID(message); ic->spawnid = spawn_id; @@ -3978,10 +3978,11 @@ EQApplicationPacket* Titanium::InterruptSpell(uint32_t message, uint32_t spawn_i return outapp; } -EQApplicationPacket* Titanium::InterruptSpellOther(Mob* sender, uint32_t message, uint32_t spawn_id, const char* name, +std::unique_ptr Titanium::InterruptSpellOther(Mob* sender, uint32_t message, uint32_t spawn_id, + const char* name, const char* spell_link) const { - auto outapp = new EQApplicationPacket(OP_InterruptCast, sizeof(InterruptCast_Struct) + strlen(name) + 1); + auto outapp = std::make_unique(OP_InterruptCast, sizeof(InterruptCast_Struct) + strlen(name) + 1); auto ic = reinterpret_cast(outapp->pBuffer); ic->messageid = ResolveID(message); ic->spawnid = spawn_id; diff --git a/common/patches/titanium.h b/common/patches/titanium.h index 1d96475a2..e31c4ef63 100644 --- a/common/patches/titanium.h +++ b/common/patches/titanium.h @@ -59,11 +59,14 @@ public: Titanium() = default; ~Titanium() override = default; - [[nodiscard]] EQApplicationPacket* Simple(uint32_t color, uint32_t id) const override; - [[nodiscard]] EQApplicationPacket* Formatted(uint32_t color, uint32_t id, const std::array& args) const override; + std::unique_ptr Simple(uint32_t color, uint32_t id) const override; + std::unique_ptr Formatted(uint32_t color, uint32_t id, + const std::array& args) const override; - EQApplicationPacket* InterruptSpell(uint32_t message, uint32_t spawn_id, const char* spell_link) const override; - EQApplicationPacket* InterruptSpellOther(Mob* sender, uint32_t message, uint32_t spawn_id, const char* name, + std::unique_ptr InterruptSpell(uint32_t message, uint32_t spawn_id, + const char* spell_link) const override; + std::unique_ptr InterruptSpellOther(Mob* sender, uint32_t message, uint32_t spawn_id, + const char* name, const char* spell_link) const override; protected: diff --git a/common/patches/tob.cpp b/common/patches/tob.cpp index 2b781032c..41b014448 100644 --- a/common/patches/tob.cpp +++ b/common/patches/tob.cpp @@ -5634,7 +5634,8 @@ void TOB::ResolveArguments(uint32_t id, std::array& args) const } } -EQApplicationPacket* TOB::Formatted(uint32_t color, uint32_t id, const std::array& args) const +std::unique_ptr TOB::Formatted(uint32_t color, uint32_t id, + const std::array& args) const { uint32_t string_id = ResolveID(id); if (string_id > 0) { @@ -5660,15 +5661,16 @@ EQApplicationPacket* TOB::Formatted(uint32_t color, uint32_t id, const std::arra buffer.WriteUInt32(0); } - return new EQApplicationPacket(OP_FormattedMessage, std::move(buffer)); + return std::make_unique(OP_FormattedMessage, std::move(buffer)); } return nullptr; } -EQApplicationPacket* TOB::InterruptSpell(uint32_t message, uint32_t spawn_id, const char* spell_link) const +std::unique_ptr TOB::InterruptSpell(uint32_t message, uint32_t spawn_id, + const char* spell_link) const { - auto outapp = new EQApplicationPacket(OP_InterruptCast, sizeof(InterruptCast_Struct) + strlen(spell_link) + 1); + auto outapp = std::make_unique(OP_InterruptCast, sizeof(InterruptCast_Struct) + strlen(spell_link) + 1); auto ic = reinterpret_cast(outapp->pBuffer); ic->messageid = ResolveID(message); ic->spawnid = spawn_id; @@ -5678,10 +5680,11 @@ EQApplicationPacket* TOB::InterruptSpell(uint32_t message, uint32_t spawn_id, co return outapp; } -EQApplicationPacket* TOB::InterruptSpellOther(Mob* sender, uint32_t message, uint32_t spawn_id, const char* name, +std::unique_ptr TOB::InterruptSpellOther(Mob* sender, uint32_t message, uint32_t spawn_id, + const char* name, const char* spell_link) const { - auto outapp = new EQApplicationPacket(OP_InterruptCast, + auto outapp = std::make_unique(OP_InterruptCast, sizeof(InterruptCast_Struct) + strlen(name) + strlen(spell_link) + 2); auto ic = reinterpret_cast(outapp->pBuffer); ic->messageid = ResolveID(message); diff --git a/common/patches/tob.h b/common/patches/tob.h index c3cc9e2c9..39eb708cf 100644 --- a/common/patches/tob.h +++ b/common/patches/tob.h @@ -42,10 +42,13 @@ public: TOB() {} ~TOB() override {} - [[nodiscard]] EQApplicationPacket* Formatted(uint32_t color, uint32_t id, const std::array& args) const override; + std::unique_ptr Formatted(uint32_t color, uint32_t id, + const std::array& args) const override; - EQApplicationPacket* InterruptSpell(uint32_t message, uint32_t spawn_id, const char* spell_link) const override; - EQApplicationPacket* InterruptSpellOther(Mob* sender, uint32_t message, uint32_t spawn_id, const char* name, const char* spell_link) const override; + std::unique_ptr InterruptSpell(uint32_t message, uint32_t spawn_id, + const char* spell_link) const override; + std::unique_ptr InterruptSpellOther(Mob* sender, uint32_t message, uint32_t spawn_id, + const char* name, const char* spell_link) const override; protected: [[nodiscard]] uint32_t ResolveID(uint32_t id) const override; diff --git a/zone/client_version.h b/zone/client_version.h index 595f9bad9..66b6d77f7 100644 --- a/zone/client_version.h +++ b/zone/client_version.h @@ -21,11 +21,9 @@ template static void QueuePacket(Client* c, Fun fun, Obj* obj, Args&&... args) { static_assert(std::is_member_function_pointer_v); - EQApplicationPacket* app = std::invoke(fun, obj, std::forward(args)...); - if (app != nullptr) { - c->QueuePacket(app); - delete app; - } + std::unique_ptr app = std::invoke(fun, obj, std::forward(args)...); + if (app) + c->QueuePacket(app.get()); } // packet generator queue functions @@ -35,23 +33,24 @@ static auto QueueClients(Mob* sender, bool ignore_sender = false, bool ackreq = std::function component_getter, Args&&... args) { static_assert(std::is_member_function_pointer_v && "Function is required to be a member function"); - std::unordered_map build_packets; + std::vector>> build_packets; std::unordered_map client_list = entity_list.GetClientList(); for (auto [_, ent] : client_list) { if (!ignore_sender || ent != sender) { - auto [packet, _] = build_packets.try_emplace( - ent->ClientVersion(), - std::invoke(fun, component_getter(ent), std::forward(args)...)); + auto packet_it = std::find_if(build_packets.begin(), build_packets.end(), + [version = ent->GetClientVersion()](const auto& build_packet) { + return build_packet.first == version; + }); - if (packet->second != nullptr) - ent->QueuePacket(packet->second, ackreq, Client::CLIENT_CONNECTED); + if (packet_it == build_packets.end()) + packet_it = build_packets.emplace(build_packets.end(), ent->ClientVersion(), + std::invoke(fun, component_getter(ent), std::forward(args)...)); + + if (packet_it->second != nullptr) + ent->QueuePacket(packet_it->second.get(), ackreq, Client::CLIENT_CONNECTED); } } - - for (auto [_, packet] : build_packets) - if (packet != nullptr) - delete packet; }; } @@ -70,7 +69,7 @@ static auto QueueCloseClients( QueueClients(sender, ignore_sender, is_ack_required)(fun, component_getter, std::forward(args)...); } else { float distance_squared = distance * distance; - std::unordered_map build_packets; + std::vector>> build_packets; for (auto& [_, mob] : sender->GetCloseMobList(distance)) { if (mob && mob->IsClient()) { @@ -79,20 +78,22 @@ static auto QueueCloseClients( && client != skipped_mob && DistanceSquared(client->GetPosition(), sender->GetPosition()) < distance_squared && client->Connected() - && client->ShouldGetPacket(sender, filter)) { - auto [packet, _] = build_packets.try_emplace( - client->ClientVersion(), - std::invoke(fun, component_getter(client), std::forward(args)...)); + && client->ShouldGetPacket(sender, filter)) + { + auto packet_it = std::find_if(build_packets.begin(), build_packets.end(), + [version = client->GetClientVersion()](const auto& build_packet) { + return build_packet.first == version; + }); - if (packet->second != nullptr) - client->QueuePacket(packet->second, is_ack_required, Client::CLIENT_CONNECTED); + if (packet_it == build_packets.end()) + packet_it = build_packets.emplace(build_packets.end(), client->ClientVersion(), + std::invoke(fun, component_getter(client), std::forward(args)...)); + + if (packet_it->second != nullptr) + client->QueuePacket(packet_it->second.get(), is_ack_required, Client::CLIENT_CONNECTED); } } } - - for (auto [_, packet] : build_packets) - if (packet != nullptr) - delete packet;; } }; }