Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
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;
}
Ejemplo n.º 4
0
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);
			}
		}
	}
}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
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);
}
Ejemplo n.º 7
0
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;
}
Ejemplo n.º 8
0
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 );
}
Ejemplo n.º 9
0
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;
}
Ejemplo n.º 10
0
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);
}
Ejemplo n.º 11
0
// 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;
}
Ejemplo n.º 12
0
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;
}
Ejemplo n.º 13
0
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;
}
Ejemplo n.º 14
0
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;
}
Ejemplo n.º 15
0
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;
}
Ejemplo n.º 16
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;
}