void PlayerPostThink() { float vel; //dprint ("post think\n"); /* FIXME: really comment? if (intermission_running) { setorigin (self, intermission_spot.origin); self.velocity = VEC_ORIGIN; // don't stray off the intermission spot too far return; } */ if( k_pause ) { ImpulseCommands(); return; } if ( self->s.v.view_ofs[0] == 0 && self->s.v.view_ofs[1] == 0 && self->s.v.view_ofs[2] == 0 ) return; // intermission or finale if ( self->s.v.deadflag ) return; //team // WaterMove function call moved here from PlayerPreThink to avoid // occurrence of the spawn lavaburn bug and to fix the problem on spawning // and playing the leave water sound if the player died underwater. WaterMove (); // clear the flag if we landed if( (int)self->s.v.flags & FL_ONGROUND ) self->brokenankle = 0; // check to see if player landed and play landing sound if ( ( self->jump_flag < -300 ) && ( ( ( int ) ( self->s.v.flags ) ) & FL_ONGROUND ) ) { // Falling often results in 5-5 points of damage through 2 frames. // This fixes the bug self->s.v.velocity[2] = 0; if ( self->s.v.watertype == CONTENT_WATER ) sound( self, CHAN_BODY, "player/h2ojump.wav", 1, ATTN_NORM ); else if ( self->jump_flag < jumpf_flag ) { gedict_t *gre = PROG_TO_EDICT ( self->s.v.groundentity ); if ( self->s.v.waterlevel < 2 ) { // Jawnmode: fallbunny is always enabled, but with a modification: speed is capped // - Molgrum if ( get_fallbunny() ) { vel = vlen( other->old_vel ) * ( 1.0 - cvar( "k_fallbunny_cap" ) / 100.0 ); VectorScale( g_globalvars.v_forward, vel, other->s.v.velocity ); } else { self->brokenankle = 1; // Yes we have just broken it } } self->deathtype = dtFALL; T_Damage( self, world, world, 5 ); sound( self, CHAN_VOICE, "player/land2.wav", 1, ATTN_NORM ); if ( gre && gre->s.v.takedamage == DAMAGE_AIM && gre != self ) { // we landed on someone's head, hurt him gre->deathtype = dtSTOMP; T_Damage (gre, self, self, 10); } } else sound( self, CHAN_VOICE, "player/land.wav", 1, ATTN_NORM ); } self->jump_flag = self->s.v.velocity[2]; CheckPowerups(); CheckStuffRune(); mv_record(); W_WeaponFrame(); #ifdef VWEP_TEST // update vwep frame if(!strnull(ezinfokey(world, "vwep")) && vw_available > 0) { if (self->s.v.health <= 0) { self->vw_index = 0; self->vw_frame = 0; } else self->vw_frame = self->s.v.frame; } #endif { float velocity = sqrt(self->s.v.velocity[0] * self->s.v.velocity[0] + self->s.v.velocity[1] * self->s.v.velocity[1]); if ( !match_in_progress && !match_over && !k_captains ) { if ( iKey( self, "kf" ) & KF_SPEED ) { float velocity_vert_abs = fabs(self->s.v.velocity[2]); self->s.v.armorvalue = (int)(velocity < 1000 ? velocity + 1000 : -velocity); self->s.v.frags = (int)(velocity) / 1000; self->s.v.ammo_shells = 100 + (int)(velocity_vert_abs) / 100000000; self->s.v.ammo_nails = 100 + (int)(velocity_vert_abs) % 1000000 / 10000; self->s.v.ammo_rockets = 100 + (int)(velocity_vert_abs) % 10000 / 100; self->s.v.ammo_cells = 100 + (int)(velocity_vert_abs) % 100; } else { self->s.v.armorvalue = 1000; self->s.v.frags = 0; } } if( match_in_progress == 2 ) { self->ps.vel_frames++; self->ps.velocity_sum += velocity; if (self->ps.velocity_max < velocity) self->ps.velocity_max = velocity; } } }