You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

95 lines
3.2 KiB

using System;
namespace ET
{
[ObjectSystem]
public class ActorMessageDispatcherComponentAwakeSystem: AwakeSystem<ActorMessageDispatcherComponent>
{
public override void Awake(ActorMessageDispatcherComponent self)
{
ActorMessageDispatcherComponent.Instance = self;
self.Awake();
}
}
[ObjectSystem]
public class ActorMessageDispatcherComponentLoadSystem: LoadSystem<ActorMessageDispatcherComponent>
{
public override void Load(ActorMessageDispatcherComponent self)
{
self.Load();
}
}
[ObjectSystem]
public class ActorMessageDispatcherComponentDestroySystem: DestroySystem<ActorMessageDispatcherComponent>
{
public override void Destroy(ActorMessageDispatcherComponent self)
{
self.ActorMessageHandlers.Clear();
ActorMessageDispatcherComponent.Instance = null;
}
}
/// <summary>
/// Actor消息分发组件
/// </summary>
[FriendClass(typeof(ActorMessageDispatcherComponent))]
public static class ActorMessageDispatcherComponentHelper
{
public static void Awake(this ActorMessageDispatcherComponent self)
{
self.Load();
}
public static void Load(this ActorMessageDispatcherComponent self)
{
self.ActorMessageHandlers.Clear();
var types = Game.EventSystem.GetTypes(typeof (ActorMessageHandlerAttribute));
foreach (Type type in types)
{
object obj = Activator.CreateInstance(type);
IMActorHandler imHandler = obj as IMActorHandler;
if (imHandler == null)
{
throw new Exception($"message handler not inherit IMActorHandler abstract class: {obj.GetType().FullName}");
}
Type messageType = imHandler.GetRequestType();
Type handleResponseType = imHandler.GetResponseType();
if (handleResponseType != null)
{
Type responseType = OpcodeTypeComponent.Instance.GetResponseType(messageType);
if (handleResponseType != responseType)
{
throw new Exception($"message handler response type error: {messageType.FullName}");
}
}
self.ActorMessageHandlers.Add(messageType, imHandler);
}
}
/// <summary>
/// 分发actor消息
/// </summary>
public static async ETTask Handle(
this ActorMessageDispatcherComponent self, Entity entity, object message, Action<IActorResponse> reply)
{
if (!self.ActorMessageHandlers.TryGetValue(message.GetType(), out IMActorHandler handler))
{
throw new Exception($"not found message handler: {message}");
}
await handler.Handle(entity, message, reply);
}
public static bool TryGetHandler(this ActorMessageDispatcherComponent self,Type type, out IMActorHandler actorHandler)
{
return self.ActorMessageHandlers.TryGetValue(type, out actorHandler);
}
}
}