Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AcceptEntityInput 64bit fix #2149

Merged
merged 3 commits into from
May 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion extensions/bintools/jit_call_x64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
12 changes: 12 additions & 0 deletions extensions/sdktools/AMBuilder
Original file line number Diff line number Diff line change
Expand Up @@ -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':
Expand Down
97 changes: 19 additions & 78 deletions extensions/sdktools/variant-t.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,14 @@
#include "variant-t.h"
#include <datamap.h>

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); \
Expand All @@ -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<IHandleEntity *>(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;
}
Expand All @@ -183,4 +124,4 @@ sp_nativeinfo_t g_VariantTNatives[] =
{"SetVariantColor", SetVariantColor},
{"SetVariantEntity", SetVariantEntity},
{NULL, NULL},
};
};
14 changes: 5 additions & 9 deletions extensions/sdktools/variant-t.h
Original file line number Diff line number Diff line change
Expand Up @@ -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_