2
0
mirror of https://github.com/rehlds/reapi.git synced 2024-12-27 23:25:30 +03:00

GCC support and fixed warnings

This commit is contained in:
s1lent 2019-06-24 00:40:02 +07:00
parent 0eed4cd833
commit d4b3e3c7eb
No known key found for this signature in database
GPG Key ID: 0FE401DC73916B5C
20 changed files with 243 additions and 140 deletions

View File

@ -14,6 +14,7 @@ import gradlecpp.VelocityUtils
apply plugin: 'cpp'
apply plugin: 'windows-resources'
apply plugin: IccCompilerPlugin
apply plugin: GccCompilerPlugin
List<Task> getRcCompileTasks(NativeBinarySpec binary) {
def linkTask = GradleCppUtils.getLinkTask(binary)
@ -36,6 +37,7 @@ void postEvaluate(NativeBinarySpec b) {
}
void setupToolchain(NativeBinarySpec b) {
boolean useGcc = project.hasProperty("useGcc")
ToolchainConfig cfg = rootProject.createToolchainConfig(b)
cfg.projectInclude(project, '', '/src', '/common', '/src/mods', '/src/natives', '/include', '/include/metamod', '/include/cssdk/common', '/include/cssdk/dlls', '/include/cssdk/engine', '/include/cssdk/game_shared', '/include/cssdk/pm_shared', '/include/cssdk/public')
cfg.singleDefines('HAVE_STRONG_TYPEDEF');
@ -49,11 +51,13 @@ void setupToolchain(NativeBinarySpec b) {
cfg.compilerOptions.args '/Ob2', '/Oi', '/GF', '/GR-', '/GS-'
cfg.singleDefines('_CRT_SECURE_NO_WARNINGS')
} else if (cfg instanceof GccToolchainConfig) {
cfg.compilerOptions.pchConfig = new GccToolchainConfig.PrecompilerHeaderOptions(
enabled: true,
pchSourceSet: 'reapi_pch'
)
cfg.compilerOptions.languageStandard = 'c++0x'
if (!useGcc) {
cfg.compilerOptions.pchConfig = new GccToolchainConfig.PrecompilerHeaderOptions(
enabled: true,
pchSourceSet: 'reapi_pch'
)
}
cfg.compilerOptions.languageStandard = 'c++11'
cfg.defines([
'_stricmp': 'strcasecmp',
'_strnicmp': 'strncasecmp',
@ -61,7 +65,13 @@ void setupToolchain(NativeBinarySpec b) {
'_snprintf': 'snprintf'
])
cfg.compilerOptions.args '-Qoption,cpp,--treat_func_as_string_literal_cpp', '-msse2', '-fomit-frame-pointer', '-inline-forceinline', '-fvisibility=default', '-fvisibility-inlines-hidden', '-fno-rtti', '-g0', '-s', '-fno-exceptions', '-no-ansi-alias'
if (useGcc) {
cfg.compilerOptions.args '-fno-strict-aliasing', '-finline-functions'
} else {
cfg.compilerOptions.args '-Qoption,cpp,--treat_func_as_string_literal_cpp', '-inline-forceinline', '-no-ansi-alias'
}
cfg.compilerOptions.args '-Wall', '-Wno-unknown-pragmas', '-msse2', '-fomit-frame-pointer', '-fvisibility=default', '-fvisibility-inlines-hidden', '-fno-rtti', '-g0', '-s', '-fno-exceptions'
}
ToolchainConfigUtils.apply(project, cfg, b)
@ -84,9 +94,11 @@ model {
}
toolChains {
visualCpp(VisualCpp) {
}
icc(Icc) {
visualCpp(VisualCpp)
if (project.hasProperty("useGcc")) {
gcc(Gcc)
} else {
icc(Icc)
}
}

View File

@ -32,11 +32,9 @@
#pragma once
#endif
#include "osconfig.h"
#include "mathlib.h"
// Has no references on server side.
#define NOXREF
// Function body is not implemented.
@ -44,6 +42,26 @@
// Function is not tested at all.
#define UNTESTED
#define CONST_INTEGER_AS_STRING(x) #x //Wraps the integer in quotes, allowing us to form constant strings with it
#define __HACK_LINE_AS_STRING__(x) CONST_INTEGER_AS_STRING(x) //__LINE__ can only be converted to an actual number by going through this, otherwise the output is literally "__LINE__"
#define __LINE__AS_STRING __HACK_LINE_AS_STRING__(__LINE__) //Gives you the line number in constant string form
#if defined _MSC_VER || defined __INTEL_COMPILER
#define NOXREFCHECK int __retAddr; __asm { __asm mov eax, [ebp + 4] __asm mov __retAddr, eax }; Sys_Error("[NOXREFCHECK]: %s: (" __FILE__ ":" __LINE__AS_STRING ") NOXREF, but called from 0x%.08x", __func__, __retAddr)
#else
// For EBP based stack (older gcc) (uncomment version apropriate for your compiler)
//#define NOXREFCHECK int __retAddr; __asm__ __volatile__("movl 4(%%ebp), %%eax;" "movl %%eax, %0":"=r"(__retAddr)::"%eax"); Sys_Error("[NOXREFCHECK]: %s: (" __FILE__ ":" __LINE__AS_STRING ") NOXREF, but called from 0x%.08x", __func__, __retAddr);
// For ESP based stack (newer gcc) (uncomment version apropriate for your compiler)
#define NOXREFCHECK int __retAddr; __asm__ __volatile__("movl 16(%%esp), %%eax;" "movl %%eax, %0":"=r"(__retAddr)::"%eax"); Sys_Error("[NOXREFCHECK]: %s: (" __FILE__ ":" __LINE__AS_STRING ") NOXREF, but called from 0x%.08x", __func__, __retAddr);
#endif
#define BIT(n) (1<<(n))
// From engine/server.h
typedef enum sv_delta_s
{
sv_packet_nodelta,
sv_packet_delta,
} sv_delta_t;
#endif // MAINTYPES_H

View File

@ -8,78 +8,61 @@ enum fwdstate
FSTATE_STOPPED
};
template <typename T = void>
class CAmxxHook
class CAmxxHookBase
{
public:
~CAmxxHook()
~CAmxxHookBase()
{
if (m_index != -1) {
g_amxxapi.UnregisterSPForward(m_index);
m_index = -1;
}
delete m_uniqueData;
}
CAmxxHook(AMX *amx, const char *funcname, int index, T *data = nullptr) :
CAmxxHookBase(AMX *amx, const char *funcname, int index) :
m_index(index),
m_state(FSTATE_ENABLED),
m_amx(amx),
m_uniqueData(data)
m_amx(amx)
{
Q_strlcpy(m_CallbackName, funcname);
};
}
T *GetUnique() const;
int GetIndex() const;
fwdstate GetState() const;
AMX *GetAmx() const;
const char *GetCallbackName() const;
int GetIndex() const { return m_index; }
fwdstate GetState() const { return m_state; }
AMX *GetAmx() const { return m_amx; }
const char *GetCallbackName() const { return m_CallbackName; }
void SetState(fwdstate st);
void SetState(fwdstate st) { m_state = st; }
private:
T *m_uniqueData;
int m_index;
char m_CallbackName[64];
fwdstate m_state;
AMX *m_amx;
};
// Inlines
template <typename T>
inline T *CAmxxHook<T>::GetUnique() const
class CAmxxHookUnique: public CAmxxHookBase
{
return m_uniqueData;
}
public:
~CAmxxHookUnique()
{
if (m_uniqueData)
{
delete m_uniqueData;
m_uniqueData = nullptr;
}
}
template <typename T>
inline AMX *CAmxxHook<T>::GetAmx() const
{
return m_amx;
}
CAmxxHookUnique(AMX *amx, const char *funcname, int index, T *data = nullptr) :
CAmxxHookBase(amx, funcname, index),
m_uniqueData(data)
{
template <typename T>
inline const char *CAmxxHook<T>::GetCallbackName() const
{
return m_CallbackName;
}
}
template <typename T>
inline int CAmxxHook<T>::GetIndex() const
{
return m_index;
}
T *GetUnique() const { return m_uniqueData; }
template <typename T>
inline fwdstate CAmxxHook<T>::GetState() const
{
return m_state;
}
template <typename T>
inline void CAmxxHook<T>::SetState(fwdstate st)
{
m_state = st;
}
private:
T *m_uniqueData;
};

View File

@ -122,12 +122,12 @@ C_DLLEXPORT int GetEntityAPI2(DLL_FUNCTIONS *pFunctionTable, int *interfaceVersi
{
if (!pFunctionTable)
{
ALERT(at_logged, __FUNCTION__ " called with null pFunctionTable");
ALERT(at_logged, "GetEntityAPI2 called with null pFunctionTable");
return FALSE;
}
else if (*interfaceVersion != INTERFACE_VERSION)
{
ALERT(at_logged, __FUNCTION__ " version mismatch; requested=%d ours=%d", *interfaceVersion, INTERFACE_VERSION);
ALERT(at_logged, "GetEntityAPI2 version mismatch; requested=%d ours=%d", *interfaceVersion, INTERFACE_VERSION);
//! Tell metamod what version we had, so it can figure out who is out of date.
*interfaceVersion = INTERFACE_VERSION;
@ -143,12 +143,12 @@ C_DLLEXPORT int GetEntityAPI2_Post(DLL_FUNCTIONS *pFunctionTable, int *interface
{
if (!pFunctionTable)
{
ALERT(at_logged, __FUNCTION__ " called with null pFunctionTable");
ALERT(at_logged, "GetEntityAPI2_Post called with null pFunctionTable");
return FALSE;
}
else if (*interfaceVersion != INTERFACE_VERSION)
{
ALERT(at_logged, __FUNCTION__ " version mismatch; requested=%d ours=%d", *interfaceVersion, INTERFACE_VERSION);
ALERT(at_logged, "GetEntityAPI2_Post version mismatch; requested=%d ours=%d", *interfaceVersion, INTERFACE_VERSION);
//! Tell metamod what version we had, so it can figure out who is out of date.
*interfaceVersion = INTERFACE_VERSION;

View File

@ -176,12 +176,12 @@ C_DLLEXPORT int GetEngineFunctions_Post(enginefuncs_t *pengfuncsFromEngine, int
{
if (!pengfuncsFromEngine)
{
ALERT(at_logged, __FUNCTION__ " called with null pengfuncsFromEngine");
ALERT(at_logged, "GetEngineFunctions_Post called with null pengfuncsFromEngine");
return FALSE;
}
else if (*interfaceVersion != ENGINE_INTERFACE_VERSION)
{
ALERT(at_logged, __FUNCTION__ " version mismatch; requested=%d ours=%d", *interfaceVersion, ENGINE_INTERFACE_VERSION);
ALERT(at_logged, "GetEngineFunctions_Post version mismatch; requested=%d ours=%d", *interfaceVersion, ENGINE_INTERFACE_VERSION);
// Tell metamod what version we had, so it can figure out who is out of date.
*interfaceVersion = ENGINE_INTERFACE_VERSION;
return FALSE;

View File

@ -61,7 +61,7 @@ bool CEntityCallback::SetThink(AMX *amx, CBaseEntity *pEntity, const char *pszCa
return false;
}
m_callbacks.push_back(new CAmxxHook<eCallback_t>(amx, pszCallback, fwdid, new eCallback_t(pEntity, pParams, iParamsLen, CType_Think)));
m_callbacks.push_back(new CAmxxHookUnique<eCallback_t>(amx, pszCallback, fwdid, new eCallback_t(pEntity, pParams, iParamsLen, CType_Think)));
pEntity->SetThink(&CBaseEntity::SUB_Think);
return true;
}
@ -82,7 +82,7 @@ bool CEntityCallback::SetTouch(AMX *amx, CBaseEntity *pEntity, const char *pszCa
return false;
}
m_callbacks.push_back(new CAmxxHook<eCallback_t>(amx, pszCallback, fwdid, new eCallback_t(pEntity, pParams, iParamsLen, CType_Touch)));
m_callbacks.push_back(new CAmxxHookUnique<eCallback_t>(amx, pszCallback, fwdid, new eCallback_t(pEntity, pParams, iParamsLen, CType_Touch)));
pEntity->SetTouch(&CBaseEntity::SUB_Touch);
return true;
}
@ -103,7 +103,7 @@ bool CEntityCallback::SetUse(AMX *amx, CBaseEntity *pEntity, const char *pszCall
return false;
}
m_callbacks.push_back(new CAmxxHook<eCallback_t>(amx, pszCallback, fwdid, new eCallback_t(pEntity, pParams, iParamsLen, CType_Use)));
m_callbacks.push_back(new CAmxxHookUnique<eCallback_t>(amx, pszCallback, fwdid, new eCallback_t(pEntity, pParams, iParamsLen, CType_Use)));
pEntity->SetUse(&CBaseEntity::SUB_Use);
return true;
}
@ -124,7 +124,7 @@ bool CEntityCallback::SetBlocked(AMX *amx, CBaseEntity *pEntity, const char *psz
return false;
}
m_callbacks.push_back(new CAmxxHook<eCallback_t>(amx, pszCallback, fwdid, new eCallback_t(pEntity, pParams, iParamsLen, CType_Blocked)));
m_callbacks.push_back(new CAmxxHookUnique<eCallback_t>(amx, pszCallback, fwdid, new eCallback_t(pEntity, pParams, iParamsLen, CType_Blocked)));
pEntity->SetBlocked(&CBaseEntity::SUB_Blocked);
return true;
}
@ -145,7 +145,7 @@ bool CEntityCallback::SetMoveDone(AMX *amx, CBaseEntity *pEntity, const char *ps
return false;
}
m_callbacks.push_back(new CAmxxHook<eCallback_t>(amx, pszCallback, fwdid, new eCallback_t(pEntity, pParams, iParamsLen, CType_MoveDone)));
m_callbacks.push_back(new CAmxxHookUnique<eCallback_t>(amx, pszCallback, fwdid, new eCallback_t(pEntity, pParams, iParamsLen, CType_MoveDone)));
// TODO: Make sure that the entity actually inherited from CBaseToggle
((CBaseToggle *)pEntity)->SetMoveDone(&CBaseToggle::SUB_MoveDone);

View File

@ -72,7 +72,7 @@ private:
size_t m_iParamLen;
};
std::vector<CAmxxHook<eCallback_t> *> m_callbacks;
std::vector<CAmxxHookUnique<eCallback_t> *> m_callbacks;
};
extern CEntityCallback g_entCallback;

View File

@ -130,7 +130,9 @@ struct hookctx_t
tempstrings_used++;
return ptr;
}
return "<reapi error>";
static char fatalErr[] = "<reapi error>";
return fatalErr;
}
void clear_temp_strings() const

View File

@ -71,7 +71,7 @@ struct regfunc
int regfunc::current_cell = 1;
#define ENG(h,...) { {}, {}, #h, "ReHLDS", [](){ return api_cfg.hasReHLDS(); }, ((!(RH_##h & (MAX_REGION_RANGE - 1)) ? regfunc::current_cell = 1, true : false) || (RH_##h & (MAX_REGION_RANGE - 1)) == regfunc::current_cell++) ? regfunc(h##__VA_ARGS__) : regfunc(#h#__VA_ARGS__), [](){ g_RehldsHookchains->##h##()->registerHook(&##h); }, [](){ g_RehldsHookchains->##h##()->unregisterHook(&##h); }}
#define ENG(h,...) { {}, {}, #h, "ReHLDS", [](){ return api_cfg.hasReHLDS(); }, ((!(RH_##h & (MAX_REGION_RANGE - 1)) ? regfunc::current_cell = 1, true : false) || (RH_##h & (MAX_REGION_RANGE - 1)) == regfunc::current_cell++) ? regfunc(h##__VA_ARGS__) : regfunc(#h#__VA_ARGS__), [](){ g_RehldsHookchains->h()->registerHook(&h); }, [](){ g_RehldsHookchains->h()->unregisterHook(&h); }}
hook_t hooklist_engine[] = {
ENG(SV_StartSound),
ENG(SV_DropClient),
@ -80,7 +80,7 @@ hook_t hooklist_engine[] = {
ENG(SV_WriteFullClientUpdate, _AMXX)
};
#define DLL(h) { {}, {}, #h, "ReGameDLL", [](){ return api_cfg.hasReGameDLL(); }, ((!(RG_##h & (MAX_REGION_RANGE - 1)) ? regfunc::current_cell = 1, true : false) || (RG_##h & (MAX_REGION_RANGE - 1)) == regfunc::current_cell++) ? regfunc(h) : regfunc(#h), [](){ g_ReGameHookchains->##h##()->registerHook(&##h); }, [](){ g_ReGameHookchains->##h##()->unregisterHook(&##h); }}
#define DLL(h) { {}, {}, #h, "ReGameDLL", [](){ return api_cfg.hasReGameDLL(); }, ((!(RG_##h & (MAX_REGION_RANGE - 1)) ? regfunc::current_cell = 1, true : false) || (RG_##h & (MAX_REGION_RANGE - 1)) == regfunc::current_cell++) ? regfunc(h) : regfunc(#h), [](){ g_ReGameHookchains->h()->registerHook(&h); }, [](){ g_ReGameHookchains->h()->unregisterHook(&h); }}
hook_t hooklist_gamedll[] = {
DLL(GetForceCamera),
DLL(PlayerBlind),
@ -196,7 +196,7 @@ hook_t hooklist_weaponbox[] = {
DLL(CWeaponBox_SetModel),
};
#define RCHECK(h,...) { {}, {}, #h, "ReChecker", [](){ return api_cfg.hasRechecker(); }, ((!(RC_##h & (MAX_REGION_RANGE - 1)) ? regfunc::current_cell = 1, true : false) || (RC_##h & (MAX_REGION_RANGE - 1)) == regfunc::current_cell++) ? regfunc(h##__VA_ARGS__) : regfunc(#h#__VA_ARGS__), [](){ g_RecheckerHookchains->##h##()->registerHook(&##h); }, [](){ g_RecheckerHookchains->##h##()->unregisterHook(&##h); }}
#define RCHECK(h,...) { {}, {}, #h, "ReChecker", [](){ return api_cfg.hasRechecker(); }, ((!(RC_##h & (MAX_REGION_RANGE - 1)) ? regfunc::current_cell = 1, true : false) || (RC_##h & (MAX_REGION_RANGE - 1)) == regfunc::current_cell++) ? regfunc(h##__VA_ARGS__) : regfunc(#h#__VA_ARGS__), [](){ g_RecheckerHookchains->h()->registerHook(&h); }, [](){ g_RecheckerHookchains->h()->unregisterHook(&h); }}
hook_t hooklist_rechecker[] = {
RCHECK(FileConsistencyProcess, _AMXX),
RCHECK(FileConsistencyFinal),

View File

@ -11,8 +11,8 @@ typedef void (*regchain_t)();
struct hook_t
{
std::vector<class CAmxxHook<> *> pre; // pre forwards
std::vector<class CAmxxHook<> *> post; // post forwards
std::vector<class CAmxxHookBase *> pre; // pre forwards
std::vector<class CAmxxHookBase *> post; // post forwards
const char *func_name; // function name
const char *depend_name; // platform dependency
@ -59,6 +59,8 @@ struct hooklist_t
CASE(weaponbox)
}
#undef CASE
return nullptr;
}
@ -74,9 +76,7 @@ struct hooklist_t
ht_gamerules,
ht_rechecker,
ht_grenade,
ht_weaponbox,
ht_end
ht_weaponbox
};
};

View File

@ -13,7 +13,7 @@ int CHookManager::addHandler(AMX *amx, int func, const char *funcname, int forwa
}
auto& dest = post ? hook->post : hook->pre;
dest.push_back(new CAmxxHook<>(amx, funcname, forward));
dest.push_back(new CAmxxHookBase(amx, funcname, forward));
int id = func * MAX_HOOK_FORWARDS + dest.size();
return post ? -id : id; // use unsigned ids for post hooks
}
@ -28,7 +28,7 @@ hook_t *CHookManager::getHook(size_t func) const
return m_hooklist.getHookSafe(func);
}
CAmxxHook<> *CHookManager::getAmxxHook(cell handle) const
CAmxxHookBase *CHookManager::getAmxxHook(cell handle) const
{
bool post = handle < 0;

View File

@ -9,7 +9,7 @@ public:
void Clear() const;
cell addHandler(AMX *amx, int func, const char *funcname, int forward, bool post) const;
hook_t *getHook(size_t func) const;
CAmxxHook<> *getAmxxHook(cell hook) const;
CAmxxHookBase *getAmxxHook(cell hook) const;
hook_t *getHookFast(size_t func) const {
return m_hooklist[func];

View File

@ -7,62 +7,66 @@
#if _MSC_VER <= 1800 && __INTEL_COMPILER < 1500
// BUG BUG
// http://connect.microsoft.com/VisualStudio/feedbackdetail/view/797682/c-decltype-of-class-member-access-incompletely-implemented
#define decltypefx(cx, pref, dt, mx) decltype(std::declval<cx>()dt##pref##mx)
#define decltypefx(cx, pref, mx) decltype(std::declval<cx>().pref##mx)
#define decltypefxdot(cx, pref, mx) decltype(std::declval<cx>().pref.mx)
#else
#define decltypefx(cx, pref, dt, mx) decltype(cx::pref##mx)
#define decltypefx(cx, pref, mx) decltype(cx::pref##mx)
#define decltypefxdot(cx, pref, mx) decltype(cx::pref.mx)
#endif
#define CLASS_MEMBERS(cx, mx, postf, pref) ((!(postf & (MAX_REGION_RANGE - 1)) ? regmember::current_cell = 1, true : false) || (postf & (MAX_REGION_RANGE - 1)) == regmember::current_cell++) ? regmember([](member_t* ptr){ decltypefx(cx, pref, ., mx) f = {};ptr->size = getTypeSize(f);ptr->max_size = sizeof(f);ptr->offset = offsetof(##cx, ##pref##mx);ptr->type = getMemberType(f);ptr->name = #postf;}) : regmember(#pref#mx)
#define CLASS_MEMBERS(cx, mx, postf) ((!(postf & (MAX_REGION_RANGE - 1)) ? regmember::current_cell = 1, true : false) || (postf & (MAX_REGION_RANGE - 1)) == regmember::current_cell++) ? regmember([](member_t* ptr){ decltypefx(cx, , mx) f = {};ptr->size = getTypeSize(f);ptr->max_size = sizeof(f);ptr->offset = offsetof(cx, mx);ptr->type = getMemberType(f);ptr->name = #postf;}) : regmember(#mx)
#define CLASS_MEMBERS_PREF(cx, mx, postf, pref) ((!(postf & (MAX_REGION_RANGE - 1)) ? regmember::current_cell = 1, true : false) || (postf & (MAX_REGION_RANGE - 1)) == regmember::current_cell++) ? regmember([](member_t* ptr){ decltypefx(cx, pref, mx) f = {};ptr->size = getTypeSize(f);ptr->max_size = sizeof(f);ptr->offset = offsetof(cx, pref##mx);ptr->type = getMemberType(f);ptr->name = #postf;}) : regmember(#pref#mx)
#define CLASS_MEMBERS_DOT(cx, mx, postf, pref) ((!(postf & (MAX_REGION_RANGE - 1)) ? regmember::current_cell = 1, true : false) || (postf & (MAX_REGION_RANGE - 1)) == regmember::current_cell++) ? regmember([](member_t* ptr){ decltypefxdot(cx, pref, mx) f = {};ptr->size = getTypeSize(f);ptr->max_size = sizeof(f);ptr->offset = offsetof(cx, pref.mx);ptr->type = getMemberType(f);ptr->name = #postf;}) : regmember(#pref"."#mx)
#define GM_MEMBERS(mx) CLASS_MEMBERS(CHalfLifeMultiplay, mx, mx,)
#define GM_VOICE_MEMBERS(mx) CLASS_MEMBERS(CHalfLifeMultiplay, mx, mx, m_VoiceGameMgr.)
#define BASE_MEMBERS(mx) CLASS_MEMBERS(CBaseEntity, mx, mx,)
#define ANIM_MEMBERS(mx) CLASS_MEMBERS(CBaseAnimating, mx, mx,)
#define MONST_MEMBERS(mx) CLASS_MEMBERS(CBaseMonster, mx, mx,)
#define PL_MEMBERS(mx) CLASS_MEMBERS(CBasePlayer, mx, mx,)
#define EVAR_MEMBERS(mx) CLASS_MEMBERS(com_entvars, mx, var_##mx,)
#define PMOVE_MEMBERS(mx) CLASS_MEMBERS(com_playermove, mx, pm_##mx,)
#define MOVEVAR_MEMBERS(mx) CLASS_MEMBERS(movevars_t, mx, mv_##mx,)
#define UCMD_MEMBERS(mx) CLASS_MEMBERS(usercmd_s, mx, ucmd_##mx,)
#define PMTRACE_MEMBERS(mx) CLASS_MEMBERS(pmtrace_s, mx, pmt_##mx,)
#define CSPL_MEMBERS(mx) CLASS_MEMBERS(CCSPlayer, mx, mx,)
#define BASEITEM_MEMBERS(mx) CLASS_MEMBERS(CBasePlayerItem, mx, mx,)
#define BASEWPN_MEMBERS(mx) CLASS_MEMBERS(CBasePlayerWeapon, mx, m_Weapon_##mx, m_)
#define WPNBOX_MEMBERS(mx) CLASS_MEMBERS(CWeaponBox, mx, m_WeaponBox_##mx, m_)
#define ARMOURY_MEMBERS(mx) CLASS_MEMBERS(CArmoury, mx, m_Armoury_##mx, m_)
#define GRENADE_MEMBERS(mx) CLASS_MEMBERS(CGrenade, mx, m_Grenade_##mx, m_)
#define P228_MEMBERS(mx) CLASS_MEMBERS(CP228, mx, m_P228_##mx, m_)
#define SCOUT_MEMBERS(mx) CLASS_MEMBERS(CSCOUT, mx, m_SCOUT_##mx, m_)
#define HEGREN_MEMBERS(mx) CLASS_MEMBERS(CHEGrenade, mx, m_HEGrenade_##mx, m_)
#define XM1014_MEMBERS(mx) CLASS_MEMBERS(CXM1014, mx, m_XM1014_##mx, m_)
#define C4_MEMBERS(mx) CLASS_MEMBERS(CC4, mx, m_C4_##mx, m_)
#define MAC10_MEMBERS(mx) CLASS_MEMBERS(CMAC10, mx, m_MAC10_##mx, m_)
#define AUG_MEMBERS(mx) CLASS_MEMBERS(CAUG, mx, m_AUG_##mx, m_)
#define SMOKEGREN_MEMBERS(mx) CLASS_MEMBERS(CSmokeGrenade, mx, m_SmokeGrenade_##mx, m_)
#define ELITE_MEMBERS(mx) CLASS_MEMBERS(CELITE, mx, m_ELITE_##mx, m_)
#define FIVESEVEN_MEMBERS(mx) CLASS_MEMBERS(CFiveSeven, mx, m_FiveSeven_##mx, m_)
#define UMP45_MEMBERS(mx) CLASS_MEMBERS(CUMP45, mx, m_UMP45_##mx, m_)
#define SG550_MEMBERS(mx) CLASS_MEMBERS(CSG550, mx, m_SG550_##mx, m_)
#define GALIL_MEMBERS(mx) CLASS_MEMBERS(CGalil, mx, m_Galil_##mx, m_)
#define FAMAS_MEMBERS(mx) CLASS_MEMBERS(CFamas, mx, m_Famas_##mx, m_)
#define USP_MEMBERS(mx) CLASS_MEMBERS(CUSP, mx, m_USP_##mx, m_)
#define GLOCK18_MEMBERS(mx) CLASS_MEMBERS(CGLOCK18, mx, m_GLOCK18_##mx, m_)
#define AWP_MEMBERS(mx) CLASS_MEMBERS(CAWP, mx, m_AWP_##mx, m_)
#define MP5N_MEMBERS(mx) CLASS_MEMBERS(CMP5N, mx, m_MP5N_##mx, m_)
#define M249_MEMBERS(mx) CLASS_MEMBERS(CM249, mx, m_M249_##mx, m_)
#define M3_MEMBERS(mx) CLASS_MEMBERS(CM3, mx, m_M3_##mx, m_)
#define M4A1_MEMBERS(mx) CLASS_MEMBERS(CM4A1, mx, m_M4A1_##mx, m_)
#define TMP_MEMBERS(mx) CLASS_MEMBERS(CTMP, mx, m_TMP_##mx, m_)
#define G3SG1_MEMBERS(mx) CLASS_MEMBERS(CG3SG1, mx, m_G3SG1_##mx, m_)
#define DEAGLE_MEMBERS(mx) CLASS_MEMBERS(CDEAGLE, mx, m_DEAGLE_##mx, m_)
#define SG552_MEMBERS(mx) CLASS_MEMBERS(CSG552, mx, m_SG552_##mx, m_)
#define AK47_MEMBERS(mx) CLASS_MEMBERS(CAK47, mx, m_AK47_##mx, m_)
#define KNIFE_MEMBERS(mx) CLASS_MEMBERS(CKnife, mx, m_Knife_##mx, m_)
#define P90_MEMBERS(mx) CLASS_MEMBERS(CP90, mx, m_P90_##mx, m_)
#define SHIELD_MEMBERS(mx) CLASS_MEMBERS(CWShield, mx, m_Shield_##mx, m_)
#define REBUYSTRUCT_MEMBERS(mx) CLASS_MEMBERS(RebuyStruct, mx, mx,)
#define MAPINFO_MEMBERS(mx) CLASS_MEMBERS(CMapInfo, mx, m_MapInfo_##mx, m_)
#define CSPLWPN_MEMBERS(mx) CLASS_MEMBERS(CCSPlayerWeapon, mx, m_Weapon_##mx, m_)
#define GM_MEMBERS(mx) CLASS_MEMBERS(CHalfLifeMultiplay, mx, mx)
#define GM_VOICE_MEMBERS(mx) CLASS_MEMBERS_DOT(CHalfLifeMultiplay, mx, mx, m_VoiceGameMgr)
#define BASE_MEMBERS(mx) CLASS_MEMBERS(CBaseEntity, mx, mx)
#define ANIM_MEMBERS(mx) CLASS_MEMBERS(CBaseAnimating, mx, mx)
#define MONST_MEMBERS(mx) CLASS_MEMBERS(CBaseMonster, mx, mx)
#define PL_MEMBERS(mx) CLASS_MEMBERS(CBasePlayer, mx, mx)
#define EVAR_MEMBERS(mx) CLASS_MEMBERS(com_entvars, mx, var_##mx)
#define PMOVE_MEMBERS(mx) CLASS_MEMBERS(com_playermove, mx, pm_##mx)
#define MOVEVAR_MEMBERS(mx) CLASS_MEMBERS(movevars_t, mx, mv_##mx)
#define UCMD_MEMBERS(mx) CLASS_MEMBERS(usercmd_s, mx, ucmd_##mx)
#define PMTRACE_MEMBERS(mx) CLASS_MEMBERS(pmtrace_s, mx, pmt_##mx)
#define CSPL_MEMBERS(mx) CLASS_MEMBERS(CCSPlayer, mx, mx)
#define BASEITEM_MEMBERS(mx) CLASS_MEMBERS(CBasePlayerItem, mx, mx)
#define BASEWPN_MEMBERS(mx) CLASS_MEMBERS_PREF(CBasePlayerWeapon, mx, m_Weapon_##mx, m_)
#define WPNBOX_MEMBERS(mx) CLASS_MEMBERS_PREF(CWeaponBox, mx, m_WeaponBox_##mx, m_)
#define ARMOURY_MEMBERS(mx) CLASS_MEMBERS_PREF(CArmoury, mx, m_Armoury_##mx, m_)
#define GRENADE_MEMBERS(mx) CLASS_MEMBERS_PREF(CGrenade, mx, m_Grenade_##mx, m_)
#define P228_MEMBERS(mx) CLASS_MEMBERS_PREF(CP228, mx, m_P228_##mx, m_)
#define SCOUT_MEMBERS(mx) CLASS_MEMBERS_PREF(CSCOUT, mx, m_SCOUT_##mx, m_)
#define HEGREN_MEMBERS(mx) CLASS_MEMBERS_PREF(CHEGrenade, mx, m_HEGrenade_##mx, m_)
#define XM1014_MEMBERS(mx) CLASS_MEMBERS_PREF(CXM1014, mx, m_XM1014_##mx, m_)
#define C4_MEMBERS(mx) CLASS_MEMBERS_PREF(CC4, mx, m_C4_##mx, m_)
#define MAC10_MEMBERS(mx) CLASS_MEMBERS_PREF(CMAC10, mx, m_MAC10_##mx, m_)
#define AUG_MEMBERS(mx) CLASS_MEMBERS_PREF(CAUG, mx, m_AUG_##mx, m_)
#define SMOKEGREN_MEMBERS(mx) CLASS_MEMBERS_PREF(CSmokeGrenade, mx, m_SmokeGrenade_##mx, m_)
#define ELITE_MEMBERS(mx) CLASS_MEMBERS_PREF(CELITE, mx, m_ELITE_##mx, m_)
#define FIVESEVEN_MEMBERS(mx) CLASS_MEMBERS_PREF(CFiveSeven, mx, m_FiveSeven_##mx, m_)
#define UMP45_MEMBERS(mx) CLASS_MEMBERS_PREF(CUMP45, mx, m_UMP45_##mx, m_)
#define SG550_MEMBERS(mx) CLASS_MEMBERS_PREF(CSG550, mx, m_SG550_##mx, m_)
#define GALIL_MEMBERS(mx) CLASS_MEMBERS_PREF(CGalil, mx, m_Galil_##mx, m_)
#define FAMAS_MEMBERS(mx) CLASS_MEMBERS_PREF(CFamas, mx, m_Famas_##mx, m_)
#define USP_MEMBERS(mx) CLASS_MEMBERS_PREF(CUSP, mx, m_USP_##mx, m_)
#define GLOCK18_MEMBERS(mx) CLASS_MEMBERS_PREF(CGLOCK18, mx, m_GLOCK18_##mx, m_)
#define AWP_MEMBERS(mx) CLASS_MEMBERS_PREF(CAWP, mx, m_AWP_##mx, m_)
#define MP5N_MEMBERS(mx) CLASS_MEMBERS_PREF(CMP5N, mx, m_MP5N_##mx, m_)
#define M249_MEMBERS(mx) CLASS_MEMBERS_PREF(CM249, mx, m_M249_##mx, m_)
#define M3_MEMBERS(mx) CLASS_MEMBERS_PREF(CM3, mx, m_M3_##mx, m_)
#define M4A1_MEMBERS(mx) CLASS_MEMBERS_PREF(CM4A1, mx, m_M4A1_##mx, m_)
#define TMP_MEMBERS(mx) CLASS_MEMBERS_PREF(CTMP, mx, m_TMP_##mx, m_)
#define G3SG1_MEMBERS(mx) CLASS_MEMBERS_PREF(CG3SG1, mx, m_G3SG1_##mx, m_)
#define DEAGLE_MEMBERS(mx) CLASS_MEMBERS_PREF(CDEAGLE, mx, m_DEAGLE_##mx, m_)
#define SG552_MEMBERS(mx) CLASS_MEMBERS_PREF(CSG552, mx, m_SG552_##mx, m_)
#define AK47_MEMBERS(mx) CLASS_MEMBERS_PREF(CAK47, mx, m_AK47_##mx, m_)
#define KNIFE_MEMBERS(mx) CLASS_MEMBERS_PREF(CKnife, mx, m_Knife_##mx, m_)
#define P90_MEMBERS(mx) CLASS_MEMBERS_PREF(CP90, mx, m_P90_##mx, m_)
#define SHIELD_MEMBERS(mx) CLASS_MEMBERS_PREF(CWShield, mx, m_Shield_##mx, m_)
#define REBUYSTRUCT_MEMBERS(mx) CLASS_MEMBERS(RebuyStruct, mx, mx)
#define MAPINFO_MEMBERS(mx) CLASS_MEMBERS_PREF(CMapInfo, mx, m_MapInfo_##mx, m_)
#define CSPLWPN_MEMBERS(mx) CLASS_MEMBERS_PREF(CCSPlayerWeapon, mx, m_Weapon_##mx, m_)
inline MType getMemberType(float*) { return MEMBER_FLOAT; }
inline MType getMemberType(float) { return MEMBER_FLOAT; }
@ -118,8 +122,10 @@ inline MType getMemberType(RebuyStruct) { return MEBMER_REBUYSTRUCT; }
inline MType getMemberType(pmtrace_t) { return MEMBER_PMTRACE; }
inline MType getMemberType(usercmd_s) { return MEBMER_USERCMD; }
template<typename T> struct always_false: std::false_type {};
template<typename T>
inline MType getMemberType(T) { static_assert(false, "Not implemented overload"); }
inline MType getMemberType(T) { static_assert(always_false<T>::value, "Not implemented overload"); return MEMBER_NONE; }
template<typename T, size_t size>
inline size_t getTypeSize(T type[size]) { return sizeof(T); }
@ -141,6 +147,11 @@ struct regmember
int regmember::current_cell = 1;
#ifdef __GNUC__
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Winvalid-offsetof"
#endif // #ifdef __GNUC__
member_t memberlist_gamerules[] = {
GM_MEMBERS(m_bFreezePeriod),
GM_MEMBERS(m_bBombDropped),
@ -1004,6 +1015,10 @@ member_t memberlist_csplayerweapon[] = {
CSPLWPN_MEMBERS(flBaseDamage),
};
#ifdef __GNUC__
#pragma GCC diagnostic pop
#endif // #ifdef __GNUC__
memberlist_t memberlist;
member_t *memberlist_t::operator[](size_t members) const
@ -1064,5 +1079,6 @@ member_t *memberlist_t::operator[](size_t members) const
CASE(csplayerweapon)
}
#undef CASE
return nullptr;
}

View File

@ -5,7 +5,8 @@
// member types
enum MType
{
MEMBER_FLOAT = 0, // Any floating point value
MEMBER_NONE = 0,
MEMBER_FLOAT, // Any floating point value
MEMBER_DOUBLE, // double value
MEMBER_ENTITY, // An entity offset (EOFFSET)
MEMBER_CLASSPTR, // CBaseEntity *

View File

@ -12,8 +12,8 @@ bool VTC_Api_Init()
if (!g_pVoiceTranscoderApi)
return false;
int majorVersion = g_pVoiceTranscoderApi->GetMajorVersion();
int minorVersion = g_pVoiceTranscoderApi->GetMinorVersion();
size_t majorVersion = g_pVoiceTranscoderApi->GetMajorVersion();
size_t minorVersion = g_pVoiceTranscoderApi->GetMinorVersion();
if (majorVersion != VOICETRANSCODER_API_VERSION_MAJOR)
{

View File

@ -1202,7 +1202,8 @@ cell AMX_NATIVE_CALL rg_give_defusekit(AMX *amx, cell *params)
return FALSE;
}
pPlayer->m_bHasDefuser = pPlayer->pev->body = params[arg_def] != 0;
pPlayer->m_bHasDefuser = params[arg_def] ? true : false;
pPlayer->pev->body = params[arg_def] ? 1 : 0;
if (params[arg_def] != 0)
{
@ -1326,6 +1327,8 @@ cell AMX_NATIVE_CALL rg_set_user_team(AMX *amx, cell *params)
case CT:
CSGameRules()->m_iNumCT++;
break;
default:
break;
}
// previous team
@ -1359,6 +1362,8 @@ cell AMX_NATIVE_CALL rg_set_user_team(AMX *amx, cell *params)
pPlayer->CSPlayer()->SendItemStatus();
}
break;
default:
break;
}
}

View File

@ -57,4 +57,4 @@ void GetBonePosition(CBaseEntity *pEntity, int iBone, Vector *vecOrigin, Vector
void GetAttachment(CBaseEntity *pEntity, int iBone, Vector *pVecOrigin, Vector *pVecAngles);
void RemoveOrDropItem(CBasePlayer *pPlayer, CBasePlayerItem *pItem, GiveType type);
extern void __declspec(noreturn) UTIL_SysError(const char *fmt, ...);
extern void NORETURN UTIL_SysError(const char *fmt, ...);

View File

@ -1,6 +1,6 @@
#include "precompiled.h"
void __declspec(noreturn) UTIL_SysError(const char *fmt, ...)
void NORETURN UTIL_SysError(const char *fmt, ...)
{
va_list argptr;
char string[8192];

View File

@ -8,6 +8,7 @@ import org.gradle.nativeplatform.toolchain.VisualCpp
apply from: 'shared_msvc.gradle'
apply from: 'shared_icc.gradle'
apply from: 'shared_gcc.gradle'
rootProject.ext.createToolchainConfig = { NativeBinarySpec bin ->
BinaryKind binaryKind
@ -27,6 +28,8 @@ rootProject.ext.createToolchainConfig = { NativeBinarySpec bin ->
return rootProject.createMsvcConfig(releaseBuild, binaryKind)
} else if (bin.toolChain instanceof Icc) {
return rootProject.createIccConfig(releaseBuild, binaryKind)
} else if (bin.toolChain instanceof Gcc) {
return rootProject.createGccConfig(releaseBuild, binaryKind)
} else {
throw new RuntimeException("Unknown native toolchain: ${bin.toolChain.class.name}")
}

63
shared_gcc.gradle Normal file
View File

@ -0,0 +1,63 @@
import org.doomedsociety.gradlecpp.cfg.BinaryKind
import org.doomedsociety.gradlecpp.gcc.GccToolchainConfig
import org.doomedsociety.gradlecpp.gcc.OptimizationLevel
rootProject.ext.createGccConfig = { boolean release, BinaryKind binKind ->
GccToolchainConfig cfg
if (release) {
cfg = new GccToolchainConfig(
compilerOptions: new GccToolchainConfig.CompilerOptions(
optimizationLevel: OptimizationLevel.LEVEL_3,
stackProtector: false,
noBuiltIn: true,
positionIndependentCode: false,
extraDefines: [
'linux': null,
'__linux__': null,
'NDEBUG': null,
'_GLIBCXX_USE_CXX11_ABI': 0, // don't use specific c++11 features from GCC 5.X for backward compatibility to earlier version ABI libstdc++.so.6
],
),
linkerOptions: new GccToolchainConfig.LinkerOptions(
stripSymbolTable: false,
staticLibGcc: false,
staticLibStdCpp: false,
),
librarianOptions: new GccToolchainConfig.LibrarianOptions(
)
)
} else {
// debug
cfg = new GccToolchainConfig(
compilerOptions: new GccToolchainConfig.CompilerOptions(
optimizationLevel: OptimizationLevel.DISABLE,
stackProtector: true,
noBuiltIn: true,
extraDefines: [
'linux': null,
'__linux__': null,
'NDEBUG': null,
'_GLIBCXX_USE_CXX11_ABI': 0, // don't use specific c++11 features from GCC 5.X for backward compatibility to earlier version ABI libstdc++.so.6
],
),
linkerOptions: new GccToolchainConfig.LinkerOptions(
stripSymbolTable: false,
staticLibGcc: false,
staticLibStdCpp: false,
),
librarianOptions: new GccToolchainConfig.LibrarianOptions(
)
)
}
cfg.singleDefines('LINUX', '_LINUX')
return cfg
}