void CMultiSource::Register(void) { edict_t *pentTarget = NULL; m_iTotal = 0; memset( m_rgEntities, 0, MS_MAX_TARGETS * sizeof(EHANDLE) ); SetThink(&CBaseEntity::SUB_DoNothing); // search for all entities which target this multisource (pev->targetname) pentTarget = FIND_ENTITY_BY_STRING(NULL, "target", STRING(pev->targetname)); while (!FNullEnt(pentTarget) && (m_iTotal < MS_MAX_TARGETS)) { CBaseEntity *pTarget = CBaseEntity::Instance(pentTarget); if ( pTarget ) m_rgEntities[m_iTotal++] = pTarget; pentTarget = FIND_ENTITY_BY_STRING( pentTarget, "target", STRING(pev->targetname)); } pentTarget = FIND_ENTITY_BY_STRING(NULL, "classname", "multi_manager"); while (!FNullEnt(pentTarget) && (m_iTotal < MS_MAX_TARGETS)) { CBaseEntity *pTarget = CBaseEntity::Instance(pentTarget); if ( pTarget && pTarget->HasTarget(pev->targetname) ) m_rgEntities[m_iTotal++] = pTarget; pentTarget = FIND_ENTITY_BY_STRING( pentTarget, "classname", "multi_manager" ); } pev->spawnflags &= ~SF_MULTI_INIT; }
static cell AMX_NATIVE_CALL find_ent_by_model(AMX *amx, cell *params) { int iStart = params[1]; int iLength, iLength2; char *szClass = MF_GetAmxString(amx, params[2], 0, &iLength); char *szModel = MF_GetAmxString(amx, params[3], 1, &iLength2); edict_t *pStart; if (iStart == -1) { pStart = NULL; } else { if (!is_ent_valid(iStart)) pStart = NULL; else pStart = INDEXENT2(iStart); } edict_t *pEdict = FIND_ENTITY_BY_STRING(pStart, "classname", szClass); const char *check; while (pEdict && !FNullEnt(pEdict)) { check = STRING(pEdict->v.model); if (!check || strcmp(check, szModel)) pEdict = FIND_ENTITY_BY_STRING(pEdict, "classname", szClass); else return ENTINDEX(pEdict); } return 0; }
void CMultiSource::Register() { m_iTotal = 0; Q_memset(m_rgEntities, 0, MS_MAX_TARGETS * sizeof(EHANDLE)); SetThink(&CMultiSource::SUB_DoNothing); // search for all entities which target this multisource (pev->targetname) #ifdef REGAMEDLL_FIXES CBaseEntity *pTarget = nullptr; while (m_iTotal < MS_MAX_TARGETS && (pTarget = UTIL_FindEntityByString(pTarget, "target", STRING(pev->targetname)))) { m_rgEntities[m_iTotal++] = pTarget; } pTarget = nullptr; while (m_iTotal < MS_MAX_TARGETS && (pTarget = UTIL_FindEntityByClassname(pTarget, "multi_manager"))) { if (pTarget->HasTarget(pev->targetname)) { m_rgEntities[m_iTotal++] = pTarget; } } #else edict_t *pentTarget = FIND_ENTITY_BY_STRING(NULL, "target", STRING(pev->targetname)); while (!FNullEnt(pentTarget) && m_iTotal < MS_MAX_TARGETS) { CBaseEntity *pTarget = CBaseEntity::Instance(pentTarget); if (pTarget != NULL) { m_rgEntities[m_iTotal++] = pTarget; } pentTarget = FIND_ENTITY_BY_STRING(pentTarget, "target", STRING(pev->targetname)); } pentTarget = FIND_ENTITY_BY_STRING(NULL, "classname", "multi_manager"); while (!FNullEnt(pentTarget) && m_iTotal < MS_MAX_TARGETS) { CBaseEntity *pTarget = CBaseEntity::Instance(pentTarget); if (pTarget != NULL && pTarget->HasTarget(pev->targetname)) { m_rgEntities[m_iTotal++] = pTarget; } pentTarget = FIND_ENTITY_BY_STRING(pentTarget, "classname", "multi_manager"); } #endif pev->spawnflags &= ~SF_MULTI_INIT; }
void CMomentaryRotButton::UpdateAllButtons(float value, int start) { // Update all rot buttons attached to the same target edict_t *pentTarget = NULL; while (true) { pentTarget = FIND_ENTITY_BY_STRING(pentTarget, "target", STRING(pev->target)); if (FNullEnt(pentTarget)) break; if (FClassnameIs(VARS(pentTarget), "momentary_rot_button")) { CMomentaryRotButton *pEntity = CMomentaryRotButton::Instance(pentTarget); if (pEntity != NULL) { if (start) pEntity->UpdateSelf(value); else pEntity->UpdateSelfReturn(value); } } } }
static cell AMX_NATIVE_CALL find_ent_by_owner(AMX *amx, cell *params) // native find_ent_by_owner(start_from_ent, classname[], owner_index); = 3 params { int iEnt = params[1]; int oEnt = params[3]; // Check index to start searching at, 0 must be possible for iEnt. CHECK_ENTITY_SIMPLE(oEnt); edict_t *pEnt = INDEXENT2(iEnt); edict_t *entOwner = INDEXENT2(oEnt); //optional fourth parameter is for jghg2 compatibility const char* sCategory = NULL; switch(params[4]){ case 1: sCategory = "target"; break; case 2: sCategory = "targetname"; break; default: sCategory = "classname"; } // No need to check if there is a real ent where entOwner points at since we don't access it anyway. int len; char* classname = MF_GetAmxString(amx, params[2], 0, &len); while (true) { pEnt = FIND_ENTITY_BY_STRING(pEnt, sCategory, classname); if (FNullEnt(pEnt)) // break and return 0 if bad break; else if (pEnt->v.owner == entOwner) // compare pointers return ENTINDEX(pEnt); } // If it comes here, the while loop ended because an ent failed (FNullEnt() == true) return 0; }
void CGrenade::SG_Detonate(void) { TraceResult tr; Vector vecSpot = pev->origin + Vector(0, 0, 8); UTIL_TraceLine(vecSpot, vecSpot + Vector(0, 0, -40), ignore_monsters, ENT(pev), &tr); EMIT_SOUND(ENT(pev), CHAN_WEAPON, "weapons/sg_explode.wav", VOL_NORM, ATTN_NORM); edict_t *pentFind = NULL; while ((pentFind = FIND_ENTITY_BY_STRING(pentFind, "classname", "grenade")) != NULL) { if (FNullEnt(pentFind)) break; CBaseEntity *pEnt = CBaseEntity::Instance(pentFind); if (pEnt) { float fDistance = (pEnt->pev->origin - pev->origin).Length(); if (fDistance != 0 && fDistance <= 250 && gpGlobals->time < pEnt->pev->dmgtime) m_bLightSmoke = true; } } m_bDetonated = true; PLAYBACK_EVENT_FULL(0, NULL, m_usEvent, 0, pev->origin, (float *)&g_vecZero, 0, 0, 0, 1, m_bLightSmoke, FALSE); m_vSmokeDetonate = pev->origin; pev->velocity = Vector(RANDOM_FLOAT(-175.0, 175.0), RANDOM_FLOAT(-175.0, 175.0), RANDOM_FLOAT(250.0, 350.0)); pev->nextthink = gpGlobals->time + 0.1; SetThink(&CGrenade::SG_Smoke); }
edict_t *FindEntityByString(edict_t *pentStart, const char *szKeyword, const char *szValue) { edict_t *pentEntity; pentEntity = FIND_ENTITY_BY_STRING(pentStart, szKeyword, szValue); if(!FNullEnt(pentEntity)) return pentEntity; return NULL; }
void StartFrame() { edict_t* ent = NULL; while( !FNullEnt( ent = FIND_ENTITY_BY_STRING( ent, "classname", "player" ) ) ) { if( esfmodels[ENTINDEX(ent)-1].bSet ) { ent->v.modelindex = MODEL_INDEX( esfmodels[ENTINDEX(ent)-1].szModel ); ent->v.model = MAKE_STRING( esfmodels[ENTINDEX(ent)-1].szModel ); } } RETURN_META( MRES_HANDLED ); }
edict_t *UTIL_FindEntityByString(edict_t *Start, const char *Keyword, const char *Value) { edict_t *Entity; Entity=FIND_ENTITY_BY_STRING(Start, Keyword, Value); if(!FNullEnt(Entity)) { return Entity; } return NULL; }
static cell AMX_NATIVE_CALL find_ent_by_class(AMX *amx, cell *params) /* 3 param */ { edict_t *pEnt = INDEXENT2(params[1]); int len; char* sValue = MF_GetAmxString(amx, params[2], 0, &len); pEnt = FIND_ENTITY_BY_STRING(pEnt, "classname", sValue); if (FNullEnt(pEnt)) return 0; return ENTINDEX(pEnt); }
// Find the matching global entity. Spit out an error if the designer made entities of // different classes with the same global name CBaseEntity *FindGlobalEntity(string_t classname, string_t globalname) { edict_t * pent = FIND_ENTITY_BY_STRING(NULL, "globalname", STRING(globalname)); CBaseEntity *pReturn = CBaseEntity::Instance(pent); if(pReturn) { if(!FClassnameIs(pReturn->pev, STRING(classname))) { ALERT(at_console, "Global entity found %s, wrong class %s\n", STRING(globalname), STRING(pReturn->pev->classname)); pReturn = NULL; } } return pReturn; }
CBaseEntity *UTIL_FindEntityByString( CBaseEntity *pStartEntity, const char *szKeyword, const char *szValue ) { edict_t *pentEntity; if (pStartEntity) pentEntity = pStartEntity->edict(); else pentEntity = NULL; pentEntity = FIND_ENTITY_BY_STRING( pentEntity, szKeyword, szValue ); if (!FNullEnt(pentEntity)) return CBaseEntity::Instance(pentEntity); return NULL; }
void CGrenade::SG_Detonate( void ) { TraceResult tr; Vector vecSpot; vecSpot = pev->origin + Vector( 0 , 0 , 8 ); UTIL_TraceLine( vecSpot, vecSpot + Vector( 0, 0, -40 ), ignore_monsters, ENT( pev ), &tr ); // TODO: Adds support for bots. // TheBots->OnEvent( EVENT_SMOKE_GRENADE_EXPLODE, CBaseEntity::Instance( pev->owner ), NULL ); // TheBots->AddGrenade( 9, this ); edict_t* pEntity = NULL; while( ( pEntity = FIND_ENTITY_BY_STRING( pEntity, "classname", "grenade" ) ) != NULL ) { if( !FNullEnt( pEntity ) ) { CBaseEntity* pGrenade = CBaseEntity::Instance( pEntity ); if( pGrenade && ( pGrenade->pev->origin - pev->origin ).Length() <= 250.0 && pGrenade->pev->dmgtime > gpGlobals->time ) { m_bSGMulti = true; } } } m_bSGDetonated = true; PLAYBACK_EVENT_FULL( 0, NULL, m_usEvent, 0.0, pev->origin, (float*)&g_vecZero, 0.0, 0.0, 0, 1, m_bSGMulti, 0 ); m_SGExplosionPos = pev->origin; pev->velocity.x = RANDOM_FLOAT( -175, 175 ); pev->velocity.y = RANDOM_FLOAT( -175, 175 ); pev->velocity.z = RANDOM_FLOAT( 250, 350 ); SetThink( &CGrenade::SG_Smoke ); pev->nextthink = gpGlobals->time + 0.1; }
static cell AMX_NATIVE_CALL get_map_objectives(AMX *amx, cell *params) { int flags = 0; if (!FNullEnt(FIND_ENTITY_BY_STRING(NULL, "classname", "func_bomb_target")) || !FNullEnt(FIND_ENTITY_BY_STRING(NULL, "classname", "info_bomb_target"))) flags |= MapObjective_Bomb; if (!FNullEnt(FIND_ENTITY_BY_STRING(NULL, "classname", "func_hostage_rescue")) || !FNullEnt(FIND_ENTITY_BY_STRING(NULL, "classname", "info_hostage_rescue")) || !FNullEnt(FIND_ENTITY_BY_STRING(NULL, "classname", "hostage_entity"))) // there are maps with only this and using team spawn as rescue zone. flags |= MapObjective_Hostage; if (!FNullEnt(FIND_ENTITY_BY_STRING(NULL, "classname", "func_vip_safetyzone"))) flags |= MapObjective_Vip; if (!FNullEnt(FIND_ENTITY_BY_STRING(NULL, "classname", "func_escapezone"))) flags |= MapObjective_Escape; return flags; }
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; }