diff --git a/game-server/app.ts b/game-server/app.ts index bc83f3694..6fed02341 100644 --- a/game-server/app.ts +++ b/game-server/app.ts @@ -33,6 +33,7 @@ import { loadGmDb } from './app/db'; import { loadActivities } from './app/services/activity/activityRemoteService'; import { checkAndSetApiIsClose } from './app/services/chatService'; import { initGuildActivityIndexInPinus, resetJoinWoodenHorse } from './app/services/guildActivity/guildActivityService'; +import { setGVGServerGroup } from './app/services/gvg/gvgService'; const filePath = (_pinus as any).FILEPATH; filePath.MASTER = '/config/master'; @@ -192,6 +193,7 @@ async function treatStartLogic(app: _pinus.Application) { if(app.getServerType() == 'guild') { initGuildActivityIndexInPinus() .then(resetJoinWoodenHorse); + setGVGServerGroup(); } if(app.getServerType() == 'battle'|| app.getServerType() == 'role'|| app.getServerType() == 'connector') { timeTaskService.setPvpSeasonNum(); diff --git a/game-server/app/servers/connector/handler/entryHandler.ts b/game-server/app/servers/connector/handler/entryHandler.ts index 6bcc4702a..2449e5d45 100644 --- a/game-server/app/servers/connector/handler/entryHandler.ts +++ b/game-server/app/servers/connector/handler/entryHandler.ts @@ -142,6 +142,8 @@ export class EntryHandler { session.push('vipStartTime', () => { }); session.push('channel', () => { }); assignServer(role.roleId, session); + + console.log('#####', role.serverId, role.guildCode) // console.log(role.guildCode) // session.push('rid', function (err) { // if (err) { diff --git a/game-server/app/servers/gm/handler/gmHandler.ts b/game-server/app/servers/gm/handler/gmHandler.ts index 5a5f37f4a..3776de9db 100644 --- a/game-server/app/servers/gm/handler/gmHandler.ts +++ b/game-server/app/servers/gm/handler/gmHandler.ts @@ -1,5 +1,5 @@ import { Application, BackendSession, pinus } from 'pinus'; -import { getRandSingleEelm, resResult } from '../../../pubUtils/util'; +import { getRandSingleEelm, isTimestamp, resResult } from '../../../pubUtils/util'; import { STATUS } from '../../../consts/statusCode'; import { GMMailModel, GMMailType } from '../../../db/GMMail'; import { ACTIVITY_TYPE, GM_MAIL_STATUS, GM_MAIL_TYPE, MAIL_TIME_TYPE, MEMORY_LOG_TYPE, PUSH_ROUTE, SURVEY_SELECT } from '../../../consts'; @@ -17,6 +17,12 @@ import { getSurvey } from '../../../services/gmService'; import { sendMessageToAllWithSuc } from '../../../services/pushService'; import { sendMailByContent, sendMailsByGmMail } from '../../../services/mailService'; import { saveMemory } from '../../../services/log/memoryLogService'; +import { getGVGConfigFromRemote } from '../../../services/gvg/gvgService'; +import { GVGServerGroupModel } from '../../../db/GVGServerGroup'; +import { isNumber } from 'underscore'; +import { group } from 'console'; +import { GVGConfigModel } from '../../../db/GVGConfig'; +import { ServerlistModel } from '../../../db/Serverlist'; let timer: NodeJS.Timer; export default function (app: Application) { @@ -285,4 +291,30 @@ export class GmHandler { await saveMemory(memoryLogType); return resResult(STATUS.SUCCESS); } + + async updateGVGServerGroup(msg: { serverId: number[], groupId: number }, session: BackendSession) { + const { serverId: serverIds, groupId } = msg; + if(!isNumber(groupId)) return resResult(STATUS.WRONG_PARMS); + for(let serverId of serverIds) { + if(!isNumber(serverId)) return resResult(STATUS.WRONG_PARMS); + } + let { scheduleTime } = await getGVGConfigFromRemote(); + for(let serverId of serverIds) { + await GVGServerGroupModel.updateByServerId(serverId, groupId, scheduleTime); + } + return resResult(STATUS.SUCCESS); + } + + async updateGVGConfig(msg: { configId: number, teamTime: number, prepareTime: number, battleTime: number, scheduleTime: number }, session: BackendSession) { + const { configId, teamTime, prepareTime, battleTime, scheduleTime } = msg; + if(!isNumber(configId) || !isTimestamp(teamTime) || !isTimestamp(prepareTime) || !isTimestamp(battleTime) || !isTimestamp(scheduleTime)) { + return resResult(STATUS.WRONG_PARMS); + } + if(teamTime > prepareTime || prepareTime > battleTime || battleTime > scheduleTime) { + return resResult(STATUS.GM_GVG_TIME_ERR); + } + await GVGConfigModel.updateConfig(configId, teamTime, prepareTime, battleTime, scheduleTime); + await pinus.app.rpc.systimer.systimerRemote.initGVGConfigSchedule.broadcast(); + return resResult(STATUS.SUCCESS); + } } \ No newline at end of file diff --git a/game-server/app/servers/guild/handler/guildHandler.ts b/game-server/app/servers/guild/handler/guildHandler.ts index 5aea126c9..94f6d8d7e 100644 --- a/game-server/app/servers/guild/handler/guildHandler.ts +++ b/game-server/app/servers/guild/handler/guildHandler.ts @@ -30,6 +30,8 @@ import { changeGuildActivity, guildDismisActivity, guildPayQuitGuild } from '../ import { sendMessageToUserWithSuc } from '../../../services/pushService'; import { GuildActiveModel } from '../../../db/GuildActive'; import { leaveRaceActivityToRemote, leaveRaceWhenDismissToRemote, leaveRaceWhenQuitGuildToRemote } from '../../../services/guildActivity/guildActivityService'; +import { getGVGInfoInGuild } from '../../../services/gvg/gvgService'; +import { guildAbdicateToLeague, guildDismissToLeague, memberQuitGuildToLeague } from '../../../services/gvg/gvgTeamService'; export default function (app: Application) { @@ -174,7 +176,7 @@ export class GuildHandler { const { code } = msg; const select = ['code', 'name', 'notice', 'ceLimit', 'isAuto', 'icon', 'lv', 'memberCnt', 'guildCe']; - const guild = await GuildModel.findByCode(code, serverId, select.join(' ')); + const guild = await GuildModel.findByCode(code, null, select.join(' ')); let leader = guild.leader; delete guild.leader; // 返回 @@ -199,7 +201,7 @@ export class GuildHandler { } // 管理员最大数 等策划表 - let guild = await GuildModel.findByCode(code, serverId, 'managerCnt lv'); + let guild = await GuildModel.findByCode(code, serverId, 'managerCnt lv leagueCode'); if (!guild) { return resResult(STATUS.GUILD_NOT_FOUND); } @@ -235,6 +237,7 @@ export class GuildHandler { await updateUserInfo(REDIS_KEY.GUILD_INFO, code, [{ field: 'leader', value: new GuildLeader(role) }]); await RoleModel.updateRoleInfo(memberRoleId, { isGuildLeader: true }); await RoleModel.updateRoleInfo(roleId, { isGuildLeader: false }); + await guildAbdicateToLeague(guild, roleId, role); } guild = await GuildModel.updateInfo(code, updateObject, { managerCnt: managerCntInc }, 'managerCnt code name'); // 如果有转让团长设置leader @@ -274,13 +277,14 @@ export class GuildHandler { return resResult(STATUS.SUCCESS, { hasGuild: false }) }; - let guild = await GuildModel.findByCode(userGuild.guildCode, serverId); + let guild = await GuildModel.findByCode(userGuild.guildCode, serverId, '+serverId'); if (!guild) { return resResult(STATUS.GUILD_NOT_FOUND); } let result = await getMyGuildInfo(roleId, sid, userGuild, guild, serverId, session); - return resResult(STATUS.SUCCESS, result); + let gvg = await getGVGInfoInGuild(guild); + return resResult(STATUS.SUCCESS, { ...result, gvg }); } // 玩家申请公会 @@ -561,6 +565,7 @@ export class GuildHandler { const { members } = guild; await RoleModel.dissmissGuild(members); await UserGuildApplyModel.deleteApplyByGuild(code); + await guildDismissToLeague(guild); await this.app.rpc.connector.connectorRemote.setOtherUserGuildSession.broadcast(members.map(roleId => { return { roleId, userGuild: null } })); // 更新session @@ -602,6 +607,7 @@ export class GuildHandler { if (!guild) return resResult(STATUS.GUILD_QUIT_ERROR); await updateUserInfo(REDIS_KEY.GUILD_INFO, guild.code, [{ field: 'guildCe', value: guild.guildCe }]) await updateUserInfo(REDIS_KEY.USER_INFO, roleId, [{ field: 'guildName', value: '' }]); + await memberQuitGuildToLeague(guild, role); //删除排名信息 await removeBossRank(code, roleId); @@ -637,7 +643,7 @@ export class GuildHandler { if (!guild) return resResult(STATUS.GUILD_KICK_ERROR); await updateUserInfo(REDIS_KEY.GUILD_INFO, guild.code, [{ field: 'guildCe', value: guild.guildCe }]) await updateUserInfo(REDIS_KEY.USER_INFO, memberRoleId, [{ field: 'guildName', value: '' }]); - + await memberQuitGuildToLeague(guild, role); //删除排名信息 await removeBossRank(code, memberRoleId); diff --git a/game-server/app/servers/guild/handler/gvgHandler.ts b/game-server/app/servers/guild/handler/gvgHandler.ts new file mode 100644 index 000000000..4920da809 --- /dev/null +++ b/game-server/app/servers/guild/handler/gvgHandler.ts @@ -0,0 +1,61 @@ +import { Application, BackendSession, ChannelService, HandlerService, pinus } from "pinus"; +import { GVG_PERIOD, GVG_SERVER_TYPE, STATUS } from "../../../consts"; +import { GVGLeagueModel } from "../../../db/GVGLeague"; +import { GVGLeaguePrepareModel } from "../../../db/GVGLeaguePrepare"; +import { GVGMainData } from "../../../domain/gvgField/returnData"; +import { resResult } from "../../../pubUtils/util"; +import { getGVGConfig, getGVGPeriodData, getGVGServerType } from "../../../services/gvg/gvgService"; +import { autoCreateLeague, checkCanChooseJob, checkCanPrepare, getMyAuth } from "../../../services/gvg/gvgTeamService"; +import { getAllServerName } from "../../../services/redisService"; +import { GVGUserDataModel } from "../../../db/GVGUserData"; +import { GVGUserItemModel } from "../../../db/GVGUserItem"; +import { GVGUserTaskModel } from "../../../db/GVGUserTask"; + +export default function (app: Application) { + new HandlerService(app, {}); + return new GVGHandler(app); +} + +export class GVGHandler { + channelService: ChannelService; + constructor(private app: Application) { + this.channelService = app.get('channelService'); + } + + // 测试 + async getData(msg: {}, session: BackendSession) { + const roleId = session.get('roleId'); + const guildCode = session.get('guildCode'); + const serverId = session.get('serverId'); + + let { configId, period, countdownTime } = getGVGPeriodData(); + let serverType = await getGVGServerType(serverId); + if(serverType == GVG_SERVER_TYPE.NO) return resResult(STATUS.GVG_NO_SERVER_TYPE); + + let data = new GVGMainData(configId, period, countdownTime, serverType); + + let serverNames = await getAllServerName(); + let league = await GVGLeagueModel.findLeagueByGuild(guildCode); + if(!league) { + league = await autoCreateLeague(guildCode); + } + if(league) { + data.setLeague(league, serverNames); + + let leaguePrepare = await GVGLeaguePrepareModel.findByLeague(configId, league.leagueCode); + data.setLeagueParpare(leaguePrepare); + + let userData = await GVGUserDataModel.findByRole(configId, league.leagueCode, roleId); + let items = await GVGUserItemModel.findByRole(configId, league.leagueCode, roleId); + let tasks = await GVGUserTaskModel.findByRole(configId, league.leagueCode, roleId); + data.setPlayerInfo(userData, getMyAuth(league, roleId), await checkCanPrepare(roleId), checkCanChooseJob(userData?.job, leaguePrepare), items, tasks); + } + + return resResult(STATUS.SUCCESS, data) + } + + async test(msg: { }, session: BackendSession) { + const time = getGVGConfig(); + return resResult(STATUS.SUCCESS, { time }); + } +} \ No newline at end of file diff --git a/game-server/app/servers/guild/handler/gvgManageHandler.ts b/game-server/app/servers/guild/handler/gvgManageHandler.ts new file mode 100644 index 000000000..914ba2296 --- /dev/null +++ b/game-server/app/servers/guild/handler/gvgManageHandler.ts @@ -0,0 +1,574 @@ +import { Application, BackendSession, ChannelService, HandlerService } from "pinus"; +import { GUILD_AUTH, GVG_APPLY_TYPE, GVG_PERIOD, GVG_SERVER_TYPE, LEAGUE_AUTH, LEAGUE_MANAGE_TYPE, PUSH_ROUTE, STATUS } from "../../../consts"; +import { resResult } from "../../../pubUtils/util"; +import { GuildModel, GuildType } from "../../../db/Guild"; +import { UserGuildModel } from "../../../db/UserGuild"; +import { GVGLeagueModel, GVGLeagueType } from "../../../db/GVGLeague"; +import { GVGLeagueApplyModel } from "../../../db/GVGLeagueApply"; +import { getGVGPeriodData, getGVGServerType, getServersOfSameGroup } from "../../../services/gvg/gvgService"; +import { checkCanManage, checkGuildLeader, checkLeagueAuth, createLeague, getLeagueApplyData, getLeagueInviteData, getMyAuth, joinGuildToLeague } from "../../../services/gvg/gvgTeamService"; +import { LeagueGuildInfo, LeagueListInfo, LeagueMemberListInfo, LeagueSimpleInfo } from "../../../domain/gvgField/returnData"; +import { getAllServerName, getServerName } from "../../../services/redisService"; +import { GVG } from "../../../pubUtils/dicParam"; +import { RoleModel } from "../../../db/Role"; +import { GVGUserDataModel } from "../../../db/GVGUserData"; +import { sendMessageToGuildWithSuc, sendMessageToUserWithSuc } from "../../../services/pushService"; +import { GVGLeaguePrepareModel } from "../../../db/GVGLeaguePrepare"; + +export default function (app: Application) { + new HandlerService(app, {}); + return new GVGManageHandler(app); +} + +export class GVGManageHandler { + channelService: ChannelService; + constructor(private app: Application) { + this.channelService = app.get('channelService'); + } + + // 创建新联军 + async createLeague(msg: { name: string, icon: number, notice: string }, session: BackendSession) { + const roleId = session.get('roleId'); + const guildCode = session.get('guildCode'); + const { name, icon, notice } = msg; + + const checkNameResult = await GVGLeagueModel.checkName(name); + if (checkNameResult) return resResult(STATUS.LEAGUE_NAME_DUP); + + let { period } = getGVGPeriodData(); + if(period != GVG_PERIOD.TEAM) return resResult(STATUS.GVG_NOT_TEAM_PERIOD); + + const guild = await GuildModel.findByCode(guildCode, null, '+members +serverId'); + const checkGuildResult = await checkGuildLeader(guildCode, roleId, guild); + if(checkGuildResult.code != 0) return checkGuildResult; + + const league = await GVGLeagueModel.findLeagueByGuild(guildCode); + if(league) return resResult(STATUS.GVG_LEAGUE_HAS_EXIST); + + const newLeague = await createLeague(guild, { name, icon, notice }); + + return resResult(STATUS.SUCCESS, { + leagueCode: newLeague.leagueCode, + hasLeague: true + } ); + } + + // 获取联军列表 + async getLeagues(msg: { page: number, name: string }, session: BackendSession) { + const roleId = session.get('roleId'); + const guildCode = session.get('guildCode'); + const serverId = session.get('serverId'); + const { page, name } = msg; + + let serverType = await getGVGServerType(serverId); + if(serverType == GVG_SERVER_TYPE.NO) return resResult(STATUS.GVG_NO_SERVER_TYPE); + + const serverNames = await getAllServerName(); + let serverIds = await getServersOfSameGroup(serverType, serverId); + const leagues = await GVGLeagueModel.findByCondition(serverType, serverIds, page, name); + const applies = await GVGLeagueApplyModel.findApplyFromGuild(guildCode); + let result: LeagueListInfo[] = []; + for(let league of leagues) { + let data = new LeagueListInfo(league, serverNames); + let hasApply = !!applies.find(cur => cur.leagueCode == league.leagueCode); + data.setHasApply(hasApply); + result.push(data); + } + return resResult(STATUS.SUCCESS, { + leagues: result + } ); + } + + // 未加入成员查看联军信息 + async getLeagueInfo(msg: { leagueCode: string }, session: BackendSession) { + const { leagueCode } = msg; + const guildCode = session.get('guildCode'); + + const serverNames = await getAllServerName(); + const league = await GVGLeagueModel.findByCode(leagueCode); + let result = new LeagueSimpleInfo(league, serverNames) + let hasApply = await GVGLeagueApplyModel.checkApply(leagueCode, guildCode, GVG_APPLY_TYPE.APPLY); + result.setHasApply(hasApply); + + // TODO 占领城池 + return resResult(STATUS.SUCCESS, { + league: result + } ); + } + + // 申请加入联军 + async applyLeague(msg: { leagueCodes: string[] }, session: BackendSession) { + const roleId = session.get('roleId'); + const guildCode = session.get('guildCode'); + const serverId = session.get('serverId'); + const { leagueCodes } = msg; + + // 检查时间 + const checkResult = await checkCanManage(serverId); + if(checkResult.code != 0) return checkResult; + + const guild = await GuildModel.findByCode(guildCode, null, '+members +serverId'); + const checkGuildResult = await checkGuildLeader(guildCode, roleId, guild); + if(checkGuildResult.code != 0) return checkGuildResult; + + const myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); + if(myLeague) return resResult(STATUS.GVG_LEAGUE_HAS_EXIST); + + const serverNames = await getAllServerName(); + const leagues = await GVGLeagueModel.findByCodes(leagueCodes); + + let result: LeagueListInfo[] = []; + for(let league of leagues) { + if(league.guildCnt > GVG.GVG_LEAGUE_COMPOSE) continue; + + await GVGLeagueApplyModel.createApply(league, guild, GVG_APPLY_TYPE.APPLY); + let data = new LeagueListInfo(league, serverNames); + data.setHasApply(true); + result.push(data); + } + + // 返回 + return resResult(STATUS.SUCCESS, { leagues: result }); + } + + // 获取申请列表 + async getApplies(msg: {}, session: BackendSession) { + const guildCode = session.get('guildCode'); + + const myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); + if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); + + const serverNames = await getAllServerName(); + const applies = await GVGLeagueApplyModel.findApplyFromLeague(myLeague.leagueCode); + const invitations = await GVGLeagueApplyModel.findInviteFromLeague(myLeague.leagueCode); + + let result = applies.map(apply => getLeagueApplyData(apply, serverNames, invitations)); + + // 返回 + return resResult(STATUS.SUCCESS, { guilds: result }); + } + + // 处理申请 + async handleApply(msg: { guildCode: string, isReceive: boolean }, session: BackendSession) { + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + const guildCode = session.get('guildCode'); + + const { guildCode: targetGuildCode, isReceive } = msg; + + // 检查时间 + const checkResult = await checkCanManage(serverId); + if(checkResult.code != 0) return checkResult; + + let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); + if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); + // 权限 + const checkAuth = await checkLeagueAuth(roleId, myLeague, LEAGUE_MANAGE_TYPE.HANDLE_APPLY); + if(!checkAuth) return resResult(STATUS.GVG_HAS_NO_AUTH); + + if(isReceive) { + let result = await joinGuildToLeague(myLeague, targetGuildCode); + if(result.code == 0) { + myLeague = result.data; + await GVGLeagueApplyModel.deleteAllGuildApply(targetGuildCode); + } else { + await GVGLeagueApplyModel.deleteApply(targetGuildCode, myLeague.leagueCode); + return result; + } + } else { // 不同意,删除申请 + await GVGLeagueApplyModel.deleteApply(targetGuildCode, myLeague.leagueCode); + } + + // 返回 + return resResult(STATUS.SUCCESS, { + guildCnt: myLeague.guildCnt, + memberCnt: myLeague.memberCnt, + leagueCe: myLeague.leagueCe + }); + } + + // 获取可以邀请的军团 + async getInviteGuilds(msg: { page: number, name: string }, session: BackendSession) { + const guildCode = session.get('guildCode'); + const serverId = session.get('serverId'); + const { page, name } = msg; + + // 检查时间 + const serverType = await getGVGServerType(serverId); + const checkResult = await checkCanManage(serverId, serverType); + if(checkResult.code != 0) return checkResult; + + let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); + if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); + + const invitations = await GVGLeagueApplyModel.findInviteFromLeague(myLeague.leagueCode); + const serverIds = await getServersOfSameGroup(serverType, serverId); + const serverNames = await getAllServerName(); + const guilds = await GuildModel.findGuildsForGVG(page, name, serverIds); + let result = guilds.map(guild => { + let data = new LeagueGuildInfo(guild, serverNames); + let hasInvited = !!invitations.find(cur => cur.guildCode == guild.code); + data.setHasInvited(hasInvited); + return data + }); + + // 返回 + return resResult(STATUS.SUCCESS, { + guilds: result + }); + } + + // 邀请加入联军 + async inviteGuild(msg: { guildCodes: string[] }, session: BackendSession) { + const roleId = session.get('roleId'); + const guildCode = session.get('guildCode'); + const serverId = session.get('serverId'); + const { guildCodes } = msg; + + // 必须跨服玩法 + const checkResult = await checkCanManage(serverId); + if(checkResult.code != 0) return checkResult; + + const myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); + if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); + + // 权限 + const checkAuth = await checkLeagueAuth(roleId, myLeague, LEAGUE_MANAGE_TYPE.INVITE); + if(!checkAuth) return resResult(STATUS.GVG_HAS_NO_AUTH); + + const guilds = await GuildModel.findByCodes(guildCodes); + const serverNames = await getAllServerName(); + + let result: LeagueGuildInfo[] = []; + for(let guild of guilds) { + await GVGLeagueApplyModel.createApply(myLeague, guild, GVG_APPLY_TYPE.INVITE); + let data = new LeagueGuildInfo(guild, serverNames); + data.setHasInvited(true); + result.push(data); + } + + // 返回 + return resResult(STATUS.SUCCESS, { guilds: result }); + } + + // 获取邀请我们军团的联军 + async getLeagueInvitations(msg: {}, session: BackendSession) { + const guildCode = session.get('guildCode'); + + const serverNames = await getAllServerName(); + const invitations = await GVGLeagueApplyModel.findInviteFromGuild(guildCode); + const applies = await GVGLeagueApplyModel.findApplyFromGuild(guildCode); + + let result: LeagueListInfo[] = invitations.map(apply => getLeagueInviteData(apply, serverNames, applies)); + + // 返回 + return resResult(STATUS.SUCCESS, { leagues: result }); + } + + // 处理邀请 + async handleInvitation(msg: { leagueCode: string, isReceive: boolean }, session: BackendSession) { + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + const guildCode = session.get('guildCode'); + + const { leagueCode: targetLeagueCode, isReceive } = msg; + + const checkResult = await checkCanManage(serverId); + if(checkResult.code != 0) return checkResult; + + // 军团权限 + const checkGuildResult = await checkGuildLeader(guildCode, roleId); + if(checkGuildResult.code != 0) return checkGuildResult; + + let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); + if(myLeague) return resResult(STATUS.GVG_LEAGUE_HAS_EXIST); + + const league = await GVGLeagueModel.findByCode(targetLeagueCode); + if(!league) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); + + let hasLeague = false; + if(isReceive) { + let result = await joinGuildToLeague(league, guildCode); + if(result.code == 0) { + hasLeague = true; + await GVGLeagueApplyModel.deleteAllGuildApply(guildCode); + } else { + await GVGLeagueApplyModel.deleteInvite(guildCode, league.leagueCode); + return result; + } + } else { // 不同意,删除申请 + await GVGLeagueApplyModel.deleteInvite(guildCode, league.leagueCode); + } + + // 返回 + return resResult(STATUS.SUCCESS, { + leagueCode: targetLeagueCode, + isReceive, + hasLeague + }); + } + + // 获取组成的所有军团列表 + async getGuilds(msg: { leagueCode: string }, session: BackendSession) { + + const { leagueCode: targetLeagueCode } = msg; + const league = await GVGLeagueModel.findByCode(targetLeagueCode); + if(!league) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); + + const guilds = await GuildModel.findByCodes(league.guildCodes); + const serverNames = await getAllServerName(); + const result = guilds.map(guild => { + return new LeagueGuildInfo(guild, serverNames) + }); + + // 返回 + return resResult(STATUS.SUCCESS, { + guilds: result + }); + } + + // 获取组成的所有玩家列表 + async getMembers(msg: { leagueCode: string }, session: BackendSession) { + + const { leagueCode: targetLeagueCode } = msg; + const league = await GVGLeagueModel.findByCode(targetLeagueCode); + if(!league) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); + + let { configId } = getGVGPeriodData(); + + const members = league.members||[]; + let roleIds = members.map(member => member.roleId); + const roles = await RoleModel.findByRoleIds(roleIds); + const serverNames = await getAllServerName(); + const userdatas = await GVGUserDataModel.findByRoles(configId, targetLeagueCode, roleIds); + const result = roles.map(role => { + let obj = new LeagueMemberListInfo(role, serverNames); + let userdata = userdatas.find(userdata => userdata.roleId == role.roleId); + if(userdata) obj.setByUserData(userdata); + let member = members.find(cur => cur.roleId == role.roleId); + if(member) obj.setAuth(member.auth); + return obj; + }); + + // 返回 + return resResult(STATUS.SUCCESS, { + members: result + }); + } + + // 踢掉某个军团 + async kick(msg: { guildCode: string }, session: BackendSession) { + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + const guildCode = session.get('guildCode'); + + const { guildCode: targetGuildCode } = msg; + + // 不能踢自己的军团 + if(guildCode == targetGuildCode) return resResult(STATUS.GVG_CANNOUT_KICK_SELF_GUILD); + + const checkResult = await checkCanManage(serverId); + if(checkResult.code != 0) return checkResult; + + // 权限 + let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); + if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); + const checkAuth = await checkLeagueAuth(roleId, myLeague, LEAGUE_MANAGE_TYPE.KICK); + if(!checkAuth) return resResult(STATUS.GVG_HAS_NO_AUTH); + + // 更新对方军团信息 + const guild = await GuildModel.quitFromLeague(targetGuildCode, myLeague.leagueCode, '+members'); + if(!guild) return resResult(STATUS.GUILD_HAS_QUIT); + // 更新联军信息 + myLeague = await GVGLeagueModel.quitGuild(myLeague.leagueCode, guild); + + // 发送消息 + await sendMessageToGuildWithSuc(targetGuildCode, PUSH_ROUTE.LEAGUE_KICK, { leagueCode: myLeague.leagueCode }) + + // 返回 + return resResult(STATUS.SUCCESS, { + guildCnt: myLeague.guildCnt, + memberCnt: myLeague.memberCnt, + leagueCe: myLeague.leagueCe, + }); + } + + // 军团退出 + async quit(msg: { guildCode: string }, session: BackendSession) { + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + const guildCode = session.get('guildCode'); + + const { guildCode: targetGuildCode } = msg; + // 检查是否是自己军团 + if(guildCode != targetGuildCode) return resResult(STATUS.GVG_CANNOUT_KICK_SELF_GUILD); + + const checkResult = await checkCanManage(serverId); + if(checkResult.code != 0) return checkResult; + + // 只能团长退出 + let guild = await GuildModel.findByCode(guildCode, null, '+members +serverId'); + const checkGuildResult = await checkGuildLeader(guildCode, roleId, guild); + if(checkGuildResult.code != 0) return checkGuildResult; + + // 联军盟主不能退出 + let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); + if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); + const checkAuth = await checkLeagueAuth(roleId, myLeague, LEAGUE_MANAGE_TYPE.QUIT); + if(!checkAuth) return resResult(STATUS.GVG_HAS_NO_AUTH); + + // 更新对方军团信息 + guild = await GuildModel.quitFromLeague(guild.code, myLeague.leagueCode, '+members'); + // 更新联军信息 + myLeague = await GVGLeagueModel.quitGuild(myLeague.leagueCode, guild); + // 发送消息 + await sendMessageToGuildWithSuc(targetGuildCode, PUSH_ROUTE.LEAGUE_KICK, { leagueCode: myLeague.leagueCode }) + + // 返回 + return resResult(STATUS.SUCCESS, { + hasLeague: !!guild.leagueCode + }); + } + + // 解散联军 + async dismiss(msg: { leagueCode: string }, session: BackendSession) { + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + const guildCode = session.get('guildCode'); + + const { leagueCode: targetLeagueCode } = msg; + + const checkResult = await checkCanManage(serverId); + if(checkResult.code != 0) return checkResult; + + // 权限 + let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); + if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); + if(myLeague.leagueCode != targetLeagueCode) return resResult(STATUS.LEAGUE_CODE_ERR); + + const checkAuth = await checkLeagueAuth(roleId, myLeague, LEAGUE_MANAGE_TYPE.DISSMISS); + if(!checkAuth) return resResult(STATUS.GVG_HAS_NO_AUTH); + + // 更新对方军团信息 + await GuildModel.dissmissLeague(targetLeagueCode); + // 更新联军信息 + await GVGLeagueModel.dismiss(myLeague.leagueCode); + // 发送消息 + for(let guildCode of myLeague.guildCodes) { + await sendMessageToGuildWithSuc(guildCode, PUSH_ROUTE.LEAGUE_DISSMISS, { leagueCode: myLeague.leagueCode }) + } + // 返回 + return resResult(STATUS.SUCCESS, { + hasLeague: false + }); + } + + // 获取可转让的人的列表 + async getCandidate(msg: { leagueCode: string }, session: BackendSession) { + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + const guildCode = session.get('guildCode'); + + const { leagueCode: targetLeagueCode } = msg; + // 权限 + let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); + if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); + if(myLeague.leagueCode != targetLeagueCode) return resResult(STATUS.LEAGUE_CODE_ERR); + + const checkAuth = await checkLeagueAuth(roleId, myLeague, LEAGUE_MANAGE_TYPE.ABDICATE); + if(!checkAuth) return resResult(STATUS.GVG_HAS_NO_AUTH); + + let { configId } = getGVGPeriodData(); + + const members = myLeague.members||[]; + const candidates = members.filter(cur => cur.auth == LEAGUE_AUTH.SUB_LEADER); + let roleIds = candidates.map(member => member.roleId); + const roles = await RoleModel.findByRoleIds(roleIds); + const serverNames = await getAllServerName(); + const userdatas = await GVGUserDataModel.findByRoles(configId, targetLeagueCode, roleIds); + const result = roles.map(role => { + let obj = new LeagueMemberListInfo(role, serverNames); + let userdata = userdatas.find(userdata => userdata.roleId == role.roleId); + if(userdata) obj.setByUserData(userdata); + let member = members.find(cur => cur.roleId == role.roleId); + if(member) obj.setAuth(member.auth); + return obj; + }); + + const leaguePrepare = await GVGLeaguePrepareModel.findByLeague(configId, targetLeagueCode); + const { producerCnt, fighterCnt } = leaguePrepare||{ producerCnt: 0, fighterCnt: 0 } + + // 返回 + return resResult(STATUS.SUCCESS, { + producerCnt, fighterCnt, + members: result + }); + } + + // 获取可转让的人的列表 + async abdicate(msg: { roleId: string }, session: BackendSession) { + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + const guildCode = session.get('guildCode'); + + const { roleId: targetRoleId } = msg; + // 权限 + let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); + if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); + const checkAuth = await checkLeagueAuth(roleId, myLeague, LEAGUE_MANAGE_TYPE.ABDICATE); + if(!checkAuth) return resResult(STATUS.GVG_HAS_NO_AUTH); + + const checkHisAuth = await checkLeagueAuth(targetRoleId, myLeague, LEAGUE_MANAGE_TYPE.BE_ABDICATED); + if(!checkHisAuth) return resResult(STATUS.GVG_HE_HAS_NO_AUTH); + + const targetRole = await RoleModel.findByRoleId(targetRoleId, '_id roleName serverId'); + let targetRoleServerName = await getServerName(targetRole.serverId); + + // 修改联军数据 members,leader + myLeague = await GVGLeagueModel.abdicate(myLeague.leagueCode, roleId, targetRoleId, targetRole._id); + // 推送 + await sendMessageToUserWithSuc(targetRoleId, PUSH_ROUTE.LEAGUE_ABDICATE, { leagueCode: myLeague.leagueCode }) + + let myAuth = getMyAuth(myLeague, roleId); + // 返回 + return resResult(STATUS.SUCCESS, { + auth: myAuth, + leader: { + name: targetRole.roleName, + serverId: targetRole.serverId, + serverName: targetRoleServerName + }, + }); + } + + // 设置联军信息 + async setLeagueInfo(msg: { leagueCode: string, name: string, notice: string, icon: number }, session: BackendSession) { + const roleId = session.get('roleId'); + const guildCode = session.get('guildCode'); + + const { leagueCode: targetLeagueCode, name, notice, icon } = msg; + + // 检查名字是否重 + if(name != undefined) { + const checkNameResult = await GVGLeagueModel.checkName(name); + if (checkNameResult) return resResult(STATUS.LEAGUE_NAME_DUP); + } + // 权限 + let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); + if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); + if(myLeague.leagueCode != targetLeagueCode) return resResult(STATUS.WRONG_PARMS); + const checkAuth = await checkLeagueAuth(roleId, myLeague, LEAGUE_MANAGE_TYPE.SET_INFO); + if(!checkAuth) return resResult(STATUS.GVG_HAS_NO_AUTH); + + // 修改联军数据 + myLeague = await GVGLeagueModel.setInfo(targetLeagueCode, name, notice, icon); + + // 返回 + return resResult(STATUS.SUCCESS, { + leagueCode: myLeague.leagueCode, + name: myLeague.name, + notice: myLeague.notice, + icon: myLeague.icon, + }); + } +} \ No newline at end of file diff --git a/game-server/app/servers/guild/remote/guildRemote.ts b/game-server/app/servers/guild/remote/guildRemote.ts index 3d3431758..7f4935762 100644 --- a/game-server/app/servers/guild/remote/guildRemote.ts +++ b/game-server/app/servers/guild/remote/guildRemote.ts @@ -6,6 +6,8 @@ import { errlogger } from '../../../util/logger'; import { setApiIsClose } from '../../../services/chatService'; import { setHiddenData } from '../../../services/dataService'; import { setKvToMemory } from '../../../services/pushService'; +import { getGVGConfig, setGVGConfig, setGVGServerGroup } from '../../../services/gvg/gvgService'; +import { GVGConfigType } from '../../../db/GVGConfig'; export default function (app: Application) { new HandlerService(app, {}); @@ -92,4 +94,28 @@ export class GuildRemote { errlogger.error(`remote ${__filename} \n ${e.stack}`); } } + + public async setGVGConfig(config: GVGConfigType) { + try { + setGVGConfig(config); + } catch(e) { + errlogger.error(`remote ${__filename} \n ${e.stack}`); + } + } + + public async getGVGConfig() { + try { + return getGVGConfig(); + } catch(e) { + errlogger.error(`remote ${__filename} \n ${e.stack}`); + } + } + + public async setGVGServerGroup() { + try { + return setGVGServerGroup(); + } catch(e) { + errlogger.error(`remote ${__filename} \n ${e.stack}`); + } + } } \ No newline at end of file diff --git a/game-server/app/servers/systimer/remote/systimerRemote.ts b/game-server/app/servers/systimer/remote/systimerRemote.ts index 6242de31d..5a91886b0 100644 --- a/game-server/app/servers/systimer/remote/systimerRemote.ts +++ b/game-server/app/servers/systimer/remote/systimerRemote.ts @@ -1,5 +1,5 @@ import { Application, ChannelService } from 'pinus'; -import { guildActivityStart, gateActivityEnd, cityActivityEnd, raceActivityEnd, guildActivitySchedule, auctionSchedule, initMaintenance, stopMaintenance, initAutoCreateServer, addMailsToSchedule, updateTimeLimitRank, setLadderCountDown, cancelLadderCountDown, initSumSchedule, setPvpSeasonSchedule } from '../../../services/timeTaskService'; +import { guildActivityStart, gateActivityEnd, cityActivityEnd, raceActivityEnd, guildActivitySchedule, auctionSchedule, initMaintenance, stopMaintenance, initAutoCreateServer, addMailsToSchedule, updateTimeLimitRank, setLadderCountDown, cancelLadderCountDown, initSumSchedule, setPvpSeasonSchedule, initGVGConfigSchedule } from '../../../services/timeTaskService'; import PvpDefenseType from '../../../db/PvpDefense'; import { DicGuildActivity } from '../../../pubUtils/dictionary/DicGuildActivity'; import { reloadResources } from '../../../pubUtils/data'; @@ -250,4 +250,12 @@ export class SystimerRemote { errlogger.error(`remote ${__filename} \n ${e.stack}`); } } + + public async initGVGConfigSchedule() { + try { + await initGVGConfigSchedule(); + } catch(e) { + errlogger.error(`remote ${__filename} \n ${e.stack}`); + } + } } diff --git a/game-server/app/services/checkParam.ts b/game-server/app/services/checkParam.ts index d3af32988..9bf888c75 100644 --- a/game-server/app/services/checkParam.ts +++ b/game-server/app/services/checkParam.ts @@ -1602,6 +1602,13 @@ export function checkRouteParam(route: string, msg: any) { if(!checkNaturalNumbers(msg.stage)) return false; break; } + case "battle.ladderHandler.getRec": + { + if(!checkNaturalStrings(msg.name)) return false; + if(!checkStringIfExist(msg.notice)) return false; + if(!checkNaturalNumbers(msg.icon)) return false; + break; + } case "role.heroHandler.addItem": { if(!isDevelopEnv() && !checkNaturalNumbers(msg.id, msg.count)) return false; diff --git a/game-server/app/services/gmService.ts b/game-server/app/services/gmService.ts index 65ccb48a3..bc9243590 100644 --- a/game-server/app/services/gmService.ts +++ b/game-server/app/services/gmService.ts @@ -414,4 +414,8 @@ export function getPastTime() { export function getFutureTime() { return moment('2100-01-01').unix(); +} + +export function initServerZone() { + } \ No newline at end of file diff --git a/game-server/app/services/guildService.ts b/game-server/app/services/guildService.ts index 181c00763..5db467599 100644 --- a/game-server/app/services/guildService.ts +++ b/game-server/app/services/guildService.ts @@ -27,6 +27,8 @@ import { RewardInter } from "../pubUtils/interface"; import { getGuildFundByRefTime } from "./donateService"; import { BattleRecordModel } from "../db/BattleRecord"; import { BossInstanceModel } from "../db/BossInstance"; +import { pick } from "underscore"; +import { memberJoinGuildToLeague } from "./gvg/gvgTeamService"; export async function getMyGuildInfo(roleId: string, sid: string, userGuild: UserGuildType, guild: GuildType, serverId: number, session: FrontendOrBackendSession) { @@ -51,7 +53,7 @@ export async function getMyGuildInfo(roleId: string, sid: string, userGuild: Use let guildActive = await getTodayGuildActive(guild.code); // 返回 - return { hasGuild: true, guildMemberMax, ...guild, activeDaily: guildActive, leader: { ...leader, isOnline: leaderIsOnline }, rank, myInfo: { ...userGuild } }; + return { hasGuild: true, guildMemberMax, ...guild, activeDaily: guildActive, leader: { ...pick(leader, ['ce', 'lv', 'quitTime', 'roleId', 'roleName', 'head', 'frame', 'spine', 'title', 'isOnline']), isOnline: leaderIsOnline }, rank, myInfo: { ...userGuild } }; } /** @@ -116,6 +118,7 @@ export async function joinGuild(code: string, guildName: string, lv: number, rol return { status: -1, resResult: resResult(STATUS.GUILD_HAS_JOIN) }; } await updateUserInfo(REDIS_KEY.USER_INFO, roleId, [{ field: 'guildName', value: guildName }]); + await memberJoinGuildToLeague(guild, role); const userGuild = await UserGuildModel.createUserGuild(guild.code, role, false); if (!userGuild) { diff --git a/game-server/app/services/gvg/gvgService.ts b/game-server/app/services/gvg/gvgService.ts new file mode 100644 index 000000000..e4528ebdb --- /dev/null +++ b/game-server/app/services/gvg/gvgService.ts @@ -0,0 +1,179 @@ +import { pinus } from "pinus"; +import { GVGConfigModel, GVGConfigType } from "../../db/GVGConfig"; +import { getTimeFun, getZeroPoint, getZeroPointOfTime, nowSeconds, WEEK_TO_SECOND } from "../../pubUtils/timeUtil"; +import { getAllServerCreateTime, getServerCreateTime } from "../redisService"; +import { GVG_PERIOD, GVG_SERVER_TYPE, SHOP_REFRESH_TYPE } from "../../consts"; +import { GVGLeagueModel } from "../../db/GVGLeague"; +import { GVGLeaguePrepareModel } from "../../db/GVGLeaguePrepare"; +import { GVGServerGroupModel } from "../../db/GVGServerGroup"; +import { gameData } from "../../pubUtils/data"; +import { getRandSingleEelm } from "../../pubUtils/util"; +import { GVG } from "../../pubUtils/dicParam"; +import { ServerlistModel } from "../../db/Serverlist"; +import { GuildType } from "../../db/Guild"; + +// 定时器相关 +export async function createNewGVGConfig() { + let { teamTime, prepareTime, battleTime, scheduleTime } = getPeriodTime(); + const config = await GVGConfigModel.createNewConfig(teamTime, prepareTime, battleTime, scheduleTime); + setGVGConfigToRemote(config); + // TODO 每周自动解散一些联军 + await pinus.app.rpc.guild.guildRemote.setGVGServerGroup.broadcast(); + return config; +} + +// 获取各个周期的时间,大约每周日5点的时候刷的 +export function getPeriodTime() { + let now = new Date(); + let curDay = now.getDay(); // 今天星期几 + + let teamConfig = gameData.gvgPeriod.get(GVG_PERIOD.TEAM); + let prepareConfig = gameData.gvgPeriod.get(GVG_PERIOD.PREPARE); + let battleConfig = gameData.gvgPeriod.get(GVG_PERIOD.BATTLE); + + // 如果现在是周日,那么就是本周期的组队开始时间,如果是其他日子(启动初始化),就是下周期的组队开始时间 + let _teamTime = getTimeFun().getTimeWithWeek(teamConfig.startDay, teamConfig.startHour, teamConfig.startMinute, teamConfig.startSecond); + let _prepareTime = getTimeFun().getTimeWithWeek(prepareConfig.startDay, prepareConfig.startHour, prepareConfig.startMinute, prepareConfig.startSecond); + let _battleTime = getTimeFun().getTimeWithWeek(battleConfig.startDay, battleConfig.startHour, battleConfig.startMinute, battleConfig.startSecond); + console.log('_teamTime: ', _teamTime); + + let teamTime = curDay == 0? _teamTime: _teamTime - 7 * 86400; + let prepareTime = curDay == 0? _prepareTime + 7 * 86400: _prepareTime; + let battleTime = curDay == 0? _battleTime + 7 * 86400: _battleTime; + let scheduleTime = teamTime + 7 * 86400; + + return { teamTime, prepareTime, battleTime, scheduleTime } +} + +export async function getGVGConfigFromRemote() { + let guildServers = pinus.app.getServersByType('guild'); + let server = getRandSingleEelm(guildServers); + return await pinus.app.rpc.guild.guildRemote.getGVGConfig.toServer(server.id); +} + +export function setGVGConfigToRemote(config: GVGConfigType) { + if(!config) return null + pinus.app.rpc.guild.guildRemote.setGVGConfig.broadcast(config); +} + +export function setGVGConfig(config: GVGConfigType) { + if(!config) return null + pinus.app.set('gvgConfigId', config.configId); + pinus.app.set('gvgTeamTime', config.teamTime); + pinus.app.set('gvgPrepareTime', config.prepareTime); + pinus.app.set('gvgBattleTime', config.battleTime); + pinus.app.set('gvgScheduleTime', config.scheduleTime); +} + +export function getGVGConfig() { + let configId = pinus.app.get('gvgConfigId'); + let teamTime = pinus.app.get('gvgTeamTime'); + let prepareTime = pinus.app.get('gvgPrepareTime'); + let battleTime = pinus.app.get('gvgBattleTime'); + let scheduleTime = pinus.app.get('gvgScheduleTime'); + return { configId, teamTime, prepareTime, battleTime, scheduleTime } +} + +function getServerTypeByTime(openTime: number) { + let today = nowSeconds(); + if(today - openTime < WEEK_TO_SECOND) return GVG_SERVER_TYPE.NO; + let toWeek = getCurrentTeamTime(today); + let openWeek = getCurrentTeamTime(openTime); + let n = Math.floor((toWeek - openWeek) / WEEK_TO_SECOND); + return n <= GVG.GVG_CROSS_SERVICE_STARTTIME? GVG_SERVER_TYPE.SINGLE: GVG_SERVER_TYPE.MULTI; +} + +function getCurrentTeamTime(time: number) { + let teamConfig = gameData.gvgPeriod.get(GVG_PERIOD.TEAM); + // 本周日 + let _teamTime = getTimeFun(time).getTimeWithWeek(teamConfig.startDay, teamConfig.startHour, teamConfig.startMinute, teamConfig.startSecond); + return _teamTime > time? _teamTime - WEEK_TO_SECOND: _teamTime; +} + +export async function getGVGServerType(serverId: number) { + console.log('#### serverId', serverId) + let openTime = await getServerCreateTime(serverId); + return getServerTypeByTime(openTime) +} + +export function getGVGPeriodData() { + let { configId, teamTime, prepareTime, battleTime, scheduleTime } = getGVGConfig(); + let period = getCurPeriod(); + let countdownTime = teamTime; + switch(period) { + case GVG_PERIOD.TEAM: { + countdownTime = prepareTime; break; + } + case GVG_PERIOD.PREPARE: { + countdownTime = battleTime; break; + } + case GVG_PERIOD.BATTLE: { + countdownTime = scheduleTime; break; + } + } + return { configId, period, countdownTime }; +} + +export function getCurPeriod() { + let { teamTime, prepareTime, battleTime } = getGVGConfig(); + let now = nowSeconds(); + if(now >= teamTime && now < prepareTime) { + return GVG_PERIOD.TEAM; + } else if (now >= prepareTime && now < battleTime) { + return GVG_PERIOD.PREPARE; + } else { + return GVG_PERIOD.BATTLE; + } +} + +export async function initLeaguePrepare() { + const { configId } = getGVGConfig(); + + const leagues = await GVGLeagueModel.findAllLeague(); + for(let { leagueCode, memberCnt } of leagues) { + await GVGLeaguePrepareModel.initData(configId, leagueCode, memberCnt); + } +} + +export async function setGVGServerGroup() { + const servers = await ServerlistModel.findByEnv(pinus.app.get('env')); + const serverGroups = await GVGServerGroupModel.findByTime(nowSeconds()); + pinus.app.set('gvgServerGroup', servers.map(obj => { + let server = serverGroups.find(cur => cur.serverId == obj.serverId); + return { serverId: obj.id, groupId: server? server.groupId: obj.groupId } + })); +} + +// 查询本小区所在的战区 +// gvgServerGroup: id-小区唯一id serverId-小区在大区下的id +export async function getGroupIdOfServer(id: number) { + let arr: { serverId: number; groupId: number }[] = pinus.app.get('gvgServerGroup')||[]; + let obj = arr.find(cur => cur.serverId == id); + return obj?.groupId||0; +} + +// 查询当前和本小区同一个战区的其他小区 +export async function getServersOfSameGroup(type: GVG_SERVER_TYPE, id: number) { + if(type == GVG_SERVER_TYPE.SINGLE) return [id]; + + let groupId = await getGroupIdOfServer(id); + let arr: { serverId: number; groupId: number }[] = pinus.app.get('gvgServerGroup')||[]; + let serverCreateTimes = await getAllServerCreateTime(); + + return arr.filter(obj => { + let openTime = parseInt(serverCreateTimes[obj.serverId]); + return obj.groupId == groupId && getServerTypeByTime(openTime) == type; + }).map(obj => obj.serverId); +} + +export async function getGVGInfoInGuild(guild: GuildType) { + let hasLeague = !!guild.leagueCode; + let serverId = guild.serverId; + let { configId, period, countdownTime } = getGVGPeriodData(); + let type = await getGVGServerType(serverId); + return { + hasLeague, + configId, period, countdownTime, + type + } +} \ No newline at end of file diff --git a/game-server/app/services/gvg/gvgTeamService.ts b/game-server/app/services/gvg/gvgTeamService.ts new file mode 100644 index 000000000..2bad88776 --- /dev/null +++ b/game-server/app/services/gvg/gvgTeamService.ts @@ -0,0 +1,228 @@ +// 和gvg组建期相关的方法 + +import { GUILD_AUTH, GVG_APPLY_TYPE, GVG_PERIOD, GVG_SERVER_TYPE, LEAGUE_AUTH, LEAGUE_MANAGE_TYPE, PUSH_ROUTE, STATUS } from "../../consts"; +import { GuildModel, GuildType } from "../../db/Guild"; +import { GVGLeagueModel, GVGLeagueType, GVGLeagueUpdate } from "../../db/GVGLeague"; +import { GVGLeagueApplyModel, GVGLeagueApplyType } from "../../db/GVGLeagueApply"; +import { GVGLeaguePrepareModel, GVGLeaguePrepareType } from "../../db/GVGLeaguePrepare"; +import { RoleType } from "../../db/Role"; +import { UserGuildModel } from "../../db/UserGuild"; +import { LeagueGuildInfo, LeagueListInfo } from "../../domain/gvgField/returnData"; +import { GVG } from "../../pubUtils/dicParam"; +import { getZeroPointD } from "../../pubUtils/timeUtil"; +import { resResult } from "../../pubUtils/util"; +import { sendMessageToUserWithSuc } from "../pushService"; +import { getCurPeriod, getGVGConfig, getGVGPeriodData, getGVGServerType } from "./gvgService"; + +/** + * 自动创建联军 + * @param guildCode 创建联军的那个军团 + * @returns GVGLeagueType + */ +export async function autoCreateLeague(guildCode: string) { + let guild = await GuildModel.findByCode(guildCode, null, '+members +serverId'); + if(!guild || guild.lv < GVG.GVG_ARMY_LEAGUE_TIME) return; + + let period = getCurPeriod(); + if(period == GVG_PERIOD.PREPARE || period == GVG_PERIOD.BATTLE) { + return await createLeague(guild, {}); + } +} + +/** + * 创建联军 + * @param guild 创建联军的那个军团 + * @param params 联军的一些初始数据 + * @returns + */ +export async function createLeague(guild: GuildType, params: GVGLeagueUpdate) { + let serverType = await getGVGServerType(guild.serverId); + params.type = serverType; + params.serverId = guild.serverId; + const league = await GVGLeagueModel.createLeague(guild, params); + await GuildModel.joinLeague(guild.code, league.leagueCode); + return league; +} + +/** + * 获取在联军中的职位 + * @param league + * @param roleId + * @returns + */ +export function getMyAuth(league: GVGLeagueType, roleId: string) { + let members = league.members; + let member = members.find(cur => cur.roleId == roleId); + return member?.auth?? LEAGUE_AUTH.MEMBER; +} + +/** + * 加入联军的当天如果是在准备期,这天不能去参加内政 + * @param roleId + * @returns + */ +export async function checkCanPrepare(roleId: string) { + let userGuild = await UserGuildModel.getMyGuild(roleId, 'createdAt'); + let today = getZeroPointD(); + return userGuild.createdAt < today; +} + +/** + * 是否可以选择职能,如果选择的人数超过了就不可以选 + * @param myJob + * @param league + * @returns + */ +export function checkCanChooseJob(myJob: number, league: GVGLeaguePrepareType) { + if(myJob > 0) return false; + if(!league) return false; + let { producerCnt, fighterCnt, maxMemberCnt } = league; + return producerCnt + fighterCnt <= maxMemberCnt; +} + +/** + * 获取申请数据 + * @param apply 本条申请原数据 + * @param serverNames 全服务器的名字from redis + * @param invitations 本联军向其他军团发出的邀请 + * @returns + */ +export function getLeagueApplyData(apply: GVGLeagueApplyType, serverNames: any, invitations: GVGLeagueApplyType[] ) { + let data = new LeagueGuildInfo(apply.guild, serverNames); + let hasInvited = !!invitations.find(cur => cur.guildCode == apply.guildCode); + data.setHasInvited(hasInvited); + return data; +} + +/** + * 获取邀请数据 + * @param invite 本条邀请原数据 + * @param serverNames 全服务器的名字from redis + * @param applies 本军团向其他联军发出的申请 + * @returns + */ +export function getLeagueInviteData(invite: GVGLeagueApplyType, serverNames: any, applies: GVGLeagueApplyType[]) { + let data = new LeagueListInfo(invite.league, serverNames); + let hasApply = !!applies.find(cur => cur.leagueCode == invite.guildCode); + data.setHasApply(hasApply); + return data; +} + +/** + * 联军加入军团 + * @param myLeague + * @param targetGuildCode + * @returns + */ +export async function joinGuildToLeague(league: GVGLeagueType, targetGuildCode: string) { + const hasApply = await GVGLeagueApplyModel.checkApply(league.leagueCode, targetGuildCode, GVG_APPLY_TYPE.ALL); + if(!hasApply) { + return resResult(STATUS.GUILD_NOT_APPLY); + } + if(league.guildCnt >= GVG.GVG_LEAGUE_COMPOSE) { + return resResult(STATUS.LEAGUE_IS_GUILD_MAX); + } + let hisLeague = await GVGLeagueModel.findLeagueByGuild(targetGuildCode); + if(hisLeague) { + await GVGLeagueApplyModel.deleteApply(targetGuildCode, league.leagueCode); + return resResult(STATUS.TARGET_GUILD_HAS_LEAGUE); + } + + const targetGuild = await GuildModel.findByCode(targetGuildCode, null, '+members'); + if(!targetGuild) return resResult(STATUS.TARGET_GUILD_NOT_FOUND); + if(targetGuild.lv < GVG.GVG_ARMY_LEAGUE_TIME) return resResult(STATUS.GUILD_LV_NOT_ENOUGH); + + league = await GVGLeagueModel.joinGuild(league.leagueCode, targetGuild); + + await GuildModel.joinLeague(targetGuildCode, league.leagueCode); + + return resResult(STATUS.SUCCESS, league); +} + +/** + * 检查是否可以进行组建联军等操作 + * @param serverId + * @param serverType + * @returns + */ +export async function checkCanManage(serverId: number, serverType?: number) { + if(!serverType) serverType = await getGVGServerType(serverId); + if(serverType != GVG_SERVER_TYPE.MULTI) return resResult(STATUS.GVG_TEAM_SERVER_TYPE_ERR); + let { period } = getGVGPeriodData(); + if(period != GVG_PERIOD.TEAM) return resResult(STATUS.GVG_NOT_TEAM_PERIOD); + return resResult(STATUS.SUCCESS); +} + +/** + * 一些操作只能由军团的团长才能操作 + * @param guildCode + * @param roleId + * @param guild + * @returns + */ +export async function checkGuildLeader(guildCode: string, roleId: string, guild?: GuildType) { + if(!guild) guild = await GuildModel.findByCode(guildCode, null, '+members +serverId'); + if(!guild) return resResult(STATUS.GVG_HAS_NO_AUTH); + if(guild.lv < GVG.GVG_ARMY_LEAGUE_TIME) return resResult(STATUS.GUILD_LV_NOT_ENOUGH); + + const userGuild = await UserGuildModel.getMyGuild(roleId, 'auth'); + if(!userGuild || userGuild.auth != GUILD_AUTH.LEADER) return resResult(STATUS.GVG_HAS_NO_AUTH); + return resResult(STATUS.SUCCESS); +} + +/** + * 检查联军的操作 + * @param roleId + * @param myLeague + * @param type + * @returns + */ +export async function checkLeagueAuth(roleId: string, myLeague: GVGLeagueType, type: LEAGUE_MANAGE_TYPE) { + const auth = getMyAuth(myLeague, roleId); + const needAuth = getAuthFromManageType(type); + return needAuth.indexOf(auth) > -1 +} + +function getAuthFromManageType(type: LEAGUE_MANAGE_TYPE) { + switch(type) { + case LEAGUE_MANAGE_TYPE.HANDLE_APPLY: + case LEAGUE_MANAGE_TYPE.INVITE: + case LEAGUE_MANAGE_TYPE.KICK: + case LEAGUE_MANAGE_TYPE.DISSMISS: + case LEAGUE_MANAGE_TYPE.ABDICATE: + return [LEAGUE_AUTH.LEADER]; + case LEAGUE_MANAGE_TYPE.QUIT: + case LEAGUE_MANAGE_TYPE.BE_ABDICATED: + return [LEAGUE_AUTH.SUB_LEADER]; + case LEAGUE_MANAGE_TYPE.SET_INFO: + return [LEAGUE_AUTH.LEADER, LEAGUE_AUTH.SUB_LEADER]; + } +} + +export async function memberJoinGuildToLeague(guild: GuildType, role: RoleType) { + if(!guild.leagueCode) return; + let league = await GVGLeagueModel.joinMember(guild.leagueCode, role.roleId, role.ce); + // TODO redis联军更新 + console.log(league); +} + +export async function memberQuitGuildToLeague(guild: GuildType, role: RoleType) { + if(!guild.leagueCode) return; + let league = await GVGLeagueModel.quitMember(guild.leagueCode, role.roleId, role.ce); + // TODO redis联军更新 + console.log(league); +} + +export async function guildDismissToLeague(guild: GuildType) { + if(!guild.leagueCode) return; + let league = await GVGLeagueModel.quitGuild(guild.leagueCode, guild); + // TODO redis联军更新 + console.log(league); +} + +export async function guildAbdicateToLeague(guild: GuildType, fromRoleId: string, toRole: RoleType) { + if(!guild.leagueCode) return; + let league = await GVGLeagueModel.abdicateGuild(guild.leagueCode, fromRoleId, toRole.roleId, toRole._id); + // TODO redis联军更新 + console.log(league); +} \ No newline at end of file diff --git a/game-server/app/services/playerCeService.ts b/game-server/app/services/playerCeService.ts index 8359e7153..c4df11656 100644 --- a/game-server/app/services/playerCeService.ts +++ b/game-server/app/services/playerCeService.ts @@ -20,6 +20,7 @@ import { sendMessageToUserWithSuc } from './pushService'; import { SkinType } from '../db/Skin'; import { LadderMatchModel } from '../db/LadderMatch'; import { ArtifactModelType } from '../db/Artifact'; +import { GVGLeagueModel } from '../db/GVGLeague'; interface Param { isInitRole?: boolean, @@ -454,6 +455,7 @@ export async function calculateCes(type: HERO_SYSTEM_TYPE, roleId: string, serve roleCe = await RoleCeModel.updateRoleCe(roleId, roleCeUpdate); let role = await RoleModel.incRoleInfo(roleId, { ...roleIncUpdate, ce: roleInc }, { ...roleUpdate, topLineup, topLineupCe }); let guild = await GuildModel.updateCe(roleId, roleInc); // 公会更新战力 + let league = await GVGLeagueModel.updateCe(roleId, roleInc); // 联军更新战力 saveCeChangeLog(role, roleInc, role.ce, type, ceChangeTxt); updateRank(roleId, serverId, topLineupCe, role, pushHeros, guild); @@ -461,6 +463,9 @@ export async function calculateCes(type: HERO_SYSTEM_TYPE, roleId: string, serve if(hasTopCeChange) await updateRoleOnlineInfo(roleId, { topLineupCe }); if(guild) { await updateUserInfo(REDIS_KEY.GUILD_INFO, guild.code, [{ field: 'guildCe', value: guild.guildCe }]); + } + if(league) { // TODO 联军排行榜需要更新数据 + } return { heroes, curRole: role } } diff --git a/game-server/app/services/redisService.ts b/game-server/app/services/redisService.ts index 65ee615b0..9875b4eda 100644 --- a/game-server/app/services/redisService.ts +++ b/game-server/app/services/redisService.ts @@ -513,7 +513,7 @@ async function setServerList() { await redisClient().delAsync(REDIS_KEY.SERVER); await redisClient().delAsync(REDIS_KEY.SERVER_OPEN_TIME); - for(let { id, name, openTime, env } of serverList) { + for(let { id, serverId, name, openTime, env } of serverList) { if(env == pinus.app.get('env')) { // console.log(roleId); await redisClient().hsetAsync(REDIS_KEY.SERVER, `${id}`, `${name}`); @@ -536,7 +536,7 @@ export async function getAllServers() { } export async function getAllServerName() { - let servers = await redisClient().hgetallAsync(REDIS_KEY.SERVER); + let servers = await redisClient().hgetallAsync(REDIS_KEY.SERVER); return servers; } @@ -550,6 +550,11 @@ export async function getServerCreateTime(serverId: number) { return parseInt(time); } +export async function getAllServerCreateTime() { + let servers = await redisClient().hgetallAsync(REDIS_KEY.SERVER_OPEN_TIME); + return servers; +} + export function redisClient() { const client: Redis.RedisClient = pinus.app.get('redis'); return client; diff --git a/game-server/app/services/timeTaskService.ts b/game-server/app/services/timeTaskService.ts index d96abf9e3..1b4af1a0b 100644 --- a/game-server/app/services/timeTaskService.ts +++ b/game-server/app/services/timeTaskService.ts @@ -42,6 +42,8 @@ import { LadderMatchModel } from '../db/LadderMatch'; import { getGroupShopTimers, refundGroupShop, setGroupShopToSetSum } from './activity/groupShopService'; import { HiddenDataModel, HiddenDataModelType } from '../db/HiddenData'; import { setHiddenData, setHiddenDataToMemory } from './dataService'; +import { GVGConfigModel } from '../db/GVGConfig'; +import { createNewGVGConfig, initLeaguePrepare, setGVGConfigToRemote } from './gvg/gvgService'; const PER_SECOND = 1 * 1000; const PER_DAY = 24 * 60 * 60; @@ -106,6 +108,9 @@ export async function init() { // 隐藏数据定时器 initHiddenDataSchedule(true); + + // gvg每周日 + initGVGConfigSchedule(); } // 每日刷新 @@ -889,4 +894,26 @@ export async function initHiddenDataSchedule(isInit: boolean, data?: HiddenDataM }); } } -// —————————————— 配表兼容 end —————————————— // \ No newline at end of file +// —————————————— 配表兼容 end —————————————— // + +// —————————————— gvg start —————————————— // +export async function initGVGConfigSchedule() { + let config = await GVGConfigModel.findConfig(); + if(!config) { + config = await createNewGVGConfig(); + } + setGVGConfigToRemote(config); + + if(nowSeconds() > config.scheduleTime) { + config = await createNewGVGConfig(); + } else { + scheduleJob(`gvgConfig`, config.scheduleTime * 1000, createNewGVGConfig); + } + + if(nowSeconds() > config.prepareTime) { + initLeaguePrepare(); + } else { + scheduleJob(`gvgPrepare`, config.prepareTime * 1000, initLeaguePrepare); + } +} +// —————————————— gvg end —————————————— // \ No newline at end of file diff --git a/gm-server/app/controller/game.ts b/gm-server/app/controller/game.ts index 51e0e6c0c..fd474fde6 100644 --- a/gm-server/app/controller/game.ts +++ b/gm-server/app/controller/game.ts @@ -215,4 +215,16 @@ export default class GameController extends Controller { ctx.body = await ctx.service.game.getExistHiddenData(type); return } + + public async getGVGServerGroup() { + const { ctx } = this; + ctx.body = await ctx.service.game.getGVGServerGroup(); + return + } + + public async getGVGConfig() { + const { ctx } = this; + ctx.body = await ctx.service.game.getGVGConfig(); + return + } } diff --git a/gm-server/app/router.ts b/gm-server/app/router.ts index 453643233..d4f81e316 100644 --- a/gm-server/app/router.ts +++ b/gm-server/app/router.ts @@ -60,6 +60,8 @@ export default (app: Application) => { router.post('/api/game/updatechannel', controller.game.updateChannel); router.post('/api/game/gethiddendata', controller.game.getHiddenData); router.post('/api/game/getexisthiddendata', controller.game.getExistHiddenData); + router.post('/api/game/getgvgservergroup', controller.game.getGVGServerGroup); + router.post('/api/game/getgvgconfig', controller.game.getGVGConfig); router.post('/api/dic/getdicgoods', tokenParser, controller.game.getDicGoods); router.post('/api/dic/getdichero', tokenParser, controller.game.getDicHero); diff --git a/gm-server/app/service/Game.ts b/gm-server/app/service/Game.ts index 72ab0fd94..97c9fbf0a 100644 --- a/gm-server/app/service/Game.ts +++ b/gm-server/app/service/Game.ts @@ -23,6 +23,8 @@ import { ChannelInfoModel } from '@db/ChannelInfo'; import { PVPConfigModel } from '@db/PvpConfig'; import { HiddenDataByIdModel } from '@db/HiddenDataById'; import { isNumber } from 'util'; +import { GVGServerGroupModel } from '@db/GVGServerGroup'; +import { GVGConfigModel } from '@db/GVGConfig'; /** * Test Service @@ -347,4 +349,31 @@ export default class Game extends Service { ids: existIds }); } + + public async getGVGServerGroup() { + const { ctx } = this; + const serverlists = await ServerlistModel.findByEnv(this.app.config.realEnv); + const currentTypes = await GVGServerGroupModel.findByTime(nowSeconds()); + const nextTypes = await GVGServerGroupModel.findByTime(nowSeconds() + 7 * 86400); + + const servers = serverlists.map(server => { + let current = currentTypes.find(obj => obj.serverId == server.id); + let next = nextTypes.find(obj => obj.serverId == server.id); + let dic = gameData.serverNames.get(server.id); + return { id: server.id, serverId: server.serverId, name: server.name, current: current?.groupId|| dic.groupId, next: next?.groupId|| current?.groupId || dic.groupId, env: this.app.config.realEnv } + }); + + return ctx.service.utils.resResult(STATUS.SUCCESS, { + list: servers + }); + } + + public async getGVGConfig() { + const { ctx } = this; + const gvgconfig = await GVGConfigModel.findConfig(); + + return ctx.service.utils.resResult(STATUS.SUCCESS, { + list: gvgconfig?[{...gvgconfig, env: this.app.config.realEnv }]: [] + }); + } } diff --git a/gm-server/typings/config/plugin.d.ts b/gm-server/typings/config/plugin.d.ts index 39c01f0fb..d789dcfce 100644 --- a/gm-server/typings/config/plugin.d.ts +++ b/gm-server/typings/config/plugin.d.ts @@ -31,5 +31,6 @@ declare module 'egg' { jsonp?: EggPluginItem; view?: EggPluginItem; cors?: EggPluginItem; + xtransit?: EggPluginItem; } } \ No newline at end of file diff --git a/shared/consts/constModules/chatConst.ts b/shared/consts/constModules/chatConst.ts index 8de14ae86..08f83e1a9 100644 --- a/shared/consts/constModules/chatConst.ts +++ b/shared/consts/constModules/chatConst.ts @@ -170,4 +170,8 @@ export const PUSH_ROUTE = { LADDER_RANK_UPDATE: 'onLadderRankUpdate', GROUP_SHOP_UPDATE: 'onGroupShopUpdate', HIDDEN_DATA: 'onHiddenData', + LEAGUE_APPLY: 'onLeagueApply', // 当联军收到军团申请 + LEAGUE_KICK: 'onKickedByLeague', // 当被踢出 + LEAGUE_DISSMISS: 'onLeagueDismiss', // 当联军解散 + LEAGUE_ABDICATE: 'onLeagueAbdicate', // 当被转让盟主 } \ No newline at end of file diff --git a/shared/consts/constModules/gvgConst.ts b/shared/consts/constModules/gvgConst.ts new file mode 100644 index 000000000..4d60eb885 --- /dev/null +++ b/shared/consts/constModules/gvgConst.ts @@ -0,0 +1,34 @@ +export enum GVG_PERIOD { + TEAM = 1, // 组建期 + PREPARE = 2, // 备战期 + BATTLE = 3, // 战斗器 +} + +export enum LEAGUE_AUTH { + LEADER = 1, // 盟主 + SUB_LEADER = 2, // 副盟主 + MEMBER = 3, // 平民 +} + +export enum GVG_SERVER_TYPE { + NO = 0, // 刚开服根本不能参加的时候 + SINGLE = 1, // 单服 + MULTI = 2, // 跨服 +} + +export enum GVG_APPLY_TYPE { + ALL = 0, + APPLY = 1, // 军团向联军申请 + INVITE = 2, // 联军向军团邀请 +} + +export enum LEAGUE_MANAGE_TYPE { + HANDLE_APPLY = 1, // 处理申请 + INVITE = 2, // 邀请军团 + KICK = 3, // 踢出军团 + QUIT = 4, // 主动退出 + DISSMISS = 5, // 解散联军 + ABDICATE = 6, // 转让 + BE_ABDICATED = 7, // 被转让 + SET_INFO = 8, // 设置信息 +} \ No newline at end of file diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index 74246650c..fd238da56 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -54,6 +54,7 @@ export const COUNTER = { RACE_ACTIVITY: { name: 'raceAct', def: 1 }, HIDDEN_DATA: { name: 'hiddendata', def: 1 }, ARTIFACT_ID: { name: 'artid', def: 1 }, + GVG_CONFIG: { name: 'gvg', def: 1 }, }; export const DEFAULT_HEROES = [19, 53,]; @@ -565,6 +566,7 @@ export const FILENAME = { DIC_ARTIFACT_QUALITY_PLAN: 'dic_zyz_artifactQualityPlan', DIC_ARTIFACT_QUALITY: 'dic_zyz_artifactQuality', DIC_ARTIFACT_SEID: 'dic_zyz_artifactSeid', + DIC_GVG_PERIOD: 'dic_zyz_GVGPeriod', } export const WAR_RELATE_TABLES = [ diff --git a/shared/consts/index.ts b/shared/consts/index.ts index 78f5b53c7..7a4f56bee 100644 --- a/shared/consts/index.ts +++ b/shared/consts/index.ts @@ -10,5 +10,6 @@ export * from './constModules/chatConst'; export * from './constModules/httpConst'; export * from './constModules/auctionConst'; export * from './constModules/mailConst'; +export * from './constModules/gvgConst'; export * from './statusCode'; export * from './dataName'; \ No newline at end of file diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index fe5555b2a..38e7c7946 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -287,6 +287,25 @@ export const STATUS = { LADDER_RANK_ERR: { code: 21208, simStr: '不可连战比排名自己高的玩家' }, LADDER_SWEEP_TIMES_OVER: { code: 21209, simStr: '连战次数过多' }, + // GVG相关 + GVG_HAS_NO_AUTH: { code: 21300, simStr: '您的权限不足' }, + GVG_NOT_TEAM_PERIOD: { code: 21301, simStr: '您只能在组建期创建联军' }, + GVG_TEAM_SERVER_TYPE_ERR: { code: 21302, simStr: '单服玩法不需要联军' }, + GVG_LEAGUE_HAS_EXIST: { code: 21303, simStr: '联军已存在' }, + GVG_NO_SERVER_TYPE: { code: 21304, simStr: '服务器开服一周后开放玩法' }, + LEAGUE_IS_GUILD_MAX: { code: 21305, simStr: '该联军军团数已满' }, + GVG_LEAGUE_NOT_EXIST: { code: 21306, simStr: '联军不存在' }, + TARGET_GUILD_HAS_LEAGUE: { code: 21307, simStr: '对方已加入其他联军' }, + TARGET_GUILD_NOT_FOUND: { code: 21308, simStr: '未找到该军团' }, + GUILD_NOT_APPLY: { code: 21309, simStr: '对方军团未申请' }, + GUILD_LV_NOT_ENOUGH: { code: 31310, simStr: '军团等级不足' }, + GVG_CANNOUT_KICK_SELF_GUILD: { code: 31311, simStr: '不可踢走自己的军团' }, + GUILD_HAS_QUIT: { code: 31312, simStr: '军团已经退出联军了' }, + GVG_CANNOT_QUIT_OTHER_GUILD: { code: 31313, simStr: '只能主动退出自己的军团' }, + LEAGUE_CODE_ERR: { code: 31314, simStr: '不能解散其他联军' }, + GVG_HE_HAS_NO_AUTH: { code: 21300, simStr: '对方权限不足' }, + LEAGUE_NAME_DUP: { code: 21301, simStr: '联军名重复' }, + // 通用 30000 - 30099 DIC_DATA_NOT_FOUND: { code: 30000, simStr: '数据表未找到' }, ROLE_MATERIAL_NOT_ENOUGH: { code: 30001, simStr: '材料数量不足' }, @@ -572,6 +591,7 @@ export const STATUS = { GM_HIDDEN_CANNOT_INIT: { code: 60030, simStr: '已初始化过' }, GM_ACTIVITY_TIME_ERR: { code: 60031, simStr: '时间不可有重叠' }, GM_USER_TYPE_ERR: { code: 60032, simStr: '您不可使用账号密码登录,请从专属后台点击链接进入' }, + GM_GVG_TIME_ERR: { code: 60033, simStr: '时间配置错误' }, // 支付相关状态 70000 - 79999 NO_PRODUCT_ID: { code: 70001, simStr: '无效商品' }, NO_PAY_TYPE: { code: 70002, simStr: '无效支付类型' }, diff --git a/shared/db/GVGConfig.ts b/shared/db/GVGConfig.ts new file mode 100644 index 000000000..fcc177413 --- /dev/null +++ b/shared/db/GVGConfig.ts @@ -0,0 +1,48 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; +import { CounterModel } from './Counter'; +import { COUNTER } from '../consts'; + +@index({ configId: -1 }) +export default class GVGConfig extends BaseModel { + + @prop({ required: true, default: 1 }) + configId: number; // 配置唯一id + + @prop({ required: true }) + teamTime: number; // 组建期开始 + + @prop({ required: true }) + prepareTime: number; // 准备期开始 + + @prop({ required: true }) + battleTime: number; // 激战期开始 + + @prop({ required: true }) + scheduleTime: number; // 下次定时任务时间 + + public static async createNewConfig(teamTime: number, prepareTime: number, battleTime: number, scheduleTime: number) { + const configId = await CounterModel.getNewCounter(COUNTER.GVG_CONFIG); + const result: GVGConfigType = await GVGConfigModel.findOneAndUpdate({ configId }, { $set: { teamTime, prepareTime, battleTime, scheduleTime } }, { upsert: true, new: true }).lean(); + return result; + } + + public static async findConfig() { + let configId = await CounterModel.getCounter(COUNTER.GVG_CONFIG); + const result: GVGConfigType = await GVGConfigModel.findOne({ configId }, { _id: 0 }).lean(); + return result; + } + + public static async updateConfig(configId: number, teamTime: number, prepareTime: number, battleTime: number, scheduleTime: number) { + const result: GVGConfigType = await GVGConfigModel.findOneAndUpdate({ configId }, { $set: { teamTime, prepareTime, battleTime, scheduleTime } }, { new: true }).lean(); + return result; + } + +} + +export const GVGConfigModel = getModelForClass(GVGConfig); + +export interface GVGConfigType extends Pick, keyof GVGConfig> { + id: number; +}; +export type GVGConfigUpdate = Partial; // 将所有字段变成可选项 diff --git a/shared/db/GVGLeague.ts b/shared/db/GVGLeague.ts new file mode 100644 index 000000000..110187e8d --- /dev/null +++ b/shared/db/GVGLeague.ts @@ -0,0 +1,195 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType, mongoose, Ref } from '@typegoose/typegoose'; +import Role, { RoleType } from '../db/Role'; +import { genCode } from '../pubUtils/util'; +import { GuildType } from './Guild'; +import { LEAGUE_AUTH } from '../consts'; + +class Member { + @prop({ required: true }) + roleId: string; + @prop({ required: true }) + auth: number; +} + +@index({ leagueCode: 1, status: 1 }) +@index({ guildCodes: 1, status: 1 }) +@index({ 'members.roleId': 1, status: 1 }) +export default class GVGLeague extends BaseModel { + + @prop({ required: true }) + leagueCode: string; // 唯一id + + @prop({ required: true, type: String }) + guildCodes: string[]; // 包含军团 + + @prop({ required: true, ref: () => Role, type: mongoose.Schema.Types.ObjectId }) + leader: Ref; + + @prop({ required: true, default: '' }) + name: string; // 名称 + + @prop({ required: true, default: 1 }) + icon: number; // 图标 + + @prop({ required: true, default: '' }) + notice: string; // 公告 + + @prop({ required: true, default: 0 }) + guildCnt: number; // 军团数量 + + @prop({ required: true, default: 0 }) + memberCnt: number; // 玩家人数 + + @prop({ required: true, default: 0 }) + leagueCe: number; // 联军总战力 + + @prop({ required: true, default: false }) + isAuto: boolean; // 是否是自动创建的 + + @prop({ required: true, default: 1 }) + status: number; // 1-健在 0-解散 + + @prop({ required: true, default: 1 }) + type: number; // 1-单服 2-跨服 + + @prop({ required: true, default: 1 }) + serverId: number; // 服务器id + + @prop({ required: true, default: [], type: Member, _id: false }) + members: Member[]; + + public static async checkName(name: string) { + const result = await GVGLeagueModel.exists({ name, status: 1 }); + return result; + } + + public static async createLeague(guild: GuildType, params: GVGLeagueUpdate) { + const { code, name, memberCnt, leader, guildCe, members } = guild; + const doc = new GVGLeagueModel(); + const leagueCode = genCode(6); + let _leader = leader; + let _members = members.map(roleId => ({ roleId, auth: _leader.roleId == roleId? LEAGUE_AUTH.LEADER: LEAGUE_AUTH.MEMBER })); + const update = Object.assign(doc.toJSON(), { guildCodes: [code], name: `${name}联军`, guildCnt: 1, memberCnt, isAuto: true, leagueCe: guildCe, leader: _leader?._id, members: _members, leagueCode }, params); + delete update._id; + + const result: GVGLeagueType = await GVGLeagueModel.findOneAndUpdate({ guildCodes: code, status: 1 }, { $setOnInsert: update }, { upsert: true, new: true }) + .select({ _id: 0, __v: 0, createdAt: 0, updatedAt: 0 }) + .populate('leader', { roleId: 1, roleName: 1, head: 1, frame: 1, spine: 1, lv: 1, quitTime: 1, ce: 1, title: 1, serverId: 1, _id: 0 }, 'Role') + .lean(); + return result; + } + + public static async findLeagueByGuild(guildCode: string) { + const league: GVGLeagueType = await GVGLeagueModel.findOne({ guildCodes: guildCode, status: 1 }) + .populate('leader', { roleId: 1, roleName: 1, head: 1, frame: 1, spine: 1, lv: 1, quitTime: 1, ce: 1, title: 1, serverId: 1, _id: 0 }, 'Role') + .lean(); + return league + } + + public static async findByCondition(type: number, serverIds: number[], page: number, name: string) { + let query = { + status: 1, type, serverId: { $in: serverIds } + }; + if(name) { + query['name'] = { $regex: new RegExp(name, 'i') }; + } + const league: GVGLeagueType[] = await GVGLeagueModel.find(query) + .populate('leader', { roleId: 1, roleName: 1, head: 1, frame: 1, spine: 1, lv: 1, quitTime: 1, ce: 1, title: 1, serverId: 1, _id: 0 }, 'Role') + .skip((page - 1) * 30).limit(30) + .lean(); + return league + } + + public static async findByCode(leagueCode: string) { + const league: GVGLeagueType = await GVGLeagueModel.findOne({ leagueCode, status: 1 }) + .populate('leader', { roleId: 1, roleName: 1, head: 1, frame: 1, spine: 1, lv: 1, quitTime: 1, ce: 1, title: 1, serverId: 1, _id: 0 }, 'Role') + .lean(); + return league + } + + public static async findByCodes(leagueCodes: string[]) { + const leagues: GVGLeagueType[] = await GVGLeagueModel.find({ leagueCode: { $in: leagueCodes }, status: 1 }) + .populate('leader', { roleId: 1, roleName: 1, head: 1, frame: 1, spine: 1, lv: 1, quitTime: 1, ce: 1, title: 1, serverId: 1, _id: 0 }, 'Role') + .lean(); + return leagues + } + + public static async joinGuild(leagueCode: string, guild: GuildType) { + const { code, memberCnt, leader, guildCe, members } = guild; + let _leader = leader; + let _members = members.map(roleId => ({ roleId, auth: _leader.roleId == roleId? LEAGUE_AUTH.SUB_LEADER: LEAGUE_AUTH.MEMBER })); + + const league: GVGLeagueType = await GVGLeagueModel.findOneAndUpdate({ leagueCode, status: 1 }, + { $push: { guildCodes: code, members: { $each: _members } }, $inc: { guildCnt: 1, memberCnt: memberCnt, leagueCe: guildCe } + }, { new: true }).lean(); + return league + } + + public static async findAllLeague() { + const leagues: { leagueCode: string, memberCnt: number }[] = await GVGLeagueModel.aggregate([ + { $match: { status: 1 } }, + { $project: { leagueCode: 1, memberCnt: 1 } } + ]); + return leagues; + } + + public static async quitGuild(leagueCode: string, guild: GuildType) { + const { code, memberCnt, members, guildCe } = guild; + const league: GVGLeagueType = await GVGLeagueModel.findOneAndUpdate({ leagueCode, status: 1 }, + { $pull: { guildCodes: code, members: { roleId: { $in: members } } }, $inc: { guildCnt: -1, memberCnt: -memberCnt, leagueCe: -guildCe } + }, { new: true }).lean(); + return league + } + + public static async dismiss(leagueCode: string) { + const league: GVGLeagueType = await GVGLeagueModel.findOneAndUpdate({ leagueCode, status: 1 }, { $set: { status: 0 }}, { new: true }).lean(); + return league + } + + public static async abdicate(leagueCode: string, fromRoleId: string, toRoleId: string, leader: string) { + let league: GVGLeagueType = await GVGLeagueModel.findOneAndUpdate({ leagueCode, status: 1, 'members.roleId': fromRoleId }, { $set: { 'members.$.auth': LEAGUE_AUTH.SUB_LEADER }}, { new: true }).lean(); + league = await GVGLeagueModel.findOneAndUpdate({ leagueCode, status: 1, 'members.roleId': toRoleId }, { $set: { 'members.$.auth': LEAGUE_AUTH.LEADER, leader }}, { new: true }).lean(); + return league + } + + public static async setInfo(leagueCode: string, name: string, notice: string, icon: number) { + let updateInfo: GVGLeagueUpdate = {}; + if(name != undefined) updateInfo.name = name; + if(notice != undefined) updateInfo.notice = notice; + if(icon != undefined) updateInfo.icon = icon; + const league: GVGLeagueType = await GVGLeagueModel.findOneAndUpdate({ leagueCode, status: 1 }, { $set: updateInfo }, { new: true }).lean(); + return league; + } + + public static async updateCe(roleId: string, incCe: number) { + const league: GVGLeagueType = await GVGLeagueModel.findOneAndUpdate({ 'members.roleId': roleId, status: 1 }, { $inc: { leagueCe: incCe } }, { new: true }).lean(); + return league; + } + + public static async joinMember(leagueCode: string, roleId: string, ce: number) { + const league: GVGLeagueType = await GVGLeagueModel.findOneAndUpdate({ leagueCode, status: 1 }, { $push: { members: { roleId, auth: LEAGUE_AUTH.MEMBER } }, $inc: { memberCnt: 1, leagueCe: ce } }, { new: true }).lean(); + return league; + } + + public static async quitMember(leagueCode: string, roleId: string, ce: number) { + const league: GVGLeagueType = await GVGLeagueModel.findOneAndUpdate({ leagueCode, status: 1 }, { $pull: { members: { roleId } }, $inc: { memberCnt: -1, leagueCe: -ce } }, { new: true }).lean(); + return league; + } + + public static async abdicateGuild(leagueCode: string, fromRoleId: string, toRoleId: string, leader: string) { + let league: GVGLeagueType = await GVGLeagueModel.findOneAndUpdate({ leagueCode, status: 1, 'members.roleId': fromRoleId }, { $set: { 'members.$.auth': LEAGUE_AUTH.MEMBER }}).lean(); + const member = league.members.find(cur => cur.roleId == fromRoleId); + const updateInfo = { 'members.$.auth': member?.auth }; + if(member?.auth == LEAGUE_AUTH.LEADER) updateInfo['leader'] = leader; + league = await GVGLeagueModel.findOneAndUpdate({ leagueCode, status: 1, 'members.roleId': toRoleId }, { $set: updateInfo }, { new: true }).lean(); + return league + } +} + +export const GVGLeagueModel = getModelForClass(GVGLeague); + +export interface GVGLeagueType extends Pick, keyof GVGLeague> { + id: number; +}; +export type GVGLeagueUpdate = Partial; // 将所有字段变成可选项 diff --git a/shared/db/GVGLeagueApply.ts b/shared/db/GVGLeagueApply.ts new file mode 100644 index 000000000..710dfce93 --- /dev/null +++ b/shared/db/GVGLeagueApply.ts @@ -0,0 +1,104 @@ +import BaseModel from './BaseModel'; +import { getModelForClass, prop, DocumentType, index, Ref } from '@typegoose/typegoose'; +import GVGLeague, { GVGLeagueType } from './GVGLeague'; +import Guild, { GuildType } from './Guild'; +import { GVG_APPLY_TYPE } from '../consts'; + +@index({ leagueCode: 1, guildCode: 1, type: 1 }) +export default class GVGLeagueApply extends BaseModel { + + @prop({ required: true }) + leagueCode: string; // 发起的联军 or 收到申请的联军 + + @prop({ required: true }) + league: Ref; + + @prop({ required: true }) + guildCode: string; // 受邀的军团 or 发出申请的联军 + + @prop({ required: true }) + guild: Ref; + + @prop({ required: true }) + type: number; // 类型 1-邀请 2-申请 + + public static async findApplyFromGuild(guildCode: string) { + const result: GVGLeagueApplyType[] = await GVGLeagueApplyModel.find({ guildCode, type: GVG_APPLY_TYPE.APPLY }).lean(); + return result; + } + + public static async checkApply(leagueCode: string, guildCode: string, type: GVG_APPLY_TYPE) { + console.log('####', leagueCode, guildCode, type) + const result = await GVGLeagueApplyModel.exists({ guildCode, leagueCode, + type: type == GVG_APPLY_TYPE.ALL? { $in: [GVG_APPLY_TYPE.APPLY, GVG_APPLY_TYPE.INVITE] }: type + }); + return result; + } + + public static async createApply(league: GVGLeagueType, guild: GuildType, type: number) { + const result: GVGLeagueApplyType = await GVGLeagueApplyModel.findOneAndUpdate({ leagueCode: league.leagueCode, guildCode: guild.code, type }, { $set: { league: league._id, guild: guild._id, }}, { new: true, upsert: true }) + .lean(); + return result; + } + + public static async findApplyFromLeague(leagueCode: string) { + const result: GVGLeagueApplyType[] = await GVGLeagueApplyModel.find({ leagueCode, type: GVG_APPLY_TYPE.APPLY }) + .select({ _id: 0, guild: 1, guildCode: 1 }) + .populate({ + path: 'guild', + select: 'code icon name lv memberCnt leader guildCe +serverId', + model: 'Guild', + populate: { + path: 'leader', + select: 'roleName', + model: 'Role' + } + }) + .lean(); + return result; + } + + public static async findInviteFromLeague(leagueCode: string) { + const result: GVGLeagueApplyType[] = await GVGLeagueApplyModel.find({ leagueCode, type: GVG_APPLY_TYPE.INVITE }).lean(); + return result; + } + + public static async findInviteFromGuild(guildCode: string) { + const result: GVGLeagueApplyType[] = await GVGLeagueApplyModel.find({ guildCode, type: GVG_APPLY_TYPE.INVITE }) + .select({ _id: 0, guild: 1, guildCode: 1 }) + .populate({ + path: 'league', + // select: 'code icon name lv memberCnt leader guildCe +serverId', + model: 'GVGLeague', + populate: { + path: 'leader', + select: 'roleName', + model: 'Role' + } + }) + .lean(); + return result; + } + + public static async deleteApply(guildCode: string, leagueCode: string) { + const n = await GVGLeagueApplyModel.deleteMany({ guildCode, leagueCode, type: GVG_APPLY_TYPE.APPLY }); + return n; + } + + public static async deleteAllGuildApply(guildCode: string) { + const n = await GVGLeagueApplyModel.deleteMany({ guildCode, type: GVG_APPLY_TYPE.APPLY }); + return n; + } + + public static async deleteInvite(guildCode: string, leagueCode: string) { + const n = await GVGLeagueApplyModel.deleteMany({ guildCode, leagueCode, type: GVG_APPLY_TYPE.INVITE }); + return n; + } +} + +export const GVGLeagueApplyModel = getModelForClass(GVGLeagueApply); + +export interface GVGLeagueApplyType extends Pick, keyof GVGLeagueApply> { + id: number; +}; +export type GVGLeagueApplyUpdate = Partial; // 将所有字段变成可选项 diff --git a/shared/db/GVGLeaguePrepare.ts b/shared/db/GVGLeaguePrepare.ts new file mode 100644 index 000000000..ca932d2aa --- /dev/null +++ b/shared/db/GVGLeaguePrepare.ts @@ -0,0 +1,82 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType, } from '@typegoose/typegoose'; + +class Tech { + @prop({ required: true, default: 0 }) + id: number; + @prop({ required: true, default: 0 }) + progress: number; // 贡献 + @prop({ required: true, default: 0 }) + status: number; // 0-已解锁 1-已激活 +} + +class DonateRec { + @prop({ required: true, default: 0 }) + roleId: string; + @prop({ required: true, default: 0 }) + time: number; + @prop({ required: true, default: 0 }) + count: number; +} + +class Resource { + @prop({ required: true, default: 0 }) + food: number; // 粮食 + @prop({ required: true, default: 0 }) + mineral: number; // 矿物 + @prop({ required: true, default: 0 }) + wood: number; // 木堆 +} + +@index({ leagueCode: 1, configId: 1 }) +export default class GVGLeaguePrepare extends BaseModel { + + @prop({ required: true }) + configId: number; // 赛期配置id + + @prop({ required: true }) + leagueCode: string; // 联军 + + @prop({ required: true, default: 1 }) + lv: number; // 等级 + + @prop({ required: true, default: 0 }) + maxMemberCnt: number; // 进入备战期初始玩家人数 + + @prop({ required: true, default: 0 }) + producerCnt: number; // 选择内政人数 + + @prop({ required: true, default: 0 }) + fighterCnt: number; // 选择外政人数 + + @prop({ required: true, default: [], type: Tech, _id: false }) + tech: Tech[]; // 千机阁 + + @prop({ required: true, default: [], type: DonateRec, _id: false }) + donateRec: DonateRec[]; // 捐献记录 + + @prop({ required: true, default: {food: 0, mineral: 0, wood: 0}, type: Resource, _id: false }) + resources: Resource + + public static async initData(configId: number, leagueCode: string, maxMemberCnt: number) { + const doc = new GVGLeaguePrepareModel(); + const update = Object.assign(doc.toJSON(), { maxMemberCnt }); + delete update._id; + + const result: GVGLeaguePrepareType = await GVGLeaguePrepareModel.findOneAndUpdate({ configId, leagueCode }, { $setOnInsert: update }, { upsert: true, new: true }) + .select({ _id: 0, __v: 0, createdAt: 0, updatedAt: 0 }).lean(); + return result; + } + + public static async findByLeague(configId: number, leagueCode: string) { + const result: GVGLeaguePrepareType = await GVGLeaguePrepareModel.findOne({ configId, leagueCode }).lean(); + return result; + } +} + +export const GVGLeaguePrepareModel = getModelForClass(GVGLeaguePrepare); + +export interface GVGLeaguePrepareType extends Pick, keyof GVGLeaguePrepare> { + id: number; +}; +export type GVGLeaguePrepareUpdate = Partial; // 将所有字段变成可选项 diff --git a/shared/db/GVGServerGroup.ts b/shared/db/GVGServerGroup.ts new file mode 100644 index 000000000..d96ee548b --- /dev/null +++ b/shared/db/GVGServerGroup.ts @@ -0,0 +1,41 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; + +/** + * 服务器分战区 +*/ +@index({ time: -1, serverId: -1 }) +export default class GVGServerGroup extends BaseModel { + + @prop({ required: true, default: 1 }) + serverId: number; // 服务器id + + @prop({ required: true, default: 1 }) + groupId: number; // 战区id + + @prop({ required: true, default: 0 }) + time: number; // 生效时间 + + public static async findByTime(time: number) { + const serverGroup: { serverId: number, groupId: number }[] = await GVGServerGroupModel.aggregate([ + { $match: { time: { $lte: time } } }, + { $sort: { time: -1 } }, + { $group: { _id: "$id", serverId: { $first: "$serverId" }, groupId: { $first: "$groupId" }, time: { $first: "$time" }} }, + { $sort: { _id: -1 } }, + { $project: { _id: 0, id: "$_id", serverId: "$serverId", groupId: "$groupId", time: "$time" } } + ]); + return serverGroup; + } + + public static async updateByServerId(serverId: number, groupId: number, time: number) { + const result: GVGServerGroupType = await GVGServerGroupModel.findOneAndUpdate({ serverId, time }, { $set: { groupId } }, { new: true, upsert: true }).lean(); + return result + } +} + +export let GVGServerGroupModel = getModelForClass(GVGServerGroup); + +export interface GVGServerGroupType extends Pick, keyof GVGServerGroup> { + id: number; +}; +export type GVGServerGroupUpdate = Partial; // 将所有字段变成可选项 diff --git a/shared/db/GVGUserData.ts b/shared/db/GVGUserData.ts new file mode 100644 index 000000000..4a0846494 --- /dev/null +++ b/shared/db/GVGUserData.ts @@ -0,0 +1,81 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType, } from '@typegoose/typegoose'; + +class ActiveRec { + @prop({ required: true, default: 1 }) + id: number; // 1-内政令消耗 2-征战令消耗 3-科技树捐献 + @prop({ required: true, default: 0 }) + count: number; + @prop({ required: true, default: 0 }) + time: number; +} + +class Box { + @prop({ required: true, default: 0 }) + score: number; // 宝箱积分 + @prop({ required: true, default: [], type: Number }) + received: number[]; // 领取记录 +} + +@index({ leagueCode: 1, roleId: 1, configId: 1, status: 1 }) +export default class GVGUserData extends BaseModel { + + @prop({ required: true }) + roleId: string; // 玩家 + + @prop({ required: true }) + configId: number; // 赛季信息 + + @prop({ required: true }) + leagueCode: string; // 所属联军 + + @prop({ required: true, default: 0 }) + job: number; // 职能 1-贤臣 2-猛将 + + // 备战期 + @prop({ required: true, default: 0 }) + active: number; // 活跃度 + + @prop({ required: true, default: 0, type: ActiveRec, _id: false }) + activeRec: ActiveRec[]; // 活跃度记录 + + @prop({ required: true, default: 0 }) + receivedLv: number; // 领取到的等级奖励 + + @prop({ required: true, default: 0 }) + receiveCurrencyTime: number; // 领取内政令&征战令时间 + + @prop({ required: true, default: { score: 0, received: []}, type: Box, _id: false }) + box: Box; + + @prop({ required: true, default: 0 }) + sendFightRewardTime: number; // 发送征战奖励的时间 + // 激战期 + + @prop({ required: true, default: 0 }) + battleStatus: number; // 1-被挑战中 0-可被挑战 + + @prop({ required: true, default: 0 }) + area: number; // 所处区域 1-进攻北站 2-混战 3-据点 4-防守备战 + + @prop({ required: true, default: 0 }) + protectTime: number; // 保护期 + + + public static async findByRole(configId: number, leagueCode: string, roleId: string) { + const result: GVGUserDataType = await GVGUserDataModel.findOneAndUpdate({ configId, leagueCode, roleId }, {}, { new: true, upsert: true}).lean(); + return result; + } + + public static async findByRoles(configId: number, leagueCode: string, roleIds: string[]) { + const result: GVGUserDataType[] = await GVGUserDataModel.find({ configId, leagueCode, roleId: { $in: roleIds } }).lean(); + return result; + } +} + +export const GVGUserDataModel = getModelForClass(GVGUserData); + +export interface GVGUserDataType extends Pick, keyof GVGUserData> { + id: number; +}; +export type GVGUserDataUpdate = Partial; // 将所有字段变成可选项 diff --git a/shared/db/GVGUserItem.ts b/shared/db/GVGUserItem.ts new file mode 100644 index 000000000..2fa046c35 --- /dev/null +++ b/shared/db/GVGUserItem.ts @@ -0,0 +1,37 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType, } from '@typegoose/typegoose'; +import { nowSeconds } from '../pubUtils/timeUtil'; + +@index({ leagueCode: 1, roleId: 1, configId: 1, status: 1 }) +export default class GVGUserItem extends BaseModel { + + @prop({ required: true }) + roleId: string; // 玩家 + + @prop({ required: true }) + leagueCode: string; // 联军id + + @prop({ required: true }) + configId: number; // 赛期 + + @prop({ required: true }) + id: number; // 道具: 包括 种子、铲子、斧子 + + @prop({ required: true, default: 0 }) + count: number; // 数量 + + @prop({ required: true, default: 0 }) + expireTime: number; + + public static async findByRole(configId: number, leagueCode: string, roleId: string) { + const result: GVGUserItemType[] = await GVGUserItemModel.find({ configId, leagueCode, roleId, expireTime: { $gte: nowSeconds() } }, { _id: 0 }).lean(); + return result; + } +} + +export const GVGUserItemModel = getModelForClass(GVGUserItem); + +export interface GVGUserItemType extends Pick, keyof GVGUserItem> { + id: number; +}; +export type GVGUserItemUpdate = Partial; // 将所有字段变成可选项 diff --git a/shared/db/GVGUserTask.ts b/shared/db/GVGUserTask.ts new file mode 100644 index 000000000..efd5658d7 --- /dev/null +++ b/shared/db/GVGUserTask.ts @@ -0,0 +1,41 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType, } from '@typegoose/typegoose'; +import { getZeroPointD } from '../pubUtils/timeUtil'; + +@index({ leagueCode: 1, roleId: 1, configId: 1, status: 1 }) +export default class GVGUserTask extends BaseModel { + + @prop({ required: true, default: '' }) + roleId: string; // 玩家 + + @prop({ required: true, default: '' }) + leagueCode: string; // 联军id + + @prop({ required: true, default: 0 }) + configId: number; // 赛期 + + @prop({ required: true, default: 0 }) + id: number; // 任务id + + @prop({ required: true, default: 0 }) + count: number; // 1-已达成 + + @prop({ required: true, default: 0 }) + status: number; // 1-未领取 2-已领取 + + @prop({ required: true, default: 0 }) + createTime: number; // 1-未领取 2-已领取 + + public static async findByRole(configId: number, leagueCode: string, roleId: string) { + let today = getZeroPointD(); + const result: GVGUserTaskType[] = await GVGUserTaskModel.find({ configId, leagueCode, roleId, createdAt: { $gte: today } }, { _id: 0, id: 1, count: 1, status: 1 }).lean(); + return result; + } +} + +export const GVGUserTaskModel = getModelForClass(GVGUserTask); + +export interface GVGUserTaskType extends Pick, keyof GVGUserTask> { + id: number; +}; +export type GVGUserTaskUpdate = Partial; // 将所有字段变成可选项 diff --git a/shared/db/Guild.ts b/shared/db/Guild.ts index e734fbcee..eeff4cd29 100644 --- a/shared/db/Guild.ts +++ b/shared/db/Guild.ts @@ -111,6 +111,9 @@ export default class Guild extends BaseModel { @prop({ required: true }) sdkMark: boolean; // 37sdk标记有问题 + @prop({ required: true, default: '' }) + leagueCode: string; // 参与联军 + public static async createGuild(params: { guildCode: string, name: string, icon: number, notice: string }, role: RoleType, serverId: number) { const doc = new GuildModel(); const update = Object.assign(doc.toJSON(), params, { leader: role._id, members: [role.roleId], guildCe: role.ce, serverId, lvUpdateTime: nowSeconds() }); @@ -175,7 +178,7 @@ export default class Guild extends BaseModel { if(serverId) condition.serverId = serverId; const result: GuildType = await GuildModel.findOne(condition) .select(select) - .populate('leader', {roleId: 1, roleName: 1, frame: 1, head: 1, spine: 1, frames: 1, heads: 1, spines: 1, lv: 1, quitTime: 1, ce: 1, title: 1, _id: 0}, 'Role') + .populate('leader', {roleId: 1, roleName: 1, frame: 1, head: 1, spine: 1, frames: 1, heads: 1, spines: 1, lv: 1, quitTime: 1, ce: 1, title: 1}, 'Role') .lean({ getters: true, virtuals: true }); return result; } @@ -315,6 +318,41 @@ export default class Guild extends BaseModel { const result = await GuildModel.count(searchObj); return result; } + + public static async joinLeague(guildCode: string, leagueCode: string) { + const result: GuildType = await GuildModel.findOneAndUpdate({ code: guildCode }, { $set: { leagueCode } }, { new: true }).lean(); + return result + } + + public static async findGuildsForGVG(page: number, name: string, serverIds: number[]) { + let query: any = { status: GUILD_STATUS.RUNNING, lv: { $gte: 3 }, leagueCode: '', serverId: { $in: serverIds } }; + if(name) { + query['name'] = { $regex: new RegExp(name, 'i') } + } + const result: GuildType[] = await GuildModel.find(query) + .populate('leader', { roleId: 1, roleName: 1, _id: 0 }, 'Role') + .skip((page - 1) * 30).limit(30) + .lean(); + return result; + } + + public static async findByCodes(codes: string[]) { + const result: GuildType[] = await GuildModel.find({ status: GUILD_STATUS.RUNNING, code: { $in: codes } }) + .select('+serverId') + .populate('leader', { roleId: 1, roleName: 1, _id: 0 }, 'Role') + .lean(); + return result; + } + + public static async quitFromLeague(guildCode: string, leagueCode: string, select = null) { + const result: GuildType = await GuildModel.findOneAndUpdate({ code: guildCode, leagueCode }, { $set: { leagueCode: '' } }, { new: true }).select(select).lean(); + return result; + } + + public static async dissmissLeague(leagueCode: string) { + const result: GuildType = await GuildModel.findOneAndUpdate({ leagueCode }, { $set: { leagueCode: '' }}).lean(); + return result; + } } export const GuildModel = getModelForClass(Guild); diff --git a/shared/domain/gvgField/returnData.ts b/shared/domain/gvgField/returnData.ts new file mode 100644 index 000000000..f9a084f24 --- /dev/null +++ b/shared/domain/gvgField/returnData.ts @@ -0,0 +1,224 @@ +import { RoleType } from "../../db/Role"; +import { GVGLeagueType } from "../../db/GVGLeague"; +import { GVGLeaguePrepareType } from "../../db/GVGLeaguePrepare"; +import { GVGUserDataType } from "../../db/GVGUserData"; +import { GuildType } from "../../db/Guild"; + +class LeagueLeaderInfo { + name: string; // 盟主名 + serverId: number; // 盟主所处小区 + serverName: number; // 盟主所处小区名 + + constructor(leader: RoleType, serverNames: any) { + this.name = leader.roleName; + this.serverId = leader.serverId; + this.serverName = serverNames[this.serverId]; + } +} + +class GVGItem { + id: number; + count: number; + expireTime: number; // 过期时间 +} + +class LeaguePlayerData { + auth: number = 3; // 我的权限 1-盟主 2-副盟主 3-平民 + job: number = 0; // 我的职能,1-贤臣 2-猛将 0-未选择 + canPrepare: boolean = false; // 是否可以使用整备期模块,组建期过后加入的玩家,当天的整备模块不可参与 + canChooseJob: boolean = true; // 是否可以选择职能,团内选择职业的人数达到最大人数了,已经不可再选职位了 + items: GVGItem[] = []; // 持有的道具,包括两种令、战功和种子 + // 奖励相关 + receivedLv: number = 0; // 奖励领到几级 + tasks: GVGTask[] = []; // 如果没有达成的任务就不放在这个数组里面 +} + +class LeagueResource { + food: number = 0; // 粮食 + mineral: number = 0; // 矿物 + wood: number = 0; // 木堆 +} + +class GVGTask { + id: number; // 任务id + count: number; + status: number; // 状态 0-未领取 1-已领取 +} + +export class GVGMainData { + configId: number = 0; // 赛期 + period: number = 1; // 当前是什么期 1-组建期 2-备战期 3-激战期 + countdownTime: number = 0; // 这个周期结束时间,10位时间戳单位秒 + type: number = 1; // 1-单服 2-跨服 + hasLeague: boolean = false; // 是否拥有联军 + // 左侧联军信息 + leagueCode: string; // 联军唯一code + leader: LeagueLeaderInfo; + name: string; // 联军名 + icon: number; // 图标 + lv: number; // 联军等级 + notice: string; // 公告 + guildCnt: number; // 军团数量 + memberCnt: number; // 玩家人数 + teamCnt: number; // 里面的玩家的队伍数 TODO + leagueCe: number; // 联军内所有人总战力 + // 个人信息 + myInfo: LeaguePlayerData = new LeaguePlayerData(); + // 激战期相关,城池背景 + cities: number[] = []; // 占领的城池id + + // 内政相关 + resources: LeagueResource = new LeagueResource(); // 联盟的物资 + activeTech: number[] = []; // 已激活了的科技树的id + + sumTime: number = 0; // 今日贡献结算时间 10位时间戳 + + constructor(configId: number, period: number, countdownTime: number, type: number) { + this.configId = configId; + this.period = period; + this.countdownTime = countdownTime; + this.type = type; + } + + setLeague(league: GVGLeagueType, serverNames: any) { + if(!league) return; + this.hasLeague = true; + let leader = league.leader; + this.leader = new LeagueLeaderInfo(leader, serverNames); + this.name = league.name; + this.icon = league.icon; + this.notice = league.notice; + this.guildCnt = league.guildCnt; + this.memberCnt = league.memberCnt; + this.leagueCe = league.leagueCe; + } + + setLeagueParpare(leaguePrepare: GVGLeaguePrepareType) { + if(!leaguePrepare) return; + this.lv = leaguePrepare.lv; + this.resources = leaguePrepare.resources; + this.activeTech = leaguePrepare.tech.filter(cur => cur.status == 1).map(cur => cur.id); + } + + setPlayerInfo(userData: GVGUserDataType, auth: number, canPrepare: boolean, canChooseJob: boolean, items: GVGItem[], tasks: GVGTask[]) { + this.myInfo.auth = auth; + this.myInfo.canPrepare = canPrepare; + this.myInfo.canChooseJob = canChooseJob; + this.myInfo.items = items; + if(userData) { + this.myInfo.job = userData?.job||0; + this.myInfo.receivedLv = userData?.receivedLv||0; + } + this.myInfo.tasks = tasks; + } +} + +export class LeagueListInfo { + leagueCode: string; // 联军唯一id + name: string; // 联军名 + icon: number; // icon + memberCnt: number; // 玩家人数 + guildCnt: number; // 组成军团名 + leaderName: string; // 大将军的姓名 + leaderServerName: string; // 大将军所处小区名 + leagueCe: number; // 联军战力 + hasApply: boolean = false; // 是否申请过了 + + constructor(league: GVGLeagueType, serverNames: any) { + if(!league) return; + this.leagueCode = league.leagueCode; + this.name = league.name; + this.icon = league.icon; + this.memberCnt = league.memberCnt; + this.guildCnt = league.guildCnt; + this.leaderName = (league.leader).roleName; + this.leaderServerName = serverNames[(league.leader).serverId]; + this.leagueCe = league.leagueCe; + } + + setHasApply(hasApply: boolean) { + this.hasApply = hasApply; + } +} + +export class LeagueSimpleInfo extends LeagueListInfo { + notice: string; // 公共 + cities: number[] = []; // 占领的城池 + + constructor(league: GVGLeagueType, serverNames: any) { + super(league, serverNames); + if(!league) return; + this.notice = league.notice; + } + + setCities(cities: number[]) { + this.cities = cities; + } +} + +export class LeagueGuildInfo { + guildCode: string; // 军团唯一id + name: string; // 军团名 + serverName: string; // 区服名 + lv: number; // 军团等级 + memberCnt: number; // 人数 + leaderName: string; // 大将军的姓名 + guildCe: number; // 军团战力 + hasInvited: boolean; // 是否邀请过了 + + constructor(guild: GuildType, serverNames: any) { + if(!guild) return; + this.guildCode = guild.code; + this.name = guild.name; + this.serverName = serverNames[guild.serverId]; + this.lv = guild.lv; + this.memberCnt = guild.memberCnt; + let leader = guild.leader; + this.leaderName = leader.roleName; + this.guildCe = guild.guildCe; + } + + setHasInvited(hasInvited: boolean) { + this.hasInvited = hasInvited; + } +} + +export class LeagueMemberListInfo { + roleId: string; // 玩家id + roleName: string; // 玩家名 + lv: number; // 玩家等级 + head: number; // 玩家头像 + frame: number; // 玩家相框 + guildName: string; // 所处军团名 + serverName: string; // 所处小区名 + job: number = 0; // 官职 1-贤臣 2-猛将 + auth: number = 0; // 官职 + active: number = 0; // 活跃 + ce: number; // 玩家战力 + isOnline: boolean; // 是否在线 + quitTime: number; // 离线时间 + + constructor(role: RoleType, serverNames: any) { + if(!role) return; + this.roleId = role.roleId; + this.roleName = role.roleName; + this.lv = role.lv; + this.head = role.head; + this.frame = role.frame; + this.guildName = role.guildName; + this.serverName = serverNames[role.serverId]; + this.ce = role.ce; + this.quitTime = role.quitTime; + this.isOnline = role.quitTime == role.loginTime; + } + + setByUserData(data: GVGUserDataType) { + if(!data) return; + this.active = data.active; + this.job = data.job; + } + + setAuth(auth: number) { + this.auth = auth; + } +} \ No newline at end of file diff --git a/shared/pubUtils/data.ts b/shared/pubUtils/data.ts index eaf872981..61199392d 100644 --- a/shared/pubUtils/data.ts +++ b/shared/pubUtils/data.ts @@ -118,6 +118,7 @@ import { dicArtifactSeid, loadArtifactSeid } from "./dictionary/DicArtifactSeid" import { DicArtifact } from "./dictionary/DicArtifact"; import { DicArtifactQuality } from "./dictionary/DicArtifactQuality"; import { dicGiftPackagePlan, loadGiftPackagePlan } from "./dictionary/DicGiftPackagePlan"; +import { dicGVGPeriod, loadGVGPeriod } from './dictionary/DicGVGPeriod'; export const gameData = { daily: dicDaily, @@ -295,6 +296,7 @@ export const gameData = { artifactQualityPlan: dicArtifactQualityPlan, artifactSeid: dicArtifactSeid, artifactByGroupAndQuality: dicArtifactsByGroup, + gvgPeriod: dicGVGPeriod, }; // 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据 @@ -1262,6 +1264,7 @@ function loadDatas() { loadArtifactQuality(); loadArtifactQualityPlan(); loadArtifactSeid(); + loadGVGPeriod(); } // 重载dicParam diff --git a/shared/pubUtils/dictionary/DicGVGPeriod.ts b/shared/pubUtils/dictionary/DicGVGPeriod.ts new file mode 100644 index 000000000..60f0ce88d --- /dev/null +++ b/shared/pubUtils/dictionary/DicGVGPeriod.ts @@ -0,0 +1,42 @@ +// GVG周期表 + +import { FILENAME } from '../../consts' +import { parseNumberList, readFileAndParse } from '../util' + +export interface DicGVGPeriod { + // 1-组建期 2-备战期 3-激战期 + readonly periodType: number; + // 星期几 1-7 + readonly day: number[]; + // 星期几 1-7 + readonly startDay: number; + // HH:mm, 组建期备战期填05:00。激战期填20:40 + readonly startHour: number; + readonly startMinute: number; + readonly startSecond: number; + // HH:mm,组建期填截止创建联军时间,备战期填22:00,激战期填21:40 + readonly endHour: number; + readonly endMinute: number; + readonly endSecond: number; +} + +export const dicGVGPeriod = new Map(); +export function loadGVGPeriod() { + dicGVGPeriod.clear(); + + let arr = readFileAndParse(FILENAME.DIC_GVG_PERIOD); + arr.forEach(o => { + o.day = parseNumberList(o.day); + o.startDay = o.day[0]; + let startTime = o.startTime.split(':'); + o.startHour = parseInt(startTime[0]); + o.startMinute = parseInt(startTime[1]); + o.startSecond = parseInt(startTime[2]); + let endTime = o.endTime.split(':'); + o.endHour = parseInt(endTime[0]); + o.endMinute = parseInt(endTime[1]); + o.endSecond = parseInt(endTime[2]); + dicGVGPeriod.set(o.periodType, o); + }); + arr = undefined; +} diff --git a/shared/pubUtils/timeUtil.ts b/shared/pubUtils/timeUtil.ts index 0f1e94023..167790d1f 100644 --- a/shared/pubUtils/timeUtil.ts +++ b/shared/pubUtils/timeUtil.ts @@ -1,21 +1,22 @@ import { REFRESH_TIME, TIME_OUTPUT_TYPE, SHOP_REFRESH_TYPE } from '../consts'; import { isDebugTime } from './sdkUtil'; +export const WEEK_TO_MS = 7 * 24 * 60 * 60 * 1000; +export const WEEK_TO_SECOND = 7 * 24 * 60 * 60; +export const DAY_TO_HOUR = 24; +export const DAY_TO_SECOND = 24 * 60 * 60; +export const DAY_TO_MS = 24 * 60 * 60 * 1000; +export const HOUR_TO_MINUTE = 60; +export const HOUR_TO_SECOND = 60 * 60; +export const HOUR_TO_MS = 60 * 60 * 1000; +export const MINUTE_TO_MS = 60 * 1000; +export const SECOND_TO_MS = 1000; + /** * 时间 * @class */ class Time { - WEEK_TO_MS = 7 * 24 * 60 * 60 * 1000; - DAY_TO_HOUR = 24; - DAY_TO_SECOND = 24 * 60 * 60; - DAY_TO_MS = 24 * 60 * 60 * 1000; - HOUR_TO_MINUTE = 60; - HOUR_TO_SECOND = 60 * 60; - HOUR_TO_MS = 60 * 60 * 1000; - MINUTE_TO_MS = 60 * 1000; - SECOND_TO_MS = 1000; - now: Date; // 当前时间 time: Date; // 处理时间原料 outputType: number; // 输出格式 @@ -106,7 +107,7 @@ class Time { if(time >= t) { return t; } else { - return new Date(t.getTime() - this.DAY_TO_MS); + return new Date(t.getTime() - DAY_TO_MS); } } @@ -187,7 +188,7 @@ class Time { let cur = this._getDayZeroPoint(curDate); let pre = this._getDayZeroPoint(preDate); - return Math.floor((cur.getTime() - pre.getTime()) / this.DAY_TO_MS) + return Math.floor((cur.getTime() - pre.getTime()) / DAY_TO_MS) } /** @@ -256,7 +257,7 @@ class Time { if(this.time >= t) { return this._returnResult(t); } else { - return this._returnResult(t.getTime() - this.WEEK_TO_MS); + return this._returnResult(t.getTime() - WEEK_TO_MS); } } @@ -287,10 +288,10 @@ class Time { public getBeforeDayWithHour(day: number = 0, hour = REFRESH_TIME, minute = 0, seconds = 0) { let t = this._setHour(this.time.getTime(), hour, minute, seconds); if(this.time >= t) { - let timestamp = t.getTime() - day * this.DAY_TO_MS; + let timestamp = t.getTime() - day * DAY_TO_MS; return this._returnResult(timestamp); } else { - let timestamp = t.getTime() - (day + 1) * this.DAY_TO_MS; + let timestamp = t.getTime() - (day + 1) * DAY_TO_MS; return this._returnResult(timestamp); } } @@ -306,10 +307,10 @@ class Time { let t = this._setHour(this.time.getTime(), hour, minute, seconds, 0); // console.log(t.getTime(), this.time.getTime()); if(this.time.getTime() > t.getTime()) { - let timestamp = t.getTime() + (day + 1) * this.DAY_TO_MS; + let timestamp = t.getTime() + (day + 1) * DAY_TO_MS; return this._returnResult(timestamp); } else { - let timestamp = t.getTime() + day * this.DAY_TO_MS; + let timestamp = t.getTime() + day * DAY_TO_MS; return this._returnResult(timestamp); } } @@ -323,7 +324,7 @@ class Time { */ public getBeforeDayAndSetHour(day: number = 0, hour = REFRESH_TIME, minute = 0, seconds = 0) { let t = this._setHour(this.time.getTime(), hour, minute, seconds); - let timestamp = t.getTime() - day * this.DAY_TO_MS; + let timestamp = t.getTime() - day * DAY_TO_MS; return this._returnResult(timestamp); } @@ -336,7 +337,7 @@ class Time { */ public getAfterDayAndSetHour(day: number = 0, hour = REFRESH_TIME, minute = 0, seconds = 0) { let t = this._setHour(this.time.getTime(), hour, minute, seconds); - let timestamp = t.getTime() + day * this.DAY_TO_MS; + let timestamp = t.getTime() + day * DAY_TO_MS; return this._returnResult(timestamp); } @@ -345,7 +346,7 @@ class Time { * @param day 几天前 */ public getBeforeDay(day: number) { - let timestamp = this.time.getTime() - day * this.DAY_TO_MS; + let timestamp = this.time.getTime() - day * DAY_TO_MS; return this._returnResult(timestamp); } @@ -354,7 +355,7 @@ class Time { * @param day 几天后 */ public getAfterDay(day: number) { - let timestamp = this.time.getTime() + day * this.DAY_TO_MS; + let timestamp = this.time.getTime() + day * DAY_TO_MS; return this._returnResult(timestamp); } @@ -363,7 +364,7 @@ class Time { * @param hour 几小时前 */ public getBeforeHour(hour: number) { - let timestamp = this.time.getTime() - hour * this.HOUR_TO_MS; + let timestamp = this.time.getTime() - hour * HOUR_TO_MS; return this._returnResult(timestamp); } @@ -372,7 +373,7 @@ class Time { * @param hour 几分钟前 */ public getBeforeMinute(minute: number) { - let timestamp = this.time.getTime() - minute * this.MINUTE_TO_MS; + let timestamp = this.time.getTime() - minute * MINUTE_TO_MS; return this._returnResult(timestamp); } @@ -393,7 +394,7 @@ class Time { public getAfterDayByGap(preDate: Date, day: number) { let gap = this._getDayGap(preDate, this.time); let n = Math.floor(gap / day); - return this._returnResult(preDate.getTime() + n * day * this.DAY_TO_MS); + return this._returnResult(preDate.getTime() + n * day * DAY_TO_MS); } /** @@ -401,7 +402,7 @@ class Time { * @param day day天以内 */ public checkDay(day: number = 1) { - if (this.time.getTime() - this.now.getTime() <= day * this.DAY_TO_MS) { + if (this.time.getTime() - this.now.getTime() <= day * DAY_TO_MS) { return true; } return false; diff --git a/shared/resource/jsons/dic_api.json b/shared/resource/jsons/dic_api.json index 56629951d..b277c0f3a 100644 --- a/shared/resource/jsons/dic_api.json +++ b/shared/resource/jsons/dic_api.json @@ -922,5 +922,19 @@ "name": "更新隐藏数据", "module": "sys", "type": "update" + }, + { + "id": 133, + "api": "gm.gmHandler.updateGVGServerGroup", + "name": "更新GVG战区分配", + "module": "sys", + "type": "update" + }, + { + "id": 134, + "api": "gm.gmHandler.updateGVGConfig", + "name": "更新GVG时间", + "module": "sys", + "type": "update" } ] \ No newline at end of file diff --git a/shared/resource/jsons/dic_zyz_GVGContributeBox.json b/shared/resource/jsons/dic_zyz_GVGContributeBox.json new file mode 100644 index 000000000..d2826bb59 --- /dev/null +++ b/shared/resource/jsons/dic_zyz_GVGContributeBox.json @@ -0,0 +1,86 @@ +[ + { + "id": 1, + "Type": 1, + "boxPoint": 100000, + "boxReward": "31002&500", + "boxLeagueReward": "12&500" + }, + { + "id": 2, + "Type": 1, + "boxPoint": 150000, + "boxReward": "31002&500", + "boxLeagueReward": "12&500" + }, + { + "id": 3, + "Type": 1, + "boxPoint": 200000, + "boxReward": "31002&500", + "boxLeagueReward": "12&500" + }, + { + "id": 4, + "Type": 1, + "boxPoint": 250000, + "boxReward": "31002&500", + "boxLeagueReward": "12&500" + }, + { + "id": 5, + "Type": 1, + "boxPoint": 300000, + "boxReward": "31002&500", + "boxLeagueReward": "12&500" + }, + { + "id": 6, + "Type": 1, + "boxPoint": 350000, + "boxReward": "31002&500", + "boxLeagueReward": "12&500" + }, + { + "id": 7, + "Type": 2, + "boxPoint": 50000, + "boxReward": "31002&500", + "boxLeagueReward": "12&500" + }, + { + "id": 8, + "Type": 2, + "boxPoint": 100000, + "boxReward": "31002&500", + "boxLeagueReward": "12&500" + }, + { + "id": 9, + "Type": 2, + "boxPoint": 150000, + "boxReward": "31002&500", + "boxLeagueReward": "12&500" + }, + { + "id": 10, + "Type": 2, + "boxPoint": 200000, + "boxReward": "31002&500", + "boxLeagueReward": "12&500" + }, + { + "id": 11, + "Type": 2, + "boxPoint": 250000, + "boxReward": "31002&500", + "boxLeagueReward": "12&500" + }, + { + "id": 12, + "Type": 2, + "boxPoint": 300000, + "boxReward": "31002&500", + "boxLeagueReward": "12&500" + } +] \ No newline at end of file diff --git a/shared/resource/jsons/dic_zyz_GVGItems.json b/shared/resource/jsons/dic_zyz_GVGItems.json new file mode 100644 index 000000000..f8599eac3 --- /dev/null +++ b/shared/resource/jsons/dic_zyz_GVGItems.json @@ -0,0 +1,197 @@ +[ + { + "id": 1, + "name": "小麦", + "type": 1, + "refreshType": 1, + "image_id": "&", + "info": "&", + "consume": "&", + "leagueConsume": "10&1", + "value": 100, + "reward": "31002&5000", + "leagueReward": "12&100" + }, + { + "id": 2, + "name": "玉米", + "type": 1, + "refreshType": 1, + "image_id": "&", + "info": "&", + "consume": "31002&100", + "leagueConsume": "10&1", + "value": 150, + "reward": "31002&5001", + "leagueReward": "12&150" + }, + { + "id": 3, + "name": "水稻", + "type": 1, + "refreshType": 1, + "image_id": "&", + "info": "&", + "consume": "31002&200", + "leagueConsume": "10&1", + "value": 200, + "reward": "31002&5002", + "leagueReward": "12&150" + }, + { + "id": 4, + "name": "普通铲子", + "type": 2, + "refreshType": 1, + "image_id": "&", + "info": "&", + "consume": "&", + "leagueConsume": "10&2", + "value": 15, + "reward": "31002&5003", + "leagueReward": "12&200" + }, + { + "id": 5, + "name": "中级铲子", + "type": 2, + "refreshType": 1, + "image_id": "&", + "info": "&", + "consume": "31002&100", + "leagueConsume": "10&2", + "value": 20, + "reward": "31002&5004", + "leagueReward": "12&300" + }, + { + "id": 6, + "name": "高级铲子", + "type": 2, + "refreshType": 1, + "image_id": "&", + "info": "&", + "consume": "31002&200", + "leagueConsume": "10&2", + "value": 30, + "reward": "31002&5005", + "leagueReward": "12&300" + }, + { + "id": 7, + "name": "石斧", + "type": 3, + "refreshType": 1, + "image_id": "&", + "info": "&", + "consume": "&", + "leagueConsume": "10&2", + "value": 25, + "reward": "31002&5006", + "leagueReward": "12&200" + }, + { + "id": 8, + "name": "铜斧", + "type": 3, + "refreshType": 1, + "image_id": "&", + "info": "&", + "consume": "31002&100", + "leagueConsume": "10&2", + "value": 30, + "reward": "31002&5007", + "leagueReward": "12&300" + }, + { + "id": 9, + "name": "铁斧", + "type": 3, + "refreshType": 1, + "image_id": "&", + "info": "&", + "consume": "31002&200", + "leagueConsume": "10&2", + "value": 40, + "reward": "31002&5008", + "leagueReward": "12&300" + }, + { + "id": 10, + "name": "内政令", + "type": 4, + "refreshType": 2, + "image_id": "&", + "info": "&", + "consume": "&", + "leagueConsume": "&", + "value": 0, + "reward": "&", + "leagueReward": "&" + }, + { + "id": 11, + "name": "征战令", + "type": 4, + "refreshType": 2, + "image_id": "&", + "info": "&", + "consume": "&", + "leagueConsume": "&", + "value": 0, + "reward": "&", + "leagueReward": "&" + }, + { + "id": 12, + "name": "战功", + "type": 5, + "refreshType": 2, + "image_id": "&", + "info": "&", + "consume": "&", + "leagueConsume": "&", + "value": 0, + "reward": "&", + "leagueReward": "&" + }, + { + "id": 13, + "name": "复活令", + "type": 6, + "refreshType": 2, + "image_id": "&", + "info": "&", + "consume": "&", + "leagueConsume": "&", + "value": 0, + "reward": "&", + "leagueReward": "&" + }, + { + "id": 14, + "name": "匕首", + "type": 6, + "refreshType": 2, + "image_id": "&", + "info": "&", + "consume": "&", + "leagueConsume": "&", + "value": 0, + "reward": "&", + "leagueReward": "&" + }, + { + "id": 15, + "name": "箭塔", + "type": 6, + "refreshType": 2, + "image_id": "&", + "info": "&", + "consume": "&", + "leagueConsume": "&", + "value": 0, + "reward": "&", + "leagueReward": "&" + } +] \ No newline at end of file diff --git a/shared/resource/jsons/dic_zyz_GVGLeagueLv.json b/shared/resource/jsons/dic_zyz_GVGLeagueLv.json new file mode 100644 index 000000000..b353c4323 --- /dev/null +++ b/shared/resource/jsons/dic_zyz_GVGLeagueLv.json @@ -0,0 +1,82 @@ +[ + { + "id": 1, + "lv": 1, + "food": 2000, + "mineral": 1000, + "wood": 1000, + "reward": "31002&500|31001&10000" + }, + { + "id": 2, + "lv": 2, + "food": 2200, + "mineral": 1100, + "wood": 1100, + "reward": "31002&500|31001&10000" + }, + { + "id": 3, + "lv": 3, + "food": 2400, + "mineral": 1200, + "wood": 1200, + "reward": "31002&500|31001&10000" + }, + { + "id": 4, + "lv": 4, + "food": 2600, + "mineral": 1300, + "wood": 1300, + "reward": "31002&500|31001&10000" + }, + { + "id": 5, + "lv": 5, + "food": 2800, + "mineral": 1400, + "wood": 1400, + "reward": "31002&500|31001&10000" + }, + { + "id": 6, + "lv": 6, + "food": 3000, + "mineral": 1500, + "wood": 1500, + "reward": "31002&500|31001&10000" + }, + { + "id": 7, + "lv": 7, + "food": 3200, + "mineral": 1600, + "wood": 1600, + "reward": "31002&500|31001&10000" + }, + { + "id": 8, + "lv": 8, + "food": 3400, + "mineral": 1700, + "wood": 1700, + "reward": "31002&500|31001&10000" + }, + { + "id": 9, + "lv": 9, + "food": 3600, + "mineral": 1800, + "wood": 1800, + "reward": "31002&500|31001&10000" + }, + { + "id": 10, + "lv": 10, + "food": 3800, + "mineral": 1900, + "wood": 1900, + "reward": "31002&500|31001&10000" + } +] \ No newline at end of file diff --git a/shared/resource/jsons/dic_zyz_GVGPeriod.json b/shared/resource/jsons/dic_zyz_GVGPeriod.json new file mode 100644 index 000000000..6b5972d49 --- /dev/null +++ b/shared/resource/jsons/dic_zyz_GVGPeriod.json @@ -0,0 +1,20 @@ +[ + { + "periodType": 1, + "day": "7&", + "startTime": "05:00:00", + "endTime": "05:00:00" + }, + { + "periodType": 2, + "day": "1&2&3&4&5", + "startTime": "05:00:00", + "endTime": "22:00:00" + }, + { + "periodType": 3, + "day": "6&", + "startTime": "20:40:00", + "endTime": "21:40:00" + } +] \ No newline at end of file diff --git a/shared/resource/jsons/dic_zyz_GVGResourceBase.json b/shared/resource/jsons/dic_zyz_GVGResourceBase.json new file mode 100644 index 000000000..5fa89472b --- /dev/null +++ b/shared/resource/jsons/dic_zyz_GVGResourceBase.json @@ -0,0 +1,332 @@ +[ + { + "id": 1, + "name": "1级农庄", + "lv": 1, + "type": 1, + "limit": "X名武将X星", + "limitType": 1, + "limitParams": "1&3", + "value": "1&0", + "sum": 100 + }, + { + "id": 2, + "name": "2级农庄", + "lv": 2, + "type": 1, + "limit": "X名武将X星", + "limitType": 1, + "limitParams": "1&5", + "value": "1&20", + "sum": 100 + }, + { + "id": 3, + "name": "3级农庄", + "lv": 3, + "type": 1, + "limit": "X名武将X星", + "limitType": 1, + "limitParams": "1&6", + "value": "1&30", + "sum": 100 + }, + { + "id": 4, + "name": "4级农庄", + "lv": 4, + "type": 1, + "limit": "X名武将X星", + "limitType": 1, + "limitParams": "2&6", + "value": "1&40", + "sum": 100 + }, + { + "id": 5, + "name": "5级农庄", + "lv": 5, + "type": 1, + "limit": "X名武将X星", + "limitType": 1, + "limitParams": "2&10", + "value": "1&50", + "sum": 100 + }, + { + "id": 6, + "name": "6级农庄", + "lv": 6, + "type": 1, + "limit": "X名武将X星", + "limitType": 1, + "limitParams": "2&12", + "value": "1&60", + "sum": 100 + }, + { + "id": 7, + "name": "7级农庄", + "lv": 7, + "type": 1, + "limit": "X名武将X星", + "limitType": 1, + "limitParams": "3&6", + "value": "1&70", + "sum": 100 + }, + { + "id": 8, + "name": "8级农庄", + "lv": 8, + "type": 1, + "limit": "X名武将X星", + "limitType": 1, + "limitParams": "3&10", + "value": "1&80", + "sum": 100 + }, + { + "id": 9, + "name": "9级农庄", + "lv": 9, + "type": 1, + "limit": "X名武将X星", + "limitType": 1, + "limitParams": "3&12", + "value": "1&90", + "sum": 100 + }, + { + "id": 10, + "name": "10级农庄", + "lv": 10, + "type": 1, + "limit": "X名武将X星", + "limitType": 1, + "limitParams": "5&12", + "value": "1&100", + "sum": 100 + }, + { + "id": 11, + "name": "1级矿山", + "lv": 1, + "type": 2, + "limit": "X件装备X星", + "limitType": 2, + "limitParams": "1&1", + "value": "1&100&10|2&150&5|3&150&10", + "sum": 200 + }, + { + "id": 12, + "name": "2级矿山", + "lv": 2, + "type": 2, + "limit": "X件装备X星", + "limitType": 2, + "limitParams": "1&2", + "value": "1&100&10|2&150&5|3&150&10", + "sum": 200 + }, + { + "id": 13, + "name": "3级矿山", + "lv": 3, + "type": 2, + "limit": "X件装备X星", + "limitType": 2, + "limitParams": "1&3", + "value": "1&100&10|2&150&5|3&150&10", + "sum": 200 + }, + { + "id": 14, + "name": "4级矿山", + "lv": 4, + "type": 2, + "limit": "X件装备X星", + "limitType": 2, + "limitParams": "1&4", + "value": "1&100&10|2&150&5|3&150&10", + "sum": 200 + }, + { + "id": 15, + "name": "5级矿山", + "lv": 5, + "type": 2, + "limit": "X件装备X星", + "limitType": 2, + "limitParams": "1&5", + "value": "1&100&10|2&150&5|3&150&10", + "sum": 200 + }, + { + "id": 16, + "name": "6级矿山", + "lv": 6, + "type": 2, + "limit": "X件装备X星", + "limitType": 2, + "limitParams": "1&6", + "value": "1&100&10|2&150&5|3&150&10", + "sum": 200 + }, + { + "id": 17, + "name": "7级矿山", + "lv": 7, + "type": 2, + "limit": "X件装备X星", + "limitType": 2, + "limitParams": "4&3", + "value": "1&100&10|2&150&5|3&150&10", + "sum": 200 + }, + { + "id": 18, + "name": "8级矿山", + "lv": 8, + "type": 2, + "limit": "X件装备X星", + "limitType": 2, + "limitParams": "4&4", + "value": "1&100&10|2&150&5|3&150&10", + "sum": 200 + }, + { + "id": 19, + "name": "9级矿山", + "lv": 9, + "type": 2, + "limit": "X件装备X星", + "limitType": 2, + "limitParams": "4&5", + "value": "1&100&10|2&150&5|3&150&10", + "sum": 200 + }, + { + "id": 20, + "name": "10级矿山", + "lv": 10, + "type": 2, + "limit": "X件装备X星", + "limitType": 2, + "limitParams": "4&6", + "value": "2&150&10|3&200&10|4&150&10", + "sum": 200 + }, + { + "id": 21, + "name": "1级木堆", + "lv": 1, + "type": 3, + "limit": "最强6人战力达XXXX", + "limitType": 3, + "limitParams": 100000, + "value": "3&100", + "sum": 100 + }, + { + "id": 22, + "name": "2级木堆", + "lv": 2, + "type": 3, + "limit": "最强6人战力达XXXX", + "limitType": 3, + "limitParams": 200000, + "value": "3&150", + "sum": 100 + }, + { + "id": 23, + "name": "3级木堆", + "lv": 3, + "type": 3, + "limit": "最强6人战力达XXXX", + "limitType": 3, + "limitParams": 300000, + "value": "3&200", + "sum": 100 + }, + { + "id": 24, + "name": "4级木堆", + "lv": 4, + "type": 3, + "limit": "最强6人战力达XXXX", + "limitType": 3, + "limitParams": 400000, + "value": "3&250", + "sum": 100 + }, + { + "id": 25, + "name": "5级木堆", + "lv": 5, + "type": 3, + "limit": "最强6人战力达XXXX", + "limitType": 3, + "limitParams": 500000, + "value": "3&300", + "sum": 100 + }, + { + "id": 26, + "name": "6级木堆", + "lv": 6, + "type": 3, + "limit": "最强6人战力达XXXX", + "limitType": 3, + "limitParams": 600000, + "value": "3&350", + "sum": 100 + }, + { + "id": 27, + "name": "7级木堆", + "lv": 7, + "type": 3, + "limit": "最强6人战力达XXXX", + "limitType": 3, + "limitParams": 700000, + "value": "3&400", + "sum": 100 + }, + { + "id": 28, + "name": "8级木堆", + "lv": 8, + "type": 3, + "limit": "最强6人战力达XXXX", + "limitType": 3, + "limitParams": 800000, + "value": "3&450", + "sum": 100 + }, + { + "id": 29, + "name": "9级木堆", + "lv": 9, + "type": 3, + "limit": "最强6人战力达XXXX", + "limitType": 3, + "limitParams": 900000, + "value": "3&500", + "sum": 100 + }, + { + "id": 30, + "name": "10级木堆", + "lv": 10, + "type": 3, + "limit": "最强6人战力达XXXX", + "limitType": 3, + "limitParams": 1000000, + "value": "3&600", + "sum": 100 + } +] \ No newline at end of file diff --git a/shared/resource/jsons/dic_zyz_GVGTech.json b/shared/resource/jsons/dic_zyz_GVGTech.json new file mode 100644 index 000000000..ea2325dda --- /dev/null +++ b/shared/resource/jsons/dic_zyz_GVGTech.json @@ -0,0 +1,110 @@ +[ + { + "id": 1, + "name": "贤臣1", + "content": "资源产量提升5%", + "type": 1, + "param": "5&", + "nodeSort": 1, + "levelSeid": 0, + "levelLimit": 1, + "prepositionId": "&", + "consume": "12&5000" + }, + { + "id": 2, + "name": "猛将1", + "content": "征战中原联军成员攻击提升5%", + "type": 2, + "param": "&", + "nodeSort": 1, + "levelSeid": "1001&", + "levelLimit": 1, + "prepositionId": "&", + "consume": "12&5000" + }, + { + "id": 3, + "name": "贤臣2", + "content": "资源产量提升10%", + "type": 1, + "param": "10&", + "nodeSort": 2, + "levelSeid": 0, + "levelLimit": 2, + "prepositionId": "1&", + "consume": "12&5000" + }, + { + "id": 4, + "name": "猛将2", + "content": "征战中原联军成员攻击提升10%", + "type": 2, + "param": "&", + "nodeSort": 2, + "levelSeid": "1001&", + "levelLimit": 2, + "prepositionId": "2&", + "consume": "12&5000" + }, + { + "id": 5, + "name": "激战1", + "content": "激战期时联军成员攻击提升2%", + "type": 3, + "param": "&", + "nodeSort": 3, + "levelSeid": "1001&", + "levelLimit": 2, + "prepositionId": "3&|4&", + "consume": "12&5000" + }, + { + "id": 6, + "name": "激战2", + "content": "激战期时联军成员攻击提升5%", + "type": 3, + "param": "&", + "nodeSort": 4, + "levelSeid": "1001&", + "levelLimit": 4, + "prepositionId": "5&", + "consume": "12&5000" + }, + { + "id": 7, + "name": "复活1", + "content": "激战期时联军成员复活cd减少30s", + "type": 4, + "param": "30&", + "nodeSort": 5, + "levelSeid": 0, + "levelLimit": 4, + "prepositionId": "6&", + "consume": "12&5000" + }, + { + "id": 8, + "name": "箭塔1", + "content": "联军中随机20名成员获得箭塔(箭塔每10s给该位置所有敌军减5点耐久,箭头耐久为50点)", + "type": 5, + "param": "10&5&50", + "nodeSort": 6, + "levelSeid": 0, + "levelLimit": 6, + "prepositionId": "7&", + "consume": "12&5000" + }, + { + "id": 9, + "name": "攻城车1", + "content": "联军中随机20名成员获得攻城车(使用攻城车道具可击杀1名敌军)", + "type": 6, + "param": "20&", + "nodeSort": 6, + "levelSeid": 0, + "levelLimit": 6, + "prepositionId": "7&", + "consume": "12&5000" + } +] \ No newline at end of file diff --git a/shared/resource/jsons/dic_zyz_GVGVestige.json b/shared/resource/jsons/dic_zyz_GVGVestige.json new file mode 100644 index 000000000..b3694db29 --- /dev/null +++ b/shared/resource/jsons/dic_zyz_GVGVestige.json @@ -0,0 +1,7002 @@ +[ + { + "id": 1, + "vestigeId": 1, + "rank": 1, + "score": 500, + "spine": 11401, + "head": 11201, + "ce": 2115300, + "onceReward": "31002&50", + "onceLeagueReward": "12&50", + "warId": "70001&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 2, + "vestigeId": 1, + "rank": 2, + "score": 495, + "spine": 11402, + "head": 11202, + "ce": 2114500, + "onceReward": "31002&50", + "onceLeagueReward": "12&50", + "warId": "70002&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 3, + "vestigeId": 1, + "rank": 3, + "score": 490, + "spine": 11403, + "head": 11203, + "ce": 2113700, + "onceReward": "31002&50", + "onceLeagueReward": "12&50", + "warId": "70003&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 4, + "vestigeId": 1, + "rank": 4, + "score": 488, + "spine": 11404, + "head": 11204, + "ce": 2112900, + "onceReward": "31002&50", + "onceLeagueReward": "12&50", + "warId": "70004&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 5, + "vestigeId": 1, + "rank": 5, + "score": 486, + "spine": 11405, + "head": 11205, + "ce": 2112100, + "onceReward": "31002&50", + "onceLeagueReward": "12&50", + "warId": "70005&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 6, + "vestigeId": 1, + "rank": 6, + "score": 484, + "spine": 11407, + "head": 11207, + "ce": 2111300, + "onceReward": "31002&20", + "onceLeagueReward": "12&50", + "warId": "70006&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 7, + "vestigeId": 1, + "rank": 7, + "score": 482, + "spine": 11408, + "head": 11208, + "ce": 2110500, + "onceReward": "31002&20", + "onceLeagueReward": "12&50", + "warId": "70007&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 8, + "vestigeId": 1, + "rank": 8, + "score": 480, + "spine": 11410, + "head": 11210, + "ce": 2109600, + "onceReward": "31002&20", + "onceLeagueReward": "12&50", + "warId": "70008&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 9, + "vestigeId": 1, + "rank": 9, + "score": 478, + "spine": 11411, + "head": 11211, + "ce": 2108800, + "onceReward": "31002&20", + "onceLeagueReward": "12&50", + "warId": "70009&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 10, + "vestigeId": 1, + "rank": 10, + "score": 476, + "spine": 11412, + "head": 11212, + "ce": 2108000, + "onceReward": "31002&20", + "onceLeagueReward": "12&50", + "warId": "70010&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 11, + "vestigeId": 1, + "rank": 11, + "score": 474, + "spine": 11413, + "head": 11213, + "ce": 2107200, + "onceReward": "31002&20", + "onceLeagueReward": "12&50", + "warId": "70011&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 12, + "vestigeId": 1, + "rank": 12, + "score": 472, + "spine": 11414, + "head": 11214, + "ce": 2106400, + "onceReward": "31002&20", + "onceLeagueReward": "12&50", + "warId": "70012&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 13, + "vestigeId": 1, + "rank": 13, + "score": 470, + "spine": 11416, + "head": 11216, + "ce": 2105600, + "onceReward": "31002&20", + "onceLeagueReward": "12&50", + "warId": "70013&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 14, + "vestigeId": 1, + "rank": 14, + "score": 468, + "spine": 11417, + "head": 11217, + "ce": 2104800, + "onceReward": "31002&20", + "onceLeagueReward": "12&50", + "warId": "70014&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 15, + "vestigeId": 1, + "rank": 15, + "score": 466, + "spine": 11418, + "head": 11218, + "ce": 2103900, + "onceReward": "31002&20", + "onceLeagueReward": "12&50", + "warId": "70015&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 16, + "vestigeId": 1, + "rank": 16, + "score": 464, + "spine": 11419, + "head": 11219, + "ce": 2103100, + "onceReward": "31002&20", + "onceLeagueReward": "12&50", + "warId": "70016&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 17, + "vestigeId": 1, + "rank": 17, + "score": 462, + "spine": 11420, + "head": 11220, + "ce": 2102300, + "onceReward": "31002&20", + "onceLeagueReward": "12&50", + "warId": "70017&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 18, + "vestigeId": 1, + "rank": 18, + "score": 460, + "spine": 11421, + "head": 11221, + "ce": 2101500, + "onceReward": "31002&20", + "onceLeagueReward": "12&50", + "warId": "70018&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 19, + "vestigeId": 1, + "rank": 19, + "score": 458, + "spine": 11422, + "head": 11222, + "ce": 2100700, + "onceReward": "31002&20", + "onceLeagueReward": "12&50", + "warId": "70019&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 20, + "vestigeId": 1, + "rank": 20, + "score": 456, + "spine": 11424, + "head": 11224, + "ce": 2099900, + "onceReward": "31002&20", + "onceLeagueReward": "12&50", + "warId": "70020&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 21, + "vestigeId": 1, + "rank": 21, + "score": 454, + "spine": 11425, + "head": 11225, + "ce": 2099100, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70021&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 22, + "vestigeId": 1, + "rank": 22, + "score": 452, + "spine": 11426, + "head": 11226, + "ce": 2098200, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70022&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 23, + "vestigeId": 1, + "rank": 23, + "score": 450, + "spine": 11425, + "head": 11227, + "ce": 2097400, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70023&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 24, + "vestigeId": 1, + "rank": 24, + "score": 448, + "spine": 11426, + "head": 11228, + "ce": 2096600, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70024&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 25, + "vestigeId": 1, + "rank": 25, + "score": 446, + "spine": 11426, + "head": 11230, + "ce": 2095800, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70025&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 26, + "vestigeId": 1, + "rank": 26, + "score": 444, + "spine": 11401, + "head": 11201, + "ce": 2095000, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70026&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 27, + "vestigeId": 1, + "rank": 27, + "score": 442, + "spine": 11402, + "head": 11202, + "ce": 2094200, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70027&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 28, + "vestigeId": 1, + "rank": 28, + "score": 440, + "spine": 11403, + "head": 11203, + "ce": 2093400, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70028&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 29, + "vestigeId": 1, + "rank": 29, + "score": 438, + "spine": 11404, + "head": 11204, + "ce": 2092500, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70029&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 30, + "vestigeId": 1, + "rank": 30, + "score": 436, + "spine": 11405, + "head": 11205, + "ce": 2091700, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70030&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 31, + "vestigeId": 1, + "rank": 31, + "score": 434, + "spine": 11407, + "head": 11207, + "ce": 2090900, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70031&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 32, + "vestigeId": 1, + "rank": 32, + "score": 432, + "spine": 11408, + "head": 11208, + "ce": 2090100, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70032&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 33, + "vestigeId": 1, + "rank": 33, + "score": 430, + "spine": 11410, + "head": 11210, + "ce": 2089300, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70033&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 34, + "vestigeId": 1, + "rank": 34, + "score": 428, + "spine": 11411, + "head": 11211, + "ce": 2088500, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70034&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 35, + "vestigeId": 1, + "rank": 35, + "score": 426, + "spine": 11412, + "head": 11212, + "ce": 2087700, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70035&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 36, + "vestigeId": 1, + "rank": 36, + "score": 424, + "spine": 11413, + "head": 11213, + "ce": 2086800, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70036&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 37, + "vestigeId": 1, + "rank": 37, + "score": 422, + "spine": 11414, + "head": 11214, + "ce": 2086000, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70037&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 38, + "vestigeId": 1, + "rank": 38, + "score": 420, + "spine": 11416, + "head": 11216, + "ce": 2085200, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70038&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 39, + "vestigeId": 1, + "rank": 39, + "score": 418, + "spine": 11417, + "head": 11217, + "ce": 2084400, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70039&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 40, + "vestigeId": 1, + "rank": 40, + "score": 416, + "spine": 11418, + "head": 11218, + "ce": 2083600, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70040&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 41, + "vestigeId": 1, + "rank": 41, + "score": 414, + "spine": 11419, + "head": 11219, + "ce": 2082800, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70041&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 42, + "vestigeId": 1, + "rank": 42, + "score": 412, + "spine": 11420, + "head": 11220, + "ce": 2082000, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70042&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 43, + "vestigeId": 1, + "rank": 43, + "score": 410, + "spine": 11421, + "head": 11221, + "ce": 2081100, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70043&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 44, + "vestigeId": 1, + "rank": 44, + "score": 408, + "spine": 11422, + "head": 11222, + "ce": 2080300, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70044&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 45, + "vestigeId": 1, + "rank": 45, + "score": 406, + "spine": 11424, + "head": 11224, + "ce": 2079500, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70045&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 46, + "vestigeId": 1, + "rank": 46, + "score": 404, + "spine": 11425, + "head": 11225, + "ce": 2078700, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70046&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 47, + "vestigeId": 1, + "rank": 47, + "score": 402, + "spine": 11426, + "head": 11226, + "ce": 2077900, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70047&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 48, + "vestigeId": 1, + "rank": 48, + "score": 400, + "spine": 11425, + "head": 11227, + "ce": 2077100, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70048&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 49, + "vestigeId": 1, + "rank": 49, + "score": 398, + "spine": 11426, + "head": 11228, + "ce": 2076300, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70049&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 50, + "vestigeId": 1, + "rank": 50, + "score": 396, + "spine": 11426, + "head": 11230, + "ce": 2075400, + "onceReward": "31002&15", + "onceLeagueReward": "12&50", + "warId": "70050&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 51, + "vestigeId": 1, + "rank": 51, + "score": 394, + "spine": 11401, + "head": 11201, + "ce": 2074600, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70051&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 52, + "vestigeId": 1, + "rank": 52, + "score": 392, + "spine": 11402, + "head": 11202, + "ce": 2073800, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70052&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 53, + "vestigeId": 1, + "rank": 53, + "score": 390, + "spine": 11403, + "head": 11203, + "ce": 2073000, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70053&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 54, + "vestigeId": 1, + "rank": 54, + "score": 388, + "spine": 11404, + "head": 11204, + "ce": 2072200, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70054&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 55, + "vestigeId": 1, + "rank": 55, + "score": 386, + "spine": 11405, + "head": 11205, + "ce": 2071400, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70055&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 56, + "vestigeId": 1, + "rank": 56, + "score": 384, + "spine": 11407, + "head": 11207, + "ce": 2070600, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70056&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 57, + "vestigeId": 1, + "rank": 57, + "score": 382, + "spine": 11408, + "head": 11208, + "ce": 2069700, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70057&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 58, + "vestigeId": 1, + "rank": 58, + "score": 380, + "spine": 11410, + "head": 11210, + "ce": 2068900, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70058&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 59, + "vestigeId": 1, + "rank": 59, + "score": 378, + "spine": 11411, + "head": 11211, + "ce": 2068100, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70059&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 60, + "vestigeId": 1, + "rank": 60, + "score": 376, + "spine": 11412, + "head": 11212, + "ce": 2067300, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70060&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 61, + "vestigeId": 1, + "rank": 61, + "score": 374, + "spine": 11413, + "head": 11213, + "ce": 2066500, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70061&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 62, + "vestigeId": 1, + "rank": 62, + "score": 372, + "spine": 11414, + "head": 11214, + "ce": 2065700, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70062&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 63, + "vestigeId": 1, + "rank": 63, + "score": 370, + "spine": 11416, + "head": 11216, + "ce": 2064900, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70063&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 64, + "vestigeId": 1, + "rank": 64, + "score": 368, + "spine": 11417, + "head": 11217, + "ce": 2064100, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70064&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 65, + "vestigeId": 1, + "rank": 65, + "score": 366, + "spine": 11418, + "head": 11218, + "ce": 2063200, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70065&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 66, + "vestigeId": 1, + "rank": 66, + "score": 364, + "spine": 11419, + "head": 11219, + "ce": 2062400, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70066&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 67, + "vestigeId": 1, + "rank": 67, + "score": 362, + "spine": 11420, + "head": 11220, + "ce": 2061600, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70067&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 68, + "vestigeId": 1, + "rank": 68, + "score": 360, + "spine": 11421, + "head": 11221, + "ce": 2060800, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70068&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 69, + "vestigeId": 1, + "rank": 69, + "score": 358, + "spine": 11422, + "head": 11222, + "ce": 2060000, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70069&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 70, + "vestigeId": 1, + "rank": 70, + "score": 356, + "spine": 11424, + "head": 11224, + "ce": 2059200, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70070&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 71, + "vestigeId": 1, + "rank": 71, + "score": 354, + "spine": 11425, + "head": 11225, + "ce": 2058400, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70071&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 72, + "vestigeId": 1, + "rank": 72, + "score": 352, + "spine": 11426, + "head": 11226, + "ce": 2057500, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70072&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 73, + "vestigeId": 1, + "rank": 73, + "score": 350, + "spine": 11425, + "head": 11227, + "ce": 2056700, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70073&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 74, + "vestigeId": 1, + "rank": 74, + "score": 348, + "spine": 11426, + "head": 11228, + "ce": 2055900, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70074&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 75, + "vestigeId": 1, + "rank": 75, + "score": 346, + "spine": 11426, + "head": 11230, + "ce": 2055100, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70075&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 76, + "vestigeId": 1, + "rank": 76, + "score": 344, + "spine": 11401, + "head": 11201, + "ce": 2054300, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70076&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 77, + "vestigeId": 1, + "rank": 77, + "score": 342, + "spine": 11402, + "head": 11202, + "ce": 2053500, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70077&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 78, + "vestigeId": 1, + "rank": 78, + "score": 340, + "spine": 11403, + "head": 11203, + "ce": 2052700, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70078&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 79, + "vestigeId": 1, + "rank": 79, + "score": 338, + "spine": 11404, + "head": 11204, + "ce": 2051800, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70079&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 80, + "vestigeId": 1, + "rank": 80, + "score": 336, + "spine": 11405, + "head": 11205, + "ce": 2051000, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70080&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 81, + "vestigeId": 1, + "rank": 81, + "score": 334, + "spine": 11407, + "head": 11207, + "ce": 2050200, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70081&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 82, + "vestigeId": 1, + "rank": 82, + "score": 332, + "spine": 11408, + "head": 11208, + "ce": 2049400, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70082&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 83, + "vestigeId": 1, + "rank": 83, + "score": 330, + "spine": 11410, + "head": 11210, + "ce": 2048600, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70083&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 84, + "vestigeId": 1, + "rank": 84, + "score": 328, + "spine": 11411, + "head": 11211, + "ce": 2047800, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70084&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 85, + "vestigeId": 1, + "rank": 85, + "score": 326, + "spine": 11412, + "head": 11212, + "ce": 2047000, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70085&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 86, + "vestigeId": 1, + "rank": 86, + "score": 324, + "spine": 11413, + "head": 11213, + "ce": 2046100, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70086&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 87, + "vestigeId": 1, + "rank": 87, + "score": 322, + "spine": 11414, + "head": 11214, + "ce": 2045300, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70087&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 88, + "vestigeId": 1, + "rank": 88, + "score": 320, + "spine": 11416, + "head": 11216, + "ce": 2044500, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70088&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 89, + "vestigeId": 1, + "rank": 89, + "score": 318, + "spine": 11417, + "head": 11217, + "ce": 2043700, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70089&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 90, + "vestigeId": 1, + "rank": 90, + "score": 316, + "spine": 11418, + "head": 11218, + "ce": 2042900, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70090&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 91, + "vestigeId": 1, + "rank": 91, + "score": 314, + "spine": 11419, + "head": 11219, + "ce": 2042100, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70091&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 92, + "vestigeId": 1, + "rank": 92, + "score": 312, + "spine": 11420, + "head": 11220, + "ce": 2041300, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70092&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 93, + "vestigeId": 1, + "rank": 93, + "score": 310, + "spine": 11421, + "head": 11221, + "ce": 2040400, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70093&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 94, + "vestigeId": 1, + "rank": 94, + "score": 308, + "spine": 11422, + "head": 11222, + "ce": 2039600, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70094&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 95, + "vestigeId": 1, + "rank": 95, + "score": 306, + "spine": 11424, + "head": 11224, + "ce": 2038800, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70095&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 96, + "vestigeId": 1, + "rank": 96, + "score": 304, + "spine": 11425, + "head": 11225, + "ce": 2038000, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70096&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 97, + "vestigeId": 1, + "rank": 97, + "score": 302, + "spine": 11426, + "head": 11226, + "ce": 2037200, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70097&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 98, + "vestigeId": 1, + "rank": 98, + "score": 300, + "spine": 11425, + "head": 11227, + "ce": 2036400, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70098&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 99, + "vestigeId": 1, + "rank": 99, + "score": 298, + "spine": 11426, + "head": 11228, + "ce": 2035600, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70099&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 100, + "vestigeId": 1, + "rank": 100, + "score": 296, + "spine": 11426, + "head": 11230, + "ce": 2034700, + "onceReward": "31002&10", + "onceLeagueReward": "12&50", + "warId": "70100&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 101, + "vestigeId": 1, + "rank": 101, + "score": 294, + "spine": 11401, + "head": 11201, + "ce": 2033900, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70101&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 102, + "vestigeId": 1, + "rank": 102, + "score": 292, + "spine": 11402, + "head": 11202, + "ce": 2033100, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70102&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 103, + "vestigeId": 1, + "rank": 103, + "score": 290, + "spine": 11403, + "head": 11203, + "ce": 2032300, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70103&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 104, + "vestigeId": 1, + "rank": 104, + "score": 288, + "spine": 11404, + "head": 11204, + "ce": 2031500, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70104&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 105, + "vestigeId": 1, + "rank": 105, + "score": 286, + "spine": 11405, + "head": 11205, + "ce": 2030700, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70105&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 106, + "vestigeId": 1, + "rank": 106, + "score": 284, + "spine": 11407, + "head": 11207, + "ce": 2029900, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70106&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 107, + "vestigeId": 1, + "rank": 107, + "score": 282, + "spine": 11408, + "head": 11208, + "ce": 2029000, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70107&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 108, + "vestigeId": 1, + "rank": 108, + "score": 280, + "spine": 11410, + "head": 11210, + "ce": 2028200, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70108&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 109, + "vestigeId": 1, + "rank": 109, + "score": 278, + "spine": 11411, + "head": 11211, + "ce": 2027400, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70109&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 110, + "vestigeId": 1, + "rank": 110, + "score": 276, + "spine": 11412, + "head": 11212, + "ce": 2026600, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70110&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 111, + "vestigeId": 1, + "rank": 111, + "score": 274, + "spine": 11413, + "head": 11213, + "ce": 2025800, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70111&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 112, + "vestigeId": 1, + "rank": 112, + "score": 272, + "spine": 11414, + "head": 11214, + "ce": 2025000, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70112&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 113, + "vestigeId": 1, + "rank": 113, + "score": 270, + "spine": 11416, + "head": 11216, + "ce": 2024200, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70113&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 114, + "vestigeId": 1, + "rank": 114, + "score": 268, + "spine": 11417, + "head": 11217, + "ce": 2023300, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70114&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 115, + "vestigeId": 1, + "rank": 115, + "score": 266, + "spine": 11418, + "head": 11218, + "ce": 2022500, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70115&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 116, + "vestigeId": 1, + "rank": 116, + "score": 264, + "spine": 11419, + "head": 11219, + "ce": 2021700, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70116&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 117, + "vestigeId": 1, + "rank": 117, + "score": 262, + "spine": 11420, + "head": 11220, + "ce": 2020900, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70117&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 118, + "vestigeId": 1, + "rank": 118, + "score": 260, + "spine": 11421, + "head": 11221, + "ce": 2020100, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70118&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 119, + "vestigeId": 1, + "rank": 119, + "score": 258, + "spine": 11422, + "head": 11222, + "ce": 2019300, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70119&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 120, + "vestigeId": 1, + "rank": 120, + "score": 256, + "spine": 11424, + "head": 11224, + "ce": 2018500, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70120&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 121, + "vestigeId": 1, + "rank": 121, + "score": 254, + "spine": 11425, + "head": 11225, + "ce": 2017700, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70121&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 122, + "vestigeId": 1, + "rank": 122, + "score": 252, + "spine": 11426, + "head": 11226, + "ce": 2016800, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70122&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 123, + "vestigeId": 1, + "rank": 123, + "score": 250, + "spine": 11425, + "head": 11227, + "ce": 2016000, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70123&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 124, + "vestigeId": 1, + "rank": 124, + "score": 248, + "spine": 11426, + "head": 11228, + "ce": 2015200, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70124&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 125, + "vestigeId": 1, + "rank": 125, + "score": 246, + "spine": 11426, + "head": 11230, + "ce": 2014400, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70125&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 126, + "vestigeId": 1, + "rank": 126, + "score": 244, + "spine": 11401, + "head": 11201, + "ce": 2013600, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70126&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 127, + "vestigeId": 1, + "rank": 127, + "score": 242, + "spine": 11402, + "head": 11202, + "ce": 2012800, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70127&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 128, + "vestigeId": 1, + "rank": 128, + "score": 240, + "spine": 11403, + "head": 11203, + "ce": 2012000, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70128&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 129, + "vestigeId": 1, + "rank": 129, + "score": 238, + "spine": 11404, + "head": 11204, + "ce": 2011100, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70129&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 130, + "vestigeId": 1, + "rank": 130, + "score": 236, + "spine": 11405, + "head": 11205, + "ce": 2010300, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70130&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 131, + "vestigeId": 1, + "rank": 131, + "score": 234, + "spine": 11407, + "head": 11207, + "ce": 2009500, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70131&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 132, + "vestigeId": 1, + "rank": 132, + "score": 232, + "spine": 11408, + "head": 11208, + "ce": 2008700, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70132&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 133, + "vestigeId": 1, + "rank": 133, + "score": 230, + "spine": 11410, + "head": 11210, + "ce": 2007900, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70133&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 134, + "vestigeId": 1, + "rank": 134, + "score": 228, + "spine": 11411, + "head": 11211, + "ce": 2007100, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70134&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 135, + "vestigeId": 1, + "rank": 135, + "score": 226, + "spine": 11412, + "head": 11212, + "ce": 2006300, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70135&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 136, + "vestigeId": 1, + "rank": 136, + "score": 224, + "spine": 11413, + "head": 11213, + "ce": 2005400, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70136&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 137, + "vestigeId": 1, + "rank": 137, + "score": 222, + "spine": 11414, + "head": 11214, + "ce": 2004600, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70137&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 138, + "vestigeId": 1, + "rank": 138, + "score": 220, + "spine": 11416, + "head": 11216, + "ce": 2003800, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70138&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 139, + "vestigeId": 1, + "rank": 139, + "score": 218, + "spine": 11417, + "head": 11217, + "ce": 2003000, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70139&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 140, + "vestigeId": 1, + "rank": 140, + "score": 216, + "spine": 11418, + "head": 11218, + "ce": 2002200, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70140&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 141, + "vestigeId": 1, + "rank": 141, + "score": 214, + "spine": 11419, + "head": 11219, + "ce": 2001400, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70141&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 142, + "vestigeId": 1, + "rank": 142, + "score": 212, + "spine": 11420, + "head": 11220, + "ce": 2000600, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70142&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 143, + "vestigeId": 1, + "rank": 143, + "score": 210, + "spine": 11421, + "head": 11221, + "ce": 1999700, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70143&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 144, + "vestigeId": 1, + "rank": 144, + "score": 208, + "spine": 11422, + "head": 11222, + "ce": 1998900, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70144&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 145, + "vestigeId": 1, + "rank": 145, + "score": 206, + "spine": 11424, + "head": 11224, + "ce": 1998100, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70145&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 146, + "vestigeId": 1, + "rank": 146, + "score": 204, + "spine": 11425, + "head": 11225, + "ce": 1997300, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70146&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 147, + "vestigeId": 1, + "rank": 147, + "score": 202, + "spine": 11426, + "head": 11226, + "ce": 1996500, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70147&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 148, + "vestigeId": 1, + "rank": 148, + "score": 200, + "spine": 11425, + "head": 11227, + "ce": 1995700, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70148&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 149, + "vestigeId": 1, + "rank": 149, + "score": 198, + "spine": 11426, + "head": 11228, + "ce": 1994900, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70149&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 150, + "vestigeId": 1, + "rank": 150, + "score": 196, + "spine": 11426, + "head": 11230, + "ce": 1994000, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70150&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 151, + "vestigeId": 1, + "rank": 151, + "score": 194, + "spine": 11401, + "head": 11201, + "ce": 1993200, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70151&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 152, + "vestigeId": 1, + "rank": 152, + "score": 192, + "spine": 11402, + "head": 11202, + "ce": 1992400, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70152&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 153, + "vestigeId": 1, + "rank": 153, + "score": 190, + "spine": 11403, + "head": 11203, + "ce": 1991600, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70153&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 154, + "vestigeId": 1, + "rank": 154, + "score": 188, + "spine": 11404, + "head": 11204, + "ce": 1990800, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70154&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 155, + "vestigeId": 1, + "rank": 155, + "score": 186, + "spine": 11405, + "head": 11205, + "ce": 1990000, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70155&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 156, + "vestigeId": 1, + "rank": 156, + "score": 184, + "spine": 11407, + "head": 11207, + "ce": 1989200, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70156&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 157, + "vestigeId": 1, + "rank": 157, + "score": 182, + "spine": 11408, + "head": 11208, + "ce": 1988300, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70157&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 158, + "vestigeId": 1, + "rank": 158, + "score": 180, + "spine": 11410, + "head": 11210, + "ce": 1987500, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70158&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 159, + "vestigeId": 1, + "rank": 159, + "score": 178, + "spine": 11411, + "head": 11211, + "ce": 1986700, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70159&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 160, + "vestigeId": 1, + "rank": 160, + "score": 176, + "spine": 11412, + "head": 11212, + "ce": 1985900, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70160&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 161, + "vestigeId": 1, + "rank": 161, + "score": 174, + "spine": 11413, + "head": 11213, + "ce": 1985100, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70161&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 162, + "vestigeId": 1, + "rank": 162, + "score": 172, + "spine": 11414, + "head": 11214, + "ce": 1984300, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70162&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 163, + "vestigeId": 1, + "rank": 163, + "score": 170, + "spine": 11416, + "head": 11216, + "ce": 1983500, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70163&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 164, + "vestigeId": 1, + "rank": 164, + "score": 168, + "spine": 11417, + "head": 11217, + "ce": 1982600, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70164&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 165, + "vestigeId": 1, + "rank": 165, + "score": 166, + "spine": 11418, + "head": 11218, + "ce": 1981800, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70165&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 166, + "vestigeId": 1, + "rank": 166, + "score": 164, + "spine": 11419, + "head": 11219, + "ce": 1981000, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70166&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 167, + "vestigeId": 1, + "rank": 167, + "score": 162, + "spine": 11420, + "head": 11220, + "ce": 1980200, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70167&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 168, + "vestigeId": 1, + "rank": 168, + "score": 160, + "spine": 11421, + "head": 11221, + "ce": 1979400, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70168&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 169, + "vestigeId": 1, + "rank": 169, + "score": 158, + "spine": 11422, + "head": 11222, + "ce": 1978600, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70169&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 170, + "vestigeId": 1, + "rank": 170, + "score": 156, + "spine": 11424, + "head": 11224, + "ce": 1977800, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70170&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 171, + "vestigeId": 1, + "rank": 171, + "score": 154, + "spine": 11425, + "head": 11225, + "ce": 1976900, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70171&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 172, + "vestigeId": 1, + "rank": 172, + "score": 152, + "spine": 11426, + "head": 11226, + "ce": 1976100, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70172&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 173, + "vestigeId": 1, + "rank": 173, + "score": 150, + "spine": 11425, + "head": 11227, + "ce": 1975300, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70173&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 174, + "vestigeId": 1, + "rank": 174, + "score": 148, + "spine": 11426, + "head": 11228, + "ce": 1974500, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70174&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 175, + "vestigeId": 1, + "rank": 175, + "score": 146, + "spine": 11426, + "head": 11230, + "ce": 1973700, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70175&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 176, + "vestigeId": 1, + "rank": 176, + "score": 144, + "spine": 11401, + "head": 11201, + "ce": 1972900, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70176&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 177, + "vestigeId": 1, + "rank": 177, + "score": 142, + "spine": 11402, + "head": 11202, + "ce": 1972100, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70177&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 178, + "vestigeId": 1, + "rank": 178, + "score": 140, + "spine": 11403, + "head": 11203, + "ce": 1971200, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70178&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 179, + "vestigeId": 1, + "rank": 179, + "score": 138, + "spine": 11404, + "head": 11204, + "ce": 1970400, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70179&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 180, + "vestigeId": 1, + "rank": 180, + "score": 136, + "spine": 11405, + "head": 11205, + "ce": 1969600, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70180&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 181, + "vestigeId": 1, + "rank": 181, + "score": 134, + "spine": 11407, + "head": 11207, + "ce": 1968800, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70181&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 182, + "vestigeId": 1, + "rank": 182, + "score": 132, + "spine": 11408, + "head": 11208, + "ce": 1968000, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70182&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 183, + "vestigeId": 1, + "rank": 183, + "score": 130, + "spine": 11410, + "head": 11210, + "ce": 1967200, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70183&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 184, + "vestigeId": 1, + "rank": 184, + "score": 128, + "spine": 11411, + "head": 11211, + "ce": 1966400, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70184&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 185, + "vestigeId": 1, + "rank": 185, + "score": 126, + "spine": 11412, + "head": 11212, + "ce": 1965600, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70185&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 186, + "vestigeId": 1, + "rank": 186, + "score": 124, + "spine": 11413, + "head": 11213, + "ce": 1964700, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70186&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 187, + "vestigeId": 1, + "rank": 187, + "score": 122, + "spine": 11414, + "head": 11214, + "ce": 1963900, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70187&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 188, + "vestigeId": 1, + "rank": 188, + "score": 120, + "spine": 11416, + "head": 11216, + "ce": 1963100, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70188&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 189, + "vestigeId": 1, + "rank": 189, + "score": 118, + "spine": 11417, + "head": 11217, + "ce": 1962300, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70189&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 190, + "vestigeId": 1, + "rank": 190, + "score": 116, + "spine": 11418, + "head": 11218, + "ce": 1961500, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70190&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 191, + "vestigeId": 1, + "rank": 191, + "score": 114, + "spine": 11419, + "head": 11219, + "ce": 1960700, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70191&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 192, + "vestigeId": 1, + "rank": 192, + "score": 112, + "spine": 11420, + "head": 11220, + "ce": 1959900, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70192&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 193, + "vestigeId": 1, + "rank": 193, + "score": 110, + "spine": 11421, + "head": 11221, + "ce": 1959000, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70193&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 194, + "vestigeId": 1, + "rank": 194, + "score": 108, + "spine": 11422, + "head": 11222, + "ce": 1958200, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70194&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 195, + "vestigeId": 1, + "rank": 195, + "score": 106, + "spine": 11424, + "head": 11224, + "ce": 1957400, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70195&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 196, + "vestigeId": 1, + "rank": 196, + "score": 104, + "spine": 11425, + "head": 11225, + "ce": 1956600, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70196&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 197, + "vestigeId": 1, + "rank": 197, + "score": 102, + "spine": 11426, + "head": 11226, + "ce": 1955800, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70197&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 198, + "vestigeId": 1, + "rank": 198, + "score": 100, + "spine": 11425, + "head": 11227, + "ce": 1955000, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70198&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 199, + "vestigeId": 1, + "rank": 199, + "score": 98, + "spine": 11426, + "head": 11228, + "ce": 1954200, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70199&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 200, + "vestigeId": 1, + "rank": 200, + "score": 96, + "spine": 11426, + "head": 11230, + "ce": 1953300, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70200&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 201, + "vestigeId": 1, + "rank": 201, + "score": 94, + "spine": 11401, + "head": 11201, + "ce": 1952500, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70201&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 202, + "vestigeId": 1, + "rank": 202, + "score": 92, + "spine": 11402, + "head": 11202, + "ce": 1951700, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70202&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 203, + "vestigeId": 1, + "rank": 203, + "score": 90, + "spine": 11403, + "head": 11203, + "ce": 1950900, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70203&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 204, + "vestigeId": 1, + "rank": 204, + "score": 88, + "spine": 11404, + "head": 11204, + "ce": 1950100, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70204&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 205, + "vestigeId": 1, + "rank": 205, + "score": 86, + "spine": 11405, + "head": 11205, + "ce": 1949300, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70205&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 206, + "vestigeId": 1, + "rank": 206, + "score": 84, + "spine": 11407, + "head": 11207, + "ce": 1948500, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70206&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 207, + "vestigeId": 1, + "rank": 207, + "score": 82, + "spine": 11408, + "head": 11208, + "ce": 1947600, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70207&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 208, + "vestigeId": 1, + "rank": 208, + "score": 80, + "spine": 11410, + "head": 11210, + "ce": 1946800, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70208&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 209, + "vestigeId": 1, + "rank": 209, + "score": 78, + "spine": 11411, + "head": 11211, + "ce": 1946000, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70209&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 210, + "vestigeId": 1, + "rank": 210, + "score": 76, + "spine": 11412, + "head": 11212, + "ce": 1945200, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70210&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 211, + "vestigeId": 1, + "rank": 211, + "score": 74, + "spine": 11413, + "head": 11213, + "ce": 1944400, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70211&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 212, + "vestigeId": 1, + "rank": 212, + "score": 72, + "spine": 11414, + "head": 11214, + "ce": 1943600, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70212&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 213, + "vestigeId": 1, + "rank": 213, + "score": 70, + "spine": 11416, + "head": 11216, + "ce": 1942800, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70213&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 214, + "vestigeId": 1, + "rank": 214, + "score": 68, + "spine": 11417, + "head": 11217, + "ce": 1941900, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70214&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 215, + "vestigeId": 1, + "rank": 215, + "score": 66, + "spine": 11418, + "head": 11218, + "ce": 1941100, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70215&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 216, + "vestigeId": 1, + "rank": 216, + "score": 64, + "spine": 11419, + "head": 11219, + "ce": 1940300, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70216&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 217, + "vestigeId": 1, + "rank": 217, + "score": 62, + "spine": 11420, + "head": 11220, + "ce": 1939500, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70217&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 218, + "vestigeId": 1, + "rank": 218, + "score": 60, + "spine": 11421, + "head": 11221, + "ce": 1938700, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70218&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 219, + "vestigeId": 1, + "rank": 219, + "score": 58, + "spine": 11422, + "head": 11222, + "ce": 1937900, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70219&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 220, + "vestigeId": 1, + "rank": 220, + "score": 56, + "spine": 11424, + "head": 11224, + "ce": 1937100, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70220&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 221, + "vestigeId": 1, + "rank": 221, + "score": 54, + "spine": 11425, + "head": 11225, + "ce": 1936200, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70221&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 222, + "vestigeId": 1, + "rank": 222, + "score": 52, + "spine": 11426, + "head": 11226, + "ce": 1935400, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70222&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 223, + "vestigeId": 1, + "rank": 223, + "score": 50, + "spine": 11425, + "head": 11227, + "ce": 1934600, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70223&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 224, + "vestigeId": 1, + "rank": 224, + "score": 48, + "spine": 11426, + "head": 11228, + "ce": 1933800, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70224&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 225, + "vestigeId": 1, + "rank": 225, + "score": 46, + "spine": 11426, + "head": 11230, + "ce": 1933000, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70225&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 226, + "vestigeId": 1, + "rank": 226, + "score": 44, + "spine": 11401, + "head": 11201, + "ce": 1932200, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70226&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 227, + "vestigeId": 1, + "rank": 227, + "score": 42, + "spine": 11402, + "head": 11202, + "ce": 1931400, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70227&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 228, + "vestigeId": 1, + "rank": 228, + "score": 40, + "spine": 11403, + "head": 11203, + "ce": 1930500, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70228&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 229, + "vestigeId": 1, + "rank": 229, + "score": 38, + "spine": 11404, + "head": 11204, + "ce": 1929700, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70229&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 230, + "vestigeId": 1, + "rank": 230, + "score": 36, + "spine": 11405, + "head": 11205, + "ce": 1928900, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70230&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 231, + "vestigeId": 1, + "rank": 231, + "score": 34, + "spine": 11407, + "head": 11207, + "ce": 1928100, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70231&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 232, + "vestigeId": 1, + "rank": 232, + "score": 32, + "spine": 11408, + "head": 11208, + "ce": 1927300, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70232&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 233, + "vestigeId": 1, + "rank": 233, + "score": 30, + "spine": 11410, + "head": 11210, + "ce": 1926500, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70233&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 234, + "vestigeId": 1, + "rank": 234, + "score": 28, + "spine": 11411, + "head": 11211, + "ce": 1925700, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70234&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 235, + "vestigeId": 1, + "rank": 235, + "score": 26, + "spine": 11412, + "head": 11212, + "ce": 1924800, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70235&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 236, + "vestigeId": 1, + "rank": 236, + "score": 24, + "spine": 11413, + "head": 11213, + "ce": 1924000, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70236&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 237, + "vestigeId": 1, + "rank": 237, + "score": 22, + "spine": 11414, + "head": 11214, + "ce": 1923200, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70237&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 238, + "vestigeId": 1, + "rank": 238, + "score": 20, + "spine": 11416, + "head": 11216, + "ce": 1922400, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70238&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 239, + "vestigeId": 1, + "rank": 239, + "score": 18, + "spine": 11417, + "head": 11217, + "ce": 1921600, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70239&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 240, + "vestigeId": 1, + "rank": 240, + "score": 16, + "spine": 11418, + "head": 11218, + "ce": 1920800, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70240&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 241, + "vestigeId": 1, + "rank": 241, + "score": 14, + "spine": 11419, + "head": 11219, + "ce": 1920000, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70241&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 242, + "vestigeId": 1, + "rank": 242, + "score": 12, + "spine": 11420, + "head": 11220, + "ce": 1919200, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70242&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 243, + "vestigeId": 1, + "rank": 243, + "score": 10, + "spine": 11421, + "head": 11221, + "ce": 1918300, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70243&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 244, + "vestigeId": 1, + "rank": 244, + "score": 9, + "spine": 11422, + "head": 11222, + "ce": 1917500, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70244&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 245, + "vestigeId": 1, + "rank": 245, + "score": 8, + "spine": 11424, + "head": 11224, + "ce": 1916700, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70245&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 246, + "vestigeId": 1, + "rank": 246, + "score": 7, + "spine": 11425, + "head": 11225, + "ce": 1915900, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70246&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 247, + "vestigeId": 1, + "rank": 247, + "score": 6, + "spine": 11426, + "head": 11226, + "ce": 1915100, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70247&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 248, + "vestigeId": 1, + "rank": 248, + "score": 5, + "spine": 11425, + "head": 11227, + "ce": 1914300, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70248&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 249, + "vestigeId": 1, + "rank": 249, + "score": 4, + "spine": 11426, + "head": 11228, + "ce": 1913500, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70249&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 250, + "vestigeId": 1, + "rank": 250, + "score": 2, + "spine": 11426, + "head": 11230, + "ce": 1912600, + "onceReward": "31002&2", + "onceLeagueReward": "12&50", + "warId": "70250&", + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 251, + "vestigeId": 2, + "rank": 1, + "score": 500, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 252, + "vestigeId": 2, + "rank": 2, + "score": 495, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 253, + "vestigeId": 2, + "rank": 3, + "score": 490, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 254, + "vestigeId": 2, + "rank": 4, + "score": 488, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 255, + "vestigeId": 2, + "rank": 5, + "score": 486, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 256, + "vestigeId": 2, + "rank": 6, + "score": 484, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 257, + "vestigeId": 2, + "rank": 7, + "score": 482, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 258, + "vestigeId": 2, + "rank": 8, + "score": 480, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 259, + "vestigeId": 2, + "rank": 9, + "score": 478, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 260, + "vestigeId": 2, + "rank": 10, + "score": 476, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 261, + "vestigeId": 2, + "rank": 11, + "score": 474, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 262, + "vestigeId": 2, + "rank": 12, + "score": 472, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 263, + "vestigeId": 2, + "rank": 13, + "score": 470, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 264, + "vestigeId": 2, + "rank": 14, + "score": 468, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 265, + "vestigeId": 2, + "rank": 15, + "score": 466, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 266, + "vestigeId": 2, + "rank": 16, + "score": 464, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 267, + "vestigeId": 2, + "rank": 17, + "score": 462, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 268, + "vestigeId": 2, + "rank": 18, + "score": 460, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 269, + "vestigeId": 2, + "rank": 19, + "score": 458, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 270, + "vestigeId": 2, + "rank": 20, + "score": 456, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 271, + "vestigeId": 2, + "rank": 21, + "score": 454, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 272, + "vestigeId": 2, + "rank": 22, + "score": 452, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 273, + "vestigeId": 2, + "rank": 23, + "score": 450, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 274, + "vestigeId": 2, + "rank": 24, + "score": 448, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 275, + "vestigeId": 2, + "rank": 25, + "score": 446, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 276, + "vestigeId": 2, + "rank": 26, + "score": 444, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 277, + "vestigeId": 2, + "rank": 27, + "score": 442, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 278, + "vestigeId": 2, + "rank": 28, + "score": 440, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 279, + "vestigeId": 2, + "rank": 29, + "score": 438, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 280, + "vestigeId": 2, + "rank": 30, + "score": 436, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 281, + "vestigeId": 2, + "rank": 31, + "score": 434, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 282, + "vestigeId": 2, + "rank": 32, + "score": 432, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 283, + "vestigeId": 2, + "rank": 33, + "score": 430, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 284, + "vestigeId": 2, + "rank": 34, + "score": 428, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 285, + "vestigeId": 2, + "rank": 35, + "score": 426, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 286, + "vestigeId": 2, + "rank": 36, + "score": 424, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 287, + "vestigeId": 2, + "rank": 37, + "score": 422, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 288, + "vestigeId": 2, + "rank": 38, + "score": 420, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 289, + "vestigeId": 2, + "rank": 39, + "score": 418, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 290, + "vestigeId": 2, + "rank": 40, + "score": 416, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 291, + "vestigeId": 2, + "rank": 41, + "score": 414, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 292, + "vestigeId": 2, + "rank": 42, + "score": 412, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 293, + "vestigeId": 2, + "rank": 43, + "score": 410, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 294, + "vestigeId": 2, + "rank": 44, + "score": 408, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 295, + "vestigeId": 2, + "rank": 45, + "score": 406, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 296, + "vestigeId": 2, + "rank": 46, + "score": 404, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 297, + "vestigeId": 2, + "rank": 47, + "score": 402, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 298, + "vestigeId": 2, + "rank": 48, + "score": 400, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 299, + "vestigeId": 2, + "rank": 49, + "score": 398, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 300, + "vestigeId": 2, + "rank": 50, + "score": 396, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 301, + "vestigeId": 2, + "rank": 51, + "score": 394, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 302, + "vestigeId": 2, + "rank": 52, + "score": 392, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 303, + "vestigeId": 2, + "rank": 53, + "score": 390, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 304, + "vestigeId": 2, + "rank": 54, + "score": 388, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 305, + "vestigeId": 2, + "rank": 55, + "score": 386, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 306, + "vestigeId": 2, + "rank": 56, + "score": 384, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 307, + "vestigeId": 2, + "rank": 57, + "score": 382, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 308, + "vestigeId": 2, + "rank": 58, + "score": 380, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 309, + "vestigeId": 2, + "rank": 59, + "score": 378, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 310, + "vestigeId": 2, + "rank": 60, + "score": 376, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 311, + "vestigeId": 2, + "rank": 61, + "score": 374, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 312, + "vestigeId": 2, + "rank": 62, + "score": 372, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 313, + "vestigeId": 2, + "rank": 63, + "score": 370, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 314, + "vestigeId": 2, + "rank": 64, + "score": 368, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 315, + "vestigeId": 2, + "rank": 65, + "score": 366, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 316, + "vestigeId": 2, + "rank": 66, + "score": 364, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 317, + "vestigeId": 2, + "rank": 67, + "score": 362, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 318, + "vestigeId": 2, + "rank": 68, + "score": 360, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 319, + "vestigeId": 2, + "rank": 69, + "score": 358, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 320, + "vestigeId": 2, + "rank": 70, + "score": 356, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 321, + "vestigeId": 2, + "rank": 71, + "score": 354, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 322, + "vestigeId": 2, + "rank": 72, + "score": 352, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 323, + "vestigeId": 2, + "rank": 73, + "score": 350, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 324, + "vestigeId": 2, + "rank": 74, + "score": 348, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 325, + "vestigeId": 2, + "rank": 75, + "score": 346, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 326, + "vestigeId": 2, + "rank": 76, + "score": 344, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 327, + "vestigeId": 2, + "rank": 77, + "score": 342, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 328, + "vestigeId": 2, + "rank": 78, + "score": 340, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 329, + "vestigeId": 2, + "rank": 79, + "score": 338, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 330, + "vestigeId": 2, + "rank": 80, + "score": 336, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 331, + "vestigeId": 2, + "rank": 81, + "score": 334, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 332, + "vestigeId": 2, + "rank": 82, + "score": 332, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 333, + "vestigeId": 2, + "rank": 83, + "score": 330, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 334, + "vestigeId": 2, + "rank": 84, + "score": 328, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 335, + "vestigeId": 2, + "rank": 85, + "score": 326, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 336, + "vestigeId": 2, + "rank": 86, + "score": 324, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 337, + "vestigeId": 2, + "rank": 87, + "score": 322, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 338, + "vestigeId": 2, + "rank": 88, + "score": 320, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 339, + "vestigeId": 2, + "rank": 89, + "score": 318, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 340, + "vestigeId": 2, + "rank": 90, + "score": 316, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 341, + "vestigeId": 2, + "rank": 91, + "score": 314, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 342, + "vestigeId": 2, + "rank": 92, + "score": 312, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 343, + "vestigeId": 2, + "rank": 93, + "score": 310, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 344, + "vestigeId": 2, + "rank": 94, + "score": 308, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 345, + "vestigeId": 2, + "rank": 95, + "score": 306, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 346, + "vestigeId": 2, + "rank": 96, + "score": 304, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 347, + "vestigeId": 2, + "rank": 97, + "score": 302, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 348, + "vestigeId": 2, + "rank": 98, + "score": 300, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 349, + "vestigeId": 2, + "rank": 99, + "score": 298, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 350, + "vestigeId": 2, + "rank": 100, + "score": 296, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 351, + "vestigeId": 2, + "rank": 101, + "score": 294, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 352, + "vestigeId": 2, + "rank": 102, + "score": 292, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 353, + "vestigeId": 2, + "rank": 103, + "score": 290, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 354, + "vestigeId": 2, + "rank": 104, + "score": 288, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 355, + "vestigeId": 2, + "rank": 105, + "score": 286, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 356, + "vestigeId": 2, + "rank": 106, + "score": 284, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 357, + "vestigeId": 2, + "rank": 107, + "score": 282, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 358, + "vestigeId": 2, + "rank": 108, + "score": 280, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 359, + "vestigeId": 2, + "rank": 109, + "score": 278, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 360, + "vestigeId": 2, + "rank": 110, + "score": 276, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 361, + "vestigeId": 2, + "rank": 111, + "score": 274, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 362, + "vestigeId": 2, + "rank": 112, + "score": 272, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 363, + "vestigeId": 2, + "rank": 113, + "score": 270, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 364, + "vestigeId": 2, + "rank": 114, + "score": 268, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 365, + "vestigeId": 2, + "rank": 115, + "score": 266, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 366, + "vestigeId": 2, + "rank": 116, + "score": 264, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 367, + "vestigeId": 2, + "rank": 117, + "score": 262, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 368, + "vestigeId": 2, + "rank": 118, + "score": 260, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 369, + "vestigeId": 2, + "rank": 119, + "score": 258, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 370, + "vestigeId": 2, + "rank": 120, + "score": 256, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 371, + "vestigeId": 2, + "rank": 121, + "score": 254, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 372, + "vestigeId": 2, + "rank": 122, + "score": 252, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 373, + "vestigeId": 2, + "rank": 123, + "score": 250, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 374, + "vestigeId": 2, + "rank": 124, + "score": 248, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 375, + "vestigeId": 2, + "rank": 125, + "score": 246, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 376, + "vestigeId": 2, + "rank": 126, + "score": 244, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 377, + "vestigeId": 2, + "rank": 127, + "score": 242, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 378, + "vestigeId": 2, + "rank": 128, + "score": 240, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 379, + "vestigeId": 2, + "rank": 129, + "score": 238, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 380, + "vestigeId": 2, + "rank": 130, + "score": 236, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 381, + "vestigeId": 2, + "rank": 131, + "score": 234, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 382, + "vestigeId": 2, + "rank": 132, + "score": 232, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 383, + "vestigeId": 2, + "rank": 133, + "score": 230, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 384, + "vestigeId": 2, + "rank": 134, + "score": 228, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 385, + "vestigeId": 2, + "rank": 135, + "score": 226, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 386, + "vestigeId": 2, + "rank": 136, + "score": 224, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 387, + "vestigeId": 2, + "rank": 137, + "score": 222, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 388, + "vestigeId": 2, + "rank": 138, + "score": 220, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 389, + "vestigeId": 2, + "rank": 139, + "score": 218, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 390, + "vestigeId": 2, + "rank": 140, + "score": 216, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 391, + "vestigeId": 2, + "rank": 141, + "score": 214, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 392, + "vestigeId": 2, + "rank": 142, + "score": 212, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 393, + "vestigeId": 2, + "rank": 143, + "score": 210, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 394, + "vestigeId": 2, + "rank": 144, + "score": 208, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 395, + "vestigeId": 2, + "rank": 145, + "score": 206, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 396, + "vestigeId": 2, + "rank": 146, + "score": 204, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 397, + "vestigeId": 2, + "rank": 147, + "score": 202, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 398, + "vestigeId": 2, + "rank": 148, + "score": 200, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 399, + "vestigeId": 2, + "rank": 149, + "score": 198, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 400, + "vestigeId": 2, + "rank": 150, + "score": 196, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 401, + "vestigeId": 2, + "rank": 151, + "score": 194, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 402, + "vestigeId": 2, + "rank": 152, + "score": 192, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 403, + "vestigeId": 2, + "rank": 153, + "score": 190, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 404, + "vestigeId": 2, + "rank": 154, + "score": 188, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 405, + "vestigeId": 2, + "rank": 155, + "score": 186, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 406, + "vestigeId": 2, + "rank": 156, + "score": 184, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 407, + "vestigeId": 2, + "rank": 157, + "score": 182, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 408, + "vestigeId": 2, + "rank": 158, + "score": 180, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 409, + "vestigeId": 2, + "rank": 159, + "score": 178, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 410, + "vestigeId": 2, + "rank": 160, + "score": 176, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 411, + "vestigeId": 2, + "rank": 161, + "score": 174, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 412, + "vestigeId": 2, + "rank": 162, + "score": 172, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 413, + "vestigeId": 2, + "rank": 163, + "score": 170, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 414, + "vestigeId": 2, + "rank": 164, + "score": 168, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 415, + "vestigeId": 2, + "rank": 165, + "score": 166, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 416, + "vestigeId": 2, + "rank": 166, + "score": 164, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 417, + "vestigeId": 2, + "rank": 167, + "score": 162, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 418, + "vestigeId": 2, + "rank": 168, + "score": 160, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 419, + "vestigeId": 2, + "rank": 169, + "score": 158, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 420, + "vestigeId": 2, + "rank": 170, + "score": 156, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 421, + "vestigeId": 2, + "rank": 171, + "score": 154, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 422, + "vestigeId": 2, + "rank": 172, + "score": 152, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 423, + "vestigeId": 2, + "rank": 173, + "score": 150, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 424, + "vestigeId": 2, + "rank": 174, + "score": 148, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 425, + "vestigeId": 2, + "rank": 175, + "score": 146, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 426, + "vestigeId": 2, + "rank": 176, + "score": 144, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 427, + "vestigeId": 2, + "rank": 177, + "score": 142, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 428, + "vestigeId": 2, + "rank": 178, + "score": 140, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 429, + "vestigeId": 2, + "rank": 179, + "score": 138, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 430, + "vestigeId": 2, + "rank": 180, + "score": 136, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 431, + "vestigeId": 2, + "rank": 181, + "score": 134, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 432, + "vestigeId": 2, + "rank": 182, + "score": 132, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 433, + "vestigeId": 2, + "rank": 183, + "score": 130, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 434, + "vestigeId": 2, + "rank": 184, + "score": 128, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 435, + "vestigeId": 2, + "rank": 185, + "score": 126, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 436, + "vestigeId": 2, + "rank": 186, + "score": 124, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 437, + "vestigeId": 2, + "rank": 187, + "score": 122, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 438, + "vestigeId": 2, + "rank": 188, + "score": 120, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 439, + "vestigeId": 2, + "rank": 189, + "score": 118, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 440, + "vestigeId": 2, + "rank": 190, + "score": 116, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 441, + "vestigeId": 2, + "rank": 191, + "score": 114, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 442, + "vestigeId": 2, + "rank": 192, + "score": 112, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 443, + "vestigeId": 2, + "rank": 193, + "score": 110, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 444, + "vestigeId": 2, + "rank": 194, + "score": 108, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 445, + "vestigeId": 2, + "rank": 195, + "score": 106, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 446, + "vestigeId": 2, + "rank": 196, + "score": 104, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 447, + "vestigeId": 2, + "rank": 197, + "score": 102, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 448, + "vestigeId": 2, + "rank": 198, + "score": 100, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 449, + "vestigeId": 2, + "rank": 199, + "score": 98, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 450, + "vestigeId": 2, + "rank": 200, + "score": 96, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 451, + "vestigeId": 2, + "rank": 201, + "score": 94, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 452, + "vestigeId": 2, + "rank": 202, + "score": 92, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 453, + "vestigeId": 2, + "rank": 203, + "score": 90, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 454, + "vestigeId": 2, + "rank": 204, + "score": 88, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 455, + "vestigeId": 2, + "rank": 205, + "score": 86, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 456, + "vestigeId": 2, + "rank": 206, + "score": 84, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 457, + "vestigeId": 2, + "rank": 207, + "score": 82, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 458, + "vestigeId": 2, + "rank": 208, + "score": 80, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 459, + "vestigeId": 2, + "rank": 209, + "score": 78, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 460, + "vestigeId": 2, + "rank": 210, + "score": 76, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 461, + "vestigeId": 2, + "rank": 211, + "score": 74, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 462, + "vestigeId": 2, + "rank": 212, + "score": 72, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 463, + "vestigeId": 2, + "rank": 213, + "score": 70, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 464, + "vestigeId": 2, + "rank": 214, + "score": 68, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 465, + "vestigeId": 2, + "rank": 215, + "score": 66, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 466, + "vestigeId": 2, + "rank": 216, + "score": 64, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 467, + "vestigeId": 2, + "rank": 217, + "score": 62, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 468, + "vestigeId": 2, + "rank": 218, + "score": 60, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 469, + "vestigeId": 2, + "rank": 219, + "score": 58, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 470, + "vestigeId": 2, + "rank": 220, + "score": 56, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 471, + "vestigeId": 2, + "rank": 221, + "score": 54, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 472, + "vestigeId": 2, + "rank": 222, + "score": 52, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 473, + "vestigeId": 2, + "rank": 223, + "score": 50, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 474, + "vestigeId": 2, + "rank": 224, + "score": 48, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 475, + "vestigeId": 2, + "rank": 225, + "score": 46, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 476, + "vestigeId": 2, + "rank": 226, + "score": 44, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 477, + "vestigeId": 2, + "rank": 227, + "score": 42, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 478, + "vestigeId": 2, + "rank": 228, + "score": 40, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 479, + "vestigeId": 2, + "rank": 229, + "score": 38, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 480, + "vestigeId": 2, + "rank": 230, + "score": 36, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 481, + "vestigeId": 2, + "rank": 231, + "score": 34, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 482, + "vestigeId": 2, + "rank": 232, + "score": 32, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 483, + "vestigeId": 2, + "rank": 233, + "score": 30, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 484, + "vestigeId": 2, + "rank": 234, + "score": 28, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 485, + "vestigeId": 2, + "rank": 235, + "score": 26, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 486, + "vestigeId": 2, + "rank": 236, + "score": 24, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 487, + "vestigeId": 2, + "rank": 237, + "score": 22, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 488, + "vestigeId": 2, + "rank": 238, + "score": 20, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 489, + "vestigeId": 2, + "rank": 239, + "score": 18, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 490, + "vestigeId": 2, + "rank": 240, + "score": 16, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 491, + "vestigeId": 2, + "rank": 241, + "score": 14, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 492, + "vestigeId": 2, + "rank": 242, + "score": 12, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 493, + "vestigeId": 2, + "rank": 243, + "score": 10, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 494, + "vestigeId": 2, + "rank": 244, + "score": 9, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 495, + "vestigeId": 2, + "rank": 245, + "score": 8, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 496, + "vestigeId": 2, + "rank": 246, + "score": 7, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 497, + "vestigeId": 2, + "rank": 247, + "score": 6, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 498, + "vestigeId": 2, + "rank": 248, + "score": 5, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 499, + "vestigeId": 2, + "rank": 249, + "score": 4, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + }, + { + "id": 500, + "vestigeId": 2, + "rank": 250, + "score": 2, + "spine": 0, + "head": 0, + "ce": 0, + "onceReward": 0, + "onceLeagueReward": "12&50", + "warId": 0, + "battleReward": "31002&100", + "battleLeagueReward": "12&100" + } +] \ No newline at end of file diff --git a/shared/resource/jsons/dic_zyz_GVGVestigeLeagueRank.json b/shared/resource/jsons/dic_zyz_GVGVestigeLeagueRank.json new file mode 100644 index 000000000..e1d9c9f63 --- /dev/null +++ b/shared/resource/jsons/dic_zyz_GVGVestigeLeagueRank.json @@ -0,0 +1,72 @@ +[ + { + "id": 1, + "rankMin": 1, + "rankMax": 2, + "rankReward": "31002&800", + "rankLeagueReward": "12&800" + }, + { + "id": 2, + "rankMin": 2, + "rankMax": 3, + "rankReward": "31002&700", + "rankLeagueReward": "12&700" + }, + { + "id": 3, + "rankMin": 3, + "rankMax": 5, + "rankReward": "31002&600", + "rankLeagueReward": "12&600" + }, + { + "id": 4, + "rankMin": 5, + "rankMax": 10, + "rankReward": "31002&500", + "rankLeagueReward": "12&500" + }, + { + "id": 5, + "rankMin": 10, + "rankMax": 50, + "rankReward": "31002&400", + "rankLeagueReward": "12&400" + }, + { + "id": 6, + "rankMin": 50, + "rankMax": 60, + "rankReward": "31002&300", + "rankLeagueReward": "12&300" + }, + { + "id": 7, + "rankMin": 60, + "rankMax": 70, + "rankReward": "31002&200", + "rankLeagueReward": "12&200" + }, + { + "id": 8, + "rankMin": 70, + "rankMax": 80, + "rankReward": "31002&150", + "rankLeagueReward": "12&150" + }, + { + "id": 9, + "rankMin": 80, + "rankMax": 100, + "rankReward": "31002&100", + "rankLeagueReward": "12&100" + }, + { + "id": 10, + "rankMin": 100, + "rankMax": 0, + "rankReward": "31002&50", + "rankLeagueReward": "12&50" + } +] \ No newline at end of file diff --git a/shared/resource/jsons/dic_zyz_GVGVestigeRange.json b/shared/resource/jsons/dic_zyz_GVGVestigeRange.json new file mode 100644 index 000000000..0f117c615 --- /dev/null +++ b/shared/resource/jsons/dic_zyz_GVGVestigeRange.json @@ -0,0 +1,67 @@ +[ + { + "id": 1, + "rankMin": 0, + "rankMax": 10, + "rangeBeforeFrom": 0, + "rangeBeforeTo": 0, + "rangeBeforeNum": 0, + "rangeAfterFrom": 0, + "rangeAfterTo": 0, + "rangeAfterNum": 0, + "topChallengeFrom": 1, + "topChallengeTo": 10 + }, + { + "id": 2, + "rankMin": 10, + "rankMax": 50, + "rangeBeforeFrom": 10, + "rangeBeforeTo": -1, + "rangeBeforeNum": 20, + "rangeAfterFrom": 0, + "rangeAfterTo": 0, + "rangeAfterNum": 0, + "topChallengeFrom": 1, + "topChallengeTo": 10 + }, + { + "id": 3, + "rankMin": 50, + "rankMax": 150, + "rangeBeforeFrom": 5, + "rangeBeforeTo": 50, + "rangeBeforeNum": 20, + "rangeAfterFrom": 50, + "rangeAfterTo": -1, + "rangeAfterNum": 5, + "topChallengeFrom": 1, + "topChallengeTo": 5 + }, + { + "id": 4, + "rankMin": 150, + "rankMax": 250, + "rangeBeforeFrom": 50, + "rangeBeforeTo": 150, + "rangeBeforeNum": 25, + "rangeAfterFrom": 150, + "rangeAfterTo": -1, + "rangeAfterNum": 5, + "topChallengeFrom": 0, + "topChallengeTo": 0 + }, + { + "id": 5, + "rankMin": 250, + "rankMax": -1, + "rangeBeforeFrom": 150, + "rangeBeforeTo": 250, + "rangeBeforeNum": 30, + "rangeAfterFrom": 0, + "rangeAfterTo": 0, + "rangeAfterNum": 0, + "topChallengeFrom": 0, + "topChallengeTo": 0 + } +] \ No newline at end of file diff --git a/shared/resource/jsons/dic_zyz_GVGVestigeType.json b/shared/resource/jsons/dic_zyz_GVGVestigeType.json new file mode 100644 index 000000000..562e3da4a --- /dev/null +++ b/shared/resource/jsons/dic_zyz_GVGVestigeType.json @@ -0,0 +1,123 @@ +[ + { + "id": 1, + "vestigeId": 1, + "name": "齐都遗址", + "mapType": "1&2", + "imageName": "&", + "additionType": 1, + "additionValue": "2&1000", + "content": "枪兵", + "position": "&" + }, + { + "id": 2, + "vestigeId": 2, + "name": "楚都遗址", + "mapType": "1&2", + "imageName": "&", + "additionType": 1, + "additionValue": "6&1000", + "content": "策士", + "position": "&" + }, + { + "id": 3, + "vestigeId": 3, + "name": "燕都遗址", + "mapType": "1&2", + "imageName": "&", + "additionType": 1, + "additionValue": "5&1000", + "content": "游侠", + "position": "&" + }, + { + "id": 4, + "vestigeId": 4, + "name": "韩都遗址", + "mapType": "1&2", + "imageName": "&", + "additionType": 1, + "additionValue": "4&1000", + "content": "弓兵", + "position": "&" + }, + { + "id": 5, + "vestigeId": 5, + "name": "赵都遗址", + "mapType": "1&2", + "imageName": "&", + "additionType": 1, + "additionValue": "3&1000", + "content": "骑兵", + "position": "&" + }, + { + "id": 6, + "vestigeId": 6, + "name": "魏都遗址", + "mapType": "1&2", + "imageName": "&", + "additionType": 1, + "additionValue": "1&1000", + "content": "步兵", + "position": "&" + }, + { + "id": 7, + "vestigeId": 7, + "name": "山巅帝陵", + "mapType": "1&2", + "imageName": "&", + "additionType": 2, + "additionValue": "1&1000", + "content": "魏国", + "position": "&" + }, + { + "id": 8, + "vestigeId": 8, + "name": "崖底河泽", + "mapType": "1&2", + "imageName": "&", + "additionType": 2, + "additionValue": "2&1000", + "content": "吴国", + "position": "&" + }, + { + "id": 9, + "vestigeId": 9, + "name": "深山迷林", + "mapType": "1&2", + "imageName": "&", + "additionType": 2, + "additionValue": "3&1000", + "content": "蜀国", + "position": "&" + }, + { + "id": 10, + "vestigeId": 10, + "name": "桃源古村", + "mapType": "1&2", + "imageName": "&", + "additionType": 2, + "additionValue": "4&1000", + "content": "群雄", + "position": "&" + }, + { + "id": 11, + "vestigeId": 11, + "name": "鹿鸣幽谷", + "mapType": "1&2", + "imageName": "&", + "additionType": 3, + "additionValue": "2&1000", + "content": "女性", + "position": "&" + } +] \ No newline at end of file diff --git a/shared/resource/jsons/server_const.json b/shared/resource/jsons/server_const.json index e9d1ce6c6..8a7d9bb03 100644 --- a/shared/resource/jsons/server_const.json +++ b/shared/resource/jsons/server_const.json @@ -33,6 +33,6 @@ "DEBUG_TIME": 1, "CHECK_WORD": 1, "CAN_PAY": 1, - "SKIP_ENCODE": 0, + "SKIP_ENCODE": 1, "NEED_REBATE": 0 } \ No newline at end of file