Adjust server raid time calculations to match client (!202)

This change brings the server in raid time calculation (accelerated time/time you see when choosing a map) to parity with the client.

The time returned by `getInRaidTime()` effectively is the same, but the server can stop using `acceleration - 1` and the adjacent comment has an answer.

-----

The Tarkov client calculates current raid time via the following formula in `Session.GetCurrentLocationTime()`:
`In Raid Time = Today's Date + Connection Time + Time Since Client Connection * Acceleration`

The server currently uses the following:
`In Raid Time = Current Date and Time + Time Since Client Connection * (Acceleration - 1)`

The `Current Time` and `-1` used in the server calculation effectively cancel each other out if `acceleration > 1`.  Removing both should have no effect on the calculated time (not date).

The client side using `Today's Date + Connection Time` is kinda weird.  Using `acceleration = 1`, you'd see the calculated date move 2 days after 24 hours.  That said, I don't see the date portion of the raid time being used, so that might not matter.  Either way, I've matched the formula to avoid any edge cases causing desync.

Co-authored-by: OkaMoez <43766412+OkaMoez@users.noreply.github.com>
Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/202
Co-authored-by: OkaMoez <okamoez@noreply.dev.sp-tarkov.com>
Co-committed-by: OkaMoez <okamoez@noreply.dev.sp-tarkov.com>
This commit is contained in:
OkaMoez 2024-01-20 09:59:23 +00:00 committed by chomp
parent 35eb9feebf
commit afb64c1ebf

View File

@ -71,9 +71,16 @@ export class WeatherGenerator
.getValue<number>();
// Get delta between now and when client connected to server in milliseconds
const deltaMSFromNow = Date.now() - gameStartTimeStampMS;
const acceleratedMS = deltaMSFromNow * (this.weatherConfig.acceleration - 1); // For some reason nodejs moves faster than client time, reducing acceleration by 1 when client is 7 helps
const clientAcceleratedDate = new Date(currentDate.valueOf() + acceleratedMS);
const deltaMSFromNow = currentDate.getTime() - gameStartTimeStampMS;
const acceleratedMS = deltaMSFromNow * (this.weatherConfig.acceleration);
// Match client side time calculations which start from the current date + connection time, not current time
const locationTime = new Date(gameStartTimeStampMS);
locationTime.setFullYear(currentDate.getFullYear());
locationTime.setMonth(currentDate.getMonth());
locationTime.setDate(currentDate.getDate());
const clientAcceleratedDate = new Date(locationTime.getTime() + acceleratedMS);
return clientAcceleratedDate;
}