diff --git a/game-server/app/servers/battle/handler/ladderHandler.ts b/game-server/app/servers/battle/handler/ladderHandler.ts index 76ce19769..1767e61ed 100644 --- a/game-server/app/servers/battle/handler/ladderHandler.ts +++ b/game-server/app/servers/battle/handler/ladderHandler.ts @@ -221,6 +221,9 @@ export class LadderHandler { let roleName = session.get('roleName'); let sid = session.get('sid'); let { roleId: targetRoleId, rank, count } = msg; + if(count > LADDER.LADDER_INITIAL_CHALLENGE_TIMES) { + return resResult(STATUS.LADDER_SWEEP_TIMES_OVER); + } let ladderData = await LadderMatchModel.findByRoleId(roleId); if(!ladderData) return resResult(STATUS.LADDER_NOT_OPEN); diff --git a/game-server/app/services/ladderService.ts b/game-server/app/services/ladderService.ts index 1b9d70e3c..d1b66521a 100644 --- a/game-server/app/services/ladderService.ts +++ b/game-server/app/services/ladderService.ts @@ -4,8 +4,9 @@ import { LadderMatchModel, LadderMatchType, LadderUpdateInter } from "../db/Ladd import { LadderMatchRecModel } from "../db/LadderMatchRec"; import { RoleModel, RoleType } from "../db/Role"; import { LadderDataReturn, LadderDefense, LadderOppPlayerHeroInfo, LadderOppPlayerInDB, LadderOppPlayerInfo, LadderOppPlayerReturn } from "../domain/battleField/ladder"; -import { RoleRankInfo } from "../domain/rank"; +import { RoleAndGuildRankInfo, RoleRankInfo } from "../domain/rank"; import { gameData, getDicLadderMatchByMyRank } from "../pubUtils/data"; +import { EXTERIOR, LADDER } from "../pubUtils/dicParam"; import { ItemInter } from "../pubUtils/interface"; import { getRandValueByMinMax, shouldRefresh } from "../pubUtils/util"; import { sendMessageToUserWithSuc } from "./pushService"; @@ -273,8 +274,10 @@ export async function battleEndWhenChange(ladderMatch: LadderMatchType) { if(!ladderMatch) return; // 更新redis - let r = new Rank(REDIS_KEY.LADDER, { serverId: ladderMatch.serverId }); - r.setRankWithRoleInfo(ladderMatch.roleId, ladderMatch.rank, 0); + if(ladderMatch.rank > 0 && ladderMatch.rank < 3001) { + let r = new Rank(REDIS_KEY.LADDER, { serverId: ladderMatch.serverId }); + r.setRankWithRoleInfo(ladderMatch.roleId, ladderMatch.rank, 0); + } // 刷新对手 let oppPlayers = await refreshLadderEnemies(ladderMatch); @@ -295,4 +298,21 @@ export async function ladderBattleEndReward(roleId: string, roleName: string, si let battleGoods = await warReward.saveReward(num); let breakGoods = isBreak? await addItems(roleId, roleName, sid, dicLadderDifficultRatio?.onceReward||[], ITEM_CHANGE_REASON.LADDER_BATTLE_REWARD): []; return { battleGoods, breakGoods }; +} + +export function completeLadderRanks(ranks: RoleAndGuildRankInfo[]) { + let result: RoleAndGuildRankInfo[] = []; + for(let i = 1; i <= 200; i++) { + let dicLadderDifficultRatio = gameData.ladderDifficultRatio.get(i); + let { head, ce, spine, level } = dicLadderDifficultRatio; + let rank = ranks.find(cur => cur.rank == i); + if(rank) { + result.push(rank); + } else { + let rank = new RoleAndGuildRankInfo(i, 0); + rank.setByField(`robot${i}`, LADDER.LADDER_ROBOT_NAME, head, EXTERIOR.EXTERIOR_FACECASE, spine, level, 1, '', ce ); + result.push(rank); + } + } + return result; } \ No newline at end of file diff --git a/game-server/app/services/rankService.ts b/game-server/app/services/rankService.ts index 151d2c5e7..92c415c1c 100644 --- a/game-server/app/services/rankService.ts +++ b/game-server/app/services/rankService.ts @@ -15,6 +15,7 @@ import { CounterModel } from "../db/Counter"; import { ActivityTimeLimitRankModel } from "../db/ActivityTimeLimitRank"; import { sendMessageToServerWithSuc } from "./pushService"; import { LadderMatchModel } from "../db/LadderMatch"; +import { completeLadderRanks } from "./ladderService"; /** @@ -659,8 +660,8 @@ export class Rank { } } - public async getRankListWithMyRank(myId: myIdInter) { - let ranks = await this.getRankByRange(); + public async getRankListWithMyRank(myId: myIdInter, isReverse = false) { + let ranks = await this.getRankByRange('+inf', '-inf', isReverse); let newRanks = [], newMyRank: any; let myRank = ranks.find(cur => { return cur.isMyInfo(myId); @@ -1173,6 +1174,9 @@ export async function getRankInHandler(redisKey: REDIS_KEY, type: RANK_TYPE, key let r = new Rank(redisKey, keyParam); r.setGenerFieldsFun((obj => { let result = new RoleAndGuildRankInfo(obj.rank, obj.num); + if(type == RANK_TYPE.LADDER) { + result = new RoleAndGuildRankInfo(obj.num, 0); + } if(obj instanceof GuildRankInfo) { result.setGuildInfo(obj); } @@ -1182,7 +1186,7 @@ export async function getRankInHandler(redisKey: REDIS_KEY, type: RANK_TYPE, key return result })); - let { ranks, myRank } = await r.getRankListWithMyRank({ roleId, guildCode }); + let { ranks, myRank } = await r.getRankListWithMyRank({ roleId, guildCode }, type == RANK_TYPE.LADDER); if (!myRank) { let role = await RoleModel.findByRoleId(roleId, ROLE_SELECT.RANK, true); if (type == RANK_TYPE.TOP_LINTUP) { @@ -1214,7 +1218,12 @@ export async function getRankInHandler(redisKey: REDIS_KEY, type: RANK_TYPE, key let limitRank = await ActivityTimeLimitRankModel.findByCode(serverId, keyParam.activityId, guildCode); myRank = await r.generMyRankWithGuild(guildCode, limitRank?.score||0, limitRank?.time); } + } else if (type == RANK_TYPE.LADDER) { + myRank = await r.generMyRankWithRole(roleId, 0, 0, role); } } + if(type == RANK_TYPE.LADDER) { + ranks = completeLadderRanks(ranks); + } return { ranks, myRank } } \ No newline at end of file diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index 69ad4f81e..fbba82b2a 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -309,6 +309,7 @@ export enum RANK_TYPE { MAIN = 7, // 主线 MAIN_ELITE = 8, // 精英 GUILD_LV = 9, // 军团按等级排序 + LADDER = 10, // 名将擂台 GUILD_ACTIVE = 11, // 军团活跃度排序 HERO = 12, // 武将排行 GUILD_FUND = 13, // 军团积分排行,限时类型的排行榜,仅计算期限内增加的值 @@ -341,6 +342,8 @@ export function getRedisKeyByRankType(rankType: RANK_TYPE, isTimelimit = false) return REDIS_KEY.HERO_RANK; case RANK_TYPE.GUILD_FUND: // 军团积分排行,限时类型的排行榜,仅计算期限内增加的值 return REDIS_KEY.GUILD_FUND; + case RANK_TYPE.LADDER: // 军团积分排行,限时类型的排行榜,仅计算期限内增加的值 + return REDIS_KEY.LADDER; } } diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 5a158023f..0ea70ece7 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -268,6 +268,7 @@ export const STATUS = { LADDER_CHALLENGE_CNT_MAX: { code: 21206, simStr: '挑战次数已达上限' }, LADDER_REC_STATUS_ERR: { code: 21207, simStr: '战斗状态错误' }, LADDER_RANK_ERR: { code: 21208, simStr: '不可连战比排名自己高的玩家' }, + LADDER_SWEEP_TIMES_OVER: { code: 21209, simStr: '连战次数过多' }, // 通用 30000 - 30099 DIC_DATA_NOT_FOUND: { code: 30000, simStr: '数据表未找到' }, diff --git a/shared/domain/rank.ts b/shared/domain/rank.ts index f23f2ffa4..302fd0ce9 100644 --- a/shared/domain/rank.ts +++ b/shared/domain/rank.ts @@ -243,6 +243,10 @@ export class RoleAndGuildRankInfo { } return false; } + + setByField(roleId: string, roleName: string, head: number, frame: number, spine: number, lv: number, title: number, guildName: string, ce: number) { + this.userInfo = { roleId, roleName, head, frame, spine, lv, title, guildName, ce } + } } export class SimpleGuildRankParam {