diff --git a/amxmodx/Makefile b/amxmodx/Makefile index 58579984..adee7a18 100755 --- a/amxmodx/Makefile +++ b/amxmodx/Makefile @@ -19,7 +19,7 @@ OBJECTS = meta_api.cpp CFile.cpp CVault.cpp vault.cpp float.cpp file.cpp modules srvcmd.cpp strptime.cpp amxcore.cpp amxtime.cpp power.cpp amxxlog.cpp fakemeta.cpp \ amxxfile.cpp CLang.cpp md5.cpp emsg.cpp CForward.cpp CPlugin.cpp CModule.cpp \ CMenu.cpp util.cpp amx.cpp amxdbg.cpp natives.cpp newmenus.cpp debugger.cpp \ - optimizer.cpp format.cpp messages.cpp libraries.cpp + optimizer.cpp format.cpp messages.cpp libraries.cpp vector.cpp LINK = /lib/libstdc++.a diff --git a/amxmodx/amxmodx.cpp b/amxmodx/amxmodx.cpp index 642d595e..24fd7fa1 100755 --- a/amxmodx/amxmodx.cpp +++ b/amxmodx/amxmodx.cpp @@ -2500,8 +2500,8 @@ static cell AMX_NATIVE_CALL precache_sound(AMX *amx, cell *params) /* 1 param */ return 0; } - int ilen; - char* sptemp = get_amxstring(amx, params[1], 0, ilen); + int len; + char* sptemp = get_amxstring(amx, params[1], 0, len); PRECACHE_SOUND((char*)STRING(ALLOC_STRING(sptemp))); @@ -2516,36 +2516,24 @@ static cell AMX_NATIVE_CALL precache_model(AMX *amx, cell *params) /* 1 param */ return 0; } - int ilen; - char* sptemp = get_amxstring(amx, params[1], 0, ilen); + int len; + char* sptemp = get_amxstring(amx, params[1], 0, len); return PRECACHE_MODEL((char*)STRING(ALLOC_STRING(sptemp))); } -static cell AMX_NATIVE_CALL get_distance(AMX *amx, cell *params) /* 2 param */ +static cell AMX_NATIVE_CALL precache_generic(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; -} + if (g_dontprecache) + { + LogError(amx, AMX_ERR_NATIVE, "Precaching not allowed"); + return 0; + } -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])); + int len; + char* sptemp = get_amxstring(amx, params[1], 0, len); - REAL fDist = (REAL) (vec1 - vec2).Length(); - - return amx_ftoc(fDist); + return PRECACHE_GENERIC((char*)STRING(ALLOC_STRING(sptemp))); } static cell AMX_NATIVE_CALL random_float(AMX *amx, cell *params) /* 2 param */ @@ -3986,8 +3974,6 @@ AMX_NATIVE_INFO amxmodx_Natives[] = {"get_cvar_num", get_cvar_num}, {"get_cvar_pointer", get_cvar_pointer}, {"get_cvar_string", get_cvar_string}, - {"get_distance", get_distance}, - {"get_distance_f", get_distance_f}, {"get_flags", get_flags}, {"get_func_id", get_func_id}, {"get_gametime", get_gametime}, @@ -4072,6 +4058,7 @@ AMX_NATIVE_INFO amxmodx_Natives[] = {"plugin_flags", plugin_flags}, {"precache_model", precache_model}, {"precache_sound", precache_sound}, + {"precache_generic", precache_generic}, {"query_client_cvar", query_client_cvar}, {"random_float", random_float}, {"random_num", random_num}, diff --git a/amxmodx/amxmodx.h b/amxmodx/amxmodx.h index bc98d4ec..62d26a4d 100755 --- a/amxmodx/amxmodx.h +++ b/amxmodx/amxmodx.h @@ -84,6 +84,7 @@ extern AMX_NATIVE_INFO float_Natives[]; extern AMX_NATIVE_INFO string_Natives[]; extern AMX_NATIVE_INFO vault_Natives[]; extern AMX_NATIVE_INFO msg_Natives[]; +extern AMX_NATIVE_INFO vector_Natives[]; #ifndef __linux__ #define DLLOAD(path) (DLHANDLE)LoadLibrary(path) diff --git a/amxmodx/modules.cpp b/amxmodx/modules.cpp index 97d6ad66..d3712e42 100755 --- a/amxmodx/modules.cpp +++ b/amxmodx/modules.cpp @@ -542,6 +542,7 @@ int set_amxnatives(AMX* amx, char error[128]) amx_Register(amx, g_NativeNatives, -1); amx_Register(amx, g_DebugNatives, -1); amx_Register(amx, msg_Natives, -1); + amx_Register(amx, vector_Natives, -1); //we're not actually gonna check these here anymore amx->flags |= AMX_FLAG_PRENIT; diff --git a/amxmodx/msvc/amxmodx_mm.vcproj b/amxmodx/msvc/amxmodx_mm.vcproj index 8f45c5c9..5866b736 100755 --- a/amxmodx/msvc/amxmodx_mm.vcproj +++ b/amxmodx/msvc/amxmodx_mm.vcproj @@ -469,6 +469,9 @@ + + + + gpGlobals->maxEntities) + { + LogError(amx, AMX_ERR_NATIVE, "Entity out of range (%d)", iEnt); + return 0; + } + else + { + if (iEnt <= gpGlobals->maxClients && !GET_PLAYER_POINTER_I(iEnt)->ingame) + { + LogError(amx, AMX_ERR_NATIVE, "Invalid player %d (not in-game)", iEnt); + return 0; + } + else if (iEnt != 0 && FNullEnt(INDEXENT(iEnt))) + { + LogError(amx, AMX_ERR_NATIVE, "Invalid entity %d", iEnt); + return 0; + } + } + + edict_t *pEnt; + + if (iEnt >= 1 || iEnt <= gpGlobals->maxClients) + pEnt = GET_PLAYER_POINTER_I(iEnt)->pEdict; + else + 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; +} + +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] = amx_ftoc(vAngle.x); + vRet[1] = amx_ftoc(vAngle.y); + vRet[2] = amx_ftoc(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; + case ANGLEVECTORS_RIGHT: + v_return = v_right; + case ANGLEVECTORS_UP: + v_return = v_up; + } + + vCell = get_amxaddr(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; +} + +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}, +}; diff --git a/dlls/engine/engine.cpp b/dlls/engine/engine.cpp index c705bbe3..033561a6 100755 --- a/dlls/engine/engine.cpp +++ b/dlls/engine/engine.cpp @@ -97,27 +97,6 @@ static cell AMX_NATIVE_CALL halflife_time(AMX *amx, cell *params) 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); - - CHECK_ENTITY(iEnt); - - edict_t *pEnt = INDEXENT2(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). @@ -198,61 +177,6 @@ static cell AMX_NATIVE_CALL PointContents(AMX *amx, cell *params) 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]; @@ -387,14 +311,6 @@ static cell AMX_NATIVE_CALL drop_to_floor(AMX *amx, cell *params) 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) @@ -656,28 +572,6 @@ static cell AMX_NATIVE_CALL playback_event(AMX *amx, cell *params) 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) { @@ -1038,13 +932,8 @@ AMX_NATIVE_INFO engine_Natives[] = { //These are mostly from original VexD - {"velocity_by_aim", VelocityByAim}, {"radius_damage", RadiusDamage}, {"point_contents", 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}, @@ -1054,7 +943,6 @@ AMX_NATIVE_INFO engine_Natives[] = { {"get_speak", get_speak}, {"precache_event", precache_event}, - {"precache_generic", precache_generic}, {"playback_event", playback_event}, {"set_view", set_view}, diff --git a/dlls/engine/engine.h b/dlls/engine/engine.h index bf78814a..89d5f53c 100755 --- a/dlls/engine/engine.h +++ b/dlls/engine/engine.h @@ -48,10 +48,6 @@ extern int VexdServerForward; #define CAMERA_UPLEFT 2 #define CAMERA_TOPDOWN 3 -#define ANGLEVECTORS_FORWARD 1 -#define ANGLEVECTORS_RIGHT 2 -#define ANGLEVECTORS_UP 3 - enum { usercmd_float_start, diff --git a/plugins/include/amxmodx.inc b/plugins/include/amxmodx.inc index 247c2e86..53e9f20c 100755 --- a/plugins/include/amxmodx.inc +++ b/plugins/include/amxmodx.inc @@ -19,6 +19,7 @@ #include #include #include +#include /* Function is called just after server activation. * Good place for configuration loading, commands and cvars registration. */ @@ -74,6 +75,9 @@ native precache_model(const name[]); /* Precache sound. Can be used only in plugin_precache() function.*/ native precache_sound(const name[]); +/* Precaches any file. */ +native precache_generic(szFile[]); + /* Sets info for player. */ native set_user_info(index,const info[],const value[]); @@ -513,9 +517,6 @@ native server_exec(); /* Emits sound. Sample must be precached. */ native emit_sound(index, channel, sample[], Float:vol, Float:att,flags, pitch); -/* Returns distance between two vectors. */ -native get_distance(origin1[3],origin2[3]); - /* Registers new cvar for HL engine. * Returns the cvar pointer for get/set_pcvar functions. */ @@ -809,9 +810,6 @@ native menu_setprop(menu, prop, ...); //and the callback is invoked. native menu_cancel(player); -// Gets distance between two origins (float) -native Float:get_distance_f( Float:Origin1[3], Float:Origin2[3] ); - // Dispatches a client cvar query // id: Player id // cvar: cvar name diff --git a/plugins/include/engine.inc b/plugins/include/engine.inc index dfd7900e..c076f0b0 100755 --- a/plugins/include/engine.inc +++ b/plugins/include/engine.inc @@ -38,8 +38,6 @@ native register_think(Classname[], function[]); * The module will automatically add +5 for Linux. */ -/* Precaches any file. */ -native precache_generic(szFile[]); /* Precaches an event. */ native precache_event(type, Name[], {Float,Sql,Result,_}:...); @@ -152,17 +150,6 @@ native trace_hull(Float:origin[3],hull,ignoredent=0,ignoremonsters=0); * Returns 0 if theres no normal. */ native trace_normal(iIgnoreEnt, Float:fStart[3], Float:fEnd[3], Float:vReturn[3]); -/* Changes a Vector to an Angle vector. */ -native vector_to_angle(Float:fVector[3], Float:vReturn[3]); - -native angle_vector(Float:vector[3],FRU,Float:ret[3]) - -/* Gets the length of a vector (float[3]). */ -native Float:vector_length(Float:vVector[3]); - -/* Gets the distance between 2 vectors (float[3]). */ -native Float:vector_distance(Float:vVector[3], Float:vVector2[3]); - /* Gets the ID of a grenade. */ native get_grenade_id(id, model[], len, grenadeid = 0); diff --git a/plugins/include/vector.inc b/plugins/include/vector.inc new file mode 100644 index 00000000..9b927a97 --- /dev/null +++ b/plugins/include/vector.inc @@ -0,0 +1,34 @@ +/* Vector functions (now part of Core) + * + * by the AMX Mod X Development Team + * + * This file is provided as is (no warranties). + */ + +#if defined _corevector_included + #endinput +#endif +#define _corevector_included + +/* Used for angle_vector() */ +#define ANGLEVECTOR_FORWARD 1 +#define ANGLEVECTOR_RIGHT 2 +#define ANGLEVECTOR_UP 3 + +/* Returns distance between two vectors. */ +native get_distance(origin1[3],origin2[3]); + +/* Gets distance between two origins (float). */ +native Float:get_distance_f(Float:Origin1[3], Float:Origin2[3]); + +/* Changes a vector into an angle vector. */ +native vector_to_angle(Float:fVector[3], Float:vReturn[3]); + +/* Changes an angle vector into a vector. */ +native angle_vector(Float:vector[3], FRU, Float:ret[3]); + +/* Gets the length of a vector (float[3]). */ +native Float:vector_length(Float:vVector[3]); + +/* Gets the distance between 2 vectors (float[3]). */ +native Float:vector_distance(Float:vVector[3], Float:vVector2[3]);