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
- Check whether the intended channel is ProcessInnerSender (same process) instead of ProcessOuterSender.
- Verify the address configuration: the target scene's address should differ from InnerAddress for outer sends.
- 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
- Choose the sender by address: inner for same-process, outer for cross-process.
- Validate address configuration so scenes are not mapped to the local process when remote is intended.
- Add a routing helper that picks the channel automatically.
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
- actor id is 0: {request}
- actor id is 0: {message}
- message is null
- actor id is 0: {iRequest}
- router manager address is empty.
AI-assisted analysis of egametang/ET@5cab01f7a8 (2026-08-13).
Data as JSON: /api/errors/ab6deba0eca0f3f3.
Report an issue: GitHub.