This probably the only *awful* patch in this series!

The right way to solve the problem is to make weapon physics independant 
of Draw method and refresh rate. In a perfect world, all Weapon::Draw() 
would be const and the same for WeaponProjectile::Draw().

Yea, I know it is not that easy with the grapple (I have already failed 
on it), but I do not see why the footbomb is dependant of Drawing or 
refresh rate.

Regards,

Matt (gentildemon)

Florian Köberle a écrit :
> Games could get out of sync at footbomb and grapple usage.
> It looks like these weapons require that all network participants draw after 
> the same physic frames.
>
> A better physics engine may fix the issues with these weapons and make this 
> workaround superfluous.
> ---
>  src/game/game.cpp |   31 ++++++++++++++++++-------------
>  1 files changed, 18 insertions(+), 13 deletions(-)
>
> diff --git a/src/game/game.cpp b/src/game/game.cpp
> index 16c5ebf..b8a25b4 100644
> --- a/src/game/game.cpp
> +++ b/src/game/game.cpp
> @@ -531,24 +531,29 @@ void Game::MainLoop()
>    Action a(Action::ACTION_GAME_CALCULATE_FRAME);
>    Network::GetInstance()->SendActionToAll(a);
>  
> -  // try to adjust to max Frame by seconds
> +  bool draw = false;
>  #ifndef USE_VALGRIND
> -  if (time_of_next_frame < Time::GetInstance()->ReadRealTime()) {
> +  if (Network::GetInstance()->IsLocal()) {
> +    // try to adjust to max Frame by seconds
> +    draw = time_of_next_frame < Time::GetInstance()->ReadRealTime();
>      // Only display if the physic engine isn't late
> -    if (time_of_next_phy_frame > Time::GetInstance()->ReadRealTime())
> -    {
> -#endif
> -      StatStart("Game:Draw()");
> -      CallDraw();
> -      // How many frame by seconds ?
> -      fps->Refresh();
> -      StatStop("Game:Draw()");
> -      time_of_next_frame += AppWormux::GetInstance()->video->GetMaxDelay();
> -#ifndef USE_VALGRIND
> -    }
> +    draw = draw && time_of_next_phy_frame > 
> Time::GetInstance()->ReadRealTime();
> +  } else {
> +    // A bug causes the players to get out of sync if they don't draw a the 
> same time.
> +    // This is a simple workaroud which let all players draw every 100 game 
> milliseconds.
> +    draw = (Time::GetInstance()->Read() % 100 == 0);
>    }
>  #endif
>  
> +  if (draw) {
> +    StatStart("Game:Draw()");
> +    CallDraw();
> +    // How many frame by seconds ?
> +    fps->Refresh();
> +    StatStop("Game:Draw()");
> +    time_of_next_frame += AppWormux::GetInstance()->video->GetMaxDelay();
> +  }
> +
>    delay = time_of_next_phy_frame - Time::GetInstance()->ReadRealTime();
>    if (delay >= 0)
>      SDL_Delay(delay);
>   


_______________________________________________
Wormux-dev mailing list
Wormux-dev@gna.org
https://mail.gna.org/listinfo/wormux-dev

Répondre à