68 lines
2.0 KiB
C#
68 lines
2.0 KiB
C#
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) {
|
|
}
|
|
}
|
|
} |