#pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "ZeusEntityInterface.h" #include "ZeusEntityTypes.h" #include "ZeusEntity.generated.h" /** * AZeusEntity * * Classe base para entidades replicadas pelo servidor que NAO precisam de * capsula + `UCharacterMovementComponent` — tipicamente NPCs estaticos, * objetos dinamicos do mundo, mobs simples sem locomotion fisica. * * Para personagens com capsula + CMC (proxy de jogador, mobs com locomotion * por capsula), use `AZeusPlayerProxy` ou uma futura `AZeusMob` que herde * de `ACharacter`. * * Implementa `IZeusEntityInterface` com: * - getters para `EntityId` / `EntityType`; * - `ApplyEntitySnapshot` default: `SetActorLocationAndRotation` (sem * interpolacao temporal — V1 podera adicionar ring-buffer + lerp); * - `SetEntityRelevant(false)` default: oculta + desativa collision + * desativa tick (preserva o ator no mundo para futuro pooling). */ UCLASS(Blueprintable, BlueprintType) class ZMMO_API AZeusEntity : public AActor, public IZeusEntityInterface { GENERATED_BODY() public: AZeusEntity(); // --- IZeusEntityInterface --- virtual int64 GetZeusEntityId() const override { return EntityId; } virtual EZeusEntityType GetZeusEntityType() const override { return EntityType; } virtual void ApplyEntitySnapshot(const FZeusEntitySnapshot& Snapshot) override; virtual void SetEntityRelevant(bool bRelevant) override; /** Setter usado pelo `UZeusWorldSubsystem` apos o spawn para registrar a identidade. */ UFUNCTION(BlueprintCallable, Category = "Zeus|Entity") void SetZeusIdentity(int64 InEntityId, EZeusEntityType InEntityType); protected: /** Identificador autoritativo do servidor. Atribuido em `SetZeusIdentity`. */ UPROPERTY(VisibleInstanceOnly, BlueprintReadOnly, Category = "Zeus|Entity") int64 EntityId = 0; /** Categoria autoritativa (Player/Mob/NPC/Object). */ UPROPERTY(VisibleInstanceOnly, BlueprintReadOnly, Category = "Zeus|Entity") EZeusEntityType EntityType = EZeusEntityType::Object; /** Estado de relevancia atual (espelha as transicoes Hidden<->Relevant do servidor). */ UPROPERTY(VisibleInstanceOnly, BlueprintReadOnly, Category = "Zeus|Entity") bool bIsZeusRelevant = true; };