mirror of
https://github.com/ApfelTeeSaft/WV-Networking.git
synced 2026-08-27 03:53:28 +00:00
76 lines
2.8 KiB
C++
76 lines
2.8 KiB
C++
#pragma once
|
|
|
|
#include <wvnet/Core.h>
|
|
#include <wvnet/Actor.h>
|
|
#include <wvnet/NetConnection.h>
|
|
#include <wvnet/Packet.h>
|
|
#include <vector>
|
|
#include <unordered_map>
|
|
#include <unordered_set>
|
|
|
|
namespace WVNet {
|
|
|
|
//=============================================================================
|
|
// ActorReplicationState - Per-actor, per-connection replication state
|
|
//=============================================================================
|
|
|
|
struct ActorReplicationState {
|
|
uint32_t actorNetId;
|
|
bool spawned; // Has this actor been spawned on the client?
|
|
float lastReplicationTime;
|
|
std::unordered_map<std::string, std::vector<uint8_t>> lastPropertyValues;
|
|
|
|
ActorReplicationState() : actorNetId(0), spawned(false), lastReplicationTime(0.0f) {}
|
|
};
|
|
|
|
//=============================================================================
|
|
// ReplicationManager - Manages actor replication to clients
|
|
//=============================================================================
|
|
|
|
class ReplicationManager {
|
|
public:
|
|
ReplicationManager();
|
|
~ReplicationManager();
|
|
|
|
void Initialize(float tickRate);
|
|
void Tick(float deltaTime, class NetDriver* netDriver);
|
|
|
|
// Actor registration
|
|
void RegisterActor(Actor* actor);
|
|
void UnregisterActor(Actor* actor);
|
|
|
|
// Replication
|
|
void ReplicateActors(NetConnection* connection, class NetDriver* netDriver);
|
|
void ProcessActorReplication(NetConnection* connection, const Packet& packet);
|
|
|
|
// Relevancy
|
|
bool IsActorRelevantForConnection(Actor* actor, NetConnection* connection);
|
|
void SetRelevancyDistance(float distance);
|
|
|
|
// Configuration
|
|
void SetTickRate(float tickRate);
|
|
float GetTickRate() const { return m_tickRate; }
|
|
|
|
private:
|
|
void SendActorSpawn(Actor* actor, NetConnection* connection, class NetDriver* netDriver);
|
|
void SendActorDestroy(uint32_t actorNetId, NetConnection* connection, class NetDriver* netDriver);
|
|
void SendActorUpdate(Actor* actor, NetConnection* connection, class NetDriver* netDriver);
|
|
|
|
void HandleActorSpawn(NetConnection* connection, const Packet& packet);
|
|
void HandleActorDestroy(NetConnection* connection, const Packet& packet);
|
|
void HandleActorUpdate(NetConnection* connection, const Packet& packet);
|
|
|
|
ActorReplicationState* GetOrCreateReplicationState(NetConnection* connection, uint32_t actorNetId);
|
|
|
|
std::vector<Actor*> m_replicatedActors;
|
|
float m_tickRate;
|
|
float m_replicationInterval;
|
|
float m_timeSinceLastReplication;
|
|
float m_relevancyDistance;
|
|
|
|
// Per-connection replication state
|
|
std::unordered_map<NetConnection*, std::unordered_map<uint32_t, ActorReplicationState>> m_connectionStates;
|
|
};
|
|
|
|
} // namespace WVNet
|