int Pickup_Weapon (gentity_t *ent, gentity_t *other) { int quantity; qboolean hadWeapon = qfalse; /* if ( ent->count || (ent->activator && !ent->activator->s.number) ) { quantity = ent->count; } else { quantity = ent->item->quantity; } */ // dropped items are always picked up if ( ent->flags & FL_DROPPED_ITEM ) { quantity = ent->count; } else {//wasn't dropped quantity = ent->item->quantity?ent->item->quantity:50; } // add the weapon if ( other->client->ps.stats[STAT_WEAPONS] & ( 1 << ent->item->giTag ) ) { hadWeapon = qtrue; } other->client->ps.stats[STAT_WEAPONS] |= ( 1 << ent->item->giTag ); if ( ent->item->giTag == WP_SABER && (!hadWeapon || ent->NPC_type != NULL) ) {//didn't have a saber or it is specifying a certain kind of saber to use if ( !Pickup_Saber( other, hadWeapon, ent ) ) { return 0; } } if ( other->s.number ) {//NPC if ( other->s.weapon == WP_NONE || ent->item->giTag == WP_SABER ) {//NPC with no weapon picked up a weapon, change to this weapon //FIXME: clear/set the alt-fire flag based on the picked up weapon and my class? other->client->ps.weapon = ent->item->giTag; other->client->ps.weaponstate = WEAPON_RAISING; ChangeWeapon( other, ent->item->giTag ); if ( ent->item->giTag == WP_SABER ) { other->client->ps.SaberActivate(); WP_SaberAddG2SaberModels( other ); } else { G_CreateG2AttachedWeaponModel( other, weaponData[ent->item->giTag].weaponMdl, other->handRBolt, 0 ); } } } if ( ent->item->giTag == WP_SABER ) {//picked up a saber if ( other->s.weapon != WP_SABER ) {//player picking up saber other->client->ps.weapon = WP_SABER; other->client->ps.weaponstate = WEAPON_RAISING; if ( other->s.number < MAX_CLIENTS ) {//make sure the cgame-side knows this CG_ChangeWeapon( WP_SABER ); } else {//make sure the cgame-side knows this ChangeWeapon( other, WP_SABER ); } } if ( !other->client->ps.SaberActive() ) {//turn it/them on! other->client->ps.SaberActivate(); } } if ( quantity ) { // Give ammo Add_Ammo( other, ent->item->giTag, quantity ); } return 5; }
void ExitEmplacedWeapon( gentity_t *ent ) { // requesting to unlock from the weapon // We'll leave the gun pointed in the direction it was last facing, though we'll cut out the pitch if ( ent->client ) { // if we are the player we will have put down a brush that blocks NPCs so that we have a clear spot to get back out. //gentity_t *place = G_Find( NULL, FOFS(classname), "emp_placeholder" ); if ( ent->health > 0 ) {//he's still alive, and we have a placeholder, so put him back if ( ent->owner->nextTrain ) { // reset the players position VectorCopy( ent->owner->nextTrain->currentOrigin, ent->client->ps.origin ); //reset ent's size to normal VectorCopy( ent->owner->nextTrain->mins, ent->mins ); VectorCopy( ent->owner->nextTrain->maxs, ent->maxs ); //free the placeholder G_FreeEntity( ent->owner->nextTrain ); //re-link the ent gi.linkentity( ent ); } else if ( ent->owner->e_UseFunc == useF_eweb_use )//yeah, crappy way to check this, but... { // so give 'em a push away from us vec3_t backDir, start, end; trace_t trace; gentity_t *eweb = ent->owner; float curRadius = 0.0f; float minRadius, maxRadius; qboolean safeExit = qfalse; VectorSubtract( ent->currentOrigin, eweb->currentOrigin, backDir ); backDir[2] = 0; minRadius = VectorNormalize( backDir )-8.0f; maxRadius = (ent->maxs[0]+ent->maxs[1])*0.5f; maxRadius += (eweb->maxs[0]+eweb->maxs[1])*0.5f; maxRadius *= 1.5f; if ( minRadius >= maxRadius - 1.0f ) { maxRadius = minRadius + 8.0f; } ent->owner = NULL;//so his trace hits me for ( curRadius = minRadius; curRadius <= maxRadius; curRadius += 4.0f ) { VectorMA( ent->currentOrigin, curRadius, backDir, start ); //make sure they're not in the ground VectorCopy( start, end ); start[2] += 18; end[2] -= 18; gi.trace(&trace, start, ent->mins, ent->maxs, end, ent->s.number, ent->clipmask, (EG2_Collision)0, 0); if ( !trace.allsolid && !trace.startsolid ) { G_SetOrigin( ent, trace.endpos ); gi.linkentity( ent ); safeExit = qtrue; break; } } //Hmm... otherwise, don't allow them to get off? ent->owner = eweb; if ( !safeExit ) {//don't try again for a second ent->owner->delay = level.time + 500; return; } } } else if ( ent->health <= 0 ) { // dead, so give 'em a push out of the chair vec3_t dir; AngleVectors( ent->owner->s.angles, NULL, dir, NULL ); if ( rand() & 1 ) { VectorScale( dir, -1, dir ); } VectorMA( ent->client->ps.velocity, 75, dir, ent->client->ps.velocity ); } //don't let them move towards me for a couple frames so they don't step back into me while I'm becoming solid to them if ( ent->s.number < MAX_CLIENTS ) { if ( ent->client->ps.pm_time < 100 ) { ent->client->ps.pm_time = 100; } ent->client->ps.pm_flags |= (PMF_TIME_NOFRICTION|PMF_TIME_KNOCKBACK); } if ( !ent->owner->bounceCount ) {//not an EWeb - the overridden bone angles will remember the angle we left it at VectorCopy( ent->client->ps.viewangles, ent->owner->s.angles ); ent->owner->s.angles[PITCH] = 0; G_SetAngles( ent->owner, ent->owner->s.angles ); VectorCopy( ent->owner->s.angles, ent->owner->pos1 ); } } // Remove the emplaced gun from our inventory ent->client->ps.stats[STAT_WEAPONS] &= ~( 1 << WP_EMPLACED_GUN ); extern void ChangeWeapon( gentity_t *ent, int newWeapon ); extern void CG_ChangeWeapon( int num ); if ( ent->health <= 0 ) {//when die, don't set weapon back on when ejected from emplaced/eweb //empty hands ent->client->ps.weapon = WP_NONE; if ( ent->NPC ) { ChangeWeapon( ent, ent->client->ps.weapon ); // should be OK actually. } else { CG_ChangeWeapon( ent->client->ps.weapon ); } if ( ent->s.number < MAX_CLIENTS ) { gi.cvar_set( "cg_thirdperson", "1" ); } } else { // when we lock or unlock from the the gun, we get our old weapon back ent->client->ps.weapon = ent->owner->s.weapon; if ( ent->NPC ) {//BTW, if a saber-using NPC ever gets off of an emplaced gun/eweb, this will not work, look at NPC_ChangeWeapon for the proper way ChangeWeapon( ent, ent->client->ps.weapon ); } else { G_RemoveWeaponModels( ent ); CG_ChangeWeapon( ent->client->ps.weapon ); if ( ent->client->ps.weapon == WP_SABER ) { WP_SaberAddG2SaberModels( ent ); } else { G_CreateG2AttachedWeaponModel( ent, weaponData[ent->client->ps.weapon].weaponMdl, ent->handRBolt, 0 ); } if ( ent->s.number < MAX_CLIENTS ) { if ( ent->client->ps.weapon == WP_SABER ) { gi.cvar_set( "cg_thirdperson", "1" ); } else if ( ent->client->ps.weapon != WP_SABER && cg_gunAutoFirst.integer ) { gi.cvar_set( "cg_thirdperson", "0" ); } } } if ( ent->client->ps.weapon == WP_SABER ) { if ( ent->owner->alt_fire ) { ent->client->ps.SaberActivate(); } else { ent->client->ps.SaberDeactivate(); } } } //set the emplaced gun/eweb's weapon back to the emplaced gun ent->owner->s.weapon = WP_EMPLACED_GUN; // gi.G2API_DetachG2Model( &ent->ghoul2[ent->playerModel] ); ent->s.eFlags &= ~EF_LOCKED_TO_WEAPON; ent->client->ps.eFlags &= ~EF_LOCKED_TO_WEAPON; ent->owner->noDamageTeam = TEAM_FREE; ent->owner->svFlags &= ~SVF_NONNPC_ENEMY; ent->owner->delay = level.time; ent->owner->activator = NULL; if ( !ent->NPC ) { // by keeping the owner, a dead npc can be pushed out of the chair without colliding with it ent->owner = NULL; } }
int Pickup_Weapon (gentity_t *ent, gentity_t *other) { int quantity; qboolean hadWeapon = qfalse; /* if ( ent->count || (ent->activator && !ent->activator->s.number) ) { quantity = ent->count; } else { quantity = ent->item->quantity; } */ // dropped items are always picked up if ( ent->flags & FL_DROPPED_ITEM ) { quantity = ent->count; } else {//wasn't dropped quantity = ent->item->quantity?ent->item->quantity:50; } // add the weapon if ( other->client->ps.stats[STAT_WEAPONS] & ( 1 << ent->item->giTag ) ) { hadWeapon = qtrue; } other->client->ps.stats[STAT_WEAPONS] |= ( 1 << ent->item->giTag ); if ( ent->item->giTag == WP_SABER && !hadWeapon ) { WP_SaberInitBladeData( other ); } if ( other->s.number ) {//NPC if ( other->s.weapon == WP_NONE ) {//NPC with no weapon picked up a weapon, change to this weapon //FIXME: clear/set the alt-fire flag based on the picked up weapon and my class? other->client->ps.weapon = ent->item->giTag; other->client->ps.weaponstate = WEAPON_RAISING; ChangeWeapon( other, ent->item->giTag ); if ( ent->item->giTag == WP_SABER ) { other->client->ps.saberActive = qtrue; G_CreateG2AttachedWeaponModel( other, other->client->ps.saberModel ); } else { G_CreateG2AttachedWeaponModel( other, weaponData[ent->item->giTag].weaponMdl ); } } } if ( quantity ) { // Give ammo Add_Ammo( other, ent->item->giTag, quantity ); } return 5; }