amxmodx/dlls/engine/engine.cpp
David Anderson 9c59ece7a4 New registers for impulse, think, and touch.
Fixed DispatchKeyValue related natives and forwards.
2004-06-25 22:51:18 +00:00

2127 lines
61 KiB
C++
Executable File

#include "engine.h"
struct usercmd_s *g_cmd;
struct PlayerInfo plinfo[33];
struct GlobalInfo glinfo;
TraceResult g_tr;
void UTIL_SetSize(edict_t *pev, const Vector &vecMin, const Vector &vecMax)
{
SET_SIZE(ENT(pev), vecMin, vecMax);
}
edict_t *UTIL_FindEntityInSphere(edict_t *pStart, const Vector &vecCenter, float flRadius) {
if (!pStart) pStart = NULL;
pStart = FIND_ENTITY_IN_SPHERE(pStart, vecCenter, flRadius);
if (!FNullEnt(pStart)) return pStart;
return NULL;
}
static cell AMX_NATIVE_CALL register_think(AMX *amx, cell *params)
{
int len;
EntClass *p = new EntClass;
const char *clsname = MF_GetAmxString(amx, params[1], 0, &len);
p->Class = new char[strlen(clsname)+1];
strcpy(p->Class, clsname);
p->Forward = MF_RegisterSPForwardByName(amx, MF_GetAmxString(amx, params[2], 0, &len), FP_CELL);
Thinks.push_back(p);
return p->Forward;
}
static cell AMX_NATIVE_CALL register_impulse(AMX *amx, cell *params)
{
int len;
Impulse *p = new Impulse;
p->Check = params[1];
p->Forward = MF_RegisterSPForwardByName(amx, MF_GetAmxString(amx, params[2], 0, &len), FP_CELL);
Impulses.push_back(p);
return p->Forward;
}
static cell AMX_NATIVE_CALL register_touch(AMX *amx, cell *params)
{
int len;
char *Toucher = MF_GetAmxString(amx, params[1], 0, &len);
char *Touched = MF_GetAmxString(amx, params[2], 1, &len);
Touch *p = new Touch;
if (!strlen(Toucher) || strcmp(Toucher, "*")==0) {
p->Toucher = 0;
} else {
p->Toucher = new char[strlen(Toucher)+1];
strcpy(p->Toucher, Toucher);
}
if (!strlen(Touched) || strcmp(Touched, "*")==0) {
p->Touched = 0;
} else {
p->Touched = new char[strlen(Touched)+1];
strcpy(p->Touched, Touched);
}
p->Forward = MF_RegisterSPForwardByName(amx, MF_GetAmxString(amx, params[3], 2, &len), FP_CELL, FP_CELL);
Touches.push_back(p);
return p->Forward;
}
static cell AMX_NATIVE_CALL halflife_time(AMX *amx, cell *params)
{
REAL fVal = gpGlobals->time;
return amx_ftoc(fVal);
}
static cell AMX_NATIVE_CALL VelocityByAim(AMX *amx, cell *params)
{
int iEnt = params[1];
int iVelocity = params[2];
cell *vRet = MF_GetAmxAddr(amx, params[3]);
Vector vVector = Vector(0, 0, 0);
if (!is_ent_valid(iEnt)) {
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
return 0;
}
edict_t *pEnt = INDEXENT(iEnt);
MAKE_VECTORS(pEnt->v.v_angle);
vVector = gpGlobals->v_forward * iVelocity;
vRet[0] = amx_ftoc(vVector.x);
vRet[1] = amx_ftoc(vVector.y);
vRet[2] = amx_ftoc(vVector.z);
return 1;
}
// RadiusDamage. Damages players within a certain radius. ToDo: add the
// damage messaging so players know where the damage is coming from
// (the red arrow-like things on the screen).
//(vexd)
static cell AMX_NATIVE_CALL RadiusDamage(AMX *amx, cell *params) {
cell *cAddr = MF_GetAmxAddr(amx,params[1]);
REAL fCurrentX = amx_ctof(cAddr[0]);
REAL fCurrentY = amx_ctof(cAddr[1]);
REAL fCurrentZ = amx_ctof(cAddr[2]);
int iDamageMultiplier = params[2];
int iRadiusMultiplier = params[3];
Vector vOrigin = Vector(fCurrentX, fCurrentY, fCurrentZ);
edict_t *pSearchEnt = NULL;
while((pSearchEnt = UTIL_FindEntityInSphere(pSearchEnt, vOrigin, 5 * iRadiusMultiplier)) != NULL) {
if(FStrEq(STRING(pSearchEnt->v.classname), "player")) {
if(pSearchEnt->v.takedamage != DAMAGE_NO) {
pSearchEnt->v.health -= 10 + RANDOM_FLOAT(0,1 * iDamageMultiplier);
if(pSearchEnt->v.health < 1) {
pSearchEnt->v.health = 1;
MDLL_ClientKill(pSearchEnt);
}
}
}
}
pSearchEnt = NULL;
while((pSearchEnt = UTIL_FindEntityInSphere(pSearchEnt, vOrigin, 4 * iRadiusMultiplier)) != NULL) {
if(FStrEq(STRING(pSearchEnt->v.classname), "player")) {
if(pSearchEnt->v.takedamage != DAMAGE_NO) {
pSearchEnt->v.health -= 25 + RANDOM_FLOAT(0,2 * iDamageMultiplier);
if(pSearchEnt->v.health < 1) {
pSearchEnt->v.health = 1;
MDLL_ClientKill(pSearchEnt);
}
}
}
}
pSearchEnt = NULL;
while((pSearchEnt = UTIL_FindEntityInSphere(pSearchEnt, vOrigin, 3 * iRadiusMultiplier)) != NULL) {
if(FStrEq(STRING(pSearchEnt->v.classname), "player")) {
if(pSearchEnt->v.takedamage != DAMAGE_NO) {
pSearchEnt->v.health -= 50 + RANDOM_FLOAT(0,3 * iDamageMultiplier);
if(pSearchEnt->v.health < 1) {
pSearchEnt->v.health = 1;
MDLL_ClientKill(pSearchEnt);
}
}
}
}
pSearchEnt = NULL;
while((pSearchEnt = UTIL_FindEntityInSphere(pSearchEnt, vOrigin, 2 * iRadiusMultiplier)) != NULL) {
if(FStrEq(STRING(pSearchEnt->v.classname), "player")) {
if(pSearchEnt->v.takedamage != DAMAGE_NO) MDLL_ClientKill(pSearchEnt);
}
}
return 1;
}
static cell AMX_NATIVE_CALL PointContents(AMX *amx, cell *params)
{
cell *cAddr = MF_GetAmxAddr(amx, params[1]);
REAL fX = amx_ctof(cAddr[0]);
REAL fY = amx_ctof(cAddr[1]);
REAL fZ = amx_ctof(cAddr[2]);
Vector vPoint = Vector(fX, fY, fZ);
return POINT_CONTENTS(vPoint);
}
static cell AMX_NATIVE_CALL vector_to_angle(AMX *amx, cell *params)
{
cell *cAddr = MF_GetAmxAddr(amx, params[1]);
REAL fX = amx_ctof(cAddr[0]);
REAL fY = amx_ctof(cAddr[1]);
REAL fZ = amx_ctof(cAddr[2]);
Vector vVector = Vector(fX, fY, fZ);
Vector vAngle = Vector(0, 0, 0);
VEC_TO_ANGLES(vVector, vAngle);
cell *vRet = MF_GetAmxAddr(amx, params[2]);
vRet[0] = amx_ftoc(vAngle.x);
vRet[1] = amx_ftoc(vAngle.y);
vRet[2] = amx_ftoc(vAngle.z);
return 1;
}
static cell AMX_NATIVE_CALL vector_length(AMX *amx, cell *params)
{
cell *cAddr = MF_GetAmxAddr(amx, params[1]);
REAL fX = amx_ctof(cAddr[0]);
REAL fY = amx_ctof(cAddr[1]);
REAL fZ = amx_ctof(cAddr[2]);
Vector vVector = Vector(fX, fY, fZ);
REAL fLength = vVector.Length();
return amx_ftoc(fLength);
}
static cell AMX_NATIVE_CALL vector_distance(AMX *amx, cell *params)
{
cell *cAddr = MF_GetAmxAddr(amx, params[1]);
cell *cAddr2 = MF_GetAmxAddr(amx, params[2]);
REAL fX = amx_ctof(cAddr[0]);
REAL fY = amx_ctof(cAddr[1]);
REAL fZ = amx_ctof(cAddr[2]);
REAL fX2 = amx_ctof(cAddr2[0]);
REAL fY2 = amx_ctof(cAddr2[1]);
REAL fZ2 = amx_ctof(cAddr2[2]);
Vector vVector = Vector(fX, fY, fZ);
Vector vVector2 = Vector(fX2, fY2, fZ2);
REAL fLength = (vVector - vVector2).Length();
return amx_ftoc(fLength);
}
static cell AMX_NATIVE_CALL trace_normal(AMX *amx, cell *params)
{
int iEnt = params[1];
cell *cStart = MF_GetAmxAddr(amx, params[2]);
cell *cEnd = MF_GetAmxAddr(amx, params[3]);
REAL fStartX = amx_ctof(cStart[0]);
REAL fStartY = amx_ctof(cStart[1]);
REAL fStartZ = amx_ctof(cStart[2]);
REAL fEndX = amx_ctof(cEnd[0]);
REAL fEndY = amx_ctof(cEnd[1]);
REAL fEndZ = amx_ctof(cEnd[2]);
cell *vRet = MF_GetAmxAddr(amx, params[4]);
Vector vStart = Vector(fStartX, fStartY, fStartZ);
Vector vEnd = Vector(fEndX, fEndY, fEndZ);
TraceResult tr;
TRACE_LINE(vStart, vEnd, dont_ignore_monsters, INDEXENT(iEnt), &tr);
vRet[0] = amx_ftoc(tr.vecPlaneNormal.x);
vRet[1] = amx_ftoc(tr.vecPlaneNormal.y);
vRet[2] = amx_ftoc(tr.vecPlaneNormal.z);
if (tr.flFraction >= 1.0)
return 0;
return 1;
}
static cell AMX_NATIVE_CALL trace_line(AMX *amx, cell *params)
{
int iEnt = params[1];
cell *cStart = MF_GetAmxAddr(amx, params[2]);
cell *cEnd = MF_GetAmxAddr(amx, params[3]);
REAL fStartX = amx_ctof(cStart[0]);
REAL fStartY = amx_ctof(cStart[1]);
REAL fStartZ = amx_ctof(cStart[2]);
REAL fEndX = amx_ctof(cEnd[0]);
REAL fEndY = amx_ctof(cEnd[1]);
REAL fEndZ = amx_ctof(cEnd[2]);
cell *vRet = MF_GetAmxAddr(amx, params[4]);
Vector vStart = Vector(fStartX, fStartY, fStartZ);
Vector vEnd = Vector(fEndX, fEndY, fEndZ);
TraceResult tr;
if (iEnt == -1)
TRACE_LINE(vStart, vEnd, ignore_monsters, NULL, &tr);
else
TRACE_LINE(vStart, vEnd, dont_ignore_monsters, INDEXENT(iEnt), &tr);
edict_t *pHit = tr.pHit;
vRet[0] = amx_ftoc(tr.vecEndPos.x);
vRet[1] = amx_ftoc(tr.vecEndPos.y);
vRet[2] = amx_ftoc(tr.vecEndPos.z);
if (FNullEnt(pHit))
return 0;
return ENTINDEX(pHit);
}
static cell AMX_NATIVE_CALL set_speak(AMX *amx, cell *params) {
int iIndex = params[1];
int iNewSpeakFlags = params[2];
if (iIndex> 32 || !is_ent_valid(iIndex)) {
MF_RaiseAmxError(amx,AMX_ERR_NATIVE);
return 0;
}
plinfo[iIndex].iSpeakFlags = iNewSpeakFlags;
return 1;
}
static cell AMX_NATIVE_CALL get_speak(AMX *amx, cell *params) {
int iIndex = params[1];
if (!is_ent_valid(iIndex) || iIndex > 32) {
MF_RaiseAmxError(amx,AMX_ERR_NATIVE);
return 0;
}
return plinfo[iIndex].iSpeakFlags;
}
static cell AMX_NATIVE_CALL get_decal_index(AMX *amx, cell *params)
{
int len;
char *szDecal = MF_GetAmxString(amx, params[1], 0, &len);
return DECAL_INDEX(szDecal);
}
static cell AMX_NATIVE_CALL precache_event(AMX *amx, cell *params)
{
int len;
char *szEvent = MF_FormatAmxString(amx, params, 2, &len);
PRECACHE_EVENT(params[1], (char *)STRING(ALLOC_STRING(szEvent)));
return 1;
}
static cell AMX_NATIVE_CALL get_info_keybuffer(AMX *amx, cell *params)
{
int iEnt = params[1];
if (!is_ent_valid(iEnt)) {
MF_RaiseAmxError(amx,AMX_ERR_NATIVE);
return 0;
}
edict_t *e = INDEXENT(iEnt);
char *info = GETINFOKEYBUFFER(e);
return MF_SetAmxString(amx, params[2], info, params[3]);
}
//from jghg, who says it doesn't work
static cell AMX_NATIVE_CALL drop_to_floor(AMX *amx, cell *params)
{
int iEnt = params[1];
if (!is_ent_valid(iEnt)) {
MF_RaiseAmxError(amx,AMX_ERR_NATIVE);
return 0;
}
edict_t *e = INDEXENT(iEnt);
return DROP_TO_FLOOR(e);
}
static cell AMX_NATIVE_CALL precache_generic(AMX *amx, cell *params)
{
int len;
char* szPreCache = MF_GetAmxString(amx,params[1],0,&len);
PRECACHE_GENERIC((char*)STRING(ALLOC_STRING(szPreCache)));
return 1;
}
// Attachview, this allows you to attach a player's view to an entity.
// use AttachView(player, player) to reset view.
//(vexd)
static cell AMX_NATIVE_CALL attach_view(AMX *amx, cell *params)
{
int iIndex = params[1];
int iTargetIndex = params[2];
if (iIndex > 32 || !is_ent_valid(iIndex)) {
MF_RaiseAmxError(amx,AMX_ERR_NATIVE);
return 0;
}
if (!is_ent_valid(iTargetIndex)) {
MF_RaiseAmxError(amx,AMX_ERR_NATIVE);
return 0;
}
SET_VIEW(INDEXENT(iIndex), INDEXENT(iTargetIndex));
return 1;
}
// SetView, this sets the view of a player. This is done by
// Creating a camera entity, which follows the player.
//(vexd)
static cell AMX_NATIVE_CALL set_view(AMX *amx, cell *params) {
int iIndex = params[1];
int iCameraType = params[2];
if (iIndex > 32 || !is_ent_valid(iIndex)) {
MF_RaiseAmxError(amx,AMX_ERR_NATIVE);
return 0;
}
edict_t *pPlayer = INDEXENT(iIndex);
edict_t *pNewCamera;
switch(iCameraType)
{
case CAMERA_NONE:
SET_VIEW(pPlayer, pPlayer);
if(plinfo[ENTINDEX(pPlayer)].pViewEnt) {
REMOVE_ENTITY(plinfo[ENTINDEX(pPlayer)].pViewEnt);
}
plinfo[ENTINDEX(pPlayer)].iViewType = CAMERA_NONE;
plinfo[ENTINDEX(pPlayer)].pViewEnt = NULL;
pPlayer->v.rendermode = plinfo[ENTINDEX(pPlayer)].iRenderMode;
pPlayer->v.renderamt = plinfo[ENTINDEX(pPlayer)].fRenderAmt;
plinfo[ENTINDEX(pPlayer)].iRenderMode = 0;
plinfo[ENTINDEX(pPlayer)].fRenderAmt = 0;
return 1;
break;
case CAMERA_3RDPERSON:
if(plinfo[ENTINDEX(pPlayer)].iViewType != CAMERA_NONE) {
plinfo[ENTINDEX(pPlayer)].iViewType = CAMERA_3RDPERSON;
return 1;
}
plinfo[ENTINDEX(pPlayer)].iRenderMode = pPlayer->v.rendermode;
plinfo[ENTINDEX(pPlayer)].fRenderAmt = pPlayer->v.renderamt;
plinfo[ENTINDEX(pPlayer)].iViewType = CAMERA_3RDPERSON;
pNewCamera = CREATE_NAMED_ENTITY(MAKE_STRING("info_target"));
pNewCamera->v.classname = MAKE_STRING("VexdCam");
SET_MODEL(pNewCamera, "models/rpgrocket.mdl");
SET_SIZE(pNewCamera, Vector(0, 0, 0), Vector(0, 0, 0));
pNewCamera->v.movetype = MOVETYPE_NOCLIP;
pNewCamera->v.solid = SOLID_NOT;
pNewCamera->v.takedamage = DAMAGE_NO;
pNewCamera->v.gravity = 0;
pNewCamera->v.owner = pPlayer;
pNewCamera->v.rendermode = kRenderTransColor;
pNewCamera->v.renderamt = 0;
pNewCamera->v.renderfx = kRenderFxNone;
SET_VIEW(pPlayer, pNewCamera);
plinfo[ENTINDEX(pPlayer)].pViewEnt = pNewCamera;
break;
case CAMERA_UPLEFT:
if(plinfo[ENTINDEX(pPlayer)].iViewType != CAMERA_NONE) {
plinfo[ENTINDEX(pPlayer)].iViewType = CAMERA_UPLEFT;
return 1;
}
plinfo[ENTINDEX(pPlayer)].iRenderMode = pPlayer->v.rendermode;
plinfo[ENTINDEX(pPlayer)].fRenderAmt = pPlayer->v.renderamt;
plinfo[ENTINDEX(pPlayer)].iViewType = CAMERA_3RDPERSON;
pNewCamera = CREATE_NAMED_ENTITY(MAKE_STRING("info_target"));
pNewCamera->v.classname = MAKE_STRING("VexdCam");
SET_MODEL(pNewCamera, "models/rpgrocket.mdl");
SET_SIZE(pNewCamera, Vector(0, 0, 0), Vector(0, 0, 0));
pNewCamera->v.movetype = MOVETYPE_NOCLIP;
pNewCamera->v.solid = SOLID_NOT;
pNewCamera->v.takedamage = DAMAGE_NO;
pNewCamera->v.gravity = 0;
pNewCamera->v.owner = pPlayer;
pNewCamera->v.rendermode = kRenderTransColor;
pNewCamera->v.renderamt = 0;
pNewCamera->v.renderfx = kRenderFxNone;
SET_VIEW(pPlayer, pNewCamera);
plinfo[ENTINDEX(pPlayer)].pViewEnt = pNewCamera;
break;
case CAMERA_TOPDOWN:
if(plinfo[ENTINDEX(pPlayer)].iViewType != CAMERA_NONE) {
plinfo[ENTINDEX(pPlayer)].iViewType = CAMERA_TOPDOWN;
return 1;
}
plinfo[ENTINDEX(pPlayer)].iRenderMode = pPlayer->v.rendermode;
plinfo[ENTINDEX(pPlayer)].fRenderAmt = pPlayer->v.renderamt;
plinfo[ENTINDEX(pPlayer)].iViewType = CAMERA_TOPDOWN;
pNewCamera = CREATE_NAMED_ENTITY(MAKE_STRING("info_target"));
pNewCamera->v.classname = MAKE_STRING("VexdCam");
SET_MODEL(pNewCamera, "models/rpgrocket.mdl");
SET_SIZE(pNewCamera, Vector(0, 0, 0), Vector(0, 0, 0));
pNewCamera->v.movetype = MOVETYPE_NOCLIP;
pNewCamera->v.solid = SOLID_NOT;
pNewCamera->v.takedamage = DAMAGE_NO;
pNewCamera->v.gravity = 0;
pNewCamera->v.owner = pPlayer;
pNewCamera->v.rendermode = kRenderTransColor;
pNewCamera->v.renderamt = 0;
pNewCamera->v.renderfx = kRenderFxNone;
SET_VIEW(pPlayer, pNewCamera);
plinfo[ENTINDEX(pPlayer)].pViewEnt = pNewCamera;
break;
default:
break;
}
return 1;
}
// SetLights, this sets the lights for the map.
//(vexd)
static cell AMX_NATIVE_CALL set_lights(AMX *amx, cell *params) {
int iLength;
char *szLights = MF_GetAmxString(amx, params[1], 0, &iLength);
if (FStrEq(szLights, "#OFF")) {
glinfo.bLights = false;
memset(glinfo.szLastLights, 0x0, 128);
(g_engfuncs.pfnLightStyle)(0, (char *)glinfo.szRealLights);
return 1;
}
glinfo.bLights = true;
glinfo.bCheckLights = true;
//Reset LastLights
memset(glinfo.szLastLights, 0x0, 128);
//Store the previous lighting.
memcpy(glinfo.szLastLights, szLights, strlen(szLights));
(g_engfuncs.pfnLightStyle)(0, szLights);
// These make it so that players/weaponmodels look like whatever the lighting is
// at. otherwise it would color players under the skybox to these values.
SERVER_COMMAND("sv_skycolor_r 0\n");
SERVER_COMMAND("sv_skycolor_g 0\n");
SERVER_COMMAND("sv_skycolor_b 0\n");
return 1;
}
//(mahnsawce)
static cell AMX_NATIVE_CALL trace_hull(AMX *amx,cell *params)
{
int iResult=0;
TraceResult tr;
Vector vPos;
cell *vCell;
vCell = MF_GetAmxAddr(amx, params[1]);
vPos.x = amx_ctof(vCell[0]);
vPos.y = amx_ctof(vCell[1]);
vPos.z = amx_ctof(vCell[2]);
TRACE_HULL(vPos,vPos, params[4], params[2], params[3] > 0 ? INDEXENT(params[3]) : 0 , &tr);
if (tr.fStartSolid) {
iResult += 1;
}
if (tr.fAllSolid) {
iResult += 2;
}
if (!tr.fInOpen) {
iResult += 4;
}
return iResult;
}
//(mahnsawce)
static cell AMX_NATIVE_CALL playback_event(AMX *amx, cell *params)
{
/* Params:
* native playback_event(flags,invoker,eventindex,Float:delay,Float:origin[3],Float:angles[3],Float:fparam1,Float:fparam2,iparam1,iparam2,bparam1,bparam2)
* 1 2 3 4 5 6 7 8 9 10 11 12
*/
int flags;
edict_t *pInvoker;
unsigned short eventindex;
REAL delay;
vec3_t origin;
vec3_t angles;
REAL fparam1;
REAL fparam2;
int iparam1;
int iparam2;
int bparam1;
int bparam2;
flags = params[1];
pInvoker=INDEXENT(params[2]);
eventindex=params[3];
delay=amx_ctof(params[4]);
cell *cOrigin=MF_GetAmxAddr(amx, params[5]);
cell *cAngles=MF_GetAmxAddr(amx, params[6]);
origin.x=amx_ctof(cOrigin[0]);
origin.y=amx_ctof(cOrigin[1]);
origin.z=amx_ctof(cOrigin[2]);
angles.x=amx_ctof(cAngles[0]);
angles.y=amx_ctof(cAngles[1]);
angles.z=amx_ctof(cAngles[2]);
fparam1=amx_ctof(params[7]);
fparam2=amx_ctof(params[8]);
iparam1=params[9];
iparam2=params[10];
bparam1=params[11];
bparam2=params[12];
PLAYBACK_EVENT_FULL(flags, pInvoker,eventindex, delay, origin, angles, fparam1, fparam2, iparam1, iparam2, bparam1, bparam2);
return 1;
}
//(mahnsawce)
static cell AMX_NATIVE_CALL angle_vector(AMX *amx, cell *params)
{
Vector v_angles,v_forward,v_right,v_up,v_return;
cell *vCell = MF_GetAmxAddr(amx, params[1]);
v_angles.x = amx_ctof(vCell[0]);
v_angles.y = amx_ctof(vCell[1]);
v_angles.z = amx_ctof(vCell[2]);
g_engfuncs.pfnAngleVectors(v_angles,v_forward,v_right,v_up);
if (params[2] == ANGLEVECTORS_FORWARD)
v_return = v_forward;
if (params[2] == ANGLEVECTORS_RIGHT)
v_return = v_right;
if (params[2] == ANGLEVECTORS_UP)
v_return = v_up;
vCell = MF_GetAmxAddr(amx,params[3]);
vCell[0] = amx_ftoc(v_return.x);
vCell[1] = amx_ftoc(v_return.y);
vCell[2] = amx_ftoc(v_return.z);
return 1;
}
//(mahnsawce)
static cell AMX_NATIVE_CALL get_usercmd(AMX *amx, cell *params)
{
if (!incmd)
return 0;
int type = params[1];
if (type > usercmd_int_start && type < usercmd_int_end)
{
// Requesting an integer value...
switch(type)
{
case usercmd_lerp_msec:
return g_cmd->lerp_msec;
case usercmd_msec:
return g_cmd->msec;
case usercmd_lightlevel:
return g_cmd->lightlevel;
case usercmd_buttons:
return g_cmd->buttons;
case usercmd_weaponselect:
return g_cmd->weaponselect;
case usercmd_impact_index:
return g_cmd->impact_index;
default:
return 0;
}
}
else if (type > usercmd_float_start && type < usercmd_float_end)
{
// Requesting a single float value
// The second parameter needs to be the float variable.
cell *cRet = MF_GetAmxAddr(amx, params[2]);
switch(type)
{
case usercmd_forwardmove:
*cRet = amx_ftoc(g_cmd->forwardmove);
return 1;
case usercmd_sidemove:
*cRet = amx_ftoc(g_cmd->sidemove);
return 1;
case usercmd_upmove:
*cRet = amx_ftoc(g_cmd->upmove);
return 1;
default:
return 0;
}
}
else if (type > usercmd_vec_start && type < usercmd_vec_end)
{
// Requesting a Vector value.
cell *cRet = MF_GetAmxAddr(amx,params[2]);
switch (type)
{
case usercmd_viewangles:
cRet[0] = amx_ftoc(g_cmd->viewangles.x);
cRet[1] = amx_ftoc(g_cmd->viewangles.y);
cRet[2] = amx_ftoc(g_cmd->viewangles.z);
return 1;
case usercmd_impact_position:
cRet[0] = amx_ftoc(g_cmd->impact_position.x);
cRet[1] = amx_ftoc(g_cmd->impact_position.y);
cRet[2] = amx_ftoc(g_cmd->impact_position.z);
return 1;
default:
return 0;
}
}
return 1;
}
static cell AMX_NATIVE_CALL set_usercmd(AMX *amx, cell *params)
{
if (!incmd)
return 0;
int type = params[1];
if (type > usercmd_int_start && type < usercmd_int_end)
{
// Setting an integer value...
cell *blah = MF_GetAmxAddr(amx,params[2]);
int iValue = blah[0];
switch(type)
{
case usercmd_lerp_msec:
g_cmd->lerp_msec = iValue;
return 1;
case usercmd_msec:
g_cmd->msec = iValue;
return 1;
case usercmd_lightlevel:
g_cmd->lightlevel = iValue;
return 1;
case usercmd_buttons:
g_cmd->buttons = iValue;
return 1;
case usercmd_weaponselect:
g_cmd->weaponselect = iValue;
return 1;
case usercmd_impact_index:
g_cmd->impact_index = iValue;
return 1;
default:
return 0;
}
}
else if (type > usercmd_float_start && type < usercmd_float_end)
{
// Requesting a single float value
// The second parameter needs to be the float variable.
cell *blah = MF_GetAmxAddr(amx,params[2]);
REAL fValue = amx_ctof(blah[0]);
switch(type)
{
case usercmd_forwardmove:
g_cmd->forwardmove = fValue;
return 1;
case usercmd_sidemove:
g_cmd->sidemove = fValue;
return 1;
case usercmd_upmove:
g_cmd->upmove = fValue;
return 1;
default:
return 0;
}
}
else if (type > usercmd_vec_start && type < usercmd_vec_end)
{
// Requesting a Vector value.
Vector vValue;
cell *blah = MF_GetAmxAddr(amx,params[2]);
vValue.x = amx_ctof(blah[0]);
vValue.y = amx_ctof(blah[1]);
vValue.z = amx_ctof(blah[2]);
switch (type)
{
case usercmd_viewangles:
g_cmd->viewangles = vValue;
return 1;
case usercmd_impact_position:
g_cmd->impact_position = vValue;
return 1;
default:
return 0;
}
}
return 1;
}
static cell AMX_NATIVE_CALL traceresult(AMX *amx, cell *params)
{
int type = params[1];
cell *cRet;
/*
TR_AllSolid, // (int) if true, plane is not valid
TR_StartSolid, // (int) if true, the initial point was in a solid area
TR_InOpen, // (int)
TR_InWater, // (int)
TR_Fraction, // (float) time completed, 1.0 = didn't hit anything
TR_EndPos, // (vector) final position
TR_PlaneDist, // (float)
TR_PlaneNormal, // (vector) surface normal at impact
TR_Hit, // (entity) entity the surface is on
TR_Hitgroup // (int) 0 == generic, non zero is specific body part
*/
switch (type)
{
case TR_AllSolid:
return g_tr.fAllSolid;
case TR_StartSolid:
return g_tr.fStartSolid;
case TR_InOpen:
return g_tr.fInOpen;
case TR_InWater:
return g_tr.fInWater;
case TR_Hitgroup:
return g_tr.iHitgroup;
case TR_Hit:
if (!FNullEnt(g_tr.pHit))
return ENTINDEX(g_tr.pHit);
else
return -1;
case TR_Fraction:
cRet = MF_GetAmxAddr(amx,params[2]);
cRet[0] = amx_ftoc(g_tr.flFraction);
return 1;
case TR_EndPos:
cRet = MF_GetAmxAddr(amx,params[2]);
cRet[0] = amx_ftoc(g_tr.vecEndPos[0]);
cRet[1] = amx_ftoc(g_tr.vecEndPos[1]);
cRet[2] = amx_ftoc(g_tr.vecEndPos[2]);
return 1;
case TR_PlaneDist:
cRet = MF_GetAmxAddr(amx,params[2]);
cRet[0] = amx_ftoc(g_tr.flPlaneDist);
return 1;
case TR_PlaneNormal:
cRet = MF_GetAmxAddr(amx,params[2]);
cRet[0] = amx_ftoc(g_tr.vecPlaneNormal[0]);
cRet[1] = amx_ftoc(g_tr.vecPlaneNormal[1]);
cRet[2] = amx_ftoc(g_tr.vecPlaneNormal[2]);
return 1;
}
return 0;
}
//(mahnsawce)
static cell AMX_NATIVE_CALL take_damage(AMX *amx, cell *params)
{
int indexa = params[1];
int indexb = params[2];
int indexc = params[3];
if (!is_ent_valid(indexa) || !is_ent_valid(indexb) || !is_ent_valid(indexc)) {
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
return 0;
}
REAL fnDamage = amx_ctof(params[4]);
int inType = params[5];
edict_t* pEntitya = INDEXENT(indexa);
edict_t* pEntityb = INDEXENT(indexb);
edict_t* pEntityc = INDEXENT(indexc);
CBaseEntity *pCEntity = NULL;
pCEntity = CBaseEntity::Instance(INDEXENT(indexa));
pCEntity->TakeDamage(VARS(pEntityb),VARS(pEntityc),fnDamage,inType);
return 1;
}
//(mahnsawce)
static cell AMX_NATIVE_CALL engfunc(AMX *amx, cell *params)
{
// Variables I will need throughout all the different calls.
int type = params[1];
// LOG_CONSOLE(PLID,"Called: %i %i",type,*params/sizeof(cell));
int len;
char *temp;
char *temp2;
cell *cRet;
vec3_t Vec1;
vec3_t Vec2;
vec3_t Vec3;
vec3_t Vec4;
int iparam1;
int iparam2;
int iparam3;
int iparam4;
int iparam5;
int iparam6;
float fparam1;
float fparam2;
float fparam3;
// float fTemp[3];
int index;
edict_t *pRet=NULL;
// Now start calling.. :/
switch (type)
{
// pfnPrecacheModel
case EngFunc_PrecacheModel: // int ) (char* s);
temp = MF_GetAmxString(amx,params[2],0,&len);
if (temp[0]==0)
return 0;
return (*g_engfuncs.pfnPrecacheModel)((char*)STRING(ALLOC_STRING(temp)));
// pfnPrecacheSound
case EngFunc_PrecacheSound: // int ) (char* s);
temp = MF_GetAmxString(amx,params[2],0,&len);
if (temp[0]==0)
return 0;
return (*g_engfuncs.pfnPrecacheSound)((char*)STRING(ALLOC_STRING(temp)));
// pfnSetModel
case EngFunc_SetModel: // void ) (edict_t *e, const char *m);
temp = MF_GetAmxString(amx,params[3],0,&len);
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
(*g_engfuncs.pfnSetModel)(INDEXENT(index),(char*)STRING(ALLOC_STRING(temp)));
return 1;
// pfnModelIndex
case EngFunc_ModelIndex:
temp = MF_GetAmxString(amx,params[2],0,&len);
return (*g_engfuncs.pfnModelIndex)(temp);
// pfnModelFrames
case EngFunc_ModelFrames: // int ) (int modelIndex);
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
return (*g_engfuncs.pfnModelFrames)(index);
// pfnSetSize
case EngFunc_SetSize: // void ) (edict_t *e, const float *rgflMin, const float *rgflMax);
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
cRet = MF_GetAmxAddr(amx,params[3]);
Vec1[0]=amx_ctof(cRet[0]);
Vec1[1]=amx_ctof(cRet[1]);
Vec1[2]=amx_ctof(cRet[2]);
cRet = MF_GetAmxAddr(amx,params[4]);
Vec2[0]=amx_ctof(cRet[0]);
Vec2[1]=amx_ctof(cRet[1]);
Vec2[2]=amx_ctof(cRet[2]);
(*g_engfuncs.pfnSetSize)(INDEXENT(index),Vec1,Vec2);
return 1;
// pfnChangeLevel (is this needed?)
case EngFunc_ChangeLevel: // void ) (char* s1, char* s2);
temp = MF_GetAmxString(amx,params[2],0,&len);
temp2 = MF_GetAmxString(amx,params[3],1,&len);
(*g_engfuncs.pfnChangeLevel)(temp,temp2);
return 1;
// pfnVecToYaw
case EngFunc_VecToYaw: // float) (const float *rgflVector);
cRet = MF_GetAmxAddr(amx,params[2]);
Vec1[0]=amx_ctof(cRet[0]);
Vec1[1]=amx_ctof(cRet[1]);
Vec1[2]=amx_ctof(cRet[2]);
cRet = MF_GetAmxAddr(amx,params[3]);
fparam1= (*g_engfuncs.pfnVecToYaw)(Vec1);
cRet[0] = amx_ftoc(fparam1);
return 1;
// pfnVecToAngles
case EngFunc_VecToAngles: // void ) (const float *rgflVectorIn, float *rgflVectorOut);
cRet = MF_GetAmxAddr(amx,params[2]);
Vec1[0]=amx_ctof(cRet[0]);
Vec1[1]=amx_ctof(cRet[1]);
Vec1[2]=amx_ctof(cRet[2]);
(*g_engfuncs.pfnVecToAngles)(Vec1,Vec2);
cRet = MF_GetAmxAddr(amx,params[3]);
cRet[0]=amx_ftoc(Vec2[0]);
cRet[1]=amx_ftoc(Vec2[1]);
cRet[2]=amx_ftoc(Vec2[2]);
return 1;
// pfnMoveToOrigin
case EngFunc_MoveToOrigin: // void ) (edict_t *ent, const float *pflGoal, float dist, int iMoveType);
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
cRet = MF_GetAmxAddr(amx,params[3]);
Vec1[0]=amx_ctof(cRet[0]);
Vec1[1]=amx_ctof(cRet[1]);
Vec1[2]=amx_ctof(cRet[2]);
cRet = MF_GetAmxAddr(amx,params[4]);
fparam1=amx_ctof(cRet[0]);
cRet = MF_GetAmxAddr(amx,params[5]);
iparam1=cRet[0];
CHECK_ENTITY(index);
(*g_engfuncs.pfnMoveToOrigin)(INDEXENT(index),Vec1,fparam1,iparam1);
return 1;
// pfnChangeYaw
case EngFunc_ChangeYaw: // void ) (edict_t* ent);
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
(*g_engfuncs.pfnChangeYaw)(INDEXENT(index));
return 1;
// pfnChangePitch
case EngFunc_ChangePitch: // void ) (edict_t* ent);
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
(*g_engfuncs.pfnChangePitch)(INDEXENT(index));
return 1;
// pfnFindEntityByString
case EngFunc_FindEntityByString: // edict) (edict_t *pEdictStartSearchAfter, const char *pszField, const char *pszValue);
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
temp = MF_GetAmxString(amx,params[3],0,&len);
temp2 = MF_GetAmxString(amx,params[4],1,&len);
pRet = (*g_engfuncs.pfnFindEntityByString)(index == -1 ? NULL : INDEXENT(index),temp,temp2);
if (pRet)
return ENTINDEX(pRet);
return -1;
// pfnGetEntityIllum
case EngFunc_GetEntityIllum: // int ) (edict_t* pEnt);
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
return (*g_engfuncs.pfnGetEntityIllum)(INDEXENT(index));
// pfnFindEntityInSphere
case EngFunc_FindEntityInSphere: // edict) (edict_t *pEdictStartSearchAfter, const float *org, float rad);
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
cRet = MF_GetAmxAddr(amx,params[3]);
Vec1[0]=amx_ctof(cRet[0]);
Vec1[1]=amx_ctof(cRet[1]);
Vec1[2]=amx_ctof(cRet[2]);
cRet = MF_GetAmxAddr(amx,params[4]);
fparam1 = amx_ctof(cRet[0]);
pRet = (*g_engfuncs.pfnFindEntityInSphere)(index == -1 ? NULL : INDEXENT(index),Vec1,fparam1);
if (pRet)
return ENTINDEX(pRet);
return -1;
// pfnFindClientsInPVS
case EngFunc_FindClientInPVS: // edict) (edict_t *pEdict);
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
pRet=(*g_engfuncs.pfnFindClientInPVS)(INDEXENT(index));
return ENTINDEX(pRet);
// pfnEntitiesInPVS
case EngFunc_EntitiesInPVS: // edict) (edict_t *pplayer);
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
pRet=(*g_engfuncs.pfnEntitiesInPVS)(INDEXENT(index));
return ENTINDEX(pRet);
// pfnMakeVectors
case EngFunc_MakeVectors: // void ) (const float *rgflVector);
cRet = MF_GetAmxAddr(amx,params[2]);
Vec1[0]=amx_ctof(cRet[0]);
Vec1[1]=amx_ctof(cRet[1]);
Vec1[2]=amx_ctof(cRet[2]);
(*g_engfuncs.pfnMakeVectors)(Vec1);
return 1;
// pfnAngleVectors
case EngFunc_AngleVectors: // void ) (const float *rgflVector, float *forward, float *right, float *up);
cRet = MF_GetAmxAddr(amx,params[2]);
Vec1[0]=amx_ctof(cRet[0]);
Vec1[1]=amx_ctof(cRet[1]);
Vec1[2]=amx_ctof(cRet[2]);
(*g_engfuncs.pfnAngleVectors)(Vec1,Vec2,Vec3,Vec4);
cRet = MF_GetAmxAddr(amx,params[3]);
cRet[0] = amx_ftoc(Vec2[0]);
cRet[1] = amx_ftoc(Vec2[1]);
cRet[2] = amx_ftoc(Vec2[2]);
cRet = MF_GetAmxAddr(amx,params[4]);
cRet[0] = amx_ftoc(Vec3[0]);
cRet[1] = amx_ftoc(Vec3[1]);
cRet[2] = amx_ftoc(Vec3[2]);
cRet = MF_GetAmxAddr(amx,params[5]);
cRet[0] = amx_ftoc(Vec4[0]);
cRet[1] = amx_ftoc(Vec4[1]);
cRet[2] = amx_ftoc(Vec4[2]);
return 1;
// pfnCreateEntity
case EngFunc_CreateEntity: // edict) (void);
pRet = (*g_engfuncs.pfnCreateEntity)();
if (pRet)
return ENTINDEX(pRet);
return 0;
// pfnRemoveEntity
case EngFunc_RemoveEntity: // void ) (edict_t* e);
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
if (index == 0)
return 0;
(*g_engfuncs.pfnRemoveEntity)(INDEXENT(index));
return 1;
// pfnCreateNamedEntity
case EngFunc_CreateNamedEntity: // edict) (int className);
cRet = MF_GetAmxAddr(amx,params[2]);
iparam1 = cRet[0];
pRet = (*g_engfuncs.pfnCreateNamedEntity)(iparam1);
if (pRet)
return ENTINDEX(pRet);
return 0;
// pfnMakeStatic
case EngFunc_MakeStatic: // void ) (edict_t *ent);
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
(*g_engfuncs.pfnMakeStatic)(INDEXENT(index));
return 1;
// pfnEntIsOnFloor
case EngFunc_EntIsOnFloor: // int ) (edict_t *e);
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
return (*g_engfuncs.pfnEntIsOnFloor)(INDEXENT(index));
// pfnDropToFloor
case EngFunc_DropToFloor: // int ) (edict_t* e);
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
return (*g_engfuncs.pfnDropToFloor)(INDEXENT(index));
// pfnWalkMove
case EngFunc_WalkMove: // int ) (edict_t *ent, float yaw, float dist, int iMode);
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
cRet = MF_GetAmxAddr(amx,params[3]);
fparam1 = amx_ctof(cRet[0]);
cRet = MF_GetAmxAddr(amx,params[4]);
fparam2 = amx_ctof(cRet[0]);
cRet = MF_GetAmxAddr(amx,params[5]);
iparam1 = cRet[0];
return (*g_engfuncs.pfnWalkMove)(INDEXENT(index),fparam1,fparam2,iparam1);
// pfnSetOrigin
case EngFunc_SetOrigin: // void ) (edict_t *e, const float *rgflOrigin);
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
cRet = MF_GetAmxAddr(amx,params[3]);
Vec1[0]=amx_ctof(cRet[0]);
Vec1[1]=amx_ctof(cRet[1]);
Vec1[2]=amx_ctof(cRet[2]);
(*g_engfuncs.pfnSetOrigin)(INDEXENT(index),Vec1);
return 1;
// pfnEmitSound
case EngFunc_EmitSound: // void ) (edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch);
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
cRet = MF_GetAmxAddr(amx,params[3]);
iparam1=cRet[0];
temp = MF_GetAmxString(amx,params[4],0,&len);
cRet = MF_GetAmxAddr(amx,params[5]);
fparam1=amx_ctof(cRet[0]);
cRet = MF_GetAmxAddr(amx,params[6]);
fparam2=amx_ctof(cRet[0]);
cRet = MF_GetAmxAddr(amx,params[7]);
iparam2=cRet[0];
cRet = MF_GetAmxAddr(amx,params[8]);
iparam3=cRet[0];
(*g_engfuncs.pfnEmitSound)(INDEXENT(index),iparam1,temp,fparam1,fparam2,iparam2,iparam3);
return 1;
// pfnEmitAmbientSound
case EngFunc_EmitAmbientSound: // void ) (edict_t *entity, float *pos, const char *samp, float vol, float attenuation, int fFlags, int pitch);
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
cRet = MF_GetAmxAddr(amx,params[3]);
Vec1[0]=amx_ctof(cRet[0]);
Vec1[1]=amx_ctof(cRet[1]);
Vec1[2]=amx_ctof(cRet[2]);
temp = MF_GetAmxString(amx,params[4],0,&len);
cRet = MF_GetAmxAddr(amx,params[5]);
fparam1=amx_ctof(cRet[0]);
cRet = MF_GetAmxAddr(amx,params[6]);
fparam2=amx_ctof(cRet[0]);
cRet = MF_GetAmxAddr(amx,params[7]);
iparam1=cRet[0];
cRet = MF_GetAmxAddr(amx,params[8]);
iparam2=cRet[0];
(*g_engfuncs.pfnEmitAmbientSound)(INDEXENT(index),Vec1,temp,fparam1,fparam2,iparam1,iparam2);
return 1;
// pfnTraceLine
case EngFunc_TraceLine: // void ) (const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr);
cRet = MF_GetAmxAddr(amx,params[2]);
Vec1[0]=amx_ctof(cRet[0]);
Vec1[1]=amx_ctof(cRet[1]);
Vec1[2]=amx_ctof(cRet[2]);
cRet = MF_GetAmxAddr(amx,params[3]);
Vec2[0]=amx_ctof(cRet[0]);
Vec2[1]=amx_ctof(cRet[1]);
Vec2[2]=amx_ctof(cRet[2]);
cRet = MF_GetAmxAddr(amx,params[4]);
iparam1=cRet[0];
cRet = MF_GetAmxAddr(amx,params[5]);
index=cRet[0];
(*g_engfuncs.pfnTraceLine)(Vec1,Vec2,iparam1,index != -1 ? INDEXENT(index) : NULL, &g_tr);
return 1;
// pfnTraceToss
case EngFunc_TraceToss: // void ) (edict_t* pent, edict_t* pentToIgnore, TraceResult *ptr);
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
cRet = MF_GetAmxAddr(amx,params[3]);
iparam1 = cRet[0];
CHECK_ENTITY(index);
(*g_engfuncs.pfnTraceToss)(INDEXENT(index),iparam1 == -1 ? NULL : INDEXENT(iparam1),&g_tr);
return 1;
// pfnTraceMonsterHull
case EngFunc_TraceMonsterHull: // int ) (edict_t *pEdict, const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr);
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
cRet = MF_GetAmxAddr(amx,params[3]);
Vec1[0]=amx_ctof(cRet[0]);
Vec1[1]=amx_ctof(cRet[1]);
Vec1[2]=amx_ctof(cRet[2]);
cRet = MF_GetAmxAddr(amx,params[4]);
Vec2[0]=amx_ctof(cRet[0]);
Vec2[1]=amx_ctof(cRet[1]);
Vec2[2]=amx_ctof(cRet[2]);
cRet = MF_GetAmxAddr(amx,params[5]);
iparam1=cRet[0];
cRet = MF_GetAmxAddr(amx,params[6]);
iparam2=cRet[0];
(*g_engfuncs.pfnTraceMonsterHull)(INDEXENT(index),Vec1,Vec2,iparam1,iparam2 == 0 ? NULL : INDEXENT(iparam2),&g_tr);
return 1;
// pfnTraceHull
case EngFunc_TraceHull: // void ) (const float *v1, const float *v2, int fNoMonsters, int hullNumber, edict_t *pentToSkip, TraceResult *ptr);
cRet = MF_GetAmxAddr(amx,params[2]);
Vec1[0]=amx_ctof(cRet[0]);
Vec1[1]=amx_ctof(cRet[1]);
Vec1[2]=amx_ctof(cRet[2]);
cRet = MF_GetAmxAddr(amx,params[3]);
Vec2[0]=amx_ctof(cRet[0]);
Vec2[1]=amx_ctof(cRet[1]);
Vec2[2]=amx_ctof(cRet[2]);
cRet = MF_GetAmxAddr(amx,params[4]);
iparam1 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[5]);
iparam2 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[6]);
iparam3 = cRet[0];
(*g_engfuncs.pfnTraceHull)(Vec1,Vec2,iparam1,iparam2,iparam3 == 0 ? 0 : INDEXENT(iparam3),&g_tr);
return 1;
// pfnTraceModel
case EngFunc_TraceModel: // void ) (const float *v1, const float *v2, int hullNumber, edict_t *pent, TraceResult *ptr);
cRet = MF_GetAmxAddr(amx,params[2]);
Vec1[0]=amx_ctof(cRet[0]);
Vec1[1]=amx_ctof(cRet[1]);
Vec1[2]=amx_ctof(cRet[2]);
cRet = MF_GetAmxAddr(amx,params[3]);
Vec2[0]=amx_ctof(cRet[0]);
Vec2[1]=amx_ctof(cRet[1]);
Vec2[2]=amx_ctof(cRet[2]);
cRet = MF_GetAmxAddr(amx,params[4]);
iparam1 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[5]);
iparam2 = cRet[0];
(*g_engfuncs.pfnTraceModel)(Vec1,Vec2,iparam1,iparam2 == 0 ? NULL : INDEXENT(iparam2),&g_tr);
return 1;
// pfnTraceTexture
case EngFunc_TraceTexture: // const char *) (edict_t *pTextureEntity, const float *v1, const float *v2 );
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
cRet = MF_GetAmxAddr(amx,params[3]);
Vec1[0]=amx_ctof(cRet[0]);
Vec1[1]=amx_ctof(cRet[1]);
Vec1[2]=amx_ctof(cRet[2]);
cRet = MF_GetAmxAddr(amx,params[4]);
Vec2[0]=amx_ctof(cRet[0]);
Vec2[1]=amx_ctof(cRet[1]);
Vec2[2]=amx_ctof(cRet[2]);
temp = (char*)(*g_engfuncs.pfnTraceTexture)(INDEXENT(index),Vec1,Vec2);
cRet = MF_GetAmxAddr(amx,params[6]);
MF_SetAmxString(amx, params[5], temp, cRet[0]);
return 1;
// pfnTraceSphere
case EngFunc_TraceSphere: // void ) (const float *v1, const float *v2, int fNoMonsters, float radius, edict_t *pentToSkip, TraceResult *ptr);
cRet = MF_GetAmxAddr(amx,params[2]);
Vec1[0]=amx_ctof(cRet[0]);
Vec1[1]=amx_ctof(cRet[1]);
Vec1[2]=amx_ctof(cRet[2]);
cRet = MF_GetAmxAddr(amx,params[3]);
Vec2[0]=amx_ctof(cRet[0]);
Vec2[1]=amx_ctof(cRet[1]);
Vec2[2]=amx_ctof(cRet[2]);
cRet = MF_GetAmxAddr(amx,params[4]);
iparam1 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[5]);
fparam1 = amx_ctof(cRet[0]);
cRet = MF_GetAmxAddr(amx,params[6]);
index = cRet[0];
(*g_engfuncs.pfnTraceSphere)(Vec1,Vec2,iparam1,fparam1,index == 0 ? NULL : INDEXENT(index),&g_tr);
return 1;
// pfnGetAimVector
case EngFunc_GetAimVector: // void ) (edict_t* ent, float speed, float *rgflReturn);
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
cRet = MF_GetAmxAddr(amx,params[3]);
fparam1 = amx_ctof(cRet[0]);
(*g_engfuncs.pfnGetAimVector)(INDEXENT(index),fparam1,Vec1);
cRet = MF_GetAmxAddr(amx,params[4]);
cRet[0] = amx_ftoc(Vec1[0]);
cRet[1] = amx_ftoc(Vec1[1]);
cRet[2] = amx_ftoc(Vec1[2]);
return 1;
// pfnParticleEffect
case EngFunc_ParticleEffect: // void ) (const float *org, const float *dir, float color, float count);
cRet = MF_GetAmxAddr(amx,params[2]);
Vec1[0]=amx_ctof(cRet[0]);
Vec1[1]=amx_ctof(cRet[1]);
Vec1[2]=amx_ctof(cRet[2]);
cRet = MF_GetAmxAddr(amx,params[3]);
Vec2[0]=amx_ctof(cRet[0]);
Vec2[1]=amx_ctof(cRet[1]);
Vec2[2]=amx_ctof(cRet[2]);
cRet = MF_GetAmxAddr(amx,params[4]);
fparam1=amx_ctof(cRet[0]);
cRet = MF_GetAmxAddr(amx,params[5]);
fparam2=amx_ctof(cRet[0]);
(*g_engfuncs.pfnParticleEffect)(Vec1,Vec2,fparam1,fparam2);
return 1;
// pfnLightStyle
case EngFunc_LightStyle: // void ) (int style, char* val);
cRet = MF_GetAmxAddr(amx,params[2]);
iparam1=cRet[0];
temp = MF_GetAmxString(amx,params[3],0,&len);
(*g_engfuncs.pfnLightStyle)(iparam1,temp);
return 1;
// pfnDecalIndex
case EngFunc_DecalIndex: // int ) (const char *name);
temp = MF_GetAmxString(amx,params[2],0,&len);
return (*g_engfuncs.pfnDecalIndex)(temp);
// pfnPointContents
case EngFunc_PointContents: // int ) (const float *rgflVector);
cRet = MF_GetAmxAddr(amx,params[2]);
Vec1[0]=amx_ctof(cRet[0]);
Vec1[1]=amx_ctof(cRet[1]);
Vec1[2]=amx_ctof(cRet[2]);
return (*g_engfuncs.pfnPointContents)(Vec1);
// pfnFreeEntPrivateData
case EngFunc_FreeEntPrivateData: // void ) (edict_t *pEdict);
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
(*g_engfuncs.pfnFreeEntPrivateData)(INDEXENT(index));
// pfnSzFromIndex
case EngFunc_SzFromIndex: // const char * ) (int iString);
cRet = MF_GetAmxAddr(amx,params[2]);
iparam1 = cRet[0];
temp = (char*)(*g_engfuncs.pfnSzFromIndex)(iparam1);
cRet = MF_GetAmxAddr(amx,params[4]);
MF_SetAmxString(amx, params[3], temp, cRet[0]);
return 1;
// pfnAllocString
case EngFunc_AllocString: // int ) (const char *szValue);
temp = MF_GetAmxString(amx,params[2],0,&len);
return (*g_engfuncs.pfnAllocString)((const char *)temp);
// pfnRegUserMsg
case EngFunc_RegUserMsg: // int ) (const char *pszName, int iSize);
temp = MF_GetAmxString(amx,params[2],0,&len);
cRet = MF_GetAmxAddr(amx,params[3]);
iparam1 = cRet[0];
return (*g_engfuncs.pfnRegUserMsg)(temp,iparam1);
// pfnAnimationAutomove
case EngFunc_AnimationAutomove: // void ) (const edict_t* pEdict, float flTime);
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
cRet = MF_GetAmxAddr(amx,params[3]);
fparam1 = amx_ctof(cRet[0]);
(*g_engfuncs.pfnAnimationAutomove)(INDEXENT(index),fparam1);
return 1;
// pfnGetBonePosition
case EngFunc_GetBonePosition: // void ) (const edict_t* pEdict, int iBone, float *rgflOrigin, float *rgflAngles );
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
cRet = MF_GetAmxAddr(amx,params[3]);
iparam1=cRet[0];
(*g_engfuncs.pfnGetBonePosition)(INDEXENT(index),iparam1,Vec1,Vec2);
cRet = MF_GetAmxAddr(amx,params[4]);
cRet[0]=amx_ftoc(Vec1[0]);
cRet[1]=amx_ftoc(Vec1[1]);
cRet[2]=amx_ftoc(Vec1[2]);
cRet = MF_GetAmxAddr(amx,params[5]);
cRet[0]=amx_ftoc(Vec2[0]);
cRet[1]=amx_ftoc(Vec2[1]);
cRet[2]=amx_ftoc(Vec2[2]);
return 1;
// pfnGetAttachment
case EngFunc_GetAttachment: // void ) (const edict_t *pEdict, int iAttachment, float *rgflOrigin, float *rgflAngles );
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
cRet = MF_GetAmxAddr(amx,params[3]);
iparam1=cRet[0];
(*g_engfuncs.pfnGetAttachment)(INDEXENT(index),iparam1,Vec1,Vec2);
cRet = MF_GetAmxAddr(amx,params[4]);
cRet[0]=amx_ftoc(Vec1[0]);
cRet[1]=amx_ftoc(Vec1[1]);
cRet[2]=amx_ftoc(Vec1[2]);
cRet = MF_GetAmxAddr(amx,params[5]);
cRet[0]=amx_ftoc(Vec2[0]);
cRet[1]=amx_ftoc(Vec2[1]);
cRet[2]=amx_ftoc(Vec2[2]);
return 1;
// pfnSetView
case EngFunc_SetView: // void ) (const edict_t *pClient, const edict_t *pViewent );
cRet = MF_GetAmxAddr(amx,params[2]);
iparam1 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[3]);
iparam2 = cRet[0];
CHECK_ENTITY(iparam1);
CHECK_ENTITY(iparam2);
(*g_engfuncs.pfnSetView)(INDEXENT(iparam1),INDEXENT(iparam2));
return 1;
// pfnTime
case EngFunc_Time: // float) ( void );
fparam1 = (*g_engfuncs.pfnTime)();
return amx_ftoc(fparam1);
// pfnCrosshairAngle
case EngFunc_CrosshairAngle: // void ) (const edict_t *pClient, float pitch, float yaw);
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
cRet = MF_GetAmxAddr(amx,params[3]);
fparam1 = amx_ctof(cRet[0]);
cRet = MF_GetAmxAddr(amx,params[4]);
fparam2 = amx_ctof(cRet[0]);
(*g_engfuncs.pfnCrosshairAngle)(INDEXENT(index),fparam1,fparam2);
return 1;
// pfnFadeClientVolume
case EngFunc_FadeClientVolume: // void ) (const edict_t *pEdict, int fadePercent, int fadeOutSeconds, int holdTime, int fadeInSeconds);
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
cRet = MF_GetAmxAddr(amx,params[3]);
iparam1 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[4]);
iparam2 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[5]);
iparam3 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[6]);
iparam4 = cRet[0];
(*g_engfuncs.pfnFadeClientVolume)(INDEXENT(index),iparam1,iparam2,iparam3,iparam4);
return 1;
// pfnSetClientMaxSpeed
case EngFunc_SetClientMaxspeed: // void ) (const edict_t *pEdict, float fNewMaxspeed);
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
cRet = MF_GetAmxAddr(amx,params[3]);
fparam1 = amx_ctof(cRet[0]);
(*g_engfuncs.pfnSetClientMaxspeed)(INDEXENT(index),fparam1);
return 1;
// pfnCreateFakeClient
case EngFunc_CreateFakeClient: // edict) (const char *netname); // returns NULL if fake client can't be created
temp = MF_GetAmxString(amx,params[2],0,&len);
pRet = (*g_engfuncs.pfnCreateFakeClient)(STRING(ALLOC_STRING(temp)));
if (pRet == 0)
return 0;
return ENTINDEX(pRet);
// pfnRunPlayerMove
case EngFunc_RunPlayerMove: // void ) (edict_t *fakeclient, const float *viewangles, float forwardmove, float sidemove, float upmove, unsigned short buttons, byte impulse, byte msec );
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
cRet = MF_GetAmxAddr(amx,params[3]);
Vec1[0]=amx_ctof(cRet[0]);
Vec1[1]=amx_ctof(cRet[1]);
Vec1[2]=amx_ctof(cRet[2]);
cRet = MF_GetAmxAddr(amx,params[4]);
fparam1=amx_ctof(cRet[0]);
cRet = MF_GetAmxAddr(amx,params[5]);
fparam2=amx_ctof(cRet[0]);
cRet = MF_GetAmxAddr(amx,params[6]);
fparam3=amx_ctof(cRet[0]);
cRet = MF_GetAmxAddr(amx,params[7]);
iparam1 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[8]);
iparam2 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[9]);
iparam3 = cRet[0];
(*g_engfuncs.pfnRunPlayerMove)(INDEXENT(index),Vec1,fparam1,fparam2,fparam3,iparam1,iparam2,iparam3);
return 1;
// pfnNumberOfEntities
case EngFunc_NumberOfEntities: // int ) (void);
return (*g_engfuncs.pfnNumberOfEntities)();
// pfnStaticDecal
case EngFunc_StaticDecal: // void ) ( const float *origin, int decalIndex, int entityIndex, int modelIndex );
cRet = MF_GetAmxAddr(amx,params[2]);
Vec1[0]=amx_ctof(cRet[0]);
Vec1[1]=amx_ctof(cRet[1]);
Vec1[2]=amx_ctof(cRet[2]);
cRet = MF_GetAmxAddr(amx,params[3]);
iparam1 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[4]);
iparam2 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[5]);
iparam3 = cRet[0];
(*g_engfuncs.pfnStaticDecal)(Vec1,iparam1,iparam2,iparam3);
return 1;
// pfnPrecacheGeneric
case EngFunc_PrecacheGeneric: // int ) (char* s);
temp = MF_GetAmxString(amx,params[2],0,&len);
return (*g_engfuncs.pfnPrecacheGeneric)((char*)STRING(ALLOC_STRING(temp)));
// pfnBuildSoundMsg
case EngFunc_BuildSoundMsg: // void ) (edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed);
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
cRet = MF_GetAmxAddr(amx,params[3]);
iparam1 = cRet[0];
temp = MF_GetAmxString(amx,params[4],0,&len);
cRet = MF_GetAmxAddr(amx,params[5]);
fparam1 = amx_ctof(cRet[0]);
cRet = MF_GetAmxAddr(amx,params[6]);
fparam2 = amx_ctof(cRet[0]);
cRet = MF_GetAmxAddr(amx,params[7]);
iparam2 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[8]);
iparam3 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[9]);
iparam4 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[10]);
iparam5 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[11]);
Vec1[0]=amx_ctof(cRet[0]);
Vec1[1]=amx_ctof(cRet[1]);
Vec1[2]=amx_ctof(cRet[2]);
cRet=MF_GetAmxAddr(amx,params[12]);
iparam6=cRet[0];
/* don't check, it might not be included
CHECK_ENTITY(iparam5);
*/
(*g_engfuncs.pfnBuildSoundMsg)(INDEXENT(index),iparam1,temp,fparam1,fparam2,iparam2,iparam3,iparam4,iparam5,Vec1,iparam6 == 0 ? NULL : INDEXENT(iparam6));
return 1;
// pfnGetPhysicsKeyValue
case EngFunc_GetPhysicsKeyValue: // const char* ) ( const edict_t *pClient, const char *key );
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
temp = MF_GetAmxString(amx,params[3],0,&len);
temp2 = (char*)(*g_engfuncs.pfnGetPhysicsKeyValue)(INDEXENT(index),(const char *)temp);
cRet = MF_GetAmxAddr(amx,params[5]);
MF_SetAmxString(amx,params[4],temp2,cRet[0]);
return 1;
// pfnSetPhysicsKeyValue
case EngFunc_SetPhysicsKeyValue: // void ) ( const edict_t *pClient, const char *key, const char *value );
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
temp = MF_GetAmxString(amx,params[3],0,&len);
temp2 = MF_GetAmxString(amx,params[4],0,&len);
(*g_engfuncs.pfnSetPhysicsKeyValue)(INDEXENT(index),STRING(ALLOC_STRING(temp)),STRING(ALLOC_STRING(temp2)));
return 1;
// pfnGetPhysicsInfoString
case EngFunc_GetPhysicsInfoString: // const char* ) ( const edict_t *pClient );
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
temp = (char*)(*g_engfuncs.pfnGetPhysicsInfoString)(INDEXENT(index));
cRet = MF_GetAmxAddr(amx,params[4]);
MF_SetAmxString(amx,params[3],temp,cRet[0]);
return 1;
// pfnPrecacheEvent
case EngFunc_PrecacheEvent: // unsigned short ) ( int type, const char*psz );
cRet = MF_GetAmxAddr(amx,params[2]);
iparam1 = cRet[0];
temp = MF_GetAmxString(amx,params[3],0,&len);
return (*g_engfuncs.pfnPrecacheEvent)(iparam1,(char*)STRING(ALLOC_STRING(temp)));
// pfnPlaybackEvent (grr)
case EngFunc_PlaybackEvent: // void )
cRet = MF_GetAmxAddr(amx,params[2]);
iparam1 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[3]);
index = cRet[0];
CHECK_ENTITY(index);
cRet = MF_GetAmxAddr(amx,params[4]);
iparam2 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[5]);
fparam1 = amx_ctof(cRet[0]);
cRet = MF_GetAmxAddr(amx,params[6]);
Vec1[0]=amx_ctof(cRet[0]);
Vec1[1]=amx_ctof(cRet[1]);
Vec1[2]=amx_ctof(cRet[2]);
cRet = MF_GetAmxAddr(amx,params[7]);
Vec2[0]=amx_ctof(cRet[0]);
Vec2[1]=amx_ctof(cRet[1]);
Vec2[2]=amx_ctof(cRet[2]);
cRet = MF_GetAmxAddr(amx,params[8]);
fparam2 = amx_ctof(cRet[0]);
cRet = MF_GetAmxAddr(amx,params[9]);
fparam3 = amx_ctof(cRet[0]);
cRet = MF_GetAmxAddr(amx,params[10]);
iparam3 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[11]);
iparam4 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[12]);
iparam5 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[13]);
iparam6 = cRet[0];
(*g_engfuncs.pfnPlaybackEvent)(iparam1,INDEXENT(index),iparam2,fparam1,Vec1,Vec2,fparam2,fparam3,iparam3,iparam4,iparam5,iparam6);
return 1;
// pfnGetCurrentPlayer
case EngFunc_GetCurrentPlayer: // int ) ( void );
return (*g_engfuncs.pfnGetCurrentPlayer)();
// pfnCanSkipPlayer
case EngFunc_CanSkipPlayer: // int ) ( const edict_t *player );
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
return (*g_engfuncs.pfnCanSkipPlayer)(INDEXENT(index));
// pfnSetGroupMask
case EngFunc_SetGroupMask: // void ) ( int mask, int op );
cRet = MF_GetAmxAddr(amx,params[2]);
iparam1 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[3]);
iparam2 = cRet[0];
(*g_engfuncs.pfnSetGroupMask)(iparam1,iparam2);
return 1;
// pfnGetClientListening
case EngFunc_GetClientListening: // bool (int iReceiver, int iSender)
cRet = MF_GetAmxAddr(amx,params[2]);
iparam1 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[3]);
iparam2 = cRet[0];
return (*g_engfuncs.pfnVoice_GetClientListening)(iparam1,iparam2);
// pfnSetClientListening
case EngFunc_SetClientListening: // bool (int iReceiver, int iSender, bool Listen)
cRet = MF_GetAmxAddr(amx,params[2]);
iparam1 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[3]);
iparam2 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[4]);
iparam3 = cRet[0];
return (*g_engfuncs.pfnVoice_SetClientListening)(iparam1,iparam2,iparam3);
// pfnMessageBegin (AMX doesn't support MSG_ONE_UNRELIABLE, so I should add this incase anyone needs it.)
case EngFunc_MessageBegin: // void (int msg_dest, int msg_type, const float *pOrigin, edict_t *ed)
cRet = MF_GetAmxAddr(amx,params[2]);
iparam1 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[3]);
iparam2 = cRet[0];
cRet = MF_GetAmxAddr(amx,params[4]);
Vec1[0]=amx_ctof(cRet[0]);
Vec1[1]=amx_ctof(cRet[1]);
Vec1[2]=amx_ctof(cRet[2]);
cRet = MF_GetAmxAddr(amx,params[5]);
index = cRet[0];
(*g_engfuncs.pfnMessageBegin)(iparam1,iparam2,Vec1,index == 0 ? NULL : INDEXENT(index));
return 1;
// pfnWriteCoord
case EngFunc_WriteCoord: // void (float)
cRet = MF_GetAmxAddr(amx,params[2]);
fparam1 = amx_ctof(cRet[0]);
(*g_engfuncs.pfnWriteCoord)(fparam1);
return 1;
// pfnWriteAngle
case EngFunc_WriteAngle: // void (float)
cRet = MF_GetAmxAddr(amx,params[2]);
fparam1 = amx_ctof(cRet[0]);
(*g_engfuncs.pfnWriteAngle)(fparam1);
return 1;
case EngFunc_InfoKeyValue: // char* ) (char *infobuffer, char *key);
// Modify the syntax a bit.
// index, key
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
cRet = MF_GetAmxAddr(amx,params[5]);
iparam1 = cRet[0];
CHECK_ENTITY(index);
temp2 = MF_GetAmxString(amx,params[3],0,&len);
temp = (*g_engfuncs.pfnInfoKeyValue)((*g_engfuncs.pfnGetInfoKeyBuffer)(INDEXENT(index)),temp2);
MF_SetAmxString(amx,params[4],temp,iparam1);
return 1;
case EngFunc_SetKeyValue: // void ) (char *infobuffer, char *key, char *value);
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
temp = MF_GetAmxString(amx,params[3],0,&len);
temp2 = MF_GetAmxString(amx,params[4],1,&len);
(*g_engfuncs.pfnSetKeyValue)((*g_engfuncs.pfnGetInfoKeyBuffer)(INDEXENT(index)),temp,temp2);
return 1;
case EngFunc_SetClientKeyValue: // void ) (int clientIndex, char *infobuffer, char *key, char *value);
cRet = MF_GetAmxAddr(amx,params[2]);
index = cRet[0];
CHECK_ENTITY(index);
temp = MF_GetAmxString(amx,params[3],0,&len);
temp2 = MF_GetAmxString(amx,params[4],1,&len);
(*g_engfuncs.pfnSetClientKeyValue)(index,(*g_engfuncs.pfnGetInfoKeyBuffer)(INDEXENT(index)),temp,temp2);
return 1;
default:
LOG_CONSOLE(PLID,"[NS2AMX] Unknown engfunc type provided.");
return 0;
}
}
//by mahnsawce
static cell AMX_NATIVE_CALL dllfunc(AMX *amx,cell *params)
{
int type;
int index;
int indexb;
char *temp = "";
char *temp2 = "";
char *temp3 = "";
vec3_t Vec1;
vec3_t Vec2;
int iparam1;
int len;
cell *cRet;
type = params[1];
switch(type)
{
// pfnGameInit
case DLLFunc_GameInit: // void) ( void );
gpGamedllFuncs->dllapi_table->pfnGameInit();
return 1;
// pfnSpawn
case DLLFunc_Spawn: // int ) ( edict_t *pent );
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
return gpGamedllFuncs->dllapi_table->pfnSpawn(INDEXENT(index));
// pfnThink
case DLLFunc_Think: // void ) ( edict_t *pent );
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
gpGamedllFuncs->dllapi_table->pfnThink(INDEXENT(index));
return 1;
// pfnUse
case DLLFunc_Use: // void ) ( edict_t *pentUsed, edict_t *pentOther );
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
cRet = MF_GetAmxAddr(amx,params[2]);
indexb=cRet[0];
CHECK_ENTITY(indexb);
gpGamedllFuncs->dllapi_table->pfnUse(INDEXENT(index),INDEXENT(indexb));
return 1;
// pfnTouch
case DLLFunc_Touch: // void ) ( edict_t *pentTouched, edict_t *pentOther );
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
cRet = MF_GetAmxAddr(amx,params[2]);
indexb=cRet[0];
CHECK_ENTITY(indexb);
gpGamedllFuncs->dllapi_table->pfnTouch(INDEXENT(index),INDEXENT(indexb));
return 1;
case DLLFunc_Blocked: // void ) ( edict_t *pentBlocked, edict_t *pentOther );
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
cRet = MF_GetAmxAddr(amx,params[2]);
indexb=cRet[0];
CHECK_ENTITY(indexb);
gpGamedllFuncs->dllapi_table->pfnBlocked(INDEXENT(index),INDEXENT(indexb));
return 1;
case DLLFunc_SetAbsBox: // void ) ( edict_t *pent );
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
gpGamedllFuncs->dllapi_table->pfnSetAbsBox(INDEXENT(index));
return 1;
case DLLFunc_ClientConnect: // bool) ( edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[ 128 ] );
// index,szName,szAddress,szRetRejectReason,size
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
temp = MF_GetAmxString(amx,params[3],0,&len);
temp2 = MF_GetAmxString(amx,params[4],1,&len);
//temp3 = GET_AMXSTRING(amx,params[5],2,len);
iparam1 = MDLL_ClientConnect(INDEXENT(index),STRING(ALLOC_STRING(temp)),STRING(ALLOC_STRING(temp2)),temp3);
cRet = MF_GetAmxAddr(amx,params[6]);
MF_SetAmxString(amx,params[5],temp3,cRet[0]);
return 1;
case DLLFunc_ClientDisconnect: // void ) ( edict_t *pEntity );
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
gpGamedllFuncs->dllapi_table->pfnClientDisconnect(INDEXENT(index));
return 1;
case DLLFunc_ClientKill: // void ) ( edict_t *pEntity );
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
gpGamedllFuncs->dllapi_table->pfnClientKill(INDEXENT(index));
return 1;
case DLLFunc_ClientPutInServer: // void ) ( edict_t *pEntity );
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
gpGamedllFuncs->dllapi_table->pfnClientPutInServer(INDEXENT(index));
return 1;
case DLLFunc_ServerDeactivate: // void) ( void );
gpGamedllFuncs->dllapi_table->pfnServerDeactivate();
return 1;
case DLLFunc_PlayerPreThink: // void ) ( edict_t *pEntity );
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
gpGamedllFuncs->dllapi_table->pfnPlayerPreThink(INDEXENT(index));
return 1;
case DLLFunc_PlayerPostThink: // void ) ( edict_t *pEntity );
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
gpGamedllFuncs->dllapi_table->pfnPlayerPostThink(INDEXENT(index));
return 1;
case DLLFunc_StartFrame: // void ) ( void );
gpGamedllFuncs->dllapi_table->pfnStartFrame();
return 1;
case DLLFunc_ParmsNewLevel: // void ) ( void );
gpGamedllFuncs->dllapi_table->pfnParmsNewLevel();
case DLLFunc_ParmsChangeLevel: // void ) ( void );
gpGamedllFuncs->dllapi_table->pfnParmsChangeLevel();
// Returns string describing current .dll. E.g., TeamFotrress 2, Half-Life
case DLLFunc_GetGameDescription: // const char * )( void );
temp = (char*)gpGamedllFuncs->dllapi_table->pfnGetGameDescription();
cRet = MF_GetAmxAddr(amx,params[3]);
MF_SetAmxString(amx,params[2],temp,cRet[0]);
return 1;
// Spectator funcs
case DLLFunc_SpectatorConnect: // void) ( edict_t *pEntity );
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
gpGamedllFuncs->dllapi_table->pfnSpectatorConnect(INDEXENT(index));
return 1;
case DLLFunc_SpectatorDisconnect: // void ) ( edict_t *pEntity );
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
gpGamedllFuncs->dllapi_table->pfnSpectatorDisconnect(INDEXENT(index));
return 1;
case DLLFunc_SpectatorThink: // void ) ( edict_t *pEntity );
cRet = MF_GetAmxAddr(amx,params[2]);
index=cRet[0];
CHECK_ENTITY(index);
gpGamedllFuncs->dllapi_table->pfnSpectatorThink(INDEXENT(index));
return 1;
// Notify game .dll that engine is going to shut down. Allows mod authors to set a breakpoint.
case DLLFunc_Sys_Error: // void ) ( const char *error_string );
temp = MF_GetAmxString(amx,params[2],0,&len);
gpGamedllFuncs->dllapi_table->pfnSys_Error(STRING(ALLOC_STRING(temp)));
return 1;
case DLLFunc_PM_FindTextureType: // char )( char *name );
temp = MF_GetAmxString(amx,params[2],0,&len);
return gpGamedllFuncs->dllapi_table->pfnPM_FindTextureType(temp);
case DLLFunc_RegisterEncoders: // void ) ( void );
gpGamedllFuncs->dllapi_table->pfnRegisterEncoders;
return 1;
// Enumerates player hulls. Returns 0 if the hull number doesn't exist, 1 otherwise
case DLLFunc_GetHullBounds: // int) ( int hullnumber, float *mins, float *maxs );
cRet = MF_GetAmxAddr(amx,params[2]);
iparam1 = gpGamedllFuncs->dllapi_table->pfnGetHullBounds(cRet[0],Vec1,Vec2);
cRet = MF_GetAmxAddr(amx,params[3]);
cRet[0]=amx_ftoc(Vec1[0]);
cRet[1]=amx_ftoc(Vec1[1]);
cRet[2]=amx_ftoc(Vec1[2]);
cRet = MF_GetAmxAddr(amx,params[4]);
cRet[0]=amx_ftoc(Vec2[0]);
cRet[1]=amx_ftoc(Vec2[1]);
cRet[2]=amx_ftoc(Vec2[2]);
return iparam1;
// Create baselines for certain "unplaced" items.
case DLLFunc_CreateInstancedBaselines: // void ) ( void );
gpGamedllFuncs->dllapi_table->pfnCreateInstancedBaselines();
return 1;
case DLLFunc_pfnAllowLagCompensation: // int )( void );
return gpGamedllFuncs->dllapi_table->pfnAllowLagCompensation();
// I know this doesn't fit with dllfunc, but I dont want to create another native JUST for this.
case MetaFunc_CallGameEntity: // bool (plid_t plid, const char *entStr,entvars_t *pev);
temp = MF_GetAmxString(amx,params[2],0,&len);
cRet = MF_GetAmxAddr(amx,params[3]);
index = cRet[0];
CHECK_ENTITY(index);
iparam1 = gpMetaUtilFuncs->pfnCallGameEntity(PLID,STRING(ALLOC_STRING(temp)),VARS(INDEXENT(index)));
return iparam1;
default:
MF_Log("Unknown dllfunc entry.");
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
return 0;
}
}
AMX_NATIVE_INFO engine_Natives[] = {
{"halflife_time", halflife_time},
//These are mostly from original VexD
{"VelocityByAim", VelocityByAim},
{"RadiusDamage", RadiusDamage},
{"PointContents", PointContents},
{"vector_to_angle", vector_to_angle},
{"angle_vector", angle_vector},
{"vector_length", vector_length},
{"vector_distance", vector_distance},
{"trace_normal", trace_normal},
{"trace_line", trace_line},
{"trace_hull", trace_hull},
{"traceresult", traceresult},
{"take_damage", take_damage},
{"set_speak", set_speak},
{"get_speak", get_speak},
{"precache_event", precache_event},
{"precache_generic", precache_generic},
{"playback_event", playback_event},
{"set_view", set_view},
{"attach_view", attach_view},
{"get_decal_index", get_decal_index},
{"get_info_keybuffer", get_info_keybuffer},
{"set_lights", set_lights},
{"drop_to_floor", drop_to_floor},
{"get_usercmd", get_usercmd},
{"set_usercmd", set_usercmd},
{"engfunc", engfunc},
{"dllfunc", dllfunc},
{"register_impulse", register_impulse},
{"register_think", register_think},
{"register_touch", register_touch},
{NULL, NULL},
///////////////////
};