(Long roleId, @NotNull BLocal local, boolean serverStart)
| 359 | } |
| 360 | |
| 361 | private long procedureOffline(Long roleId, @NotNull BLocal local, boolean serverStart) throws Exception { |
| 362 | var onlineShared = getOrAddOnlineShared(roleId); |
| 363 | var account = onlineShared.getAccount(); |
| 364 | |
| 365 | // 本机数据已经过时,马上删除。 |
| 366 | if (local.getLoginVersion() != onlineShared.getLoginVersion()) { |
| 367 | var ret = removeLocalAndTrigger(roleId, serverStart); |
| 368 | if (ret != 0) { |
| 369 | logger.info("processOffline({}): account={}, roleId={}, removeLocalAndTrigger={}", |
| 370 | multiInstanceName, account, roleId, ret); |
| 371 | return ret; |
| 372 | } |
| 373 | } |
| 374 | |
| 375 | // skip not owner: 仅仅检查LinkSid是不充分的。后面继续检查LoginVersion。 |
| 376 | var link = onlineShared.getLink(); |
| 377 | // local 里面的Link的State没有意义。 |
| 378 | var linkName = local.getLink().getLinkName(); |
| 379 | var linkSid = local.getLink().getLinkSid(); |
| 380 | if (!link.getLinkName().equals(linkName) || link.getLinkSid() != linkSid) { |
| 381 | logger.info("processOffline({}): account={}, roleId={}, linkName={}, linkSid={} != linkName={}, linkSid={}", |
| 382 | multiInstanceName, account, roleId, linkName, linkSid, link.getLinkName(), link.getLinkSid()); |
| 383 | return 0; |
| 384 | } |
| 385 | |
| 386 | onlineShared.setLink(new BLink(link.getLinkName(), link.getLinkSid(), eLinkBroken)); |
| 387 | // local 在这个流程里面不需要setLink,如果是这个登录的,那么扇面已经删除(removeLocalAndTrigger),否则不需要修改。 |
| 388 | |
| 389 | var ret = linkBrokenTrigger(account, roleId); |
| 390 | // for shorter use |
| 391 | logger.info("processOffline({}): account={}, roleId={}, linkName={}, linkSid={}, triggerEmbed={}", |
| 392 | multiInstanceName, account, roleId, linkName, linkSid, ret); |
| 393 | |
| 394 | // see tryLogout |
| 395 | // 如果玩家在延迟期间建立了新的登录,下面版本号判断会失败。 |
| 396 | if (onlineShared.getLink().getState() != eOffline && assignLogoutVersion(onlineShared)) { |
| 397 | var ret2 = logoutTrigger(roleId, LogoutReason.LOGOUT); |
| 398 | logger.info("processOffline: roleId={}, state={}, logoutTrigger={}", |
| 399 | roleId, onlineShared.getLink().getState(), ret2); |
| 400 | return ret2; |
| 401 | } |
| 402 | logger.info("processOffline: roleId={}, state={}, version.login/logoutVersion={}", |
| 403 | roleId, onlineShared.getLink().getState(), onlineShared.getLoginVersion()); |
| 404 | return 0; |
| 405 | } |
| 406 | |
| 407 | /** |
| 408 | * 启动过程自动调用。 |
no test coverage detected