diff --git a/.gitmodules b/.gitmodules index fde0c20f..e799562e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,8 @@ [submodule "public/amtl"] path = public/amtl url = https://github.com/alliedmodders/amtl + shallow = true [submodule "sourcepawn"] path = sourcepawn url = https://github.com/alliedmodders/sourcepawn + shallow = true diff --git a/core/smn_hudtext.cpp b/core/smn_hudtext.cpp index 90b04052..6f7af02e 100644 --- a/core/smn_hudtext.cpp +++ b/core/smn_hudtext.cpp @@ -373,7 +373,11 @@ static cell_t ShowSyncHudText(IPluginContext *pContext, const cell_t *params) Handle_t err; CPlayer *pPlayer; hud_syncobj_t *obj; +#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_BLADE + char message_buffer[512]; +#else char message_buffer[255-36]; +#endif if (!s_HudMsgHelpers.IsSupported()) { @@ -453,7 +457,11 @@ static cell_t ShowHudText(IPluginContext *pContext, const cell_t *params) { int client; CPlayer *pPlayer; +#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_BLADE + char message_buffer[512]; +#else char message_buffer[255-36]; +#endif if (!s_HudMsgHelpers.IsSupported()) { diff --git a/extensions/dhooks/natives.cpp b/extensions/dhooks/natives.cpp index db1384f8..8757e831 100644 --- a/extensions/dhooks/natives.cpp +++ b/extensions/dhooks/natives.cpp @@ -256,6 +256,15 @@ cell_t Native_SetFromConf(IPluginContext *pContext, const cell_t *params) setup->funcAddr = addr; setup->offset = offset; + if (addr == nullptr) + { + setup->hookMethod = Virtual; + } + else + { + setup->hookMethod = Detour; + } + return 1; } @@ -282,6 +291,13 @@ cell_t Native_AddParam(IPluginContext *pContext, const cell_t *params) info.flags = PASSFLAG_BYVAL; } + // DynamicDetours doesn't expose the passflags concept like SourceHook. + // See if we're trying to set some invalid flags on detour arguments. + if(setup->hookMethod == Detour && (info.flags & ~PASSFLAG_BYVAL) > 0) + { + return pContext->ThrowNativeError("Pass flags are only supported for virtual hooks."); + } + if (params[0] >= 5) { PluginRegister custom_register = (PluginRegister)params[5]; @@ -884,7 +900,8 @@ cell_t Native_SetParamVector(IPluginContext *pContext, const cell_t *params) int index = params[2] - 1; size_t offset = GetParamOffset(paramStruct, index); - void *addr = (void **)((intptr_t)paramStruct->newParams + offset); + void **origAddr = (void **)((intptr_t)paramStruct->orgParams + offset); + void **newAddr = (void **)((intptr_t)paramStruct->newParams + offset); switch(paramStruct->dg->params.at(index).type) { @@ -892,11 +909,23 @@ cell_t Native_SetParamVector(IPluginContext *pContext, const cell_t *params) { cell_t *buffer; pContext->LocalToPhysAddr(params[3], &buffer); + SDKVector *origVec = *(SDKVector **)origAddr; + SDKVector **newVec = (SDKVector **)newAddr; - *(SDKVector **)addr = new SDKVector(sp_ctof(buffer[0]), sp_ctof(buffer[1]), sp_ctof(buffer[2])); + if(origVec == nullptr) + { + *newVec = new SDKVector(sp_ctof(buffer[0]), sp_ctof(buffer[1]), sp_ctof(buffer[2])); + // Free it later (cheaply) after the function returned. + smutils->AddFrameAction(FreeChangedVector, *newVec); + } + else + { + origVec->x = sp_ctof(buffer[0]); + origVec->y = sp_ctof(buffer[1]); + origVec->z = sp_ctof(buffer[2]); + *newVec = origVec; + } paramStruct->isChanged[index] = true; - // Free it later (cheaply) after the function returned. - smutils->AddFrameAction(FreeChangedVector, *(SDKVector **)addr); return 1; } } diff --git a/extensions/dhooks/signatures.cpp b/extensions/dhooks/signatures.cpp index e5ddd8b9..45b673cc 100644 --- a/extensions/dhooks/signatures.cpp +++ b/extensions/dhooks/signatures.cpp @@ -376,6 +376,20 @@ SMCResult SignatureGameConfig::ReadSMC_LeavingSection(const SMCStates *states) return SMCResult_HaltFail; } + if (!g_CurrentSignature->offset.length()) + { + // DynamicDetours doesn't expose the passflags concept like SourceHook. + // See if we're trying to set some invalid flags on detour arguments. + for (auto &arg : g_CurrentSignature->args) + { + if ((arg.info.flags & ~PASSFLAG_BYVAL) > 0) + { + smutils->LogError(myself, "Function \"%s\" uses unsupported pass flags in argument \"%s\". Flags are only supported for virtual hooks: line: %i col: %i", g_CurrentFunctionName.c_str(), arg.name.c_str(), states->line, states->col); + return SMCResult_HaltFail; + } + } + } + // Save this function signature in our cache. signatures_.insert(g_CurrentFunctionName.c_str(), g_CurrentSignature); g_CurrentFunctionName = ""; diff --git a/extensions/dhooks/vhook.h b/extensions/dhooks/vhook.h index 3340049c..6146d1ad 100644 --- a/extensions/dhooks/vhook.h +++ b/extensions/dhooks/vhook.h @@ -225,6 +225,11 @@ public: DHooksInfo *dg; }; +enum HookMethod { + Virtual, + Detour +}; + class HookSetup { public: @@ -238,6 +243,7 @@ public: this->offset = offset; this->funcAddr = nullptr; this->callback = callback; + this->hookMethod = Virtual; }; HookSetup(ReturnType returnType, unsigned int returnFlag, CallingConvention callConv, ThisPointerType thisType, void *funcAddr) { @@ -249,6 +255,7 @@ public: this->offset = -1; this->funcAddr = funcAddr; this->callback = nullptr; + this->hookMethod = Detour; }; ~HookSetup(){}; @@ -266,6 +273,7 @@ public: int offset; void *funcAddr; IPluginFunction *callback; + HookMethod hookMethod; }; class DHooksManager diff --git a/gamedata/sdktools.games/game.nmrih.txt b/gamedata/sdktools.games/game.nmrih.txt index 44d1c316..b1603498 100644 --- a/gamedata/sdktools.games/game.nmrih.txt +++ b/gamedata/sdktools.games/game.nmrih.txt @@ -185,5 +185,11 @@ "mac" "211" } } + + "Keys" + { + "GameRulesProxy" "CNMRiH_GameRulesProxy" + "GameRulesDataTable" "nmrih_gamerules_data" + } } } diff --git a/sourcepawn b/sourcepawn index 18cce5f8..208001a0 160000 --- a/sourcepawn +++ b/sourcepawn @@ -1 +1 @@ -Subproject commit 18cce5f84247302126b5b6292516752d8a6bd1a7 +Subproject commit 208001a01baaf98d4601e31fda0ab9c849fa700d