mirror of
https://github.com/Walter-Sparrow/lunar-tear.git
synced 2026-07-02 05:43:41 +03:00
Fix gate desync on quest-finish crash by advancing scene atomically
This commit is contained in:
@@ -94,18 +94,8 @@ func (h *QuestHandler) handleQuestStartInternal(user *store.UserState, questId i
|
|||||||
if sceneIds := h.SceneIdsByQuestId[questId]; len(sceneIds) > 0 {
|
if sceneIds := h.SceneIdsByQuestId[questId]; len(sceneIds) > 0 {
|
||||||
firstSceneId := sceneIds[0]
|
firstSceneId := sceneIds[0]
|
||||||
prevSceneId := user.MainQuest.CurrentQuestSceneId
|
prevSceneId := user.MainQuest.CurrentQuestSceneId
|
||||||
user.MainQuest.CurrentQuestSceneId = firstSceneId
|
h.advanceMainFlowScene(user, questId, firstSceneId)
|
||||||
if h.isSceneAhead(firstSceneId, user.MainQuest.HeadQuestSceneId) {
|
|
||||||
user.MainQuest.HeadQuestSceneId = firstSceneId
|
|
||||||
}
|
|
||||||
user.MainQuest.CurrentQuestFlowType = int32(model.QuestFlowTypeMainFlow)
|
user.MainQuest.CurrentQuestFlowType = int32(model.QuestFlowTypeMainFlow)
|
||||||
lastSceneId := h.getChapterLastSceneId(questId)
|
|
||||||
user.MainQuest.IsReachedLastQuestScene = firstSceneId == lastSceneId
|
|
||||||
if routeId, ok := h.RouteIdByQuestId[questId]; ok {
|
|
||||||
if seasonId, ok := h.SeasonIdByRouteId[routeId]; ok {
|
|
||||||
user.MainQuest.MainQuestSeasonId = seasonId
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log.Printf("[HandleQuestStart] background quest %d auto-cleared, scene %d -> %d", questId, prevSceneId, firstSceneId)
|
log.Printf("[HandleQuestStart] background quest %d auto-cleared, scene %d -> %d", questId, prevSceneId, firstSceneId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -142,8 +132,15 @@ func (h *QuestHandler) HandleQuestFinish(user *store.UserState, questId int32, i
|
|||||||
}
|
}
|
||||||
|
|
||||||
outcome := h.evaluateFinishOutcome(user, questId)
|
outcome := h.evaluateFinishOutcome(user, questId)
|
||||||
|
wasReplay := user.MainQuest.CurrentQuestFlowType == int32(model.QuestFlowTypeReplayFlow)
|
||||||
|
|
||||||
if !isRetired {
|
if !isRetired {
|
||||||
h.applyQuestVictory(user, questId, &outcome, nowMillis)
|
h.applyQuestVictory(user, questId, &outcome, nowMillis)
|
||||||
|
|
||||||
|
if isMainQuestPlayable(quest) && !wasReplay {
|
||||||
|
lastSceneId := h.getLastMainFlowSceneId(questId)
|
||||||
|
h.advanceMainFlowScene(user, questId, lastSceneId)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if isRetired && !isAnnihilated && quest.Stamina > 1 {
|
if isRetired && !isAnnihilated && quest.Stamina > 1 {
|
||||||
@@ -152,8 +149,6 @@ func (h *QuestHandler) HandleQuestFinish(user *store.UserState, questId int32, i
|
|||||||
store.RecoverStamina(user, refund*1000, maxMillis, nowMillis)
|
store.RecoverStamina(user, refund*1000, maxMillis, nowMillis)
|
||||||
}
|
}
|
||||||
|
|
||||||
wasReplay := user.MainQuest.CurrentQuestFlowType == int32(model.QuestFlowTypeReplayFlow)
|
|
||||||
|
|
||||||
user.MainQuest.ProgressQuestSceneId = 0
|
user.MainQuest.ProgressQuestSceneId = 0
|
||||||
user.MainQuest.ProgressHeadQuestSceneId = 0
|
user.MainQuest.ProgressHeadQuestSceneId = 0
|
||||||
user.MainQuest.ProgressQuestFlowType = 0
|
user.MainQuest.ProgressQuestFlowType = 0
|
||||||
|
|||||||
@@ -26,6 +26,23 @@ func (h *QuestHandler) isSceneAhead(newSceneId, currentHeadId int32) bool {
|
|||||||
return h.SceneById[newSceneId].SortOrder > h.SceneById[currentHeadId].SortOrder
|
return h.SceneById[newSceneId].SortOrder > h.SceneById[currentHeadId].SortOrder
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *QuestHandler) advanceMainFlowScene(user *store.UserState, questId, sceneId int32) {
|
||||||
|
user.MainQuest.CurrentQuestSceneId = sceneId
|
||||||
|
if h.isSceneAhead(sceneId, user.MainQuest.HeadQuestSceneId) {
|
||||||
|
user.MainQuest.HeadQuestSceneId = sceneId
|
||||||
|
}
|
||||||
|
|
||||||
|
lastSceneId := h.getChapterLastSceneId(questId)
|
||||||
|
user.MainQuest.IsReachedLastQuestScene = sceneId == lastSceneId
|
||||||
|
|
||||||
|
if routeId, ok := h.RouteIdByQuestId[questId]; ok {
|
||||||
|
user.MainQuest.CurrentMainQuestRouteId = routeId
|
||||||
|
if seasonId, ok := h.SeasonIdByRouteId[routeId]; ok {
|
||||||
|
user.MainQuest.MainQuestSeasonId = seasonId
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (h *QuestHandler) HandleMainFlowSceneProgress(user *store.UserState, questSceneId int32, nowMillis int64) {
|
func (h *QuestHandler) HandleMainFlowSceneProgress(user *store.UserState, questSceneId int32, nowMillis int64) {
|
||||||
scene, ok := h.SceneById[questSceneId]
|
scene, ok := h.SceneById[questSceneId]
|
||||||
if !ok {
|
if !ok {
|
||||||
@@ -37,10 +54,7 @@ func (h *QuestHandler) HandleMainFlowSceneProgress(user *store.UserState, questS
|
|||||||
panic(fmt.Sprintf("unknown questId=%d for HandleMainFlowSceneProgress", questSceneId))
|
panic(fmt.Sprintf("unknown questId=%d for HandleMainFlowSceneProgress", questSceneId))
|
||||||
}
|
}
|
||||||
|
|
||||||
user.MainQuest.CurrentQuestSceneId = questSceneId
|
h.advanceMainFlowScene(user, quest.QuestId, questSceneId)
|
||||||
if h.isSceneAhead(questSceneId, user.MainQuest.HeadQuestSceneId) {
|
|
||||||
user.MainQuest.HeadQuestSceneId = questSceneId
|
|
||||||
}
|
|
||||||
user.MainQuest.CurrentQuestFlowType = int32(model.QuestFlowTypeMainFlow)
|
user.MainQuest.CurrentQuestFlowType = int32(model.QuestFlowTypeMainFlow)
|
||||||
|
|
||||||
if user.SideStoryActiveProgress.CurrentSideStoryQuestId != 0 {
|
if user.SideStoryActiveProgress.CurrentSideStoryQuestId != 0 {
|
||||||
@@ -49,15 +63,6 @@ func (h *QuestHandler) HandleMainFlowSceneProgress(user *store.UserState, questS
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lastSceneId := h.getChapterLastSceneId(scene.QuestId)
|
|
||||||
user.MainQuest.IsReachedLastQuestScene = questSceneId == lastSceneId
|
|
||||||
|
|
||||||
routeId, ok := h.RouteIdByQuestId[quest.QuestId]
|
|
||||||
if !ok {
|
|
||||||
panic(fmt.Sprintf("unknown questId=%d for HandleMainFlowSceneProgress setting currentMainQuestRouteId", quest.QuestId))
|
|
||||||
}
|
|
||||||
user.MainQuest.CurrentMainQuestRouteId = routeId
|
|
||||||
|
|
||||||
user.PortalCageStatus.IsCurrentProgress = false
|
user.PortalCageStatus.IsCurrentProgress = false
|
||||||
user.PortalCageStatus.LatestVersion = nowMillis
|
user.PortalCageStatus.LatestVersion = nowMillis
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user