diff --git a/modules/ns/amxxapi.cpp b/modules/ns/amxxapi.cpp index b4f232c6..b19e24bc 100644 --- a/modules/ns/amxxapi.cpp +++ b/modules/ns/amxxapi.cpp @@ -31,6 +31,7 @@ TitleManager TitleMan; ParticleManager ParticleMan; void MFuncs_Initialize(char *base); +void MPlayerFuncs_Initialize(char *base); // Native register calls here void AddNatives_MemberFunc(); @@ -100,5 +101,6 @@ void OnAmxxAttach() DLCLOSE(DLLBase); MFuncs_Initialize(FuncBase); + MPlayerFuncs_Initialize(FuncBase); } diff --git a/modules/ns/natives/player_memory.cpp b/modules/ns/natives/player_memory.cpp index 538ce63b..f6fe5ace 100644 --- a/modules/ns/natives/player_memory.cpp +++ b/modules/ns/natives/player_memory.cpp @@ -20,6 +20,16 @@ #include "GameManager.h" #include "CPlayer.h" +#include "FastDelegate.h" + +using namespace fastdelegate::detail; + +static bool (GenericClass::*MFP_SetResearchDone)(int inMessageID, bool inState); + +void MPlayerFuncs_Initialize(char *base) +{ + set_mfp(MFP_SetResearchDone, MFP(MEMBER_SET_RESEARCH_DONE)); +}; // Float:ns_get_res(Player) static cell AMX_NATIVE_CALL ns_get_res(AMX *amx, cell *params) @@ -378,6 +388,9 @@ static cell AMX_NATIVE_CALL ns_remove_upgrade(AMX *amx, cell *params) if (bfound) { + void *pTechTree = reinterpret_cast(player->GetEdict()->pvPrivateData) + MAKE_OFFSET(COMBAT_TECHTREE); + (reinterpret_cast(pTechTree)->*(MFP_SetResearchDone))(params[2], false); + if (afound) { return 2; diff --git a/modules/ns/ns_const.h b/modules/ns/ns_const.h index 30d5deac..daea20b3 100644 --- a/modules/ns/ns_const.h +++ b/modules/ns/ns_const.h @@ -122,6 +122,10 @@ #define OFFSET_WIN_UPGRADES_ACTIVE 0x198C #define OFFSET_LIN_UPGRADES_ACTIVE 0x19A0 +#define OFFSET_WIN_COMBAT_TECHTREE 0x1998 +#define OFFSET_LIN_COMBAT_TECHTREE 0x19AC + + // TODO: Symbols / signatures instead // Not actually offsets, but easier to use MAKE_OFFSET stuff for this :o @@ -147,7 +151,9 @@ #define OFFSET_WIN_MEMBER_TRIGGER_WELDABLE MAKE_MEMBER_OFFSET(0x000A0E20) #define OFFSET_LIN_MEMBER_TRIGGER_WELDABLE MAKE_MEMBER_OFFSET(0x00232840) - +// Research: bool AvHTechTree::SetResearchDone(AvHMessageID inMessageID, bool inState) +#define OFFSET_WIN_MEMBER_SET_RESEARCH_DONE MAKE_MEMBER_OFFSET(0x0009EC40) +#define OFFSET_LIN_MEMBER_SET_RESEARCH_DONE MAKE_MEMBER_OFFSET(0x0022E740) // Game Rules: AvHGameRules *GetGameRules(void) #define OFFSET_WIN_GETGAMERULES MAKE_MEMBER_OFFSET(0x00068000)