本文整理汇总了C++中NPC_SetAnim函数的典型用法代码示例。如果您正苦于以下问题:C++ NPC_SetAnim函数的具体用法?C++ NPC_SetAnim怎么用?C++ NPC_SetAnim使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了NPC_SetAnim函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: EWebPositionUser
//lock the owner into place relative to the cannon pos
void EWebPositionUser(gentity_t *owner, gentity_t *eweb)
{
mdxaBone_t boltMatrix;
vec3_t p, p2, d;
trace_t tr;
qboolean traceOver = qtrue;
if ( owner->s.number < MAX_CLIENTS )
{//extra checks
gi.trace(&tr, owner->currentOrigin, owner->mins, owner->maxs, owner->currentOrigin, owner->s.number, owner->clipmask, (EG2_Collision)0, 0);
if ( tr.startsolid || tr.allsolid )
{//crap, they're already in solid somehow, don't bother tracing over
traceOver = qfalse;
}
}
if ( traceOver )
{//trace up
VectorCopy( owner->currentOrigin, p2 );
p2[2] += STEPSIZE;
gi.trace(&tr, owner->currentOrigin, owner->mins, owner->maxs, p2, owner->s.number, owner->clipmask, (EG2_Collision)0, 0);
if (!tr.startsolid && !tr.allsolid )
{
VectorCopy( tr.endpos, p2 );
}
else
{
VectorCopy( owner->currentOrigin, p2 );
}
}
//trace over
gi.G2API_GetBoltMatrix( eweb->ghoul2, 0, eweb->headBolt, &boltMatrix,
eweb->s.apos.trBase, eweb->currentOrigin,
(cg.time?cg.time:level.time), NULL, eweb->s.modelScale );
gi.G2API_GiveMeVectorFromMatrix( boltMatrix, ORIGIN, p );
gi.G2API_GiveMeVectorFromMatrix( boltMatrix, NEGATIVE_Y, d );
d[2] = 0;
VectorNormalize( d );
VectorMA( p, -44.0f, d, p );
if ( !traceOver )
{
VectorCopy( p, tr.endpos );
tr.allsolid = tr.startsolid = qfalse;
}
else
{
p[2] = p2[2];
if ( owner->s.number < MAX_CLIENTS )
{//extra checks
//just see if end point is not in solid
gi.trace(&tr, p, owner->mins, owner->maxs, p, owner->s.number, owner->clipmask, (EG2_Collision)0, 0);
if ( tr.startsolid || tr.allsolid )
{//would be in solid there, so just trace over, I guess?
gi.trace(&tr, p2, owner->mins, owner->maxs, p, owner->s.number, owner->clipmask, (EG2_Collision)0, 0);
}
}
else
{//trace over
gi.trace(&tr, p2, owner->mins, owner->maxs, p, owner->s.number, owner->clipmask, (EG2_Collision)0, 0);
}
}
if (!tr.startsolid && !tr.allsolid )
{
//trace down
VectorCopy( tr.endpos, p );
VectorCopy( p, p2 );
p2[2] -= STEPSIZE;
gi.trace(&tr, p, owner->mins, owner->maxs, p2, owner->s.number, owner->clipmask, (EG2_Collision)0, 0);
if (!tr.startsolid && !tr.allsolid )//&& tr.fraction == 1.0f)
{ //all clear, we can move there
vec3_t moveDir;
float moveDist;
VectorCopy( tr.endpos, p );
VectorSubtract( p, eweb->pos4, moveDir );
moveDist = VectorNormalize( moveDir );
if ( moveDist > 4.0f )
{//moved past the threshold from last position
vec3_t oRight;
int strafeAnim;
VectorCopy( p, eweb->pos4 );//update the position
//find out what direction he moved in
AngleVectors( owner->currentAngles, NULL, oRight, NULL );
if ( DotProduct( moveDir, oRight ) > 0 )
{//moved to his right, play right strafe
strafeAnim = BOTH_STRAFE_RIGHT1;
}
else
{//moved left, play left strafe
strafeAnim = BOTH_STRAFE_LEFT1;
}
NPC_SetAnim( owner, SETANIM_LEGS, strafeAnim,SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);
}
G_SetOrigin(owner, p);
VectorCopy(p, owner->client->ps.origin);
gi.linkentity( owner );
}
}
//.........这里部分代码省略.........
开发者ID:BishopExile,项目名称:OpenJK,代码行数:101,代码来源:g_emplaced.cpp
示例2: ATST_Idle
/*
-------------------------
ATST_Idle
-------------------------
*/
void ATST_Idle( void ) {
NPC_BSIdle();
NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_STAND1, SETANIM_FLAG_NORMAL );
}
开发者ID:redsaurus,项目名称:japp,代码行数:11,代码来源:NPC_AI_Atst.c
示例3: TryUse
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 );
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 );
}
*/
}
开发者ID:blaenk,项目名称:jedioutcast,代码行数:67,代码来源:g_utils.cpp
示例4: PM_AdjustAngleForWallRun
qboolean PM_AdjustAngleForWallRun( gentity_t *ent, usercmd_t *ucmd, qboolean doMove )
{
if (( ent->client->ps.legsAnim == BOTH_WALL_RUN_RIGHT || ent->client->ps.legsAnim == BOTH_WALL_RUN_LEFT ) && ent->client->ps.legsAnimTimer > 500 )
{ //wall-running and not at end of anim
//stick to wall, if there is one
vec3_t rt, traceTo, mins = {ent->mins[0],ent->mins[1],0}, maxs = {ent->maxs[0],ent->maxs[1],24}, fwdAngles = {0, ent->client->ps.viewangles[YAW], 0};
trace_t trace;
float dist, yawAdjust;
AngleVectors( fwdAngles, NULL, rt, NULL );
if ( ent->client->ps.legsAnim == BOTH_WALL_RUN_RIGHT )
{
dist = 128;
yawAdjust = -90;
}
else
{
dist = -128;
yawAdjust = 90;
}
VectorMA( ent->currentOrigin, dist, rt, traceTo );
gi.trace( &trace, ent->currentOrigin, mins, maxs, traceTo, ent->s.number, ent->clipmask, (EG2_Collision)0, 0);
if ( trace.fraction < 1.0f && trace.plane.normal[2] == 0.0f )
{ //still a vertical wall there
//FIXME: don't pull around 90 turns
//FIXME: simulate stepping up steps here, somehow?
if ( ent->s.number || !player_locked )
{
if ( ent->client->ps.legsAnim == BOTH_WALL_RUN_RIGHT )
{
ucmd->rightmove = 127;
}
else
{
ucmd->rightmove = -127;
}
}
if ( ucmd->upmove < 0 )
{
ucmd->upmove = 0;
}
if ( ent->NPC )
{ //invalid now
VectorClear( ent->client->ps.moveDir );
}
//make me face perpendicular to the wall
ent->client->ps.viewangles[YAW] = vectoyaw( trace.plane.normal )+yawAdjust;
if ( ent->client->ps.viewEntity <= 0 || ent->client->ps.viewEntity >= ENTITYNUM_WORLD )
{ //don't clamp angles when looking through a viewEntity
SetClientViewAngle( ent, ent->client->ps.viewangles );
}
ucmd->angles[YAW] = ANGLE2SHORT( ent->client->ps.viewangles[YAW] ) - ent->client->ps.delta_angles[YAW];
if ( ent->s.number || !player_locked )
{
if ( doMove )
{
//push me forward
vec3_t fwd;
float zVel = ent->client->ps.velocity[2];
if ( zVel > forceJumpStrength[FORCE_LEVEL_2]/2.0f )
{
zVel = forceJumpStrength[FORCE_LEVEL_2]/2.0f;
}
if ( ent->client->ps.legsAnimTimer > 500 )
{ //not at end of anim yet
fwdAngles[YAW] = ent->client->ps.viewangles[YAW];
AngleVectors( fwdAngles, fwd, NULL, NULL );
//FIXME: or MA?
float speed = 175;
if ( ucmd->forwardmove < 0 )
{ //slower
speed = 100;
}
else if ( ucmd->forwardmove > 0 )
{
speed = 250;//running speed
}
VectorScale( fwd, speed, ent->client->ps.velocity );
}
ent->client->ps.velocity[2] = zVel;//preserve z velocity
VectorMA( ent->client->ps.velocity, -128, trace.plane.normal, ent->client->ps.velocity );
//pull me toward the wall, too
//VectorMA( ent->client->ps.velocity, dist, rt, ent->client->ps.velocity );
}
}
ucmd->forwardmove = 0;
return qtrue;
}
else if ( doMove )
{ //stop it
if ( ent->client->ps.legsAnim == BOTH_WALL_RUN_RIGHT )
{
NPC_SetAnim( ent, SETANIM_BOTH, BOTH_WALL_RUN_RIGHT_STOP, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD );
}
else if ( ent->client->ps.legsAnim == BOTH_WALL_RUN_LEFT )
{
NPC_SetAnim( ent, SETANIM_BOTH, BOTH_WALL_RUN_LEFT_STOP, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD );
}
}
}
//.........这里部分代码省略.........
开发者ID:Boothand,项目名称:jedioutcast,代码行数:101,代码来源:bg_pangles.cpp
示例5: NPC_GM_Pain
void NPC_GM_Pain( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, vec3_t point, int damage, int mod,int hitLoc )
{
if ( self->client->ps.powerups[PW_GALAK_SHIELD] == 0 )
{//shield is currently down
//FIXME: allow for radius damage?
if ( (hitLoc==HL_GENERIC1) && (self->locationDamage[HL_GENERIC1] > GENERATOR_HEALTH) )
{
int newBolt = gi.G2API_AddBolt( &self->ghoul2[self->playerModel], "*antenna_base" );
if ( newBolt != -1 )
{
GM_CreateExplosion( self, newBolt );
}
gi.G2API_SetSurfaceOnOff( &self->ghoul2[self->playerModel], "torso_shield_off", TURN_OFF );
gi.G2API_SetSurfaceOnOff( &self->ghoul2[self->playerModel], "torso_antenna", TURN_OFF );
gi.G2API_SetSurfaceOnOff( &self->ghoul2[self->playerModel], "torso_antenna_base_cap_off", TURN_ON );
self->client->ps.powerups[PW_GALAK_SHIELD] = 0;//temp, for effect
self->client->ps.stats[STAT_ARMOR] = 0;//no more armor
self->NPC->investigateDebounceTime = 0;//stop recharging
NPC_SetAnim( self, SETANIM_BOTH, BOTH_ALERT1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD );
TIMER_Set( self, "attackDelay", self->client->ps.torsoAnimTimer );
G_AddEvent( self, Q_irand( EV_DEATH1, EV_DEATH3 ), self->health );
}
}
else
{//store the point for shield impact
if ( point )
{
VectorCopy( point, self->pos4 );
self->client->poisonTime = level.time;
}
}
if ( !self->lockCount && !self->client->ps.torsoAnimTimer )
{//don't interrupt laser sweep attack or other special attacks/moves
if ( self->count < 4 && self->health > 100 && hitLoc != HL_GENERIC1 )
{
if ( self->delay < level.time )
{
int speech;
switch( self->count )
{
default:
case 0:
speech = EV_PUSHED1;
break;
case 1:
speech = EV_PUSHED2;
break;
case 2:
speech = EV_PUSHED3;
break;
case 3:
speech = EV_DETECTED1;
break;
}
self->count++;
self->NPC->blockedSpeechDebounceTime = 0;
G_AddVoiceEvent( self, speech, Q_irand( 3000, 5000 ) );
self->delay = level.time + Q_irand( 5000, 7000 );
}
}
else
{
NPC_Pain( self, inflictor, attacker, point, damage, mod, hitLoc );
}
}
else if ( hitLoc == HL_GENERIC1 )
{
NPC_SetPainEvent( self );
self->s.powerups |= ( 1 << PW_SHOCKED );
self->client->ps.powerups[PW_SHOCKED] = level.time + Q_irand( 500, 2500 );
}
if ( inflictor && inflictor->lastEnemy == self )
{//He force-pushed my own lobfires back at me
if ( mod == MOD_REPEATER_ALT && !Q_irand( 0, 2 ) )
{
if ( TIMER_Done( self, "noRapid" ) )
{
self->NPC->scriptFlags &= ~SCF_ALT_FIRE;
self->alt_fire = qfalse;
TIMER_Set( self, "noLob", Q_irand( 2000, 6000 ) );
}
else
{//hopefully this will make us fire the laser
TIMER_Set( self, "noLob", Q_irand( 1000, 2000 ) );
}
}
else if ( mod == MOD_REPEATER && !Q_irand( 0, 5 ) )
{
if ( TIMER_Done( self, "noLob" ) )
{
self->NPC->scriptFlags |= SCF_ALT_FIRE;
self->alt_fire = qtrue;
TIMER_Set( self, "noRapid", Q_irand( 2000, 6000 ) );
}
else
{//hopefully this will make us fire the laser
//.........这里部分代码省略.........
开发者ID:PJayB,项目名称:jk2src,代码行数:101,代码来源:AI_GalakMech.cpp
示例6: Rancor_Attack
void Rancor_Attack( float distance, qboolean doCharge ) {
if ( !TIMER_Exists( NPC, "attacking" ) ) {
if ( NPC->count == 2 && NPC->activator ) {
}
else if ( NPC->count == 1 && NPC->activator ) {//holding enemy
if ( NPC->activator->health > 0 && Q_irand( 0, 1 ) ) {//quick bite
NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_ATTACK1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD );
TIMER_Set( NPC, "attack_dmg", 450 );
}
else {//full eat
NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_ATTACK3, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD );
TIMER_Set( NPC, "attack_dmg", 900 );
//Make victim scream in fright
if ( NPC->activator->health > 0 && NPC->activator->client ) {
G_AddEvent( NPC->activator, Q_irand( EV_DEATH1, EV_DEATH3 ), 0 );
NPC_SetAnim( NPC->activator, SETANIM_TORSO, BOTH_FALLDEATH1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD );
if ( NPC->activator->NPC ) {//no more thinking for you
TossClientItems( NPC );
NPC->activator->NPC->nextBStateThink = Q3_INFINITE;
}
}
}
}
else if ( NPC->enemy->health > 0 && doCharge ) {//charge
vector3 fwd, yawAng;
VectorSet( &yawAng, 0, NPC->client->ps.viewangles.yaw, 0 );
AngleVectors( &yawAng, &fwd, NULL, NULL );
VectorScale( &fwd, distance*1.5f, &NPC->client->ps.velocity );
NPC->client->ps.velocity.z = 150;
NPC->client->ps.groundEntityNum = ENTITYNUM_NONE;
NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_MELEE2, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD );
TIMER_Set( NPC, "attack_dmg", 1250 );
}
else if ( !Q_irand( 0, 1 ) ) {//smash
NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_MELEE1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD );
TIMER_Set( NPC, "attack_dmg", 1000 );
}
else {//try to grab
NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_ATTACK2, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD );
TIMER_Set( NPC, "attack_dmg", 1000 );
}
TIMER_Set( NPC, "attacking", NPC->client->ps.legsTimer + random() * 200 );
}
// Need to do delayed damage since the attack animations encapsulate multiple mini-attacks
if ( TIMER_Done2( NPC, "attack_dmg", qtrue ) ) {
vector3 shakePos;
switch ( NPC->client->ps.legsAnim ) {
case BOTH_MELEE1:
Rancor_Smash();
G_GetBoltPosition( NPC, NPC->client->renderInfo.handLBolt, &shakePos, 0 );
G_ScreenShake( &shakePos, NULL, 4.0f, 1000, qfalse );
//CGCam_Shake( 1.0f*playerDist/128.0f, 1000 );
break;
case BOTH_MELEE2:
Rancor_Bite();
TIMER_Set( NPC, "attack_dmg2", 450 );
break;
case BOTH_ATTACK1:
if ( NPC->count == 1 && NPC->activator ) {
G_Damage( NPC->activator, NPC, NPC, &vec3_origin, &NPC->activator->r.currentOrigin, Q_irand( 25, 40 ), DAMAGE_NO_ARMOR | DAMAGE_NO_KNOCKBACK, MOD_MELEE );
if ( NPC->activator->health <= 0 ) {//killed him
//make it look like we bit his head off
//NPC->activator->client->dismembered = qfalse;
G_Dismember( NPC->activator, NPC, &NPC->activator->r.currentOrigin, G2_MODELPART_HEAD, 90, 0, NPC->activator->client->ps.torsoAnim, qtrue );
//G_DoDismemberment( NPC->activator, NPC->activator->r.currentOrigin, MOD_SABER, 1000, HL_HEAD, qtrue );
NPC->activator->client->ps.forceHandExtend = HANDEXTEND_NONE;
NPC->activator->client->ps.forceHandExtendTime = 0;
NPC_SetAnim( NPC->activator, SETANIM_BOTH, BOTH_SWIM_IDLE1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD );
}
G_Sound( NPC->activator, CHAN_AUTO, G_SoundIndex( "sound/chars/rancor/chomp.wav" ) );
}
break;
case BOTH_ATTACK2:
//try to grab
Rancor_Swing( qtrue );
break;
case BOTH_ATTACK3:
if ( NPC->count == 1 && NPC->activator ) {
//cut in half
if ( NPC->activator->client ) {
//NPC->activator->client->dismembered = qfalse;
G_Dismember( NPC->activator, NPC, &NPC->activator->r.currentOrigin, G2_MODELPART_WAIST, 90, 0, NPC->activator->client->ps.torsoAnim, qtrue );
//G_DoDismemberment( NPC->activator, NPC->enemy->r.currentOrigin, MOD_SABER, 1000, HL_WAIST, qtrue );
}
//KILL
G_Damage( NPC->activator, NPC, NPC, &vec3_origin, &NPC->activator->r.currentOrigin, NPC->enemy->health + 10, DAMAGE_NO_PROTECTION | DAMAGE_NO_ARMOR | DAMAGE_NO_KNOCKBACK | DAMAGE_NO_HIT_LOC, MOD_MELEE );//, HL_NONE );//
if ( NPC->activator->client ) {
NPC->activator->client->ps.forceHandExtend = HANDEXTEND_NONE;
NPC->activator->client->ps.forceHandExtendTime = 0;
NPC_SetAnim( NPC->activator, SETANIM_BOTH, BOTH_SWIM_IDLE1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD );
}
TIMER_Set( NPC, "attack_dmg2", 1350 );
G_Sound( NPC->activator, CHAN_AUTO, G_SoundIndex( "sound/chars/rancor/swipehit.wav" ) );
G_AddEvent( NPC->activator, EV_JUMP, NPC->activator->health );
}
break;
//.........这里部分代码省略.........
开发者ID:Arcadiaprime,项目名称:japp,代码行数:101,代码来源:NPC_AI_Rancor.cpp
示例7: NPC_Probe_Pain
/*
-------------------------
NPC_BSDroid_Pain
-------------------------
*/
void NPC_Probe_Pain( gentity_t *self, gentity_t *inflictor, gentity_t *other, const vec3_t point, int damage, int mod,int hitLoc )
{
float pain_chance;
VectorCopy( self->NPC->lastPathAngles, self->s.angles );
if ( self->health < 30 || mod == MOD_DEMP2 || mod == MOD_DEMP2_ALT ) // demp2 always messes them up real good
{
vec3_t endPos;
trace_t trace;
VectorSet( endPos, self->currentOrigin[0], self->currentOrigin[1], self->currentOrigin[2] - 128 );
gi.trace( &trace, self->currentOrigin, NULL, NULL, endPos, self->s.number, MASK_SOLID, (EG2_Collision)0, 0 );
if ( trace.fraction == 1.0f || mod == MOD_DEMP2 ) // demp2 always does this
{
if (self->client->clientInfo.headModel != 0)
{
vec3_t origin;
VectorCopy(self->currentOrigin,origin);
origin[2] +=50;
// G_PlayEffect( "small_chunks", origin );
G_PlayEffect( "chunks/probehead", origin );
G_PlayEffect( "env/med_explode2", origin );
self->client->clientInfo.headModel = 0;
self->client->moveType = MT_RUNJUMP;
self->client->ps.gravity = g_gravity->value*.1;
}
if ( (mod == MOD_DEMP2 || mod == MOD_DEMP2_ALT) && other )
{
vec3_t dir;
NPC_SetAnim( self, SETANIM_BOTH, BOTH_PAIN1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);
VectorSubtract( self->currentOrigin, other->currentOrigin, dir );
VectorNormalize( dir );
VectorMA( self->client->ps.velocity, 550, dir, self->client->ps.velocity );
self->client->ps.velocity[2] -= 127;
}
self->s.powerups |= ( 1 << PW_SHOCKED );
self->client->ps.powerups[PW_SHOCKED] = level.time + 3000;
self->NPC->localState = LSTATE_DROP;
}
}
else
{
pain_chance = NPC_GetPainChance( self, damage );
if ( random() < pain_chance ) // Spin around in pain?
{
NPC_SetAnim( self, SETANIM_BOTH, BOTH_PAIN1, SETANIM_FLAG_OVERRIDE);
}
}
NPC_Pain( self, inflictor, other, point, damage, mod);
}
开发者ID:AlexXT,项目名称:OpenJK,代码行数:66,代码来源:AI_ImperialProbe.cpp
示例8: NPC_ChoosePainAnimation
//.........这里部分代码省略.........
pain_chance = 1.0f - ((RANK_CAPTAIN-self->NPC->rank)/(float)RANK_CAPTAIN);
}
else if ( self->client->NPC_class == CLASS_PROTOCOL )
{
pain_chance = 1.0f;
}
else
{
pain_chance = NPC_GetPainChance( self, damage );
}
if ( self->client->NPC_class == CLASS_DESANN )
{
pain_chance *= 0.5f;
}
}
//See if we're going to flinch
if ( random() < pain_chance )
{
int animLength;
//Pick and play our animation
if ( self->client->ps.fd.forceGripBeingGripped < level.time )
{//not being force-gripped or force-drained
if ( /*G_CheckForStrongAttackMomentum( self ) //rwwFIXMEFIXME: Is this needed?
||*/ PM_SpinningAnim( self->client->ps.legsAnim )
|| BG_SaberInSpecialAttack( self->client->ps.torsoAnim )
|| PM_InKnockDown( &self->client->ps )
|| PM_RollingAnim( self->client->ps.legsAnim )
|| (BG_FlippingAnim( self->client->ps.legsAnim )&&!PM_InCartwheel( self->client->ps.legsAnim )) )
{//strong attacks, rolls, knockdowns, flips and spins cannot be interrupted by pain
}
else
{//play an anim
int parts;
if ( self->client->NPC_class == CLASS_GALAKMECH )
{//only has 1 for now
//FIXME: never plays this, it seems...
pain_anim = BOTH_PAIN1;
}
else if ( mod == MOD_MELEE )
{
pain_anim = BG_PickAnim( self->localAnimIndex, BOTH_PAIN2, BOTH_PAIN3 );
}
else if ( self->s.weapon == WP_SABER )
{//temp HACK: these are the only 2 pain anims that look good when holding a saber
pain_anim = BG_PickAnim( self->localAnimIndex, BOTH_PAIN2, BOTH_PAIN3 );
}
/*
else if ( mod != MOD_ELECTROCUTE )
{
pain_anim = G_PickPainAnim( self, point, damage, hitLoc );
}
*/
if ( pain_anim == -1 )
{
pain_anim = BG_PickAnim( self->localAnimIndex, BOTH_PAIN1, BOTH_PAIN18 );
}
self->client->ps.fd.saberAnimLevel = FORCE_LEVEL_1;//next attack must be a quick attack
self->client->ps.saberMove = LS_READY;//don't finish whatever saber move you may have been in
parts = SETANIM_BOTH;
if ( BG_CrouchAnim( self->client->ps.legsAnim ) || PM_InCartwheel( self->client->ps.legsAnim ) )
{
parts = SETANIM_LEGS;
}
if (pain_anim != -1)
{
NPC_SetAnim( self, parts, pain_anim, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD );
}
}
if ( voiceEvent != -1 )
{
G_AddVoiceEvent( self, voiceEvent, Q_irand( 2000, 4000 ) );
}
else
{
NPC_SetPainEvent( self );
}
}
else
{
G_AddVoiceEvent( self, Q_irand(EV_CHOKE1, EV_CHOKE3), 0 );
}
//Setup the timing for it
/*
if ( mod == MOD_ELECTROCUTE )
{
self->painDebounceTime = level.time + 4000;
}
*/
animLength = bgAllAnims[self->localAnimIndex].anims[pain_anim].numFrames * fabs((float)(bgHumanoidAnimations[pain_anim].frameLerp));
self->painDebounceTime = level.time + animLength;
self->client->ps.weaponTime = 0;
}
}
开发者ID:Resuru,项目名称:JediKnightGalaxies,代码行数:101,代码来源:NPC_reactions.cpp
示例9: NPC_Rancor_Pain
//.........这里部分代码省略.........
//adjusting for more than one player
if ( (attacker->s.number < MAX_CLIENTS &&!Q_irand(0,3))
//if ( (!attacker->s.number&&!Q_irand(0,3))
//[/CoOp]
|| !self->enemy
//[CoOp]
//can be dead below 0 in MP
|| self->enemy->health <= 0
//|| self->enemy->health == 0
//[/CoOp]
|| (self->enemy->client&&self->enemy->client->NPC_class == CLASS_RANCOR)
//[CoOp] SP Code
|| (!Q_irand(0, 4 ) && DistanceSquared( attacker->r.currentOrigin, self->r.currentOrigin ) < DistanceSquared( self->enemy->r.currentOrigin, self->r.currentOrigin )) )
//|| (self->NPC && self->NPC->consecutiveBlockedMoves>=10 && DistanceSquared( attacker->r.currentOrigin, self->r.currentOrigin ) < DistanceSquared( self->enemy->r.currentOrigin, self->r.currentOrigin )) )
///[CoOp]
{//if my enemy is dead (or attacked by player) and I'm not still holding/eating someone, turn on the attacker
//FIXME: if can't nav to my enemy, take this guy if I can nav to him
//[CoOp]
self->lastEnemy = self->enemy;
//[/CoOp]
G_SetEnemy( self, attacker );
//[CoOp]
//RAFIXME - useDebounceTime not implimented
/* SP Code
if ( self->enemy != self->lastEnemy )
{//clear this so that we only sniff the player the first time we pick them up
self->useDebounceTime = 0;
}
*/
//[/CoOp]
TIMER_Set( self, "lookForNewEnemy", Q_irand( 5000, 15000 ) );
if ( hitByRancor )
{//stay mad at this Rancor for 2-5 secs before looking for attacker enemies
TIMER_Set( self, "rancorInfight", Q_irand( 2000, 5000 ) );
}
}
}
}
if ( (hitByRancor|| (self->count==1&&self->activator&&!Q_irand(0,4)) || Q_irand( 0, 200 ) < damage )//hit by rancor, hit while holding live victim, or took a lot of damage
&& self->client->ps.legsAnim != BOTH_STAND1TO2
&& TIMER_Done( self, "takingPain" ) )
{
if ( !Rancor_CheckRoar( self ) )
{
if ( self->client->ps.legsAnim != BOTH_MELEE1
&& self->client->ps.legsAnim != BOTH_MELEE2
//[CoOp]
//move animations are uninterruptable in SP.
&& self->client->ps.legsAnim != BOTH_ATTACK2
&& self->client->ps.legsAnim != BOTH_ATTACK10
&& self->client->ps.legsAnim != BOTH_ATTACK11 )
//&& self->client->ps.legsAnim != BOTH_ATTACK2 )
//[/CoOp]
{//cant interrupt one of the big attack anims
/*
if ( self->count != 1
|| attacker == self->activator
|| (self->client->ps.legsAnim != BOTH_ATTACK1&&self->client->ps.legsAnim != BOTH_ATTACK3) )
*/
{//if going to bite our victim, only victim can interrupt that anim
if ( self->health > 100 || hitByRancor )
{
TIMER_Remove( self, "attacking" );
VectorCopy( self->NPC->lastPathAngles, self->s.angles );
if ( self->count == 1 )
{
NPC_SetAnim( self, SETANIM_BOTH, BOTH_PAIN2, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD );
}
else
{
NPC_SetAnim( self, SETANIM_BOTH, BOTH_PAIN1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD );
}
//[CoOp] SP Code
TIMER_Set( self, "takingPain", self->client->ps.legsTimer+Q_irand(0, 500*(2-g_spskill.integer)) );
//TIMER_Set( self, "takingPain", self->client->ps.legsTimer+Q_irand(0, 500) );
//[CoOp]
if ( self->NPC )
{
self->NPC->localState = LSTATE_WAITING;
}
}
}
}
}
//let go
/*
if ( !Q_irand( 0, 3 ) && self->count == 1 )
{
Rancor_DropVictim( self );
}
*/
}
}
开发者ID:mehmehsomeone,项目名称:OpenRP,代码行数:101,代码来源:NPC_AI_Rancor.cpp
示例10: Howler_Howl
static void Howler_Howl( void )
{
gentity_t *radiusEnts[ 128 ];
int numEnts;
const float radius = (NPC->spawnflags&1)?256:128;
const float halfRadSquared = ((radius/2)*(radius/2));
const float radiusSquared = (radius*radius);
float distSq;
int i;
vec3_t boltOrg;
AddSoundEvent( NPC, NPC->currentOrigin, 512, AEL_DANGER, qfalse, qtrue );
numEnts = NPC_GetEntsNearBolt( radiusEnts, radius, NPC->handLBolt, boltOrg );
for ( i = 0; i < numEnts; i++ )
{
if ( !radiusEnts[i]->inuse )
{
continue;
}
if ( radiusEnts[i] == NPC )
{//Skip the rancor ent
continue;
}
if ( radiusEnts[i]->client == NULL )
{//must be a client
continue;
}
if ( radiusEnts[i]->client->NPC_class == CLASS_HOWLER )
{//other howlers immune
continue;
}
distSq = DistanceSquared( radiusEnts[i]->currentOrigin, boltOrg );
if ( distSq <= radiusSquared )
{
if ( distSq < halfRadSquared )
{//close enough to do damage, too
if ( Q_irand( 0, g_spskill->integer ) )
{//does no damage on easy, does 1 point every other frame on medium, more often on hard
G_Damage( radiusEnts[i], NPC, NPC, vec3_origin, NPC->currentOrigin, 1, DAMAGE_NO_KNOCKBACK, MOD_IMPACT );
}
}
if ( radiusEnts[i]->health > 0
&& radiusEnts[i]->client
&& radiusEnts[i]->client->NPC_class != CLASS_RANCOR
&& radiusEnts[i]->client->NPC_class != CLASS_ATST
&& !PM_InKnockDown( &radiusEnts[i]->client->ps ) )
{
if ( PM_HasAnimation( radiusEnts[i], BOTH_SONICPAIN_START ) )
{
if ( radiusEnts[i]->client->ps.torsoAnim != BOTH_SONICPAIN_START
&& radiusEnts[i]->client->ps.torsoAnim != BOTH_SONICPAIN_HOLD )
{
NPC_SetAnim( radiusEnts[i], SETANIM_LEGS, BOTH_SONICPAIN_START, SETANIM_FLAG_NORMAL );
NPC_SetAnim( radiusEnts[i], SETANIM_TORSO, BOTH_SONICPAIN_START, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD );
radiusEnts[i]->client->ps.torsoAnimTimer += 100;
radiusEnts[i]->client->ps.weaponTime = radiusEnts[i]->client->ps.torsoAnimTimer;
}
else if ( radiusEnts[i]->client->ps.torsoAnimTimer <= 100 )
{//at the end of the sonic pain start or hold anim
NPC_SetAnim( radiusEnts[i], SETANIM_LEGS, BOTH_SONICPAIN_HOLD, SETANIM_FLAG_NORMAL );
NPC_SetAnim( radiusEnts[i], SETANIM_TORSO, BOTH_SONICPAIN_HOLD, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD );
radiusEnts[i]->client->ps.torsoAnimTimer += 100;
radiusEnts[i]->client->ps.weaponTime = radiusEnts[i]->client->ps.torsoAnimTimer;
}
}
/*
else if ( distSq < halfRadSquared
&& radiusEnts[i]->client->ps.groundEntityNum != ENTITYNUM_NONE
&& !Q_irand( 0, 10 ) )//FIXME: base on skill
{//within range
G_Knockdown( radiusEnts[i], NPC, vec3_origin, 500, qfalse );
}
*/
}
}
}
float playerDist = NPC_EntRangeFromBolt( player, NPC->genericBolt1 );
if ( playerDist < 256.0f )
{
CGCam_Shake( 1.0f*playerDist/128.0f, 200 );
}
}
开发者ID:Chedo,项目名称:OpenJK,代码行数:89,代码来源:AI_Howler.cpp
示例11: Howler_Attack
//------------------------------
static void Howler_Attack( float enemyDist, qboolean howl )
{
int dmg = (NPCInfo->localState==LSTATE_BERZERK)?5:2;
if ( !TIMER_Exists( NPC, "attacking" ))
{
int attackAnim = BOTH_GESTURE1;
// Going to do an attack
if ( NPC->enemy && NPC->enemy->client && PM_InKnockDown( &NPC->enemy->client->ps )
&& enemyDist <= MIN_DISTANCE )
{
attackAnim = BOTH_ATTACK2;
}
else if ( !Q_irand( 0, 4 ) || howl )
{//howl attack
//G_SoundOnEnt( NPC, CHAN_VOICE, "sound/chars/howler/howl.mp3" );
}
else if ( enemyDist > MIN_DISTANCE && Q_irand( 0, 1 ) )
{//lunge attack
//jump foward
vec3_t fwd, yawAng = {0, NPC->client->ps.viewangles[YAW], 0};
AngleVectors( yawAng, fwd, NULL, NULL );
VectorScale( fwd, (enemyDist*3.0f), NPC->client->ps.velocity );
NPC->client->ps.velocity[2] = 200;
NPC->client->ps.groundEntityNum = ENTITYNUM_NONE;
attackAnim = BOTH_ATTACK1;
}
else
{//tongue attack
attackAnim = BOTH_ATTACK2;
}
NPC_SetAnim( NPC, SETANIM_BOTH, attackAnim, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD | SETANIM_FLAG_RESTART );
if ( NPCInfo->localState == LSTATE_BERZERK )
{//attack again right away
TIMER_Set( NPC, "attacking", NPC->client->ps.legsAnimTimer );
}
else
{
TIMER_Set( NPC, "attacking", NPC->client->ps.legsAnimTimer + Q_irand( 0, 1500 ) );//FIXME: base on skill
TIMER_Set( NPC, "standing", -level.time );
TIMER_Set( NPC, "walking", -level.time );
TIMER_Set( NPC, "running", NPC->client->ps.legsAnimTimer + 5000 );
}
TIMER_Set( NPC, "attack_dmg", 200 ); // level two damage
}
// Need to do delayed damage since the attack animations encapsulate multiple mini-attacks
switch ( NPC->client->ps.legsAnim )
{
case BOTH_ATTACK1:
case BOTH_MELEE1:
if ( NPC->client->ps.legsAnimTimer > 650//more than 13 frames left
&& PM_AnimLength( NPC->client->clientInfo.animFileIndex, (animNumber_t)NPC->client->ps.legsAnim ) - NPC->client->ps.legsAnimTimer >= 800 )//at least 16 frames into anim
{
Howler_TryDamage( dmg, qfalse, qfalse );
}
break;
case BOTH_ATTACK2:
case BOTH_MELEE2:
if ( NPC->client->ps.legsAnimTimer > 350//more than 7 frames left
&& PM_AnimLength( NPC->client->clientInfo.animFileIndex, (animNumber_t)NPC->client->ps.legsAnim ) - NPC->client->ps.legsAnimTimer >= 550 )//at least 11 frames into anim
{
Howler_TryDamage( dmg, qtrue, qfalse );
}
break;
case BOTH_GESTURE1:
{
if ( NPC->client->ps.legsAnimTimer > 1800//more than 36 frames left
&& PM_AnimLength( NPC->client->clientInfo.animFileIndex, (animNumber_t)NPC->client->ps.legsAnim ) - NPC->client->ps.legsAnimTimer >= 950 )//at least 19 frames into anim
{
Howler_Howl();
if ( !NPC->count )
{
G_PlayEffect( G_EffectIndex( "howler/sonic" ), NPC->playerModel, NPC->genericBolt1, NPC->s.number, NPC->currentOrigin, 4750, qtrue );
G_SoundOnEnt( NPC, CHAN_VOICE, "sound/chars/howler/howl.mp3" );
NPC->count = 1;
}
}
}
break;
default:
//anims seem to get reset after a load, so just stop attacking and it will restart as needed.
TIMER_Remove( NPC, "attacking" );
break;
}
// Just using this to remove the attacking flag at the right time
TIMER_Done2( NPC, "attacking", qtrue );
}
开发者ID:Chedo,项目名称:OpenJK,代码行数:93,代码来源:AI_Howler.cpp
示例12: NPC_HandleAIFlags
//.........这里部分代码省略.........
else
{
NPCInfo->canShove = qtrue;
}
}
if(blocker->client && blocker->client->playerTeam == NPC->client->playerTeam)
{//Should we ask it to get out of the way?
//FIXME: NPC_SetSayBState(NPC, blocker, Q_irand(SAY_MOVEIT1, SAY_MOVEIT4);// ?
if(NPCInfo->blockedSpeechDebounceTime < level.time)
{
if ( NPC->behaviorSet[BSET_BLOCKED] )
{
G_ActivateBehavior( NPC, BSET_BLOCKED);
}
else
{
G_AddVoiceEvent( NPC, Q_irand(EV_BLOCKED1, EV_BLOCKED3), 0 );
}
#ifdef _DEBUG
//gi.Printf( "%s: 'Hey, %s, move it!'\n", NPC->targetname, blocker->targetname );
#endif
//NPCInfo->blockedSpeechDebounceTime = level.time + 10000;//FIXME: make a define
//Ok, need to make it get out of the way...
}
}
else if((blocker->client || blocker->takedamage) && blocker->health > 0 && blocker->health < 200 )
{//Attack it!? Set enemy and temp behavior? Hmm...
//Careful, what if it's explosive?
G_SetEnemy( NPC, blocker );
if( NPCInfo->consecutiveBlockedMoves == 30 )
{//Blocked for three seconds straight
G_ActivateBehavior( NPC, BSET_BLOCKED);
}
}
}
}
else if(NPCInfo->blockedDebounceTime < level.time)
{//Only clear if haven't been blocked for a whole second
NPCInfo->consecutiveBlockedMoves = 0;
NPCInfo->shoveCount = 0;
}
if(NPCInfo->shoveDebounce < level.time)
{//We have shoved for 1 second at least
NPCInfo->lastShoveDir = 0.0f;
}
//NAV_ClearBlockedInfo(NPC);
*/
//MRJ Request:
if ( NPCInfo->aiFlags & NPCAI_GREET_ALLIES && !NPC->enemy )//what if "enemy" is the greetEnt?
{//If no enemy, look for teammates to greet
//FIXME: don't say hi to the same guy over and over again.
if ( NPCInfo->greetingDebounceTime < level.time )
{//Has been at least 2 seconds since we greeted last
if ( !NPCInfo->greetEnt )
{//Find a teammate whom I'm facing and who is facing me and within 128
NPCInfo->greetEnt = NPC_PickAlly( qtrue, 128, qtrue, qtrue );
}
if ( NPCInfo->greetEnt && !Q_irand(0, 5) )
{//Start greeting someone
qboolean greeted = qfalse;
//TODO: If have a greetscript, run that instead?
//FIXME: make them greet back?
if( !Q_irand( 0, 2 ) )
{//Play gesture anim (press gesture button?)
greeted = qtrue;
NPC_SetAnim( NPC, SETANIM_TORSO, Q_irand( BOTH_GESTURE1, BOTH_GESTURE3 ), SETANIM_FLAG_NORMAL|SETANIM_FLAG_HOLD );
//NOTE: play full-body gesture if not moving?
}
if( !Q_irand( 0, 2 ) )
{//Play random voice greeting sound
greeted = qtrue;
//FIXME: need NPC sound sets
G_AddVoiceEvent( NPC, Q_irand(EV_GREET1, EV_GREET3), 2000 );
}
if( !Q_irand( 0, 1 ) )
{//set looktarget to them for a second or two
greeted = qtrue;
NPC_TempLookTarget( NPC, NPCInfo->greetEnt->s.number, 1000, 3000 );
}
if ( greeted )
{//Did at least one of the things above
//Don't greet again for 2 - 4 seconds
NPCInfo->greetingDebounceTime = level.time + Q_irand( 2000, 4000 );
NPCInfo->greetEnt = NULL;
}
}
}
}
}
开发者ID:UberGames,项目名称:SP-Mod-Source-Code,代码行数:101,代码来源:NPC.cpp
示例13: NPC_ExecuteBState
//.........这里部分代码省略.........
if ( NPC->enemy )
{
if ( NPC->client->ps.weapon != WP_IMPERIAL_BLADE && NPC->client->ps.weapon != WP_KLINGON_BLADE )
{//looking right at enemy during melee looks odd
NPC_SetLookTarget( NPC, NPC->enemy->s.number, 0 );
}
}
}
if ( NPC->enemy )
{
if(NPC->enemy->flags & FL_DONT_SHOOT)
{
ucmd.buttons &= ~BUTTON_ATTACK;
}
if(client->ps.weaponstate == WEAPON_IDLE)
{
client->ps.weaponstate = WEAPON_READY;
}
}
else
{
if(client->ps.weaponstate == WEAPON_READY)
{
client->ps.weaponstate = WEAPON_IDLE;
}
}
if(!(ucmd.buttons & BUTTON_ATTACK) && NPC->attackDebounceTime > level.time)
{//We just shot but aren't still shooting, so hold the gun up for a while
if(client->ps.weapon == WP_PHASER )
{//One-handed
NPC_SetAnim(NPC,SETANIM_TORSO,TORSO_WEAPONREADY1,SETANIM_FLAG_NORMAL);
}
else if(client->ps.weapon == WP_COMPRESSION_RIFLE)
{//Sniper pose
NPC_SetAnim(NPC,SETANIM_TORSO,TORSO_WEAPONREADY2,SETANIM_FLAG_NORMAL);
}
/*//FIXME: What's the proper solution here?
else
{//heavy weapon
NPC_SetAnim(NPC,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL);
}
*/
}
else if (!NPC->enemy && bState != BS_FORMATION)//HACK!
{
if(client->ps.weapon != WP_TRICORDER)
{
if((NPC->s.torsoAnim&~ANIM_TOGGLEBIT) == TORSO_WEAPONREADY1 || (NPC->s.torsoAnim&~ANIM_TOGGLEBIT) == TORSO_WEAPONREADY2)
{//we look ready for action, using one of the first 2 weapon, let's rest our weapon on our shoulder
NPC_SetAnim(NPC,SETANIM_TORSO,TORSO_WEAPONIDLE1,SETANIM_FLAG_NORMAL);
}
}
}
NPC_CheckAttackHold();
NPC_ApplyScriptFlags();
//cliff and wall avoidance
NPC_AvoidWallsAndCliffs();
// run the bot through the server like it was a real client
//=== Save the ucmd for the second no-think Pmove ============================
ucmd.serverTime = level.time - 50;
开发者ID:UberGames,项目名称:SP-Mod-Source-Code,代码行数:67,代码来源:NPC.cpp
示例14: NPC_ExecuteBState
/*
===============
NPC_ExecuteBState
MCG
NPC Behavior state thinking
===============
*/
void NPC_ExecuteBState ( gentity_t *self)//, int msec )
{
bState_t bState;
NPC_HandleAIFlags();
//FIXME: these next three bits could be a function call, some sort of setup/cleanup func
//Lookmode must be reset every think cycle
if(NPC->delayScriptTime && NPC->delayScriptTime <= level.time)
{
G_ActivateBehavior( NPC, BSET_DELAYED);
NPC->delayScriptTime = 0;
}
//Clear this and let bState set it itself, so it automatically handles changing bStates... but we need a set bState wrapper func
NPCInfo->combatMove = qfalse;
//Execute our bState
if(NPCInfo->tempBehavior)
{//Overrides normal behavior until cleared
bState = NPCInfo->tempBehavior;
}
else
{
if(!NPCInfo->behaviorState)
NPCInfo->behaviorState = NPCInfo->defaultBehavior;
bState = NPCInfo->behaviorState;
}
//Pick the proper bstate for us and run it
NPC_RunBehavior( self->client->playerTeam, bState );
if ( NPC->enemy )
{
if ( !NPC->enemy->inuse )
{//just in case bState doesn't catch this
G_ClearEnemy( NPC );
}
}
if ( NPC->client->ps.saberLockTime && NPC->client->ps.saberLockEnemy != ENTITYNUM_NONE )
{
NPC_SetLookTarget( NPC, NPC->client->ps.saberLockEnemy, level.time+1000 );
}
else if ( !NPC_CheckLookTarget( NPC ) )
{
if ( NPC->enemy )
{
NPC_SetLookTarget( NPC, NPC->enemy->s.number, 0 );
}
}
if ( NPC->enemy )
{
if(NPC->enemy->flags & FL_DONT_SHOOT)
{
ucmd.buttons &= ~BUTTON_ATTACK;
ucmd.buttons &= ~BUTTON_ALT_ATTACK;
}
else if ( NPC->client->playerTeam != NPCTEAM_ENEMY && NPC->enemy->NPC && (NPC->enemy->NPC->surrenderTime > level.time || (NPC->enemy->NPC->scriptFlags&SCF_FORCED_MARCH)) )
{//don't shoot someone who's surrendering if you're a good guy
ucmd.buttons &= ~BUTTON_ATTACK;
ucmd.buttons &= ~BUTTON_ALT_ATTACK;
}
if(client->ps.weaponstate == WEAPON_IDLE)
{
client->ps.weaponstate = WEAPON_READY;
}
}
else
{
if(client->ps.weaponstate == WEAPON_READY)
{
client->ps.weaponstate = WEAPON_IDLE;
}
}
if(!(ucmd.buttons & BUTTON_ATTACK) && NPC->attackDebounceTime > level.time)
{//We just shot but aren't still shooting, so hold the gun up for a while
if(client->ps.weapon == WP_SABER )
{//One-handed
NPC_SetAnim(NPC,SETANIM_TORSO,TORSO_WEAPONREADY1,SETANIM_FLAG_NORMAL);
}
else if(client->ps.weapon == WP_BRYAR_PISTOL)
{//Sniper pose
NPC_SetAnim(NPC,SETANIM_TORSO,TORSO_WEAPONREADY3,SETANIM_FLAG_NORMAL);
}
}
//.........这里部分代码省略.........
开发者ID:TheSil,项目名称:base_enhanced,代码行数:101,代码来源:NPC.c
示例15: Pickup_Saber
qboolean Pickup_Saber( gentity_t *self, qboolean hadSaber, gentity_t *pickUpSaber )
{
//NOTE: loopAnim = saberSolo, alt_fire = saberLeftHand, NPC_type = saberType, NPC_targetname = saberColor
qboolean foundIt = qfalse;
if ( !pickUpSaber || !self || !self->client )
{
return qfalse;
}
//G_Rem
|
请发表评论