void G_Script_ScriptChange( gentity_t *ent, int newScriptNum ) { g_script_status_t scriptStatusBackup; // backup the current scripting memcpy( &scriptStatusBackup, &ent->scriptStatus, sizeof( g_script_status_t ) ); // set the new script to this cast, and reset script status ent->scriptStatus.scriptEventIndex = newScriptNum; ent->scriptStatus.scriptStackHead = 0; ent->scriptStatus.scriptStackChangeTime = level.time; ent->scriptStatus.scriptId = scriptStatusBackup.scriptId + 1; // try and run the script, if it doesn't finish, then abort the current script (discard backup) if ( G_Script_ScriptRun( ent ) ) { // completed successfully memcpy( &ent->scriptStatus, &scriptStatusBackup, sizeof( g_script_status_t ) ); } }
void G_Script_ScriptChange(gentity_t *ent, int newScriptNum) { g_script_status_t scriptStatusBackup; // backup the current scripting memcpy(&scriptStatusBackup, &ent->scriptStatus, sizeof (g_script_status_t)); // set the new script to this cast, and reset script status ent->scriptStatus.scriptEventIndex = newScriptNum; ent->scriptStatus.scriptStackHead = 0; ent->scriptStatus.scriptStackChangeTime = level.time; ent->scriptStatus.scriptId = scriptStatusBackup.scriptId + 1; ent->scriptStatus.scriptFlags |= SCFL_FIRST_CALL; // try and run the script, if it doesn't finish, then abort the current script (discard backup) if (G_Script_ScriptRun(ent) && (ent->scriptStatus.scriptId == scriptStatusBackup.scriptId + 1)) { // make sure we didnt change our script via a third party // completed successfully memcpy(&ent->scriptStatus, &scriptStatusBackup, sizeof (g_script_status_t)); ent->scriptStatus.scriptFlags &= ~SCFL_FIRST_CALL; } }
/* ============== 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); } else { BG_PlayerStateToEntityState(&ent->client->ps, &ent->s, qfalse); } // DHM - Nerve :: If it's been a couple frames since being revived, and props_frame_state // wasn't reset, go ahead and reset it if (ent->props_frame_state >= 0 && ((level.time - ent->s.effect3Time) > 100)) { ent->props_frame_state = -1; } // DHM - Nerve :: Reset 'count2' for flamethrower if (!(ent->client->buttons & BUTTON_ATTACK)) { ent->count2 = 0; } // dhm // zinx - #280 - run touch functions here too, so movers don't have to wait // until the next ClientThink, which will be too late for some map // scripts (railgun) G_TouchTriggers(ent); // run entity scripting G_Script_ScriptRun(ent); // store the client's current position for antilag traces G_StoreClientPosition(ent); }