Skip to content

Commit 5a68dc1

Browse files
committed
Several fixes
1 parent 5e3e408 commit 5a68dc1

File tree

6 files changed

+31
-16
lines changed

6 files changed

+31
-16
lines changed

src/mem/detour.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -804,7 +804,7 @@ void CDetouredFunc::Reconfigure()
804804
assert(detour->EnsureUniqueInnerPtrs());
805805
}
806806

807-
this->m_VirtualHookOptional = CVirtualHookBase(first->m_pCallback, CVirtualHookBase::DETOUR_HOOK);
807+
this->m_VirtualHookOptional = CVirtualHookBase(first->m_pCallback, CVirtualHookBase::DETOUR_HOOK, first->GetName());
808808
for (auto &[pVFuncPtr, pVT] : this->m_FoundFuncPtrAndVTablePtr) {
809809
CVirtualHookFunc::Find(pVFuncPtr, pVT).AddVirtualHook(&this->m_VirtualHookOptional);
810810
}

src/mem/virtual_hook.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "addr/addr.h"
33
#include "mem/protect.h"
44
#include "util/rtti.h"
5+
#include "stub/server.h"
56

67
bool CVirtualHook::DoLoad()
78
{
@@ -282,12 +283,15 @@ void CVirtualHookFunc::AddVirtualHook(CVirtualHookBase *hook)
282283
return a->GetPriority() > b->GetPriority();
283284
});
284285
DoHook();
286+
this->m_szName = this->m_Hooks.front()->GetName();
285287
}
286288
void CVirtualHookFunc::RemoveVirtualHook(CVirtualHookBase *hook)
287289
{
288290
int prec = this->m_Hooks.size();
289291
this->m_Hooks.erase(std::remove(this->m_Hooks.begin(), this->m_Hooks.end(), hook), this->m_Hooks.end());
290292
DoHook();
293+
if (!this->m_Hooks.empty())
294+
this->m_szName = this->m_Hooks.front()->GetName();
291295
}
292296

293297

@@ -302,6 +306,11 @@ void CVirtualHookFunc::CleanUp()
302306
void CVirtualHookFunc::UnloadAll()
303307
{
304308
if (this->m_bHooked) {
309+
// Check if some extension had overriden our hook, but not when the game is in shutdown/restart state as it does not matter by then
310+
int state = g_HostState.GetRef().m_currentState;
311+
if (this->m_pFuncFirst != *this->m_pFuncPtr && (state == 6 || state == 7)) {
312+
ConColorMsg(Color(0xff, 0x20, 0x20), "[Sigsegv-MvM] Some plugin/extension had hooked a virtual %s after this extension. It should be unloaded first (but it wasn't) before this extension. This can cause issues\n", this->m_szName.c_str());
313+
}
305314
this->m_bHooked = false;
306315
MemProtModifier_RX_RWX(this->m_pFuncPtr, sizeof(void **));
307316
*this->m_pFuncPtr = this->m_pFuncInner;
@@ -328,4 +337,5 @@ void CVirtualHookFunc::DoHook()
328337
}
329338
MemProtModifier_RX_RWX(this->m_pFuncPtr, sizeof(void **));
330339
*this->m_pFuncPtr = first->m_pCallback;
340+
this->m_pFuncFirst = first->m_pCallback;
331341
}

src/mem/virtual_hook.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ class CVirtualHookBase
2121

2222
CVirtualHookBase() {}
2323

24-
CVirtualHookBase(void *callback, HookPriority priority = NORMAL) : m_pCallback(callback), m_Priority(priority) {}
24+
CVirtualHookBase(void *callback, HookPriority priority = NORMAL, std::string name = ""s) : m_pCallback(callback), m_Priority(priority), m_szName(name) {}
25+
26+
virtual const char *GetName() { return m_szName.c_str(); };
2527

2628
virtual void SetInner(void *inner, void *vtable) { }
2729

@@ -35,7 +37,10 @@ class CVirtualHookBase
3537

3638
void *m_pCallback;
3739
HookPriority m_Priority;
38-
friend class CVirtualHookFunc;
40+
41+
std::string m_szName;
42+
43+
friend class CVirtualHookFunc;
3944
};
4045

4146
class CVirtualHook : public CVirtualHookBase
@@ -51,8 +56,6 @@ class CVirtualHook : public CVirtualHookBase
5156
virtual void DoEnable();
5257
virtual void DoDisable();
5358

54-
virtual const char *GetName() { return m_szName.c_str(); };
55-
5659
virtual void SetInner(void *inner, void *vtable) { *m_pInner = inner; }
5760

5861
// Change VTable, keep offset.
@@ -172,6 +175,8 @@ class CVirtualHookFunc
172175

173176
std::vector<CVirtualHookBase *> m_Hooks;
174177
static inline std::map<void **, CVirtualHookFunc> s_FuncMap;
178+
void *m_pFuncFirst = nullptr;
179+
std::string m_szName;
175180
};
176181

177182
#define VHOOK_CALL(name) (this->*Actual)

src/mod/etc/mapentity_additions.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,8 @@ namespace Mod::Etc::Mapentity_Additions
446446
ActivateLoadedInput();
447447
}
448448

449+
RefCount rc_SpecialParsedNameFail;
450+
449451
CBaseEntity *DoSpecialParsing(const char *szName, CBaseEntity *pStartEntity, const std::function<CBaseEntity *(CBaseEntity *, const char *)>& functor)
450452
{
451453
if (szName[0] == '@' && szName[1] != '\0') {
@@ -582,8 +584,8 @@ namespace Mod::Etc::Mapentity_Additions
582584
}
583585
}
584586
}
585-
586-
return functor(pStartEntity, szName+1);
587+
SCOPED_INCREMENT(rc_SpecialParsedNameFail);
588+
return functor(pStartEntity, szName);
587589
}
588590

589591
std::string last_entity_name;
@@ -600,7 +602,7 @@ namespace Mod::Etc::Mapentity_Additions
600602
auto entList = reinterpret_cast<CGlobalEntityList *>(this);
601603
if (szName == nullptr || szName[0] == '\0') return nullptr;
602604

603-
if (szName[0] == '@') return DoSpecialParsing(szName, pStartEntity, [&](CBaseEntity *entity, const char *realname) {return entList->FindEntityByClassname(entity, realname, filter);});
605+
if (szName[0] == '@' && !rc_SpecialParsedNameFail) return DoSpecialParsing(szName, pStartEntity, [&](CBaseEntity *entity, const char *realname) {return entList->FindEntityByClassname(entity, realname, filter);});
604606

605607
if (!cvar_fast_lookup.GetBool()) return DETOUR_MEMBER_CALL(CGlobalEntityList_FindEntityByClassname)(pStartEntity, szName, filter);
606608

@@ -656,7 +658,7 @@ namespace Mod::Etc::Mapentity_Additions
656658

657659
if (szName[0] == '@' && szName[1] == 'h' && szName[2] == '@') { return pStartEntity == nullptr ? CHandle<CBaseEntity>::FromIndex(atoi(szName+3)) : nullptr; }
658660

659-
if (szName[0] == '@') return DoSpecialParsing(szName, pStartEntity, [&](CBaseEntity *entity, const char *realname) {return servertools->FindEntityByName(entity, realname, pSearchingEntity, pActivator, pCaller, pFilter);});
661+
if (szName[0] == '@' && !rc_SpecialParsedNameFail) return DoSpecialParsing(szName, pStartEntity, [&](CBaseEntity *entity, const char *realname) {return servertools->FindEntityByName(entity, realname, pSearchingEntity, pActivator, pCaller, pFilter);});
660662

661663
if (szName[0] == '!' || !cvar_fast_lookup.GetBool()) return DETOUR_MEMBER_CALL(CGlobalEntityList_FindEntityByName)(pStartEntity, szName, pSearchingEntity, pActivator, pCaller, pFilter);
662664

src/mod/mvm/human_death_yells.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,11 @@ namespace Mod::MvM::Human_Death_Yells
4040
{
4141
// Avoid going into the branch playing mvm sound
4242

43-
// Change cmp 0 to 0x55
44-
buf[0x06] = 0x55;
45-
// Change jnz to jz
46-
buf[0x08] = 0x84;
43+
/* make the conditional jump unconditional */
44+
buf[0x07] = 0x90;
45+
buf[0x08] = 0xe9;
4746

48-
49-
mask[0x06] = 0xFF;
47+
mask[0x07] = 0xFF;
5048
mask[0x08] = 0xFF;
5149
return true;
5250
}

src/mod/pop/tank_extensions.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1054,8 +1054,8 @@ namespace Mod::Pop::Tank_Extensions
10541054

10551055
DETOUR_DECL_MEMBER(int, CTFTankBoss_GetCurrencyValue)
10561056
{
1057+
if (rc_CTFTankBoss_Event_Killed && restOfCurrency != -1) return restOfCurrency;
10571058
auto result = DETOUR_MEMBER_CALL(CTFTankBoss_GetCurrencyValue)();
1058-
if (rc_CTFTankBoss_Event_Killed && restOfCurrency != -1) return restOfCurrency;
10591059
return result;
10601060
}
10611061

0 commit comments

Comments
 (0)