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; }
//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_speak(AMX *amx, cell *params) { int iIndex = params[1]; if (iIndex > gpGlobals->maxClients || !MF_IsPlayerIngame(iIndex)) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid player %d", iIndex); return 0; } return plinfo[iIndex].iSpeakFlags; }
static cell AMX_NATIVE_CALL csdm_fakespawn(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; return 1; }
int is_ent_valid(int iEnt) { if (iEnt < 1 || iEnt > gpGlobals->maxEntities) return 0; if (iEnt <= gpGlobals->maxClients) { if (!MF_IsPlayerIngame(iEnt)) { return 0; } } else { if (FNullEnt(INDEXENT(iEnt))) { return 0; } } return 1; }
static cell AMX_NATIVE_CALL csdm_getpos(AMX *amx, cell *params) { int player = params[1]; if (player < 0 || player > gpGlobals->maxClients || !MF_IsPlayerIngame(player)) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid or not in-game player %d", player); return 0; } int numParams = *params / sizeof(cell); edict_t *pEdict = MF_GetPlayerEdict(player); VectorToCell(amx, params[1], pEdict->v.origin); if (numParams >= 2) { VectorToCell(amx, params[2], pEdict->v.angles); if (numParams >= 3) VectorToCell(amx, params[3], pEdict->v.v_angle); } return 1; }
static cell AMX_NATIVE_CALL csdm_remove_weapon(AMX *amx, cell *params) { // Check index. unsigned int owner = params[1]; if (owner < 1 || owner > (unsigned int)gpGlobals->maxClients) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid player %d", owner); return 0; } else if (!MF_IsPlayerIngame(owner)) { MF_LogError(amx, AMX_ERR_NATIVE, "Player %d is not in game", owner); return 0; } int len; char *str = MF_GetAmxString(amx, params[2], 0, &len); edict_t *pEdict = MF_GetPlayerEdict(owner); if (params[4]) { FindWeapon *p = FindWeapon::NewFindWeapon(pEdict, str, params[3]); g_Timer.AddTask(p, 0.1); return 1; } edict_t *searchEnt = NULL; if (strcmp(str, "weapon_shield") != 0) { while (!FNullEnt( (searchEnt = FIND_ENTITY_BY_STRING(searchEnt, "classname", "weaponbox")) )) { if (searchEnt->v.owner == pEdict) { edict_t *find = FIND_ENTITY_BY_STRING(NULL, "classname", str); edict_t *findNext; while (find != NULL && !FNullEnt(find)) { findNext = FIND_ENTITY_BY_STRING(find, "classname", str); if (find->v.owner == searchEnt) { if (!params[3]) { if (NotifyForRemove(owner, find, searchEnt)) { REMOVE_ENTITY(find); REMOVE_ENTITY(searchEnt); } } else { RemoveWeapon::SchedRemoval(params[3], pEdict, searchEnt, find); } return 1; } find = findNext; } } } } else { while (!FNullEnt((searchEnt=FIND_ENTITY_BY_STRING(searchEnt, "classname", "weapon_shield")))) { if (searchEnt->v.owner == pEdict) { if (!params[3]) { if (NotifyForRemove(owner, searchEnt, NULL)) { REMOVE_ENTITY(searchEnt); } } else { RemoveWeapon::SchedRemoval(params[3], pEdict, NULL, searchEnt); } return 1; } } } return 0; }
static cell AMX_NATIVE_CALL csdm_force_drop(AMX *amx, cell *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; } int len; char *str = MF_GetAmxString(amx, params[2], 0, &len); edict_t *pEdict = MF_GetPlayerEdict(params[1]); CBasePlayer *pPlayer = ( CBasePlayer* )pEdict->pvPrivateData; #if defined( WIN32 ) DropPlayerItem( pPlayer, DUMMY_VAL, str ); #else DropPlayerItem( pPlayer, str ); #endif if (!params[3]) { return -1; } edict_t *searchEnt = NULL; if (strcmp(str, "weapon_shield") != 0) { while (!FNullEnt( (searchEnt = FIND_ENTITY_BY_STRING(searchEnt, "classname", "weaponbox")) )) { if (searchEnt->v.owner == pEdict) { edict_t *find = FIND_ENTITY_BY_STRING(NULL, "classname", str); edict_t *findNext; while (find != NULL && !FNullEnt(find)) { findNext = FIND_ENTITY_BY_STRING(find, "classname", str); if (find->v.owner == searchEnt) { REMOVE_ENTITY(find); REMOVE_ENTITY(searchEnt); return 1; } find = findNext; } } } } else { while (!FNullEnt((searchEnt = FIND_ENTITY_BY_STRING(searchEnt, "classname", "weapon_shield")))) { if (searchEnt->v.owner == pEdict) { REMOVE_ENTITY(searchEnt); return 1; } } } return 0; }
// 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 > gpGlobals->maxClients || !MF_IsPlayerIngame(iIndex)) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid player %d", iIndex); return 0; } edict_t *pPlayer = INDEXENT2(iIndex); edict_t *pNewCamera; switch(iCameraType) { case CAMERA_NONE: SET_VIEW(pPlayer, pPlayer); if(plinfo[ENTINDEX(pPlayer)].pViewEnt) { REMOVE_ENTITY(plinfo[ENTINDEX(pPlayer)].pViewEnt); } if (plinfo[ENTINDEX(pPlayer)].iViewType != CAMERA_NONE) // Verify that they were originally in a modified view { g_CameraCount--; if (g_CameraCount < 0) g_CameraCount=0; if (g_CameraCount==0) // Reset the AddToFullPack pointer if there's no more cameras in use... g_pFunctionTable->pfnAddToFullPack=NULL; } plinfo[ENTINDEX(pPlayer)].iViewType = CAMERA_NONE; plinfo[ENTINDEX(pPlayer)].pViewEnt = NULL; return 1; break; case CAMERA_3RDPERSON: if(plinfo[ENTINDEX(pPlayer)].iViewType != CAMERA_NONE) { plinfo[ENTINDEX(pPlayer)].iViewType = CAMERA_3RDPERSON; return 1; } g_CameraCount++; g_pFunctionTable_Post->pfnAddToFullPack=AddToFullPack_Post; g_pFunctionTable_Post->pfnPlayerPostThink=PlayerPostThink_Post; 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; } g_CameraCount++; g_pFunctionTable_Post->pfnAddToFullPack=AddToFullPack_Post; g_pFunctionTable_Post->pfnPlayerPostThink=PlayerPostThink_Post; plinfo[ENTINDEX(pPlayer)].iViewType = CAMERA_UPLEFT; 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; } g_CameraCount++; g_pFunctionTable_Post->pfnAddToFullPack=AddToFullPack_Post; g_pFunctionTable_Post->pfnPlayerPostThink=PlayerPostThink_Post; 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; }