娱乐模式增加返回物品数据
This commit is contained in:
parent
8037fe5856
commit
5588223572
0
src/constants/GameMode.ts
Normal file
0
src/constants/GameMode.ts
Normal file
@ -12,6 +12,7 @@ import { BagItem } from '../models/BagItem'
|
|||||||
import { setGameEnd, updateRank } from '../service/rank'
|
import { setGameEnd, updateRank } from '../service/rank'
|
||||||
import { ZError } from '../common/ZError'
|
import { ZError } from '../common/ZError'
|
||||||
import { ActRecord } from '../models/ActRecord'
|
import { ActRecord } from '../models/ActRecord'
|
||||||
|
import { parsePlayerMatchDate } from '../dao/RecordDao'
|
||||||
|
|
||||||
export default class RecordController extends BaseController {
|
export default class RecordController extends BaseController {
|
||||||
@role('anon')
|
@role('anon')
|
||||||
@ -31,120 +32,32 @@ export default class RecordController extends BaseController {
|
|||||||
async upload(req: any) {
|
async upload(req: any) {
|
||||||
let record = new GameRecord(req.params)
|
let record = new GameRecord(req.params)
|
||||||
await record.save()
|
await record.save()
|
||||||
if (!record.matchid) {
|
if (record.mode == 2) {
|
||||||
return {}
|
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) {
|
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 seasonData: any = {}
|
||||||
let itemData: any = {}
|
let itemData: any = {}
|
||||||
for (let player of record.players) {
|
for (let player of record.players) {
|
||||||
if (player.accountid.startsWith('robot')) {
|
let user = await User.findById(player.accountid).exec()
|
||||||
continue
|
|
||||||
}
|
|
||||||
let user = await User.findById(player.accountid)
|
|
||||||
if (!user) {
|
if (!user) {
|
||||||
error(`save game record, account not found: ${ player.accountid }`)
|
error(`save game record, account not found: ${ player.accountid }`)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
await setGameEnd(player.accountid)
|
await setGameEnd(player.accountid)
|
||||||
if (!player.escape) {
|
await parsePlayerMatchDate(player, user, record.winner)
|
||||||
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 user.save()
|
await user.save()
|
||||||
seasonData[player.playerid] = user.season_data
|
seasonData[player.playerid] = user.season_data
|
||||||
/**
|
/**
|
||||||
* 获取胜利失败的物品
|
* 获取胜利失败的物品
|
||||||
*/
|
*/
|
||||||
let items: ItemInfo[] = []
|
let items: ItemInfo[] = []
|
||||||
|
let subType = record.winner == player.team ? 'win' : 'loss'
|
||||||
if (cfg && !player.escape) {
|
if (cfg && !player.escape) {
|
||||||
if (record.winner == player.team && cfg.winget) {
|
if (record.winner == player.team && cfg.winget) {
|
||||||
items = ItemCtrl.getItemsByInfo(cfg.winget);
|
items = ItemCtrl.getItemsByInfo(cfg.winget);
|
||||||
|
95
src/dao/RecordDao.ts
Normal file
95
src/dao/RecordDao.ts
Normal 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 处理比赛统计信息
|
||||||
|
*/
|
||||||
|
}
|
@ -13,7 +13,7 @@ interface GameRecordClass extends TimeStamps {
|
|||||||
@modelOptions({
|
@modelOptions({
|
||||||
options: {allowMixed: Severity.ALLOW}
|
options: {allowMixed: Severity.ALLOW}
|
||||||
})
|
})
|
||||||
class GamePlayer {
|
export class GamePlayer {
|
||||||
@prop()
|
@prop()
|
||||||
public playerid: string;
|
public playerid: string;
|
||||||
@prop()
|
@prop()
|
||||||
|
@ -43,7 +43,7 @@ interface AccountClass extends Base<string>, TimeStamps {
|
|||||||
{ collection: 'account', timestamps: true },
|
{ collection: 'account', timestamps: true },
|
||||||
options: { allowMixed: Severity.ALLOW }
|
options: { allowMixed: Severity.ALLOW }
|
||||||
})
|
})
|
||||||
class UserClass extends FindOrCreate {
|
export class UserClass extends FindOrCreate {
|
||||||
@prop()
|
@prop()
|
||||||
public _id: string
|
public _id: string
|
||||||
@prop()
|
@prop()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user