Accelerator |
11-18-2018 10:03 |
Copyback Vector
Hello. I am trying to call a function that, after executing get a position in a variable:
PHP Code:
cell_t L4D2_GetRandomSpawnPosition(IPluginContext *pContext, const cell_t *params) { if (g_pZombieManager == NULL) { return pContext->ThrowNativeError("ZombieManager unsupported or not available; file a bug report"); }
static ICallWrapper *pWrapper = NULL;
if (!pWrapper) { REGISTER_NATIVE_ADDR("GetRandomSpawnPosition", PassInfo pass[4]; \ pass[0].flags = PASSFLAG_BYVAL; \ pass[0].size = sizeof(ZombieClassType); \ pass[0].type = PassType_Basic; \ pass[1].flags = PASSFLAG_BYVAL; \ pass[1].size = sizeof(int); \ pass[1].type = PassType_Basic; \ pass[2].flags = PASSFLAG_BYVAL; \ pass[2].size = sizeof(CBaseEntity *); \ pass[2].type = PassType_Basic; \ pass[3].flags = PASSFLAG_BYVAL; \ pass[3].size = sizeof(Vector*); \ pass[3].type = PassType_Basic; \ pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 4)); }
int client = params[3]; CBaseEntity * pClient = NULL; if (client != -1) { pClient = UTIL_GetCBaseEntity(client, true); if(pClient == NULL) { return pContext->ThrowNativeError("Invalid client entity"); } }
Vector vector; vector[0] = sp_ctof(0.0); vector[1] = sp_ctof(0.0); vector[2] = sp_ctof(0.0);
unsigned char vstk[ sizeof(void*) + sizeof(ZombieClassType) + sizeof(int) + sizeof(CBaseEntity *) + sizeof(Vector*) ]; unsigned char *vptr = vstk;
*(void **)vptr = g_pZombieManager; vptr += sizeof(void *); *(cell_t*)vptr = params[1]; vptr += sizeof(ZombieClassType);
*(int *)vptr = params[2]; vptr += sizeof(int *);
*(CBaseEntity **)vptr = pClient; vptr += sizeof(CBaseEntity *);
*(Vector**)vptr = &vector;
pWrapper->Execute(vstk, NULL);
const void *buffer = (const unsigned char *)vstk + pWrapper->GetParamInfo(3)->offset;
Vector *v = NULL; v = *(Vector**)buffer;
cell_t* addr; pContext->LocalToPhysAddr(params[4], &addr);
addr[0]=sp_ftoc(v->x); addr[1]=sp_ftoc(v->y); addr[2]=sp_ftoc(v->z); return 0; }
It works in linux, but in windows I get a server crash on pWrapper->Execute(vstk, NULL);... How can I assign a different solution so that after the call, the function returns an updated variable (like for example VENCODE_FLAG_COPYBACK in sdktools)?
|