diff --git a/antigo/include/antigo/Context.h b/antigo/include/antigo/Context.h index 81df6b3a99..cf7eb00da1 100644 --- a/antigo/include/antigo/Context.h +++ b/antigo/include/antigo/Context.h @@ -39,7 +39,7 @@ class OnstackContext void AddLambdaWithOwned(std::function printerFunc); [[nodiscard]] impl::ReferencedValueGuard AddLambdaWithRef(std::function printerFunc); - ResolvedContext Resolve() const; + [[nodiscard]] ResolvedContext Resolve() const; void Orphan() const; // XXX: move to some common headedr? diff --git a/skymp5-server/cpp/server_guest_lib/EvaluateTemplate.h b/skymp5-server/cpp/server_guest_lib/EvaluateTemplate.h index 1912ac1be7..09732d7de1 100644 --- a/skymp5-server/cpp/server_guest_lib/EvaluateTemplate.h +++ b/skymp5-server/cpp/server_guest_lib/EvaluateTemplate.h @@ -57,6 +57,10 @@ auto EvaluateTemplate(WorldState* worldState, uint32_t baseId, detailedLog << "Variable npcData: baseTemplate=" << npcData.baseTemplate << ", templateDataFlags=" << npcData.templateDataFlags << "\n"; + ctx.AddLambdaWithOwned([s = detailedLog.str()] { + return s; + }); + try { if (npcData.baseTemplate == 0) { return callback(npcLookupResult, npcData); diff --git a/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp b/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp index 355033c1ef..4aeae3c816 100644 --- a/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp +++ b/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp @@ -1847,7 +1847,7 @@ std::vector GetOutfitObjects( auto result = npcLookupRes.ToGlobalId(npcData.defaultOutfitId); if (result == 0) { ctx.AddMessage("evaluated NPC template - outfitId is 0"); - throw std::runtime_error("failed NPC template eval"); // this will make context log everything + ctx.Orphan(); } return result; }); @@ -1921,14 +1921,23 @@ void MpObjectReference::EnsureBaseContainerAdded(espm::Loader& espm) return; } - ctx.AddMessage("next: AsActor(), templateChain, lookupRes"); + ctx.AddMessage("next: AsActor(), templateChain, lookupRes.rec"); auto actor = AsActor(); + ctx.AddPtr(actor); const std::vector kEmptyTemplateChain; const std::vector& templateChain = actor ? actor->GetTemplateChain() : kEmptyTemplateChain; + ctx.AddLambdaWithOwned([templateChain]{ + std::string s = "[\n"; + for (const auto& elt : templateChain) { + s += " " + elt.ToString() + "\n"; + } + return s + "]"; + }); auto lookupRes = espm.GetBrowser().LookupById(GetBaseId()); + ctx.AddPtr(lookupRes.rec); std::map itemsToAdd, itemsToEquip;