Add optional movement-state fields (isMoving, isSprinting, isSneaking, isJumping, weaponDrawn, movementSpeed) to transform packets and wire them end-to-end. Plugin changes: extend F4TNetworking API and RemotePlayerState, derive movement speed/jump state on the game-thread, validate values, include fields when formatting transform JSON, and add throttled remote movement-state logging. main.cpp adds sampling, speed/vertical calculations, jump hold logic, and change-detection to avoid extra sends. Networking parsing (F4TNetworking.cpp) reads optional booleans/floats safely, preserves backwards compatibility, and clears movement-state logs on disconnect. Proxy controller includes a TODO note for future animation use. Server and docs: update protocol and packet docs, dev-log, server README, and fake_client.py to parse/display optional fields safely. Also add several .cursor rule files for coding, documentation, protocol, project overview, and testing guidance. This milestone prepares the data model for later animation/behavior work while keeping existing relay behavior unchanged.
42 lines
1.0 KiB
C++
42 lines
1.0 KiB
C++
#pragma once
|
|
|
|
#include <chrono>
|
|
#include <cstdint>
|
|
#include <optional>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace F4T::RemotePlayerState
|
|
{
|
|
struct RemotePlayerState
|
|
{
|
|
std::uint32_t playerId{};
|
|
float x{};
|
|
float y{};
|
|
float z{};
|
|
float angleZ{};
|
|
std::string movementType;
|
|
std::string cellId;
|
|
std::string worldspaceId;
|
|
std::optional<double> clientTime;
|
|
std::optional<double> serverTime;
|
|
bool isMoving{ false };
|
|
bool isSprinting{ false };
|
|
bool isSneaking{ false };
|
|
bool isJumping{ false };
|
|
bool weaponDrawn{ false };
|
|
float movementSpeed{ 0.0F };
|
|
std::chrono::steady_clock::time_point lastReceivedLocalTime{};
|
|
};
|
|
|
|
void SetAssignedPlayerId(std::uint32_t a_playerId);
|
|
std::optional<std::uint32_t> GetAssignedPlayerId();
|
|
bool IsAssignedPlayerId(std::uint32_t a_playerId);
|
|
void ClearAssignedPlayerId();
|
|
|
|
void UpdateRemotePlayer(RemotePlayerState a_state);
|
|
bool RemoveRemotePlayer(std::uint32_t a_playerId);
|
|
void ClearRemotePlayers();
|
|
std::vector<RemotePlayerState> GetRemotePlayerSnapshot();
|
|
}
|