@Subscribe public void handleGameSpeedChange(ClockTickIntervalChange intervallChange) { synchronized (interpolators) { for (Entry<INavigableVessel, VesselPositionUpdateData> entry : interpolators.entrySet()) { final VesselPositionUpdateData data = entry.getValue(); final PathInterpolator interpolator = data.getInterpolator(); double traveledFraction = interpolator.getTraveldFraction(); double traveledTimeMS = data.getDurationInMs() * traveledFraction; double fractionToTravel = 1 - traveledFraction; long remainingDuration = pathConverter.calculateDuration(entry.getKey(), interpolator, fractionToTravel); long newDuration = Math.round(traveledTimeMS + remainingDuration); long nbTicks = remainingDuration / EngineConfiguration.CLOCK_TICK_INTERVALL_MS; double fractionPerTick = fractionToTravel / nbTicks; interpolator.setTravelFractionPerTick(fractionPerTick); data.setDurationInMs(newDuration); logger.debug("Update the game speed, fraction to travel={}, nbTicks={}, remainingDuration={}, update fraction per tick={}", fractionToTravel, nbTicks, remainingDuration, fractionPerTick); } } }