diff --git a/extensions/bintools/jit_call_x64.cpp b/extensions/bintools/jit_call_x64.cpp index a2a47fad02..a867aa2b78 100644 --- a/extensions/bintools/jit_call_x64.cpp +++ b/extensions/bintools/jit_call_x64.cpp @@ -725,7 +725,7 @@ inline void Write_PushObject(JitWriter *jit, const SourceHook::PassInfo *info, u ObjectClass classes[MAX_CLASSES]; int numWords = ClassifyObject(smInfo, classes); - if (classes[0] == ObjectClass::Pointer) + if (classes[0] == ObjectClass::Pointer || classes[0] == ObjectClass::Memory) goto push_byref; int neededIntRegs = 0; diff --git a/extensions/sdktools/AMBuilder b/extensions/sdktools/AMBuilder index 9f024b5dce..0b5dca0164 100644 --- a/extensions/sdktools/AMBuilder +++ b/extensions/sdktools/AMBuilder @@ -49,6 +49,18 @@ for sdk_name in SM.sdks: os.path.join(builder.sourcePath, 'public', 'jit'), os.path.join(builder.sourcePath, 'public', 'jit', 'x86'), ] + + if sdk['name'] in ('episode1', 'darkm'): + binary.compiler.cxxincludes += [os.path.join(builder.options.hl2sdk_root, sdk['path'], 'game_shared')] + binary.compiler.cxxincludes += [os.path.join(builder.options.hl2sdk_root, sdk['path'], 'dlls')] + else: + binary.compiler.cxxincludes += [ + os.path.join(builder.options.hl2sdk_root, sdk['path'], 'game', 'shared'), + os.path.join(builder.options.hl2sdk_root, sdk['path'], 'game', 'server'), + ] + + #binary.sources += [os.path.join(builder.options.hl2sdk_root, sdk['path'], 'game', 'server', 'variant_t.cpp')] + binary.compiler.defines += ['HAVE_STRING_H'] if sdk['name'] != 'episode1': diff --git a/extensions/sdktools/variant-t.cpp b/extensions/sdktools/variant-t.cpp index 5c9aecab45..adb8b0f8cf 100644 --- a/extensions/sdktools/variant-t.cpp +++ b/extensions/sdktools/variant-t.cpp @@ -33,7 +33,14 @@ #include "variant-t.h" #include -unsigned char g_Variant_t[SIZEOF_VARIANT_T] = {0}; +variant_t g_Variant_t; + +// copy this definition as the original file includes cbase.h which explodes in a shower of compile errors +void variant_t::SetEntity( CBaseEntity *val ) +{ + eVal = val; + fieldType = FIELD_EHANDLE; +} #define ENTINDEX_TO_CBASEENTITY(ref, buffer) \ buffer = gamehelpers->ReferenceToEntity(ref); \ @@ -42,132 +49,66 @@ unsigned char g_Variant_t[SIZEOF_VARIANT_T] = {0}; return pContext->ThrowNativeError("Entity %d (%d) is not a CBaseEntity", gamehelpers->ReferenceToIndex(ref), ref); \ } -/* Hack to init the variant_t object for the first time */ -class VariantFirstTimeInit -{ -public: - VariantFirstTimeInit() - { - *(unsigned int *)(&g_Variant_t[12]) = INVALID_EHANDLE_INDEX; - } -} g_VariantFirstTimeInit; - static cell_t SetVariantBool(IPluginContext *pContext, const cell_t *params) { - unsigned char *vptr = g_Variant_t; - - *(bool *)vptr = (params[1]) ? true : false; - vptr += sizeof(int)*3 + sizeof(unsigned long); - *(fieldtype_t *)vptr = FIELD_BOOLEAN; - + g_Variant_t.SetBool((params[1]) ? true : false); return 1; } static cell_t SetVariantString(IPluginContext *pContext, const cell_t *params) { char *str; - unsigned char *vptr = g_Variant_t; - pContext->LocalToString(params[1], &str); - - *(string_t *)vptr = MAKE_STRING(str); - vptr += sizeof(int)*3 + sizeof(unsigned long); - *(fieldtype_t *)vptr = FIELD_STRING; - + g_Variant_t.SetString(MAKE_STRING(str)); return 1; } static cell_t SetVariantInt(IPluginContext *pContext, const cell_t *params) { - unsigned char *vptr = g_Variant_t; - - *(int *)vptr = params[1]; - vptr += sizeof(int)*3 + sizeof(unsigned long); - *(fieldtype_t *)vptr = FIELD_INTEGER; - + g_Variant_t.SetInt(params[1]); return 1; } static cell_t SetVariantFloat(IPluginContext *pContext, const cell_t *params) { - unsigned char *vptr = g_Variant_t; - - *(float *)vptr = sp_ctof(params[1]); - vptr += sizeof(int)*3 + sizeof(unsigned long); - *(fieldtype_t *)vptr = FIELD_FLOAT; - + g_Variant_t.SetFloat(sp_ctof(params[1])); return 1; } static cell_t SetVariantVector3D(IPluginContext *pContext, const cell_t *params) { cell_t *val; - unsigned char *vptr = g_Variant_t; - pContext->LocalToPhysAddr(params[1], &val); - *(float *)vptr = sp_ctof(val[0]); - vptr += sizeof(float); - *(float *)vptr = sp_ctof(val[1]); - vptr += sizeof(float); - *(float *)vptr = sp_ctof(val[2]); - vptr += sizeof(float) + sizeof(unsigned long); - *(fieldtype_t *)vptr = FIELD_VECTOR; - + Vector v(sp_ctof(val[0]), sp_ctof(val[1]), sp_ctof(val[2])); + g_Variant_t.SetVector3D(v); return 1; } static cell_t SetVariantPosVector3D(IPluginContext *pContext, const cell_t *params) { cell_t *val; - unsigned char *vptr = g_Variant_t; - pContext->LocalToPhysAddr(params[1], &val); - *(float *)vptr = sp_ctof(val[0]); - vptr += sizeof(float); - *(float *)vptr = sp_ctof(val[1]); - vptr += sizeof(float); - *(float *)vptr = sp_ctof(val[2]); - vptr += sizeof(float) + sizeof(unsigned long); - *(fieldtype_t *)vptr = FIELD_POSITION_VECTOR; - + Vector v(sp_ctof(val[0]), sp_ctof(val[1]), sp_ctof(val[2])); + g_Variant_t.SetPositionVector3D(v); return 1; } static cell_t SetVariantColor(IPluginContext *pContext, const cell_t *params) { cell_t *val; - unsigned char *vptr = g_Variant_t; - pContext->LocalToPhysAddr(params[1], &val); - *(unsigned char *)vptr = val[0]; - vptr += sizeof(unsigned char); - *(unsigned char *)vptr = val[1]; - vptr += sizeof(unsigned char); - *(unsigned char *)vptr = val[2]; - vptr += sizeof(unsigned char); - *(unsigned char *)vptr = val[3]; - vptr += sizeof(unsigned char) + sizeof(int)*2 + sizeof(unsigned long); - *(fieldtype_t *)vptr = FIELD_COLOR32; - + g_Variant_t.SetColor32(val[0], val[1], val[2], val[3]); return 1; } static cell_t SetVariantEntity(IPluginContext *pContext, const cell_t *params) { CBaseEntity *pEntity; - unsigned char *vptr = g_Variant_t; - CBaseHandle bHandle; - ENTINDEX_TO_CBASEENTITY(params[1], pEntity); - bHandle = reinterpret_cast(pEntity)->GetRefEHandle(); - - vptr += sizeof(int)*3; - *(unsigned long *)vptr = (unsigned long)(bHandle.ToInt()); - vptr += sizeof(unsigned long); - *(fieldtype_t *)vptr = FIELD_EHANDLE; + g_Variant_t.SetEntity(pEntity); return 1; } @@ -183,4 +124,4 @@ sp_nativeinfo_t g_VariantTNatives[] = {"SetVariantColor", SetVariantColor}, {"SetVariantEntity", SetVariantEntity}, {NULL, NULL}, -}; \ No newline at end of file +}; diff --git a/extensions/sdktools/variant-t.h b/extensions/sdktools/variant-t.h index 3e5f174914..4ce759dc59 100644 --- a/extensions/sdktools/variant-t.h +++ b/extensions/sdktools/variant-t.h @@ -32,26 +32,22 @@ #ifndef _INCLUDE_SOURCEMOD_EXTENSION_VARIANT_T_H_ #define _INCLUDE_SOURCEMOD_EXTENSION_VARIANT_T_H_ -#define SIZEOF_VARIANT_T 20 +#include "variant_t.h" + +#define SIZEOF_VARIANT_T sizeof(variant_t) /** * @file variant-t.h * @brief SDK Tools extension gamerules natives header. */ -extern unsigned char g_Variant_t[SIZEOF_VARIANT_T]; +extern variant_t g_Variant_t; extern sp_nativeinfo_t g_VariantTNatives[]; inline void _init_variant_t() { - unsigned char *vptr = g_Variant_t; - - *(int *)vptr = 0; - vptr += sizeof(int)*3; - *(unsigned long *)vptr = INVALID_EHANDLE_INDEX; - vptr += sizeof(unsigned long); - *(fieldtype_t *)vptr = FIELD_VOID; + memset(&g_Variant_t, 0, sizeof(g_Variant_t)); } #endif //_INCLUDE_SOURCEMOD_EXTENSION_VARIANT_T_H_ \ No newline at end of file