pvp随机地图
This commit is contained in:
+10
-1
@@ -14,7 +14,7 @@ import * as routeUtil from './app/util/routeUtil';
|
|||||||
import { preload } from './preload';
|
import { preload } from './preload';
|
||||||
var checkEventFilter = require('./app/servers/battle/filter/checkEventFilter');
|
var checkEventFilter = require('./app/servers/battle/filter/checkEventFilter');
|
||||||
import { connectRedis } from './config/redis';
|
import { connectRedis } from './config/redis';
|
||||||
|
import * as timeTaskService from './app/services/timeTaskService';
|
||||||
// TODO 需要整理。
|
// TODO 需要整理。
|
||||||
import _pinus = require('pinus');
|
import _pinus = require('pinus');
|
||||||
|
|
||||||
@@ -102,6 +102,15 @@ app.configure('production|development|alpha|dev', 'gate', function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
app.configure('production|development|alpha|dev', 'systimer', function () {
|
||||||
|
app.set('connectorConfig',
|
||||||
|
{
|
||||||
|
connector: pinus.connectors.hybridconnector,
|
||||||
|
useProtobuf: true
|
||||||
|
});
|
||||||
|
timeTaskService.init();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
function errorHandler(err: Error, msg: any, resp: any,
|
function errorHandler(err: Error, msg: any, resp: any,
|
||||||
session: FrontendOrBackendSession, cb: HandlerCallback) {
|
session: FrontendOrBackendSession, cb: HandlerCallback) {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import {Application, BackendSession} from 'pinus';
|
import {Application, BackendSession} from 'pinus';
|
||||||
const _ = require('underscore');
|
const _ = require('underscore');
|
||||||
import { gameData } from '../../../pubUtils/data';
|
import { gameData } from '../../../pubUtils/data';
|
||||||
import { checkPvp, initPvpInfo, refreshEnemies, getEnemies } from '../../../pubUtils/pvpUtil';
|
import { checkPvp, initPvpInfo, refreshEnemies, getEnemies, } from '../../../services/pvpService';
|
||||||
import { RoleModel, RoleType } from '../../../db/Role';
|
import { RoleModel, RoleType } from '../../../db/Role';
|
||||||
import { STATUS } from '../../../consts/statusCode';
|
import { STATUS } from '../../../consts/statusCode';
|
||||||
import { resResult } from '../../../pubUtils/util';
|
import { resResult } from '../../../pubUtils/util';
|
||||||
@@ -25,13 +25,15 @@ export class PvpHandler {
|
|||||||
|
|
||||||
async getData (msg: {}, session: BackendSession) {
|
async getData (msg: {}, session: BackendSession) {
|
||||||
let roleId = session.get('roleId');
|
let roleId = session.get('roleId');
|
||||||
let roleName = session.get('roleName');
|
let {heroes, score, pLv, winStreakNum, oppPlayers: oppPlayerInfos, refOppCnt, challengeCnt, challengeRefTime, receivedBox, hisScore, heroScores, seasonNum: playerSeaSonNum} = await PvpDefenseModel.findByRoleIdIncludeAll(roleId);
|
||||||
let sid = session.get('sid');
|
let oppPlayers = getEnemies(oppPlayerInfos, winStreakNum);
|
||||||
let serverId = session.get('serverId');
|
let {warId, seasonNum, seasonEndTime} = await SystemConfigModel.findSystemConfig();
|
||||||
let result = await PvpDefenseModel.findByRoleIdIncludeAll(roleId);
|
if (playerSeaSonNum !== seasonNum) {
|
||||||
let system = await SystemConfigModel.findSystemConfig();
|
//TODO去结算
|
||||||
|
}
|
||||||
return resResult(STATUS.SUCCESS, { data: result });
|
let myRank = 999;//TODO去redis中获取
|
||||||
|
let data = {warId, seasonNum, seasonEndTime, myRank, oppPlayers, heroes, score, pLv, winStreakNum, refOppCnt, challengeCnt, challengeRefTime, receivedBox, hisScore, heroScores}
|
||||||
|
return resResult(STATUS.SUCCESS, { data: data });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
* 体力系统
|
* 体力系统
|
||||||
*/
|
*/
|
||||||
import { fromCallback } from 'bluebird';
|
import { fromCallback } from 'bluebird';
|
||||||
import { checkPvp } from '../pubUtils/pvpUtil'
|
import { checkPvp } from '../services/pvpService'
|
||||||
import { getFuncsSwitch } from '../pubUtils/data';
|
import { getFuncsSwitch } from '../pubUtils/data';
|
||||||
import { FUNCS_ID, FUNC_OPT_TYPE } from '../consts/constModules/sysConst';
|
import { FUNCS_ID, FUNC_OPT_TYPE } from '../consts/constModules/sysConst';
|
||||||
import { RoleModel } from '../db/Role'
|
import { RoleModel } from '../db/Role'
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
/**
|
/**
|
||||||
* 体力系统
|
* 体力系统
|
||||||
*/
|
*/
|
||||||
import { PvpDefenseModel, Heroes, OppPlayers, Robot, PvpDefenseType } from '../db/pvpDefense';
|
import { PvpDefenseModel, Heroes, OppPlayers, Robot, PvpDefenseType } from '../../../shared/db/pvpDefense';
|
||||||
import { RoleType } from '../db/Role';
|
import { RoleType } from '../../../shared/db/Role';
|
||||||
import { PVP_PLAYER_POS, PVP_HERO_POS, ROBOT_NAME } from '../consts';
|
import { PVP_HERO_POS, ROBOT_NAME } from '../../../shared/consts';
|
||||||
|
|
||||||
import { dicPvpOpponent, DicPvpOpponent } from "../pubUtils/dictionary/DicPvpOpponent";
|
import { dicPvpOpponent, DicPvpOpponent } from "../../../shared/pubUtils/dictionary/DicPvpOpponent";
|
||||||
import { getRandomIndexByLen, genCode, getRandomByLen } from '../pubUtils/util';
|
import { getRandomIndexByLen, genCode, getRandomByLen } from '../../../shared/pubUtils/util';
|
||||||
import { oppPlayersInter } from '../pubUtils/interface';
|
import { oppPlayersInter } from '../../../shared/pubUtils/interface';
|
||||||
import { gameData } from "../pubUtils/data";
|
import { gameData } from "../../../shared/pubUtils/data";
|
||||||
|
|
||||||
|
|
||||||
export async function initPvpInfo(role: RoleType) {
|
export async function initPvpInfo(role: RoleType) {
|
||||||
@@ -26,9 +26,8 @@ export async function initPvpInfo(role: RoleType) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//初始化对手人阵容TODO
|
//初始化对手人阵容
|
||||||
let oppPlayers: Array<OppPlayers> = await refreshEnemies(role, 0, 1);
|
let oppPlayers: Array<OppPlayers> = await refreshEnemies(role, 0, 1);
|
||||||
|
|
||||||
let result = await PvpDefenseModel.createPvpDefense({ roleId: role.roleId, roleName: role.roleName, role: role._id, heroes, oppPlayers, defCe: role.topFiveCe });
|
let result = await PvpDefenseModel.createPvpDefense({ roleId: role.roleId, roleName: role.roleName, role: role._id, heroes, oppPlayers, defCe: role.topFiveCe });
|
||||||
//加入排行榜 TODO
|
//加入排行榜 TODO
|
||||||
return result;
|
return result;
|
||||||
@@ -2,12 +2,70 @@
|
|||||||
* 体力系统
|
* 体力系统
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { scheduleJob, cancelJob } from 'pinus-scheduler';
|
import { scheduleJob } from 'pinus-scheduler';
|
||||||
|
import { SystemConfigModel } from '../db/SystemConfig';
|
||||||
|
import PvpDefenseType,{ PvpDefenseModel } from '../db/pvpDefense';
|
||||||
|
import { PVP } from '../pubUtils/dicParam';
|
||||||
|
import { nowSeconds, getTodayZeroPoint } from '../pubUtils/timeUtil';
|
||||||
|
import { getPvpGkWarIds } from '../pubUtils/data';
|
||||||
|
import { getRandomArr } from '../pubUtils/util';
|
||||||
|
const _ = require('underscore');
|
||||||
|
const PER_SECOND = 1 * 1000;
|
||||||
|
const PER_DAY = 24 * 60 * 60;
|
||||||
|
const SETTLE_DIFF = 29 * 60;
|
||||||
|
const LIMIT_NUM = 1000;
|
||||||
export async function init() {
|
export async function init() {
|
||||||
scheduleJob("0 31 23 * * *", setPvpSeasonResult, {name:'setPvpSeasonResult'})
|
let seasonEndTime = 0;
|
||||||
|
let systemConfig = await SystemConfigModel.findSystemConfig();
|
||||||
|
if (!systemConfig) {
|
||||||
|
let warIds = getPvpGkWarIds();
|
||||||
|
let warId = warIds[0];//TODO随机地图
|
||||||
|
seasonEndTime = PVP.PVP_SEASON_DAYS * PER_DAY + getTodayZeroPoint();
|
||||||
|
await SystemConfigModel.createSystemConfig( seasonEndTime, warId );
|
||||||
|
} else {
|
||||||
|
seasonEndTime = systemConfig.seasonEndTime;
|
||||||
|
if (systemConfig.seasonEndTime - SETTLE_DIFF <= nowSeconds()) {
|
||||||
|
await setPvpSeasonResult();
|
||||||
|
seasonEndTime = PVP.PVP_SEASON_DAYS * PER_DAY + getTodayZeroPoint();
|
||||||
|
systemConfig.seasonNum++;
|
||||||
|
await SystemConfigModel.updateSystemConfig({ seasonEndTime, seasonNum: systemConfig.seasonNum});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let settleTime = seasonEndTime - SETTLE_DIFF - nowSeconds();
|
||||||
|
// setTimeout(setPvpSeasonResult, settleTime * PER_SECOND);
|
||||||
|
scheduleJob("0 0 0 * * 1", resetPvpWarId)
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function setPvpSeasonResult() {
|
export async function setPvpSeasonResult() {
|
||||||
|
console.log('setPvpSeasonResult');
|
||||||
|
let pvpDefenses = await PvpDefenseModel.getPvpDef(LIMIT_NUM);
|
||||||
|
for (let pvpDefense of pvpDefenses) {
|
||||||
|
await setPvpDefResult(pvpDefense);
|
||||||
|
}
|
||||||
|
await setNextPvpTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
async function setPvpDefResult(pvpDefense: PvpDefenseType) {
|
||||||
|
await PvpDefenseModel.updateInfo(pvpDefense.roleId, {score:100, pLv: 1});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function resetPvpWarId() {
|
||||||
|
console.log('resetPvpWarId');
|
||||||
|
let systemConfig = await SystemConfigModel.findSystemConfig();
|
||||||
|
let warIds = getPvpGkWarIds();
|
||||||
|
let index = _.indexOf(warIds, systemConfig.warId);
|
||||||
|
if (index != -1) {
|
||||||
|
warIds.splice(index, 1);
|
||||||
|
}
|
||||||
|
let res = getRandomArr(warIds, 1);
|
||||||
|
let warId = res[0];//TODO随机地图
|
||||||
|
await SystemConfigModel.updateSystemConfig({ warId });
|
||||||
|
}
|
||||||
|
|
||||||
|
async function setNextPvpTime() {
|
||||||
|
let seasonEndTime = PVP.PVP_SEASON_DAYS * PER_DAY + getTodayZeroPoint();
|
||||||
|
await SystemConfigModel.updateSeason(seasonEndTime);
|
||||||
|
let settleTime = seasonEndTime - SETTLE_DIFF - nowSeconds();
|
||||||
|
setTimeout(setPvpSeasonResult, settleTime * PER_SECOND);
|
||||||
|
}
|
||||||
|
|||||||
@@ -19,5 +19,4 @@ module.exports = [{
|
|||||||
}, {
|
}, {
|
||||||
'type': 'systimer',
|
'type': 'systimer',
|
||||||
'token': 'agarxhqb98rpajloaxn34ga8xrunpagkjwlaw3ruxnpaagl29w4rxn'
|
'token': 'agarxhqb98rpajloaxn34ga8xrunpagkjwlaw3ruxnpaagl29w4rxn'
|
||||||
}
|
}];
|
||||||
];
|
|
||||||
@@ -1,3 +1,98 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
|
'onChat': {
|
||||||
|
'required string msg': 1,
|
||||||
|
'required string from': 2,
|
||||||
|
'required string target': 3
|
||||||
|
},
|
||||||
|
'onItemUpdate': {
|
||||||
|
'message Data': {
|
||||||
|
"message Good": {
|
||||||
|
'required uInt32 id': 1,
|
||||||
|
'required uInt32 count': 2,
|
||||||
|
},
|
||||||
|
'repeated Good goods': 1,
|
||||||
|
},
|
||||||
|
'required string msg': 1,
|
||||||
|
'required uInt32 code': 2,
|
||||||
|
'required Data data': 3
|
||||||
|
},
|
||||||
|
'onPlayerCeUpdate': {
|
||||||
|
'message Data': {
|
||||||
|
"message Hero": {
|
||||||
|
'required uInt32 hid': 1,
|
||||||
|
'required uInt32 ce': 2,
|
||||||
|
},
|
||||||
|
'required uInt32 ce': 1,
|
||||||
|
'repeated Hero heros': 2,
|
||||||
|
'required uInt32 topFiveCe': 3
|
||||||
|
},
|
||||||
|
'required string msg': 1,
|
||||||
|
'required uInt32 code': 2,
|
||||||
|
'required Data data': 3
|
||||||
|
},
|
||||||
|
'onPlayerDataChange': {
|
||||||
|
'message Data': {
|
||||||
|
'optional uInt32 coin': 1,
|
||||||
|
'optional uInt32 giftGold': 2,
|
||||||
|
'optional uInt32 gold': 3,
|
||||||
|
'optional uInt32 ap': 4
|
||||||
|
},
|
||||||
|
'required string msg': 1,
|
||||||
|
'required uInt32 code': 2,
|
||||||
|
'required Data data': 3
|
||||||
|
},
|
||||||
|
'onHeroSkinChange': {
|
||||||
|
'message Data': {
|
||||||
|
"message SkinInfo": {
|
||||||
|
"message Skin": {
|
||||||
|
'required uInt32 id': 1,
|
||||||
|
'required boolean enable': 2
|
||||||
|
},
|
||||||
|
'repeated Skin skins': 1,
|
||||||
|
},
|
||||||
|
'repeated SkinInfo skinInfos': 1
|
||||||
|
},
|
||||||
|
'required string msg': 1,
|
||||||
|
'required uInt32 code': 2,
|
||||||
|
'required Data data': 3
|
||||||
|
},
|
||||||
|
'onEquipAdd': {
|
||||||
|
'message Data': {
|
||||||
|
"message EquipInfo": {
|
||||||
|
"message RandSe": {
|
||||||
|
'required uInt32 id': 1,
|
||||||
|
'required uInt32 seid': 2,
|
||||||
|
'required int32 rand': 3,
|
||||||
|
'required boolean locked': 4
|
||||||
|
},
|
||||||
|
"message Hole": {
|
||||||
|
'required uInt32 id': 1,
|
||||||
|
'required boolean isOpen': 2,
|
||||||
|
'required uInt32 jewel': 3
|
||||||
|
},
|
||||||
|
'repeated Hole holes': 1,
|
||||||
|
'repeated RandSe randSe': 2,
|
||||||
|
'required uInt32 seqId': 3,
|
||||||
|
'required uInt32 id': 4,
|
||||||
|
'required uInt32 hid': 6,
|
||||||
|
'required uInt32 count': 7,
|
||||||
|
'required uInt32 quality': 8,
|
||||||
|
'required uInt32 ePlaceId': 9,
|
||||||
|
'required uInt32 suitId': 11,
|
||||||
|
'required int32 randRange': 12
|
||||||
|
},
|
||||||
|
'repeated EquipInfo equipInfos': 1
|
||||||
|
},
|
||||||
|
'required string msg': 1,
|
||||||
|
'required uInt32 code': 2,
|
||||||
|
'required Data data': 3
|
||||||
|
},
|
||||||
|
'onEquipDel': {
|
||||||
|
'message Data': {
|
||||||
|
'repeated uInt32 equips': 1
|
||||||
|
},
|
||||||
|
'required string msg': 1,
|
||||||
|
'required uInt32 code': 2,
|
||||||
|
'required Data data': 3
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -40,6 +40,9 @@ module.exports = {
|
|||||||
'frontend': true,
|
'frontend': true,
|
||||||
"args": " --inspect=9236"
|
"args": " --inspect=9236"
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
'systimer': [
|
||||||
|
{'id': 'systimer-server-1', 'host': '127.0.0.1', 'port': 6056, "args": " --inspect=9233"}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
'production': {
|
'production': {
|
||||||
|
|||||||
@@ -292,7 +292,7 @@ export const FILENAME = {
|
|||||||
DIC_PVP_OPPONENT: 'dic_pvp_opponent',
|
DIC_PVP_OPPONENT: 'dic_pvp_opponent',
|
||||||
DIC_PVP_TEAM_LEVEL: 'dic_pvp_teamLevel',
|
DIC_PVP_TEAM_LEVEL: 'dic_pvp_teamLevel',
|
||||||
DIC_GK_PVP: 'dic_zyz_gk_pvp',
|
DIC_GK_PVP: 'dic_zyz_gk_pvp',
|
||||||
DIC_PVP_REFRESHCONSUME: 'dic_pvp_refreshConsume'
|
DIC_PVP_REFRESHCONSUME: 'dic_pvp_refreshConsume',
|
||||||
}
|
}
|
||||||
|
|
||||||
export const WAR_RELATE_TABLES = [
|
export const WAR_RELATE_TABLES = [
|
||||||
|
|||||||
+51
-51
@@ -1,7 +1,7 @@
|
|||||||
import BaseModel from './BaseModel';
|
import BaseModel from './BaseModel';
|
||||||
import { index, getModelForClass, prop, DocumentType, modelOptions } from '@typegoose/typegoose';
|
import { index, getModelForClass, prop, DocumentType, modelOptions } from '@typegoose/typegoose';
|
||||||
const _ = require('underscore');
|
const _ = require('underscore');
|
||||||
|
const Transaction = require('mongoose-transactions');
|
||||||
@index({ roleId: 1, id: 1 })
|
@index({ roleId: 1, id: 1 })
|
||||||
@index({ seqId: 1 })
|
@index({ seqId: 1 })
|
||||||
@modelOptions({ schemaOptions: { id: false } })
|
@modelOptions({ schemaOptions: { id: false } })
|
||||||
@@ -50,59 +50,59 @@ export default class Item extends BaseModel {
|
|||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async decreaseItems(roleId: string, items: Array<{ id: number, count: number, ratio?: number }>, lean = true) {
|
// public static async decreaseItems(roleId: string, items: Array<{ id: number, count: number, ratio?: number }>, lean = true) {
|
||||||
let updateItems = new Array<{ id: number, count: number, ratio?: number }>(), hasError: boolean = false, result = new Array();
|
// let updateItems = new Array<{ id: number, count: number, ratio?: number }>(), hasError: boolean = false, result = new Array();
|
||||||
for (let { id, count, ratio } of items) {
|
// for (let { id, count, ratio } of items) {
|
||||||
let rec: ItemType;
|
// let rec: ItemType;
|
||||||
if (!ratio) {
|
// if (!ratio) {
|
||||||
rec = await ItemModel.findOneAndUpdate({ roleId, id, count: { $gte: count } }, { $inc: { count: -1 * count } }, { new: true }).lean(lean);
|
// rec = await ItemModel.findOneAndUpdate({ roleId, id, count: { $gte: count } }, { $inc: { count: -1 * count } }, { new: true }).lean(lean);
|
||||||
} else {
|
// } else {
|
||||||
rec = await ItemModel.findOneAndUpdate({ roleId, id }, { $inc: { count: ratio * count } }, { new: true, upsert: true }).lean(lean);
|
// rec = await ItemModel.findOneAndUpdate({ roleId, id }, { $inc: { count: ratio * count } }, { new: true, upsert: true }).lean(lean);
|
||||||
}
|
|
||||||
if (!!rec) {
|
|
||||||
let index = _.findIndex(result,{id})
|
|
||||||
if (!!result[index]) {
|
|
||||||
result[index] = { id: rec.id, count: rec.count }
|
|
||||||
} else {
|
|
||||||
result.push({ id: rec.id, count: rec.count });
|
|
||||||
}
|
|
||||||
updateItems.push({ id, count, ratio });
|
|
||||||
} else {
|
|
||||||
hasError = true; break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (hasError) { // 数量不足
|
|
||||||
for (let { id, count, ratio } of updateItems) {
|
|
||||||
if (!ratio) ratio = -1;
|
|
||||||
await ItemModel.findOneAndUpdate({ roleId, id }, { $inc: { count: -ratio * count } }, { new: true }).lean(lean);
|
|
||||||
}
|
|
||||||
return { hasError: true }
|
|
||||||
} else {
|
|
||||||
return { hasError: false, result }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// public static async decreaseItems(roleId: string, items: Array<{ id: number, count: number, ratio?: number}>, lean = true) {
|
|
||||||
// const transaction = new Transaction();
|
|
||||||
// let hasError: boolean = false, result = new Array();
|
|
||||||
// try {
|
|
||||||
// for (let { id, count, ratio } of items) {
|
|
||||||
// if (ratio) ratio = -1;
|
|
||||||
// await transaction.update({ roleId, id, count: { $gte: count } }, { $inc: { count: ratio * count } }, { new: true});
|
|
||||||
// //const rec: ItemType = await transaction.findOneAndUpdate({ roleId, id, count: { $gte: count } }, { $inc: { count: ratio * count } }, { new: true}).lean(lean);
|
|
||||||
// // if (!!rec) {
|
|
||||||
// // result.push({ id: rec.id, count: rec.count });
|
|
||||||
// // } else {
|
|
||||||
// // hasError = true; break;
|
|
||||||
// // }
|
|
||||||
// }
|
// }
|
||||||
// await transaction.run();
|
// if (!!rec) {
|
||||||
// return {hasError, result};
|
// let index = _.findIndex(result,{id})
|
||||||
// } catch (error) {
|
// if (!!result[index]) {
|
||||||
// await transaction.rollback().catch(console.error);
|
// result[index] = { id: rec.id, count: rec.count }
|
||||||
// transaction.clean();
|
// } else {
|
||||||
// return {error};
|
// result.push({ id: rec.id, count: rec.count });
|
||||||
|
// }
|
||||||
|
// updateItems.push({ id, count, ratio });
|
||||||
|
// } else {
|
||||||
|
// hasError = true; break;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if (hasError) { // 数量不足
|
||||||
|
// for (let { id, count, ratio } of updateItems) {
|
||||||
|
// if (!ratio) ratio = -1;
|
||||||
|
// await ItemModel.findOneAndUpdate({ roleId, id }, { $inc: { count: -ratio * count } }, { new: true }).lean(lean);
|
||||||
|
// }
|
||||||
|
// return { hasError: true }
|
||||||
|
// } else {
|
||||||
|
// return { hasError: false, result }
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
public static async decreaseItems(roleId: string, items: Array<{ id: number, count: number, ratio?: number}>, lean = true) {
|
||||||
|
const transaction = new Transaction();
|
||||||
|
let hasError: boolean = false, result = new Array();
|
||||||
|
try {
|
||||||
|
for (let { id, count, ratio } of items) {
|
||||||
|
if (ratio) ratio = -1;
|
||||||
|
await transaction.update({ roleId, id, count: { $gte: count } }, { $inc: { count: ratio * count } }, { new: true});
|
||||||
|
const rec: ItemType = await transaction.findOneAndUpdate({ roleId, id, count: { $gte: count } }, { $inc: { count: ratio * count } }, { new: true}).lean(lean);
|
||||||
|
if (!!rec) {
|
||||||
|
result.push({ id: rec.id, count: rec.count });
|
||||||
|
} else {
|
||||||
|
hasError = true; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await transaction.run();
|
||||||
|
return {hasError, result};
|
||||||
|
} catch (error) {
|
||||||
|
await transaction.rollback().catch(console.error);
|
||||||
|
transaction.clean();
|
||||||
|
return {error};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static async deleteAccount(roleId: string) {
|
public static async deleteAccount(roleId: string) {
|
||||||
let result = await ItemModel.deleteMany({ roleId });
|
let result = await ItemModel.deleteMany({ roleId });
|
||||||
|
|||||||
+15
-3
@@ -7,7 +7,9 @@ import { PVP_PLAYER_POS, PVP_HERO_POS } from '../consts';
|
|||||||
|
|
||||||
interface pvpUpdateInter {
|
interface pvpUpdateInter {
|
||||||
_id?: string;
|
_id?: string;
|
||||||
oppPlayers: OppPlayers[]
|
oppPlayers?: OppPlayers[];
|
||||||
|
score?: number;
|
||||||
|
pLv?:number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Heroes {
|
export class Heroes {
|
||||||
@@ -123,7 +125,8 @@ export default class PvpDefense extends BaseModel {
|
|||||||
challengeRefTime: number; // 上一次刷新的时间
|
challengeRefTime: number; // 上一次刷新的时间
|
||||||
@prop({ required: true, default: [] })
|
@prop({ required: true, default: [] })
|
||||||
receivedBox: Array<number>;
|
receivedBox: Array<number>;
|
||||||
|
@prop({ required: true, default: 0 })
|
||||||
|
seasonNum: number;
|
||||||
public static async findByRoleId(roleId: string, lean = true) {
|
public static async findByRoleId(roleId: string, lean = true) {
|
||||||
const result: PvpDefenseType = await PvpDefenseModel.findOne({ roleId }).lean(lean);
|
const result: PvpDefenseType = await PvpDefenseModel.findOne({ roleId }).lean(lean);
|
||||||
return result;
|
return result;
|
||||||
@@ -170,7 +173,7 @@ export default class PvpDefense extends BaseModel {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async findByRoleIdIncludeAll(roleId: string, lean = true) {
|
public static async findByRoleIdIncludeAll(roleId: string) {
|
||||||
const result: PvpDefenseType = await PvpDefenseModel.findOne({ roleId })
|
const result: PvpDefenseType = await PvpDefenseModel.findOne({ roleId })
|
||||||
.populate('role', 'headHid sHid topFiveCe roleId roleName')
|
.populate('role', 'headHid sHid topFiveCe roleId roleName')
|
||||||
.populate('heroes.hero')
|
.populate('heroes.hero')
|
||||||
@@ -201,6 +204,15 @@ export default class PvpDefense extends BaseModel {
|
|||||||
}).lean();
|
}).lean();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
public static async updateInfo(roleId: string, update: pvpUpdateInter, lean = true) {
|
||||||
|
let result: PvpDefenseType = await PvpDefenseModel.findOneAndUpdate({roleId}, {$set:update}, {new: true}).lean(lean);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async getPvpDef(limitNum: number, lean = true) {
|
||||||
|
let result: Array<PvpDefenseType> = await PvpDefenseModel.find().sort({ score: -1 }).limit(limitNum).lean(lean);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const PvpDefenseModel = getModelForClass(PvpDefense);
|
export const PvpDefenseModel = getModelForClass(PvpDefense);
|
||||||
|
|||||||
@@ -15,6 +15,21 @@ export default class SystemConfig extends BaseModel {
|
|||||||
const result: SystemConfigType = await SystemConfigModel.findOne({ id: 1 }).lean(lean);
|
const result: SystemConfigType = await SystemConfigModel.findOne({ id: 1 }).lean(lean);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async createSystemConfig(seasonEndTime: number, warId: number, lean = true) {
|
||||||
|
const result: SystemConfigType = await SystemConfigModel.findOneAndUpdate({ id: 1}, { seasonEndTime, warId }, { upsert: true, new: true }).lean(lean);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async updateSystemConfig(update: { seasonEndTime?: number, warId?: number, seasonNum?:number }, lean = true) {
|
||||||
|
const result: SystemConfigType = await SystemConfigModel.findOneAndUpdate({ id: 1}, update, { upsert: true, new: true }).lean(lean);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async updateSeason( seasonEndTime: number, lean = true) {
|
||||||
|
const result: SystemConfigType = await SystemConfigModel.findOneAndUpdate({ id: 1}, { $seasonEndTime: seasonEndTime, $inc: { seasonNum:1 } }, { upsert: true, new: true }).lean(lean);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const SystemConfigModel = getModelForClass(SystemConfig);
|
export const SystemConfigModel = getModelForClass(SystemConfig);
|
||||||
|
|||||||
+13
-2
@@ -39,7 +39,7 @@ import { ABI_TYPE_TO_STAGE } from "../consts";
|
|||||||
import { dicPvpOpponent } from './dictionary/DicPvpOpponent';
|
import { dicPvpOpponent } from './dictionary/DicPvpOpponent';
|
||||||
import { dicPvpTeamLevel } from './dictionary/DicPvpTeamLevel';
|
import { dicPvpTeamLevel } from './dictionary/DicPvpTeamLevel';
|
||||||
import { dicPvpRefreshConsume } from './dictionary/DicPvpRefreshConsume';
|
import { dicPvpRefreshConsume } from './dictionary/DicPvpRefreshConsume';
|
||||||
|
import { dicGkPvp, dicGkPvps } from './dictionary/DicGkPvp'
|
||||||
export const gameData = {
|
export const gameData = {
|
||||||
blurprtCompose: dicBlueprtCompose,
|
blurprtCompose: dicBlueprtCompose,
|
||||||
blueprtPossibility: dicBlueprtPossibility,
|
blueprtPossibility: dicBlueprtPossibility,
|
||||||
@@ -91,7 +91,9 @@ export const gameData = {
|
|||||||
pvpOpponent: dicPvpOpponent,
|
pvpOpponent: dicPvpOpponent,
|
||||||
pvpTeamLevel: dicPvpTeamLevel,
|
pvpTeamLevel: dicPvpTeamLevel,
|
||||||
pvpWar: dicWarPvp,
|
pvpWar: dicWarPvp,
|
||||||
pvpRefreshConsume: dicPvpRefreshConsume
|
pvpRefreshConsume: dicPvpRefreshConsume,
|
||||||
|
pvpGk: dicGkPvp,
|
||||||
|
pvpGks: dicGkPvps,
|
||||||
};
|
};
|
||||||
|
|
||||||
// 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据
|
// 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据
|
||||||
@@ -268,3 +270,12 @@ export function getPLvByScore(score: number) {
|
|||||||
}
|
}
|
||||||
return lv;
|
return lv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getPvpGkByWarId (warId: number) {
|
||||||
|
return gameData.pvpGk.get(warId);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getPvpGkWarIds() {
|
||||||
|
let warIds = gameData.pvpGks;
|
||||||
|
return warIds;
|
||||||
|
}
|
||||||
@@ -27,3 +27,10 @@ export const SCHOOL = {
|
|||||||
export const SCROLL = {
|
export const SCROLL = {
|
||||||
SCROLL_ACTIVE_FAVOUR: 50, // 首次激活增加的好感度
|
SCROLL_ACTIVE_FAVOUR: 50, // 首次激活增加的好感度
|
||||||
};
|
};
|
||||||
|
export const PVP = {
|
||||||
|
PVP_CHALLENGE_COUNTS: 10, // pvp初始挑战次数
|
||||||
|
PVP_CHALLENGE_NORMALTIMES: 120, // pvp日常挑战次数刷新时间(分钟)
|
||||||
|
PVP_CHALLENGE_FINALTIMES: 60, // PVP赛季最后一天挑战次数刷新时间(分钟)
|
||||||
|
PVP_SEASON_DAYS: 30, // PVP一个赛季的时间
|
||||||
|
PVP_OPPONENT_FREEREFRESH: 3, // pvp挑战对手每日免费刷新次数
|
||||||
|
};
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
import { readJsonFile } from '../util'
|
||||||
|
import { FILENAME } from '../../consts'
|
||||||
|
|
||||||
|
export interface DicGkPvp {
|
||||||
|
readonly war_id: number;
|
||||||
|
readonly dispatchJsonId: number;
|
||||||
|
readonly bg_img_id: number;
|
||||||
|
readonly warType: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
const str = readJsonFile(FILENAME.DIC_GK_PVP);
|
||||||
|
let arr = JSON.parse(str);
|
||||||
|
|
||||||
|
export const dicGkPvp = new Map<number, DicGkPvp>();
|
||||||
|
export const dicGkPvps = new Array<number>();
|
||||||
|
arr.forEach(o => {
|
||||||
|
dicGkPvp.set(o.war_id, o);
|
||||||
|
dicGkPvps.push(o.war_id);
|
||||||
|
});
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
const PER_SECOND = 1 * 1000;
|
||||||
|
const PER_DAY = 24 * 60 * 60;
|
||||||
|
export function nowSeconds() {
|
||||||
|
return Math.floor(Date.now() / PER_SECOND );
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getTodayZeroPoint() {
|
||||||
|
var date = new Date();
|
||||||
|
date.setHours(0);
|
||||||
|
date.setMinutes(0);
|
||||||
|
date.setSeconds(0);
|
||||||
|
var time = Math.floor(date.getTime() / PER_SECOND);
|
||||||
|
return time;
|
||||||
|
}
|
||||||
@@ -6,7 +6,6 @@ import fs = require('fs');
|
|||||||
import path = require('path');
|
import path = require('path');
|
||||||
import { DicRandomEffectPool } from './dictionary/DicRandomEffectPool';
|
import { DicRandomEffectPool } from './dictionary/DicRandomEffectPool';
|
||||||
import { HERO_CE_RATIO, ABI_STAGE } from '../consts';
|
import { HERO_CE_RATIO, ABI_STAGE } from '../consts';
|
||||||
import { PvpDefenseType } from '../db/PvpDefense';
|
|
||||||
|
|
||||||
const _ = require('underscore');
|
const _ = require('underscore');
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user