cell AMX_NATIVE_CALL Rage::GetFunctionFromEntity(AMX* amx,cell* params) { int len; char *func_name = g_fn_GetAmxString(amx,params[1],0,&len); VirtualFunction** virtual_function_ptr = Global::virtualFunctionsManager.get_by_label(func_name); if(!virtual_function_ptr) { MF_LogError(amx, AMX_ERR_NATIVE, "Virtual function %s not registered",func_name); return -1; } VirtualFunction* virtual_function = *virtual_function_ptr; int entity = (int) params[2]; void* object = IndexToPrivate(entity); if(!object) { MF_LogError(amx, AMX_ERR_NATIVE, "Failed to get private data of entity '%d' for use with virtual function '%s'",entity,func_name); return -1; } return virtual_function->create_get_id(object); }
static cell AMX_NATIVE_CALL SQL_NextResultSet(AMX *amx, cell *params) { AmxQueryInfo *qInfo = (AmxQueryInfo *)GetHandle(params[1], Handle_Query); if (!qInfo) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid query handle: %d", params[1]); return 0; } IResultSet *rs = qInfo->info.rs; if (!rs) { MF_LogError(amx, AMX_ERR_NATIVE, "No result set in this query!"); return 0; } if (rs->NextResultSet()) { return 1; } else { qInfo->info.rs = NULL; return 0; } }
// rp_add_hook(address, const description[], const handler[], bool:post, flags) static cell AMX_NATIVE_CALL rp_add_hook(AMX *amx, cell *params) { enum args_e { arg_count, arg_address, arg_description, arg_handler, arg_post, arg_flags }; int funcid, len; void* addr = (void *)params[arg_address]; const char* desc = g_amxxapi.GetAmxString(amx, params[arg_description], 0, &len); const char* funcname = g_amxxapi.GetAmxString(amx, params[arg_handler], 1, &len); if (!addr) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid library handle provided in rp_add_hook(0, \"%s\", \"%s\", ...)", desc, funcname); return NULL; } if (g_amxxapi.amx_FindPublic(amx, funcname, &funcid) != AMX_ERR_NONE) { setError("Public function \"%s\" not found", funcname); MF_LogError(amx, AMX_ERR_NATIVE, "%s", g_lastError); return NULL; } int fwdid = g_amxxapi.RegisterSPForward(amx, funcid, FP_DONE); return (cell)g_hookManager.createHook(addr, desc, params[arg_post] == 0, amx, fwdid, params[arg_flags]); }
static cell AMX_NATIVE_CALL SQL_FieldNameToNum(AMX *amx, cell *params) { AmxQueryInfo *qInfo = (AmxQueryInfo *)GetHandle(params[1], Handle_Query); if (!qInfo) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid query handle: %d", params[1]); return 0; } IResultSet *rs = qInfo->info.rs; if (!rs) { MF_LogError(amx, AMX_ERR_NATIVE, "No result set in this query!"); return 0; } int len; char *namewa = MF_GetAmxString(amx, params[2], 0, &len); unsigned int columnId; if (!rs->FieldNameToNum(namewa, &columnId)) { return -1; } return columnId; }
static cell AMX_NATIVE_CALL SQL_FieldNumToName(AMX *amx, cell *params) { AmxQueryInfo *qInfo = (AmxQueryInfo *)GetHandle(params[1], Handle_Query); if (!qInfo) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid query handle: %d", params[1]); return 0; } IResultSet *rs = qInfo->info.rs; if (!rs) { MF_LogError(amx, AMX_ERR_NATIVE, "No result set in this query!"); return 0; } unsigned int col = static_cast<unsigned int>(params[2]); const char *namewa = rs->FieldNumToName(col); if (!namewa) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid column: %d", col); return 0; } MF_SetAmxString(amx, params[3], namewa, params[4]); return 1; }
static cell AMX_NATIVE_CALL SQL_ReadResult(AMX *amx, cell *params) { AmxQueryInfo *qInfo = (AmxQueryInfo *)GetHandle(params[1], Handle_Query); if (!qInfo) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid query handle: %d", params[1]); return 0; } IResultSet *rs = qInfo->info.rs; if (!rs || rs->IsDone()) { MF_LogError(amx, AMX_ERR_NATIVE, "No result set in this query!"); return 0; } IResultRow *row = rs->GetRow(); unsigned int col = static_cast<unsigned int>(params[2]); if (col >= rs->FieldCount()) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid column: %d", col); return 0; } cell numparams = params[0] / sizeof(cell); switch (numparams) { case 4: { const char *str = row->GetString(col); if (!str) str = ""; cell *len = MF_GetAmxAddr(amx, params[4]); MF_SetAmxString(amx, params[3], str, (int)*len); break; } case 3: { REAL num = row->GetFloat(col); cell *addr = MF_GetAmxAddr(amx, params[3]); *addr = amx_ftoc(num); break; } case 2: { int num = row->GetInt(col); return num; break; } default: { MF_LogError(amx, AMX_ERR_NATIVE, "Bad number of arguments passed."); break; } } return 1; }
static cell AMX_NATIVE_CALL SQL_IsNull(AMX *amx, cell *params) { AmxQueryInfo *qInfo = (AmxQueryInfo *)GetHandle(params[1], Handle_Query); if (!qInfo) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid query handle: %d", params[1]); return 0; } IResultSet *rs = qInfo->info.rs; if (!rs || rs->IsDone()) { MF_LogError(amx, AMX_ERR_NATIVE, "No result set in this query!"); return 0; } unsigned int col = static_cast<unsigned int>(params[2]); if (col >= rs->FieldCount()) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid column: %d", col); return 0; } IResultRow *rr = rs->GetRow(); return rr->IsNull(col) ? 1 : 0; }
// wid,att,vic,dmg,hp=0 static cell AMX_NATIVE_CALL cwpn_dmg(AMX *amx, cell *params) { int weapon = params[1]; // only for custom weapons if(weapon < DODMAX_WEAPONS-DODMAX_CUSTOMWPNS) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid custom weapon id %d", weapon); return 0; } int att = params[2]; CHECK_PLAYER(params[2]); int vic = params[3]; CHECK_PLAYER(params[3]); int dmg = params[4]; if(dmg<1) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid damage %d", dmg); return 0; } int aim = params[5]; if(aim < 0 || aim > 7) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid aim %d", aim); return 0; } CPlayer* pAtt = GET_PLAYER_POINTER_I(att); CPlayer* pVic = GET_PLAYER_POINTER_I(vic); pVic->pEdict->v.dmg_inflictor = NULL; if(pAtt->index != pVic->index) pAtt->saveHit(pVic , weapon , dmg, aim); if(!pAtt) pAtt = pVic; int TA = 0; if((pVic->pEdict->v.team == pAtt->pEdict->v.team) && (pVic != pAtt)) TA = 1; MF_ExecuteForward(iFDamage,pAtt->index, pVic->index, dmg, weapon, aim, TA); if(pVic->IsAlive()) return 1; pAtt->saveKill(pVic,weapon,( aim == 1 ) ? 1:0 ,TA); MF_ExecuteForward(iFDeath,pAtt->index, pVic->index, weapon, aim, TA); return 1; }
// {_,Float}:rp_get_original_return(...) static cell AMX_NATIVE_CALL rp_get_return(AMX *amx, cell *params) { if (PARAMS_COUNT == 0) { MF_LogError(amx, AMX_ERR_NATIVE, "%s called without destination parameters.", __FUNCTION__); return 0; } if (!g_currentHandler) { MF_LogError(amx, AMX_ERR_NATIVE, "Trying get return value without active hook."); return 0; } auto func = &g_currentHandler->func; dword value; double fvalue; bool success; switch (func->getReturnRegister()) { case r_eax: success = g_hookManager.getReturn(&value); break; case r_st0: success = g_hookManager.getReturn(&fvalue); *(float *)&value = (float)fvalue; break; default: setError("Function without return type."); return 0; // no return } if (!success) { MF_LogError(amx, AMX_ERR_NATIVE, "%s", g_lastError); return 0; } if (PARAMS_COUNT == 2) { if (func->getReturnType() != bt_string) { MF_LogError(amx, AMX_ERR_NATIVE, "Return value isn't string."); return 0; } // TODO: implement getting of array via ConvertToAmxArray g_amxxapi.SetAmxString(amx, params[1], (char *)value, params[2]); return value; } cell* addr = g_amxxapi.GetAmxAddr(amx, params[1]); *addr = ConvertToAmxType(value, func->getReturnType()); return 1; }
//shamelessly pulled from fun static cell AMX_NATIVE_CALL csdm_give_item(AMX *amx, cell *params) // native give_item(index, const item[]); = 2 params { // Check index. if (params[1] < 1 || params[1] > gpGlobals->maxClients) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid player %d", params[1]); return 0; } else if (!MF_IsPlayerIngame(params[1])) { MF_LogError(amx, AMX_ERR_NATIVE, "Player %d is not in game", params[1]); return 0; } // Get player pointer. edict_t *pPlayer = MF_GetPlayerEdict(params[1]); // Create item entity pointer edict_t *pItemEntity; // Make an "intstring" out of 2nd parameter int length; const char *szItem = MF_GetAmxString(amx, params[2], 1, &length); //check for valid item if (strncmp(szItem, "weapon_", 7) && strncmp(szItem, "ammo_", 5) && strncmp(szItem, "item_", 5) && strncmp(szItem, "tf_weapon_", 10) ) { return 0; } string_t item = ALLOC_STRING(szItem); // Using MAKE_STRING makes "item" contents get lost when we leave this scope! ALLOC_STRING seems to allocate properly... pItemEntity = CREATE_NAMED_ENTITY(item); if (FNullEnt(pItemEntity)) { MF_LogError(amx, AMX_ERR_NATIVE, "Item \"%s\" failed to create", szItem); return 0; } pItemEntity->v.origin = pPlayer->v.origin; pItemEntity->v.spawnflags |= (1 << 30); //SF_NORESPAWN; MDLL_Spawn(pItemEntity); int save = pItemEntity->v.solid; MDLL_Touch(pItemEntity, ENT(pPlayer)); if (pItemEntity->v.solid == save) { REMOVE_ENTITY(pItemEntity); //the function did not fail - we're just deleting the item return -1; } return ENTINDEX(pItemEntity); }
static cell AMX_NATIVE_CALL get_kvd(AMX *amx, cell *params) { KVD_Wrapper *kvdw; KeyValueData *kvd; if (params[1] == 0) kvdw = &g_kvd_glb; else kvdw = reinterpret_cast<KVD_Wrapper *>(params[1]); kvd = kvdw->kvd; switch (params[2]) { case KV_fHandled: { return kvd->fHandled; break; } case KV_ClassName: { if (params[0] / sizeof(cell) != 4) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid number of parameters passed"); return 0; } cell *ptr = MF_GetAmxAddr(amx, params[4]); return MF_SetAmxString(amx, params[3], kvd->szClassName, (int)*ptr); break; } case KV_KeyName: { if (params[0] / sizeof(cell) != 4) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid number of parameters passed"); return 0; } cell *ptr = MF_GetAmxAddr(amx, params[4]); return MF_SetAmxString(amx, params[3], kvd->szKeyName, (int)*ptr); break; } case KV_Value: { if (params[0] / sizeof(cell) != 4) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid number of parameters passed"); return 0; } cell *ptr = MF_GetAmxAddr(amx, params[4]); return MF_SetAmxString(amx, params[3], kvd->szValue, (int)*ptr); break; } } MF_LogError(amx, AMX_ERR_NATIVE, "Invalid KeyValueData member: %d", params[2]); return 0; }
static cell AMX_NATIVE_CALL set_kvd(AMX *amx, cell *params) { KVD_Wrapper *kvdw; KeyValueData *kvd; if (params[1] == 0) kvdw = &g_kvd_glb; else kvdw = reinterpret_cast<KVD_Wrapper *>(params[1]); kvd = kvdw->kvd; if (*params / sizeof(cell) < 3) { MF_LogError(amx, AMX_ERR_NATIVE, "No data passed"); return 0; } cell *ptr = MF_GetAmxAddr(amx, params[3]); int len; switch (params[2]) { case KV_fHandled: { kvd->fHandled = (int)*ptr; return 1; break; } case KV_ClassName: { kvdw->cls = MF_GetAmxString(amx, params[3], 0, &len); kvd->szClassName = const_cast<char *>(kvdw->cls.chars()); return 1; break; } case KV_KeyName: { kvdw->key = MF_GetAmxString(amx, params[3], 0, &len); kvd->szKeyName = const_cast<char *>(kvdw->key.chars()); return 1; break; } case KV_Value: { kvdw->val = MF_GetAmxString(amx, params[3], 0, &len); kvd->szValue = const_cast<char *>(kvdw->val.chars()); return 1; break; } } MF_LogError(amx, AMX_ERR_NATIVE, "Invalid KeyValueData member: %d", params[2]); return 0; }
static cell AMX_NATIVE_CALL custom_wpn_dmg(AMX *amx, cell *params){ // wid,att,vic,dmg,hp=0 int weapon = params[1]; if ( weapon < MAX_WEAPONS || weapon >= MAX_WEAPONS+MAX_CWEAPONS || !weaponData[weapon].used ){ // only for custom weapons MF_LogError(amx, AMX_ERR_NATIVE, "Invalid weapon id %d", weapon); return 0; } int att = params[2]; CHECK_PLAYERRANGE(att); int vic = params[3]; CHECK_PLAYERRANGE(vic); int dmg = params[4]; if ( dmg<1 ){ MF_LogError(amx, AMX_ERR_NATIVE, "Invalid damage %d", dmg); return 0; } int aim = params[5]; if ( aim < 0 || aim > 7 ){ MF_LogError(amx, AMX_ERR_NATIVE, "Invalid aim %d", aim); return 0; } CPlayer* pAtt = GET_PLAYER_POINTER_I(att); CPlayer* pVic = GET_PLAYER_POINTER_I(vic); pVic->pEdict->v.dmg_inflictor = NULL; pAtt->saveHit( pVic , weapon , dmg, aim ); if ( !pAtt ) pAtt = pVic; int TA = 0; if ( (pVic->teamId == pAtt->teamId) && ( pVic != pAtt) ) TA = 1; MF_ExecuteForward( iFDamage, static_cast<cell>(pAtt->index), static_cast<cell>(pVic->index), static_cast<cell>(dmg), static_cast<cell>(weapon), static_cast<cell>(aim), static_cast<cell>(TA) ); if ( pVic->IsAlive() ) return 1; pAtt->saveKill(pVic,weapon,( aim == 1 ) ? 1:0 ,TA); MF_ExecuteForward( iFDeath, static_cast<cell>(pAtt->index), static_cast<cell>(pVic->index), static_cast<cell>(weapon), static_cast<cell>(aim), static_cast<cell>(TA) ); return 1; }
// ns_giveiteM(id,"item"); static cell AMX_NATIVE_CALL ns_giveitem(AMX *amx, cell *params) { CreatePlayerPointer(amx,params[1]); char *classname = MF_GetAmxString(amx,params[2],0,NULL); if (!player->IsConnected()) { return 0; } if (player->GetPev()->deadflag > 0) { return 0; } edict_t *object=CREATE_NAMED_ENTITY(ALLOC_STRING2(classname)); if (!object) { MF_LogError(amx, AMX_ERR_NATIVE, "Error creating entity \"%s\"", classname); return 0; } SET_ORIGIN(object,player->GetPev()->origin); // move to player gpGamedllFuncs->dllapi_table->pfnSpawn(object); // emulate spawn object->v.flags |= FL_ONGROUND; // make it think it's touched the ground gpGamedllFuncs->dllapi_table->pfnThink(object); // gpGamedllFuncs->dllapi_table->pfnTouch(object,player->GetEdict()); // give it to the player return 1; }
static cell AMX_NATIVE_CALL csdm_respawn(AMX *amx, cell *params) { int index = params[1]; if (index < 1 || index > gpGlobals->maxClients || !MF_IsPlayerIngame(index)) { MF_LogError(amx, AMX_ERR_NATIVE, "Player %d is not valid", index); return 0; } edict_t *pEdict = MF_GetPlayerEdict(index); if (FNullEnt(pEdict)) return 0; int team = GetPlayerTeam(pEdict); if (team == TEAM_T || team == TEAM_CT) { RespawnPlayer(pEdict); } else { return 0; } return 1; }
static cell AMX_NATIVE_CALL SQL_QuoteStringFmt(AMX *amx, cell *params) { int len; char *str = MF_FormatAmxString(amx, params, 4, &len); size_t newsize; static char buffer[8192]; if (params[1] != 0) { IDatabase *pDb = (IDatabase *)GetHandle(params[1], Handle_Database); if (!pDb) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid database handle: %d", params[1]); return 0; } if (pDb->QuoteString(str, buffer, sizeof(buffer)-1, &newsize) == 0) { MF_SetAmxString(amx, params[2], buffer, params[3]); return newsize; } else { return -1; } } else { if (g_Sqlite.QuoteString(str, buffer, sizeof(buffer)-1, &newsize) == 0) { MF_SetAmxString(amx, params[2], buffer, params[3]); return newsize; } else { return -1; } } }
static cell AMX_NATIVE_CALL SQL_Connect(AMX *amx, cell *params) { SQL_Connection *sql = (SQL_Connection *)GetHandle(params[1], Handle_Connection); if (!sql) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid handle: %d", params[1]); return 0; } DatabaseInfo nfo; nfo.database = sql->db; nfo.user = ""; nfo.pass = ""; nfo.port = 0; nfo.host = ""; char buffer[512]; int errcode; IDatabase *pDb = g_Sqlite.Connect(&nfo, &errcode, buffer, sizeof(buffer)-1); if (!pDb) { cell *c_err = MF_GetAmxAddr(amx, params[2]); *c_err = errcode; MF_SetAmxString(amx, params[3], buffer, params[4]); return 0; } return MakeHandle(pDb, Handle_Database, FreeDatabase); }
cell Call_Void_Float_Vector_Trace_Int(AMX *amx, cell *params) { SETUP(4); float f3=amx_ctof2(*MF_GetAmxAddr(amx, params[3])); Vector v4; TraceResult *tr5=reinterpret_cast<TraceResult *>(*MF_GetAmxAddr(amx, params[5])); int i6=*MF_GetAmxAddr(amx, params[6]); float *fl4=(float *)MF_GetAmxAddr(amx, params[4]); v4.x=fl4[0]; v4.y=fl4[1]; v4.z=fl4[2]; if (tr5==NULL) { MF_LogError(amx, AMX_ERR_NATIVE, "Null traceresult provided."); return 0; } #if defined(_WIN32) reinterpret_cast<void (__fastcall *)(void *, int, float, Vector, TraceResult *, int)>(__func)(pv, 0, f3, v4, tr5, i6); #elif defined(__linux__) || defined(__APPLE__) reinterpret_cast<void (*)(void *, float, Vector, TraceResult *, int)>(__func)(pv, f3, v4, tr5, i6); #endif return 1; }
cell Call_Void_Entvar_Float_Vector_Trace_Int(AMX *amx, cell *params) { SETUP(5); int id3=*MF_GetAmxAddr(amx, params[3]); float f4=amx_ctof2(*MF_GetAmxAddr(amx, params[4])); Vector v5; TraceResult *tr6=reinterpret_cast<TraceResult *>(*MF_GetAmxAddr(amx, params[6])); int i7=*MF_GetAmxAddr(amx, params[7]); float *fl5=(float *)MF_GetAmxAddr(amx, params[5]); v5.x=fl5[0]; v5.y=fl5[1]; v5.z=fl5[2]; if (tr6==NULL) { MF_LogError(amx, AMX_ERR_NATIVE, "Null traceresult provided."); return 0; } CHECK_ENTITY(id3); entvars_t *ev3=&(INDEXENT_NEW(id3)->v); #if defined(_WIN32) reinterpret_cast<void (__fastcall *)(void *, int, entvars_t *, float, Vector, TraceResult *, int)>(__func)(pv, 0, ev3, f4, v5, tr6, i7); #elif defined(__linux__) || defined(__APPLE__) reinterpret_cast<void (*)(void *, entvars_t *, float, Vector, TraceResult *, int)>(__func)(pv, ev3, f4, v5, tr6, i7); #endif return 1; }
// GetModelCollisionBox( index, Float:mins[3], Float:maxs[3] ); static cell AMX_NATIVE_CALL GetModelCollisionBox(AMX *amx, cell *params) { int entityIndex = params[1]; CHECK_ENTITY(entityIndex); edict_t *pEdict = INDEXENT2(entityIndex); if (!FNullEnt(pEdict)) { studiohdr_t *pStudiohdr = static_cast<studiohdr_t*>(GET_MODEL_PTR(pEdict)); if (!pStudiohdr) { MF_LogError(amx, AMX_ERR_NATIVE, "Could not find the model pointer for the entity."); return 0; } cell *cmins = MF_GetAmxAddr(amx, params[2]); cell *cmaxs = MF_GetAmxAddr(amx, params[3]); cmins[0] = amx_ftoc(pStudiohdr->bbmin.x); cmins[1] = amx_ftoc(pStudiohdr->bbmin.y); cmins[2] = amx_ftoc(pStudiohdr->bbmin.z); cmaxs[0] = amx_ftoc(pStudiohdr->bbmax.x); cmaxs[1] = amx_ftoc(pStudiohdr->bbmax.y); cmaxs[2] = amx_ftoc(pStudiohdr->bbmax.z); return 1; } return 0; };
//native regex_replace(Regex:pattern, string[], maxLen, const replace[], flags = REGEX_FORMAT_DEFAULT, &errcode = 0); static cell AMX_NATIVE_CALL regex_replace(AMX *amx, cell *params) { int id = params[1] - 1; if (id >= (int)PEL.length() || id < 0 || PEL[id]->isFree()) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid regex handle %d", id); return 0; } int textLen, replaceLen; char *text = MF_GetAmxString(amx, params[2], 0, &textLen); const char *replace = MF_GetAmxString(amx, params[4], 1, &replaceLen); cell *erroCode = MF_GetAmxAddr(amx, params[6]); RegEx *x = PEL[id]; int e = x->Replace(text, params[3] + 1, replace, replaceLen, params[5]); if (e == -1) { *erroCode = x->mErrorOffset; x->ClearMatch(); return -2; } else if (e == 0) { *erroCode = 0; x->ClearMatch(); return 0; } MF_SetAmxString(amx, params[2], text, params[3]); return e; }
// native regex_substr(Regex:id, str_id, buffer[], maxLen); static cell AMX_NATIVE_CALL regex_substr(AMX *amx, cell *params) { int id = params[1]-1; if (id >= (int)PEL.length() || id < 0 || PEL[id]->isFree()) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid regex handle %d", id); return 0; } RegEx *x = PEL[id]; static char buffer[16384]; // Same as AMXX buffer. size_t length; size_t maxLength = ke::Min<size_t>(params[4], sizeof(buffer) - 1); const char *ret = x->GetSubstring(params[2], buffer, maxLength, &length); if (ret == NULL) { return 0; } if (length >= maxLength && ret[length - 1] & 1 << 7) { maxLength -= UTIL_CheckValidChar((char *)ret + length - 1); } MF_SetAmxString(amx, params[3], ret, maxLength); return 1; }
/* We want to get just the weapon of whichever type that the player is on him */ static cell AMX_NATIVE_CALL dod_weapon_type(AMX *amx, cell *params) /* 2 params */ { int index = params[1]; int type = params[2]; CHECK_PLAYER(index); if(type < DODWT_PRIMARY || type > DODWT_OTHER) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid weapon type id %d", type); return 0; } CPlayer* pPlayer = GET_PLAYER_POINTER_I(index); if(pPlayer->ingame) { int weaponsbit = pPlayer->pEdict->v.weapons & ~(1<<31); // don't count last element for(int x = 1; x < MAX_WEAPONS; ++x) { if((weaponsbit&(1<<x)) > 0) { if(weaponData[x].type == type) return x; } } } return 0; }
// SetModelCollisionBox( index ); static cell AMX_NATIVE_CALL SetModelCollisionBox(AMX *amx, cell *params) { int entityIndex = params[1]; CHECK_ENTITY(entityIndex); edict_t *pentModel = INDEXENT2(entityIndex); if (!FNullEnt(pentModel)) { studiohdr_t *pStudiohdr = static_cast<studiohdr_t*>(GET_MODEL_PTR(pentModel)); if (!pStudiohdr) { MF_LogError(amx, AMX_ERR_NATIVE, "Could not find the model pointer for the entity."); return 0; } SET_SIZE(pentModel, pStudiohdr->bbmin, pStudiohdr->bbmax); return 1; } return 0; };
static cell AMX_NATIVE_CALL get_user_wstats(AMX *amx, cell *params) /* 4 param */ { int index = params[1]; CHECK_PLAYERRANGE(index); int weapon = params[2]; if (weapon<0||weapon>=MAX_WEAPONS+MAX_CWEAPONS){ MF_LogError(amx, AMX_ERR_NATIVE, "Invalid weapon id %d", weapon); return 0; } CPlayer* pPlayer = GET_PLAYER_POINTER_I(index); if (pPlayer->weapons[weapon].shots){ cell *cpStats = MF_GetAmxAddr(amx,params[3]); cell *cpBodyHits = MF_GetAmxAddr(amx,params[4]); CPlayer::PlayerWeapon* stats = &pPlayer->weapons[weapon]; cpStats[0] = stats->kills; cpStats[1] = stats->deaths; cpStats[2] = stats->hs; cpStats[3] = stats->tks; cpStats[4] = stats->shots; cpStats[5] = stats->hits; cpStats[6] = stats->damage; for(int i = 1; i < 8; ++i) cpBodyHits[i] = stats->bodyHits[i]; return 1; } return 0; }
cell PSKeyValueF(const char *name, AMX *amx, cell *params) { if (params[1]==0) { MF_LogError(amx,AMX_ERR_NATIVE,"Invalid particle system handle provided!"); return 0; } KeyValueData kvd; char StrData[1024]; UTIL_Format(StrData, sizeof(StrData)-1, "%f", amx_ctof2(params[2])); kvd.szClassName=const_cast<char *>(STRING(reinterpret_cast<edict_t *>(params[1])->v.classname)); kvd.szKeyName=name; kvd.szValue=&StrData[0]; kvd.fHandled=0; //printf("\"%s\" \"%s\"\n",kvd.szKeyName,kvd.szValue); MDLL_KeyValue(reinterpret_cast<edict_t *>(params[1]),&kvd); return 1; }
static cell AMX_NATIVE_CALL get_wpnlogname(AMX *amx, cell *params){ int id = params[1]; if (id<1 || id>=MAX_WEAPONS+MAX_CWEAPONS ){ MF_LogError(amx, AMX_ERR_NATIVE, "Invalid weapon id %d", id); return 0; } return MF_SetAmxString(amx,params[2],weaponData[id].logname,params[3]); }
/* 0 [Byte] 1 // Weapons Groupings 1 [Byte] 210 // Total Rounds Allowed 2 [Byte] -1 // Undefined Not Used 3 [Byte] -1 // Undefined Not Used 4 [Byte] 2 // Weapon Slot 5 [Byte] 0 // Bucket ( Position Under Weapon Slot ) 6 [Short] 7 // Weapon Number / Bit Field for the weapon 7 [Byte] 128 // Bit Field for the Ammo or Ammo Type 8 [Byte] 30 // Rounds Per Mag id, wpnID, slot, position, totalrds */ static cell AMX_NATIVE_CALL dod_weaponlist(AMX *amx, cell *params) // player { if(!weaponlist[params[1]].changeable) { MF_LogError(amx, AMX_ERR_NATIVE, "This Weapon Cannot be Changed"); return 0; } int id = params[1]; int wpnID = params[2]; int slot = params[3]; int position = params[4]; int totalrds = params[5]; UTIL_LogPrintf("ID (%d) WpnID (%d) Slot (%d) Pos (%d) Rounds (%d)", id, wpnID, slot, position, totalrds); CHECK_PLAYER(id); CPlayer* pPlayer = GET_PLAYER_POINTER_I(id); if(!pPlayer->ingame) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid Player, Not on Server"); return 0; } MESSAGE_BEGIN(MSG_ONE, GET_USER_MSG_ID(PLID, "WeaponList", NULL), NULL, INDEXENT(id)); WRITE_BYTE(weaponlist[wpnID].grp); WRITE_BYTE(totalrds); WRITE_BYTE(-1); WRITE_BYTE(-1); WRITE_BYTE(slot - 1); WRITE_BYTE(position); WRITE_SHORT(wpnID); WRITE_BYTE(weaponlist[wpnID].bitfield); // Is it grenades if(wpnID == 13 || wpnID == 14 || wpnID == 15 || wpnID == 16 || wpnID == 36) WRITE_BYTE(-1); else if(wpnID == 29 || wpnID == 30 || wpnID == 31) WRITE_BYTE(1); else WRITE_BYTE(weaponlist[wpnID].clip); MESSAGE_END(); return 1; }
//public QueryHandler(state, Handle:query, error[], errnum, data[], size) //native SQL_ThreadQuery(Handle:cn_tuple, const handler[], const query[], const data[]="", dataSize=0); static cell AMX_NATIVE_CALL SQL_ThreadQuery(AMX *amx, cell *params) { if (!g_pWorker) { MF_LogError(amx, AMX_ERR_NATIVE, "Thread worker was unable to start."); return 0; } SQL_Connection *cn = (SQL_Connection *)GetHandle(params[1], Handle_Connection); if (!cn) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid info tuple handle: %d", params[1]); return 0; } int len; const char *handler = MF_GetAmxString(amx, params[2], 0, &len); int fwd = MF_RegisterSPForwardByName(amx, handler, FP_CELL, FP_CELL, FP_STRING, FP_CELL, FP_ARRAY, FP_CELL, FP_DONE); if (fwd < 1) { MF_LogError(amx, AMX_ERR_NATIVE, "Function not found: %s", handler); return 0; } MysqlThread *kmThread; g_QueueLock->Lock(); if (g_FreeThreads.empty()) { kmThread = new MysqlThread(); } else { kmThread = g_FreeThreads.front(); g_FreeThreads.pop(); } g_QueueLock->Unlock(); kmThread->SetInfo(cn->db); kmThread->SetForward(fwd); kmThread->SetQuery(MF_GetAmxString(amx, params[3], 1, &len)); kmThread->SetCellData(MF_GetAmxAddr(amx, params[4]), (ucell)params[5]); g_pWorker->MakeThread(kmThread); return 1; }
// rp_set_raw_return(aby:value) static cell AMX_NATIVE_CALL rp_set_raw_return(AMX *amx, cell *params) { if (PARAMS_COUNT == 0) { MF_LogError(amx, AMX_ERR_NATIVE, "%s called without source parameters.", __FUNCTION__); return 0; } if (!g_currentHandler) { MF_LogError(amx, AMX_ERR_NATIVE, "Trying get return value without active hook."); return 0; } auto func = &g_currentHandler->func; dword value = params[1]; switch (func->getReturnType()) { case bt_short: value = (dword)short(value); break; case bt_word: value &= 0xFFFF; break; case bt_char: value = (dword)char(value); break; case bt_byte: value &= 0xFF; break; case bt_float: case bt_double: return g_hookManager.setReturnValue((double)*(float *)&value); case bt_unknown: case bt_void: setError("Function without return type."); return 0; // no return } return g_hookManager.setReturnValue(value); }