Propagate ROT and VEL
This commit is contained in:
1 parent
ff95163bcd
commit
fbc420e894
3 files changed
+76
-31
No files matched your search
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user