V3 Server Meshing (server-side) precisa entityId 64-bit (high32 = FNV-1a do worldId, low32 = counter local) pra evitar collision cross-ZS. Os delegates do plugin (OnPlayerSpawned, OnPlayerDespawned, OnCharInfoReceived, OnPlayerStateUpdate, OnHpSpUpdate, OnLevelUp) e os métodos TryGetLast* migram pra int64; handlers em ZMMOPlayerCharacter, ZMMOWorldSubsystem, UIFrontEndFlowSubsystem e ZMMOAttributeNetworkHandler acompanham. FCachedSpawn::EntityId, FZMMOAttributesSnapshot::EntityId e SeedEntityId também viram int64. Wire S_SPAWN_PLAYER ainda carrega uint32 (server faz XOR high32^low32 pra manter unicidade estatística entre ZSs); ampliação do opcode pra uint64 fica pra PR futuro. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
52 lines
1.8 KiB
C++
52 lines
1.8 KiB
C++
#pragma once
|
|
|
|
#include "CoreMinimal.h"
|
|
#include "Subsystems/WorldSubsystem.h"
|
|
#include "ZeusAttributesPayload.h"
|
|
#include "ZMMOAttributeNetworkHandler.generated.h"
|
|
|
|
class UZeusNetworkSubsystem;
|
|
|
|
/**
|
|
* Ponte entre o `UZeusNetworkSubsystem` (GameInstanceSubsystem do plugin
|
|
* ZeusNetwork) e os `UZMMOAttributeComponent` ligados aos atores do mundo.
|
|
*
|
|
* Por que UWorldSubsystem (e nao GameInstanceSubsystem)?
|
|
* - O registry de atores (`UZMMOWorldSubsystem::GetActorByEntityId`) e'
|
|
* World-scoped, reset a cada OpenLevel.
|
|
* - World subsystem so existe enquanto ha mundo carregado, o que e' exato
|
|
* quando precisamos rotear snapshots (no front-end nao ha pawn).
|
|
*
|
|
* Lifecycle: `Initialize` binda nos 3 delegates do ZeusNetworkSubsystem;
|
|
* `Deinitialize` unbinda. Conversao `FZeusAttributesPayload ->
|
|
* FZMMOAttributesSnapshot` (USTRUCT Blueprint) acontece aqui.
|
|
*/
|
|
UCLASS()
|
|
class ZMMOATTRIBUTES_API UZMMOAttributeNetworkHandler : public UWorldSubsystem
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
public:
|
|
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
|
|
virtual void Deinitialize() override;
|
|
|
|
virtual bool ShouldCreateSubsystem(UObject* Outer) const override;
|
|
|
|
private:
|
|
void HandleAttributeSnapshotFull(const FZeusAttributesPayload& Payload);
|
|
void HandleHpSpUpdate(int64 EntityId, int32 Hp, int32 Sp);
|
|
void HandleLevelUp(int64 EntityId, int32 NewBaseLevel, int32 StatusPointDelta);
|
|
void HandleStatAllocReply(bool bAccepted, int32 Reason);
|
|
|
|
UZeusNetworkSubsystem* GetZeusNetSubsystem() const;
|
|
|
|
/// Acha o AttributeComponent do player local (Pawn->PlayerState).
|
|
/// Usado pro StatAllocReply (sem EntityId no payload).
|
|
class UZMMOAttributeComponent* FindLocalPlayerAttributeComponent() const;
|
|
|
|
FDelegateHandle SnapshotFullHandle;
|
|
FDelegateHandle HpSpUpdateHandle;
|
|
FDelegateHandle LevelUpHandle;
|
|
FDelegateHandle StatAllocReplyHandle;
|
|
};
|