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
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; |
|
} |
|
} |
|
} |
|
} |
|
} |