Consistency: Replace GETEDICT and variants with HLTypeConversion in cstrike module

This commit is contained in:
Arkshine 2015-10-07 17:41:54 +02:00
parent 6f301b5cea
commit b65a0600ee
10 changed files with 15 additions and 262 deletions

View File

@ -15,7 +15,6 @@ binary.sources = [
'CstrikeHacks.cpp', 'CstrikeHacks.cpp',
'CstrikeUtils.cpp', 'CstrikeUtils.cpp',
'CstrikeUserMessages.cpp', 'CstrikeUserMessages.cpp',
'CstrikeHLTypeConversion.cpp',
'../../../public/memtools/MemoryUtils.cpp', '../../../public/memtools/MemoryUtils.cpp',
'../../../public/memtools/CDetour/detours.cpp', '../../../public/memtools/CDetour/detours.cpp',
'../../../public/memtools/CDetour/asm/asm.c', '../../../public/memtools/CDetour/asm/asm.c',

View File

@ -14,8 +14,6 @@
#ifndef CSTRIKE_DATA_H #ifndef CSTRIKE_DATA_H
#define CSTRIKE_DATA_H #define CSTRIKE_DATA_H
#include "amxxmodule.h"
/** /**
* Weapon Ids for use with CS_OnBuyAttempt(), CS_OnBuy(). * Weapon Ids for use with CS_OnBuyAttempt(), CS_OnBuy().
*/ */

View File

@ -1,119 +0,0 @@
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
//
// Counter-Strike Module
//
#include "CstrikeHLTypeConversion.h"
OffsetHandler* G_OffsetHandler;
HL_TypeConversion G_HL_TypeConversion;
void OffsetHandler::search_pev()
{
edict_t *pEdict = INDEXENT(0);
entvars_t *pev = VARS(pEdict);
byte *privateData = reinterpret_cast<byte*>(pEdict->pvPrivateData);
for (int i = 0; i < 0xFFF; i++)
{
entvars_t *val = *(reinterpret_cast<entvars_t**>(privateData + i));
if (val == pev)
{
this->pev = i;
return;
}
}
// This should not happen.
this->pev = 0;
}
inline edict_t* HL_TypeConversion::INDEXENT2(int iEdictNum)
{
if (iEdictNum >= 1 && iEdictNum <= gpGlobals->maxClients)
{
return MF_GetPlayerEdict(iEdictNum);
}
else
{
return (*g_engfuncs.pfnPEntityOfEntIndex)(iEdictNum);
}
}
edict_t* HL_TypeConversion::entvar_to_edict(entvars_t *pev)
{
if (!pev)
{
return nullptr;
}
return pev->pContainingEntity;
}
int HL_TypeConversion::entvar_to_id(entvars_t *pev)
{
if (!pev)
{
return -1;
}
if (!pev->pContainingEntity)
{
return -1;
}
return ENTINDEX(pev->pContainingEntity);
}
void* HL_TypeConversion::id_to_cbase(int index)
{
edict_t* edict = INDEXENT2(index);
return edict ? edict->pvPrivateData : nullptr;
}
entvars_t* HL_TypeConversion::id_to_entvar(int index)
{
edict_t *pEdict = INDEXENT2(index);
return pEdict ? VARS(pEdict) : nullptr;
}
entvars_t* HL_TypeConversion::cbase_to_entvar(void* cbase)
{
if (!cbase)
{
return nullptr;
}
return *reinterpret_cast<entvars_t**>(reinterpret_cast<int8*>(cbase) + G_OffsetHandler->pev);
}
int HL_TypeConversion::cbase_to_id(void *cbase)
{
if (!cbase)
{
return -1;
}
entvars_t *pev = this->cbase_to_entvar(cbase);
if (!pev)
{
return -1;
}
if (!pev->pContainingEntity || FNullEnt(pev->pContainingEntity))
{
return -1;
}
return ENTINDEX(pev->pContainingEntity);
}

View File

@ -1,49 +0,0 @@
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
//
// Counter-Strike Module
//
#ifndef HL_TYPE_CONVERSION_H
#define HL_TYPE_CONVERSION_H
#include "amxxmodule.h"
struct OffsetHandler
{
int pev;
void search_pev();
OffsetHandler()
{
search_pev();
}
};
class HL_TypeConversion
{
public:
inline edict_t* INDEXENT2(int iEdictNum);
edict_t* entvar_to_edict(entvars_t *pev);
int entvar_to_id(entvars_t *pev);
void* id_to_cbase(int index);
int cbase_to_id(void *cbase);
entvars_t* id_to_entvar(int index);
entvars_t* cbase_to_entvar(void* cbase);
};
extern OffsetHandler* G_OffsetHandler;
extern HL_TypeConversion G_HL_TypeConversion;
#endif // HL_TYPE_CONVERSION_H

View File

@ -14,7 +14,6 @@
#include "CstrikeDatas.h" #include "CstrikeDatas.h"
#include "CstrikeUtils.h" #include "CstrikeUtils.h"
#include "CstrikeHacks.h" #include "CstrikeHacks.h"
#include "CstrikeHLTypeConversion.h"
#include <sm_stringhashmap.h> #include <sm_stringhashmap.h>
void CtrlDetours_ClientCommand(bool set); void CtrlDetours_ClientCommand(bool set);
@ -213,7 +212,7 @@ DETOUR_DECL_MEMBER1(GiveNamedItem, void, const char*, pszName) // void CBasePlay
// 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.
if (CurrentItemId) if (CurrentItemId)
{ {
int client = G_HL_TypeConversion.cbase_to_id(this); int client = TypeConversion.cbase_to_id(this);
if (MF_IsPlayerAlive(client) && MF_ExecuteForward(ForwardOnBuy, static_cast<cell>(client), static_cast<cell>(CurrentItemId)) > 0) if (MF_IsPlayerAlive(client) && MF_ExecuteForward(ForwardOnBuy, static_cast<cell>(client), static_cast<cell>(CurrentItemId)) > 0)
{ {
@ -234,7 +233,7 @@ DETOUR_DECL_MEMBER1(GiveShield, void, bool, bRetire) // void CBasePlayer::GiveSh
// Special case for shield. Game doesn't use GiveNamedItem() to give a shield. // Special case for shield. Game doesn't use GiveNamedItem() to give a shield.
if (CurrentItemId == CSI_SHIELDGUN) if (CurrentItemId == CSI_SHIELDGUN)
{ {
int client = G_HL_TypeConversion.cbase_to_id(this); int client = TypeConversion.cbase_to_id(this);
if (MF_IsPlayerAlive(client) && MF_ExecuteForward(ForwardOnBuy, static_cast<cell>(client), CSI_SHIELDGUN) > 0) if (MF_IsPlayerAlive(client) && MF_ExecuteForward(ForwardOnBuy, static_cast<cell>(client), CSI_SHIELDGUN) > 0)
{ {

View File

@ -13,16 +13,15 @@
#include "amxxmodule.h" #include "amxxmodule.h"
#include "CstrikeUtils.h" #include "CstrikeUtils.h"
#include "CstrikeDatas.h"
#include "CstrikeHacks.h" #include "CstrikeHacks.h"
#include "CstrikeHLTypeConversion.h"
#include <IGameConfigs.h> #include <IGameConfigs.h>
#include "engine_strucs.h"
IGameConfig *MainConfig; IGameConfig *MainConfig;
IGameConfig *CommonConfig; IGameConfig *CommonConfig;
IGameConfigManager *ConfigManager; IGameConfigManager *ConfigManager;
HLTypeConversion TypeConversion;
int AmxxCheckGame(const char *game) int AmxxCheckGame(const char *game)
{ {
if (strcasecmp(game, "cstrike") == 0 || if (strcasecmp(game, "cstrike") == 0 ||
@ -75,11 +74,8 @@ void OnPluginsLoaded()
ToggleDetour_ClientCommands(ForwardInternalCommand != -1 || ForwardOnBuy != -1 || ForwardOnBuyAttempt != -1); ToggleDetour_ClientCommands(ForwardInternalCommand != -1 || ForwardOnBuy != -1 || ForwardOnBuyAttempt != -1);
ToggleDetour_BuyCommands(ForwardOnBuy != -1); ToggleDetour_BuyCommands(ForwardOnBuy != -1);
// Search pev offset automatically. // Search pev/vtable offset automatically.
if (!G_OffsetHandler) TypeConversion.init();
{
G_OffsetHandler = new OffsetHandler;
}
// Used with model natives, enabled on demand. // Used with model natives, enabled on demand.
g_pengfuncsTable->pfnSetClientKeyValue = nullptr; g_pengfuncsTable->pfnSetClientKeyValue = nullptr;

View File

@ -16,9 +16,7 @@
#include "CstrikeUtils.h" #include "CstrikeUtils.h"
#include "CstrikeHacks.h" #include "CstrikeHacks.h"
#include "CstrikeUserMessages.h" #include "CstrikeUserMessages.h"
#include "CstrikeHLTypeConversion.h"
#include <CDetour/detours.h> #include <CDetour/detours.h>
#include <amtl/am-vector.h>
#include <amtl/am-string.h> #include <amtl/am-string.h>
bool NoKifesMode = false; bool NoKifesMode = false;
@ -999,14 +997,14 @@ static cell AMX_NATIVE_CALL cs_set_hostage_follow(AMX *amx, cell *params)
GET_OFFSET("CHostageImprov", m_idleState); GET_OFFSET("CHostageImprov", m_idleState);
GET_OFFSET("HostageFollowState", m_leader); GET_OFFSET("HostageFollowState", m_leader);
GET_OFFSET("SimpleStateMachine", m_state); // +4 for virtual table pointer of IImprovEvent. GET_OFFSET("SimpleStateMachine", m_state); // +4 for virtual table pointer of IImprovEvent.
GET_OFFSET("SimpleStateMachine", m_stateTimer); // GET_OFFSET("SimpleStateMachine", m_stateTimer); //
if (target) if (target)
{ {
set_pdata<void*>(pImprov, m_behavior + 4 + m_state, reinterpret_cast<int8*>(pImprov) + m_followState); set_pdata<void*>(pImprov, m_behavior + 4 + m_state, reinterpret_cast<int8*>(pImprov) + m_followState);
set_pdata<float>(pImprov, m_behavior + 4 + m_stateTimer, gpGlobals->time); set_pdata<float>(pImprov, m_behavior + 4 + m_stateTimer, gpGlobals->time);
get_pdata<EHANDLE>(pImprov, m_followState + m_leader).Set(GETEDICT(target)); get_pdata<EHANDLE>(pImprov, m_followState + m_leader).Set(TypeConversion.id_to_edict(target));
} }
else else
{ {
@ -1018,7 +1016,7 @@ static cell AMX_NATIVE_CALL cs_set_hostage_follow(AMX *amx, cell *params)
} }
else else
{ {
get_pdata<EHANDLE>(pHostage, m_hTargetEnt).Set(target ? GETEDICT(target) : nullptr); get_pdata<EHANDLE>(pHostage, m_hTargetEnt).Set(target ? TypeConversion.id_to_edict(target) : nullptr);
} }
return 1; return 1;
@ -1728,10 +1726,10 @@ static cell AMX_NATIVE_CALL cs_find_ent_by_class(AMX* amx, cell* params)
} }
int len; int len;
void* pEntity = G_HL_TypeConversion.id_to_cbase(params[1]); void* pEntity = TypeConversion.id_to_cbase(params[1]);
const char* value = MF_GetAmxString(amx, params[2], 0, &len); const char* value = MF_GetAmxString(amx, params[2], 0, &len);
int index = G_HL_TypeConversion.cbase_to_id(CS_UTIL_FindEntityByString(pEntity, "classname", value)); int index = TypeConversion.cbase_to_id(CS_UTIL_FindEntityByString(pEntity, "classname", value));
if (index != -1) if (index != -1)
{ {

View File

@ -14,6 +14,10 @@
#ifndef CSTRIKE_UTILS_H #ifndef CSTRIKE_UTILS_H
#define CSTRIKE_UTILS_H #define CSTRIKE_UTILS_H
#include <HLTypeConversion.h>
extern HLTypeConversion TypeConversion;
bool UTIL_IsPlayer(edict_t *pPlayer); bool UTIL_IsPlayer(edict_t *pPlayer);
void UTIL_TextMsg_Generic(edict_t* pPlayer, const char* message); void UTIL_TextMsg_Generic(edict_t* pPlayer, const char* message);
bool UTIL_CheckForPublic(const char *publicname); bool UTIL_CheckForPublic(const char *publicname);
@ -70,10 +74,6 @@ bool UTIL_CheckForPublic(const char *publicname);
return 0; \ return 0; \
} }
#define GETEDICT(n) \
((n >= 1 && n <= gpGlobals->maxClients) ? MF_GetPlayerEdict(n) : INDEXENT(n))
#define GET_OFFSET(classname, member) \ #define GET_OFFSET(classname, member) \
static int member = -1; \ static int member = -1; \
if (member == -1) \ if (member == -1) \
@ -99,71 +99,6 @@ bool UTIL_CheckForPublic(const char *publicname);
member = type.fieldOffset; \ member = type.fieldOffset; \
} }
template <typename T>
inline T& get_pdata(edict_t *pEntity, int offset, int element = 0)
{
return *reinterpret_cast<T*>(reinterpret_cast<int8*>(pEntity->pvPrivateData) + offset + element * sizeof(T));
}
template <typename T>
inline T& get_pdata(void *pEntity, int offset, int element = 0)
{
return *reinterpret_cast<T*>(reinterpret_cast<int8*>(pEntity) + offset + element * sizeof(T));
}
template <typename T>
inline void set_pdata(edict_t *pEntity, int offset, T value, int element = 0)
{
*reinterpret_cast<T*>(reinterpret_cast<int8*>(pEntity->pvPrivateData) + offset + element * sizeof(T)) = value;
}
template <typename T>
inline void set_pdata(void *pEntity, int offset, T value, int element = 0)
{
*reinterpret_cast<T*>(reinterpret_cast<int8*>(pEntity) + offset + element * sizeof(T)) = value;
}
class EHANDLE
{
private:
edict_t* m_pent;
int m_serialnumber;
public:
edict_t* Get(void)
{
if (!FNullEnt(m_pent))
{
if (m_pent->serialnumber == m_serialnumber)
{
return m_pent;
}
return nullptr;
}
return nullptr;
};
edict_t* Set(edict_t *pent)
{
if (!FNullEnt(pent))
{
m_pent = pent;
m_serialnumber = m_pent->serialnumber;
}
else
{
m_pent = nullptr;
m_serialnumber = 0;
}
return pent;
};
};
class CUnifiedSignals class CUnifiedSignals
{ {
public: public:

View File

@ -146,7 +146,6 @@
<ClCompile Include="..\..\..\..\public\memtools\MemoryUtils.cpp" /> <ClCompile Include="..\..\..\..\public\memtools\MemoryUtils.cpp" />
<ClCompile Include="..\CstrikeMain.cpp" /> <ClCompile Include="..\CstrikeMain.cpp" />
<ClCompile Include="..\CstrikeHacks.cpp" /> <ClCompile Include="..\CstrikeHacks.cpp" />
<ClCompile Include="..\CstrikeHLTypeConversion.cpp" />
<ClCompile Include="..\CstrikeNatives.cpp" /> <ClCompile Include="..\CstrikeNatives.cpp" />
<ClCompile Include="..\CstrikePlayer.cpp" /> <ClCompile Include="..\CstrikePlayer.cpp" />
<ClCompile Include="..\CstrikeUserMessages.cpp" /> <ClCompile Include="..\CstrikeUserMessages.cpp" />

View File

@ -53,9 +53,6 @@
<ClCompile Include="..\..\..\..\public\sdk\amxxmodule.cpp"> <ClCompile Include="..\..\..\..\public\sdk\amxxmodule.cpp">
<Filter>Module SDK\SDK Base</Filter> <Filter>Module SDK\SDK Base</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\CstrikeHLTypeConversion.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\CstrikeUserMessages.cpp"> <ClCompile Include="..\CstrikeUserMessages.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>