From 5588223572123b3cb562f886d0342e07160eebd3 Mon Sep 17 00:00:00 2001 From: zhl Date: Tue, 23 Mar 2021 17:39:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A8=B1=E4=B9=90=E6=A8=A1=E5=BC=8F=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E8=BF=94=E5=9B=9E=E7=89=A9=E5=93=81=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/constants/GameMode.ts | 0 src/controllers/RecordController.ts | 105 +++------------------------- src/dao/RecordDao.ts | 95 +++++++++++++++++++++++++ src/models/GameRecord.ts | 2 +- src/models/User.ts | 2 +- 5 files changed, 106 insertions(+), 98 deletions(-) create mode 100644 src/constants/GameMode.ts create mode 100644 src/dao/RecordDao.ts diff --git a/src/constants/GameMode.ts b/src/constants/GameMode.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/controllers/RecordController.ts b/src/controllers/RecordController.ts index 1eeb78c..2b6c3a4 100644 --- a/src/controllers/RecordController.ts +++ b/src/controllers/RecordController.ts @@ -12,6 +12,7 @@ import { BagItem } from '../models/BagItem' import { setGameEnd, updateRank } from '../service/rank' import { ZError } from '../common/ZError' import { ActRecord } from '../models/ActRecord' +import { parsePlayerMatchDate } from '../dao/RecordDao' export default class RecordController extends BaseController { @role('anon') @@ -31,120 +32,32 @@ export default class RecordController extends BaseController { async upload(req: any) { let record = new GameRecord(req.params) await record.save() - if (!record.matchid) { + if (record.mode == 2) { return {} } - let cfg: MatchCfg = global.$cfg.get(BaseConst.MATCH).get(parseInt(record.matchid)) + let matchid: number = record.mode == 1 ? (parseInt(record.matchid) || 100001) : 100002 + let cfg: MatchCfg = global.$cfg.get(BaseConst.MATCH).get(matchid) if (!cfg) { - error(`match cfg not found: ${record.matchid}`) + error(`match cfg not found: ${matchid}`) } - const fc = global.$cfg.get(BaseConst.FORMULA) - const scores = [ - fc.get(70043).number, - fc.get(70046).number, - fc.get(70044).number, - fc.get(70045).number, - fc.get(70047).number, - fc.get(70048).number - ] + let seasonData: any = {} let itemData: any = {} for (let player of record.players) { - if (player.accountid.startsWith('robot')) { - continue - } - let user = await User.findById(player.accountid) + let user = await User.findById(player.accountid).exec() if (!user) { error(`save game record, account not found: ${ player.accountid }`) continue } await setGameEnd(player.accountid) - if (!player.escape) { - user.season_score = Math.max((user.season_score + player.scoreChange) | 0, fc.get(70002).number) - await updateRank(user._id, user.season_score) - } - - if (!user.season_data) { - user.season_data = new Map() - } - /** - * begin of 将赛季排位记录放入season_records, 方便计算10胜 - */ - if (!player.escape) { - let data = new RecordInfo() - data.time = Date.now() - if (player.team == record.winner) { - data.status = 2 - } else if (record.winner == -1) { - data.status = 1 - } else { - data.status = 0 - } - user.season_records.push(data) - - let records = user.season_records - while (records.length > 10) { - records.pop() - } - let smallTime = timeBeforeDay(30) - for (let r of records) { - if (r.time < smallTime) { - records.removeEx(r) - } - } - } - - /** - * end of 将赛季排位记录放入season_records, 方便计算10胜 - */ - /** - * begin of 处理比赛统计信息 - */ - let subType = '' - - if (!player.escape) { - if (record.winner == player.team) { - user.season_data.inc('win', 1) - subType += 'win' - } else { - user.season_data.inc('loss', 1) - subType += 'loss' - } - let statData = player.statdata - let honorp = 0 - for (let key in statData) { - let numKey = +key - - if (numKey >= scores.length) { - continue - } - // @ts-ignore - let val = Number(statData[key]) - honorp += val * scores[numKey] - if (numKey == 4 || numKey == 5) { - user.season_data.inc(key + '_total', val) - } else { - user.season_data.inc(key + '_total', val * scores[numKey]) - } - - if (user.season_data.has(key + '')) { - user.season_data.set(key + '', Math.max(user.season_data.get(key + ''), val)) - } else { - user.season_data.set(key + '', val) - } - } - user.season_data.inc('honor_ap', honorp) - user.season_data.inc('mvp_ap', player.mvpscore) - } - /** - * end of 处理比赛统计信息 - */ + await parsePlayerMatchDate(player, user, record.winner) await user.save() seasonData[player.playerid] = user.season_data /** * 获取胜利失败的物品 */ let items: ItemInfo[] = [] + let subType = record.winner == player.team ? 'win' : 'loss' if (cfg && !player.escape) { if (record.winner == player.team && cfg.winget) { items = ItemCtrl.getItemsByInfo(cfg.winget); diff --git a/src/dao/RecordDao.ts b/src/dao/RecordDao.ts new file mode 100644 index 0000000..31cdde9 --- /dev/null +++ b/src/dao/RecordDao.ts @@ -0,0 +1,95 @@ +import { BaseConst } from '../constants/BaseConst' +import { updateRank } from '../service/rank' +import { RecordInfo } from '../models/User' +import { timeBeforeDay } from '../utils/time.util' +import { GamePlayer } from '../models/GameRecord' + + +export async function parsePlayerMatchDate(player: GamePlayer, user: any, winner: number) { + const fc = global.$cfg.get(BaseConst.FORMULA) + const scores = [ + fc.get(70043).number, + fc.get(70046).number, + fc.get(70044).number, + fc.get(70045).number, + fc.get(70047).number, + fc.get(70048).number + ] + if (!player.escape) { + user.season_score = Math.max((user.season_score + player.scoreChange) | 0, fc.get(70002).number) + await updateRank(user._id, user.season_score) + } + + if (!user.season_data) { + user.season_data = new Map() + } + /** + * begin of 将赛季排位记录放入season_records, 方便计算10胜 + */ + if (!player.escape) { + let data = new RecordInfo() + data.time = Date.now() + if (player.team == winner) { + data.status = 2 + } else if (winner == -1) { + data.status = 1 + } else { + data.status = 0 + } + user.season_records.push(data) + + let records = user.season_records + while (records.length > 10) { + records.pop() + } + let smallTime = timeBeforeDay(30) + for (let r of records) { + if (r.time < smallTime) { + records.removeEx(r) + } + } + } + + /** + * end of 将赛季排位记录放入season_records, 方便计算10胜 + */ + + /** + * begin of 处理比赛统计信息 + */ + if (!player.escape) { + if (winner == player.team) { + user.season_data.inc('win', 1) + } else { + user.season_data.inc('loss', 1) + } + let statData = player.statdata + let honorp = 0 + for (let key in statData) { + let numKey = +key + + if (numKey >= scores.length) { + continue + } + // @ts-ignore + let val = Number(statData[key]) + honorp += val * scores[numKey] + if (numKey == 4 || numKey == 5) { + user.season_data.inc(key + '_total', val) + } else { + user.season_data.inc(key + '_total', val * scores[numKey]) + } + + if (user.season_data.has(key + '')) { + user.season_data.set(key + '', Math.max(user.season_data.get(key + ''), val)) + } else { + user.season_data.set(key + '', val) + } + } + user.season_data.inc('honor_ap', honorp) + user.season_data.inc('mvp_ap', player.mvpscore) + } + /** + * end of 处理比赛统计信息 + */ +} diff --git a/src/models/GameRecord.ts b/src/models/GameRecord.ts index 75159cd..0fc22e5 100644 --- a/src/models/GameRecord.ts +++ b/src/models/GameRecord.ts @@ -13,7 +13,7 @@ interface GameRecordClass extends TimeStamps { @modelOptions({ options: {allowMixed: Severity.ALLOW} }) -class GamePlayer { +export class GamePlayer { @prop() public playerid: string; @prop() diff --git a/src/models/User.ts b/src/models/User.ts index efd585e..db9d778 100644 --- a/src/models/User.ts +++ b/src/models/User.ts @@ -43,7 +43,7 @@ interface AccountClass extends Base, TimeStamps { { collection: 'account', timestamps: true }, options: { allowMixed: Severity.ALLOW } }) -class UserClass extends FindOrCreate { +export class UserClass extends FindOrCreate { @prop() public _id: string @prop()