From 9132f88824aacec1fbbe990836e97a9104b52150 Mon Sep 17 00:00:00 2001 From: Leonid Pospelov Date: Sat, 28 Dec 2024 21:09:34 +0500 Subject: [PATCH 01/14] Update MpObjectReference.cpp --- skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp b/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp index 605855f3f2..7bf05e1aab 100644 --- a/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp +++ b/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp @@ -1138,7 +1138,7 @@ void MpObjectReference::ApplyChangeForm(const MpChangeForm& changeForm) { if (pImpl->setPropertyCalled) { GetParent()->logger->critical("ApplyChangeForm called after SetProperty"); - std::terminate(); + //std::terminate(); } blockSaving = true; From ce03a4e7211f977a19cce7f0ef8d7c203afde4d0 Mon Sep 17 00:00:00 2001 From: Leonid Pospelov Date: Fri, 14 Feb 2025 16:03:04 +0300 Subject: [PATCH 02/14] Update MpObjectReference.cpp --- .../cpp/server_guest_lib/MpObjectReference.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp b/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp index 605855f3f2..3862617efa 100644 --- a/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp +++ b/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp @@ -1599,10 +1599,20 @@ bool MpObjectReference::CheckIfObjectCanStartOccupyThis( } if (this->occupant == &activationSource) { - spdlog::info("MpObjectReference::ProcessActivate {:x} - occupant is " + auto base = loader.GetBrowser().LookupById(GetBaseId()); + auto t = base.rec->GetType(); + auto actorActivator = activationSource.AsActor(); + if (t == "FURN" && actorActivator) { + spdlog::info("MpObjectReference::ProcessActivate {:x} - occupant is " + "already this object (activationSource = {:x}). Blocking because it's FURN", + GetFormId(), activationSource.GetFormId()); + return false; + } else { + spdlog::info("MpObjectReference::ProcessActivate {:x} - occupant is " "already this object (activationSource = {:x})", GetFormId(), activationSource.GetFormId()); - return true; + return true; + } } spdlog::info("MpObjectReference::ProcessActivate {:x} - occupant is " From fa43b6ee996635dc8e14ea7f35005b23e906f432 Mon Sep 17 00:00:00 2001 From: Leonid Pospelov Date: Fri, 14 Feb 2025 16:28:16 +0300 Subject: [PATCH 03/14] Update MpObjectReference.cpp --- skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp b/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp index 3862617efa..0e1647e06a 100644 --- a/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp +++ b/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp @@ -1599,6 +1599,7 @@ bool MpObjectReference::CheckIfObjectCanStartOccupyThis( } if (this->occupant == &activationSource) { + auto& loader = GetParent()->GetEspm(); auto base = loader.GetBrowser().LookupById(GetBaseId()); auto t = base.rec->GetType(); auto actorActivator = activationSource.AsActor(); From c9ce22dbc3c5188166aab6c59cb40c5fc94ad076 Mon Sep 17 00:00:00 2001 From: Leonid Pospelov Date: Fri, 14 Feb 2025 14:55:06 +0000 Subject: [PATCH 04/14] add-clientside --- skymp5-client/src/services/services/remoteServer.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/skymp5-client/src/services/services/remoteServer.ts b/skymp5-client/src/services/services/remoteServer.ts index 30ccf59e41..ee662d3d1e 100644 --- a/skymp5-client/src/services/services/remoteServer.ts +++ b/skymp5-client/src/services/services/remoteServer.ts @@ -218,12 +218,14 @@ export class RemoteServer extends ClientListener { } }; - this.controller.emitter.emit("sendMessage", { - message: message, - reliability: "reliable" - }); + Utility.waitMenuMode(1).then(() => { + this.controller.emitter.emit("sendMessage", { + message: message, + reliability: "reliable" + }); - logTrace(this, "onOpenContainerMesage - sent ActivateMessage", message); + logTrace(this, "onOpenContainerMesage - sent ActivateMessage", message); + }); })(); }); } From 23ad5c39c2291e4c0c5f5d5d45f02cb8fef4450a Mon Sep 17 00:00:00 2001 From: Leonid Pospelov Date: Fri, 14 Feb 2025 14:56:34 +0000 Subject: [PATCH 05/14] . --- .../server_guest_lib/MpObjectReference.cpp | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp b/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp index 51913c62b9..0d96c086c0 100644 --- a/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp +++ b/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp @@ -1138,7 +1138,7 @@ void MpObjectReference::ApplyChangeForm(const MpChangeForm& changeForm) { if (pImpl->setPropertyCalled) { GetParent()->logger->critical("ApplyChangeForm called after SetProperty"); - //std::terminate(); + std::terminate(); } blockSaving = true; @@ -1605,13 +1605,14 @@ bool MpObjectReference::CheckIfObjectCanStartOccupyThis( auto actorActivator = activationSource.AsActor(); if (t == "FURN" && actorActivator) { spdlog::info("MpObjectReference::ProcessActivate {:x} - occupant is " - "already this object (activationSource = {:x}). Blocking because it's FURN", - GetFormId(), activationSource.GetFormId()); + "already this object (activationSource = {:x}). Blocking " + "because it's FURN", + GetFormId(), activationSource.GetFormId()); return false; } else { - spdlog::info("MpObjectReference::ProcessActivate {:x} - occupant is " - "already this object (activationSource = {:x})", - GetFormId(), activationSource.GetFormId()); + spdlog::info("MpObjectReference::ProcessActivate {:x} - occupant is " + "already this object (activationSource = {:x})", + GetFormId(), activationSource.GetFormId()); return true; } } @@ -1784,10 +1785,9 @@ void MpObjectReference::SendInventoryUpdate() if (actor) { std::string msg; msg += Networking::MinPacketId; - msg += nlohmann::json{ - { "inventory", actor->GetInventory().ToJson() }, - { "type", "setInventory" } - }.dump(); + msg += nlohmann::json{ { "inventory", actor->GetInventory().ToJson() }, + { "type", "setInventory" } } + .dump(); actor->SendToUserDeferred(msg.data(), msg.size(), true, kChannelSetInventory, true); } From deea7dcbcb4cda0d725e5802e1dd360b2d5c9ea0 Mon Sep 17 00:00:00 2001 From: Leonid Pospelov Date: Fri, 14 Feb 2025 15:19:18 +0000 Subject: [PATCH 06/14] . From a45548a56e259dde7b122155a9ed8d839222c8ee Mon Sep 17 00:00:00 2001 From: Leonid Pospelov Date: Fri, 14 Feb 2025 17:43:34 +0000 Subject: [PATCH 07/14] . --- skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp b/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp index 0d96c086c0..ff1d206b83 100644 --- a/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp +++ b/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp @@ -1785,9 +1785,10 @@ void MpObjectReference::SendInventoryUpdate() if (actor) { std::string msg; msg += Networking::MinPacketId; - msg += nlohmann::json{ { "inventory", actor->GetInventory().ToJson() }, - { "type", "setInventory" } } - .dump(); + msg += nlohmann::json{ + { "inventory", actor->GetInventory().ToJson() }, + { "type", "setInventory" } + }.dump(); actor->SendToUserDeferred(msg.data(), msg.size(), true, kChannelSetInventory, true); } From f8d75d8afb2778c1be4cb74c6061ae0b19f30a2b Mon Sep 17 00:00:00 2001 From: Leonid Pospelov Date: Fri, 14 Feb 2025 18:33:12 +0000 Subject: [PATCH 08/14] fix containers --- skymp5-client/src/services/services/remoteServer.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/skymp5-client/src/services/services/remoteServer.ts b/skymp5-client/src/services/services/remoteServer.ts index ee662d3d1e..93f83ca968 100644 --- a/skymp5-client/src/services/services/remoteServer.ts +++ b/skymp5-client/src/services/services/remoteServer.ts @@ -186,12 +186,15 @@ export class RemoteServer extends ClientListener { let functionChecker: (() => boolean) | null = null; let factName = ""; + let delaySeconds = -1.0; if (baseType === FormType.Container) { functionChecker = () => Ui.isMenuOpen("ContainerMenu"); factName = "'ContainerMenu open'"; + delaySeconds = 0.0; } else if (baseType === FormType.Furniture) { functionChecker = () => !!Game.getPlayer()?.getFurnitureReference(); factName = "'getFurnitureReference not null'"; + delaySeconds = 1.0; } if (functionChecker === null) { @@ -218,7 +221,9 @@ export class RemoteServer extends ClientListener { } }; - Utility.waitMenuMode(1).then(() => { + logTrace(this, "onOpenContainerMesage - waiting ", delaySeconds, " seconds before sending ActivateMessage"); + + Utility.waitMenuMode(delaySeconds).then(() => { this.controller.emitter.emit("sendMessage", { message: message, reliability: "reliable" From e0958af1a3e38809c5903aa837f8d38dc8694625 Mon Sep 17 00:00:00 2001 From: Leonid Pospelov Date: Fri, 14 Feb 2025 18:35:48 +0000 Subject: [PATCH 09/14] . --- skymp5-client/src/services/services/remoteServer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skymp5-client/src/services/services/remoteServer.ts b/skymp5-client/src/services/services/remoteServer.ts index 93f83ca968..dacce8fa40 100644 --- a/skymp5-client/src/services/services/remoteServer.ts +++ b/skymp5-client/src/services/services/remoteServer.ts @@ -221,7 +221,7 @@ export class RemoteServer extends ClientListener { } }; - logTrace(this, "onOpenContainerMesage - waiting ", delaySeconds, " seconds before sending ActivateMessage"); + logTrace(this, "onOpenContainerMesage - waiting", delaySeconds, "seconds before sending ActivateMessage"); Utility.waitMenuMode(delaySeconds).then(() => { this.controller.emitter.emit("sendMessage", { From 9676234d6579bd4e8320b7a2a6764fdd99604bf4 Mon Sep 17 00:00:00 2001 From: Leonid Pospelov Date: Fri, 14 Feb 2025 19:06:44 +0000 Subject: [PATCH 10/14] auto de-occupy on disable --- .../cpp/server_guest_lib/MpActor.cpp | 25 +++++++- skymp5-server/cpp/server_guest_lib/MpActor.h | 14 ++++- .../server_guest_lib/MpObjectReference.cpp | 63 ++++++++++++++++--- .../cpp/server_guest_lib/MpObjectReference.h | 2 + 4 files changed, 93 insertions(+), 11 deletions(-) diff --git a/skymp5-server/cpp/server_guest_lib/MpActor.cpp b/skymp5-server/cpp/server_guest_lib/MpActor.cpp index 79d2a1da0f..29fe0ee48e 100644 --- a/skymp5-server/cpp/server_guest_lib/MpActor.cpp +++ b/skymp5-server/cpp/server_guest_lib/MpActor.cpp @@ -44,8 +44,11 @@ struct MpActor::Impl { - std::map> snippetPromises; + // TODO: consider optimizing data structure and/or general refactoring std::set> destroyEventSinks; + std::set> disableEventSinks; + + std::map> snippetPromises; uint32_t snippetIndex = 0; uint32_t respawnTimerIndex = 0; bool isRespawning = false; @@ -374,6 +377,10 @@ void MpActor::Disable() return; } + for (auto& sink : pImpl->disableEventSinks) { + sink->BeforeDisable(*this); + } + MpObjectReference::Disable(); for (auto [snippetIdx, promise] : pImpl->snippetPromises) { @@ -503,11 +510,22 @@ void MpActor::AddEventSink(std::shared_ptr sink) pImpl->destroyEventSinks.insert(sink); } -void MpActor::RemoveEventSink(std::shared_ptr sink) +void MpActor::RemoveAllDestroyEventSinks( + std::shared_ptr sink) { pImpl->destroyEventSinks.erase(sink); } +void MpActor::AddEventSink(std::shared_ptr sink) +{ + pImpl->disableEventSinks.insert(sink); +} + +void MpActor::RemoveEventSink(std::shared_ptr sink) +{ + pImpl->disableEventSinks.erase(sink); +} + MpChangeForm MpActor::GetChangeForm() const { auto res = MpObjectReference::GetChangeForm(); @@ -1103,8 +1121,9 @@ void MpActor::ModifyActorValuePercentage(espm::ActorValue av, void MpActor::BeforeDestroy() { - for (auto& sink : pImpl->destroyEventSinks) + for (auto& sink : pImpl->destroyEventSinks) { sink->BeforeDestroy(*this); + } MpObjectReference::BeforeDestroy(); diff --git a/skymp5-server/cpp/server_guest_lib/MpActor.h b/skymp5-server/cpp/server_guest_lib/MpActor.h index 775f0a9468..d8f00b341a 100644 --- a/skymp5-server/cpp/server_guest_lib/MpActor.h +++ b/skymp5-server/cpp/server_guest_lib/MpActor.h @@ -74,6 +74,8 @@ class MpActor : public MpObjectReference [[nodiscard]] bool OnEquip(uint32_t baseId); + // TODO: consider removing the entire DestroyEventSink feature because it's + // only used in unit tests class DestroyEventSink { public: @@ -82,7 +84,17 @@ class MpActor : public MpObjectReference }; void AddEventSink(std::shared_ptr sink); - void RemoveEventSink(std::shared_ptr sink); + void RemoveAllEventSink(std::shared_ptr sink); + + class DisableEventSink + { + public: + virtual ~DisableEventSink() = default; + virtual void BeforeDisable(MpActor& actor) = 0; + }; + + void AddEventSink(std::shared_ptr sink); + void RemoveEventSink(std::shared_ptr sink); MpChangeForm GetChangeForm() const override; void ApplyChangeForm(const MpChangeForm& changeForm) override; diff --git a/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp b/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp index ff1d206b83..1ae277ed09 100644 --- a/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp +++ b/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp @@ -72,6 +72,10 @@ UpdatePropertyMessage MpObjectReference::PreparePropertyMessage( return res; } +// TODO: de-duplicate code of +// OccupantDisableEventSink/OccupantDisableEventSink, the only difference is +// base classes + class OccupantDestroyEventSink : public MpActor::DestroyEventSink { public: @@ -85,8 +89,44 @@ class OccupantDestroyEventSink : public MpActor::DestroyEventSink void BeforeDestroy(MpActor& actor) override { - if (!RefStillValid()) + if (!RefStillValid()) { return; + } + + if (untrustedRefPtr->occupant == &actor) { + untrustedRefPtr->SetOpen(false); + untrustedRefPtr->occupant = nullptr; + } + } + +private: + bool RefStillValid() const + { + return untrustedRefPtr == wst.LookupFormById(refId).get(); + } + + WorldState& wst; + MpObjectReference* const untrustedRefPtr; + const uint32_t refId; +}; + +class OccupantDisableEventSink : public MpActor::DisableEventSink +{ +public: + OccupantDisableEventSink(WorldState& wst_, + MpObjectReference* untrustedRefPtr_) + : wst(wst_) + , untrustedRefPtr(untrustedRefPtr_) + , refId(untrustedRefPtr_->GetFormId()) + { + } + + void BeforeDisable(MpActor& actor) override + { + if (!RefStillValid()) { + return; + } + if (untrustedRefPtr->occupant == &actor) { untrustedRefPtr->SetOpen(false); untrustedRefPtr->occupant = nullptr; @@ -1455,6 +1495,7 @@ void MpObjectReference::ProcessActivateNormal( if (CheckIfObjectCanStartOccupyThis(activationSource, kOccupationReach)) { if (this->occupant) { this->occupant->RemoveEventSink(this->occupantDestroySink); + this->occupant->RemoveEventSink(this->occupantDisableSink); } SetOpen(true); actorActivator->SendToUser( @@ -1466,7 +1507,11 @@ void MpObjectReference::ProcessActivateNormal( this->occupantDestroySink.reset( new OccupantDestroyEventSink(*GetParent(), this)); - this->occupant->AddEventSink(occupantDestroySink); + this->occupant->AddEventSink(this->occupantDestroySink); + + this->occupantDisableSink.reset( + new OccupantDisableEventSink(*GetParent(), this)); + this->occupant->AddEventSink(this->occupantDisableSink); } } else if (t == espm::ACTI::kType && actorActivator) { // SendOpenContainer being used to activate the object @@ -1479,6 +1524,7 @@ void MpObjectReference::ProcessActivateNormal( if (CheckIfObjectCanStartOccupyThis(activationSource, kOccupationReach)) { if (this->occupant) { this->occupant->RemoveEventSink(this->occupantDestroySink); + this->occupant->RemoveEventSink(this->occupantDisableSink); } // SendOpenContainer being used to activate the object @@ -1489,7 +1535,11 @@ void MpObjectReference::ProcessActivateNormal( this->occupantDestroySink.reset( new OccupantDestroyEventSink(*GetParent(), this)); - this->occupant->AddEventSink(occupantDestroySink); + this->occupant->AddEventSink(this->occupantDestroySink); + + this->occupantDisableSink.reset( + new OccupantDisableEventSink(*GetParent(), this)); + this->occupant->AddEventSink(this->occupantDisableSink); } } } @@ -1785,10 +1835,9 @@ void MpObjectReference::SendInventoryUpdate() if (actor) { std::string msg; msg += Networking::MinPacketId; - msg += nlohmann::json{ - { "inventory", actor->GetInventory().ToJson() }, - { "type", "setInventory" } - }.dump(); + msg += nlohmann::json{ { "inventory", actor->GetInventory().ToJson() }, + { "type", "setInventory" } } + .dump(); actor->SendToUserDeferred(msg.data(), msg.size(), true, kChannelSetInventory, true); } diff --git a/skymp5-server/cpp/server_guest_lib/MpObjectReference.h b/skymp5-server/cpp/server_guest_lib/MpObjectReference.h index 87761b3ca7..2ea49fb5d7 100644 --- a/skymp5-server/cpp/server_guest_lib/MpObjectReference.h +++ b/skymp5-server/cpp/server_guest_lib/MpObjectReference.h @@ -78,6 +78,7 @@ class MpObjectReference , protected ChangeFormGuard { friend class OccupantDestroyEventSink; + friend class OccupantDisableEventSink; public: static const char* Type() { return "ObjectReference"; } @@ -252,6 +253,7 @@ class MpObjectReference uint32_t baseId = 0; MpActor* occupant = nullptr; std::shared_ptr occupantDestroySink; + std::shared_ptr occupantDisableSink; std::optional relootTimeOverride; std::unique_ptr chanceNoneOverride; bool activationBlocked = false; From c9a7af04c01113f02bfa03a5b9a1bddb43ce4147 Mon Sep 17 00:00:00 2001 From: Leonid Pospelov Date: Fri, 14 Feb 2025 19:07:32 +0000 Subject: [PATCH 11/14] repair formatting --- skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp b/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp index 1ae277ed09..90a18a837b 100644 --- a/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp +++ b/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp @@ -1835,9 +1835,10 @@ void MpObjectReference::SendInventoryUpdate() if (actor) { std::string msg; msg += Networking::MinPacketId; - msg += nlohmann::json{ { "inventory", actor->GetInventory().ToJson() }, - { "type", "setInventory" } } - .dump(); + msg += nlohmann::json{ + { "inventory", actor->GetInventory().ToJson() }, + { "type", "setInventory" } + }.dump(); actor->SendToUserDeferred(msg.data(), msg.size(), true, kChannelSetInventory, true); } From 4de75e94cf45ebbe1e44103c0bdc36cf8b47eda5 Mon Sep 17 00:00:00 2001 From: Leonid Pospelov Date: Fri, 14 Feb 2025 20:24:20 +0000 Subject: [PATCH 12/14] . --- skymp5-server/cpp/server_guest_lib/MpObjectReference.h | 1 + 1 file changed, 1 insertion(+) diff --git a/skymp5-server/cpp/server_guest_lib/MpObjectReference.h b/skymp5-server/cpp/server_guest_lib/MpObjectReference.h index 2ea49fb5d7..03a812df78 100644 --- a/skymp5-server/cpp/server_guest_lib/MpObjectReference.h +++ b/skymp5-server/cpp/server_guest_lib/MpObjectReference.h @@ -39,6 +39,7 @@ struct GridPosInfo class MpActor; class WorldState; class OccupantDestroyEventSink; +class OccupantDisableEventSink; class FormCallbacks; From 0ea87829445cd51c5e5719ba19fe96e2a5377fc0 Mon Sep 17 00:00:00 2001 From: Leonid Pospelov Date: Fri, 14 Feb 2025 20:38:28 +0000 Subject: [PATCH 13/14] . --- skymp5-server/cpp/server_guest_lib/MpActor.cpp | 3 +-- skymp5-server/cpp/server_guest_lib/MpActor.h | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/skymp5-server/cpp/server_guest_lib/MpActor.cpp b/skymp5-server/cpp/server_guest_lib/MpActor.cpp index 29fe0ee48e..2127e8786c 100644 --- a/skymp5-server/cpp/server_guest_lib/MpActor.cpp +++ b/skymp5-server/cpp/server_guest_lib/MpActor.cpp @@ -510,8 +510,7 @@ void MpActor::AddEventSink(std::shared_ptr sink) pImpl->destroyEventSinks.insert(sink); } -void MpActor::RemoveAllDestroyEventSinks( - std::shared_ptr sink) +void MpActor::RemoveEventSink(std::shared_ptr sink) { pImpl->destroyEventSinks.erase(sink); } diff --git a/skymp5-server/cpp/server_guest_lib/MpActor.h b/skymp5-server/cpp/server_guest_lib/MpActor.h index d8f00b341a..205d9f104d 100644 --- a/skymp5-server/cpp/server_guest_lib/MpActor.h +++ b/skymp5-server/cpp/server_guest_lib/MpActor.h @@ -84,7 +84,7 @@ class MpActor : public MpObjectReference }; void AddEventSink(std::shared_ptr sink); - void RemoveAllEventSink(std::shared_ptr sink); + void RemoveEventSink(std::shared_ptr sink); class DisableEventSink { From 07f9b88400b0c48b1378d7cbc90b2b24f54844c3 Mon Sep 17 00:00:00 2001 From: Leonid Pospelov Date: Fri, 14 Feb 2025 20:46:57 +0000 Subject: [PATCH 14/14] . --- skymp5-server/cpp/server_guest_lib/MpActor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/skymp5-server/cpp/server_guest_lib/MpActor.cpp b/skymp5-server/cpp/server_guest_lib/MpActor.cpp index 2127e8786c..7931fea936 100644 --- a/skymp5-server/cpp/server_guest_lib/MpActor.cpp +++ b/skymp5-server/cpp/server_guest_lib/MpActor.cpp @@ -515,12 +515,12 @@ void MpActor::RemoveEventSink(std::shared_ptr sink) pImpl->destroyEventSinks.erase(sink); } -void MpActor::AddEventSink(std::shared_ptr sink) +void MpActor::AddEventSink(std::shared_ptr sink) { pImpl->disableEventSinks.insert(sink); } -void MpActor::RemoveEventSink(std::shared_ptr sink) +void MpActor::RemoveEventSink(std::shared_ptr sink) { pImpl->disableEventSinks.erase(sink); }