using RebootKit.Engine.Foundation; using RebootKit.Engine.Simulation; using Unity.Netcode; namespace RebootKit.Engine.Main { public abstract class NetworkPlayerController : NetworkBehaviour { static readonly Logger s_Logger = new Logger(nameof(NetworkPlayerController)); public Actor PossessedActor { get; private set; } public void PossessActor(Actor actor) { if (!IsServer) { s_Logger.Error("PossessActor can only be called on the server."); return; } if (actor == null) { s_Logger.Error("Cannot possess a null actor."); return; } PossessActorRpc(actor.ActorID, RpcTarget.Everyone); } [Rpc(SendTo.SpecifiedInParams)] void PossessActorRpc(ulong actorID, RpcParams rpcParams) { Actor actor = RR.FindSpawnedActor(actorID); if (actor == null) { s_Logger.Error($"Actor with ID {actorID} not found."); return; } if (PossessedActor is not null) { OnUnpossessActor(PossessedActor); } PossessedActor = actor; OnPossessActor(actor); } public void UnPossessActor() { if (!IsServer) { s_Logger.Error("UnPossessActor can only be called on the server."); return; } if (PossessedActor == null) { return; } UnPossessActorRpc(RpcTarget.Everyone); } [Rpc(SendTo.SpecifiedInParams)] void UnPossessActorRpc(RpcParams rpcParams) { if (PossessedActor is not null) { OnUnpossessActor(PossessedActor); PossessedActor = null; } } protected virtual void OnPossessActor(Actor actor) { } protected virtual void OnUnpossessActor(Actor actor) { } } }