本文整理匯總了C++中BG_PlayerStateToEntityState函數的典型用法代碼示例。如果您正苦於以下問題:C++ BG_PlayerStateToEntityState函數的具體用法?C++ BG_PlayerStateToEntityState怎麽用?C++ BG_PlayerStateToEntityState使用的例子?那麽, 這裏精選的函數代碼示例或許可以為您提供幫助。
在下文中一共展示了BG_PlayerStateToEntityState函數的15個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的C++代碼示例。
示例1: TeleportPlayer
void TeleportPlayer( gentity_t *player, vec3_t origin, vec3_t angles )
{
// unlink to make sure it can't possibly interfere with G_KillBox
trap_UnlinkEntity( player );
VectorCopy( origin, player->client->ps.origin );
player->client->ps.origin[ 2 ] += 1;
// spit the player out
AngleVectors( angles, player->client->ps.velocity, NULL, NULL );
VectorScale( player->client->ps.velocity, 400, player->client->ps.velocity );
player->client->ps.pm_time = 160; // hold time
player->client->ps.pm_flags |= PMF_TIME_KNOCKBACK;
// toggle the teleport bit so the client knows to not lerp
player->client->ps.eFlags ^= EF_TELEPORT_BIT;
G_UnlaggedClear( player );
// cut all relevant zap beams
G_ClearPlayerZapEffects( player );
// set angles
G_SetClientViewAngle( player, angles );
// save results of pmove
BG_PlayerStateToEntityState( &player->client->ps, &player->s, qtrue );
// use the precise origin for linking
VectorCopy( player->client->ps.origin, player->r.currentOrigin );
if ( player->client->sess.spectatorState == SPECTATOR_NOT )
{
// kill anything at the destination
G_KillBox( player );
trap_LinkEntity( player );
}
}
示例2: TeleportPlayer
void TeleportPlayer( gentity_t *player, vec3_t origin, vec3_t angles ) {
gentity_t *tent;
// use temp events at source and destination to prevent the effect
// from getting dropped by a second player event
#ifndef SMOKINGUNS
if ( player->client->sess.sessionTeam != TEAM_SPECTATOR ) {
#else
if ( player->client->sess.sessionTeam < TEAM_SPECTATOR ) {
#endif
tent = G_TempEntity( player->client->ps.origin, EV_PLAYER_TELEPORT_OUT );
tent->s.clientNum = player->s.clientNum;
tent = G_TempEntity( origin, EV_PLAYER_TELEPORT_IN );
tent->s.clientNum = player->s.clientNum;
}
// unlink to make sure it can't possibly interfere with G_KillBox
trap_UnlinkEntity (player);
VectorCopy ( origin, player->client->ps.origin );
player->client->ps.origin[2] += 1;
// spit the player out
AngleVectors( angles, player->client->ps.velocity, NULL, NULL );
VectorScale( player->client->ps.velocity, 400, player->client->ps.velocity );
player->client->ps.pm_time = 160; // hold time
player->client->ps.pm_flags |= PMF_TIME_KNOCKBACK;
// toggle the teleport bit so the client knows to not lerp
player->client->ps.eFlags ^= EF_TELEPORT_BIT;
#ifdef SMOKINGUNS
//unlagged - backward reconciliation #3
// we don't want players being backward-reconciled back through teleporters
G_ResetHistory( player );
//unlagged - backward reconciliation #3
#endif
// set angles
SetClientViewAngle( player, angles );
// kill anything at the destination
#ifndef SMOKINGUNS
if ( player->client->sess.sessionTeam != TEAM_SPECTATOR ) {
#else
if ( player->client->sess.sessionTeam < TEAM_SPECTATOR ) {
#endif
G_KillBox (player);
#ifdef SMOKINGUNS
// Tequila comment: G_KillBox will set dontTelefrag as needed
if (player->client->dontTelefrag) {
#ifdef DEBUG_TELEFRAG_CASE
G_Printf(S_COLOR_MAGENTA "TeleportPlayer: Telefrag case delayed at respawn for %s...\n",player->client->pers.netname);
#endif
trap_SendServerCommand( player->s.clientNum, va("print \"Go away %s\n\"",player->client->pers.netname) );
// So we will link the player entity later with normal content
player->r.contents = 0;
}
#endif
}
// save results of pmove
BG_PlayerStateToEntityState( &player->client->ps, &player->s, qtrue );
// use the precise origin for linking
VectorCopy( player->client->ps.origin, player->r.currentOrigin );
#ifndef SMOKINGUNS
if ( player->client->sess.sessionTeam != TEAM_SPECTATOR ) {
#else
if ( player->client->sess.sessionTeam < TEAM_SPECTATOR ) {
#endif
trap_LinkEntity (player);
}
}
/*QUAKED misc_teleporter_dest (1 0 0) (-32 -32 -24) (32 32 -16)
Point teleporters at these.
Now that we don't have teleport destination pads, this is just
an info_notnull
*/
void SP_misc_teleporter_dest( gentity_t *ent ) {
}
#ifdef SMOKINGUNS
// Imported from WoP OpenSource project
//===========================================================
/*QUAKED misc_externalmodel (1 0 0) (-16 -16 -16) (16 16 16)
"model" arbitrary .md3 file to display
"wait" time in seconds before the animation begins
*/
#define ANIMATION_THINKTIME 50
static void Think_AnimationExternalmodel( gentity_t *ent ) {
if(ent->animationEnd>ent->animationStart) {
//.........這裏部分代碼省略.........
示例3: CG_TransitionSnapshot
/*
===================
CG_TransitionSnapshot
The transition point from snap to nextSnap has passed
===================
*/
static void CG_TransitionSnapshot( void ) {
centity_t *cent;
snapshot_t *oldFrame;
int i, id;
if ( !cg.snap ) {
CG_Error( "CG_TransitionSnapshot: NULL cg.snap" );
}
if ( !cg.nextSnap ) {
CG_Error( "CG_TransitionSnapshot: NULL cg.nextSnap" );
}
// execute any server string commands before transitioning entities
CG_ExecuteNewServerCommands( cg.nextSnap->serverCommandSequence );
// if we had a map_restart, set everthing with initial
if ( !(cg.snap) || !(cg.nextSnap) ) {
return;
}
// rain - I hate doing things like this for enums. Oh well.
memset(&oldValid, 0, sizeof(oldValid));
// clear the currentValid flag for all entities in the existing snapshot
for ( i = 0 ; i < cg.snap->numEntities ; i++ ) {
cent = &cg_entities[ cg.snap->entities[ i ].number ];
cent->currentValid = qfalse;
oldValid[cg.snap->entities[i].number] = qtrue;
}
// OSP -- check for MV updates from new snapshot info
#ifdef MV_SUPPORT
if(cg.snap->ps.powerups[PW_MVCLIENTLIST] != cg.mvClientList) {
CG_mvProcessClientList();
}
#endif
// move nextSnap to snap and do the transitions
oldFrame = cg.snap;
cg.snap = cg.nextSnap;
if( cg.snap->ps.clientNum == cg.clientNum ) {
if( cg.xp < cg.snap->ps.stats[STAT_XP] ) {
cg.xpChangeTime = cg.time;
}
cg.xp = cg.snap->ps.stats[STAT_XP];
}
BG_PlayerStateToEntityState( &cg.snap->ps, &cg_entities[ cg.snap->ps.clientNum ].currentState, qfalse );
cg_entities[ cg.snap->ps.clientNum ].interpolate = qfalse;
for ( i = 0 ; i < cg.snap->numEntities ; i++ ) {
id = cg.snap->entities[ i ].number;
CG_TransitionEntity( &cg_entities[ id ] );
// rain - #374 - ent doesn't exist in this frame, reset it.
// this is to fix the silent landmines bug, which is caused
// by a stale miscTime in the cent
if (cg_entities[id].currentValid == qfalse && oldValid[id] == qtrue) {
CG_ResetEntity(&cg_entities[id]);
}
if(cg.mvTotalClients > 0 && CG_mvMergedClientLocate(id)) {
CG_mvUpdateClientInfo(id);
}
}
if(cg.mvTotalClients > 0) {
CG_mvTransitionPlayerState(&cg.snap->ps);
}
cg.nextSnap = NULL;
// check for playerstate transition events
if ( oldFrame ) {
playerState_t *ops, *ps;
ops = &oldFrame->ps;
ps = &cg.snap->ps;
// teleporting checks are irrespective of prediction
if ( ( ps->eFlags ^ ops->eFlags ) & EF_TELEPORT_BIT ) {
cg.thisFrameTeleport = qtrue; // will be cleared by prediction code
}
// if we are not doing client side movement prediction for any
// reason, then the client events and view changes will be issued now
if ( cg.demoPlayback || (cg.snap->ps.pm_flags & PMF_FOLLOW)
|| cg_nopredict.integer
#ifdef ALLOW_GSYNC
|| cg_synchronousClients.integer
#endif // ALLOW_GSYNC
) {
//.........這裏部分代碼省略.........
示例4: jp_portal_touch
void jp_portal_touch( gentity_t *self, gentity_t *other, trace_t *trace ) {
//Remove the touch function for a while to avoid flooding
self->genericValue1 = level.time;
self->touch = NULL;
if ( self->s.health != -1 ) {
vector3 tpPos;
vector3 sourceVelocity, destVelocity;
vector3 sourceNormal, destNormal;
//Fetch normals
VectorCopy( &self->s.boneAngles1, &sourceNormal );
VectorCopy( &g_entities[self->s.health].s.boneAngles1, &destNormal );
//Set position to teleport to
VectorCopy( &g_entities[self->s.health].s.origin, &tpPos );
VectorMA( &tpPos, 32.0f, &destNormal, &tpPos );
//BEGIN position
if ( other->client ) {
qboolean isNPC = (other->s.eType == ET_NPC);
uint32_t eFlags = other->client->ps.eFlags ^ EF_TELEPORT_BIT;
VectorCopy( &tpPos, &other->client->ps.origin );
other->client->ps.origin.z += 1.0f;
SetClientViewAngle( other, &other->client->ps.viewangles );
other->client->ps.eFlags ^= EF_TELEPORT_BIT;
BG_PlayerStateToEntityState( &other->client->ps, &other->s, qtrue );
if ( isNPC )
other->s.eType = ET_NPC;
other->s.eFlags = eFlags;
VectorCopy( &other->client->ps.origin, &other->r.currentOrigin );
}
else {
VectorCopy( &tpPos, &other->s.pos.trBase );
}
//END position
//BEGIN velocity
if ( other->client ) {//Players and NPCs
float reflectFactor;
vector3 exitVector;
vector3 velNormal;
float length;
vector3 debugLine;
VectorNormalize2( &other->client->ps.velocity, &velNormal );
reflectFactor = 2 * DotProduct( &sourceNormal, &velNormal );
VectorCopy( &other->client->ps.velocity, &sourceVelocity );
length = VectorLength( &sourceVelocity );
exitVector.x = velNormal.x - reflectFactor * sourceNormal.x;
exitVector.y = velNormal.y - reflectFactor * sourceNormal.y;
exitVector.z = velNormal.z - reflectFactor * sourceNormal.z;
VectorMA( &self->s.origin, -128.0f, &velNormal, &debugLine );
G_TestLine( &debugLine, &self->s.origin, 0xF0, 7500 );
MatrixMultiply3f( self->portal_matrix, &exitVector, &destVelocity );
VectorMA( &g_entities[self->s.health].s.origin, 128.0f, &destVelocity, &debugLine );
G_TestLine( &g_entities[self->s.health].s.origin, &debugLine, 0x0F, 7500 );
VectorScale( &destVelocity, length, &destVelocity );
}
else {//Projectiles
byteAlias_t ba;
float velocity;
ba.i = other->genericValue1; // stored during missile creation
velocity = ba.f;
// VectorScale( destNormal, velocity, other->s.pos.trDelta );
VectorMA( &other->s.pos.trBase, velocity, &destNormal, &other->s.pos.trDelta );
other->s.pos.trTime = level.time;
other->nextthink = level.time + other->genericValue2;
}
//VectorSet( destVelocity, destNormal.x*speed, destNormal.y*speed, destNormal.z*speed );
if ( other->client ) {//Players and NPCs
VectorCopy( &destVelocity, &other->client->ps.velocity );
other->client->ps.pm_flags |= PMF_DUCKED;
other->s.solid = 0;
}
else {//Projectiles
VectorCopy( &destVelocity, &other->s.pos.trDelta );
VectorCopy( &tpPos, &other->r.currentOrigin );
}
//END velocity
g_entities[self->s.health].genericValue1 = level.time;
g_entities[self->s.health].touch = NULL;
}
return;
}
示例5: ClientEndFrame
/*
==============
ClientEndFrame
Called at the end of each server frame for each connected client
A fast client will have multiple ClientThink for each ClientEndFrame,
while a slow client may have multiple ClientEndFrame between ClientThink.
==============
*/
void ClientEndFrame(gentity_t *ent) {
int i;
// Nico, flood protection
if (level.time >= (ent->client->sess.nextReliableTime + 1000) &&
ent->client->sess.numReliableCmds) {
ent->client->sess.numReliableCmds--;
// Reset the threshold because they were good for a bit
if (!ent->client->sess.numReliableCmds) {
ent->client->sess.thresholdTime = 0;
}
}
// Nico, update best speeds
if (ent->client->sess.timerunActive) {
float currentSpeed;
currentSpeed = sqrt(ent->client->ps.velocity[0] * ent->client->ps.velocity[0] + ent->client->ps.velocity[1] * ent->client->ps.velocity[1]);
// Nico, update overall max speed
if (currentSpeed > ent->client->sess.overallMaxSpeed) {
ent->client->sess.overallMaxSpeed = currentSpeed;
}
// Nico, update max speed of the current run
if (currentSpeed > ent->client->sess.maxSpeed) {
ent->client->sess.maxSpeed = currentSpeed;
}
}
// used for informing of speclocked teams.
// Zero out here and set only for certain specs
ent->client->ps.powerups[PW_BLACKOUT] = 0;
if ((ent->client->sess.sessionTeam == TEAM_SPECTATOR) || (ent->client->ps.pm_flags & PMF_LIMBO)) { // JPW NERVE
SpectatorClientEndFrame(ent);
return;
}
// turn off any expired powerups
// OSP -- range changed for MV
for (i = 0 ; i < PW_NUM_POWERUPS ; ++i) {
if (i == PW_FIRE || // these aren't dependant on level.time
i == PW_ELECTRIC ||
i == PW_BREATHER ||
ent->client->ps.powerups[i] == 0 // OSP
|| i == PW_OPS_CLASS_1
|| i == PW_OPS_CLASS_2
|| i == PW_OPS_CLASS_3
) {
continue;
}
// OSP -- If we're paused, update powerup timers accordingly.
// Make sure we dont let stuff like CTF flags expire.
if (ent->client->ps.powerups[i] < level.time) {
ent->client->ps.powerups[i] = 0;
}
}
//
// If the end of unit layout is displayed, don't give
// the player any normal movement attributes
//
// burn from lava, etc
P_WorldEffects(ent);
// apply all the damage taken this frame
P_DamageFeedback(ent);
// add the EF_CONNECTION flag if we haven't gotten commands recently
if (level.time - ent->client->lastCmdTime > 1000) {
ent->s.eFlags |= EF_CONNECTION;
} else {
ent->s.eFlags &= ~EF_CONNECTION;
}
ent->client->ps.stats[STAT_HEALTH] = ent->health; // FIXME: get rid of ent->health...
// Gordon: WHY? other ents use it.
G_SetClientSound(ent);
// set the latest infor
// Ridah, fixes jittery zombie movement
if (g_smoothClients.integer) {
BG_PlayerStateToEntityStateExtraPolate(&ent->client->ps, &ent->s, level.time, qfalse);
//.........這裏部分代碼省略.........
示例6: ClientEndFrame
/*
==============
ClientEndFrame
Called at the end of each server frame for each connected client
A fast client will have multiple ClientThink for each ClientEdFrame,
while a slow client may have multiple ClientEndFrame between ClientThink.
==============
*/
void ClientEndFrame(gentity_t * ent)
{
int i, frames;
// clientPersistant_t *pers;
if (ent->client->sess.sessionTeam == TEAM_SPECTATOR) {
SpectatorClientEndFrame(ent);
return;
}
// pers = &ent->client->pers;
// turn off any expired powerups
for (i = 0; i < MAX_POWERUPS; i++) {
if (ent->client->ps.powerups[i] < level.time) {
ent->client->ps.powerups[i] = 0;
}
}
// save network bandwidth
#if 0
if (!g_synchronousClients->integer && ent->client->ps.pm_type == PM_NORMAL) {
// FIXME: this must change eventually for non-sync demo recording
VectorClear(ent->client->ps.viewangles);
}
#endif
//
// If the end of unit layout is displayed, don't give
// the player any normal movement attributes
//
if (level.intermissiontime) {
return;
}
if (ent->client->bleeding)
CheckBleeding(ent); // perform once-a-second actions
// burn from lava, etc
P_WorldEffects(ent);
// apply all the damage taken this frame
P_DamageFeedback(ent);
// Update the clips Amount in weapon for the client
ent->client->ps.stats[STAT_CLIPS] = ent->client->numClips[ent->client->ps.weapon];
ent->client->ps.stats[STAT_HEALTH] = ent->health; // FIXME: get rid of ent->health...
//Elder: bleeding notification
if (ent->client->bleeding || (ent->client->ps.stats[STAT_RQ3] & RQ3_LEGDAMAGE) == RQ3_LEGDAMAGE) {
ent->client->ps.stats[STAT_RQ3] |= RQ3_BANDAGE_NEED;
} else {
ent->client->ps.stats[STAT_RQ3] &= ~RQ3_BANDAGE_NEED;
}
//Moved to pmove.c
//Elder: M4 ride-up/kick -- condition for non-burst and ammo only
if (ent->client->consecutiveShots &&
(ent->client->ps.ammo[WP_M4] <= 0 || ent->client->ps.weaponstate != WEAPON_FIRING)) {
//Restore view after shots if not firing
ent->client->ps.delta_angles[0] =
ANGLE2SHORT(SHORT2ANGLE(ent->client->ps.delta_angles[0]) - ent->client->consecutiveShots * -0.8);//-0.7f);
ent->client->consecutiveShots = 0;
}
// Check to reset our openDoor boolean
if (ent->client->openDoorTime && level.time - ent->client->openDoorTime > MAXDOORTIME) {
ent->client->openDoor = qfalse;
ent->client->openDoorTime = 0;
}
// JBravo: multiple items
if (ent->client->ps.stats[STAT_HOLDABLE_ITEM] & (1 << HI_LASER)) {
//Try to turn the laser on if it's off
if (ent->client->lasersight == NULL)
Laser_Gen(ent, qtrue);
}
//Slicer
if (ent->client->weapon_attempts > 0)
Cmd_Weapon(ent);
G_SetClientSound(ent);
BG_PlayerStateToEntityState(&ent->client->ps, &ent->s, qtrue);
SendPendingPredictableEvents(&ent->client->ps);
// JBravo: unlagged
ent->client->ps.eFlags &= ~EF_CONNECTION;
frames = level.framenum - ent->client->lastUpdateFrame - 1;
if (frames > 2) {
frames = 2;
ent->client->ps.eFlags |= EF_CONNECTION;
//.........這裏部分代碼省略.........
示例7: ClientSpawn
//.........這裏部分代碼省略.........
}
G_AddPredictableEvent( ent, EV_PLAYER_RESPAWN, 0 );
}
}
else if ( client->sess.spectatorState == SPECTATOR_NOT &&
client->pers.team == TEAM_HUMANS )
{
spawn_angles[ YAW ] += 180.0f;
AngleNormalize360( spawn_angles[ YAW ] );
}
// the respawned flag will be cleared after the attack and jump keys come up
client->ps.pm_flags |= PMF_RESPAWNED;
trap_GetUsercmd( client - level.clients, &ent->client->pers.cmd );
G_SetClientViewAngle( ent, spawn_angles );
if ( client->sess.spectatorState == SPECTATOR_NOT )
{
trap_LinkEntity( ent );
// force the base weapon up
if ( client->pers.team == TEAM_HUMANS )
{
G_ForceWeaponChange( ent, weapon );
}
client->ps.weaponstate = WEAPON_READY;
}
// don't allow full run speed for a bit
client->ps.pm_flags |= PMF_TIME_KNOCKBACK;
client->ps.pm_time = 100;
client->respawnTime = level.time;
ent->nextRegenTime = level.time;
client->inactivityTime = level.time + g_inactivity.integer * 1000;
usercmdClearButtons( client->latched_buttons );
// set default animations
client->ps.torsoAnim = TORSO_STAND;
client->ps.legsAnim = LEGS_IDLE;
if ( level.intermissiontime )
{
MoveClientToIntermission( ent );
}
else
{
// fire the targets of the spawn point
if ( !spawn && spawnPoint )
{
G_EventFireEntity( spawnPoint, ent, ON_SPAWN );
}
// select the highest weapon number available, after any
// spawn given items have fired
client->ps.weapon = 1;
for ( i = WP_NUM_WEAPONS - 1; i > 0; i-- )
{
if ( BG_InventoryContainsWeapon( i, client->ps.stats ) )
{
client->ps.weapon = i;
break;
}
}
}
// run a client frame to drop exactly to the floor,
// initialize animations and other things
client->ps.commandTime = level.time - 100;
ent->client->pers.cmd.serverTime = level.time;
ClientThink( ent - g_entities );
// positively link the client, even if the command times are weird
if ( client->sess.spectatorState == SPECTATOR_NOT )
{
BG_PlayerStateToEntityState( &client->ps, &ent->s, true );
VectorCopy( ent->client->ps.origin, ent->r.currentOrigin );
trap_LinkEntity( ent );
}
// must do this here so the number of active clients is calculated
CalculateRanks();
// run the presend to set anything else
ClientEndFrame( ent );
// clear entity state values
BG_PlayerStateToEntityState( &client->ps, &ent->s, true );
client->pers.infoChangeTime = level.time;
// (re)tag the client for its team
Beacon::DeleteTags( ent );
Beacon::Tag( ent, (team_t)ent->client->ps.persistant[ PERS_TEAM ], true );
}
示例8: CG_SetInitialSnapshot
/*
==================
CG_SetInitialSnapshot
This will only happen on the very first snapshot, or
on tourney restarts. All other times will use
CG_TransitionSnapshot instead.
FIXME: Also called by map_restart?
==================
*/
void CG_SetInitialSnapshot(snapshot_t *snap)
{
int i;
centity_t *cent;
entityState_t *state;
char buff[16];
cg.snap = snap;
// trap_S_ClearSounds( qtrue );
BG_PlayerStateToEntityState(&snap->ps, &cg_entities[snap->ps.clientNum].currentState, cg.time, qfalse);
// sort out solid entities
CG_BuildSolidList();
CG_ExecuteNewServerCommands(snap->serverCommandSequence);
// set our local weapon selection pointer to
// what the server has indicated the current weapon is
CG_Respawn(qfalse);
for (i = 0 ; i < cg.snap->numEntities ; i++)
{
state = &cg.snap->entities[i];
cent = &cg_entities[state->number];
memcpy(¢->currentState, state, sizeof(entityState_t));
//cent->currentState = *state;
cent->interpolate = qfalse;
cent->currentValid = qtrue;
CG_ResetEntity(cent);
// check for events
CG_CheckEvents(cent);
}
trap_Cvar_VariableStringBuffer("r_oldMode", buff, sizeof(buff));
if (atoi(buff))
{
// confirmation screen
trap_UI_Popup(UIMENU_INGAME);
}
else if (cg.demoPlayback)
{
ccInitial = qtrue;
}
else
{
static char prevmap[64] = { 0 };
char curmap[64];
trap_Cvar_VariableStringBuffer("mapname", curmap, 64);
if (Q_stricmp(curmap, prevmap))
{
strcpy(prevmap, curmap);
if (cgs.campaignInfoLoaded)
{
if (!cg.showGameView)
{
CG_LimboMenu_f();
}
/* } else {
ccInitial = qtrue;
// Start the Initial Camera if specified
CG_StartInitialCamera(); */
}
}
}
// remove motd window
if (cg.motdWindow != NULL)
{
CG_windowFree(cg.motdWindow);
cg.motdWindow = NULL;
}
// Activate alternate input handler during demo playback
if (cg.demoPlayback)
{
CG_keyOn_f();
if (demo_infoWindow.integer > 0)
{
CG_ShowHelp_On(&cg.demohelpWindow);
}
}
//.........這裏部分代碼省略.........
示例9: ClientThink_real
//.........這裏部分代碼省略.........
{
ItemUse_Binoculars(ent);
if (ent->client->ps.zoomMode == 0)
{
G_AddEvent(ent, EV_USE_ITEM0+HI_BINOCULARS, 1);
}
else
{
G_AddEvent(ent, EV_USE_ITEM0+HI_BINOCULARS, 2);
}
}
break;
case GENCMD_USE_SENTRY:
if ( (ent->client->ps.stats[STAT_HOLDABLE_ITEMS] & (1 << HI_SENTRY_GUN)) &&
G_ItemUsable(&ent->client->ps, HI_SENTRY_GUN) )
{
ItemUse_Sentry(ent);
G_AddEvent(ent, EV_USE_ITEM0+HI_SENTRY_GUN, 0);
ent->client->ps.stats[STAT_HOLDABLE_ITEMS] &= ~(1 << HI_SENTRY_GUN);
}
break;
case GENCMD_SABERATTACKCYCLE:
Cmd_SaberAttackCycle_f(ent);
break;
default:
break;
}
// save results of pmove
if ( ent->client->ps.eventSequence != oldEventSequence ) {
ent->eventTime = level.time;
}
if (g_smoothClients.integer) {
BG_PlayerStateToEntityStateExtraPolate( &ent->client->ps, &ent->s, ent->client->ps.commandTime, qtrue );
}
else {
BG_PlayerStateToEntityState( &ent->client->ps, &ent->s, qtrue );
}
SendPendingPredictableEvents( &ent->client->ps );
if ( !( ent->client->ps.eFlags & EF_FIRING ) ) {
client->fireHeld = qfalse; // for grapple
}
// use the snapped origin for linking so it matches client predicted versions
VectorCopy( ent->s.pos.trBase, ent->r.currentOrigin );
VectorCopy (pm.mins, ent->r.mins);
VectorCopy (pm.maxs, ent->r.maxs);
ent->waterlevel = pm.waterlevel;
ent->watertype = pm.watertype;
// execute client events
ClientEvents( ent, oldEventSequence );
if ( pm.useEvent )
{
//TODO: Use
// TryUse( ent );
}
// link entity now, after any personal teleporters have been used
trap_LinkEntity (ent);
if ( !ent->client->noclip ) {
G_TouchTriggers( ent );
示例10: ClientEndFrame
/*
==============
ClientEndFrame
Called at the end of each server frame for each connected client
A fast client will have multiple ClientThink for each ClientEdFrame,
while a slow client may have multiple ClientEndFrame between ClientThink.
==============
*/
void ClientEndFrame( gentity_t *ent ) {
int i;
clientPersistant_t *pers;
if ( ent->client->sess.sessionTeam == TEAM_SPECTATOR ) {
SpectatorClientEndFrame( ent );
return;
}
pers = &ent->client->pers;
// turn off any expired powerups
for ( i = 0 ; i < MAX_POWERUPS ; i++ ) {
if ( ent->client->ps.powerups[ i ] < level.time ) {
ent->client->ps.powerups[ i ] = 0;
}
}
// save network bandwidth
#if 0
if ( !g_synchronousClients->integer && (ent->client->ps.pm_type == PM_NORMAL || ent->client->ps.pm_type == PM_FLOAT) ) {
// FIXME: this must change eventually for non-sync demo recording
VectorClear( ent->client->ps.viewangles );
}
#endif
//
// If the end of unit layout is displayed, don't give
// the player any normal movement attributes
//
if ( level.intermissiontime ) {
return;
}
// burn from lava, etc
P_WorldEffects (ent);
// apply all the damage taken this frame
P_DamageFeedback (ent);
// add the EF_CONNECTION flag if we haven't gotten commands recently
if ( level.time - ent->client->lastCmdTime > 1000 ) {
ent->s.eFlags |= EF_CONNECTION;
} else {
ent->s.eFlags &= ~EF_CONNECTION;
}
ent->client->ps.stats[STAT_HEALTH] = ent->health; // FIXME: get rid of ent->health...
G_SetClientSound (ent);
// set the latest infor
if (g_smoothClients.integer) {
BG_PlayerStateToEntityStateExtraPolate( &ent->client->ps, &ent->s, ent->client->ps.commandTime, qtrue );
}
else {
BG_PlayerStateToEntityState( &ent->client->ps, &ent->s, qtrue );
}
SendPendingPredictableEvents( &ent->client->ps );
// set the bit for the reachability area the client is currently in
// i = trap_AAS_PointReachabilityAreaIndex( ent->client->ps.origin );
// ent->client->areabits[i >> 3] |= 1 << (i & 7);
}
示例11: ClientThink_real
//.........這裏部分代碼省略.........
pm.cmd = *ucmd;
if( pm.ps->pm_type == PM_DEAD )
pm.tracemask = MASK_PLAYERSOLID; // & ~CONTENTS_BODY;
if( pm.ps->stats[ STAT_STATE ] & SS_INFESTING ||
pm.ps->stats[ STAT_STATE ] & SS_HOVELING )
pm.tracemask = MASK_PLAYERSOLID & ~CONTENTS_BODY;
else
pm.tracemask = MASK_PLAYERSOLID;
pm.trace = trap_Trace;
pm.pointcontents = trap_PointContents;
pm.debugLevel = g_debugMove.integer;
pm.noFootsteps = (qboolean)0;
pm.pmove_fixed = pmove_fixed.integer | client->pers.pmoveFixed;
pm.pmove_msec = pmove_msec.integer;
VectorCopy( client->ps.origin, client->oldOrigin );
// moved from after Pmove -- potentially the cause of
// future triggering bugs
if( !ent->client->noclip )
G_TouchTriggers( ent );
Pmove( &pm );
// save results of pmove
if( ent->client->ps.eventSequence != oldEventSequence )
ent->eventTime = level.time;
if( g_smoothClients.integer )
BG_PlayerStateToEntityStateExtraPolate( &ent->client->ps, &ent->s, ent->client->ps.commandTime, qtrue );
else
BG_PlayerStateToEntityState( &ent->client->ps, &ent->s, qtrue );
SendPendingPredictableEvents( &ent->client->ps );
if( !( ent->client->ps.eFlags & EF_FIRING ) )
client->fireHeld = qfalse; // for grapple
if( !( ent->client->ps.eFlags & EF_FIRING2 ) )
client->fire2Held = qfalse;
// use the snapped origin for linking so it matches client predicted versions
VectorCopy( ent->s.pos.trBase, ent->r.currentOrigin );
VectorCopy( pm.mins, ent->r.mins );
VectorCopy( pm.maxs, ent->r.maxs );
ent->waterlevel = pm.waterlevel;
ent->watertype = pm.watertype;
// execute client events
ClientEvents( ent, oldEventSequence );
// link entity now, after any personal teleporters have been used
trap_LinkEntity( ent );
// NOTE: now copy the exact origin over otherwise clients can be snapped into solid
VectorCopy( ent->client->ps.origin, ent->r.currentOrigin );
VectorCopy( ent->client->ps.origin, ent->s.origin );
// touch other objects
ClientImpacts( ent, &pm );
示例12: CG_DemosDrawActiveFrame
//.........這裏部分代碼省略.........
cg.rewardStack = 0;
cg.rewardTime = 0;
trap_S_ClearLoopingSounds(qtrue);
for (i = 0; i < MAX_CHATBOX_ITEMS; i++)
cg.chatItems[i].time = 0;
} else if (cg.frametime > 100) {
hadSkip = qtrue;
} else {
hadSkip = qfalse;
}
/* Make sure the random seed is the same each time we hit this frame */
srand( (cg.time % 10000000) + cg.timeFraction * 1000);
/* Prepare to render the screen */
trap_S_ClearLoopingSounds(qfalse);
trap_R_ClearScene();
/* Update demo related information */
trap_SetUserCmdValue( cg.weaponSelect, 1 );
demoProcessSnapShots( hadSkip );
if ( !cg.snap ) {
CG_DrawInformation();
return;
}
CG_PreparePacketEntities( );
CG_DemosUpdatePlayer( );
chaseUpdate( demo.play.time, demo.play.fraction );
cameraUpdate( demo.play.time, demo.play.fraction );
dofUpdate( demo.play.time, demo.play.fraction );
demoEffectUpdate( demo.play.time, demo.play.fraction );
cg.clientFrame++;
// update cg.predictedPlayerState
CG_InterpolatePlayerState( qfalse );
BG_PlayerStateToEntityState( &cg.predictedPlayerState, &cg.predictedPlayerEntity.currentState, qfalse );
if ( cg.cpma.detected ) {
if ( cg.predictedPlayerState.pm_type >= 4 )
cg.predictedPlayerEntity.currentState.eType = ET_INVISIBLE;
}
cg.predictedPlayerEntity.currentValid = qtrue;
VectorCopy( cg.predictedPlayerEntity.currentState.pos.trBase, cg.predictedPlayerEntity.lerpOrigin );
VectorCopy( cg.predictedPlayerEntity.currentState.apos.trBase, cg.predictedPlayerEntity.lerpAngles );
inwater = demoSetupView();
CG_TileClear();
trap_FX_Begin( cg.time, cg.timeFraction );
scriptRun( hadSkip );
CG_AddPacketEntities();
CG_AddMarks();
CG_AddParticles ();
CG_AddLocalEntities();
if ( cg.playerCent == &cg.predictedPlayerEntity ) {
// warning sounds when powerup is wearing off
CG_PowerupTimerSounds();
CG_AddViewWeapon( &cg.predictedPlayerState );
} else if ( cg.playerCent && cg.playerCent->currentState.number < MAX_CLIENTS ) {
CG_AddViewWeaponDirect( cg.playerCent );
}
trap_S_UpdateEntityPosition(ENTITYNUM_NONE, cg.refdef.vieworg);
CG_PlayBufferedSounds();
CG_PlayBufferedVoiceChats();
cg.refdef.time = cg.time;
memcpy( cg.refdef.areamask, cg.snap->areamask, sizeof( cg.refdef.areamask ) );
示例13: demoProcessSnapShots
void demoProcessSnapShots( qboolean hadSkip ) {
int i;
snapshot_t *snap;
// see what the latest snapshot the client system has is
trap_GetCurrentSnapshotNumber( &cg.latestSnapshotNum, &cg.latestSnapshotTime );
if (hadSkip || !cg.snap) {
cgs.processedSnapshotNum = max(cg.latestSnapshotNum - 3, -1);
if (cg.nextSnap)
cgs.serverCommandSequence = cg.nextSnap->serverCommandSequence;
else if (cg.snap)
cgs.serverCommandSequence = cg.snap->serverCommandSequence;
cg.snap = 0;
cg.nextSnap = 0;
cg.nextNextSnap = 0;
for (i=-1;i<MAX_GENTITIES;i++) {
centity_t *cent = i < 0 ? &cg.predictedPlayerEntity : &cg_entities[i];
cent->trailTime = cg.time;
cent->snapShotTime = cg.time;
cent->currentValid = qfalse;
cent->interpolate = qfalse;
cent->muzzleFlashTime = cg.time - MUZZLE_FLASH_TIME - 1;
cent->previousEvent = 0;
if (cent->currentState.eType == ET_PLAYER) {
memset( ¢->pe, 0, sizeof( cent->pe ) );
cent->pe.legs.yawAngle = cent->lerpAngles[YAW];
cent->pe.torso.yawAngle = cent->lerpAngles[YAW];
cent->pe.torso.pitchAngle = cent->lerpAngles[PITCH];
}
}
}
/* Check if we have some transition between snapsnots */
if (!cg.snap) {
entityState_t pes;
snap = CG_ReadNextSnapshot();
if (!snap)
return;
cg.snap = snap;
BG_PlayerStateToEntityState( &snap->ps, &cg_entities[ snap->ps.clientNum ].currentState, qfalse );
CG_BuildSolidList();
CG_ExecuteNewServerCommands( snap->serverCommandSequence );
CG_UpdateTps( snap, qtrue );
BG_PlayerStateToEntityStateExtraPolate( &snap->ps, &pes, snap->ps.commandTime, qfalse );
CG_AddToHistory( snap->serverTime, &pes, &cg_entities[snap->ps.clientNum] );
for ( i = 0 ; i < cg.snap->numEntities ; i++ ) {
entityState_t *state = &cg.snap->entities[ i ];
centity_t *cent = &cg_entities[ state->number ];
memcpy(¢->currentState, state, sizeof(entityState_t));
cent->interpolate = qfalse;
cent->currentValid = qtrue;
CG_AddToHistory( snap->serverTime, state, cent );
if (cent->currentState.eType > ET_EVENTS)
cent->previousEvent = 1;
else
cent->previousEvent = cent->currentState.event;
}
}
do {
if (!cg.nextSnap) {
snap = CG_ReadNextSnapshot();
if (!snap)
break;
CG_SetNextSnap( snap );
}
if ( !cg.nextNextSnap ) {
snap = CG_ReadNextSnapshot();
if ( !snap )
break;
CG_SetNextNextSnap( snap );
}
if ( cg.timeFraction >= cg.snap->serverTime - cg.time && cg.timeFraction < cg.nextSnap->serverTime - cg.time )
break;
//Todo our own transition checking if we wanna hear certain sounds
CG_TransitionSnapshot();
} while (1);
}
示例14: ClientSpawn
//.........這裏部分代碼省略.........
//rww - Set here to initialize the circling seeker drone to off.
//A quick note about this so I don't forget how it works again:
//ps.genericEnemyIndex is kept in sync between the server and client.
//When it gets set then an entitystate value of the same name gets
//set along with an entitystate flag in the shared bg code. Which
//is why a value needs to be both on the player state and entity state.
//(it doesn't seem to just carry over the entitystate value automatically
//because entity state value is derived from player state data or some
//such)
client->ps.genericEnemyIndex = -1;
client->ps.isJediMaster = qfalse;
client->ps.fallingToDeath = 0;
//Do per-spawn force power initialization
WP_SpawnInitForcePowers( ent );
// health will count down towards max_health
ent->health = client->ps.stats[STAT_HEALTH] = client->ps.stats[STAT_MAX_HEALTH];// * 1.25; Boot - no extra 25 hp on start.
// Start with a small amount of armor as well.
client->ps.stats[STAT_ARMOR] = client->ps.stats[STAT_MAX_HEALTH] * 0.25;
G_SetOrigin( ent, spawn_origin );
VectorCopy( spawn_origin, client->ps.origin );
// the respawned flag will be cleared after the attack and jump keys come up
client->ps.pm_flags |= PMF_RESPAWNED;
trap_GetUsercmd( client - level.clients, &ent->client->pers.cmd );
SetClientViewAngle( ent, spawn_angles );
if ( ent->client->sess.sessionTeam == TEAM_SPECTATOR ) {
} else {
G_KillBox( ent );
trap_LinkEntity (ent);
// force the base weapon up
client->ps.weapon = WP_BRYAR_PISTOL;
client->ps.weaponstate = FIRST_WEAPON;
}
// don't allow full run speed for a bit
client->ps.pm_flags |= PMF_TIME_KNOCKBACK;
client->ps.pm_time = 100;
client->respawnTime = level.time;
client->inactivityTime = level.time + g_inactivity.integer * 1000;
client->latched_buttons = 0;
// set default animations
client->ps.torsoAnim = WeaponReadyAnim[client->ps.weapon];
client->ps.legsAnim = WeaponReadyAnim[client->ps.weapon];
if ( level.intermissiontime ) {
MoveClientToIntermission( ent );
} else {
// fire the targets of the spawn point
G_UseTargets( spawnPoint, ent );
// select the highest weapon number available, after any
// spawn given items have fired
client->ps.weapon = 1;
for ( i = WP_NUM_WEAPONS - 1 ; i > 0 ; i-- ) {
if ( client->ps.stats[STAT_WEAPONS] & ( 1 << i ) ) {
client->ps.weapon = i;
break;
}
}
}
// run a client frame to drop exactly to the floor,
// initialize animations and other things
client->ps.commandTime = level.time - 100;
ent->client->pers.cmd.serverTime = level.time;
ClientThink( ent-g_entities );
// positively link the client, even if the command times are weird
if ( ent->client->sess.sessionTeam != TEAM_SPECTATOR ) {
BG_PlayerStateToEntityState( &client->ps, &ent->s, qtrue );
VectorCopy( ent->client->ps.origin, ent->r.currentOrigin );
trap_LinkEntity( ent );
}
if (g_spawnInvulnerability.integer)
{
ent->client->ps.eFlags |= EF_INVULNERABLE;
ent->client->invulnerableTimer = level.time + g_spawnInvulnerability.integer;
}
// run the presend to set anything else
ClientEndFrame( ent );
// clear entity state values
BG_PlayerStateToEntityState( &client->ps, &ent->s, qtrue );
}
示例15: ClientSpawn
//.........這裏部分代碼省略.........
client->ps.stats[STAT_INFOCLIENT] = -1;
client->pers = saved;
client->sess = savedSess;
client->ps.ping = savedPing;
// client->areabits = savedAreaBits;
client->accuracy_hits = accuracy_hits;
client->accuracy_shots = accuracy_shots;
client->lastkilled_client = -1;
client->airOutTime = level.time + 12000;
trap_GetUserinfo( index, userinfo, sizeof(userinfo) );
// set max health
client->pers.maxHealth = atoi( Info_ValueForKey( userinfo, "handicap" ) );
if ( client->pers.maxHealth < 1 || client->pers.maxHealth > 100 ) {
client->pers.maxHealth = 100;
}
// clear entity values
client->ps.stats[STAT_MAX_HEALTH] = client->pers.maxHealth;
ent->s.eFlags = flags;
ent->s.groundEntityNum = ENTITYNUM_NONE;
ent->client = &level.clients[index];
ent->takedamage = qtrue;
ent->inuse = qtrue;
ent->classname = "player";
ent->r.contents = CONTENTS_BODY;
ent->clipmask = MASK_PLAYERSOLID;
ent->die = player_die;
ent->waterlevel = 0;
ent->watertype = 0;
ent->flags = 0;
VectorCopy (playerMins, ent->r.mins);
VectorCopy (playerMaxs, ent->r.maxs);
client->ps.clientNum = index;
// health will count down towards max_health
ent->health = client->ps.stats[STAT_HEALTH] = client->ps.stats[STAT_MAX_HEALTH] + 25;
G_SetOrigin( ent, spawn_origin );
VectorCopy( spawn_origin, client->ps.origin );
// the respawned flag will be cleared after the attack and jump keys come up
client->ps.pm_flags |= PMF_RESPAWNED;
trap_GetUsercmd( client - level.clients, &ent->client->pers.cmd );
SetClientViewAngle( ent, spawn_angles );
if ( ent->client->sess.sessionTeam == TEAM_SPECTATOR ) {
} else {
G_KillBox( ent );
trap_LinkEntity (ent);
}
// don't allow full run speed for a bit
client->ps.pm_flags |= PMF_TIME_KNOCKBACK;
client->ps.pm_time = 100;
client->respawnTime = level.time;
client->inactivityTime = level.time + g_inactivity.integer * 1000;
client->latched_buttons = 0;
if ( level.intermissiontime ) {
MoveClientToIntermission( ent );
} else {
// fire the targets of the spawn point
G_UseTargets( spawnPoint, ent );
}
// run a client frame to drop exactly to the floor,
// initialize animations and other things
client->ps.commandTime = level.time - 100;
ent->client->pers.cmd.serverTime = level.time;
ClientThink( ent-g_entities );
// positively link the client, even if the command times are weird
if ( ent->client->sess.sessionTeam != TEAM_SPECTATOR ) {
BG_PlayerStateToEntityState( &client->ps, &ent->s, qtrue );
VectorCopy( ent->client->ps.origin, ent->r.currentOrigin );
trap_LinkEntity( ent );
}
// run the presend to set anything else
ClientEndFrame( ent );
// clear entity state values
BG_PlayerStateToEntityState( &client->ps, &ent->s, qtrue );
ent->s.modelindex = G_ModelIndex("models/human/coxswain.tik");
}