✨ feat(gvg): 征战中原动态、任务、贡献
This commit is contained in:
@@ -106,6 +106,12 @@ export default class GVGUserData extends BaseModel {
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async addVestigeScores(configId: number, memberScores: { leagueCode: string, roleId: string, score: number }[]) {
|
||||
await GVGUserDataModel.bulkWrite(memberScores.map(({ leagueCode, roleId, score }) => {
|
||||
return { updateOne: { filter: { configId, leagueCode, roleId }, update: { $inc: { 'distribute.score': score } } } }
|
||||
}));
|
||||
}
|
||||
|
||||
public static async receiveBox(configId: number, leagueCode: string, roleId: string, boxId: number) {
|
||||
const result: GVGUserDataType = await GVGUserDataModel.findOneAndUpdate({ configId, leagueCode, roleId }, { $push: { box: boxId }}, { new: true }).lean();
|
||||
return result;
|
||||
|
||||
@@ -104,26 +104,28 @@ export default class GVGVestigeRank extends BaseModel {
|
||||
await GVGVestigeRankModel.updateMany({ day: today, hasDefense: true, roleId, 'lineup.hid': hid }, { $set: { 'lineupCe.$.ce': ce } });
|
||||
}
|
||||
|
||||
public static async changeRank(isSuccess: boolean, attackInfo: { roleId: string }, defenseInfo: { isRobot: boolean, roleId: string, oldRank: number }): Promise<{ isChange: boolean, atkData?: GVGVestigeRankType, defData?: GVGVestigeRankType, endTime: number }> {
|
||||
public static async changeRank(isSuccess: boolean, vestigeId: number, attackInfo: { roleId: string }, defenseInfo: { isRobot: boolean, roleId: string, oldRank: number }): Promise<{ isChange: boolean, atkData?: GVGVestigeRankType, defData?: GVGVestigeRankType, endTime: number }> {
|
||||
|
||||
let today = getZeroPoint();
|
||||
const session = await mongoose.connection.startSession();
|
||||
session.startTransaction()
|
||||
try {
|
||||
let newAtkData: GVGVestigeRankType, newDefData: GVGVestigeRankType, isChange = false, endTime = Date.now();
|
||||
if(defenseInfo.isRobot) {
|
||||
let atkData = await GVGVestigeRankModel.findOne({ roleId: attackInfo.roleId }).lean();
|
||||
let atkData = await GVGVestigeRankModel.findOne({ day: today, vestigeId, roleId: attackInfo.roleId }).lean();
|
||||
if(isSuccess && atkData && (atkData.rank == 0 || atkData.rank > defenseInfo.oldRank)) {
|
||||
newAtkData = await GVGVestigeRankModel.findOneAndUpdate({ roleId: attackInfo.roleId }, { $set: { rank: defenseInfo.oldRank, oldRank: atkData.rank } }, { new: true, session }).lean();
|
||||
newAtkData = await GVGVestigeRankModel.findOneAndUpdate({ day: today, vestigeId, roleId: attackInfo.roleId }, { $set: { rank: defenseInfo.oldRank, oldRank: atkData.rank } }, { new: true, session }).lean();
|
||||
isChange = true;
|
||||
endTime = Date.now();
|
||||
} else {
|
||||
newAtkData = atkData;
|
||||
}
|
||||
} else {
|
||||
let atkData = await GVGVestigeRankModel.findOne({ roleId: attackInfo.roleId }).lean();
|
||||
let defData = await GVGVestigeRankModel.findOne({ roleId: defenseInfo.roleId }).lean();
|
||||
let atkData = await GVGVestigeRankModel.findOne({ day: today, vestigeId, roleId: attackInfo.roleId }).lean();
|
||||
let defData = await GVGVestigeRankModel.findOne({ day: today, vestigeId, roleId: defenseInfo.roleId }).lean();
|
||||
if(isSuccess && atkData && defData && (atkData.rank == 0 || atkData.rank > defData.rank)) {
|
||||
newAtkData = await GVGVestigeRankModel.findOneAndUpdate({ roleId: attackInfo.roleId }, { $set: { rank: defData.rank, oldRank: atkData.rank } }, { new: true, session }).lean();
|
||||
newDefData = await GVGVestigeRankModel.findOneAndUpdate({ roleId: defenseInfo.roleId }, { $set: { rank: atkData.rank, oldRank: defData.rank } }, { new: true, session }).lean();
|
||||
newAtkData = await GVGVestigeRankModel.findOneAndUpdate({ day: today, vestigeId, roleId: attackInfo.roleId }, { $set: { rank: defData.rank, oldRank: atkData.rank } }, { new: true, session }).lean();
|
||||
newDefData = await GVGVestigeRankModel.findOneAndUpdate({ day: today, vestigeId, roleId: defenseInfo.roleId }, { $set: { rank: atkData.rank, oldRank: defData.rank } }, { new: true, session }).lean();
|
||||
isChange = true;
|
||||
endTime = Date.now();
|
||||
} else {
|
||||
|
||||
@@ -12,6 +12,9 @@ export default class GVGVestigeSumRank extends BaseModel {
|
||||
@prop({ required: true })
|
||||
roleId: string; // 玩家id
|
||||
|
||||
@prop({ required: true })
|
||||
leagueCode: string; // 联军id
|
||||
|
||||
@prop({ required: true })
|
||||
groupId: number; // 战区id
|
||||
|
||||
@@ -21,26 +24,36 @@ export default class GVGVestigeSumRank extends BaseModel {
|
||||
@prop({ required: true })
|
||||
score: number; // 得分
|
||||
|
||||
public static async incScore(roleId: string, groupId: number, serverType: number, inc: number) {
|
||||
public static async incScore(roleId: string, leagueCode: string, groupId: number, serverType: number, inc: number) {
|
||||
let today = getZeroPoint();
|
||||
let result: GVGVestigeSumRankType = await GVGVestigeSumRankModel.findOneAndUpdate({
|
||||
day: today, groupId, serverType, roleId
|
||||
day: today, groupId, serverType, roleId, leagueCode
|
||||
}, { $inc: { score: inc } }, { new: true, upsert: true }).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
// 排行榜
|
||||
public static async findRank(): Promise<{ _id: { groupId: number, serverType: number }, arr: { roleId: string, score: number, updatedAt: Date }[], roleIds: string[] }[]> {
|
||||
public static async findRankByGroupId(): Promise<{ _id: { groupId: number, serverType: number }, arr: { roleId: string, score: number, updatedAt: Date }[], roleIds: string[] }[]> {
|
||||
let today = getZeroPoint();
|
||||
let ranks = await GVGVestigeSumRankModel.aggregate([
|
||||
{ $match: { day: today } },
|
||||
{ $group: {
|
||||
_id: { groupId: "$groupId", serverType: "$serverType" },
|
||||
arr: { $push: { roleId: "$roleId", score: "$score", updatedAt: "$updatedAt" } }, roleIds: { $addToSet: "$roleId" }
|
||||
arr: { $push: { roleId: "$roleId", score: "$score", updatedAt: "$updatedAt", leagueCode: "$leagueCode" } }, roleIds: { $addToSet: "$roleId" }
|
||||
}},
|
||||
]);
|
||||
return ranks;
|
||||
}
|
||||
|
||||
// 用于快照玩家的得分
|
||||
public static async findAllScores() {
|
||||
let today = getZeroPoint();
|
||||
let ranks: GVGVestigeSumRankType[] = await GVGVestigeSumRankModel.aggregate([
|
||||
{ $match: { day: today } },
|
||||
{ $project: { roleId: 1, score: 1, leagueCode: 1 } }
|
||||
]);
|
||||
return ranks;
|
||||
}
|
||||
}
|
||||
|
||||
export const GVGVestigeSumRankModel = getModelForClass(GVGVestigeSumRank);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { prop } from "@typegoose/typegoose";
|
||||
import { ArtifactModelType } from "../../db/Artifact";
|
||||
import { GVGLeagueType } from "../../db/GVGLeague";
|
||||
import { GVGVestigeRecType } from "../../db/GVGVestigeRec";
|
||||
import { HeroType, Talent } from "../../db/Hero";
|
||||
import { RoleType } from "../../db/Role";
|
||||
@@ -75,6 +76,8 @@ export class OppPlayerInfo {
|
||||
@prop({ required: true })
|
||||
roleName: string = GVG.GVG_ROBOT_NAME; // 角色 名
|
||||
@prop({ required: true })
|
||||
leagueName: string = ''; // 联军名
|
||||
@prop({ required: true })
|
||||
leagueCode: string = ''; // 联军id
|
||||
@prop({ required: true, default: 0 })
|
||||
lv: number = 1; // 等级
|
||||
@@ -95,7 +98,7 @@ export class OppPlayerInfo {
|
||||
@prop({ required: true })
|
||||
isRobot: boolean = false; // 原排名
|
||||
|
||||
initByPlayer(rank: number, role: RoleType, leagueCode: string, isSuccess: boolean ) {
|
||||
initByPlayer(rank: number, role: RoleType, league: GVGLeagueType, isSuccess: boolean ) {
|
||||
this.oldRank = rank;
|
||||
this.newRank = rank;
|
||||
this.roleId = role.roleId;
|
||||
@@ -107,7 +110,8 @@ export class OppPlayerInfo {
|
||||
this.lv = role.lv;
|
||||
this.isSuccess = isSuccess;
|
||||
this.isRobot = false;
|
||||
this.leagueCode = leagueCode;
|
||||
this.leagueCode = league.leagueCode;
|
||||
this.leagueName = league.name;
|
||||
}
|
||||
|
||||
setPlayerHeroes(heroes: HeroType[], lineup: {actorId: number, dataId: number, order: number}[]) {
|
||||
@@ -228,6 +232,7 @@ export class OppDetailData{
|
||||
setByPlayer(dicWarJson: DicWarJson[], defenseHeroes: OppPlayerHeroInfo[], heroes: HeroType[], artifacts: ArtifactModelType[]) {
|
||||
for(let warJson of dicWarJson) {
|
||||
let defenseHero = defenseHeroes.find(cur => cur.dataId == warJson.dataId);
|
||||
if(!defenseHero) continue;
|
||||
let curHero = heroes.find(cur => cur.hid == defenseHero.hid);
|
||||
let hero = new OppDetailHeroData(warJson, defenseHero, curHero, artifacts);
|
||||
this.heroes.push(hero);
|
||||
|
||||
@@ -127,7 +127,7 @@ import { dicGVGContributeBox, loadGVGContributeBox } from './dictionary/DicGVGCo
|
||||
import { dicGVGArea, dicGVGCity, loadGVGArea } from './dictionary/DicGVGArea';
|
||||
import { dicGVGCityAdd, loadGVGCityAdd } from './dictionary/DicGVGCityAdd';
|
||||
import { dicGVGTask, dicGVGTaskByType, loadGVGTask } from './dictionary/DicGVGTask';
|
||||
import { dicGVGVestigeByType, loadGVGVestigeType } from './dictionary/DicGVGVestigeType';
|
||||
import { dicGVGVestigeByType, dicGVGVestigeName, loadGVGVestigeType } from './dictionary/DicGVGVestigeType';
|
||||
import { dicGVGVestige, loadGVGVestige } from './dictionary/DicGVGVestige';
|
||||
import { DicGVGVestigeRange, dicGVGVestigeRange, loadGVGVestigeRange } from './dictionary/DicGVGVestigeRange';
|
||||
import { DicGVGVestigeLeagueRank, dicGVGVestigeLeagueRank, loadGVGVestigeLeagueRank } from "./dictionary/DicGVGVestigeLeagueRank";
|
||||
@@ -329,6 +329,7 @@ export const gameData = {
|
||||
gvgVestige: dicGVGVestige,
|
||||
gvgVestigeRange: dicGVGVestigeRange,
|
||||
gvgVestigeLeagueRank: dicGVGVestigeLeagueRank,
|
||||
gvgVestigeName: dicGVGVestigeName,
|
||||
};
|
||||
|
||||
// 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据
|
||||
|
||||
@@ -376,7 +376,7 @@ export const GVG = {
|
||||
GVG_LEAGUE_COMPOSE: 3, // 一个联军有最多多少军团组成
|
||||
GVG_CROSS_SERVICE_STARTTIME: 4, // 开服几周后开始跨服玩法
|
||||
GVG_ROLE_TOTAL_RATIO: 1.2, // 贤臣+猛将总人数上限系数
|
||||
GVG_ROLE_RATIO: 1.2, // 贤臣/猛将各职能选择人数上限系数
|
||||
GVG_ROLE_RATIO: 1, // 贤臣/猛将各职能选择人数上限系数
|
||||
GVG_PRODUCER_GET: '10&4|11&2', // 贤臣每天发多少令
|
||||
GVG_FIGHTER_GET: '10&2|11&4', // 猛将每天发多少令
|
||||
GVG_LEAGUE_TECH_LIST: 3, // 科技树解锁队列数量
|
||||
@@ -394,7 +394,9 @@ export const GVG = {
|
||||
GVG_FIELD_TYPE_RATIO: '1&5%|2&10%|3&10%', // 全联盟的特殊格子上限百分比(a%的格子为小麦这个)1&a|2&b|3&c
|
||||
GVG_SP_FIELD_RATIO: '10%&30%', // 分配给玩家的时候有多少特殊格子 min&max 填最大最小百分比即可
|
||||
GVG_REFRESH_TIME: 5, // 0
|
||||
GVG_ROBOT_NAME: '遗迹守护者', // 0,
|
||||
GVG_VESTIGE_PREPARE_COUNTDOWN: 120, //
|
||||
GVG_VESTIGE_BATTLE_COUNTDOWN: 300, //
|
||||
GVG_ROBOT_NAME: '遗迹守卫', // 0
|
||||
GVG_SINGLE_SERVICE_CITY: '1&2&3', // 单服城池
|
||||
GVG_CROSS_SERVICE_CITY: '4&5&6&7&8&9&10&11&12&13', // 跨服城池
|
||||
GVG_VESTIGE_PREPARE_COUNTDOWN: 120, // 遗迹准备界面倒计时(s)
|
||||
GVG_VESTIGE_BATTLE_COUNTDOWN: 300, // 遗迹战斗界面倒计时(s)
|
||||
};
|
||||
|
||||
@@ -14,6 +14,7 @@ export interface DicGVGVestigeType {
|
||||
}
|
||||
|
||||
export const dicGVGVestigeByType = new Map<number, DicGVGVestigeType[]>(); // 地图类型 => 遗迹id
|
||||
export const dicGVGVestigeName = new Map<number, string>(); // 遗迹地图名
|
||||
export function loadGVGVestigeType() {
|
||||
dicGVGVestigeByType.clear();
|
||||
|
||||
@@ -26,6 +27,7 @@ export function loadGVGVestigeType() {
|
||||
}
|
||||
dicGVGVestigeByType.get(type)?.push(o);
|
||||
}
|
||||
dicGVGVestigeName.set(o.vestigeId, o.name);
|
||||
});
|
||||
arr = undefined;
|
||||
}
|
||||
@@ -269,7 +269,7 @@
|
||||
"id": 38,
|
||||
"title": "&",
|
||||
"sendName": "您忠诚的小跟班",
|
||||
"content": "帮收",
|
||||
"content": "亲爱的主公,联军伙伴们已帮忙收取您在领地农田中的成熟粮食,您的种植奖励已发送至邮箱,请查收",
|
||||
"time": 720
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user