void NPC_Use( gentity_t *self, gentity_t *other, gentity_t *activator ) { if (self->client->ps.pm_type == PM_DEAD) {//or just remove ->pain in player_die? return; } SaveNPCGlobals(); SetNPCGlobals( self ); if(self->client && self->NPC) { if ( Jedi_WaitingAmbush( NPC ) ) { Jedi_Ambush( NPC ); } //Run any use instructions if ( activator && activator->s.number == 0 && self->client->NPC_class == CLASS_GONK ) { // must be using the gonk, so attempt to give battery power. // NOTE: this will steal up to MAX_BATTERIES for the activator, leaving the residual on the gonk for potential later use. Add_Batteries( activator, &self->client->ps.batteryCharge ); } // Not using MEDICs anymore /* if ( self->NPC->behaviorState == BS_MEDIC_HIDE && activator->client ) {//Heal me NOW, dammit! if ( activator->health < activator->max_health ) {//person needs help if ( self->NPC->eventualGoal != activator ) {//not my current patient already NPC_TakePatient( activator ); G_ActivateBehavior( self, BSET_USE ); } } else if ( !self->enemy && activator->s.number == 0 && !gi.VoiceVolume[self->s.number] && !(self->NPC->scriptFlags&SCF_NO_RESPONSE) ) {//I don't have an enemy and I'm not talking and I was used by the player NPC_UseResponse( self, other, qfalse ); } } */ // else if ( self->behaviorSet[BSET_USE] ) if ( self->behaviorSet[BSET_USE] ) { NPC_UseResponse( self, other, qtrue ); } // else if ( isMedic( self ) ) // {//Heal me NOW, dammit! // NPC_TakePatient( activator ); // } else if ( !self->enemy && activator->s.number == 0 && !gi.VoiceVolume[self->s.number] && !(self->NPC->scriptFlags&SCF_NO_RESPONSE) ) {//I don't have an enemy and I'm not talking and I was used by the player NPC_UseResponse( self, other, qfalse ); } } RestoreNPCGlobals(); }
void NPC_Use( gentity_t *self, gentity_t *other, gentity_t *activator ) { if (self->client->ps.pm_type == PM_DEAD) {//or just remove ->pain in player_die? return; } SaveNPCGlobals(); SetNPCGlobals( self ); if(self->client && self->NPC) {//Run any use instructions if ( self->NPC->behaviorState == BS_MEDIC_HIDE && activator->client ) {//Heal me NOW, dammit! if ( activator->health < activator->max_health ) {//person needs help if ( self->NPC->eventualGoal != activator ) {//not my current patient already NPC_TakePatient( activator ); if ( self->behaviorSet[BSET_USE] ) { G_ActivateBehavior( self, BSET_USE ); } } } else if ( !self->enemy && activator->s.number == 0 && !gi.S_Override[self->s.number] && !(self->NPC->scriptFlags&SCF_NO_RESPONSE) ) {//I don't have an enemy and I'm not talking and I was used by the player NPC_UseResponse( self, other, qfalse ); } } else if ( self->behaviorSet[BSET_USE] ) { NPC_UseResponse( self, other, qtrue ); } else if ( isMedic( self ) ) {//Heal me NOW, dammit! NPC_TakePatient( activator ); } else if ( !self->enemy && activator->s.number == 0 && !gi.S_Override[self->s.number] && !(self->NPC->scriptFlags&SCF_NO_RESPONSE) ) {//I don't have an enemy and I'm not talking and I was used by the player NPC_UseResponse( self, other, qfalse ); } } RestoreNPCGlobals(); }
void NPC_Use( gentity_t *self, gentity_t *other, gentity_t *activator ) { if (self->client->ps.pm_type == PM_DEAD) {//or just remove ->pain in player_die? return; } SaveNPCGlobals(); SetNPCGlobals( self ); if(self->client && self->NPC) { // If this is a vehicle, let the other guy board it. Added 12/14/02 by AReis. if ( self->client->NPC_class == CLASS_VEHICLE ) { Vehicle_t *pVeh = self->m_pVehicle; if ( pVeh && pVeh->m_pVehicleInfo && other && other->client ) {//safety //if I used myself, eject everyone on me if ( other == self ) { pVeh->m_pVehicleInfo->EjectAll( pVeh ); } // If other is already riding this vehicle (self), eject him. else if ( other->owner == self ) { pVeh->m_pVehicleInfo->Eject( pVeh, other, qfalse ); } // Otherwise board this vehicle. else { pVeh->m_pVehicleInfo->Board( pVeh, other ); } } } else if ( Jedi_WaitingAmbush( NPC ) ) { Jedi_Ambush( NPC ); } //Run any use instructions if ( activator && activator->s.number == 0 && self->client->NPC_class == CLASS_GONK ) { // must be using the gonk, so attempt to give battery power. // NOTE: this will steal up to MAX_BATTERIES for the activator, leaving the residual on the gonk for potential later use. Add_Batteries( activator, &self->client->ps.batteryCharge ); } // Not using MEDICs anymore /* if ( self->NPC->behaviorState == BS_MEDIC_HIDE && activator->client ) {//Heal me NOW, dammit! if ( activator->health < activator->max_health ) {//person needs help if ( self->NPC->eventualGoal != activator ) {//not my current patient already NPC_TakePatient( activator ); G_ActivateBehavior( self, BSET_USE ); } } else if ( !self->enemy && activator->s.number == 0 && !gi.VoiceVolume[self->s.number] && !(self->NPC->scriptFlags&SCF_NO_RESPONSE) ) {//I don't have an enemy and I'm not talking and I was used by the player NPC_UseResponse( self, other, qfalse ); } } */ // else if ( self->behaviorSet[BSET_USE] ) if ( self->behaviorSet[BSET_USE] ) { NPC_UseResponse( self, other, qtrue ); } // else if ( isMedic( self ) ) // {//Heal me NOW, dammit! // NPC_TakePatient( activator ); // } else if ( !self->enemy //&& self->client->NPC_class == CLASS_VEHICLE && activator->s.number == 0 && !gi.VoiceVolume[self->s.number] && !(self->NPC->scriptFlags&SCF_NO_RESPONSE) ) {//I don't have an enemy and I'm not talking and I was used by the player NPC_UseResponse( self, other, qfalse ); } } RestoreNPCGlobals(); }
void TryUse( gentity_t *ent ) { gentity_t *target; trace_t trace; vec3_t src, dest, vf; if ( ent->s.number == 0 && ent->client->NPC_class == CLASS_ATST ) {//a player trying to get out of his ATST GEntity_UseFunc( ent->activator, ent, ent ); return; } //FIXME: this does not match where the new accurate crosshair aims... //cg.refdef.vieworg, basically VectorCopy( ent->client->renderInfo.eyePoint, src ); AngleVectors( ent->client->ps.viewangles, vf, NULL, NULL );//ent->client->renderInfo.eyeAngles was cg.refdef.viewangles, basically //extend to find end of use trace VectorMA( src, USE_DISTANCE, vf, dest ); //Trace ahead to find a valid target gi.trace( &trace, src, vec3_origin, vec3_origin, dest, ent->s.number, MASK_OPAQUE|CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_ITEM|CONTENTS_CORPSE, G2_NOCOLLIDE, 0 ); if ( trace.fraction == 1.0f || trace.entityNum < 1 ) { //TODO: Play a failure sound /* if ( ent->s.number == 0 ) {//if nothing else, try the force telepathy power ForceTelepathy( ent ); } */ return; } target = &g_entities[trace.entityNum]; //Check for a use command if ( ValidUseTarget( target ) ) { NPC_SetAnim( ent, SETANIM_TORSO, BOTH_BUTTON_HOLD, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); /* if ( !VectorLengthSquared( ent->client->ps.velocity ) && !PM_CrouchAnim( ent->client->ps.legsAnim ) ) { NPC_SetAnim( ent, SETANIM_LEGS, BOTH_BUTTON_HOLD, SETANIM_FLAG_NORMAL|SETANIM_FLAG_HOLD ); } */ //ent->client->ps.weaponTime = ent->client->ps.torsoAnimTimer; GEntity_UseFunc( target, ent, ent ); return; } else if ( target->client && target->client->ps.pm_type < PM_DEAD && target->NPC!=NULL && target->client->playerTeam && (target->client->playerTeam == ent->client->playerTeam || target->client->playerTeam == TEAM_NEUTRAL) && !(target->NPC->scriptFlags&SCF_NO_RESPONSE) ) { NPC_UseResponse ( target, ent, qfalse ); return; } /* if ( ent->s.number == 0 ) {//if nothing else, try the force telepathy power ForceTelepathy( ent ); } */ }