✨ feat(gvg): 准备期:千机阁以及获取物品
This commit is contained in:
@@ -178,4 +178,5 @@ export const PUSH_ROUTE = {
|
||||
LEAGUE_KICK: 'onKickedByLeague', // 当被踢出
|
||||
LEAGUE_DISSMISS: 'onLeagueDismiss', // 当联军解散
|
||||
LEAGUE_ABDICATE: 'onLeagueAbdicate', // 当被转让盟主
|
||||
LEAGUE_ITEM_UPDATE: 'onLeagueItemUpdate',
|
||||
}
|
||||
@@ -32,10 +32,31 @@ export enum LEAGUE_MANAGE_TYPE {
|
||||
BE_ABDICATED = 7, // 被转让
|
||||
SET_INFO = 8, // 设置信息
|
||||
RERUIT = 9, // 招募
|
||||
SEND_MAIL = 9, // 招募
|
||||
SEND_MAIL = 9, // 发邮件
|
||||
UNLOCK_TECH = 10, // 解锁科技树
|
||||
ACTIVATE_TECH = 11, // 激活
|
||||
}
|
||||
|
||||
export enum LEAGUE_JOB {
|
||||
PRODUCER = 1, // 贤臣
|
||||
FIGHTER = 2, // 猛将
|
||||
}
|
||||
|
||||
export enum LEAGUE_ITEM_REFRESH_TYPE {
|
||||
DAILY = 1, // 每日刷新
|
||||
SEASON = 2, // 赛期刷新
|
||||
}
|
||||
|
||||
export enum GVG_RETURN_ITEM_TYPE {
|
||||
NORMAL_ITEM = 1, // 普通道具
|
||||
GVG_ITEM = 2, // GVG道具
|
||||
}
|
||||
|
||||
export const BATTLE_FEAT_ID = 12; // 战功
|
||||
|
||||
export enum GVG_ACTIVE_TYPE {
|
||||
COST_PRODUCE_COIN = 1, // 消耗内政令
|
||||
COST_FIGHT_COIN = 2, // 消耗征战令
|
||||
TECH_ACTIVATE = 3, // 激活千机阁
|
||||
LOGIN = 4, // 登录逐鹿中原界面
|
||||
}
|
||||
@@ -567,6 +567,8 @@ export const FILENAME = {
|
||||
DIC_ARTIFACT_QUALITY: 'dic_zyz_artifactQuality',
|
||||
DIC_ARTIFACT_SEID: 'dic_zyz_artifactSeid',
|
||||
DIC_GVG_PERIOD: 'dic_zyz_GVGPeriod',
|
||||
DIC_GVG_TECH: 'dic_zyz_GVGTech',
|
||||
DIC_GVG_ITEM: 'dic_zyz_GVGItems',
|
||||
}
|
||||
|
||||
export const WAR_RELATE_TABLES = [
|
||||
@@ -1067,6 +1069,7 @@ export enum ITEM_CHANGE_REASON {
|
||||
ARTIFACT_QUALITY = 158, // 宝物升品
|
||||
ARTIFACT_TRANSFER = 159, // 宝物转换
|
||||
ARTIFACT_REBUILD = 160, // 宝物重铸
|
||||
GVG_ACTIVE_TECH = 161, // 千机阁解锁
|
||||
}
|
||||
|
||||
export enum TA_EVENT {
|
||||
|
||||
@@ -13,4 +13,5 @@ export enum DATA_NAME {
|
||||
DONATE = 'Donate',
|
||||
FUND = 'fund',
|
||||
SEND_AUCTION = 'sendAuction',
|
||||
LEAGUE_TECH = 'LeaguTech'
|
||||
}
|
||||
|
||||
@@ -289,7 +289,7 @@ export const STATUS = {
|
||||
|
||||
// GVG相关
|
||||
GVG_HAS_NO_AUTH: { code: 21300, simStr: '您的权限不足' },
|
||||
GVG_NOT_TEAM_PERIOD: { code: 21301, 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: '服务器开服一周后开放玩法' },
|
||||
@@ -321,6 +321,12 @@ export const STATUS = {
|
||||
CONSUME_TYPE_ERR: { code: 30008, simStr: '道具类型错误' },
|
||||
DB_DATA_NOT_FOUND: { code: 30009, simStr: '数据库数据未找到' },
|
||||
BOX_CAN_NOT_RECEIVE: { code: 30010, simStr: '宝箱不可领取' },
|
||||
GVG_TECH_PRE_POSITION_NOT_UNLOCK: { code: 30011, simStr: '前置科技未激活' },
|
||||
GVG_TECH_QUEUECNT_MAX: { code: 30012, simStr: '解锁队列到达上限' },
|
||||
GVG_TECH_LV_NOT_ENOUGH: { code: 30013, simStr: '联军等级不足不可解锁' },
|
||||
GVG_TECH_HAS_UNLOCKED: { code: 30014, simStr: '该科技已解锁' },
|
||||
GVG_TECH_NOT_QUEUE: { code: 30015, simStr: '该科技不在解锁队列中' },
|
||||
GVG_BATTLE_FEAT_NOT_ENOUGH: { code: 30016, simStr: '战功不足' },
|
||||
|
||||
// 武将养成通用 30100 - 30199
|
||||
|
||||
|
||||
@@ -9,6 +9,8 @@ class Member {
|
||||
@prop({ required: true })
|
||||
roleId: string;
|
||||
@prop({ required: true })
|
||||
guildCode: string;
|
||||
@prop({ required: true })
|
||||
auth: number;
|
||||
}
|
||||
|
||||
@@ -69,7 +71,7 @@ export default class GVGLeague extends BaseModel {
|
||||
const doc = new GVGLeagueModel();
|
||||
const leagueCode = genCode(6);
|
||||
let _leader = <RoleType>leader;
|
||||
let _members = members.map(roleId => ({ roleId, auth: _leader.roleId == roleId? LEAGUE_AUTH.LEADER: LEAGUE_AUTH.MEMBER }));
|
||||
let _members = members.map(roleId => ({ roleId, auth: _leader.roleId == roleId? LEAGUE_AUTH.LEADER: LEAGUE_AUTH.MEMBER, guildCode: code }));
|
||||
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;
|
||||
|
||||
@@ -83,6 +85,7 @@ export default class GVGLeague extends BaseModel {
|
||||
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')
|
||||
.select('+serverId')
|
||||
.lean();
|
||||
return league
|
||||
}
|
||||
@@ -118,7 +121,7 @@ export default class GVGLeague extends BaseModel {
|
||||
public static async joinGuild(leagueCode: string, guild: GuildType) {
|
||||
const { code, memberCnt, leader, guildCe, members } = guild;
|
||||
let _leader = <RoleType>leader;
|
||||
let _members = members.map(roleId => ({ roleId, auth: _leader.roleId == roleId? LEAGUE_AUTH.SUB_LEADER: LEAGUE_AUTH.MEMBER }));
|
||||
let _members = members.map(roleId => ({ roleId, auth: _leader.roleId == roleId? LEAGUE_AUTH.SUB_LEADER: LEAGUE_AUTH.MEMBER, guildCode: code }));
|
||||
|
||||
const league: GVGLeagueType = await GVGLeagueModel.findOneAndUpdate({ leagueCode, status: 1 },
|
||||
{ $push: { guildCodes: code, members: { $each: _members } }, $inc: { guildCnt: 1, memberCnt: memberCnt, leagueCe: guildCe }
|
||||
@@ -167,8 +170,8 @@ export default class GVGLeague extends BaseModel {
|
||||
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();
|
||||
public static async joinMember(leagueCode: string, roleId: string, guildCode: string, ce: number) {
|
||||
const league: GVGLeagueType = await GVGLeagueModel.findOneAndUpdate({ leagueCode, status: 1 }, { $push: { members: { roleId, auth: LEAGUE_AUTH.MEMBER, guildCode } }, $inc: { memberCnt: 1, leagueCe: ce } }, { new: true }).lean();
|
||||
return league;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,14 +1,21 @@
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType, } from '@typegoose/typegoose';
|
||||
import { LEAGUE_JOB } from '../consts';
|
||||
import { GVG } from '../pubUtils/dicParam';
|
||||
|
||||
class Tech {
|
||||
export 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-已激活
|
||||
maxProgress: number; // 贡献
|
||||
|
||||
constructor(id: number, maxProgress: number) {
|
||||
this.id = id;
|
||||
this.progress = 0;
|
||||
this.maxProgress = maxProgress;
|
||||
}
|
||||
}
|
||||
|
||||
class DonateRec {
|
||||
@@ -29,6 +36,13 @@ class Resource {
|
||||
wood: number; // 木堆
|
||||
}
|
||||
|
||||
class GuildActive {
|
||||
@prop({ required: true, default: '' })
|
||||
guildCode: string; // 军团
|
||||
@prop({ required: true, default: 0 })
|
||||
active: number;
|
||||
}
|
||||
|
||||
@index({ leagueCode: 1, configId: 1 })
|
||||
export default class GVGLeaguePrepare extends BaseModel {
|
||||
|
||||
@@ -50,8 +64,14 @@ export default class GVGLeaguePrepare extends BaseModel {
|
||||
@prop({ required: true, default: 0 })
|
||||
fighterCnt: number; // 选择外政人数
|
||||
|
||||
@prop({ required: true, default: [], type: Number, _id: false })
|
||||
activeTech: number[]; // 已激活完了的
|
||||
|
||||
@prop({ required: true, default: [], type: Tech, _id: false })
|
||||
tech: Tech[]; // 千机阁
|
||||
techQueue: Tech[]; // 千机阁
|
||||
|
||||
@prop({ required: true, default: 0 })
|
||||
techQueueCnt: number; // 千机阁队列数量
|
||||
|
||||
@prop({ required: true, default: [], type: DonateRec, _id: false })
|
||||
donateRec: DonateRec[]; // 捐献记录
|
||||
@@ -59,6 +79,9 @@ export default class GVGLeaguePrepare extends BaseModel {
|
||||
@prop({ required: true, default: {food: 0, mineral: 0, wood: 0}, type: Resource, _id: false })
|
||||
resources: Resource
|
||||
|
||||
@prop({ required: true, default: [], type: GuildActive, _id: false })
|
||||
guildActive: GuildActive[]; // 军团活跃
|
||||
|
||||
public static async initData(configId: number, leagueCode: string, maxMemberCnt: number) {
|
||||
const doc = new GVGLeaguePrepareModel();
|
||||
const update = Object.assign(doc.toJSON(), { maxMemberCnt });
|
||||
@@ -83,6 +106,24 @@ export default class GVGLeaguePrepare extends BaseModel {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
public static async unlockTech(configId: number, leagueCode: string, techId: number, maxProgress: number) {
|
||||
const result: GVGLeaguePrepareType = await GVGLeaguePrepareModel.findOneAndUpdate({
|
||||
configId, leagueCode, techQueueCnt: { $lt: GVG.GVG_LEAGUE_TECH_LIST } }, { $push: { techQueue: new Tech(techId, maxProgress) }, $inc: { techQueueCnt: 1 } }, { new: true }).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async addProgress(configId: number, leagueCode: string, techId: number, addProgress: number) {
|
||||
const result: GVGLeaguePrepareType = await GVGLeaguePrepareModel.findOneAndUpdate({
|
||||
configId, leagueCode, 'techQueue.id': techId }, { $inc: { 'techQueue.$.progress': addProgress } }, { new: true }).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async activate(configId: number, leagueCode: string, techId: number) {
|
||||
const result: GVGLeaguePrepareType = await GVGLeaguePrepareModel.findOneAndUpdate({
|
||||
configId, leagueCode }, { $push: { activeTech: techId}, $pull: { techQueue: { id: techId } } }, { new: true }).lean();
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
export const GVGLeaguePrepareModel = getModelForClass(GVGLeaguePrepare);
|
||||
|
||||
62
shared/db/GVGUserDailyData.ts
Normal file
62
shared/db/GVGUserDailyData.ts
Normal file
@@ -0,0 +1,62 @@
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType, } from '@typegoose/typegoose';
|
||||
import { getZeroPoint } from '../pubUtils/timeUtil';
|
||||
|
||||
@index({ leagueCode: 1, roleId: 1, configId: 1, time: 1 })
|
||||
export default class GVGUserDailyData 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 })
|
||||
food: number; // 粮食
|
||||
|
||||
@prop({ required: true, default: 0 })
|
||||
mineral: number; // 矿物
|
||||
|
||||
@prop({ required: true, default: 0 })
|
||||
wood: number; // 木材
|
||||
|
||||
@prop({ required: true, default: 0 })
|
||||
score: number; // 据点积分
|
||||
|
||||
@prop({ required: true, default: 0 })
|
||||
time: number = 0; // 每天0点
|
||||
|
||||
@prop({ required: true, default: 0 })
|
||||
hasGetTechActive: boolean; // 千机阁激活活跃是否获得
|
||||
|
||||
@prop({ required: true, default: 0 })
|
||||
hasLogin: boolean; // 每日登录活跃是否获得
|
||||
|
||||
public static async findByRole(configId: number, leagueCode: string, roleId: string) {
|
||||
const result: GVGUserDailyDataType = await GVGUserDailyDataModel.findOne({ configId, leagueCode, roleId, time: getZeroPoint() }).select('food mineral wood score').lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async checkGetTechActive(configId: number, leagueCode: string, roleId: string) {
|
||||
return await GVGUserDailyDataModel.exists({ configId, leagueCode, roleId, time: getZeroPoint(), hasGetTechActive: { $exists: true } });
|
||||
}
|
||||
|
||||
public static async setHasGetTechActive(configId: number, leagueCode: string, roleId: string) {
|
||||
const result: GVGUserDailyDataType = await GVGUserDailyDataModel.findOneAndUpdate({ configId, leagueCode, roleId, time: getZeroPoint() }, { hasGetTechActive: true }, { upsert: true, new: true }).lean();
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
export const GVGUserDailyDataModel = getModelForClass(GVGUserDailyData);
|
||||
|
||||
export interface GVGUserDailyDataType extends Pick<DocumentType<GVGUserDailyData>, keyof GVGUserDailyData> {
|
||||
id: number;
|
||||
};
|
||||
export type GVGUserDailyDataUpdate = Partial<GVGUserDailyDataType>; // 将所有字段变成可选项
|
||||
@@ -1,47 +0,0 @@
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType, } from '@typegoose/typegoose';
|
||||
import { nowSeconds } from '../pubUtils/timeUtil';
|
||||
|
||||
@index({ leagueCode: 1, roleId: 1, configId: 1, time: 1 })
|
||||
export default class GVGUserDailyDistribute 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 })
|
||||
food: number; // 粮食
|
||||
|
||||
@prop({ required: true, default: 0 })
|
||||
mineral: number; // 矿物
|
||||
|
||||
@prop({ required: true, default: 0 })
|
||||
wood: number; // 木材
|
||||
|
||||
@prop({ required: true, default: 0 })
|
||||
score: number; // 据点积分
|
||||
|
||||
@prop({ required: true, default: 0 })
|
||||
time: number = 0; // 据点积分
|
||||
|
||||
public static async findByRole(configId: number, leagueCode: string, roleId: string) {
|
||||
const result: GVGUserDailyDistributeType = await GVGUserDailyDistributeModel.findOne({ configId, leagueCode, roleId, time: nowSeconds() }).select('food mineral wood score').lean();
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
export const GVGUserDailyDistributeModel = getModelForClass(GVGUserDailyDistribute);
|
||||
|
||||
export interface GVGUserDailyDistributeType extends Pick<DocumentType<GVGUserDailyDistribute>, keyof GVGUserDailyDistribute> {
|
||||
id: number;
|
||||
};
|
||||
export type GVGUserDailyDistributeUpdate = Partial<GVGUserDailyDistributeType>; // 将所有字段变成可选项
|
||||
@@ -1,5 +1,6 @@
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType, } from '@typegoose/typegoose';
|
||||
import { nowSeconds } from '../pubUtils/timeUtil';
|
||||
|
||||
class ActiveRec {
|
||||
@prop({ required: true, default: 1 })
|
||||
@@ -8,6 +9,12 @@ class ActiveRec {
|
||||
count: number;
|
||||
@prop({ required: true, default: 0 })
|
||||
time: number;
|
||||
|
||||
constructor(id: number, count: number) {
|
||||
this.id = id;
|
||||
this.count = count;
|
||||
this.time = nowSeconds();
|
||||
}
|
||||
}
|
||||
|
||||
class Box {
|
||||
@@ -91,6 +98,11 @@ export default class GVGUserData extends BaseModel {
|
||||
const result: GVGUserDataType = await GVGUserDataModel.findOneAndUpdate({ configId, leagueCode, roleId }, { $set: { job } }, { new: true, upsert: true}).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async addActive(configId: number, leagueCode: string, roleId: string, activeType: number, active: number) {
|
||||
const result: GVGUserDataType = await GVGUserDataModel.findOneAndUpdate({ configId, leagueCode, roleId }, { $inc: { active }, $push: { activeRec: new ActiveRec(activeType, active) } }, { new: true, upsert: true}).lean();
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
export const GVGUserDataModel = getModelForClass(GVGUserData);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType, } from '@typegoose/typegoose';
|
||||
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
||||
import { nowSeconds } from '../pubUtils/timeUtil';
|
||||
import { RewardInter } from '../pubUtils/interface';
|
||||
|
||||
@index({ leagueCode: 1, roleId: 1, configId: 1, status: 1 })
|
||||
export default class GVGUserItem extends BaseModel {
|
||||
@@ -27,6 +28,26 @@ export default class GVGUserItem extends BaseModel {
|
||||
const result: GVGUserItemType[] = await GVGUserItemModel.find({ configId, leagueCode, roleId, expireTime: { $gte: nowSeconds() } }, { _id: 0 }).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async increaseItem(configId: number, leagueCode: string, roleId: string, id: number, inc: number, expireTime: number) {
|
||||
const result: GVGUserItemType = await GVGUserItemModel.findOneAndUpdate({ configId, leagueCode, roleId, id, expireTime }, { $inc: { count: inc } }, { new: true, upsert: true }).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async findByRoleAndIds(configId: number, leagueCode: string, roleId: string, ids: number[]) {
|
||||
const result: GVGUserItemType[] = await GVGUserItemModel.find({ configId, leagueCode, roleId, expireTime: { $gte: nowSeconds() }, id: { $in: ids } }).select('id count').lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async decreaseItem(configId: number, leagueCode: string, roleId: string, items: RewardInter[]) {
|
||||
const result = await GVGUserItemModel.bulkWrite(items.map(({ id, count }) => {
|
||||
let filter = { configId, leagueCode, roleId, id, count: { $gte: count }, expireTime: { $gte: nowSeconds() } }
|
||||
console.log('#### filter', filter, )
|
||||
return { updateOne: { filter, update: { $inc: { count: -1 * count } } } }
|
||||
}));
|
||||
console.log(result.matchedCount, items.length)
|
||||
return result.matchedCount == items.length;
|
||||
}
|
||||
}
|
||||
|
||||
export const GVGUserItemModel = getModelForClass(GVGUserItem);
|
||||
|
||||
@@ -5,6 +5,7 @@ import { GUILD_STRUCTURE, GUILD_STATUS, GUILD_PER_PAGE, GUILD_SELECT, REDIS_KEY,
|
||||
import { getZeroPoint, getZeroPointD, nowSeconds } from '../pubUtils/timeUtil';
|
||||
import { gameData } from '../pubUtils/data';
|
||||
import { SearchGuildParam } from '../domain/backEndField/search';
|
||||
import { GVG } from '../pubUtils/dicParam';
|
||||
|
||||
export class Structure {
|
||||
@prop({ required: true })
|
||||
@@ -325,21 +326,22 @@ export default class Guild extends BaseModel {
|
||||
}
|
||||
|
||||
public static async findGuildsForGVG(page: number, name: string, serverIds: number[]) {
|
||||
let query: any = { status: GUILD_STATUS.RUNNING, lv: { $gte: 3 }, leagueCode: '', serverId: { $in: serverIds } };
|
||||
let query: any = { status: GUILD_STATUS.RUNNING, lv: { $gte: GVG.GVG_ARMY_LEAGUE_TIME }, 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)
|
||||
.select('+serverId')
|
||||
.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')
|
||||
.select('+serverId')
|
||||
.lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -119,7 +119,7 @@ export default class LadderMatch extends BaseModel {
|
||||
if(defenseInfo.isRobot) {
|
||||
let atkLadderMatch = await LadderMatchModel.findOne({ roleId: attackInfo.roleId }).lean();
|
||||
if(isSuccess && atkLadderMatch && (atkLadderMatch.rank == 0 || atkLadderMatch.rank > defenseInfo.oldRank)) {
|
||||
newAtkLadderMatch = await LadderMatchModel.findOneAndUpdate({ roleId: attackInfo.roleId }, { $set: { rank: defenseInfo.oldRank, oldRank: atkLadderMatch.rank } }, { new: true }).lean();
|
||||
newAtkLadderMatch = await LadderMatchModel.findOneAndUpdate({ roleId: attackInfo.roleId }, { $set: { rank: defenseInfo.oldRank, oldRank: atkLadderMatch.rank } }, { new: true, session }).lean();
|
||||
isChange = true;
|
||||
endTime = Date.now();
|
||||
} else {
|
||||
@@ -129,8 +129,8 @@ export default class LadderMatch extends BaseModel {
|
||||
let atkLadderMatch = await LadderMatchModel.findOne({ roleId: attackInfo.roleId }).lean();
|
||||
let defLadderMatch = await LadderMatchModel.findOne({ roleId: defenseInfo.roleId }).lean();
|
||||
if(isSuccess && atkLadderMatch && defLadderMatch && (atkLadderMatch.rank == 0 || atkLadderMatch.rank > defLadderMatch.rank)) {
|
||||
newAtkLadderMatch = await LadderMatchModel.findOneAndUpdate({ roleId: attackInfo.roleId }, { $set: { rank: defLadderMatch.rank, oldRank: atkLadderMatch.rank } }, { new: true }).lean();
|
||||
newDefLadderMatch = await LadderMatchModel.findOneAndUpdate({ roleId: defenseInfo.roleId }, { $set: { rank: atkLadderMatch.rank, oldRank: defLadderMatch.rank } }, { new: true }).lean();
|
||||
newAtkLadderMatch = await LadderMatchModel.findOneAndUpdate({ roleId: attackInfo.roleId }, { $set: { rank: defLadderMatch.rank, oldRank: atkLadderMatch.rank } }, { new: true, session }).lean();
|
||||
newDefLadderMatch = await LadderMatchModel.findOneAndUpdate({ roleId: defenseInfo.roleId }, { $set: { rank: atkLadderMatch.rank, oldRank: defLadderMatch.rank } }, { new: true, session }).lean();
|
||||
isChange = true;
|
||||
endTime = Date.now();
|
||||
} else {
|
||||
|
||||
@@ -98,7 +98,7 @@ export class GVGMainData {
|
||||
if(!leaguePrepare) return;
|
||||
this.lv = leaguePrepare.lv;
|
||||
this.resources = leaguePrepare.resources;
|
||||
this.activeTech = leaguePrepare.tech.filter(cur => cur.status == 1).map(cur => cur.id);
|
||||
this.activeTech = leaguePrepare.activeTech||[];
|
||||
}
|
||||
|
||||
setPlayerInfo(userData: GVGUserDataType, auth: number, canPrepare: boolean, canChooseJob: boolean, items: GVGItem[], tasks: GVGTask[]) {
|
||||
|
||||
@@ -119,6 +119,8 @@ import { DicArtifact } from "./dictionary/DicArtifact";
|
||||
import { DicArtifactQuality } from "./dictionary/DicArtifactQuality";
|
||||
import { dicGiftPackagePlan, loadGiftPackagePlan } from "./dictionary/DicGiftPackagePlan";
|
||||
import { dicGVGPeriod, loadGVGPeriod } from './dictionary/DicGVGPeriod';
|
||||
import { dicGVGTech, loadGVGTech } from "./dictionary/DicGVGTech";
|
||||
import { dicGVGItem, loadGVGItem } from "./dictionary/DicGVGItems";
|
||||
|
||||
export const gameData = {
|
||||
daily: dicDaily,
|
||||
@@ -297,6 +299,9 @@ export const gameData = {
|
||||
artifactSeid: dicArtifactSeid,
|
||||
artifactByGroupAndQuality: dicArtifactsByGroup,
|
||||
gvgPeriod: dicGVGPeriod,
|
||||
gvgTech: dicGVGTech,
|
||||
gvgItem: dicGVGItem,
|
||||
gvgActive: new Map<number, number>(),
|
||||
};
|
||||
|
||||
// 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据
|
||||
@@ -1069,6 +1074,13 @@ export function getArtifactWithQuality(artifactId: number): (DicArtifact&DicArti
|
||||
return {...dicArtifact, ...dicArtifactQuality}
|
||||
}
|
||||
|
||||
function parseGVGActive() {
|
||||
let arr = decodeArrayListStr(param.GVG.GVG_LEAGUE_ACTIVE_POINT);
|
||||
for(let [id, active] of arr) {
|
||||
gameData.gvgActive.set(parseInt(id), parseInt(active));
|
||||
}
|
||||
}
|
||||
|
||||
// 初始加载
|
||||
function initDatas() {
|
||||
parseDicParam();
|
||||
@@ -1089,6 +1101,7 @@ function parseDicParam() {
|
||||
loadAuctionTime();
|
||||
decodeLadderBuyCost();
|
||||
parseComBattleRewardTime();
|
||||
parseGVGActive();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1265,6 +1278,8 @@ function loadDatas() {
|
||||
loadArtifactQualityPlan();
|
||||
loadArtifactSeid();
|
||||
loadGVGPeriod();
|
||||
loadGVGTech();
|
||||
loadGVGItem();
|
||||
}
|
||||
|
||||
// 重载dicParam
|
||||
|
||||
40
shared/pubUtils/dictionary/DicGVGItems.ts
Normal file
40
shared/pubUtils/dictionary/DicGVGItems.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
// GVG道具
|
||||
import { FILENAME } from '../../consts'
|
||||
import { RewardInter } from '../interface';
|
||||
import { parseGoodStr, readFileAndParse } from '../util'
|
||||
|
||||
export interface DicGVGItem {
|
||||
// 道具id
|
||||
id: number;
|
||||
// 点名称
|
||||
name: string
|
||||
// 1-种子 2-铲子 3-斧子 4-内政外政令 5-战功 6-激战期用的复活令&匕首
|
||||
type: number;
|
||||
// 1-每日刷新 2-赛期内刷新
|
||||
refreshType: number;
|
||||
// 兑换物品表消耗
|
||||
consume: RewardInter[];
|
||||
// 这个表里的兑换消耗
|
||||
leagueConsume: RewardInter[];
|
||||
// 耐久度或者产量
|
||||
value: number,
|
||||
// 消耗后可获得的奖励
|
||||
reward: RewardInter[];
|
||||
// 消耗后可获得的这张表里的奖励
|
||||
leagueReward: RewardInter[];
|
||||
}
|
||||
|
||||
export const dicGVGItem = new Map<number, DicGVGItem>();
|
||||
export function loadGVGItem() {
|
||||
dicGVGItem.clear();
|
||||
|
||||
let arr = readFileAndParse(FILENAME.DIC_GVG_ITEM);
|
||||
arr.forEach(o => {
|
||||
o.consume = parseGoodStr(o.consume);
|
||||
o.leagueConsume = parseGoodStr(o.leagueConsume);
|
||||
o.reward = parseGoodStr(o.reward);
|
||||
o.leagueReward = parseGoodStr(o.leagueReward);
|
||||
dicGVGItem.set(o.id, o);
|
||||
});
|
||||
arr = undefined;
|
||||
}
|
||||
44
shared/pubUtils/dictionary/DicGVGTech.ts
Normal file
44
shared/pubUtils/dictionary/DicGVGTech.ts
Normal file
@@ -0,0 +1,44 @@
|
||||
// GVG千机阁
|
||||
import { FILENAME } from '../../consts'
|
||||
import { decodeArrayListStr, readFileAndParse } from '../util'
|
||||
|
||||
export interface DicGVGTech {
|
||||
// 唯一id
|
||||
id: number;
|
||||
// 点名称
|
||||
name: string
|
||||
// 激活后获得的内容
|
||||
content: string;
|
||||
// 效果类型 1-资源产量上传 2-征战中原提升 3-激战期提升 4-复活cd减少 5-箭塔 6-攻城车
|
||||
type: number;
|
||||
// 资源提升量啊,复活cd减少量啊之类的值
|
||||
param: number;
|
||||
// 点排序
|
||||
nodeSort: number;
|
||||
// 联军等级限制
|
||||
levelLimit: number;
|
||||
// 前置id
|
||||
prepositionId: number[][];
|
||||
// 所需的战功
|
||||
consume: number;
|
||||
}
|
||||
|
||||
export const dicGVGTech = new Map<number, DicGVGTech>();
|
||||
export function loadGVGTech() {
|
||||
dicGVGTech.clear();
|
||||
|
||||
let arr = readFileAndParse(FILENAME.DIC_GVG_TECH);
|
||||
arr.forEach(o => {
|
||||
o.prepositionId = parsePrePositionId(o.prepositionId);
|
||||
dicGVGTech.set(o.id, o);
|
||||
});
|
||||
arr = undefined;
|
||||
}
|
||||
|
||||
|
||||
function parsePrePositionId(str: string) {
|
||||
let arr = decodeArrayListStr(str);
|
||||
return arr.map(arr1 => {
|
||||
return arr1.map(str => parseInt(str));
|
||||
});
|
||||
}
|
||||
@@ -9,7 +9,8 @@
|
||||
"levelSeid": 0,
|
||||
"levelLimit": 1,
|
||||
"prepositionId": "&",
|
||||
"consume": "12&5000"
|
||||
"consume": 1000,
|
||||
"lineShow": "&"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
@@ -21,7 +22,8 @@
|
||||
"levelSeid": "1001&",
|
||||
"levelLimit": 1,
|
||||
"prepositionId": "&",
|
||||
"consume": "12&5000"
|
||||
"consume": 2000,
|
||||
"lineShow": "&"
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
@@ -33,7 +35,8 @@
|
||||
"levelSeid": 0,
|
||||
"levelLimit": 2,
|
||||
"prepositionId": "1&",
|
||||
"consume": "12&5000"
|
||||
"consume": 3000,
|
||||
"lineShow": "1&"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
@@ -45,7 +48,8 @@
|
||||
"levelSeid": "1001&",
|
||||
"levelLimit": 2,
|
||||
"prepositionId": "2&",
|
||||
"consume": "12&5000"
|
||||
"consume": 4000,
|
||||
"lineShow": "2&"
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
@@ -57,34 +61,50 @@
|
||||
"levelSeid": "1001&",
|
||||
"levelLimit": 2,
|
||||
"prepositionId": "3&|4&",
|
||||
"consume": "12&5000"
|
||||
"consume": 5000,
|
||||
"lineShow": "4&|5&"
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"name": "贤臣3",
|
||||
"content": "资源产量提升15%",
|
||||
"type": 1,
|
||||
"param": "15&",
|
||||
"nodeSort": 4,
|
||||
"levelSeid": 0,
|
||||
"levelLimit": 4,
|
||||
"prepositionId": "3&",
|
||||
"consume": 6000,
|
||||
"lineShow": "3&"
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"name": "猛将3",
|
||||
"content": "征战中原联军成员攻击提升15%",
|
||||
"type": 1,
|
||||
"param": "10&",
|
||||
"nodeSort": 4,
|
||||
"levelSeid": 0,
|
||||
"levelLimit": 4,
|
||||
"prepositionId": "4&",
|
||||
"consume": 7000,
|
||||
"lineShow": "6&"
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"name": "激战2",
|
||||
"content": "激战期时联军成员攻击提升5%",
|
||||
"type": 3,
|
||||
"param": "&",
|
||||
"nodeSort": 4,
|
||||
"nodeSort": 5,
|
||||
"levelSeid": "1001&",
|
||||
"levelLimit": 4,
|
||||
"prepositionId": "5&",
|
||||
"consume": "12&5000"
|
||||
"consume": 8000,
|
||||
"lineShow": "7&"
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"name": "复活1",
|
||||
"content": "激战期时联军成员复活cd减少30s",
|
||||
"type": 4,
|
||||
"param": "30&",
|
||||
"nodeSort": 5,
|
||||
"levelSeid": 0,
|
||||
"levelLimit": 4,
|
||||
"prepositionId": "6&",
|
||||
"consume": "12&5000"
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"id": 9,
|
||||
"name": "箭塔1",
|
||||
"content": "联军中随机20名成员获得箭塔(箭塔每10s给该位置所有敌军减5点耐久,箭头耐久为50点)",
|
||||
"type": 5,
|
||||
@@ -92,19 +112,112 @@
|
||||
"nodeSort": 6,
|
||||
"levelSeid": 0,
|
||||
"levelLimit": 6,
|
||||
"prepositionId": "7&",
|
||||
"consume": "12&5000"
|
||||
"prepositionId": "8&",
|
||||
"consume": 9000,
|
||||
"lineShow": "8&"
|
||||
},
|
||||
{
|
||||
"id": 9,
|
||||
"name": "攻城车1",
|
||||
"content": "联军中随机20名成员获得攻城车(使用攻城车道具可击杀1名敌军)",
|
||||
"id": 10,
|
||||
"name": "匕首1",
|
||||
"content": "联军中随机5名成员获得攻城车(使用匕首道具可击杀1名敌军)",
|
||||
"type": 6,
|
||||
"param": "20&",
|
||||
"nodeSort": 6,
|
||||
"levelSeid": 0,
|
||||
"levelLimit": 6,
|
||||
"prepositionId": "7&",
|
||||
"consume": "12&5000"
|
||||
"prepositionId": "8&",
|
||||
"consume": 10000,
|
||||
"lineShow": "9&"
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"name": "复活1",
|
||||
"content": "激战期时联军成员复活cd减少30s",
|
||||
"type": 4,
|
||||
"param": "30&",
|
||||
"nodeSort": 7,
|
||||
"levelSeid": 0,
|
||||
"levelLimit": 6,
|
||||
"prepositionId": "9&|10&",
|
||||
"consume": 11000,
|
||||
"lineShow": "11&|12&"
|
||||
},
|
||||
{
|
||||
"id": 12,
|
||||
"name": "箭塔2",
|
||||
"content": "联军中随机20名成员获得箭塔(箭塔每10s给该位置所有敌军减5点耐久,箭头耐久为50点)",
|
||||
"type": 5,
|
||||
"param": "10&5&50",
|
||||
"nodeSort": 8,
|
||||
"levelSeid": 0,
|
||||
"levelLimit": 8,
|
||||
"prepositionId": "9&",
|
||||
"consume": 12000,
|
||||
"lineShow": "10&"
|
||||
},
|
||||
{
|
||||
"id": 13,
|
||||
"name": "匕首2",
|
||||
"content": "联军中随机5名成员获得攻城车(使用匕首道具可击杀1名敌军)",
|
||||
"type": 6,
|
||||
"param": "20&",
|
||||
"nodeSort": 8,
|
||||
"levelSeid": 0,
|
||||
"levelLimit": 8,
|
||||
"prepositionId": "10&",
|
||||
"consume": 13000,
|
||||
"lineShow": "13&"
|
||||
},
|
||||
{
|
||||
"id": 14,
|
||||
"name": "激战3",
|
||||
"content": "激战期时联军成员攻击提升10%",
|
||||
"type": 3,
|
||||
"param": "&",
|
||||
"nodeSort": 9,
|
||||
"levelSeid": "1001&",
|
||||
"levelLimit": 8,
|
||||
"prepositionId": "11&",
|
||||
"consume": 14000,
|
||||
"lineShow": "14&"
|
||||
},
|
||||
{
|
||||
"id": 15,
|
||||
"name": "箭塔3",
|
||||
"content": "联军中随机20名成员获得箭塔(箭塔每10s给该位置所有敌军减5点耐久,箭头耐久为50点)",
|
||||
"type": 5,
|
||||
"param": "10&5&50",
|
||||
"nodeSort": 10,
|
||||
"levelSeid": 0,
|
||||
"levelLimit": 10,
|
||||
"prepositionId": "12&",
|
||||
"consume": 15000,
|
||||
"lineShow": "15&"
|
||||
},
|
||||
{
|
||||
"id": 16,
|
||||
"name": "匕首3",
|
||||
"content": "联军中随机10名成员获得攻城车(使用匕首道具可击杀1名敌军)",
|
||||
"type": 6,
|
||||
"param": "20&",
|
||||
"nodeSort": 10,
|
||||
"levelSeid": 0,
|
||||
"levelLimit": 10,
|
||||
"prepositionId": "13&",
|
||||
"consume": 16000,
|
||||
"lineShow": "16&"
|
||||
},
|
||||
{
|
||||
"id": 17,
|
||||
"name": "复活2",
|
||||
"content": "激战期时联军成员复活cd减少30s",
|
||||
"type": 4,
|
||||
"param": "30&",
|
||||
"nodeSort": 11,
|
||||
"levelSeid": 0,
|
||||
"levelLimit": 10,
|
||||
"prepositionId": "14&",
|
||||
"consume": 17000,
|
||||
"lineShow": "17&"
|
||||
}
|
||||
]
|
||||
@@ -33,6 +33,6 @@
|
||||
"DEBUG_TIME": 1,
|
||||
"CHECK_WORD": 1,
|
||||
"CAN_PAY": 1,
|
||||
"SKIP_ENCODE": 1,
|
||||
"SKIP_ENCODE": 0,
|
||||
"NEED_REBATE": 0
|
||||
}
|
||||
Reference in New Issue
Block a user