310 lines
5.5 KiB
C++
310 lines
5.5 KiB
C++
#include "fakemeta_amxx.h"
|
|
|
|
TraceResult g_tr_2;
|
|
KeyValueData g_kvd_2;
|
|
|
|
KVD_Wrapper g_kvd_glb;
|
|
|
|
static cell AMX_NATIVE_CALL set_tr2(AMX *amx, cell *params)
|
|
{
|
|
TraceResult *tr;
|
|
if (params[1] == 0)
|
|
tr = &g_tr_2;
|
|
else
|
|
tr = reinterpret_cast<TraceResult *>(params[1]);
|
|
|
|
if (*params / sizeof(cell) < 3)
|
|
{
|
|
MF_LogError(amx, AMX_ERR_NATIVE, "No data passed");
|
|
return 0;
|
|
}
|
|
|
|
cell *ptr = MF_GetAmxAddr(amx, params[3]);
|
|
|
|
switch (params[2])
|
|
{
|
|
case TR_AllSolid:
|
|
{
|
|
tr->fAllSolid = *ptr;
|
|
return 1;
|
|
break;
|
|
}
|
|
case TR_InOpen:
|
|
{
|
|
tr->fInOpen = *ptr;
|
|
return 1;
|
|
break;
|
|
}
|
|
case TR_StartSolid:
|
|
{
|
|
tr->fStartSolid = *ptr;
|
|
return 1;
|
|
break;
|
|
}
|
|
case TR_InWater:
|
|
{
|
|
tr->fInWater = *ptr;
|
|
return 1;
|
|
break;
|
|
}
|
|
case TR_flFraction:
|
|
{
|
|
tr->flFraction = amx_ctof(*ptr);
|
|
return 1;
|
|
break;
|
|
}
|
|
case TR_vecEndPos:
|
|
{
|
|
tr->vecEndPos.x = amx_ctof(ptr[0]);
|
|
tr->vecEndPos.y = amx_ctof(ptr[1]);
|
|
tr->vecEndPos.z = amx_ctof(ptr[2]);
|
|
return 1;
|
|
break;
|
|
}
|
|
case TR_flPlaneDist:
|
|
{
|
|
tr->flPlaneDist = amx_ctof(*ptr);
|
|
return 1;
|
|
break;
|
|
}
|
|
case TR_vecPlaneNormal:
|
|
{
|
|
tr->vecPlaneNormal.x = amx_ctof(ptr[0]);
|
|
tr->vecPlaneNormal.y = amx_ctof(ptr[1]);
|
|
tr->vecPlaneNormal.z = amx_ctof(ptr[2]);
|
|
return 1;
|
|
break;
|
|
}
|
|
case TR_pHit:
|
|
{
|
|
edict_t *e = INDEXENT(*ptr);
|
|
if (!e || FNullEnt(e))
|
|
return 0; //TODO: return error
|
|
tr->pHit = e;
|
|
return 1;
|
|
break;
|
|
}
|
|
case TR_iHitgroup:
|
|
{
|
|
tr->iHitgroup = *ptr;
|
|
return 1;
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
MF_LogError(amx, AMX_ERR_NATIVE, "Unknown traceresult member %d", params[2]);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static cell AMX_NATIVE_CALL get_tr2(AMX *amx, cell *params)
|
|
{
|
|
TraceResult *tr;
|
|
if (params[1] == 0)
|
|
tr = &g_tr_2;
|
|
else
|
|
tr = reinterpret_cast<TraceResult *>(params[1]);
|
|
|
|
cell *ptr;
|
|
|
|
switch (params[2])
|
|
{
|
|
case TR_AllSolid:
|
|
{
|
|
return tr->fAllSolid;
|
|
break;
|
|
}
|
|
case TR_InOpen:
|
|
{
|
|
return tr->fInOpen;
|
|
break;
|
|
}
|
|
case TR_StartSolid:
|
|
{
|
|
return tr->fStartSolid;
|
|
break;
|
|
}
|
|
case TR_InWater:
|
|
{
|
|
return tr->fInWater;
|
|
break;
|
|
}
|
|
case TR_flFraction:
|
|
{
|
|
ptr = MF_GetAmxAddr(amx, params[3]);
|
|
*ptr = amx_ftoc(tr->flFraction);
|
|
return 1;
|
|
break;
|
|
}
|
|
case TR_vecEndPos:
|
|
{
|
|
ptr = MF_GetAmxAddr(amx, params[3]);
|
|
ptr[0] = amx_ftoc(tr->vecEndPos.x);
|
|
ptr[1] = amx_ftoc(tr->vecEndPos.y);
|
|
ptr[2] = amx_ftoc(tr->vecEndPos.z);
|
|
return 1;
|
|
break;
|
|
}
|
|
case TR_flPlaneDist:
|
|
{
|
|
ptr = MF_GetAmxAddr(amx, params[3]);
|
|
*ptr = amx_ftoc(tr->flPlaneDist);
|
|
return 1;
|
|
break;
|
|
}
|
|
case TR_vecPlaneNormal:
|
|
{
|
|
ptr = MF_GetAmxAddr(amx, params[3]);
|
|
ptr[0] = amx_ftoc(tr->vecPlaneNormal.x);
|
|
ptr[1] = amx_ftoc(tr->vecPlaneNormal.y);
|
|
ptr[2] = amx_ftoc(tr->vecPlaneNormal.z);
|
|
return 1;
|
|
break;
|
|
}
|
|
case TR_pHit:
|
|
{
|
|
if (gfm_tr->pHit == NULL || FNullEnt(gfm_tr->pHit))
|
|
return -1;
|
|
return ENTINDEX(tr->pHit);
|
|
break;
|
|
}
|
|
case TR_iHitgroup:
|
|
{
|
|
return tr->iHitgroup;
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
MF_LogError(amx, AMX_ERR_NATIVE, "Unknown traceresult member %d", params[2]);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static cell AMX_NATIVE_CALL get_kvd(AMX *amx, cell *params)
|
|
{
|
|
KVD_Wrapper *kvdw;
|
|
KeyValueData *kvd;
|
|
if (params[1] == 0)
|
|
kvdw = &g_kvd_glb;
|
|
else
|
|
kvdw = reinterpret_cast<KVD_Wrapper *>(params[1]);
|
|
kvd = kvdw->kvd;
|
|
|
|
switch (params[2])
|
|
{
|
|
case KV_fHandled:
|
|
{
|
|
return kvd->fHandled;
|
|
break;
|
|
}
|
|
case KV_ClassName:
|
|
{
|
|
if (params[0] / sizeof(cell) != 4)
|
|
{
|
|
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid number of parameters passed");
|
|
return 0;
|
|
}
|
|
cell *ptr = MF_GetAmxAddr(amx, params[4]);
|
|
return MF_SetAmxString(amx, params[3], kvd->szClassName, (int)*ptr);
|
|
break;
|
|
}
|
|
case KV_KeyName:
|
|
{
|
|
if (params[0] / sizeof(cell) != 4)
|
|
{
|
|
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid number of parameters passed");
|
|
return 0;
|
|
}
|
|
cell *ptr = MF_GetAmxAddr(amx, params[4]);
|
|
return MF_SetAmxString(amx, params[3], kvd->szKeyName, (int)*ptr);
|
|
break;
|
|
}
|
|
case KV_Value:
|
|
{
|
|
if (params[0] / sizeof(cell) != 4)
|
|
{
|
|
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid number of parameters passed");
|
|
return 0;
|
|
}
|
|
cell *ptr = MF_GetAmxAddr(amx, params[4]);
|
|
return MF_SetAmxString(amx, params[3], kvd->szValue, (int)*ptr);
|
|
break;
|
|
}
|
|
}
|
|
|
|
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid KeyValueData member: %d", params[2]);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static cell AMX_NATIVE_CALL set_kvd(AMX *amx, cell *params)
|
|
{
|
|
KVD_Wrapper *kvdw;
|
|
KeyValueData *kvd;
|
|
if (params[1] == 0)
|
|
kvdw = &g_kvd_glb;
|
|
else
|
|
kvdw = reinterpret_cast<KVD_Wrapper *>(params[1]);
|
|
kvd = kvdw->kvd;
|
|
|
|
if (*params / sizeof(cell) < 3)
|
|
{
|
|
MF_LogError(amx, AMX_ERR_NATIVE, "No data passed");
|
|
return 0;
|
|
}
|
|
|
|
cell *ptr = MF_GetAmxAddr(amx, params[3]);
|
|
int len;
|
|
|
|
switch (params[2])
|
|
{
|
|
case KV_fHandled:
|
|
{
|
|
kvd->fHandled = (int)*ptr;
|
|
return 1;
|
|
break;
|
|
}
|
|
case KV_ClassName:
|
|
{
|
|
kvdw->cls.assign(MF_GetAmxString(amx, params[1], 0, &len));
|
|
kvd->szClassName = const_cast<char *>(kvdw->cls.c_str());
|
|
return 1;
|
|
break;
|
|
}
|
|
case KV_KeyName:
|
|
{
|
|
kvdw->key.assign(MF_GetAmxString(amx, params[1], 0, &len));
|
|
kvd->szKeyName = const_cast<char *>(kvdw->key.c_str());
|
|
return 1;
|
|
break;
|
|
}
|
|
case KV_Value:
|
|
{
|
|
kvdw->val.assign(MF_GetAmxString(amx, params[1], 0, &len));
|
|
kvd->szValue = const_cast<char *>(kvdw->val.c_str());
|
|
return 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid KeyValueData member: %d", params[2]);
|
|
|
|
return 0;
|
|
}
|
|
|
|
AMX_NATIVE_INFO ext2_natives[] =
|
|
{
|
|
{"get_tr2", get_tr2},
|
|
{"set_tr2", set_tr2},
|
|
{"get_kvd", get_kvd},
|
|
{"set_kvd", set_kvd},
|
|
{NULL, NULL},
|
|
};
|
|
|