Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 15 additions & 6 deletions extension/serialrefresher.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "serialrefresher.h"
#include "serialrefresher.h"
#include "helpers.h"

#include <unordered_map>
#include <memory>
Expand All @@ -7,7 +8,7 @@ std::unordered_map<std::uint32_t, std::unique_ptr<ToolsNetworkRefresher>> gRefre

class CFrameSnapshotManager {};
CFrameSnapshotManager* gFrameSnapshot;
void (CFrameSnapshotManager::*add_explicit_delete)(int) = nullptr;
MCall<void, int> add_explicit_delete;

ToolsNetworkRefresher::ToolsNetworkRefresher(CBaseEntity* entity) :
m_link(entity),
Expand All @@ -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) {
Expand All @@ -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;
}
Expand All @@ -53,10 +57,13 @@ 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()) {
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++;
}
}
}
Expand All @@ -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<void**>(&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<void**>(&manager)) || manager == nullptr) {
Expand Down
2 changes: 1 addition & 1 deletion product.version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.15.0
1.15.1