amxmodx/modules/fakemeta/fm_tr.cpp

197 lines
3.4 KiB
C++
Raw Normal View History

// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
//
// Fakemeta Module
//
2004-09-14 10:16:52 +04:00
#include "fakemeta_amxx.h"
2004-09-15 22:40:18 +04:00
TraceResult *gfm_tr;
KeyValueData *g_fm_keyValueData;
2004-09-14 10:16:52 +04:00
static cell AMX_NATIVE_CALL set_tr(AMX *amx, cell *params)
{
2004-09-15 22:40:18 +04:00
int type = params[1];
2004-09-14 10:16:52 +04:00
2004-09-15 22:40:18 +04:00
if (*params / sizeof(cell) < 2)
{
MF_LogError(amx, AMX_ERR_NATIVE, "No data passed");
return 0;
}
2004-09-14 10:16:52 +04:00
2004-09-15 22:40:18 +04:00
cell *ptr = MF_GetAmxAddr(amx, params[2]);
2004-09-14 10:16:52 +04:00
edict_t *e = 0;
switch (type)
{
case TR_AllSolid:
{
2004-09-15 22:40:18 +04:00
gfm_tr->fAllSolid = *ptr;
2004-09-14 10:16:52 +04:00
return 1;
break;
}
case TR_StartSolid:
{
gfm_tr->fStartSolid = *ptr;
return 1;
2004-09-14 10:16:52 +04:00
break;
}
case TR_InOpen:
{
gfm_tr->fInOpen = *ptr;
return 1;
break;
}
2004-09-14 10:16:52 +04:00
case TR_InWater:
{
2004-09-15 22:40:18 +04:00
gfm_tr->fInWater = *ptr;
2004-09-14 10:16:52 +04:00
return 1;
break;
}
case TR_flFraction:
{
2004-09-15 22:40:18 +04:00
gfm_tr->flFraction = amx_ctof(*ptr);
2004-09-14 10:16:52 +04:00
return 1;
break;
}
case TR_vecEndPos:
{
2004-09-15 22:40:18 +04:00
gfm_tr->vecEndPos.x = amx_ctof(ptr[0]);
gfm_tr->vecEndPos.y = amx_ctof(ptr[1]);
gfm_tr->vecEndPos.z = amx_ctof(ptr[2]);
2004-09-14 10:16:52 +04:00
return 1;
break;
}
case TR_flPlaneDist:
{
2004-09-15 22:40:18 +04:00
gfm_tr->flPlaneDist = amx_ctof(*ptr);
2004-09-14 10:16:52 +04:00
return 1;
break;
}
case TR_vecPlaneNormal:
{
2004-09-15 22:40:18 +04:00
gfm_tr->vecPlaneNormal.x = amx_ctof(ptr[0]);
gfm_tr->vecPlaneNormal.y = amx_ctof(ptr[1]);
gfm_tr->vecPlaneNormal.z = amx_ctof(ptr[2]);
2004-09-14 10:16:52 +04:00
return 1;
break;
}
case TR_pHit:
{
e = INDEXENT(*ptr);
if (!e || FNullEnt(e))
return 0; //TODO: return error
2004-09-15 22:40:18 +04:00
gfm_tr->pHit = e;
2004-09-14 10:16:52 +04:00
return 1;
break;
}
case TR_iHitgroup:
{
2004-09-15 22:40:18 +04:00
gfm_tr->iHitgroup = *ptr;
2004-09-14 10:16:52 +04:00
return 1;
break;
}
default:
{
MF_LogError(amx, AMX_ERR_NATIVE, "Unknown TraceResult member %d", params[2]);
2004-09-14 10:16:52 +04:00
return 0;
}
}
}
static cell AMX_NATIVE_CALL get_tr(AMX *amx, cell *params)
{
2004-09-15 22:40:18 +04:00
int type = params[1];
2004-09-14 10:16:52 +04:00
cell *ptr = 0;
switch (type)
{
case TR_AllSolid:
{
2004-09-15 22:40:18 +04:00
return gfm_tr->fAllSolid;
2004-09-14 10:16:52 +04:00
break;
}
case TR_StartSolid:
{
2004-09-15 22:40:18 +04:00
return gfm_tr->fStartSolid;
2004-09-14 10:16:52 +04:00
break;
}
case TR_InOpen:
{
return gfm_tr->fInOpen;
break;
}
2004-09-14 10:16:52 +04:00
case TR_InWater:
{
2004-09-15 22:40:18 +04:00
return gfm_tr->fInWater;
2004-09-14 10:16:52 +04:00
break;
}
case TR_flFraction:
{
2004-09-15 22:40:18 +04:00
ptr = MF_GetAmxAddr(amx, params[2]);
*ptr = amx_ftoc(gfm_tr->flFraction);
2004-09-14 10:16:52 +04:00
return 1;
break;
}
case TR_vecEndPos:
{
2004-09-15 22:40:18 +04:00
ptr = MF_GetAmxAddr(amx, params[2]);
ptr[0] = amx_ftoc(gfm_tr->vecEndPos.x);
ptr[1] = amx_ftoc(gfm_tr->vecEndPos.y);
ptr[2] = amx_ftoc(gfm_tr->vecEndPos.z);
2004-09-14 10:16:52 +04:00
return 1;
break;
}
case TR_flPlaneDist:
{
2004-09-15 22:40:18 +04:00
ptr = MF_GetAmxAddr(amx, params[2]);
*ptr = amx_ftoc(gfm_tr->flPlaneDist);
2004-09-14 10:16:52 +04:00
return 1;
break;
}
case TR_vecPlaneNormal:
{
2004-09-15 22:40:18 +04:00
ptr = MF_GetAmxAddr(amx, params[2]);
ptr[0] = amx_ftoc(gfm_tr->vecPlaneNormal.x);
ptr[1] = amx_ftoc(gfm_tr->vecPlaneNormal.y);
ptr[2] = amx_ftoc(gfm_tr->vecPlaneNormal.z);
2004-09-14 10:16:52 +04:00
return 1;
break;
}
case TR_pHit:
{
2004-09-15 22:55:30 +04:00
if (gfm_tr->pHit == NULL || FNullEnt(gfm_tr->pHit))
return -1;
2004-09-15 22:40:18 +04:00
return ENTINDEX(gfm_tr->pHit);
2004-09-14 10:16:52 +04:00
break;
}
case TR_iHitgroup:
{
2004-09-15 22:40:18 +04:00
return gfm_tr->iHitgroup;
2004-09-14 10:16:52 +04:00
break;
}
default:
{
MF_LogError(amx, AMX_ERR_NATIVE, "Unknown TraceResult member %d", params[2]);
2004-09-14 10:16:52 +04:00
return 0;
}
}
}
2006-03-20 21:08:51 +03:00
AMX_NATIVE_INFO tr_Natives[] =
{
2004-09-14 10:16:52 +04:00
{"get_tr", get_tr},
{"set_tr", set_tr},
{NULL, NULL},
2005-08-25 13:09:35 +04:00
};
2006-03-20 21:08:51 +03:00