From: Thomas S. <t-...@us...> - 2006-08-15 14:20:35
|
Update of /cvsroot/bzflag/bzflag/src/bzfs In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv14160/src/bzfs Modified Files: bzfs.cxx bzfsPlayerStateVerify.cxx Log Message: Add InBuilding to PlayerState, check whether the player is in an allowed state when he tries to pause and fix the bug that make bzfs kicking players driving through teleporter while the pause countdown run Index: bzfs.cxx =================================================================== RCS file: /cvsroot/bzflag/bzflag/src/bzfs/bzfs.cxx,v retrieving revision 2.323 retrieving revision 2.324 diff -w -u -r2.323 -r2.324 --- bzfs.cxx 6 Aug 2006 22:49:51 -0000 2.323 +++ bzfs.cxx 15 Aug 2006 14:20:27 -0000 2.324 @@ -3303,23 +3303,20 @@ if (playerData->player.pauseRequestTime - TimeKeeper::getNullTime() != 0){ // player wants to unpause playerData->player.pauseRequestTime = TimeKeeper::getNullTime(); - uint8_t pause; - nboUnpackUByte(buf, pause); - pausePlayer(playerID, pause != 0); + pausePlayer(playerID, false); } else { // player wants to pause playerData->player.pauseRequestTime = TimeKeeper::getCurrent(); // adjust pauseRequestTime according to players lag to avoid kicking innocent players - int pauseRequestLag = playerData->lagInfo.getLag(); - if (pauseRequestLag < 100) { - pauseRequestLag = 250; + int requestLag = playerData->lagInfo.getLag(); + if (requestLag < 100) { + requestLag = 250; } else { - pauseRequestLag *= 2; + requestLag *= 2; } - playerData->player.pauseRequestTime += ((double)(- pauseRequestLag) / 1000.0); - + playerData->player.pauseRequestLag = requestLag; }; break; } Index: bzfsPlayerStateVerify.cxx =================================================================== RCS file: /cvsroot/bzflag/bzflag/src/bzfs/bzfsPlayerStateVerify.cxx,v retrieving revision 2.7 retrieving revision 2.8 diff -w -u -r2.7 -r2.8 --- bzfsPlayerStateVerify.cxx 6 Aug 2006 22:49:51 -0000 2.7 +++ bzfsPlayerStateVerify.cxx 15 Aug 2006 14:20:28 -0000 2.8 @@ -137,38 +137,35 @@ bool doPauseChecks ( GameKeeper::Player *playerData, PlayerState &state ) { // make sure the player only pauses after the waiting time for pause is over - // we don not want cheaters that have instant pause + // we need some inaccuracy here that is computed using pauseRequestTime and pauseRequestLag + // lag will cause all players to pause sooner than 5 seconds + if (state.status & PlayerState::Paused) { + TimeKeeper pauseDelay = playerData->player.pauseRequestTime; + pauseDelay += (- playerData->player.pauseRequestLag / 1000.0); - // if smooth the pause using the players lag, so server side pause and players own view are nearly identical - if ((TimeKeeper::getCurrent() - playerData->player.pauseRequestTime) >= 5.0f - && (playerData->player.pauseRequestTime - TimeKeeper::getNullTime() != 0) - && playerData->player.isPaused()==false) - { - // if they are in an unallowed state, stop pausing them, otherwise pause them - if (state.status & PlayerState::CrossingWall || state.status & PlayerState::Falling - || (state.status & PlayerState::Alive) == false) - { - playerData->player.pauseRequestTime = TimeKeeper::getNullTime(); + if ((TimeKeeper::getCurrent() - pauseDelay) < 5.0f + && (playerData->player.pauseRequestTime - TimeKeeper::getNullTime() != 0)) { + // we have one of those players all love + DEBUG1("Kicking Player %s [%d] Paused too fast!\n", playerData->player.getCallSign(), + playerData->getIndex()); + sendMessage(ServerPlayer, playerData->getIndex(), "Autokick: Player paused too fast."); + removePlayer(playerData->getIndex(), "Paused too fast"); + return false; } else { - uint8_t pause; - void *buf = getDirectMessageBuffer(); - nboUnpackUByte(buf, pause); pausePlayer(playerData->player.getPlayerIndex(), true); } - } - // we need some inaccuracy here that was previously computed into pauseRequestTime - // lag will cause all players to pause sooner than 5 seconds - if ((TimeKeeper::getCurrent() - playerData->player.pauseRequestTime) < 5.0f - && (playerData->player.pauseRequestTime - TimeKeeper::getNullTime() != 0) - && state.status & PlayerState::Paused) - { - // we have one of those players all love - DEBUG1("Kicking Player %s [%d] Paused too fast!\n", playerData->player.getCallSign(), playerData->getIndex()); - sendMessage(ServerPlayer, playerData->getIndex(), "Autokick: Player paused too fast."); - removePlayer(playerData->getIndex(), "Paused too fast"); + // kick the players when they do not pause within allowed situations + if ((state.status & PlayerState::InBuilding) || (state.status & PlayerState::PhantomZoned) + || (state.status & PlayerState::Alive) == false) { + // the player did pause while being a wall or in air + DEBUG1("Kicking Player %s [%d] Paused in unallowed state!\n", playerData->player.getCallSign(), + playerData->getIndex()); + sendMessage(ServerPlayer, playerData->getIndex(), "Autokick: Player paused in unallowed state."); + removePlayer(playerData->getIndex(), "Paused in unallowed state"); return false; } + } return true; } |