Add isCrouching to network, state and animation systems; enable proxy jump syncing with a jump-hold debounce and update animation descriptor and server tooling. Key changes: - Networking: F4TNetworking.h/cpp: added a_isCrouching, include "isCrouching" in transform packets and parsing, and logging. - Remote state: F4TRemotePlayerState.h: added isCrouching field. - Proxy animation: F4TProxyAnimationSync.*: added crouch fields, enabled jump sync, implemented ApplyJumpHoldState and jump hold timing, wrote crouch/jump bools into descriptors when available, updated event firing and logs. - Animation descriptor: F4AnimationDescriptor.cpp: added isJumping and isCrouching to bool variable list. - Local detection: main.cpp: added isCrouching in movement state, stubbed GetCrouchState(), adjusted jump hold timing and included crouch in outgoing transform calls. - Server/dev tooling: server/dev_server_app.py, fake_client.py, fake_player.py, README.md: added crouch reporting, toggle UI/control and fake client support for crouch, and updated docs/logging. - Docs: docs/dev-log.md updated with notes on jump/crouch fixes and testing. Rationale: ensure remote players can report crouch state and make jump animations transition reliably by debouncing jump state on proxies and writing available graph bools; also provide dev-server controls and fake-client support for testing.
63 lines
2.1 KiB
C++
63 lines
2.1 KiB
C++
#pragma once
|
|
|
|
#include <chrono>
|
|
#include <cstdint>
|
|
#include <optional>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace F4T::RemotePlayerState
|
|
{
|
|
// Represents a remote action event captured from another player
|
|
// Used for action replay on proxy actors (combat idles, equipping, etc.)
|
|
struct RemoteActionEvent
|
|
{
|
|
std::uint32_t type{}; // Action type (see ActorMediator::ActorAction enum)
|
|
std::string eventName; // Action event name (e.g., "ActorMovementStart")
|
|
std::vector<float> animationVariablesFloat; // Float variables snapshot (Speed, Direction, etc.)
|
|
std::vector<bool> animationVariablesBool; // Bool variables snapshot (IsSprinting, IsSneaking, etc.)
|
|
std::vector<std::uint32_t> animationVariablesInt; // Int variables snapshot (weapon types, etc.)
|
|
std::uint32_t actorStateFlags1{}; // ActorState.flags1 at action time
|
|
std::uint32_t actorStateFlags2{}; // ActorState.flags2 at action time
|
|
std::chrono::steady_clock::time_point captureTime{};
|
|
};
|
|
|
|
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 isCrouching{ false };
|
|
bool weaponDrawn{ false };
|
|
float movementSpeed{ 0.0F };
|
|
float animationGraphSpeed{ -1.0F };
|
|
std::chrono::steady_clock::time_point lastReceivedLocalTime{};
|
|
|
|
// Phase 2: Actor state and action events (TiltedEvolution alignment)
|
|
std::uint32_t actorStateFlags1{};
|
|
std::uint32_t actorStateFlags2{};
|
|
std::vector<RemoteActionEvent> actionEvents;
|
|
};
|
|
|
|
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();
|
|
}
|