娱乐模式增加返回物品数据

This commit is contained in:
zhl 2021-03-23 17:39:22 +08:00
parent 8037fe5856
commit 5588223572
5 changed files with 106 additions and 98 deletions

View File

View File

@ -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);

95
src/dao/RecordDao.ts Normal file
View File

@ -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
*/
}

View File

@ -13,7 +13,7 @@ interface GameRecordClass extends TimeStamps {
@modelOptions({
options: {allowMixed: Severity.ALLOW}
})
class GamePlayer {
export class GamePlayer {
@prop()
public playerid: string;
@prop()

View File

@ -43,7 +43,7 @@ interface AccountClass extends Base<string>, TimeStamps {
{ collection: 'account', timestamps: true },
options: { allowMixed: Severity.ALLOW }
})
class UserClass extends FindOrCreate {
export class UserClass extends FindOrCreate {
@prop()
public _id: string
@prop()