void ClientEndServerFrame (edict_t *ent) { float bobtime; int i; current_player = ent; current_client = ent->client; // // If the origin or velocity have changed since ClientThink(), // update the pmove values. This will happen when the client // is pushed by a bmodel or kicked by an explosion. // // If it wasn't updated here, the view position would lag a frame // behind the body position when pushed -- "sinking into plats" // for (i=0 ; i<3 ; i++) { current_client->ps.pmove.origin[i] = ent->s.origin[i]*8.0; current_client->ps.pmove.velocity[i] = ent->velocity[i]*8.0; } // // If the end of unit layout is displayed, don't give // the player any normal movement attributes // if (level.intermissiontime) { // FIXME: add view drifting here? current_client->ps.blend[3] = 0; current_client->ps.fov = 90; G_SetStats (ent); return; } AngleVectors (ent->client->v_angle, forward, right, up); // burn from lava, etc P_WorldEffects (); // // set model angles from view angles so other things in // the world can tell which direction you are looking // if (ent->client->v_angle[PITCH] > 180) ent->s.angles[PITCH] = (-360 + ent->client->v_angle[PITCH])/3; else ent->s.angles[PITCH] = ent->client->v_angle[PITCH]/3; ent->s.angles[YAW] = ent->client->v_angle[YAW]; ent->s.angles[ROLL] = 0; ent->s.angles[ROLL] = SV_CalcRoll (ent->s.angles, ent->velocity)*4; // // calculate speed and cycle to be used for // all cyclic walking effects // xyspeed = sqrt(ent->velocity[0]*ent->velocity[0] + ent->velocity[1]*ent->velocity[1]); if (xyspeed < 5) { bobmove = 0; current_client->bobtime = 0; // start at beginning of cycle again } //Kngightmare- exception for wading else if (ent->groundentity || ent->waterlevel == 2) { // so bobbing only cycles when on ground if (xyspeed > 450) // Knightmare added bobmove = 0.50; else if (xyspeed > 210) bobmove = 0.25; else if (!ent->groundentity && ent->waterlevel == 2 && xyspeed > 100) bobmove = 0.45; else if (xyspeed > 100) bobmove = 0.125; else if (!ent->groundentity && ent->waterlevel == 2) bobmove = 0.325; else bobmove = 0.0625; } bobtime = (current_client->bobtime += bobmove); if (current_client->ps.pmove.pm_flags & PMF_DUCKED) bobtime *= 4; bobcycle = (int)bobtime; // Lazarus: vehicle drivers don't bob if(ent->vehicle) bobfracsin = 0.; else bobfracsin = fabs(sin(bobtime*M_PI)); // detect hitting the floor P_FallingDamage (ent); // Lazarus: detect hitting walls P_SlamDamage (ent); // apply all the damage taken this frame P_DamageFeedback (ent); // determine the view offsets SV_CalcViewOffset (ent); // determine the gun offsets SV_CalcGunOffset (ent); // determine the full screen color blend // must be after viewoffset, so eye contents can be // accurately determined // FIXME: with client prediction, the contents // should be determined by the client SV_CalcBlend (ent); // chase cam stuff if (ent->client->resp.spectator) G_SetSpectatorStats(ent); //ZOID else //if (!ent->client->chase_target) //ZOID G_SetStats (ent); G_CheckChaseStats(ent); G_SetClientEvent (ent); G_SetClientEffects (ent); G_SetClientSound (ent); G_SetClientFrame (ent); VectorCopy (ent->velocity, ent->client->oldvelocity); VectorCopy (ent->client->ps.viewangles, ent->client->oldviewangles); // clear weapon kicks VectorClear (ent->client->kick_origin); VectorClear (ent->client->kick_angles); // if the scoreboard is up, update it if (!(level.framenum & 31)) { if (ent->client->showscores) { if (ent->client->menu) { // PMenu_Update(ent); PMenu_Do_Update(ent); ent->client->menudirty = false; ent->client->menutime = level.time; } else if (ent->client->textdisplay) Text_Update(ent); else DeathmatchScoreboardMessage (ent, ent->enemy); gi.unicast (ent, false); } else if(ent->client->whatsit) WhatsIt(ent); } // tpp if (ent->client->chasetoggle == 1) CheckChasecam_Viewent(ent); // end tpp }
void G_SetStats (edict_t *ent) { gitem_t *item; int index, cells; int power_armor_type; // // health // ent->client->ps.stats[STAT_HEALTH_ICON] = level.pic_health; ent->client->ps.stats[STAT_HEALTH] = ent->health; // // ammo // if (!ent->client->ammo_index ) { ent->client->ps.stats[STAT_AMMO_ICON] = 0; ent->client->ps.stats[STAT_AMMO] = 0; } else { item = &itemlist[ent->client->ammo_index]; ent->client->ps.stats[STAT_AMMO_ICON] = gi.imageindex (item->icon); ent->client->ps.stats[STAT_AMMO] = ent->client->pers.inventory[ent->client->ammo_index]; } // // armor // power_armor_type = PowerArmorType (ent); if (power_armor_type) { cells = ent->client->pers.inventory[ITEM_INDEX(FindItem ("cells"))]; if (cells == 0) { // ran out of cells for power armor ent->flags &= ~(FL_POWER_SHIELD|FL_POWER_SCREEN); gi.sound(ent, CHAN_ITEM, gi.soundindex("misc/power2.wav"), 1, ATTN_NORM, 0); power_armor_type = 0; } } index = ArmorIndex (ent); // Knightmare- show correct icon if ((power_armor_type == POWER_ARMOR_SHIELD) && (!index || (level.framenum & 8) ) ) { // flash between power armor and other armor icon ent->client->ps.stats[STAT_ARMOR_ICON] = gi.imageindex ("i_powershield"); ent->client->ps.stats[STAT_ARMOR] = cells; } else if ((power_armor_type == POWER_ARMOR_SCREEN) && (!index || (level.framenum & 8) ) ) { // flash between power armor and other armor icon ent->client->ps.stats[STAT_ARMOR_ICON] = gi.imageindex ("i_powerscreen"); ent->client->ps.stats[STAT_ARMOR] = cells; } else if (index) { item = GetItemByIndex (index); ent->client->ps.stats[STAT_ARMOR_ICON] = gi.imageindex (item->icon); ent->client->ps.stats[STAT_ARMOR] = ent->client->pers.inventory[index]; } else { ent->client->ps.stats[STAT_ARMOR_ICON] = 0; ent->client->ps.stats[STAT_ARMOR] = 0; } // // pickup message // if (level.time > ent->client->pickup_msg_time) { ent->client->ps.stats[STAT_PICKUP_ICON] = 0; ent->client->ps.stats[STAT_PICKUP_STRING] = 0; } // // timers // if (ent->client->quad_framenum > level.framenum) { ent->client->ps.stats[STAT_TIMER_ICON] = gi.imageindex ("p_quad"); ent->client->ps.stats[STAT_TIMER] = (ent->client->quad_framenum - level.framenum)/10; } else if (ent->client->invincible_framenum > level.framenum) { ent->client->ps.stats[STAT_TIMER_ICON] = gi.imageindex ("p_invulnerability"); ent->client->ps.stats[STAT_TIMER] = (ent->client->invincible_framenum - level.framenum)/10; } else if (ent->client->enviro_framenum > level.framenum) { ent->client->ps.stats[STAT_TIMER_ICON] = gi.imageindex ("p_envirosuit"); ent->client->ps.stats[STAT_TIMER] = (ent->client->enviro_framenum - level.framenum)/10; } else if (ent->client->breather_framenum > level.framenum) { ent->client->ps.stats[STAT_TIMER_ICON] = gi.imageindex ("p_rebreather"); ent->client->ps.stats[STAT_TIMER] = (ent->client->breather_framenum - level.framenum)/10; } #ifdef JETPACK_MOD else if ( (ent->client->jetpack) && (!ent->client->jetpack_infinite) && (ent->client->pers.inventory[fuel_index] >= 0) && (ent->client->pers.inventory[fuel_index] < 100000)) { ent->client->ps.stats[STAT_TIMER_ICON] = gi.imageindex("p_jet"); ent->client->ps.stats[STAT_TIMER] = ent->client->pers.inventory[fuel_index]; } #endif else if (level.freeze) { ent->client->ps.stats[STAT_TIMER_ICON] = gi.imageindex ("p_freeze"); ent->client->ps.stats[STAT_TIMER] = stasis_time->value - level.freezeframes/10; } else { ent->client->ps.stats[STAT_TIMER_ICON] = 0; ent->client->ps.stats[STAT_TIMER] = 0; } // // selected item // if (ent->client->pers.selected_item == -1) ent->client->ps.stats[STAT_SELECTED_ICON] = 0; else ent->client->ps.stats[STAT_SELECTED_ICON] = gi.imageindex (itemlist[ent->client->pers.selected_item].icon); ent->client->ps.stats[STAT_SELECTED_ITEM] = ent->client->pers.selected_item; // Lazarus vehicle/tracktrain // Knightmare- speed bar for CTF if (ctf->value) { if(ent->vehicle && !(ent->vehicle->spawnflags & 16)) { switch(ent->vehicle->moveinfo.state) { case -3: ent->client->ps.stats[STAT_SPEED_CTF] = gi.imageindex("speedr3"); break; case -2: ent->client->ps.stats[STAT_SPEED_CTF] = gi.imageindex("speedr2"); break; case -1: ent->client->ps.stats[STAT_SPEED_CTF] = gi.imageindex("speedr1"); break; case 1: ent->client->ps.stats[STAT_SPEED_CTF] = gi.imageindex("speed1"); break; case 2: ent->client->ps.stats[STAT_SPEED_CTF] = gi.imageindex("speed2"); break; case 3: ent->client->ps.stats[STAT_SPEED_CTF] = gi.imageindex("speed3"); break; default: ent->client->ps.stats[STAT_SPEED_CTF] = gi.imageindex("speed0"); break; } } else ent->client->ps.stats[STAT_SPEED_CTF] = 0; } else { if(ent->vehicle && !(ent->vehicle->spawnflags & 16)) { switch(ent->vehicle->moveinfo.state) { case -3: ent->client->ps.stats[STAT_SPEED] = gi.imageindex("speedr3"); break; case -2: ent->client->ps.stats[STAT_SPEED] = gi.imageindex("speedr2"); break; case -1: ent->client->ps.stats[STAT_SPEED] = gi.imageindex("speedr1"); break; case 1: ent->client->ps.stats[STAT_SPEED] = gi.imageindex("speed1"); break; case 2: ent->client->ps.stats[STAT_SPEED] = gi.imageindex("speed2"); break; case 3: ent->client->ps.stats[STAT_SPEED] = gi.imageindex("speed3"); break; default: ent->client->ps.stats[STAT_SPEED] = gi.imageindex("speed0"); break; } } else ent->client->ps.stats[STAT_SPEED] = 0; } // "whatsit" if (world->effects & FX_WORLDSPAWN_WHATSIT) { if (ent->client->showscores || ent->client->showhelp || ent->client->showinventory) ent->client->whatsit = NULL; else if(!(level.framenum % 5)) // only update every 1/2 second { char *temp = ent->client->whatsit; ent->client->whatsit = NULL; WhatIsIt(ent); if(ent->client->whatsit && !temp) WhatsIt(ent); } } else ent->client->whatsit = NULL; // // layouts // ent->client->ps.stats[STAT_LAYOUTS] = 0; if (deathmatch->value) { if (ent->client->pers.health <= 0 || level.intermissiontime || ent->client->showscores) ent->client->ps.stats[STAT_LAYOUTS] |= 1; if (ent->client->showinventory && ent->client->pers.health > 0) ent->client->ps.stats[STAT_LAYOUTS] |= 2; } else { if (ent->client->showscores || ent->client->showhelp) ent->client->ps.stats[STAT_LAYOUTS] |= 1; if (ent->client->showinventory && ent->client->pers.health > 0) ent->client->ps.stats[STAT_LAYOUTS] |= 2; } if(!ent->client->ps.stats[STAT_LAYOUTS] && ent->client->whatsit) ent->client->ps.stats[STAT_LAYOUTS] |= 1; // // frags // ent->client->ps.stats[STAT_FRAGS] = ent->client->resp.score; // // help icon / current weapon if not shown // if (ent->client->pers.helpchanged && (level.framenum&8) ) ent->client->ps.stats[STAT_HELPICON] = gi.imageindex ("i_help"); else if ( (ent->client->pers.hand == CENTER_HANDED || ent->client->ps.fov > 91) && ent->client->pers.weapon) ent->client->ps.stats[STAT_HELPICON] = gi.imageindex (ent->client->pers.weapon->icon); else ent->client->ps.stats[STAT_HELPICON] = 0; ent->client->ps.stats[STAT_SPECTATOR] = 0; if(ent->client->zoomed) ent->client->ps.stats[STAT_ZOOM] = gi.imageindex("zoom"); else ent->client->ps.stats[STAT_ZOOM] = 0; //ZOID SetCTFStats(ent); //ZOID // Knightmare- show tech icon if in DM if (deathmatch->value && !ctf->value) { int i = 0; gitem_t *tech; ent->client->ps.stats[STAT_CTF_TECH] = 0; while (tnames[i]) { if ((tech = FindItemByClassname(tnames[i])) != NULL && ent->client->pers.inventory[ITEM_INDEX(tech)]) { ent->client->ps.stats[STAT_CTF_TECH] = gi.imageindex(tech->icon); break; } i++; } } // end Knightmare }