space-game001/src/network/NetworkInterface.h
2026-01-17 19:16:06 +03:00

78 lines
2.5 KiB
C++

#pragma once
#include <string>
#include <unordered_map>
#include <vector>
#include "ClientState.h"
// NetworkInterface.h - Èíòåðôåéñ äëÿ ðàçíûõ òèïîâ ñîåäèíåíèé
namespace ZL {
struct RemotePlayer
{
std::vector<ClientState> timedRemoteStates;
bool canFetchClientStateAtTime(std::chrono::system_clock::time_point targetTime) const
{
if (timedRemoteStates.empty())
{
return false;
}
if (timedRemoteStates[0].lastUpdateServerTime > targetTime)
{
return false;
}
return true;
}
ClientState fetchClientStateAtTime(std::chrono::system_clock::time_point targetTime) const {
ClientState closestState;
if (timedRemoteStates.empty())
{
throw std::runtime_error("No timed client states available");
return closestState;
}
if (timedRemoteStates[0].lastUpdateServerTime > targetTime)
{
throw std::runtime_error("Found time but it is in future");
return closestState;
}
if (timedRemoteStates.size() == 1)
{
closestState = timedRemoteStates[0];
closestState.apply_lag_compensation(targetTime);
return closestState;
}
for (size_t i = 0; i < timedRemoteStates.size() - 1; ++i)
{
const auto& earlierState = timedRemoteStates[i];
const auto& laterState = timedRemoteStates[i + 1];
if (earlierState.lastUpdateServerTime <= targetTime && laterState.lastUpdateServerTime >= targetTime)
{
closestState = earlierState;
closestState.apply_lag_compensation(targetTime);
return closestState;
}
}
closestState = timedRemoteStates[timedRemoteStates.size() - 1];
closestState.apply_lag_compensation(targetTime);
return closestState;
}
};
class INetworkClient {
public:
virtual ~INetworkClient() = default;
virtual void Connect(const std::string& host, uint16_t port) = 0;
virtual void Send(const std::string& message) = 0;
virtual bool IsConnected() const = 0;
virtual void Poll() = 0; // Äëÿ îáðàáîòêè âõîäÿùèõ ïàêåòîâ
virtual std::unordered_map<int, RemotePlayer> getRemotePlayers() = 0;
};
}