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.
115 lines
4.3 KiB
115 lines
4.3 KiB
3 years ago
|
using System;
|
||
|
using System.IO;
|
||
|
|
||
|
namespace ET
|
||
|
{
|
||
|
[FriendClass(typeof(MailBoxComponent))]
|
||
|
public static class InnerMessageDispatcherHelper
|
||
|
{
|
||
|
public static void HandleIActorResponse(ushort opcode, long actorId, IActorResponse iActorResponse)
|
||
|
{
|
||
|
ActorMessageSenderComponent.Instance.RunMessage(actorId, iActorResponse);
|
||
|
}
|
||
|
|
||
|
public static void HandleIActorRequest(ushort opcode, long actorId, IActorRequest iActorRequest, Action<IActorResponse> reply)
|
||
|
{
|
||
|
Entity entity = Game.EventSystem.Get(actorId);
|
||
|
if (entity == null)
|
||
|
{
|
||
|
FailResponse(iActorRequest, ErrorCore.ERR_NotFoundActor, reply);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
MailBoxComponent mailBoxComponent = entity.GetComponent<MailBoxComponent>();
|
||
|
if (mailBoxComponent == null)
|
||
|
{
|
||
|
Log.Warning($"actor not found mailbox: {entity.GetType().Name} {actorId} {iActorRequest}");
|
||
|
FailResponse(iActorRequest, ErrorCore.ERR_NotFoundActor, reply);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
switch (mailBoxComponent.MailboxType)
|
||
|
{
|
||
|
case MailboxType.MessageDispatcher:
|
||
|
{
|
||
|
async ETTask MessageDispatcherHandler()
|
||
|
{
|
||
|
long instanceId = entity.InstanceId;
|
||
|
using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.Mailbox, actorId))
|
||
|
{
|
||
|
if (entity.InstanceId != instanceId)
|
||
|
{
|
||
|
FailResponse(iActorRequest, ErrorCore.ERR_NotFoundActor, reply);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
await ActorMessageDispatcherComponent.Instance.Handle(entity, iActorRequest, reply);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
MessageDispatcherHandler().Coroutine();
|
||
|
break;
|
||
|
}
|
||
|
case MailboxType.UnOrderMessageDispatcher:
|
||
|
{
|
||
|
ActorMessageDispatcherComponent.Instance.Handle(entity, iActorRequest, reply).Coroutine();
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static void FailResponse(IActorRequest iActorRequest, int error, Action<IActorResponse> reply)
|
||
|
{
|
||
|
IActorResponse response = ActorHelper.CreateResponse(iActorRequest, error);
|
||
|
reply.Invoke(response);
|
||
|
}
|
||
|
|
||
|
|
||
|
public static void HandleIActorMessage(ushort opcode, long actorId, IActorMessage iActorMessage)
|
||
|
{
|
||
|
OpcodeHelper.LogMsg(opcode, actorId, iActorMessage);
|
||
|
|
||
|
Entity entity = Game.EventSystem.Get(actorId);
|
||
|
if (entity == null)
|
||
|
{
|
||
|
Log.Error($"not found actor: {actorId} {iActorMessage}");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
MailBoxComponent mailBoxComponent = entity.GetComponent<MailBoxComponent>();
|
||
|
if (mailBoxComponent == null)
|
||
|
{
|
||
|
Log.Error($"actor not found mailbox: {entity.GetType().Name} {actorId} {iActorMessage}");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
switch (mailBoxComponent.MailboxType)
|
||
|
{
|
||
|
|
||
|
case MailboxType.MessageDispatcher:
|
||
|
{
|
||
|
async ETTask MessageDispatcherHandler()
|
||
|
{
|
||
|
long instanceId = entity.InstanceId;
|
||
|
using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.Mailbox, actorId))
|
||
|
{
|
||
|
if (entity.InstanceId != instanceId)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
await ActorMessageDispatcherComponent.Instance.Handle(entity, iActorMessage, null);
|
||
|
}
|
||
|
}
|
||
|
MessageDispatcherHandler().Coroutine();
|
||
|
break;
|
||
|
}
|
||
|
case MailboxType.UnOrderMessageDispatcher:
|
||
|
{
|
||
|
ActorMessageDispatcherComponent.Instance.Handle(entity, iActorMessage, null).Coroutine();
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|