using Prospect.Unreal.Core; using Prospect.Unreal.Core.Math; using Prospect.Unreal.Core.Objects; using Prospect.Unreal.Runtime; namespace Prospect.Unreal.Net.Actors; public class AActor : UObject { private bool bActorInitialized; private bool bActorIsBeingDestroyed; // TODO: UPROPERTY(BlueprintReadWrite, ReplicatedUsing=OnRep_Instigator, meta=(ExposeOnSpawn=true, AllowPrivateAccess=true), Category=Actor) /// /// Pawn responsible for damage and other gameplay events caused by this actor. /// private APawn? _instigator; // TODO: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Actor) /// /// Controls how to handle spawning this actor in a situation where it's colliding with something else. "Default" means AlwaysSpawn here. /// public ESpawnActorCollisionHandlingMethod SpawnCollisionHandlingMethod { get; set; } /// /// Sets the value of Role without causing other side effects to this instance. /// public void SetRole(ENetRole inRole) { // TODO: Implement throw new NotImplementedException(); } /// /// Set whether this actor replicates to network clients. When this actor is spawned on the server it will be sent to clients as well. /// Properties flagged for replication will update on clients if they change on the server. /// Internally changes the RemoteRole property and handles the cases where the actor needs to be added to the network actor list. /// public void SetReplicates(bool bInReplicates) { // TODO: Implement throw new NotImplementedException(); } /// /// Sets whether or not this Actor is an autonomous proxy, which is an actor on a network client that is controlled by a user on that client. /// public void SetAutonomousProxy(bool bInAutonomousProxy, bool bAllowForcePropertyCompare = true) { // TODO: Implement throw new NotImplementedException(); } public UWorld? GetWorld() { if (!HasAnyFlags(EObjectFlags.RF_ClassDefaultObject)) { var outer = GetOuter(); if (outer == null) { return null; } if (!outer.HasAnyFlags(EObjectFlags.RF_BeginDestroyed) && !outer.IsUnreachable()) { var level = GetLevel(); if (level != null) { return level.OwningWorld; } } } return null; } public ULevel? GetLevel() { return GetTypedOuter(); } public APawn? GetInstigator() { return _instigator; } public bool IsActorInitialized() { return bActorInitialized; } public bool IsPendingKillPending() { return bActorIsBeingDestroyed || IsPendingKill(); } public void PostSpawnInitialize(FTransform userSpawnTransform, AActor? inOwner, AActor? inInstigator, bool bRemoteOwned, bool bNoFail, bool bDeferConstruction) { // General flow here is like so // - Actor sets up the basics. // - Actor gets PreInitializeComponents() // - Actor constructs itself, after which its components should be fully assembled // - Actor components get OnComponentCreated // - Actor components get InitializeComponent // - Actor gets PostInitializeComponents() once everything is set up // // This should be the same sequence for deferred or nondeferred spawning. } }