Added debugging engine

This commit is contained in:
David Anderson 2004-10-03 20:00:23 +00:00
parent 01770f0e5b
commit fc15ac1f41
7 changed files with 64 additions and 143 deletions

View File

@ -11,17 +11,6 @@ int AmxStringToEngine(AMX *amx, cell param, int &len)
return ALLOC_STRING(szString);
}
void EngineError(AMX *amx, char *fmt, ...)
{
va_list p;
va_start(p, fmt);
char errbuf[512];
vsprintf(errbuf, fmt, p);
va_end(p);
MF_Log("%s (\"%s\", line %d)", errbuf, MF_GetScriptName(MF_FindScriptByAmx(amx)), amx->curline);
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
}
void ClearHooks()
{
register unsigned int i = 0;
@ -240,7 +229,7 @@ void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax)
Msg.clear();
register int i = 0, j = 0;
for (i=0; i<256; i++) {
for (j=0; j<msgHooks[i].size(); j++)
for (j=0; j<(int)msgHooks[i].size(); j++)
if (msgHooks[i].at(j) != -1)
MF_UnregisterSPForward(msgHooks[i].at(j));
msgHooks[i].clear();

View File

@ -2451,6 +2451,7 @@ PFN_GET_AMXSTRINGLEN g_fn_GetAmxStringLen;
PFN_FORMAT_AMXSTRING g_fn_FormatAmxString;
PFN_COPY_AMXMEMORY g_fn_CopyAmxMemory;
PFN_LOG g_fn_Log;
PFN_LOG_ERROR g_fn_LogError;
PFN_RAISE_AMXERROR g_fn_RaiseAmxError;
PFN_REGISTER_FORWARD g_fn_RegisterForward;
PFN_EXECUTE_FORWARD g_fn_ExecuteForward;
@ -2532,6 +2533,7 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
REQFUNC("PrintSrvConsole", g_fn_PrintSrvConsole, PFN_PRINT_SRVCONSOLE);
REQFUNC("GetModname", g_fn_GetModname, PFN_GET_MODNAME);
REQFUNC("Log", g_fn_Log, PFN_LOG);
REQFUNC("LogError", g_fn_LogError, PFN_LOG_ERROR);
// Amx scripts
REQFUNC("GetAmxScript", g_fn_GetAmxScript, PFN_GET_AMXSCRIPT);
@ -2651,6 +2653,7 @@ void ValidateMacros_DontCallThis_Smiley()
MF_GetAmxStringLen(NULL);
MF_CopyAmxMemory(NULL, NULL, 0);
MF_Log("str", "str", 0);
MF_LogError(NULL, 0, NULL);
MF_RaiseAmxError(NULL, 0);
MF_RegisterForward("str", (ForwardExecType)0, 0, 0, 0);
MF_ExecuteForward(0, 0, 0);

View File

@ -1919,6 +1919,7 @@ typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr);
typedef char * (*PFN_FORMAT_AMXSTRING) (AMX * /*amx*/, cell * /*params*/, int /*startParam*/, int * /*pLen*/);
typedef void (*PFN_COPY_AMXMEMORY) (cell * /*dest*/, const cell * /*src*/, int /*len*/);
typedef void (*PFN_LOG) (const char * /*fmt*/, ...);
typedef void (*PFN_LOG_ERROR) (AMX * /*amx*/, int /*err*/, const char * /*fmt*/, ...);
typedef int (*PFN_RAISE_AMXERROR) (AMX * /*amx*/, int /*error*/);
typedef int (*PFN_REGISTER_FORWARD) (const char * /*funcname*/, ForwardExecType /*exectype*/, ... /*paramtypes terminated by PF_DONE*/);
typedef int (*PFN_EXECUTE_FORWARD) (int /*id*/, ... /*params*/);
@ -1979,6 +1980,7 @@ extern PFN_GET_AMXSTRINGLEN g_fn_GetAmxStringLen;
extern PFN_FORMAT_AMXSTRING g_fn_FormatAmxString;
extern PFN_COPY_AMXMEMORY g_fn_CopyAmxMemory;
extern PFN_LOG g_fn_Log;
extern PFN_LOG_ERROR g_fn_LogError;
extern PFN_RAISE_AMXERROR g_fn_RaiseAmxError;
extern PFN_REGISTER_FORWARD g_fn_RegisterForward;
extern PFN_EXECUTE_FORWARD g_fn_ExecuteForward;
@ -2036,6 +2038,7 @@ int MF_GetAmxStringLen (const cell *ptr) { }
char * MF_FormatAmxString (AMX * amx, cell * params, int startParam, int * pLen) { }
void MF_CopyAmxMemory (cell * dest, const cell * src, int len) { }
void MF_Log (const char * fmt, ...) { }
void MF_LogError (AMX * amx, int err, const char *fmt, ...) { }
int MF_RaiseAmxError (AMX * amx, int error) { }
int MF_RegisterForward (const char * funcname, ForwardExecType exectype, ...) { }
int MF_ExecuteForward (int id, ...) { }
@ -2083,6 +2086,7 @@ int MF_GetPlayerFlags (int id) { }
#define MF_GetAmxStringLen g_fn_GetAmxStringLen
#define MF_CopyAmxMemory g_fn_CopyAmxMemory
void MF_Log(const char *fmt, ...);
#define MF_LogError g_fn_LogError
#define MF_RaiseAmxError g_fn_RaiseAmxError
#define MF_RegisterForward g_fn_RegisterForward
#define MF_ExecuteForward g_fn_ExecuteForward

View File

@ -105,10 +105,7 @@ static cell AMX_NATIVE_CALL VelocityByAim(AMX *amx, cell *params)
cell *vRet = MF_GetAmxAddr(amx, params[3]);
Vector vVector = Vector(0, 0, 0);
if (!is_ent_valid(iEnt)) {
EngineError(amx, "Invalid Entity %d", iEnt);
return 0;
}
CHECK_ENTITY(iEnt);
edict_t *pEnt = INDEXENT2(iEnt);
@ -329,8 +326,8 @@ static cell AMX_NATIVE_CALL set_speak(AMX *amx, cell *params) {
int iIndex = params[1];
int iNewSpeakFlags = params[2];
if (iIndex> gpGlobals->maxClients || !is_ent_valid(iIndex)) {
EngineError(amx, "Invalid player %d", iIndex);
if (iIndex > gpGlobals->maxClients || !MF_IsPlayerIngame(iIndex)) {
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid player %d", iIndex);
return 0;
}
@ -342,8 +339,8 @@ static cell AMX_NATIVE_CALL set_speak(AMX *amx, cell *params) {
static cell AMX_NATIVE_CALL get_speak(AMX *amx, cell *params) {
int iIndex = params[1];
if (!is_ent_valid(iIndex) || iIndex > gpGlobals->maxClients) {
EngineError(amx, "Invalid player %d", iIndex);
if (iIndex > gpGlobals->maxClients || !MF_IsPlayerIngame(iIndex)) {
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid player %d", iIndex);
return 0;
}
@ -369,10 +366,7 @@ static cell AMX_NATIVE_CALL get_info_keybuffer(AMX *amx, cell *params)
{
int iEnt = params[1];
if (FNullEnt(iEnt) || iEnt < 1 || iEnt > gpGlobals->maxClients) {
EngineError(amx, "Invalid Entity %d", iEnt);
return 0;
}
CHECK_ENTITY(iEnt);
edict_t *e = INDEXENT2(iEnt);
@ -387,10 +381,7 @@ static cell AMX_NATIVE_CALL drop_to_floor(AMX *amx, cell *params)
{
int iEnt = params[1];
if (!is_ent_valid(iEnt)) {
EngineError(amx, "Invalid Entity %d", iEnt);
return 0;
}
CHECK_ENTITY(iEnt);
edict_t *e = INDEXENT2(iEnt);
@ -413,15 +404,12 @@ static cell AMX_NATIVE_CALL attach_view(AMX *amx, cell *params)
int iIndex = params[1];
int iTargetIndex = params[2];
if (iIndex > gpGlobals->maxClients || !is_ent_valid(iIndex)) {
EngineError(amx, "Invalid player %d", iIndex);
if (iIndex > gpGlobals->maxClients || !MF_IsPlayerIngame(iIndex)) {
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid player %d", iIndex);
return 0;
}
if (!is_ent_valid(iTargetIndex)) {
EngineError(amx, "Invalid Entity %d", iIndex);
return 0;
}
CHECK_ENTITY(iIndex);
SET_VIEW(INDEXENT2(iIndex), INDEXENT2(iTargetIndex));
@ -435,8 +423,8 @@ static cell AMX_NATIVE_CALL set_view(AMX *amx, cell *params) {
int iIndex = params[1];
int iCameraType = params[2];
if (iIndex > gpGlobals->maxClients || !is_ent_valid(iIndex)) {
EngineError(amx, "Invalid player %d", iIndex);
if (iIndex > gpGlobals->maxClients || !MF_IsPlayerIngame(iIndex)) {
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid player %d", iIndex);
return 0;
}

View File

@ -13,8 +13,6 @@
#include "entity.h"
#include "gpglobals.h"
//#define CHECK_ENTITY(x) if (x != 0 && (FNullEnt(INDEXENT2(x)) || x < 0 || x > gpGlobals->maxEntities)) { MF_RaiseAmxError(amx,AMX_ERR_NATIVE); return 0; }
extern DLL_FUNCTIONS *g_pFunctionTable;
extern DLL_FUNCTIONS *g_pFunctionTable_Post;
extern enginefuncs_t *g_pengfuncsTable;
@ -170,8 +168,6 @@ inline edict_t* INDEXENT2( int iEdictNum )
return (*g_engfuncs.pfnPEntityOfEntIndex)(iEdictNum);
}
void EngineError(AMX *amx, char *fmt, ...);
int Spawn(edict_t *pEntity);
void ChangeLevel(char* s1, char* s2);
void PlaybackEvent(int flags, const edict_t *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2);
@ -184,7 +180,20 @@ void PlayerPostThink_Post(edict_t *pEntity);
void pfnTouch(edict_t *pToucher, edict_t *pTouched);
void Think(edict_t *pent);
#define CHECK_ENTITY(x) if (x != 0 && (FNullEnt(INDEXENT2(x)) || x < 0 || x > gpGlobals->maxEntities)) { EngineError(amx, "Invalid entity %d", x); return 0; }
#define CHECK_ENTITY(x) \
if (x <= 0 || x > gpGlobals->maxEntities) { \
MF_LogError(amx, AMX_ERR_NATIVE, "Entity out of range (%d)", x); \
} else { \
if (x <= gpGlobals->maxClients) { \
if (!MF_IsPlayerIngame(x)) { \
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid player %d (not in-game)", x); \
} \
} else { \
if (FNullEnt(INDEXENT2(x))) { \
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid entity %d", x); \
} \
} \
}
extern bool g_inKeyValue;
extern KeyValueData *g_pkvd;

View File

@ -26,10 +26,8 @@ static cell AMX_NATIVE_CALL entity_range(AMX *amx, cell *params)
int idxa = params[1];
int idxb = params[2];
if (!is_ent_valid(idxa) || !is_ent_valid(idxb)) {
EngineError(amx, "Invalid Entity");
return 0;
}
CHECK_ENTITY(idxa);
CHECK_ENTITY(idxb);
edict_t *pEntA = INDEXENT2(idxa);
edict_t *pEntB = INDEXENT2(idxb);
@ -47,10 +45,7 @@ static cell AMX_NATIVE_CALL call_think(AMX *amx, cell *params)
{
int iEnt = params[1];
if (!is_ent_valid(iEnt)) {
EngineError(amx, "Invalid Entity %d", iEnt);
return 0;
}
CHECK_ENTITY(iEnt);
edict_t *pEnt = INDEXENT2(iEnt);
@ -65,10 +60,8 @@ static cell AMX_NATIVE_CALL fake_touch(AMX *amx, cell *params)
int iPtr = params[1];
int iPtd = params[2];
if (!is_ent_valid(iPtr) || !is_ent_valid(iPtd)) {
EngineError(amx, "Invalid Entity");
return 0;
}
CHECK_ENTITY(iPtr);
CHECK_ENTITY(iPtd);
edict_t *pToucher = INDEXENT2(iPtr);
edict_t *pTouched = INDEXENT2(iPtd);
@ -83,10 +76,8 @@ static cell AMX_NATIVE_CALL force_use(AMX *amx, cell *params)
int iPtr = params[1];
int iPtd = params[2];
if (!is_ent_valid(iPtr) || !is_ent_valid(iPtd)) {
EngineError(amx, "Invalid Entity");
return 0;
}
CHECK_ENTITY(iPtr);
CHECK_ENTITY(iPtd);
edict_t *pUser = INDEXENT2(iPtr);
edict_t *pUsed = INDEXENT2(iPtd);
@ -139,10 +130,7 @@ static cell AMX_NATIVE_CALL DispatchKeyValue(AMX *amx, cell *params)
if (count == 3) {
cell *cVal = MF_GetAmxAddr(amx, params[1]);
int iValue = *cVal;
if (!is_ent_valid(iValue)) {
EngineError(amx, "Invalid Entity %d", iValue);
return 0;
}
CHECK_ENTITY(iValue);
edict_t *pEntity = INDEXENT2(iValue);
KeyValueData kvd;
int iLength=0;
@ -172,10 +160,7 @@ static cell AMX_NATIVE_CALL DispatchKeyValue(AMX *amx, cell *params)
static cell AMX_NATIVE_CALL get_keyvalue(AMX *amx, cell *params)
{
int idx = params[1];
if (!is_ent_valid(idx)) {
EngineError(amx, "Invalid Entity %d", idx);
return 0;
}
CHECK_ENTITY(idx);
edict_t *pEntity = INDEXENT2(idx);
char *test = INFO_KEY_BUFFER(pEntity);
int iLength=0;
@ -202,10 +187,7 @@ static cell AMX_NATIVE_CALL DispatchSpawn(AMX *amx, cell *params)
{
int iEnt = params[1];
if (!is_ent_valid(iEnt)) {
EngineError(amx, "Invalid Entity %d", iEnt);
return 0;
}
CHECK_ENTITY(iEnt);
edict_t *pEnt = INDEXENT2(iEnt);
@ -224,10 +206,7 @@ static cell AMX_NATIVE_CALL entity_get_float(AMX *amx, cell *params)
int idx = params[2];
REAL fVal = 0;
if (!is_ent_valid(iEnt)) {
EngineError(amx, "Invalid Entity %d", iEnt);
return 0;
}
CHECK_ENTITY(iEnt);
edict_t *pEnt = INDEXENT2(iEnt);
@ -358,10 +337,7 @@ static cell AMX_NATIVE_CALL entity_set_float(AMX *amx, cell *params)
int idx = params[2];
REAL fVal = amx_ctof(params[3]);
if (!is_ent_valid(iEnt)) {
EngineError(amx, "Invalid Entity %d", iEnt);
return 0;
}
CHECK_ENTITY(iEnt);
edict_t *pEnt = INDEXENT2(iEnt);
@ -492,10 +468,7 @@ static cell AMX_NATIVE_CALL entity_get_int(AMX *amx, cell *params)
int idx = params[2];
int iRetValue = 0;
if (!is_ent_valid(iEnt)) {
EngineError(amx, "Invalid Entity %d", iEnt);
return 0;
}
CHECK_ENTITY(iEnt);
edict_t *pEnt = INDEXENT2(iEnt);
@ -613,7 +586,7 @@ static cell AMX_NATIVE_CALL entity_get_int(AMX *amx, cell *params)
iRetValue = pEnt->v.deadflag;
break;
default:
EngineError(amx, "Invalid property %d", iEnt);
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid property %d", idx);
return 0;
break;
}
@ -627,10 +600,7 @@ static cell AMX_NATIVE_CALL entity_set_int(AMX *amx, cell *params)
int idx = params[2];
int iNewValue = params[3];
if (!is_ent_valid(iEnt)) {
EngineError(amx, "Invalid Entity %d", iEnt);
return 0;
}
CHECK_ENTITY(iEnt);
edict_t *pEnt = INDEXENT2(iEnt);
@ -762,10 +732,7 @@ static cell AMX_NATIVE_CALL entity_get_vector(AMX *amx, cell *params)
cell *vRet = MF_GetAmxAddr(amx, params[3]);
Vector vRetValue = Vector(0, 0, 0);
if (!is_ent_valid(iEnt)) {
EngineError(amx, "Invalid Entity %d", iEnt);
return 0;
}
CHECK_ENTITY(iEnt);
edict_t *pEnt = INDEXENT2(iEnt);
@ -858,10 +825,7 @@ static cell AMX_NATIVE_CALL entity_set_vector(AMX *amx, cell *params)
int idx = params[2];
cell *vAmx = MF_GetAmxAddr(amx, params[3]);
if (!is_ent_valid(iEnt)) {
EngineError(amx, "Invalid Entity %d", iEnt);
return 0;
}
CHECK_ENTITY(iEnt);
REAL fX = amx_ctof(vAmx[0]);
REAL fY = amx_ctof(vAmx[1]);
@ -955,10 +919,7 @@ static cell AMX_NATIVE_CALL entity_get_string(AMX *amx, cell *params)
int iszString = 0;
const char *szRet = NULL;
if (!is_ent_valid(iEnt)) {
EngineError(amx, "Invalid Entity %d", iEnt);
return 0;
}
CHECK_ENTITY(iEnt);
edict_t *pEnt = INDEXENT2(iEnt);
@ -1020,10 +981,7 @@ static cell AMX_NATIVE_CALL entity_set_string(AMX *amx, cell *params)
int iLen;
int iszString = AmxStringToEngine(amx, params[3], iLen);
if (!is_ent_valid(iEnt)) {
EngineError(amx, "Invalid Entity %d", iEnt);
return 0;
}
CHECK_ENTITY(iEnt);
edict_t *pEnt = INDEXENT2(iEnt);
@ -1082,10 +1040,7 @@ static cell AMX_NATIVE_CALL entity_get_edict(AMX *amx, cell *params)
int idx = params[2];
edict_t *pRet;
if (!is_ent_valid(iEnt)) {
EngineError(amx, "Invalid Entity %d", iEnt);
return 0;
}
CHECK_ENTITY(iEnt);
edict_t *pEnt = INDEXENT2(iEnt);
@ -1141,10 +1096,8 @@ static cell AMX_NATIVE_CALL entity_set_edict(AMX *amx, cell *params)
int idx = params[2];
int iSetEnt = params[3];
if (!is_ent_valid(iEnt) || !is_ent_valid(iSetEnt)) {
EngineError(amx, "Invalid Entity %d", iEnt);
return 0;
}
CHECK_ENTITY(iEnt);
CHECK_ENTITY(iSetEnt);
edict_t *pEnt = INDEXENT2(iEnt);
edict_t *pSetEnt = INDEXENT2(iSetEnt);
@ -1198,10 +1151,7 @@ static cell AMX_NATIVE_CALL entity_get_byte(AMX *amx, cell *params)
int idx = params[2];
int iRetValue = 0;
if (!is_ent_valid(iEnt)) {
EngineError(amx, "Invalid Entity %d", iEnt);
return 0;
}
CHECK_ENTITY(iEnt);
edict_t *pEnt = INDEXENT2(iEnt);
@ -1239,10 +1189,7 @@ static cell AMX_NATIVE_CALL entity_set_byte(AMX *amx, cell *params)
int idx = params[2];
int iNewValue = params[3];
if (!is_ent_valid(iEnt)) {
EngineError(amx, "Invalid Entity %d", iEnt);
return 0;
}
CHECK_ENTITY(iEnt);
if(iNewValue > 255)
iNewValue = 255;
@ -1283,10 +1230,7 @@ static cell AMX_NATIVE_CALL entity_set_origin(AMX *amx, cell *params)
{
int iEnt = params[1];
if (!is_ent_valid(iEnt)) {
EngineError(amx, "Invalid Entity %d", iEnt);
return 0;
}
CHECK_ENTITY(iEnt);
edict_t *pEnt = INDEXENT2(iEnt);
cell *vVector = MF_GetAmxAddr(amx, params[2]);
@ -1305,10 +1249,7 @@ static cell AMX_NATIVE_CALL entity_set_model(AMX *amx, cell *params)
{
int iEnt = params[1];
if (!is_ent_valid(iEnt)) {
EngineError(amx, "Invalid Entity %d", iEnt);
return 0;
}
CHECK_ENTITY(iEnt);
edict_t *pEnt = INDEXENT2(iEnt);
int iLen;
@ -1327,10 +1268,7 @@ static cell AMX_NATIVE_CALL entity_set_size(AMX *amx, cell *params)
{
int iEnt = params[1];
if (!is_ent_valid(iEnt)) {
EngineError(amx, "Invalid Entity %d", iEnt);
return 0;
}
CHECK_ENTITY(iEnt);
edict_t *pEnt = INDEXENT2(iEnt);
@ -1411,10 +1349,7 @@ static cell AMX_NATIVE_CALL find_sphere_class(AMX *amx, cell *params) // find_sp
vec3_t vecOrigin;
if (params[1] > 0) {
if (!is_ent_valid(params[1])) {
EngineError(amx, "Invalid Entity %d", params[1]);
return 0;
}
CHECK_ENTITY(params[1]);
edict_t* pEntity = INDEXENT2(params[1]);
vecOrigin = pEntity->v.origin;
@ -1522,10 +1457,7 @@ static cell AMX_NATIVE_CALL find_ent_by_owner(AMX *amx, cell *params) // native
int iEnt = params[1];
int oEnt = params[3];
// Check index to start searching at, 0 must be possible for iEnt.
if (!is_ent_valid(oEnt)) {
EngineError(amx, "Invalid Entity");
return 0;
}
CHECK_ENTITY(oEnt);
edict_t *pEnt = INDEXENT2(iEnt);
edict_t *entOwner = INDEXENT2(oEnt);
@ -1560,10 +1492,7 @@ static cell AMX_NATIVE_CALL get_grenade_id(AMX *amx, cell *params) /* 4 param *
int index = params[1];
char* szModel;
if (!is_ent_valid(index)) {
EngineError(amx, "Invalid Entity %d", index);
return 0;
}
CHECK_ENTITY(index);
edict_t* pentFind = INDEXENT2(params[4]);
edict_t* pentOwner = INDEXENT2(index);

View File

@ -2,7 +2,6 @@
CVector<argMsg*> Msg;
CVector<int> msgHooks[256];
//int msgHooks[256] = {0};
int msgBlocks[256] = {0};
int msgDest;
int msgType;