egametang/ET · error · Exception

actor is the same process: {actorId}

Error message

actor is the same process: {actorId}

What it means

ProcessOuterSender is the cross-process channel; if the destination actorId.Address equals the current process's own InnerAddress, the framework refuses to send — outer sends to self indicate a routing logic error (you should use ProcessInnerSender for same-process delivery). Thrown to catch misconfigured routing early.

Source

Thrown at Packages/cn.etetet.netinner/Scripts/Hotfix/Server/ProcessOuterSenderSystem.cs:205

            self.SendInner(actorId, message as MessageObject);
        }

        private static void SendInner(this ProcessOuterSender self, ActorId actorId, MessageObject message)
        {
            if (actorId == default)
            {
                throw new Exception($"actor id is 0: {message}");
            }
            
            if (message == null)
            {
                throw new Exception($"message is null");
            }

            // 如果发向同一个进程,则报错
            if (actorId.Address == self.GetSingleton<AddressSingleton>().InnerAddress)
            {
                throw new Exception($"actor is the same process: {actorId}");
            }
            Session session = self.Get(actorId.Address);
            session.Send(actorId.FiberInstanceId, message);
        }

        private static int GetRpcId(this ProcessOuterSender self)
        {
            return ++self.RpcId;
        }

        public static async ETTask<IResponse> Call(this ProcessOuterSender self, ActorId actorId, IRequest iRequest, bool needException = true)
        {
            if (actorId == default)
            {
                throw new Exception($"actor id is 0: {iRequest}");
            }
            Fiber fiber = self.Fiber();
            

View on GitHub (pinned to 5cab01f7a8)

Solutions

  1. Check whether the intended channel is ProcessInnerSender (same process) instead of ProcessOuterSender.
  2. Verify the address configuration: the target scene's address should differ from InnerAddress for outer sends.
  3. Route based on SceneType location — if the scene is local, use the inner sender path.

Example fix

// before — always uses outer sender
outerSender.Send(actorId, msg);

// after — choose channel by address
if (actorId.Address == innerAddress)
{
    processInnerSender.Send(actorId.FiberInstanceId, msg);
}
else
{
    outerSender.Send(actorId, msg);
}
Defensive patterns

Strategy: validation

Validate before calling

var innerAddr = self.GetSingleton<AddressSingleton>().InnerAddress;
if (actorId.Address == innerAddr) { /* use ProcessInnerSender instead */ }

Prevention

When it happens

Trigger: The caller resolved a target process address that is actually this process's own address; a configuration error maps a scene type to the local process when it should be remote; the ProcessFiberAddressSingleton returned the local address for a scene that lives here.

Common situations: Misconfigured start/config files that assign the same address to two roles; logic that assumes a scene is on another process but it co-locates here; during single-process development where everything runs locally but outer-channel calls are still made.

Related errors


AI-assisted analysis of egametang/ET@5cab01f7a8 (2026-08-13). Data as JSON: /api/errors/ab6deba0eca0f3f3. Report an issue: GitHub.