void CInfoCommentary :: GenericCyclerSpawn(char *szModel, Vector vecMin, Vector vecMax) { if (!szModel || !*szModel) { ALERT(at_error, "cycler at %.0f %.0f %0.f missing modelname", pev->origin.x, pev->origin.y, pev->origin.z ); REMOVE_ENTITY(ENT(pev)); return; } //ignored on subsequent calls char* szSoundFile = (char*) STRING(pev->message); if ( !FStringNull( pev->message ) && strlen( szSoundFile ) > 1 ) { PRECACHE_SOUND(szSoundFile); } //ignored on subsequent calls pev->classname = MAKE_STRING("info_commentary"); PRECACHE_MODEL( szModel ); SET_MODEL(ENT(pev), szModel); CCycler::Spawn( ); UTIL_SetSize(pev, vecMin, vecMax); }
void CCineBlood :: BloodGush ( void ) { Vector vecSplatDir; TraceResult tr; pev->nextthink = gpGlobals->time + 0.1; UTIL_MakeVectors(pev->angles); if ( pev->health-- < 0 ) REMOVE_ENTITY(ENT(pev)); // CHANGE_METHOD ( ENT(pev), em_think, SUB_Remove ); if ( RANDOM_FLOAT ( 0 , 1 ) < 0.7 )// larger chance of globs { UTIL_BloodDrips( pev->origin, UTIL_RandomBloodVector(), BLOOD_COLOR_RED, 10 ); } else// slim chance of geyser { UTIL_BloodStream( pev->origin, UTIL_RandomBloodVector(), BLOOD_COLOR_RED, RANDOM_LONG(50, 150) ); } if ( RANDOM_FLOAT ( 0, 1 ) < 0.75 ) { // decals the floor with blood. vecSplatDir = Vector ( 0 , 0 , -1 ); vecSplatDir = vecSplatDir + (RANDOM_FLOAT(-1,1) * 0.6 * gpGlobals->v_right) + (RANDOM_FLOAT(-1,1) * 0.6 * gpGlobals->v_forward);// randomize a bit UTIL_TraceLine( pev->origin + Vector ( 0, 0 , 64) , pev->origin + vecSplatDir * 256, ignore_monsters, ENT(pev), &tr); if ( tr.flFraction != 1.0 ) { // Decal with a bloodsplat UTIL_BloodDecalTrace( &tr, BLOOD_COLOR_RED ); } } }
//========================================================= //========================================================= void CFlockingFlyerFlock :: Spawn( ) { Precache( ); SpawnFlock(); REMOVE_ENTITY(ENT(pev)); // dump the spawn ent }
void HIDDEN GetAddressVtableByClassname(const char *szClassName, const int iOffset, bool bCreate) { void *vtable; if (bCreate) { edict_t *pObject = CREATE_ENTITY(); void *addr = GetFunctionEntity(szClassName); if (addr == NULL) { //can't create object. printf2(__FUNCTION__ ":: Not found export function of binaries. Presumably looks '__declspec(dllexport) void %s(entvars_t *pev)'", szClassName); REMOVE_ENTITY(pObject); return; } // call link to class GetClassPtr<BaseClass>(pev); reinterpret_cast<void (*)(entvars_t *)>(addr)(&pObject->v); vtable = *(void **)pObject->pvPrivateData; } else { VirtualTableRef *refsVtbl = GetVirtualTableRefAddr(szClassName); vtable = (void *)refsVtbl->originalAddress; } printf2(__FUNCTION__ "* ADDRESS VTABLE: %p | ADDRESS VIRTUAL FUNC: %p", OffsetToRebase((size_t)vtable), OffsetToRebase(*(((size_t **)&vtable)[ iOffset ]))); }
void CWorldItem::Spawn( void ) { CBaseEntity *pEntity = NULL; switch (m_iType) { case 44: // ITEM_BATTERY: pEntity = CBaseEntity::Create( "item_battery", pev->origin, pev->angles ); break; case 42: // ITEM_ANTIDOTE: pEntity = CBaseEntity::Create( "item_antidote", pev->origin, pev->angles ); break; case 43: // ITEM_SECURITY: pEntity = CBaseEntity::Create( "item_security", pev->origin, pev->angles ); break; case 45: // ITEM_SUIT: pEntity = CBaseEntity::Create( "item_suit", pev->origin, pev->angles ); break; } if (!pEntity) { ALERT( at_console, "unable to create world_item %d\n", m_iType ); } else { pEntity->pev->target = pev->target; pEntity->pev->targetname = pev->targetname; pEntity->pev->spawnflags = pev->spawnflags; } REMOVE_ENTITY(edict()); }
void CWorldItem::__MAKE_VHOOK(Spawn)() { CBaseEntity *pEntity = NULL; switch (m_iType) { case 41: // ITEM_HEALTHKIT break; case 42: // ITEM_ANTIDOTE pEntity = CBaseEntity::Create("item_antidote", pev->origin, pev->angles); break; case 43: // ITEM_SECURITY pEntity = CBaseEntity::Create("item_security", pev->origin, pev->angles); break; case 44: // ITEM_BATTERY pEntity = CBaseEntity::Create("item_battery", pev->origin, pev->angles); break; case 45: // ITEM_SUIT pEntity = CBaseEntity::Create("item_suit", pev->origin, pev->angles); break; } if (pEntity != NULL) { pEntity->pev->target = pev->target; pEntity->pev->targetname = pev->targetname; pEntity->pev->spawnflags = pev->spawnflags; } REMOVE_ENTITY(edict()); }
void NPC::Remove() { m_workNPC = false; if (vtable != null) { int **ivtable = (int **)vtable; if (vFcTraceAttack != null) { DWORD OldFlags; VirtualProtect(&ivtable[TraceAttackOffset], sizeof(int*), PAGE_READWRITE, &OldFlags); ivtable[TraceAttackOffset] = (int *)vFcTraceAttack; VirtualFree(HookTraceAttack, 0, MEM_RELEASE); } if (vFcTakeDamage != null) { DWORD OldFlags; VirtualProtect(&ivtable[TakeDamageOffset], sizeof(int*), PAGE_READWRITE, &OldFlags); ivtable[TakeDamageOffset] = (int *)vFcTakeDamage; VirtualFree(HookTakeDamage, 0, MEM_RELEASE); } } if (pev != null && !FNullEnt(GetEntity()) && pvData == GetEntity()->pvPrivateData) { SetEntityAction(GetIndex(), -1, -1); REMOVE_ENTITY(GetEntity()); } }
//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); }
/* <184158> ../cstrike/dlls/subs.cpp:357 */ void CBaseDelay::DelayThink(void) { CBaseEntity *pActivator = NULL; if (pev->owner) pActivator = CBaseEntity::Instance(pev->owner); SUB_UseTargets(pActivator, (USE_TYPE)pev->button, 0.0f); REMOVE_ENTITY(ENT(pev)); }
void CBaseDelay::DelayThink( void ) { CBaseEntity *pActivator = NULL; // The use type is cached (and stashed) in pev->button //LRC - now using m_hActivator. SUB_UseTargets( m_hActivator, (USE_TYPE)pev->button, 0 ); REMOVE_ENTITY(ENT(pev)); }
/* <183f38> ../cstrike/dlls/subs.cpp:120 */ void CBaseEntity::SUB_Remove(void) { UpdateOnRemove(); if (pev->health > 0) { pev->health = 0; ALERT(at_aiconsole, "SUB_Remove called on entity with health > 0\n"); } REMOVE_ENTITY(ENT(pev)); }
void RemoveAllNodeEntity() { CEntity *pFoundNode = UTIL_FindEntityByClassname(NULL, "info_node"); if (pFoundNode == NULL) return; // No node entities do { CEntity *pNextNode = UTIL_FindEntityByClassname(pFoundNode, "info_node"); REMOVE_ENTITY(pFoundNode->edict()); pFoundNode = pNextNode; } while (pFoundNode != NULL); }
static cell AMX_NATIVE_CALL remove_entity(AMX *amx, cell *params) { int id = params[1]; edict_t *pEnt = INDEXENT2(id); if (FNullEnt(pEnt)) return 0; REMOVE_ENTITY(pEnt); return 1; }
// Convenient way to delay removing oneself void CBaseEntity :: SUB_Remove( void ) { UpdateOnRemove(); if (pev->health > 0) { // this situation can screw up monsters who can't tell their entity pointers are invalid. pev->health = 0; ALERT( at_aiconsole, "SUB_Remove called on entity with health > 0\n"); } REMOVE_ENTITY(ENT(pev)); }
void CBaseDelay::DelayThink( void ) { CBaseEntity *pActivator = NULL; if ( pev->owner != NULL ) // A player activated this on delay { pActivator = CBaseEntity::Instance( pev->owner ); } // The use type is cached (and stashed) in pev->button SUB_UseTargets( pActivator, (USE_TYPE)pev->button, 0 ); REMOVE_ENTITY(ENT(pev)); }
void CEnvGlobal::Spawn( void ) { if ( !m_globalstate ) { REMOVE_ENTITY( ENT(pev) ); return; } if ( FBitSet( pev->spawnflags, SF_GLOBAL_SET ) ) { if ( !gGlobalState.EntityInTable( m_globalstate ) ) gGlobalState.EntityAdd( m_globalstate, gpGlobals->mapname, (GLOBALESTATE)m_initialstate ); } }
void CLight :: Spawn( void ) { if( FStringNull( pev->targetname )) { // inert light REMOVE_ENTITY(ENT( pev )); return; } if (FBitSet(pev->spawnflags,SF_LIGHT_START_OFF)) m_iState = STATE_OFF; else m_iState = STATE_ON; SetCorrectStyle(); }
cell AMX_NATIVE_CALL Rage::GetFunctionFromClass(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; char* class_name = g_fn_GetAmxString(amx,params[2],0,&len); static char class_name_cp[50]; strncpy(class_name_cp,class_name,49); edict_t *entity = CREATE_ENTITY(); CALL_GAME_ENTITY(PLID,class_name,&entity->v); if(!entity->pvPrivateData) { REMOVE_ENTITY(entity); MF_LogError(amx, AMX_ERR_NATIVE,"Unable to create an entity of class '%s'",class_name); return -1; } int ret = virtual_function->create_get_id(entity->pvPrivateData,class_name_cp); REMOVE_ENTITY(entity); return ret; }
void CEnvGlobal::__MAKE_VHOOK(Spawn)() { if (!m_globalstate) { REMOVE_ENTITY(ENT(pev)); return; } if (pev->spawnflags & SF_GLOBAL_SET) { if (!gGlobalState.EntityInTable(m_globalstate)) { gGlobalState.EntityAdd(m_globalstate, gpGlobals->mapname, (GLOBALESTATE)m_initialstate); } } }
void UTIL_PrecacheOther( const char *szClassname ) { edict_t *pent; pent = CREATE_NAMED_ENTITY( MAKE_STRING( szClassname ) ); if ( FNullEnt( pent ) ) { ALERT ( at_console, "NULL Ent in UTIL_PrecacheOther\n" ); return; } CBaseEntity *pEntity = CBaseEntity::Instance (VARS( pent )); if (pEntity) pEntity->Precache( ); REMOVE_ENTITY(pent); }
void PlayerPostThink_Post(edict_t *pEntity) { if(plinfo[ENTINDEX(pEntity)].pViewEnt) { edict_t *pCamEnt = plinfo[ENTINDEX(pEntity)].pViewEnt; MAKE_VECTORS(pEntity->v.v_angle + pEntity->v.punchangle); Vector vecSrc = pEntity->v.origin + pEntity->v.view_ofs; Vector vecAiming = gpGlobals->v_forward; TraceResult tr; switch(plinfo[ENTINDEX(pEntity)].iViewType) { case CAMERA_3RDPERSON: TRACE_LINE(vecSrc, vecSrc - (vecAiming * 128), ignore_monsters, ENT(pEntity), &tr); SET_VIEW(pEntity, pCamEnt); pCamEnt->v.origin = tr.vecEndPos; pCamEnt->v.angles = pEntity->v.v_angle; break; case CAMERA_UPLEFT: TRACE_LINE(vecSrc, vecSrc - ((vecAiming * 32) - ((gpGlobals->v_right * 15) + (gpGlobals->v_up * 15))), ignore_monsters, ENT(pEntity), &tr); SET_VIEW(pEntity, pCamEnt); pCamEnt->v.origin = tr.vecEndPos; pCamEnt->v.angles = pEntity->v.v_angle; break; case CAMERA_TOPDOWN: TRACE_LINE(vecSrc, vecSrc + Vector(0,0,2048), dont_ignore_monsters, ENT(pEntity), &tr); SET_VIEW(pEntity, pCamEnt); pCamEnt->v.origin = tr.vecEndPos; pCamEnt->v.origin.z -= 40; pCamEnt->v.angles = Vector(90,pEntity->v.v_angle.y,0); break; default: SET_VIEW(pEntity, pEntity); REMOVE_ENTITY(plinfo[ENTINDEX(pEntity)].pViewEnt); plinfo[ENTINDEX(pEntity)].iViewType = CAMERA_NONE; plinfo[ENTINDEX(pEntity)].pViewEnt = NULL; break; } } if (PlayerPostThinkForward != -1) { if (MF_ExecuteForward(PlayerPostThinkForward, (cell)ENTINDEX(pEntity))) RETURN_META(MRES_SUPERCEDE); } RETURN_META(MRES_IGNORED); }
void CCycler :: GenericCyclerSpawn(char *szModel, Vector vecMin, Vector vecMax) { if (!szModel || !*szModel) { ALERT(at_error, "cycler at %.0f %.0f %0.f missing modelname", pev->origin.x, pev->origin.y, pev->origin.z ); REMOVE_ENTITY(ENT(pev)); return; } pev->classname = MAKE_STRING("cycler"); PRECACHE_MODEL( szModel ); SET_MODEL(ENT(pev), szModel); CCycler::Spawn( ); UTIL_SetSize(pev, vecMin, vecMax); }
static cell AMX_NATIVE_CALL ns_spawn_ps(AMX *amx, cell *params) { if (params[1]==0) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid particle system handle"); return 0; } edict_t *Ent=reinterpret_cast<edict_t *>(params[1]); MDLL_Spawn(Ent); if (!Ent->free) { REMOVE_ENTITY(Ent); } return ParticleMan.Add(STRING(Ent->v.targetname),0); }
//========================================================= // Spawn //========================================================= void CSoldier :: Spawn( void ) { if( !g_pGameRules->FAllowMonsters( )) { REMOVE_ENTITY( ENT(pev) ); return; } Precache( ); SET_MODEL(ENT(pev), "models/soldier.mdl"); UTIL_SetSize( pev, Vector( -16, -16, -24 ), Vector( 16, 16, 40 )); pev->solid = SOLID_SLIDEBOX; pev->movetype = MOVETYPE_STEP; pev->health = 30; WalkMonsterInit (); }
//========================================================= // Spawn //========================================================= void CShalrath :: Spawn( void ) { if( !g_pGameRules->FAllowMonsters( ) || !g_registered ) { REMOVE_ENTITY( ENT(pev) ); return; } Precache( ); SET_MODEL(ENT(pev), "models/shalrath.mdl"); UTIL_SetSize( pev, Vector( -32, -32, -24 ), Vector( 32, 32, 64 )); pev->solid = SOLID_SLIDEBOX; pev->movetype = MOVETYPE_STEP; pev->health = 400; WalkMonsterInit(); }
void CLight :: Spawn( void ) { if (FStringNull(pev->targetname)) { // inert light REMOVE_ENTITY(ENT(pev)); return; } if (m_iStyle >= 32) { // CHANGE_METHOD(ENT(pev), em_use, light_use); if (FBitSet(pev->spawnflags, SF_LIGHT_START_OFF)) LIGHT_STYLE(m_iStyle, "a"); else if (m_iszPattern) LIGHT_STYLE(m_iStyle, (char *)STRING( m_iszPattern )); else LIGHT_STYLE(m_iStyle, "m"); } }
//========================================================= // Spawn //========================================================= void COgre :: Spawn( void ) { if( !g_pGameRules->FAllowMonsters( )) { REMOVE_ENTITY( ENT(pev) ); return; } Precache( ); SET_MODEL(ENT(pev), "models/ogre.mdl"); // FIXME: ogre with large hull failed to following by path_corner on e1m2 :-( UTIL_SetSize( pev, Vector( -16, -16, -24 ), Vector( 16, 16, 40 )); pev->solid = SOLID_SLIDEBOX; pev->movetype = MOVETYPE_STEP; pev->health = 200; WalkMonsterInit (); }
// UNDONE: These won't get sent to joining players in multi-player void CDecal :: Spawn( void ) { if ( pev->skin < 0 || (gpGlobals->deathmatch && FBitSet( pev->spawnflags, SF_DECAL_NOTINDEATHMATCH )) ) { REMOVE_ENTITY(ENT(pev)); return; } if ( FStringNull ( pev->targetname ) ) { SetThink( StaticDecal ); // if there's no targetname, the decal will spray itself on as soon as the world is done spawning. pev->nextthink = gpGlobals->time; } else { // if there IS a targetname, the decal sprays itself on when it is triggered. SetThink ( SUB_DoNothing ); SetUse(TriggerDecal); } }
void CWorldItem::Spawn(void) { CBaseEntity *pEntity = NULL; switch (m_iType) { case 44: pEntity = CBaseEntity::Create("item_battery", pev->origin, pev->angles); break; case 42: pEntity = CBaseEntity::Create("item_antidote", pev->origin, pev->angles); break; case 43: pEntity = CBaseEntity::Create("item_security", pev->origin, pev->angles); break; case 45: pEntity = CBaseEntity::Create("item_suit", pev->origin, pev->angles); break; } if (pEntity) { pEntity->pev->target = pev->target; pEntity->pev->targetname = pev->targetname; pEntity->pev->spawnflags = pev->spawnflags; } REMOVE_ENTITY(edict()); }
void CLight::__MAKE_VHOOK(Spawn)() { // inert light if (FStringNull(pev->targetname)) { REMOVE_ENTITY(ENT(pev)); return; } m_iStartedOff = (pev->spawnflags & SF_LIGHT_START_OFF) != 0; if (m_iStyle >= 32) { if (pev->spawnflags & SF_LIGHT_START_OFF) LIGHT_STYLE(m_iStyle, "a"); else if (m_iszPattern) LIGHT_STYLE(m_iStyle, (char *)STRING(m_iszPattern)); else LIGHT_STYLE(m_iStyle, "m"); } }