Propagate ROT and VEL

This commit is contained in:
Vladislav Khorev committed 2026-01-17 11:05:04 +03:00
1 parent ff95163bcd
commit fbc420e894
3 files changed
+76 -31

No files matched your search

+45 -2
View File
@@ -68,13 +68,56 @@ namespace ZL {
void WebSocketClient::Poll() {
std::lock_guard<std::mutex> lock(queueMutex);
auto now_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now().time_since_epoch()
).count();
while (!messageQueue.empty()) {
std::string msg = messageQueue.front();
messageQueue.pop();
if (msg.rfind("WORLD_UPDATE|", 0) == 0) {
if (msg.rfind("EVENT:", 0) == 0) {
auto parts = split(msg, ':');
if (parts.size() < 5) continue; // EVENT:ID:TYPE:TIME:DATA...
int remoteId = std::stoi(parts[1]);
std::string subType = parts[2];
uint64_t sentTime = std::stoull(parts[3]);
std::lock_guard<std::mutex> pLock(playersMutex);
if (remotePlayers.count(remoteId)) {
auto& rp = remotePlayers[remoteId];
if (subType == "VEL") {
rp.selectedVelocity = std::stoi(parts[4]);
}
else if (subType == "ROT") {
rp.discreteAngle = std::stoi(parts[4]);
rp.discreteMag = std::stof(parts[5]);
}
// --- ÊÎÌÏÅÍÑÀÖÈß ËÀÃÀ ---
// Âû÷èñëÿåì çàäåðæêó â ñåêóíäàõ
float lag_s = static_cast<float>(now_ms - sentTime) / 1000.0f;
// Çàùèòà îò îòðèöàòåëüíîãî ëàãà (ðàçíèöà ÷àñîâ) èëè ñëèøêîì îãðîìíîãî
lag_s = std::max(0.0f, std::min(lag_s, 1.0f));
if (lag_s > 0.001f) {
// "Äîêðó÷èâàåì" ôèçèêó êîíêðåòíîãî èãðîêà íà âåëè÷èíó çàäåðæêè
// Â ClientState.h simulate_physics äîëæåí èñïîëüçîâàòü
// àêòóàëüíûå discreteAngle/Mag
rp.simulate_physics(lag_s);
}
// Îáíîâëÿåì ìåòêó âðåìåíè, ÷òîáû îáû÷íàÿ ýêñòðàïîëÿöèÿ â Game.cpp
// çíàëà, ÷òî ñîñòîÿíèå óæå àêòóàëüíî íà ìîìåíò now_ms
rp.lastUpdateServerTime = std::chrono::steady_clock::now();
}
}
else if (msg.rfind("WORLD_UPDATE|", 0) == 0) {
parseWorldUpdate(msg);
std::cout << msg << std::endl;
}
}
}