fill client holes (lockstep)

This commit is contained in:
2025-08-07 10:53:00 +02:00
parent c813c49707
commit ba84864b6a
9 changed files with 95 additions and 22 deletions

View File

@@ -19,6 +19,7 @@ class GameStateHandler : public protocol::PacketHandler {
virtual void Handle(const protocol::packets::SpawnTroopPacket& a_Packet) override;
virtual void Handle(const protocol::packets::PlaceTowerPacket& a_Packet) override;
virtual void Handle(const protocol::packets::LockStepRequestPacket& a_Packet) override;
};
} // namespace server

View File

@@ -110,6 +110,14 @@ struct PlaceTower {
TowerCoords m_Position;
};
struct LockStepRequest {
std::vector<StepTime> m_Missing;
};
struct LockStepResponse {
std::map<StepTime, LockStep> m_Steps;
};
} // namespace pdata
} // namespace protocol
} // namespace td

View File

@@ -22,6 +22,8 @@ enum class PacketID : std::uint8_t {
BeginGame,
Disconnect,
KeepAlive,
LockStepRequest,
LockStepResponse,
LockSteps,
LoggingSuccess,
PlaceTower,
@@ -49,6 +51,8 @@ using BeginGamePacket = PacketMessage<pdata::BeginGame, PacketID::BeginGame>;
using ChatMessagePacket = PacketMessage<pdata::ChatMessage, PacketID::ChatMessage>;
using DisconnectPacket = PacketMessage<pdata::Disconnect, PacketID::Disconnect>;
using KeepAlivePacket = PacketMessage<pdata::KeepAlive, PacketID::KeepAlive>;
using LockStepRequestPacket = PacketMessage<pdata::LockStepRequest, PacketID::LockStepRequest>;
using LockStepResponsePacket = PacketMessage<pdata::LockStepResponse, PacketID::LockStepResponse>;
using LockStepsPacket = PacketMessage<pdata::LockSteps, PacketID::LockSteps>;
using LoggingSuccessPacket = PacketMessage<pdata::LoggingSuccess, PacketID::LoggingSuccess>;
using PlaceTowerPacket = PacketMessage<pdata::PlaceTower, PacketID::PlaceTower>;
@@ -63,7 +67,7 @@ using WorldDataPacket = PacketMessage<pdata::WorldData, PacketID::WorldData>;
} // namespace packets
using AllPackets = std::tuple<packets::BeginGamePacket, packets::ChatMessagePacket, packets::DisconnectPacket,
packets::KeepAlivePacket, packets::LockStepsPacket, packets::LoggingSuccessPacket, packets::PlaceTowerPacket,
packets::KeepAlivePacket, packets::LockStepRequestPacket, packets::LockStepResponsePacket, packets::LockStepsPacket, packets::LoggingSuccessPacket, packets::PlaceTowerPacket,
packets::PlayerJoinPacket, packets::PlayerLeavePacket, packets::PlayerLoginPacket, packets::PredictCommandPacket,
packets::SpawnTroopPacket, packets::WorldHeaderPacket, packets::WorldDataPacket>;

View File

@@ -2,6 +2,7 @@
#include <td/game/World.h>
#include <optional>
#include <td/misc/Signal.h>
namespace td {
namespace sim {
@@ -17,16 +18,18 @@ class ClientSimulation : public protocol::PacketHandler {
GameBuffer m_History;
std::uint64_t m_CurrentTime;
std::uint64_t m_LastTime;
std::size_t m_CurrentStep;
StepTime m_CurrentStep;
std::shared_ptr<WorldSnapshot> m_LastSnapshot;
std::uint64_t m_LastValidStep;
StepTime m_LastValidStep;
static const protocol::LockStep EMPTY_LOCKSTEP;
using protocol::PacketHandler::Handle;
public:
utils::Signal<const std::vector<StepTime>&> OnMissingLockSteps;
/**
* \brief Replay constructor
* \param a_StepTime in ms
@@ -45,15 +48,18 @@ class ClientSimulation : public protocol::PacketHandler {
float Update();
virtual void Handle(const protocol::packets::LockStepsPacket& a_LockSteps) override;
virtual void Handle(const protocol::packets::PredictCommandPacket& a_Predict) override;
virtual void Handle(const protocol::packets::LockStepResponsePacket& a_LockSteps) override;
private:
void Step();
/**
* \returns false if the empty lockstep was used
*/
bool Step();
/**
* \brief Ticks a_Count times
*/
void FastForward(std::size_t a_Count);
std::size_t FastForward(std::size_t a_Count);
/**
* \brief Tries to recompute simulation if needed (for example in late command receival)

View File

@@ -31,6 +31,8 @@ class ServerSimulation : public protocol::CommandHandler {
virtual void Handle(const protocol::commands::SpawnTroopCommand& a_SpawnTroop) override;
virtual void Handle(const protocol::commands::PlaceTowerCommand& a_PlaceTower) override;
protocol::packets::LockStepResponsePacket GetResponse(const protocol::packets::LockStepRequestPacket& a_Missing) const;
};
} // namespace sim