egametang 这里的问题是,存档分为下线自定存档和定时存。
业务逻辑继续,又改变了玩家数据,这是不会再存档了,因为玩家已经被踢掉了,销毁了,定时存档的定时器也被销毁了,也就丢档了
egametang 这里的问题是,存档分为下线自定存档和定时存。
业务逻辑继续,又改变了玩家数据,这是不会再存档了,因为玩家已经被踢掉了,销毁了,定时存档的定时器也被销毁了,也就丢档了
加了协程锁就不会立即踢了,会等你协程逻辑完成
15951836388 框架层已经处理,发给Unit的消息都加了协程锁
是在 SessionPlayerComponentDestroySystem里,加 CoroutineLockType.ActorLocationSender 吗?
ET中玩家都在Map中,消息在map中加协程锁就行了,已经加好了。这里不用加协程锁
IRequest类型的消息都是没有携程锁的
IRequest消息的处理里面,凡是异步用到session的地方,都有可能因为session的突然断开(gm踢人或者SessionIdleCheckerComponent、SessionAcceptTimeoutComponent)被销毁,导致代码报错。
异步完,判断session是否被释放,又太繁琐了
不想报错,又不想加判断代码
解决办法是《session断开你加上协程锁再删除玩家,所有消息都加协程锁,跟发给Unit消息一样就行》
这个问题所有人都会遇到,不是个别问题。
是不是干脆统一在框架里,给IRequest和session断开,加携程锁比较好?希望et加上这个处理吧
我看看
加哪吧锁呢?帐号?这个时候有些消息发过来还没帐号呢,加session Id也不对,这里不好统一加。自己在几个关键消息上加吧
egametang session Id 好像可以啊?
15951836388 gate 登录后的 rpc消息这么加协程锁和验证是不是正确的呀?
Player player = session.GetComponent<SessionPlayerComponent>()?.Player;
if (player == null)
{
response.Error = ErrorCode.ERR_ProcessWrong;
return;
}
long sessionInstanceId = session.InstanceId;
long playerInstanceId = player.InstanceId;
using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.GateUser, player.Id))
{
// 下线或者被顶号了
if (session.InstanceId != sessionInstanceId || player.InstanceId != playerInstanceId
|| player.Session.Id != session.Id)
{
response.Error = ErrorCode.ERR_ProcessWrong;
return;
}
Scene domainScene = session.DomainScene();
int domainZone = session.DomainZone();
......