From 2ae562f39ba057919c4124e9d6b516a253019c96 Mon Sep 17 00:00:00 2001 From: Kenzzer Date: Wed, 5 Mar 2025 13:57:02 +0100 Subject: [PATCH 1/3] Fix erronous iterator erasure --- extension/serialrefresher.cpp | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/extension/serialrefresher.cpp b/extension/serialrefresher.cpp index fbc2bf2..7ecd207 100644 --- a/extension/serialrefresher.cpp +++ b/extension/serialrefresher.cpp @@ -1,4 +1,5 @@ -#include "serialrefresher.h" +#include "serialrefresher.h" +#include "helpers.h" #include #include @@ -7,7 +8,7 @@ std::unordered_map> gRefre class CFrameSnapshotManager {}; CFrameSnapshotManager* gFrameSnapshot; -void (CFrameSnapshotManager::*add_explicit_delete)(int) = nullptr; +MCall add_explicit_delete; ToolsNetworkRefresher::ToolsNetworkRefresher(CBaseEntity* entity) : m_link(entity), @@ -17,6 +18,9 @@ ToolsNetworkRefresher::ToolsNetworkRefresher(CBaseEntity* entity) : m_old_64_127_players(-1) { } +#ifdef COMPILER_GCC +__attribute__((noinline)) +#endif bool ToolsNetworkRefresher::Refresh() { auto entity = m_link.Get(); if (!entity) { @@ -33,7 +37,7 @@ bool ToolsNetworkRefresher::Refresh() { m_old_64_127_players = m_64_127_players; auto edict = entity->GetNetworkable()->GetEdict(); - (gFrameSnapshot->*add_explicit_delete)(edict->m_EdictIndex); + add_explicit_delete(gFrameSnapshot, edict->m_EdictIndex); return true; } @@ -53,11 +57,14 @@ void ToolsNetworkRefresher::UpdateTransmit(int player, bool toggle) { } void Hook_Frame(bool simulating) { - for (auto it = gRefreshers.begin(); it != gRefreshers.end(); it++) { - if (!it->second->Refresh()) { - // Can't refresh, entity became invalid - it = gRefreshers.erase(it); - } + for (auto it = gRefreshers.begin(); it != gRefreshers.end();) { + auto& e = *it; + if (!(e.second->Refresh())) { + // Can't refresh, entity became invalid + it = gRefreshers.erase(it); + } else { + it++; + } } } @@ -77,10 +84,12 @@ void Tools_RefreshEntity(CBaseEntity* entity, int player, bool toggle) { bool Tools_Refresh_Init(SourceMod::IGameConfig* config, char* error, size_t maxlength) { - if (!config->GetMemSig("CFrameSnapshotManager::AddExplicitDelete", reinterpret_cast(&add_explicit_delete)) || add_explicit_delete == nullptr) { + void* addr = nullptr; + if (!config->GetMemSig("CFrameSnapshotManager::AddExplicitDelete", &addr) || addr == nullptr) { snprintf(error, maxlength, "Failed to get CFrameSnapshotManager::AddExplicitDelete"); return false; } + add_explicit_delete.Init(addr); void* manager = nullptr; if (!config->GetMemSig("framesnapshotmanager", reinterpret_cast(&manager)) || manager == nullptr) { From 517b5b7df5455f22d144925988b726d62a082dfe Mon Sep 17 00:00:00 2001 From: Kenzzer Date: Wed, 5 Mar 2025 13:58:14 +0100 Subject: [PATCH 2/3] bump product version --- product.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/product.version b/product.version index d19d089..795d870 100644 --- a/product.version +++ b/product.version @@ -1 +1 @@ -1.15.0 \ No newline at end of file +1.15.1 \ No newline at end of file From f0eb16f94d8bf1a5f9a2a3db66393925ab4cd6d3 Mon Sep 17 00:00:00 2001 From: Kenzzer Date: Wed, 5 Mar 2025 14:07:22 +0100 Subject: [PATCH 3/3] fix weird identation --- extension/serialrefresher.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/extension/serialrefresher.cpp b/extension/serialrefresher.cpp index 7ecd207..c427853 100644 --- a/extension/serialrefresher.cpp +++ b/extension/serialrefresher.cpp @@ -59,12 +59,12 @@ void ToolsNetworkRefresher::UpdateTransmit(int player, bool toggle) { void Hook_Frame(bool simulating) { for (auto it = gRefreshers.begin(); it != gRefreshers.end();) { auto& e = *it; - if (!(e.second->Refresh())) { - // Can't refresh, entity became invalid - it = gRefreshers.erase(it); - } else { - it++; - } + if (!(e.second->Refresh())) { + // Can't refresh, entity became invalid + it = gRefreshers.erase(it); + } else { + it++; + } } }