Cstrike: cs_set_no_knives - pfnCreateNamedEntity is now hooked only when needed

This commit is contained in:
Arkshine 2015-07-04 16:08:17 +02:00
parent 2de1f9a33b
commit 71c6ac8c2e
3 changed files with 64 additions and 28 deletions

View File

@ -14,8 +14,8 @@
#include "CstrikeDatas.h" #include "CstrikeDatas.h"
#include "CstrikeUtils.h" #include "CstrikeUtils.h"
#include "CstrikeHacks.h" #include "CstrikeHacks.h"
#include <sm_stringhashmap.h>
#include "CstrikeHLTypeConversion.h" #include "CstrikeHLTypeConversion.h"
#include <sm_stringhashmap.h>
void CtrlDetours_ClientCommand(bool set); void CtrlDetours_ClientCommand(bool set);
void CtrlDetours_BuyCommands(bool set); void CtrlDetours_BuyCommands(bool set);
@ -174,6 +174,35 @@ DETOUR_DECL_STATIC1(C_ClientCommand, void, edict_t*, pEdict) // void ClientComma
DETOUR_STATIC_CALL(C_ClientCommand)(pEdict); DETOUR_STATIC_CALL(C_ClientCommand)(pEdict);
} }
edict_s* OnCreateNamedEntity(int classname)
{
if (NoKifesMode)
{
if (!strcmp(STRING(classname), "weapon_knife"))
{
RETURN_META_VALUE(MRES_SUPERCEDE, nullptr);
}
}
else
{
g_pengfuncsTable->pfnCreateNamedEntity = nullptr;
}
RETURN_META_VALUE(MRES_IGNORED, 0);
}
DETOUR_DECL_MEMBER0(GiveDefaultItems, void) // void CBasePlayer::GiveDefaultItems(void)
{
if (NoKifesMode)
{
g_pengfuncsTable->pfnCreateNamedEntity = OnCreateNamedEntity;
}
DETOUR_MEMBER_CALL(GiveDefaultItems)();
g_pengfuncsTable->pfnCreateNamedEntity = nullptr;
}
DETOUR_DECL_MEMBER1(GiveNamedItem, void, const char*, pszName) // void CBasePlayer::GiveNamedItem(const char *pszName) DETOUR_DECL_MEMBER1(GiveNamedItem, void, const char*, pszName) // void CBasePlayer::GiveNamedItem(const char *pszName)
{ {
// If the current item id is not null, this means player has triggers a buy command. // If the current item id is not null, this means player has triggers a buy command.
@ -458,5 +487,22 @@ void CtrlDetours_Natives(bool set)
{ {
MF_Log("UTIL_FindEntByString is not available - native cs_find_ent_by_class() has been disabled"); MF_Log("UTIL_FindEntByString is not available - native cs_find_ent_by_class() has been disabled");
} }
if (MainConfig->GetMemSig("GiveDefaultItems", &address))
{
GiveDefaultItemsDetour = DETOUR_CREATE_MEMBER_FIXED(GiveDefaultItems, address);
}
if (!GiveDefaultItemsDetour)
{
MF_Log("GiveDefaultItems is not available - native cs_set_no_knives has been disabled");
}
}
else
{
if (GiveDefaultItemsDetour)
{
GiveDefaultItemsDetour->Destroy();
}
} }
} }

View File

@ -20,8 +20,6 @@
CCstrikePlayer g_players[33]; CCstrikePlayer g_players[33];
int g_zooming[33] = {0}; int g_zooming[33] = {0};
bool g_precachedknife = false;
bool g_noknives = false;
bool NoKifesMode = false; bool NoKifesMode = false;
@ -946,8 +944,23 @@ static cell AMX_NATIVE_CALL cs_get_no_knives(AMX *amx, cell *params)
// native cs_set_no_knives(noknives = 0); // native cs_set_no_knives(noknives = 0);
static cell AMX_NATIVE_CALL cs_set_no_knives(AMX *amx, cell *params) static cell AMX_NATIVE_CALL cs_set_no_knives(AMX *amx, cell *params)
{ {
if (!GiveDefaultItemsDetour)
{
MF_LogError(amx, AMX_ERR_NATIVE, "Native cs_set_no_knives() is disabled");
return 0;
}
NoKifesMode = params[1] != 0; NoKifesMode = params[1] != 0;
if (NoKifesMode)
{
GiveDefaultItemsDetour->EnableDetour();
}
else
{
GiveDefaultItemsDetour->DisableDetour();
}
return 1; return 1;
} }
@ -1623,29 +1636,6 @@ AMX_NATIVE_INFO CstrikeNatives[] =
{nullptr, nullptr} {nullptr, nullptr}
}; };
edict_s* FN_CreateNamedEntity(int classname)
{
if (g_noknives && !strcmp(STRING(classname), "weapon_knife"))
{
if (g_precachedknife)
{
// Knife is creating
RETURN_META_VALUE(MRES_SUPERCEDE, NULL);
}
// Let it create a knife first time; this seems to keep it precached properly in case anyone give_items a knife later.
g_precachedknife = true;
}
RETURN_META_VALUE(MRES_IGNORED, 0);
}
void FN_ServerDeactivate()
{
g_precachedknife = false;
RETURN_META(MRES_IGNORED);
}
void MessageBegin(int msg_dest, int msg_type, const float *pOrigin, edict_t *ed) void MessageBegin(int msg_dest, int msg_type, const float *pOrigin, edict_t *ed)
{ {
// Reset player model a short while (MODELRESETTIME) after this if they are using an edited model. // Reset player model a short while (MODELRESETTIME) after this if they are using an edited model.

View File

@ -124,7 +124,7 @@
// #define FN_ClientCommand ClientCommand /* pfnClientCommand() (wd) Player has sent a command (typed or from a bind) */ // #define FN_ClientCommand ClientCommand /* pfnClientCommand() (wd) Player has sent a command (typed or from a bind) */
#define FN_ClientUserInfoChanged ClientUserInfoChanged /* pfnClientUserInfoChanged() (wd) Client has updated their setinfo structure */ #define FN_ClientUserInfoChanged ClientUserInfoChanged /* pfnClientUserInfoChanged() (wd) Client has updated their setinfo structure */
// #define FN_ServerActivate ServerActivate /* pfnServerActivate() (wd) Server is starting a new map */ // #define FN_ServerActivate ServerActivate /* pfnServerActivate() (wd) Server is starting a new map */
#define FN_ServerDeactivate ServerDeactivate /* pfnServerDeactivate() (wd) Server is leaving the map (shutdown or changelevel); SDK2 */ // #define FN_ServerDeactivate ServerDeactivate /* pfnServerDeactivate() (wd) Server is leaving the map (shutdown or changelevel); SDK2 */
#define FN_PlayerPreThink PlayerPreThink /* pfnPlayerPreThink() */ #define FN_PlayerPreThink PlayerPreThink /* pfnPlayerPreThink() */
#define FN_PlayerPostThink PlayerPostThink /* pfnPlayerPostThink() */ #define FN_PlayerPostThink PlayerPostThink /* pfnPlayerPostThink() */
// #define FN_StartFrame StartFrame /* pfnStartFrame() */ // #define FN_StartFrame StartFrame /* pfnStartFrame() */
@ -229,7 +229,7 @@
// #define FN_AngleVectors AngleVectors // #define FN_AngleVectors AngleVectors
// #define FN_CreateEntity CreateEntity // #define FN_CreateEntity CreateEntity
// #define FN_RemoveEntity RemoveEntity // #define FN_RemoveEntity RemoveEntity
#define FN_CreateNamedEntity CreateNamedEntity // #define FN_CreateNamedEntity CreateNamedEntity
// #define FN_MakeStatic MakeStatic // #define FN_MakeStatic MakeStatic
// #define FN_EntIsOnFloor EntIsOnFloor // #define FN_EntIsOnFloor EntIsOnFloor
// #define FN_DropToFloor DropToFloor // #define FN_DropToFloor DropToFloor