void NPC_RemoveBody( gentity_t *self ) { CorpsePhysics( self ); self->nextthink = level.time + FRAMETIME; if ( self->NPC->nextBStateThink <= level.time ) { trap->ICARUS_MaintainTaskManager(self->s.number); } self->NPC->nextBStateThink = level.time + FRAMETIME; if ( self->message ) {//I still have a key return; } // I don't consider this a hack, it's creative coding . . . // I agree, very creative... need something like this for ATST and GALAKMECH too! if (self->client->NPC_class == CLASS_MARK1) { Mark1_dying( self ); } // Since these blow up, remove the bounding box. if ( self->client->NPC_class == CLASS_REMOTE || self->client->NPC_class == CLASS_SENTRY || self->client->NPC_class == CLASS_PROBE || self->client->NPC_class == CLASS_INTERROGATOR || self->client->NPC_class == CLASS_PROBE || self->client->NPC_class == CLASS_MARK2 ) { //if ( !self->taskManager || !self->taskManager->IsRunning() ) if (!trap->ICARUS_IsRunning(self->s.number)) { if ( !self->activator || !self->activator->client || !(self->activator->client->ps.eFlags2&EF2_HELD_BY_MONSTER) ) {//not being held by a Rancor G_FreeEntity( self ); } } return; } //FIXME: don't ever inflate back up? self->r.maxs.z = self->client->renderInfo.eyePoint.z - self->r.currentOrigin.z + 4; if ( self->r.maxs.z < -8 ) { self->r.maxs.z = -8; } if ( self->client->NPC_class == CLASS_GALAKMECH ) {//never disappears return; } if ( self->NPC && self->NPC->timeOfDeath <= level.time ) { self->NPC->timeOfDeath = level.time + 1000; // Only do all of this nonsense for Scav boys ( and girls ) /// if ( self->client->playerTeam == NPCTEAM_SCAVENGERS || self->client->playerTeam == NPCTEAM_KLINGON // || self->client->playerTeam == NPCTEAM_HIROGEN || self->client->playerTeam == NPCTEAM_MALON ) // should I check NPC_class here instead of TEAM ? - dmv if( self->client->playerTeam == NPCTEAM_ENEMY || self->client->NPC_class == CLASS_PROTOCOL ) { self->nextthink = level.time + FRAMETIME; // try back in a second /* if ( DistanceSquared( g_entities[0].r.currentOrigin, self->r.currentOrigin ) <= REMOVE_DISTANCE_SQR ) { return; } if ( (InFOV( self, &g_entities[0], 110, 90 )) ) // generous FOV check { if ( (NPC_ClearLOS2( &g_entities[0], self->r.currentOrigin )) ) { return; } } */ //Don't care about this for MP I guess. } //FIXME: there are some conditions - such as heavy combat - in which we want // to remove the bodies... but in other cases it's just weird, like // when they're right behind you in a closed room and when they've been // placed as dead NPCs by a designer... // For now we just assume that a corpse with no enemy was // placed in the map as a corpse if ( self->enemy ) { //if ( !self->taskManager || !self->taskManager->IsRunning() ) if (!trap->ICARUS_IsRunning(self->s.number)) { if ( !self->activator || !self->activator->client || !(self->activator->client->ps.eFlags2&EF2_HELD_BY_MONSTER) ) {//not being held by a Rancor if ( self->client && self->client->ps.saberEntityNum > 0 && self->client->ps.saberEntityNum < ENTITYNUM_WORLD ) { gentity_t *saberent = &g_entities[self->client->ps.saberEntityNum]; if ( saberent ) { G_FreeEntity( saberent ); } } G_FreeEntity( self ); } } } } }
void NPC_RemoveBody( gentity_t *self ) { CorpsePhysics( self ); self->nextthink = level.time + level.frameTime; if ( self->NPC->nextBStateThink <= level.time ) { trap_ICARUS_MaintainTaskManager(self->s.number); } self->NPC->nextBStateThink = level.time + level.frameTime; if ( self->message ) {//I still have a key return; } // I don't consider this a hack, it's creative coding . . . // I agree, very creative... need something like this for ATST and GALAKMECH too! if (self->client->NPC_class == CLASS_MARK1) { Mark1_dying( self ); } // Since these blow up, remove the bounding box. if ( self->client->NPC_class == CLASS_REMOTE || self->client->NPC_class == CLASS_SENTRY || self->client->NPC_class == CLASS_PROBE || self->client->NPC_class == CLASS_INTERROGATOR || self->client->NPC_class == CLASS_PROBE || self->client->NPC_class == CLASS_MARK2 ) { //if ( !self->taskManager || !self->taskManager->IsRunning() ) if (!trap_ICARUS_IsRunning(self->s.number)) { if ( !self->activator || !self->activator->client || !(self->activator->client->ps.eFlags2&EF2_HELD_BY_MONSTER) ) {//not being held by a Rancor G_FreeEntity( self ); } } return; } //FIXME: don't ever inflate back up? self->r.maxs[2] = self->client->renderInfo.eyePoint[2] - self->r.currentOrigin[2] + 4; if ( self->r.maxs[2] < -8 ) { self->r.maxs[2] = -8; } if ( self->client->NPC_class == CLASS_GALAKMECH ) {//never disappears return; } if ( self->NPC && self->NPC->timeOfDeath <= level.time ) { self->NPC->timeOfDeath = level.time + 1000; // Only do all of this nonsense for Scav boys ( and girls ) if( self->client->playerTeam == NPCTEAM_ENEMY || self->client->NPC_class == CLASS_PROTOCOL ) { self->nextthink = level.time + level.frameTime; // try back in a second } //FIXME: there are some conditions - such as heavy combat - in which we want // to remove the bodies... but in other cases it's just weird, like // when they're right behind you in a closed room and when they've been // placed as dead NPCs by a designer... // For now we just assume that a corpse with no enemy was // placed in the map as a corpse if ( self->enemy ) { //if ( !self->taskManager || !self->taskManager->IsRunning() ) if (!trap_ICARUS_IsRunning(self->s.number)) { if ( !self->activator || !self->activator->client || !(self->activator->client->ps.eFlags2&EF2_HELD_BY_MONSTER) ) {//not being held by a Rancor if ( self->client && self->client->ps.saberEntityNum > 0 && self->client->ps.saberEntityNum < ENTITYNUM_WORLD ) { gentity_t *saberent = &g_entities[self->client->ps.saberEntityNum]; if ( saberent ) { G_FreeEntity( saberent ); } } G_FreeEntity( self ); } } } } }