合并本地领先源码:旧UI、GM疲劳燃烧、白金徽章孔、宠物修复、支援兵普攻开关
This commit is contained in:
1 parent
f2debaf9bf
commit
70b3c5a6dc
57 files changed
+4256
-30
No files matched your search
@@ -13,6 +13,10 @@ type boundGameSessionCharacter struct {
|
||||
session *gameSession
|
||||
character uint16
|
||||
generation uint64
|
||||
// virtual marks a companion presence session. Such a session is not in
|
||||
// Service.gameSessions (it has no socket), so the liveness check below must
|
||||
// consult Service.companionSessions instead.
|
||||
virtual bool
|
||||
}
|
||||
|
||||
func (s *Service) bindGameSessionCharacter(session *gameSession, charID uint16) {
|
||||
@@ -53,6 +57,13 @@ func (s *Service) bindGameSessionCharacter(session *gameSession, charID uint16)
|
||||
s.stopCurrentSpendTimeClock(session, "selected_character_changed")
|
||||
s.stopCurrentPetGrowthClock(session, "selected_character_changed")
|
||||
}
|
||||
if oldID := session.selectedCharacterID; oldID != 0 && oldID != charID {
|
||||
session.dungeon.mu.Lock()
|
||||
pendingCompanionRuntime := session.dungeon.runtime
|
||||
session.dungeon.mu.Unlock()
|
||||
s.sendCurrentDungeonCompanionTeamOffline(
|
||||
session, pendingCompanionRuntime, "selected_character_changed")
|
||||
}
|
||||
session.dungeon.mu.Lock()
|
||||
if oldID := session.selectedCharacterID; oldID != 0 && oldID != charID {
|
||||
runtime := session.dungeon.runtime
|
||||
@@ -143,6 +154,9 @@ func (s *Service) bindGameSessionCharacter(session *gameSession, charID uint16)
|
||||
session.collectboxSelectionRefreshSent = false
|
||||
}
|
||||
session.selectedCharacterID = charID
|
||||
// A real client binding this character always retires the synthetic
|
||||
// volunteer presence row, so the friend list cannot claim two online copies.
|
||||
s.dropCompanionPresenceCharacter(charID)
|
||||
if resident != nil && resident != session {
|
||||
if current := s.gameSessions[charID]; current == resident {
|
||||
s.mu.Unlock()
|
||||
@@ -436,6 +450,7 @@ func (s *Service) releaseDisconnectedDungeonAttempt(session *gameSession, reason
|
||||
// 掉线不退队 —— 座位由 raid_disconnect.go 的宽限窗口守着,这里存的坐标只作
|
||||
// 诊断与重连参考(重连实际一律回 PVF 等待室起点,见 runtimeFiendWarRejoinLocation)。
|
||||
s.captureRuntimeFiendWarRejoinPosition(session)
|
||||
s.sendCurrentDungeonCompanionTeamOfflineCurrent(session, "disconnected")
|
||||
session.dungeon.mu.Lock()
|
||||
runtime := session.dungeon.runtime
|
||||
if runtime == nil {
|
||||
@@ -538,6 +553,9 @@ func (s *Service) boundGameSessionCharacterCurrent(identity boundGameSessionChar
|
||||
if s == nil || identity.session == nil || identity.character == 0 {
|
||||
return false
|
||||
}
|
||||
if identity.virtual {
|
||||
return s.companionSessionCurrent(identity)
|
||||
}
|
||||
s.mu.Lock()
|
||||
defer s.mu.Unlock()
|
||||
return s.gameSessions[identity.character] == identity.session &&
|
||||
|
||||
Reference in new issue
Block a user