/* AMX Mod X * * by the AMX Mod X Development Team * originally developed by OLO * * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * In addition, as a special exception, the author gives permission to * link the code of this program with the Half-Life Game Engine ("HL * Engine") and Modified Game Libraries ("MODs") developed by Valve, * L.L.C ("Valve"). You must obey the GNU General Public License in all * respects for all of the code used other than the HL Engine and MODs * from Valve. If you modify this file, you may extend this exception * to your version of the file, but you are not obligated to do so. If * you do not wish to do so, delete this exception statement from your * version. */ #include "amxmodx.h" #define ANGLEVECTORS_FORWARD 1 #define ANGLEVECTORS_RIGHT 2 #define ANGLEVECTORS_UP 3 static cell AMX_NATIVE_CALL get_distance(AMX *amx, cell *params) { cell *cpVec1 = get_amxaddr(amx, params[1]); cell *cpVec2 = get_amxaddr(amx, params[2]); Vector vec1 = Vector((float)cpVec1[0], (float)cpVec1[1], (float)cpVec1[2]); Vector vec2 = Vector((float)cpVec2[0], (float)cpVec2[1], (float)cpVec2[2]); int iDist = (int)((vec1 - vec2).Length()); return iDist; } static cell AMX_NATIVE_CALL get_distance_f(AMX *amx, cell *params) { cell *cpVec1 = get_amxaddr(amx, params[1]); cell *cpVec2 = get_amxaddr(amx, params[2]); Vector vec1 = Vector((float)amx_ctof(cpVec1[0]), (float)amx_ctof(cpVec1[1]), (float)amx_ctof(cpVec1[2])); Vector vec2 = Vector((float)amx_ctof(cpVec2[0]), (float)amx_ctof(cpVec2[1]), (float)amx_ctof(cpVec2[2])); REAL fDist = (REAL) (vec1 - vec2).Length(); return amx_ftoc(fDist); } static cell AMX_NATIVE_CALL VelocityByAim(AMX *amx, cell *params) { int iEnt = params[1]; int iVelocity = params[2]; cell *vRet = get_amxaddr(amx, params[3]); Vector vVector = Vector(0, 0, 0); edict_t *pEnt = NULL; if (iEnt < 0 || iEnt > gpGlobals->maxEntities) { LogError(amx, AMX_ERR_NATIVE, "Entity out of range (%d)", iEnt); return 0; } else { if (iEnt > 0 && iEnt <= gpGlobals->maxClients) { if (!GET_PLAYER_POINTER_I(iEnt)->ingame) { LogError(amx, AMX_ERR_NATIVE, "Invalid player %d (not ingame)", iEnt); return 0; } pEnt = GET_PLAYER_POINTER_I(iEnt)->pEdict; } else { pEnt = INDEXENT(iEnt); } } if (!pEnt) { LogError(amx, AMX_ERR_NATIVE, "Invalid entity %d (nullent)", iEnt); return 0; } MAKE_VECTORS(pEnt->v.v_angle); vVector = gpGlobals->v_forward * iVelocity; vRet[0] = FloatToCell(vVector.x); vRet[1] = FloatToCell(vVector.y); vRet[2] = FloatToCell(vVector.z); return 1; } static cell AMX_NATIVE_CALL vector_to_angle(AMX *amx, cell *params) { cell *cAddr = get_amxaddr(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 = get_amxaddr(amx, params[2]); vRet[0] = FloatToCell(vAngle.x); vRet[1] = FloatToCell(vAngle.y); vRet[2] = FloatToCell(vAngle.z); return 1; } static cell AMX_NATIVE_CALL angle_vector(AMX *amx, cell *params) { Vector v_angles, v_forward, v_right, v_up, v_return; cell *vCell = get_amxaddr(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); switch (params[2]) { case ANGLEVECTORS_FORWARD: v_return = v_forward; break; case ANGLEVECTORS_RIGHT: v_return = v_right; break; case ANGLEVECTORS_UP: v_return = v_up; break; } vCell = get_amxaddr(amx, params[3]); vCell[0] = FloatToCell(v_return.x); vCell[1] = FloatToCell(v_return.y); vCell[2] = FloatToCell(v_return.z); return 1; } static cell AMX_NATIVE_CALL vector_length(AMX *amx, cell *params) { cell *cAddr = get_amxaddr(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 = get_amxaddr(amx, params[1]); cell *cAddr2 = get_amxaddr(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); } AMX_NATIVE_INFO vector_Natives[] = { {"get_distance", get_distance}, {"get_distance_f", get_distance_f}, {"velocity_by_aim", VelocityByAim}, {"vector_to_angle", vector_to_angle}, {"angle_vector", angle_vector}, {"vector_length", vector_length}, {"vector_distance", vector_distance}, {NULL, NULL}, };