diff --git a/game-server/app/servers/battle/handler/ladderHandler.ts b/game-server/app/servers/battle/handler/ladderHandler.ts index 2155aca11..3d32ad124 100644 --- a/game-server/app/servers/battle/handler/ladderHandler.ts +++ b/game-server/app/servers/battle/handler/ladderHandler.ts @@ -72,7 +72,7 @@ export class LadderHandler { if(!checkRank(myRank, rank)) return resResult(STATUS.LADDER_RANK_ERROR); let { status, isRobot, hisLadderData } = await getLadderOppStatus(ladderData, targetRoleId, myRank, rank); if(status != LADDER_OPP_STATUS.BATTLE) { - await LadderMatchModel.unlock(targetRoleId); + await LadderMatchModel.unlock(serverId, targetRoleId); let oppPlayers = await refreshLadderEnemies(ladderData); return resResult(STATUS.SUCCESS, { status, oppPlayers @@ -87,7 +87,7 @@ export class LadderHandler { } if(refOppObj.challengeCnt + 1 > LADDER.LADDER_CHALLENGE_FREE_TIMES + refOppObj.buyCnt) { - await LadderMatchModel.unlock(targetRoleId); + await LadderMatchModel.unlock(serverId, targetRoleId); return resResult(STATUS.LADDER_CHALLENGE_CNT_MAX); } update.challengeCnt = refOppObj.challengeCnt + 1; @@ -212,7 +212,7 @@ export class LadderHandler { await BattleRecordModel.updateBattleRecordByCode(battleCode, { $set: { status: isSuccess? 1: 2 } }); let historyRank = ladderData.historyRank; - ladderData = await LadderMatchModel.updateByRoleId(roleId, { historyRank: historyRank > atkLadderMatch.rank? atkLadderMatch.rank: historyRank, locked: 0 }); + ladderData = await LadderMatchModel.updateByRoleId(roleId, { historyRank: (historyRank > rank || historyRank == 0)? rank: historyRank }); result.setLadderData(ladderData, rec); // 获取奖励 @@ -375,7 +375,7 @@ export class LadderHandler { let ladderData = await LadderMatchModel.findByRoleId(roleId); if(!ladderData) return resResult(STATUS.LADDER_NOT_OPEN); - ladderData = await LadderMatchModel.updateByRoleId(roleId, { rank, historyRank: ladderData.historyRank < rank? ladderData.historyRank: rank }); + ladderData = await LadderMatchModel.updateByRoleId(roleId, { rank, historyRank: (ladderData.historyRank > rank || ladderData.historyRank == 0)? rank: ladderData.historyRank }); await battleEndWhenChange(ladderData, false); await LadderMatchModel.updateByRoleId(roleId, { refDaily: new Date(Date.now() - 86400000) }); diff --git a/game-server/app/services/ladderService.ts b/game-server/app/services/ladderService.ts index f7aeb4192..2fe058f68 100644 --- a/game-server/app/services/ladderService.ts +++ b/game-server/app/services/ladderService.ts @@ -212,13 +212,13 @@ export async function getLadderOppStatus(ladderData: LadderMatchType, targetRole if(curOppPlayer.isRobot) { if(rank <= 3000) { - let hisLadderData = await LadderMatchRecModel.checkByRank(`robot${rank}`); + let hisLadderData = await LadderMatchRecModel.checkByRank(ladderData.serverId, `robot${rank}`); if(hisLadderData) return { status: LADDER_OPP_STATUS.OPP_RANK_CHANGE }; } return { status: LADDER_OPP_STATUS.BATTLE, isRobot: true }; } else { - let hisLadderData = await LadderMatchModel.lock(targetRoleId, rank); + let hisLadderData = await LadderMatchModel.lock(ladderData.serverId, targetRoleId, rank); if(!hisLadderData) return { status: LADDER_OPP_STATUS.OPP_IS_LOCKED }; return { status: LADDER_OPP_STATUS.BATTLE, isRobot: false, hisLadderData }; @@ -279,8 +279,8 @@ function calculateDefCeByDefense(defense: LadderDefense) { export async function ladderTimeout(battleCode: string, status: LADDER_STATUS) { let rec = await LadderMatchRecModel.timeout(battleCode); - console.log('##### rec.defenseInfo', rec.defenseInfo, rec.defenseInfo.isRobot, rec.defenseInfo.roleId) - if(rec.defenseInfo && !rec.defenseInfo.isRobot) await LadderMatchModel.unlock(rec.defenseInfo.roleId); + // console.log('##### rec.defenseInfo', rec.defenseInfo, rec.defenseInfo.isRobot, rec.defenseInfo.roleId) + if(rec.defenseInfo && !rec.defenseInfo.isRobot) await LadderMatchModel.unlock(rec.serverId, rec.defenseInfo.roleId); if(status == LADDER_STATUS.CHECK) { await sendMessageToUserWithSuc(rec.roleId1, PUSH_ROUTE.LADDER_CHECK_STOP, { battleCode }); } else if (status == LADDER_STATUS.BATTLE) { diff --git a/game-server/app/services/timeTaskService.ts b/game-server/app/services/timeTaskService.ts index 18a335447..0fcc915f7 100644 --- a/game-server/app/services/timeTaskService.ts +++ b/game-server/app/services/timeTaskService.ts @@ -743,6 +743,9 @@ async function setTakeRankSnapshotSchedule(activityId: number, serverId: number, // —————————————— 名将擂台 start —————————————— // export async function setLadderCountDown(battleCode: string, time: number, status: LADDER_STATUS) { + if(scheduledJobs[`ladder${battleCode}`]) { + scheduledJobs[`ladder${battleCode}`].cancel(); + } let endTime = time + (status == LADDER_STATUS.CHECK? LADDER.LADDER_BATTLE_PREPARE_COUNTDOWN: LADDER.LADDER_BATTLE_COUNTDOWN) + LADDER_SERVER_GAP_TIME; scheduleJob(`ladder${battleCode}`, endTime * 1000, async () => { await ladderTimeout(battleCode, status); diff --git a/shared/db/LadderMatch.ts b/shared/db/LadderMatch.ts index 06ac0439a..1992c9611 100644 --- a/shared/db/LadderMatch.ts +++ b/shared/db/LadderMatch.ts @@ -83,16 +83,16 @@ export default class LadderMatch extends BaseModel { return result } - public static async lock(roleId: string, rank: number) { - const defense: LadderMatchType = await LadderMatchModel.findOneAndUpdate({ roleId, rank, locked: 0 }, { $set: { locked: 1 }}, { new: true }) + public static async lock(serverId: number, roleId: string, rank: number) { + const defense: LadderMatchType = await LadderMatchModel.findOneAndUpdate({ serverId, roleId, rank, locked: 0 }, { $set: { locked: 1 }}, { new: true }) .populate('role', 'roleId roleName head frame spine heads frames spines title lv updatedAt') .populate('defense.heroes.hero', 'hid skinId quality star colorStar lv') .lean(); return defense; } - public static async unlock(roleId: string) { - const defense: LadderMatchType = await LadderMatchModel.findOneAndUpdate({ roleId }, { $set: { locked: 0 }}, { new: true }).lean(); + public static async unlock(serverId: number, roleId: string) { + const defense: LadderMatchType = await LadderMatchModel.findOneAndUpdate({ serverId, roleId }, { $set: { locked: 0 }}, { new: true }).lean(); return defense; } diff --git a/shared/db/LadderMatchRec.ts b/shared/db/LadderMatchRec.ts index 166e6c4a5..084a6b0dd 100644 --- a/shared/db/LadderMatchRec.ts +++ b/shared/db/LadderMatchRec.ts @@ -52,7 +52,7 @@ export default class LadderMatchRec extends BaseModel { } public static async timeout(battleCode: string) { - const result: LadderMatchRecType = await LadderMatchRecModel.findOneAndUpdate({ battleCode }, { $set: { status: LADDER_STATUS.COMPLETE, timeout: true } }, { new: true }).lean(); + const result: LadderMatchRecType = await LadderMatchRecModel.findOneAndUpdate({ battleCode }, { $set: { status: LADDER_STATUS.COMPLETE, timeout: true, endTime: nowSeconds() } }, { new: true }).lean(); return result; } @@ -74,15 +74,15 @@ export default class LadderMatchRec extends BaseModel { } public static async battleEnd(battleCode: string, isSuccess: boolean, atkNewRank?: number, defNewRank?: number) { - let update: LadderMatchRecUpdate = { status: LADDER_STATUS.COMPLETE, endTime: nowSeconds() }; + let update: LadderMatchRecUpdate = { status: LADDER_STATUS.COMPLETE, endTime: nowSeconds(), timeout: false }; if(isSuccess) { update['attackInfo.isSuccess'] = true; update['defenseInfo.isSuccess'] = false; } if(atkNewRank != undefined && defNewRank != undefined) { - update['attackInfo.rank'] = atkNewRank; + update['attackInfo.newRank'] = atkNewRank; update['attackInfo.oldRank'] = defNewRank; - update['defenseInfo.rank'] = defNewRank; + update['defenseInfo.newRank'] = defNewRank; update['defenseInfo.oldRank'] = atkNewRank; } @@ -98,8 +98,8 @@ export default class LadderMatchRec extends BaseModel { return recs; } - public static async checkByRank(roleId2: string) { - const result = await LadderMatchRecModel.exists({ roleId2, status: { $in: [LADDER_STATUS.BATTLE, LADDER_STATUS.CHECK] } }); + public static async checkByRank(serverId: number, roleId2: string) { + const result = await LadderMatchRecModel.exists({ serverId, roleId2, status: { $in: [LADDER_STATUS.BATTLE, LADDER_STATUS.CHECK] } }); return result; }