mirror of Walter-Sparrow / lunar-tear
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Fix gate desync on quest-finish crash by advancing scene atomically

+26 -26
+8 -13
server/internal/questflow/quest.go
··· 94 94 if sceneIds := h.SceneIdsByQuestId[questId]; len(sceneIds) > 0 { 95 95 firstSceneId := sceneIds[0] 96 96 prevSceneId := user.MainQuest.CurrentQuestSceneId 97 - user.MainQuest.CurrentQuestSceneId = firstSceneId 98 - if h.isSceneAhead(firstSceneId, user.MainQuest.HeadQuestSceneId) { 99 - user.MainQuest.HeadQuestSceneId = firstSceneId 100 - } 97 + h.advanceMainFlowScene(user, questId, firstSceneId) 101 98 user.MainQuest.CurrentQuestFlowType = int32(model.QuestFlowTypeMainFlow) 102 - lastSceneId := h.getChapterLastSceneId(questId) 103 - user.MainQuest.IsReachedLastQuestScene = firstSceneId == lastSceneId 104 - if routeId, ok := h.RouteIdByQuestId[questId]; ok { 105 - if seasonId, ok := h.SeasonIdByRouteId[routeId]; ok { 106 - user.MainQuest.MainQuestSeasonId = seasonId 107 - } 108 - } 109 99 log.Printf("[HandleQuestStart] background quest %d auto-cleared, scene %d -> %d", questId, prevSceneId, firstSceneId) 110 100 } 111 101 } ··· 142 132 } 143 133 144 134 outcome := h.evaluateFinishOutcome(user, questId) 135 + wasReplay := user.MainQuest.CurrentQuestFlowType == int32(model.QuestFlowTypeReplayFlow) 136 + 145 137 if !isRetired { 146 138 h.applyQuestVictory(user, questId, &outcome, nowMillis) 139 + 140 + if isMainQuestPlayable(quest) && !wasReplay { 141 + lastSceneId := h.getLastMainFlowSceneId(questId) 142 + h.advanceMainFlowScene(user, questId, lastSceneId) 143 + } 147 144 } 148 145 149 146 if isRetired && !isAnnihilated && quest.Stamina > 1 { ··· 151 148 maxMillis := h.MaxStaminaByLevel[user.Status.Level] * 1000 152 149 store.RecoverStamina(user, refund*1000, maxMillis, nowMillis) 153 150 } 154 - 155 - wasReplay := user.MainQuest.CurrentQuestFlowType == int32(model.QuestFlowTypeReplayFlow) 156 151 157 152 user.MainQuest.ProgressQuestSceneId = 0 158 153 user.MainQuest.ProgressHeadQuestSceneId = 0
+18 -13
server/internal/questflow/scene.go
··· 26 26 return h.SceneById[newSceneId].SortOrder > h.SceneById[currentHeadId].SortOrder 27 27 } 28 28 29 + func (h *QuestHandler) advanceMainFlowScene(user *store.UserState, questId, sceneId int32) { 30 + user.MainQuest.CurrentQuestSceneId = sceneId 31 + if h.isSceneAhead(sceneId, user.MainQuest.HeadQuestSceneId) { 32 + user.MainQuest.HeadQuestSceneId = sceneId 33 + } 34 + 35 + lastSceneId := h.getChapterLastSceneId(questId) 36 + user.MainQuest.IsReachedLastQuestScene = sceneId == lastSceneId 37 + 38 + if routeId, ok := h.RouteIdByQuestId[questId]; ok { 39 + user.MainQuest.CurrentMainQuestRouteId = routeId 40 + if seasonId, ok := h.SeasonIdByRouteId[routeId]; ok { 41 + user.MainQuest.MainQuestSeasonId = seasonId 42 + } 43 + } 44 + } 45 + 29 46 func (h *QuestHandler) HandleMainFlowSceneProgress(user *store.UserState, questSceneId int32, nowMillis int64) { 30 47 scene, ok := h.SceneById[questSceneId] 31 48 if !ok { ··· 37 54 panic(fmt.Sprintf("unknown questId=%d for HandleMainFlowSceneProgress", questSceneId)) 38 55 } 39 56 40 - user.MainQuest.CurrentQuestSceneId = questSceneId 41 - if h.isSceneAhead(questSceneId, user.MainQuest.HeadQuestSceneId) { 42 - user.MainQuest.HeadQuestSceneId = questSceneId 43 - } 57 + h.advanceMainFlowScene(user, quest.QuestId, questSceneId) 44 58 user.MainQuest.CurrentQuestFlowType = int32(model.QuestFlowTypeMainFlow) 45 59 46 60 if user.SideStoryActiveProgress.CurrentSideStoryQuestId != 0 { ··· 48 62 LatestVersion: nowMillis, 49 63 } 50 64 } 51 - 52 - lastSceneId := h.getChapterLastSceneId(scene.QuestId) 53 - user.MainQuest.IsReachedLastQuestScene = questSceneId == lastSceneId 54 - 55 - routeId, ok := h.RouteIdByQuestId[quest.QuestId] 56 - if !ok { 57 - panic(fmt.Sprintf("unknown questId=%d for HandleMainFlowSceneProgress setting currentMainQuestRouteId", quest.QuestId)) 58 - } 59 - user.MainQuest.CurrentMainQuestRouteId = routeId 60 65 61 66 user.PortalCageStatus.IsCurrentProgress = false 62 67 user.PortalCageStatus.LatestVersion = nowMillis