init
This commit is contained in:
@@ -1,220 +1,220 @@
|
||||
// 存在激战期的内存数据
|
||||
|
||||
import { GVG_CATAPULT } from "../../consts";
|
||||
import { GVGTeamType } from "../../db/GVGTeam";
|
||||
import { GVGTeamMem } from "../../domain/battleField/gvgBattle";
|
||||
|
||||
export class GVGBattleData {
|
||||
public groupKey: string; // 战区
|
||||
|
||||
private teams: Map<string, GVGTeamMem> = new Map(); // 队伍, teamCode => team
|
||||
public rolePoints: Map<string, Map<number, string>> = new Map(); // roleId => pointId[],用于更新玩家的积分
|
||||
private roleToTeam: Map<string, string[]> = new Map(); // roleId => teamCode
|
||||
private leagueToTeam: Map<string, Set<string>> = new Map(); // leagueCode => teamCode
|
||||
public areaToTeams: Map<number, Set<string>> = new Map(); // areaId => teamCode set,用于定时下发地图玩家数据
|
||||
private leagueActiveTech: Map<string, number[]> = new Map(); // 千机阁状态 leagueCode => activeTech
|
||||
|
||||
constructor(groupKey: string) {
|
||||
this.groupKey = groupKey;
|
||||
}
|
||||
|
||||
public findTeamsByArea(areaId: number, count: number) {
|
||||
let teamCodes = this.areaToTeams.get(areaId)||new Set();
|
||||
let otherTeams: GVGTeamMem[] = [], robots: GVGTeamMem[] = [], points: GVGTeamMem[] = [];
|
||||
for(let teamCode of teamCodes) {
|
||||
let team = this.teams.get(teamCode);
|
||||
if(team && !team.isBroken) {
|
||||
if(team.pointId > 0) { points.push(team); continue; }
|
||||
if(team.isRobot) { robots.push(team); continue; }
|
||||
otherTeams.push(team);
|
||||
}
|
||||
}
|
||||
let teams = [...points, ...robots, ...otherTeams];
|
||||
return teams.slice(0, count);
|
||||
}
|
||||
|
||||
public findCatapultAttackTeam(areaId: number, leagueCode: string) {
|
||||
let teams: GVGTeamMem[] = [];
|
||||
let teamCodes = this.areaToTeams.get(areaId)||new Set();
|
||||
for(let teamCode of teamCodes) {
|
||||
let team = this.teams.get(teamCode);
|
||||
if(team && team.leagueCode != leagueCode && !team.isRobot) teams.push(team);
|
||||
}
|
||||
return teams;
|
||||
}
|
||||
|
||||
public leaveCity(roleId: string) {
|
||||
let teamCodes = this.roleToTeam.get(roleId)||[];
|
||||
for(let teamCode of teamCodes) {
|
||||
let team = this.teams.get(teamCode);
|
||||
if(team) team.setCity(0);
|
||||
for(let [_areaId, teamSet] of this.areaToTeams) {
|
||||
if(teamSet.has(teamCode)) teamSet.delete(teamCode);
|
||||
}
|
||||
if(team.leagueCode && this.leagueToTeam.has(team.leagueCode))
|
||||
this.leagueToTeam.get(team.leagueCode).delete(teamCode);
|
||||
}
|
||||
this.rolePoints.delete(roleId);
|
||||
}
|
||||
|
||||
public enterCity(...teams: GVGTeamType[]) {
|
||||
for(let team of teams) {
|
||||
let fromAreaId = this.teams.get(team.teamCode)?.areaId||0;
|
||||
|
||||
if(!this.teams.has(team.teamCode)) {
|
||||
this.teams.set(team.teamCode, new GVGTeamMem(team))
|
||||
} else {
|
||||
this.teams.get(team.teamCode).updateTeam(team);
|
||||
}
|
||||
this.teams.get(team.teamCode).setCity(team.cityId, team.areaId, team.pointId);
|
||||
if(team.pointId > 0 && !team.isRobot) {
|
||||
if(!this.rolePoints.has(team.roleId)) this.rolePoints.set(team.roleId, new Map());
|
||||
for(let [pointId, teamCode] of this.rolePoints.get(team.roleId)) {
|
||||
if(teamCode == team.teamCode) this.rolePoints.get(team.roleId).delete(pointId);
|
||||
}
|
||||
this.rolePoints.get(team.roleId).set(team.pointId, team.teamCode);
|
||||
}
|
||||
let teamCodesOfRole = this.roleToTeam.get(team.roleId)||[];
|
||||
if(teamCodesOfRole.indexOf(team.teamCode) == -1) teamCodesOfRole.push(team.teamCode);
|
||||
this.roleToTeam.set(team.roleId, teamCodesOfRole);
|
||||
if(team.leagueCode) {
|
||||
if(!this.leagueToTeam.has(team.leagueCode)) {
|
||||
this.leagueToTeam.set(team.leagueCode, new Set());
|
||||
}
|
||||
if(!this.leagueToTeam.get(team.leagueCode).has(team.teamCode))
|
||||
this.leagueToTeam.get(team.leagueCode).add(team.teamCode);
|
||||
}
|
||||
|
||||
this.setAreaMap(team.teamCode, fromAreaId, team.areaId, 'enterCity');
|
||||
}
|
||||
}
|
||||
|
||||
private setAreaMap(teamCode: string, fromAreaId: number, toAreaId: number, fromFun) {
|
||||
if(fromAreaId == toAreaId) return;
|
||||
// console.log('#### gvgBattleMemory setAreaMap', 'teamCode:', teamCode, 'fromAreaId: ', fromAreaId, 'toAreaId:', toAreaId, 'appid', pinus.app.getServerId(), 'from', fromFun)
|
||||
let fromAreaSet = this.areaToTeams.get(fromAreaId);
|
||||
if(fromAreaSet && fromAreaSet.has(teamCode)) fromAreaSet.delete(teamCode);
|
||||
|
||||
if(!this.areaToTeams.has(toAreaId)) {
|
||||
this.areaToTeams.set(toAreaId, new Set());
|
||||
}
|
||||
if(!this.areaToTeams.get(toAreaId).has(teamCode)) {
|
||||
this.areaToTeams.get(toAreaId).add(teamCode);
|
||||
}
|
||||
}
|
||||
|
||||
private setRolePoints(roleId: string, fromPointId: number, pointId: number, teamCode: string) {
|
||||
if(fromPointId > 0) { // 被打得撤离积分点
|
||||
if(this.rolePoints.has(roleId) && this.rolePoints.get(roleId).has(fromPointId)) {
|
||||
this.rolePoints.get(roleId).delete(fromPointId);
|
||||
}
|
||||
}
|
||||
if (pointId > 0) {
|
||||
if(!this.rolePoints.has(roleId)) this.rolePoints.set(roleId, new Map());
|
||||
this.rolePoints.get(roleId).set(pointId, teamCode);
|
||||
}
|
||||
}
|
||||
|
||||
public move(teamCode: string, areaId: number, fromAreaId: number, startMoveTime: number, stopMoveTime: number) {
|
||||
let team = this.teams.get(teamCode);
|
||||
if(!team) return;
|
||||
team.moveToArea(areaId, fromAreaId, startMoveTime, stopMoveTime);
|
||||
this.setAreaMap(teamCode, fromAreaId, areaId, 'move');
|
||||
}
|
||||
|
||||
public setTime(teamCode: string, teamUpdate: GVGTeamType) {
|
||||
let team = this.teams.get(teamCode);
|
||||
if(!team) return;
|
||||
team.attackTime = teamUpdate.attackTime;
|
||||
team.defenseTime = teamUpdate.defenseTime;
|
||||
}
|
||||
|
||||
// 队伍入驻积分点
|
||||
public teamSettle(roleId: string, teamCode: string, pointId: number) {
|
||||
let teamMem = this.teams.get(teamCode);
|
||||
if(!teamMem) return;
|
||||
let { pointId: fromPointId } = teamMem;
|
||||
this.setRolePoints(roleId, fromPointId, pointId, teamCode);
|
||||
teamMem.pointId = pointId;
|
||||
}
|
||||
|
||||
// 关卡结算
|
||||
public battleEnd(teams: GVGTeamType[]) {
|
||||
for(let team of teams) {
|
||||
let teamMem = this.teams.get(team.teamCode);
|
||||
if(!teamMem) { // 基本不会有没有这个内存的情况,有的话就让他重新计算一次吧
|
||||
this.enterCity(team); continue;
|
||||
}
|
||||
let { curTeamBreak, pointId } = team;
|
||||
let { areaId: fromAreaId, pointId: originPointId } = teamMem;
|
||||
teamMem.updateTeam(team);
|
||||
this.setRolePoints(team.roleId, originPointId, curTeamBreak? 0: pointId, team.teamCode);
|
||||
this.setAreaMap(team.teamCode, fromAreaId, team.areaId, 'battleEnd');
|
||||
}
|
||||
}
|
||||
|
||||
// 投石车
|
||||
public findCatapult() {
|
||||
return this.findTeamsByRole(GVG_CATAPULT);
|
||||
}
|
||||
|
||||
public findTeamsByRole(roleId: string) {
|
||||
let teamCodes = this.roleToTeam.get(roleId)||[];
|
||||
return teamCodes.map(teamCode => this.teams.get(teamCode));
|
||||
}
|
||||
|
||||
// 积分点情况
|
||||
public findSettledPoint() {
|
||||
let teams: GVGTeamMem[] = [];
|
||||
for(let [_roleId, pointIds] of this.rolePoints) {
|
||||
for(let [pointId, teamCode] of pointIds) {
|
||||
let team = this.teams.get(teamCode);
|
||||
if(pointId > 0 && team) teams.push(team);
|
||||
}
|
||||
}
|
||||
return teams;
|
||||
}
|
||||
|
||||
public findSettledPointMapByLeague(cityId: number) {
|
||||
let pointByLeague = new Map<string, number[]>();
|
||||
for(let [_roleId, pointIds] of this.rolePoints) {
|
||||
for(let [pointId, teamCode] of pointIds) {
|
||||
let team = this.teams.get(teamCode);
|
||||
if(pointId > 0 && team && team.leagueCode && team.cityId == cityId) {
|
||||
if(!pointByLeague.has(team.leagueCode)) pointByLeague.set(team.leagueCode, []);
|
||||
pointByLeague.get(team.leagueCode).push(team.pointId);
|
||||
};
|
||||
}
|
||||
}
|
||||
return pointByLeague;
|
||||
}
|
||||
|
||||
public findAreas() {
|
||||
return this.areaToTeams.keys();
|
||||
}
|
||||
|
||||
public updateLeagueInfo(leagueCode: string, leagueName: string) {
|
||||
let teamCodes = this.leagueToTeam.get(leagueCode)||new Set();
|
||||
for(let teamCode of teamCodes) {
|
||||
let team = this.teams.get(teamCode);
|
||||
team.leagueName = leagueName;
|
||||
}
|
||||
}
|
||||
|
||||
public updateRoleInfo(roleId: string, info: { roleName?: string, lv?: number }) {
|
||||
let teamCodes = this.leagueToTeam.get(roleId)||new Set();
|
||||
for(let teamCode of teamCodes) {
|
||||
let team = this.teams.get(teamCode);
|
||||
if(info.roleName) team.roleName = info.roleName;
|
||||
if(info.lv) team.lv = info.lv;
|
||||
}
|
||||
}
|
||||
|
||||
public getLeagueTech(leagueCode: string) {
|
||||
return this.leagueActiveTech.get(leagueCode);
|
||||
}
|
||||
|
||||
public setLeagueTech(leagueCode: string, activeTech: number[]) {
|
||||
this.leagueActiveTech.set(leagueCode, activeTech);
|
||||
}
|
||||
}
|
||||
// 存在激战期的内存数据
|
||||
|
||||
import { GVG_CATAPULT } from "@consts";
|
||||
import { GVGTeamType } from "@db/GVGTeam";
|
||||
import { GVGTeamMem } from "@domain/battleField/gvgBattle";
|
||||
|
||||
export class GVGBattleData {
|
||||
public groupKey: string; // 战区
|
||||
|
||||
private teams: Map<string, GVGTeamMem> = new Map(); // 队伍, teamCode => team
|
||||
public rolePoints: Map<string, Map<number, string>> = new Map(); // roleId => pointId[],用于更新玩家的积分
|
||||
private roleToTeam: Map<string, string[]> = new Map(); // roleId => teamCode
|
||||
private leagueToTeam: Map<string, Set<string>> = new Map(); // leagueCode => teamCode
|
||||
public areaToTeams: Map<number, Set<string>> = new Map(); // areaId => teamCode set,用于定时下发地图玩家数据
|
||||
private leagueActiveTech: Map<string, number[]> = new Map(); // 千机阁状态 leagueCode => activeTech
|
||||
|
||||
constructor(groupKey: string) {
|
||||
this.groupKey = groupKey;
|
||||
}
|
||||
|
||||
public findTeamsByArea(areaId: number, count: number) {
|
||||
let teamCodes = this.areaToTeams.get(areaId)||new Set();
|
||||
let otherTeams: GVGTeamMem[] = [], robots: GVGTeamMem[] = [], points: GVGTeamMem[] = [];
|
||||
for(let teamCode of teamCodes) {
|
||||
let team = this.teams.get(teamCode);
|
||||
if(team && !team.isBroken) {
|
||||
if(team.pointId > 0) { points.push(team); continue; }
|
||||
if(team.isRobot) { robots.push(team); continue; }
|
||||
otherTeams.push(team);
|
||||
}
|
||||
}
|
||||
let teams = [...points, ...robots, ...otherTeams];
|
||||
return teams.slice(0, count);
|
||||
}
|
||||
|
||||
public findCatapultAttackTeam(areaId: number, leagueCode: string) {
|
||||
let teams: GVGTeamMem[] = [];
|
||||
let teamCodes = this.areaToTeams.get(areaId)||new Set();
|
||||
for(let teamCode of teamCodes) {
|
||||
let team = this.teams.get(teamCode);
|
||||
if(team && team.leagueCode != leagueCode && !team.isRobot) teams.push(team);
|
||||
}
|
||||
return teams;
|
||||
}
|
||||
|
||||
public leaveCity(roleId: string) {
|
||||
let teamCodes = this.roleToTeam.get(roleId)||[];
|
||||
for(let teamCode of teamCodes) {
|
||||
let team = this.teams.get(teamCode);
|
||||
if(team) team.setCity(0);
|
||||
for(let [_areaId, teamSet] of this.areaToTeams) {
|
||||
if(teamSet.has(teamCode)) teamSet.delete(teamCode);
|
||||
}
|
||||
if(team.leagueCode && this.leagueToTeam.has(team.leagueCode))
|
||||
this.leagueToTeam.get(team.leagueCode).delete(teamCode);
|
||||
}
|
||||
this.rolePoints.delete(roleId);
|
||||
}
|
||||
|
||||
public enterCity(...teams: GVGTeamType[]) {
|
||||
for(let team of teams) {
|
||||
let fromAreaId = this.teams.get(team.teamCode)?.areaId||0;
|
||||
|
||||
if(!this.teams.has(team.teamCode)) {
|
||||
this.teams.set(team.teamCode, new GVGTeamMem(team))
|
||||
} else {
|
||||
this.teams.get(team.teamCode).updateTeam(team);
|
||||
}
|
||||
this.teams.get(team.teamCode).setCity(team.cityId, team.areaId, team.pointId);
|
||||
if(team.pointId > 0 && !team.isRobot) {
|
||||
if(!this.rolePoints.has(team.roleId)) this.rolePoints.set(team.roleId, new Map());
|
||||
for(let [pointId, teamCode] of this.rolePoints.get(team.roleId)) {
|
||||
if(teamCode == team.teamCode) this.rolePoints.get(team.roleId).delete(pointId);
|
||||
}
|
||||
this.rolePoints.get(team.roleId).set(team.pointId, team.teamCode);
|
||||
}
|
||||
let teamCodesOfRole = this.roleToTeam.get(team.roleId)||[];
|
||||
if(teamCodesOfRole.indexOf(team.teamCode) == -1) teamCodesOfRole.push(team.teamCode);
|
||||
this.roleToTeam.set(team.roleId, teamCodesOfRole);
|
||||
if(team.leagueCode) {
|
||||
if(!this.leagueToTeam.has(team.leagueCode)) {
|
||||
this.leagueToTeam.set(team.leagueCode, new Set());
|
||||
}
|
||||
if(!this.leagueToTeam.get(team.leagueCode).has(team.teamCode))
|
||||
this.leagueToTeam.get(team.leagueCode).add(team.teamCode);
|
||||
}
|
||||
|
||||
this.setAreaMap(team.teamCode, fromAreaId, team.areaId, 'enterCity');
|
||||
}
|
||||
}
|
||||
|
||||
private setAreaMap(teamCode: string, fromAreaId: number, toAreaId: number, fromFun) {
|
||||
if(fromAreaId == toAreaId) return;
|
||||
// console.log('#### gvgBattleMemory setAreaMap', 'teamCode:', teamCode, 'fromAreaId: ', fromAreaId, 'toAreaId:', toAreaId, 'appid', pinus.app.getServerId(), 'from', fromFun)
|
||||
let fromAreaSet = this.areaToTeams.get(fromAreaId);
|
||||
if(fromAreaSet && fromAreaSet.has(teamCode)) fromAreaSet.delete(teamCode);
|
||||
|
||||
if(!this.areaToTeams.has(toAreaId)) {
|
||||
this.areaToTeams.set(toAreaId, new Set());
|
||||
}
|
||||
if(!this.areaToTeams.get(toAreaId).has(teamCode)) {
|
||||
this.areaToTeams.get(toAreaId).add(teamCode);
|
||||
}
|
||||
}
|
||||
|
||||
private setRolePoints(roleId: string, fromPointId: number, pointId: number, teamCode: string) {
|
||||
if(fromPointId > 0) { // 被打得撤离积分点
|
||||
if(this.rolePoints.has(roleId) && this.rolePoints.get(roleId).has(fromPointId)) {
|
||||
this.rolePoints.get(roleId).delete(fromPointId);
|
||||
}
|
||||
}
|
||||
if (pointId > 0) {
|
||||
if(!this.rolePoints.has(roleId)) this.rolePoints.set(roleId, new Map());
|
||||
this.rolePoints.get(roleId).set(pointId, teamCode);
|
||||
}
|
||||
}
|
||||
|
||||
public move(teamCode: string, areaId: number, fromAreaId: number, startMoveTime: number, stopMoveTime: number) {
|
||||
let team = this.teams.get(teamCode);
|
||||
if(!team) return;
|
||||
team.moveToArea(areaId, fromAreaId, startMoveTime, stopMoveTime);
|
||||
this.setAreaMap(teamCode, fromAreaId, areaId, 'move');
|
||||
}
|
||||
|
||||
public setTime(teamCode: string, teamUpdate: GVGTeamType) {
|
||||
let team = this.teams.get(teamCode);
|
||||
if(!team) return;
|
||||
team.attackTime = teamUpdate.attackTime;
|
||||
team.defenseTime = teamUpdate.defenseTime;
|
||||
}
|
||||
|
||||
// 队伍入驻积分点
|
||||
public teamSettle(roleId: string, teamCode: string, pointId: number) {
|
||||
let teamMem = this.teams.get(teamCode);
|
||||
if(!teamMem) return;
|
||||
let { pointId: fromPointId } = teamMem;
|
||||
this.setRolePoints(roleId, fromPointId, pointId, teamCode);
|
||||
teamMem.pointId = pointId;
|
||||
}
|
||||
|
||||
// 关卡结算
|
||||
public battleEnd(teams: GVGTeamType[]) {
|
||||
for(let team of teams) {
|
||||
let teamMem = this.teams.get(team.teamCode);
|
||||
if(!teamMem) { // 基本不会有没有这个内存的情况,有的话就让他重新计算一次吧
|
||||
this.enterCity(team); continue;
|
||||
}
|
||||
let { curTeamBreak, pointId } = team;
|
||||
let { areaId: fromAreaId, pointId: originPointId } = teamMem;
|
||||
teamMem.updateTeam(team);
|
||||
this.setRolePoints(team.roleId, originPointId, curTeamBreak? 0: pointId, team.teamCode);
|
||||
this.setAreaMap(team.teamCode, fromAreaId, team.areaId, 'battleEnd');
|
||||
}
|
||||
}
|
||||
|
||||
// 投石车
|
||||
public findCatapult() {
|
||||
return this.findTeamsByRole(GVG_CATAPULT);
|
||||
}
|
||||
|
||||
public findTeamsByRole(roleId: string) {
|
||||
let teamCodes = this.roleToTeam.get(roleId)||[];
|
||||
return teamCodes.map(teamCode => this.teams.get(teamCode));
|
||||
}
|
||||
|
||||
// 积分点情况
|
||||
public findSettledPoint() {
|
||||
let teams: GVGTeamMem[] = [];
|
||||
for(let [_roleId, pointIds] of this.rolePoints) {
|
||||
for(let [pointId, teamCode] of pointIds) {
|
||||
let team = this.teams.get(teamCode);
|
||||
if(pointId > 0 && team) teams.push(team);
|
||||
}
|
||||
}
|
||||
return teams;
|
||||
}
|
||||
|
||||
public findSettledPointMapByLeague(cityId: number) {
|
||||
let pointByLeague = new Map<string, number[]>();
|
||||
for(let [_roleId, pointIds] of this.rolePoints) {
|
||||
for(let [pointId, teamCode] of pointIds) {
|
||||
let team = this.teams.get(teamCode);
|
||||
if(pointId > 0 && team && team.leagueCode && team.cityId == cityId) {
|
||||
if(!pointByLeague.has(team.leagueCode)) pointByLeague.set(team.leagueCode, []);
|
||||
pointByLeague.get(team.leagueCode).push(team.pointId);
|
||||
};
|
||||
}
|
||||
}
|
||||
return pointByLeague;
|
||||
}
|
||||
|
||||
public findAreas() {
|
||||
return this.areaToTeams.keys();
|
||||
}
|
||||
|
||||
public updateLeagueInfo(leagueCode: string, leagueName: string) {
|
||||
let teamCodes = this.leagueToTeam.get(leagueCode)||new Set();
|
||||
for(let teamCode of teamCodes) {
|
||||
let team = this.teams.get(teamCode);
|
||||
team.leagueName = leagueName;
|
||||
}
|
||||
}
|
||||
|
||||
public updateRoleInfo(roleId: string, info: { roleName?: string, lv?: number }) {
|
||||
let teamCodes = this.leagueToTeam.get(roleId)||new Set();
|
||||
for(let teamCode of teamCodes) {
|
||||
let team = this.teams.get(teamCode);
|
||||
if(info.roleName) team.roleName = info.roleName;
|
||||
if(info.lv) team.lv = info.lv;
|
||||
}
|
||||
}
|
||||
|
||||
public getLeagueTech(leagueCode: string) {
|
||||
return this.leagueActiveTech.get(leagueCode);
|
||||
}
|
||||
|
||||
public setLeagueTech(leagueCode: string, activeTech: number[]) {
|
||||
this.leagueActiveTech.set(leagueCode, activeTech);
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,106 +1,106 @@
|
||||
import { GVG_RETURN_ITEM_TYPE, ITEM_CHANGE_REASON, LEAGUE_ITEM_REFRESH_TYPE, GVG_ITEM, PUSH_ROUTE } from "../../consts";
|
||||
import { GVGUserItemModel } from "../../db/GVGUserItem";
|
||||
import { gameData } from "../../pubUtils/data";
|
||||
import { RewardInter } from "../../pubUtils/interface";
|
||||
import { saveGVGItemChangeLog } from "../../pubUtils/logUtil";
|
||||
import { DAY_TO_SECOND, getZeroPoint, getFutureTime } from "../../pubUtils/timeUtil";
|
||||
import { sendMessageToUserWithSuc } from "../pushService";
|
||||
import { addItems, handleCost } from "../role/rewardService";
|
||||
import { getGVGConfig } from "./gvgService";
|
||||
|
||||
/**
|
||||
* 获取道具(必须在guild进程下使用)
|
||||
* @param roleId
|
||||
* @param roleName
|
||||
* @param leagueCode
|
||||
* @param sid
|
||||
* @param leagueItems GVG内专用道具
|
||||
* @param items 普通道具
|
||||
* @param reason
|
||||
* @returns
|
||||
*/
|
||||
export async function addGVGReward(roleId: string, roleName: string, leagueCode: string, sid: string, leagueItems: RewardInter[], items: RewardInter[], reason: ITEM_CHANGE_REASON) {
|
||||
let returnGoods: { id: number, count: number, itemType: number }[] = [], pushGoods: { id: number, count: number, expireTime: number, inc: number, reason: number }[] = [];
|
||||
let { configId } = getGVGConfig();
|
||||
if(items.length > 0) {
|
||||
const goods = await addItems(roleId, roleName, sid, items, reason);
|
||||
for(let { id, count } of goods) {
|
||||
returnGoods.push({ id, count, itemType: GVG_RETURN_ITEM_TYPE.NORMAL_ITEM });
|
||||
}
|
||||
}
|
||||
for(let { id, count } of leagueItems) {
|
||||
let dicItem = gameData.gvgItem.get(id);
|
||||
if(!dicItem) continue;
|
||||
let item = await GVGUserItemModel.increaseItem(configId, leagueCode, roleId, id, count, getExpireTime(dicItem.refreshType));
|
||||
returnGoods.push({ id, count, itemType: GVG_RETURN_ITEM_TYPE.GVG_ITEM });
|
||||
pushGoods.push({ id, count: item.count, inc: count, expireTime: item.expireTime, reason });
|
||||
}
|
||||
if(pushGoods.length > 0) {
|
||||
await sendMessageToUserWithSuc(roleId, PUSH_ROUTE.LEAGUE_ITEM_UPDATE, { items: pushGoods }, sid);
|
||||
saveGVGItemChangeLog(roleId, leagueCode, pushGoods, reason);
|
||||
}
|
||||
return returnGoods;
|
||||
}
|
||||
|
||||
function getExpireTime(refreshType: number) {
|
||||
if(refreshType == LEAGUE_ITEM_REFRESH_TYPE.DAILY) {
|
||||
return getZeroPoint() + DAY_TO_SECOND;
|
||||
}
|
||||
return getFutureTime();
|
||||
}
|
||||
|
||||
/**
|
||||
* 消耗道具
|
||||
* @param roleId
|
||||
* @param leagueCode
|
||||
* @param sid
|
||||
* @param leagueItems GVG内专用道具
|
||||
* @param items 普通背包道具
|
||||
* @param reason
|
||||
* @returns
|
||||
*/
|
||||
export async function handleGVGCost(roleId: string, leagueCode: string, sid: string, leagueItems: RewardInter[], items: RewardInter[], reason: ITEM_CHANGE_REASON) {
|
||||
let { configId } = getGVGConfig();
|
||||
// 检查本地道具数量
|
||||
const curItems = await GVGUserItemModel.findByRoleAndIds(configId, leagueCode, roleId, leagueItems.map(cur => cur.id));
|
||||
for(let { id, count } of leagueItems) {
|
||||
let curItem = curItems.find(cur => cur.id == id);
|
||||
if(!curItem || curItem.count < count) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
const itemResult = await handleCost(roleId, sid, items, reason);
|
||||
if(!itemResult) return false;
|
||||
|
||||
const decreaseResult = await GVGUserItemModel.decreaseItem(configId, leagueCode, roleId, leagueItems);
|
||||
const pushGoods = decreaseResult.map(item => {
|
||||
let leagueItem = leagueItems.find(cur => cur.id == item.id);
|
||||
return { id: item.id, count: item.count, expireTime: item.expireTime, inc: leagueItem?.count }
|
||||
});
|
||||
if(pushGoods.length > 0) {
|
||||
await sendMessageToUserWithSuc(roleId, PUSH_ROUTE.LEAGUE_ITEM_UPDATE, { items: pushGoods }, sid);
|
||||
saveGVGItemChangeLog(roleId, leagueCode, pushGoods, reason);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
export function getProduceCoinCnt(items: RewardInter[]) {
|
||||
let produceCoinCnt = 0;
|
||||
for(let { id, count } of items) {
|
||||
if(id == GVG_ITEM.PRODUCE_COIN) {
|
||||
produceCoinCnt = count; break;
|
||||
}
|
||||
}
|
||||
return produceCoinCnt;
|
||||
}
|
||||
|
||||
export function combinePushItem(targetItems: RewardInter[], dicItems: RewardInter[]) {
|
||||
for(let { id, count } of dicItems) {
|
||||
let obj = targetItems.find(obj => obj.id == id);
|
||||
if(!obj) {
|
||||
targetItems.push({ id, count });
|
||||
} else {
|
||||
obj.count += count;
|
||||
}
|
||||
}
|
||||
}
|
||||
import { GVG_RETURN_ITEM_TYPE, ITEM_CHANGE_REASON, LEAGUE_ITEM_REFRESH_TYPE, GVG_ITEM, PUSH_ROUTE } from "@consts";
|
||||
import { GVGUserItemModel } from "@db/GVGUserItem";
|
||||
import { gameData } from "@pubUtils/data";
|
||||
import { RewardInter } from "@pubUtils/interface";
|
||||
import { saveGVGItemChangeLog } from "@pubUtils/logUtil";
|
||||
import { DAY_TO_SECOND, getZeroPoint, getFutureTime } from "@pubUtils/timeUtil";
|
||||
import { sendMessageToUserWithSuc } from "../pushService";
|
||||
import { addItems, handleCost } from "../role/rewardService";
|
||||
import { getGVGConfig } from "./gvgService";
|
||||
|
||||
/**
|
||||
* 获取道具(必须在guild进程下使用)
|
||||
* @param roleId
|
||||
* @param roleName
|
||||
* @param leagueCode
|
||||
* @param sid
|
||||
* @param leagueItems GVG内专用道具
|
||||
* @param items 普通道具
|
||||
* @param reason
|
||||
* @returns
|
||||
*/
|
||||
export async function addGVGReward(roleId: string, roleName: string, leagueCode: string, sid: string, leagueItems: RewardInter[], items: RewardInter[], reason: ITEM_CHANGE_REASON) {
|
||||
let returnGoods: { id: number, count: number, itemType: number }[] = [], pushGoods: { id: number, count: number, expireTime: number, inc: number, reason: number }[] = [];
|
||||
let { configId } = getGVGConfig();
|
||||
if(items.length > 0) {
|
||||
const goods = await addItems(roleId, roleName, sid, items, reason);
|
||||
for(let { id, count } of goods) {
|
||||
returnGoods.push({ id, count, itemType: GVG_RETURN_ITEM_TYPE.NORMAL_ITEM });
|
||||
}
|
||||
}
|
||||
for(let { id, count } of leagueItems) {
|
||||
let dicItem = gameData.gvgItem.get(id);
|
||||
if(!dicItem) continue;
|
||||
let item = await GVGUserItemModel.increaseItem(configId, leagueCode, roleId, id, count, getExpireTime(dicItem.refreshType));
|
||||
returnGoods.push({ id, count, itemType: GVG_RETURN_ITEM_TYPE.GVG_ITEM });
|
||||
pushGoods.push({ id, count: item.count, inc: count, expireTime: item.expireTime, reason });
|
||||
}
|
||||
if(pushGoods.length > 0) {
|
||||
await sendMessageToUserWithSuc(roleId, PUSH_ROUTE.LEAGUE_ITEM_UPDATE, { items: pushGoods }, sid);
|
||||
saveGVGItemChangeLog(roleId, leagueCode, pushGoods, reason);
|
||||
}
|
||||
return returnGoods;
|
||||
}
|
||||
|
||||
function getExpireTime(refreshType: number) {
|
||||
if(refreshType == LEAGUE_ITEM_REFRESH_TYPE.DAILY) {
|
||||
return getZeroPoint() + DAY_TO_SECOND;
|
||||
}
|
||||
return getFutureTime();
|
||||
}
|
||||
|
||||
/**
|
||||
* 消耗道具
|
||||
* @param roleId
|
||||
* @param leagueCode
|
||||
* @param sid
|
||||
* @param leagueItems GVG内专用道具
|
||||
* @param items 普通背包道具
|
||||
* @param reason
|
||||
* @returns
|
||||
*/
|
||||
export async function handleGVGCost(roleId: string, leagueCode: string, sid: string, leagueItems: RewardInter[], items: RewardInter[], reason: ITEM_CHANGE_REASON) {
|
||||
let { configId } = getGVGConfig();
|
||||
// 检查本地道具数量
|
||||
const curItems = await GVGUserItemModel.findByRoleAndIds(configId, leagueCode, roleId, leagueItems.map(cur => cur.id));
|
||||
for(let { id, count } of leagueItems) {
|
||||
let curItem = curItems.find(cur => cur.id == id);
|
||||
if(!curItem || curItem.count < count) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
const itemResult = await handleCost(roleId, sid, items, reason);
|
||||
if(!itemResult) return false;
|
||||
|
||||
const decreaseResult = await GVGUserItemModel.decreaseItem(configId, leagueCode, roleId, leagueItems);
|
||||
const pushGoods = decreaseResult.map(item => {
|
||||
let leagueItem = leagueItems.find(cur => cur.id == item.id);
|
||||
return { id: item.id, count: item.count, expireTime: item.expireTime, inc: leagueItem?.count }
|
||||
});
|
||||
if(pushGoods.length > 0) {
|
||||
await sendMessageToUserWithSuc(roleId, PUSH_ROUTE.LEAGUE_ITEM_UPDATE, { items: pushGoods }, sid);
|
||||
saveGVGItemChangeLog(roleId, leagueCode, pushGoods, reason);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
export function getProduceCoinCnt(items: RewardInter[]) {
|
||||
let produceCoinCnt = 0;
|
||||
for(let { id, count } of items) {
|
||||
if(id == GVG_ITEM.PRODUCE_COIN) {
|
||||
produceCoinCnt = count; break;
|
||||
}
|
||||
}
|
||||
return produceCoinCnt;
|
||||
}
|
||||
|
||||
export function combinePushItem(targetItems: RewardInter[], dicItems: RewardInter[]) {
|
||||
for(let { id, count } of dicItems) {
|
||||
let obj = targetItems.find(obj => obj.id == id);
|
||||
if(!obj) {
|
||||
targetItems.push({ id, count });
|
||||
} else {
|
||||
obj.count += count;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,205 +1,205 @@
|
||||
|
||||
// 动态
|
||||
import { CHANNEL_PREFIX, GVG_REC_ID, GVG_REC_TYPE, GVG_RESOURCE_TYPE, MSG_SOURCE, MSG_TYPE, PUSH_ROUTE } from "../../consts";
|
||||
import { GVGBattleRecType } from "../../db/GVGBattleRec";
|
||||
import { GVGLeagueModel, GVGLeagueType } from "../../db/GVGLeague";
|
||||
import { GVGRecModel, GVGRecUpdate } from "../../db/GVGRec";
|
||||
import { GVGVestigeRecType } from "../../db/GVGVestigeRec";
|
||||
import { gameData } from "../../pubUtils/data";
|
||||
import { nowSeconds } from "../../pubUtils/timeUtil";
|
||||
import { createGroupMsg, pushGroupMsgToRoom } from "../chatService";
|
||||
import { sendMessageToUserWithSuc } from "../pushService";
|
||||
import { getGVGConfig } from "./gvgService";
|
||||
|
||||
// 加入军团
|
||||
export async function guildJoinLeagueRecord(leagueCode: string, guildName: string) {
|
||||
await leagueJoinOrQuitGuild(leagueCode, guildName, GVG_REC_ID.LEAGUE_JOIN_GUILD);
|
||||
}
|
||||
|
||||
// 退出军团
|
||||
export async function guildQuitLeagueRecord(leagueCode: string, guildName: string) {
|
||||
await leagueJoinOrQuitGuild(leagueCode, guildName, GVG_REC_ID.LEAGUE_QUIT_GUILD);
|
||||
}
|
||||
|
||||
async function leagueJoinOrQuitGuild(leagueCode: string, guildName: string, recId: GVG_REC_ID.LEAGUE_JOIN_GUILD|GVG_REC_ID.LEAGUE_QUIT_GUILD) {
|
||||
let { configId } = getGVGConfig();
|
||||
let params = [guildName];
|
||||
await GVGRecModel.addRec({ leagueCode, configId, type: GVG_REC_TYPE.PREPARE, recId, createTime: nowSeconds(), params })
|
||||
}
|
||||
|
||||
export async function addLeagueRenameRecord(leagueCode: string, leagueName: string) {
|
||||
let { configId } = getGVGConfig();
|
||||
let params = [leagueName];
|
||||
await GVGRecModel.addRec({ leagueCode, configId, type: GVG_REC_TYPE.PREPARE, recId: GVG_REC_ID.LEAGUE_RENAME, createTime: nowSeconds(), params })
|
||||
}
|
||||
|
||||
// 获得资源
|
||||
export async function addResourceRecord(roleId: string, roleName: string, leagueCode: string, resourceType: GVG_RESOURCE_TYPE, output: number) {
|
||||
let { configId } = getGVGConfig();
|
||||
let params = [roleName, getResourceNameByType(resourceType), `${output}`];
|
||||
await GVGRecModel.addRec({ roleId, leagueCode, configId, type: GVG_REC_TYPE.PREPARE, recId: GVG_REC_ID.ADD_RESOURCE, createTime: nowSeconds(), params })
|
||||
}
|
||||
|
||||
function getResourceNameByType(resourceType: GVG_RESOURCE_TYPE) {
|
||||
switch(resourceType) {
|
||||
case GVG_RESOURCE_TYPE.FOOD: return '粮食';
|
||||
case GVG_RESOURCE_TYPE.MINERAL: return '矿物';
|
||||
case GVG_RESOURCE_TYPE.WOOD: return '木堆';
|
||||
}
|
||||
}
|
||||
|
||||
export async function addVestigeBattleEndRec(rec: GVGVestigeRecType) {
|
||||
if(!rec) return;
|
||||
let { configId, vestigeId, groupKey } = rec;
|
||||
let vestigeName = gameData.gvgVestigeName.get(vestigeId);
|
||||
if(rec.defenseInfo && rec.defenseInfo.isRobot) { // 对手是机器人,驻扎动态
|
||||
let { roleId, roleName, leagueCode, newRank, isSuccess } = rec.attackInfo;
|
||||
if(isSuccess) {
|
||||
let params = [ roleName, vestigeName, `第${newRank}名`];
|
||||
await GVGRecModel.addRec({ roleId, leagueCode, configId, groupKey, type: GVG_REC_TYPE.PREPARE, recId: GVG_REC_ID.SETTLE_POINT, createTime: nowSeconds(), params });
|
||||
}
|
||||
}
|
||||
if(rec.defenseInfo && !rec.defenseInfo.isRobot && rec.attackInfo.leagueCode != rec.defenseInfo.leagueCode) {
|
||||
let { leagueName, newRank, isSuccess } = rec.attackInfo;
|
||||
let { roleId, leagueCode, roleName } = rec.defenseInfo;
|
||||
if(isSuccess) {
|
||||
let params = [ roleName, vestigeName, `第${newRank}名`, leagueName];
|
||||
await GVGRecModel.addRec({ roleId, leagueCode, configId, groupKey, type: GVG_REC_TYPE.PREPARE, recId: GVG_REC_ID.POINT_BE_GRAB, createTime: nowSeconds(), params });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export async function addVestigeLeagueRankRec(configId: number, groupKey: string, ranks: { rank: number, field: string }[]) {
|
||||
await GVGRecModel.addRecs(ranks.map(({ rank, field: leagueCode }) => {
|
||||
let params = [ `第${rank}名`];
|
||||
return { leagueCode, configId, groupKey, type: GVG_REC_TYPE.PREPARE, recId: GVG_REC_ID.VESTIGE_RANK, createTime: nowSeconds(), params };
|
||||
}));
|
||||
}
|
||||
|
||||
export async function addBattleEndRec(rec: GVGBattleRecType) {
|
||||
let { isSuccess, attackTeamAfter: attackTeam, defenseTeamAfter: defenseTeam, configId, groupKey } = rec;
|
||||
let { roleId: defenseRoleId, leagueCode: defenseLeague, cityId, index: defenseIndex, curTeamBreak: defenseBreak, originPointId: defenseOriginPoint, roleName: defenseName } = defenseTeam;
|
||||
let { roleId: attackRoleId, leagueCode: attackLeague, index: attackIndex, roleName: attackName} = attackTeam;
|
||||
|
||||
let params = new GVGRecUpArr(configId, cityId, groupKey, nowSeconds());
|
||||
if(isSuccess) {
|
||||
if(!defenseTeam.isRobot) params.pushRec(defenseRoleId, defenseLeague, GVG_REC_TYPE.BATTLE_BY_ROLE, GVG_REC_ID.TEAM_BE_ATTACKED_FAIL, [attackName, `队伍${defenseIndex}`]);
|
||||
params.pushRec(attackRoleId, attackLeague, GVG_REC_TYPE.BATTLE_BY_ROLE, GVG_REC_ID.TEAM_ATTACK_SUCCESS, [`队伍${attackIndex}`, defenseName]);
|
||||
if(defenseBreak && defenseOriginPoint > 0 ) {
|
||||
if(!defenseTeam.isRobot) {
|
||||
params.pushRec(defenseRoleId, defenseLeague, GVG_REC_TYPE.BATTLE_BY_ROLE, GVG_REC_ID.TEAM_LOST_POINT, [attackName, `队伍${defenseIndex}`, getPointName(defenseOriginPoint)]);
|
||||
}
|
||||
params.pushRec(attackRoleId, attackLeague, GVG_REC_TYPE.BATTLE_BY_ROLE, GVG_REC_ID.TEAM_GET_POINT, [`队伍${attackIndex}`, defenseName, getPointName(defenseOriginPoint)]);
|
||||
}
|
||||
} else {
|
||||
if(!defenseTeam.isRobot) params.pushRec(defenseRoleId, defenseLeague, GVG_REC_TYPE.BATTLE_BY_ROLE, GVG_REC_ID.TEAM_BE_ATTACKED_SUCCESS, [attackName, `队伍${defenseIndex}`]);
|
||||
params.pushRec(attackRoleId, attackLeague, GVG_REC_TYPE.BATTLE_BY_ROLE, GVG_REC_ID.TEAM_ATTACK_FAIL, [`队伍${attackIndex}`, defenseName]);
|
||||
}
|
||||
|
||||
await GVGRecModel.addRecs(params.getUpdateParam());
|
||||
let mapByRoleId = params.getMapByRoleId();
|
||||
for(let [roleId, recs] of mapByRoleId) {
|
||||
if(recs.length > 0) sendMessageToUserWithSuc(roleId, PUSH_ROUTE.GVG_REC_ADD, { recs });
|
||||
}
|
||||
}
|
||||
|
||||
class GVGRecUpArr {
|
||||
private arr: GVGRecUpdate[] = [];
|
||||
private configId: number;
|
||||
private cityId: number;
|
||||
private groupKey: string;
|
||||
private createTime: number;
|
||||
|
||||
constructor(configId: number, cityId: number, groupKey: string, createTime: number) {
|
||||
this.configId = configId;
|
||||
this.cityId = cityId;
|
||||
this.groupKey = groupKey;
|
||||
this.createTime = createTime;
|
||||
}
|
||||
|
||||
public pushRec(roleId: string, leagueCode: string, type: GVG_REC_TYPE, recId: GVG_REC_ID, params: string[]) {
|
||||
this.arr.push({
|
||||
configId: this.configId, cityId: this.cityId, groupKey: this.groupKey, createTime: this.createTime,
|
||||
roleId, leagueCode, type, recId, params
|
||||
})
|
||||
}
|
||||
|
||||
public getUpdateParam() {
|
||||
return this.arr;
|
||||
}
|
||||
|
||||
public getMapByRoleId() {
|
||||
let map = new Map<string, { recId: number, params: string[] }[]>();
|
||||
for(let { roleId, recId, params } of this.arr) {
|
||||
if(!map.has(roleId)) map.set(roleId, []);
|
||||
map.get(roleId).push({ recId, params });
|
||||
}
|
||||
return map
|
||||
}
|
||||
}
|
||||
|
||||
function getPointName(pointId: number) {
|
||||
let dicAreaPoint = gameData.gvgAreaPoint.get(pointId);
|
||||
let dicArea = gameData.gvgArea.get(dicAreaPoint?.areaId);
|
||||
if(!dicArea) return '';
|
||||
return dicArea.areaName||'';
|
||||
}
|
||||
|
||||
// function getCityName(cityId: number) {
|
||||
// let dicCity = gameData.gvgCity.get(cityId);
|
||||
// return dicCity?.cityName||'';
|
||||
// }
|
||||
|
||||
// export async function addTeamSettleRec(team: GVGTeamType) {
|
||||
// let { roleId, roleName, leagueCode, configId, cityId, pointId, groupKey } = team;
|
||||
// await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_CITY, recId: GVG_REC_ID.CITY_TEAM_SETTLE, createTime: nowSeconds(), params: [`${roleName}`, getPointName(pointId)] });
|
||||
// await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_LEAGUE, recId: GVG_REC_ID.LEAGUE_TEAM_SETTLE, createTime: nowSeconds(), params: [`${roleName}`, getPointName(pointId)] });
|
||||
// }
|
||||
|
||||
// export async function addTeamLeaveRec(team: GVGTeamType, pointId: number) {
|
||||
// let { roleId, roleName, leagueCode, configId, cityId, groupKey } = team;
|
||||
// await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_LEAGUE, recId: GVG_REC_ID.LEAGUE_TEAM_LEAVE, createTime: nowSeconds(), params: [`${roleName}`, getPointName(pointId)] });
|
||||
// }
|
||||
|
||||
|
||||
// —————— 频道消息 ——————
|
||||
export async function addLeagueLvUpMessage(roleId: string, roleName: string, myLeague: GVGLeagueType, lv: number) {
|
||||
const msgData = await createGroupMsg(roleId, roleName, CHANNEL_PREFIX.LEAGUE, myLeague.leagueCode, MSG_TYPE.RICH_TEXT, MSG_SOURCE.GVG_LV_UP, JSON.stringify({ leagueCode: myLeague.leagueCode, name: myLeague.name, lv }), '', '', getGuildCodeString(myLeague));
|
||||
await pushGroupMsgToRoom(msgData);
|
||||
}
|
||||
|
||||
export async function changeNoticeMessage(roleId: string, roleName: string, myLeague: GVGLeagueType, notice: string) {
|
||||
const msgData = await createGroupMsg(roleId, roleName, CHANNEL_PREFIX.LEAGUE, myLeague.leagueCode, MSG_TYPE.RICH_TEXT, MSG_SOURCE.GVG_NOTICE, JSON.stringify({ leagueCode: myLeague.leagueCode, name: myLeague.name, notice }), '', '', getGuildCodeString(myLeague));
|
||||
await pushGroupMsgToRoom(msgData);
|
||||
}
|
||||
|
||||
export function getGuildCodeString(myLeague: GVGLeagueType) {
|
||||
let guildCodes = myLeague?.guildCodes||[];
|
||||
return guildCodes.join('|')
|
||||
}
|
||||
|
||||
export async function addTechActivateMessage(roleId: string, roleName: string, myLeague: GVGLeagueType, techId: number) {
|
||||
const msgData = await createGroupMsg(roleId, roleName, CHANNEL_PREFIX.LEAGUE, myLeague.leagueCode, MSG_TYPE.RICH_TEXT, MSG_SOURCE.GVG_TECH_ACTIVATE, JSON.stringify({ leagueCode: myLeague.leagueCode, name: myLeague.name, techId }), '', '', getGuildCodeString(myLeague));
|
||||
await pushGroupMsgToRoom(msgData);
|
||||
}
|
||||
|
||||
export async function addTechUnlockMessage(roleId: string, roleName: string, myLeague: GVGLeagueType, techId: number) {
|
||||
const msgData = await createGroupMsg(roleId, roleName, CHANNEL_PREFIX.LEAGUE, myLeague.leagueCode, MSG_TYPE.RICH_TEXT, MSG_SOURCE.GVG_TECH_UNLOCK, JSON.stringify({ leagueCode: myLeague.leagueCode, leaderName: roleName, techId }), '', '', getGuildCodeString(myLeague));
|
||||
await pushGroupMsgToRoom(msgData);
|
||||
}
|
||||
|
||||
export async function addVestigeRankMessage(ranks: { rank: number, field: string }[]) {
|
||||
let leagueCodes = ranks.map(cur => cur.field);
|
||||
let leagues = await GVGLeagueModel.findByCodesWithoutPopulate(leagueCodes, 'leagueCode name guildCodes');
|
||||
for(let { rank, field: leagueCode } of ranks) {
|
||||
let league = leagues.find(cur => cur.leagueCode == leagueCode);
|
||||
if(!league) continue;
|
||||
const msgData = await createGroupMsg('', '', CHANNEL_PREFIX.LEAGUE, leagueCode, MSG_TYPE.RICH_TEXT, MSG_SOURCE.GVG_VESTIGE_ACCOUNT, JSON.stringify({ leagueCode: league.leagueCode, name: league.name, rank }), '', '', getGuildCodeString(league));
|
||||
await pushGroupMsgToRoom(msgData);
|
||||
}
|
||||
}
|
||||
|
||||
export async function addCityGuardMessage(myLeague: GVGLeagueType, cityId: number) {
|
||||
const msgData = await createGroupMsg('', '', CHANNEL_PREFIX.LEAGUE, myLeague.leagueCode, MSG_TYPE.RICH_TEXT, MSG_SOURCE.GVG_OCCUPY_CITY, JSON.stringify({ leagueCode: myLeague.leagueCode, name: myLeague.name, cityId }), '', '', getGuildCodeString(myLeague));
|
||||
await pushGroupMsgToRoom(msgData);
|
||||
}
|
||||
|
||||
// 动态
|
||||
import { CHANNEL_PREFIX, GVG_REC_ID, GVG_REC_TYPE, GVG_RESOURCE_TYPE, MSG_SOURCE, MSG_TYPE, PUSH_ROUTE } from "@consts";
|
||||
import { GVGBattleRecType } from "@db/GVGBattleRec";
|
||||
import { GVGLeagueModel, GVGLeagueType } from "@db/GVGLeague";
|
||||
import { GVGRecModel, GVGRecUpdate } from "@db/GVGRec";
|
||||
import { GVGVestigeRecType } from "@db/GVGVestigeRec";
|
||||
import { gameData } from "@pubUtils/data";
|
||||
import { nowSeconds } from "@pubUtils/timeUtil";
|
||||
import { createGroupMsg, pushGroupMsgToRoom } from "../chatService";
|
||||
import { sendMessageToUserWithSuc } from "../pushService";
|
||||
import { getGVGConfig } from "./gvgService";
|
||||
|
||||
// 加入军团
|
||||
export async function guildJoinLeagueRecord(leagueCode: string, guildName: string) {
|
||||
await leagueJoinOrQuitGuild(leagueCode, guildName, GVG_REC_ID.LEAGUE_JOIN_GUILD);
|
||||
}
|
||||
|
||||
// 退出军团
|
||||
export async function guildQuitLeagueRecord(leagueCode: string, guildName: string) {
|
||||
await leagueJoinOrQuitGuild(leagueCode, guildName, GVG_REC_ID.LEAGUE_QUIT_GUILD);
|
||||
}
|
||||
|
||||
async function leagueJoinOrQuitGuild(leagueCode: string, guildName: string, recId: GVG_REC_ID.LEAGUE_JOIN_GUILD|GVG_REC_ID.LEAGUE_QUIT_GUILD) {
|
||||
let { configId } = getGVGConfig();
|
||||
let params = [guildName];
|
||||
await GVGRecModel.addRec({ leagueCode, configId, type: GVG_REC_TYPE.PREPARE, recId, createTime: nowSeconds(), params })
|
||||
}
|
||||
|
||||
export async function addLeagueRenameRecord(leagueCode: string, leagueName: string) {
|
||||
let { configId } = getGVGConfig();
|
||||
let params = [leagueName];
|
||||
await GVGRecModel.addRec({ leagueCode, configId, type: GVG_REC_TYPE.PREPARE, recId: GVG_REC_ID.LEAGUE_RENAME, createTime: nowSeconds(), params })
|
||||
}
|
||||
|
||||
// 获得资源
|
||||
export async function addResourceRecord(roleId: string, roleName: string, leagueCode: string, resourceType: GVG_RESOURCE_TYPE, output: number) {
|
||||
let { configId } = getGVGConfig();
|
||||
let params = [roleName, getResourceNameByType(resourceType), `${output}`];
|
||||
await GVGRecModel.addRec({ roleId, leagueCode, configId, type: GVG_REC_TYPE.PREPARE, recId: GVG_REC_ID.ADD_RESOURCE, createTime: nowSeconds(), params })
|
||||
}
|
||||
|
||||
function getResourceNameByType(resourceType: GVG_RESOURCE_TYPE) {
|
||||
switch(resourceType) {
|
||||
case GVG_RESOURCE_TYPE.FOOD: return '粮食';
|
||||
case GVG_RESOURCE_TYPE.MINERAL: return '矿物';
|
||||
case GVG_RESOURCE_TYPE.WOOD: return '木堆';
|
||||
}
|
||||
}
|
||||
|
||||
export async function addVestigeBattleEndRec(rec: GVGVestigeRecType) {
|
||||
if(!rec) return;
|
||||
let { configId, vestigeId, groupKey } = rec;
|
||||
let vestigeName = gameData.gvgVestigeName.get(vestigeId);
|
||||
if(rec.defenseInfo && rec.defenseInfo.isRobot) { // 对手是机器人,驻扎动态
|
||||
let { roleId, roleName, leagueCode, newRank, isSuccess } = rec.attackInfo;
|
||||
if(isSuccess) {
|
||||
let params = [ roleName, vestigeName, `第${newRank}名`];
|
||||
await GVGRecModel.addRec({ roleId, leagueCode, configId, groupKey, type: GVG_REC_TYPE.PREPARE, recId: GVG_REC_ID.SETTLE_POINT, createTime: nowSeconds(), params });
|
||||
}
|
||||
}
|
||||
if(rec.defenseInfo && !rec.defenseInfo.isRobot && rec.attackInfo.leagueCode != rec.defenseInfo.leagueCode) {
|
||||
let { leagueName, newRank, isSuccess } = rec.attackInfo;
|
||||
let { roleId, leagueCode, roleName } = rec.defenseInfo;
|
||||
if(isSuccess) {
|
||||
let params = [ roleName, vestigeName, `第${newRank}名`, leagueName];
|
||||
await GVGRecModel.addRec({ roleId, leagueCode, configId, groupKey, type: GVG_REC_TYPE.PREPARE, recId: GVG_REC_ID.POINT_BE_GRAB, createTime: nowSeconds(), params });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export async function addVestigeLeagueRankRec(configId: number, groupKey: string, ranks: { rank: number, field: string }[]) {
|
||||
await GVGRecModel.addRecs(ranks.map(({ rank, field: leagueCode }) => {
|
||||
let params = [ `第${rank}名`];
|
||||
return { leagueCode, configId, groupKey, type: GVG_REC_TYPE.PREPARE, recId: GVG_REC_ID.VESTIGE_RANK, createTime: nowSeconds(), params };
|
||||
}));
|
||||
}
|
||||
|
||||
export async function addBattleEndRec(rec: GVGBattleRecType) {
|
||||
let { isSuccess, attackTeamAfter: attackTeam, defenseTeamAfter: defenseTeam, configId, groupKey } = rec;
|
||||
let { roleId: defenseRoleId, leagueCode: defenseLeague, cityId, index: defenseIndex, curTeamBreak: defenseBreak, originPointId: defenseOriginPoint, roleName: defenseName } = defenseTeam;
|
||||
let { roleId: attackRoleId, leagueCode: attackLeague, index: attackIndex, roleName: attackName} = attackTeam;
|
||||
|
||||
let params = new GVGRecUpArr(configId, cityId, groupKey, nowSeconds());
|
||||
if(isSuccess) {
|
||||
if(!defenseTeam.isRobot) params.pushRec(defenseRoleId, defenseLeague, GVG_REC_TYPE.BATTLE_BY_ROLE, GVG_REC_ID.TEAM_BE_ATTACKED_FAIL, [attackName, `队伍${defenseIndex}`]);
|
||||
params.pushRec(attackRoleId, attackLeague, GVG_REC_TYPE.BATTLE_BY_ROLE, GVG_REC_ID.TEAM_ATTACK_SUCCESS, [`队伍${attackIndex}`, defenseName]);
|
||||
if(defenseBreak && defenseOriginPoint > 0 ) {
|
||||
if(!defenseTeam.isRobot) {
|
||||
params.pushRec(defenseRoleId, defenseLeague, GVG_REC_TYPE.BATTLE_BY_ROLE, GVG_REC_ID.TEAM_LOST_POINT, [attackName, `队伍${defenseIndex}`, getPointName(defenseOriginPoint)]);
|
||||
}
|
||||
params.pushRec(attackRoleId, attackLeague, GVG_REC_TYPE.BATTLE_BY_ROLE, GVG_REC_ID.TEAM_GET_POINT, [`队伍${attackIndex}`, defenseName, getPointName(defenseOriginPoint)]);
|
||||
}
|
||||
} else {
|
||||
if(!defenseTeam.isRobot) params.pushRec(defenseRoleId, defenseLeague, GVG_REC_TYPE.BATTLE_BY_ROLE, GVG_REC_ID.TEAM_BE_ATTACKED_SUCCESS, [attackName, `队伍${defenseIndex}`]);
|
||||
params.pushRec(attackRoleId, attackLeague, GVG_REC_TYPE.BATTLE_BY_ROLE, GVG_REC_ID.TEAM_ATTACK_FAIL, [`队伍${attackIndex}`, defenseName]);
|
||||
}
|
||||
|
||||
await GVGRecModel.addRecs(params.getUpdateParam());
|
||||
let mapByRoleId = params.getMapByRoleId();
|
||||
for(let [roleId, recs] of mapByRoleId) {
|
||||
if(recs.length > 0) sendMessageToUserWithSuc(roleId, PUSH_ROUTE.GVG_REC_ADD, { recs });
|
||||
}
|
||||
}
|
||||
|
||||
class GVGRecUpArr {
|
||||
private arr: GVGRecUpdate[] = [];
|
||||
private configId: number;
|
||||
private cityId: number;
|
||||
private groupKey: string;
|
||||
private createTime: number;
|
||||
|
||||
constructor(configId: number, cityId: number, groupKey: string, createTime: number) {
|
||||
this.configId = configId;
|
||||
this.cityId = cityId;
|
||||
this.groupKey = groupKey;
|
||||
this.createTime = createTime;
|
||||
}
|
||||
|
||||
public pushRec(roleId: string, leagueCode: string, type: GVG_REC_TYPE, recId: GVG_REC_ID, params: string[]) {
|
||||
this.arr.push({
|
||||
configId: this.configId, cityId: this.cityId, groupKey: this.groupKey, createTime: this.createTime,
|
||||
roleId, leagueCode, type, recId, params
|
||||
})
|
||||
}
|
||||
|
||||
public getUpdateParam() {
|
||||
return this.arr;
|
||||
}
|
||||
|
||||
public getMapByRoleId() {
|
||||
let map = new Map<string, { recId: number, params: string[] }[]>();
|
||||
for(let { roleId, recId, params } of this.arr) {
|
||||
if(!map.has(roleId)) map.set(roleId, []);
|
||||
map.get(roleId).push({ recId, params });
|
||||
}
|
||||
return map
|
||||
}
|
||||
}
|
||||
|
||||
function getPointName(pointId: number) {
|
||||
let dicAreaPoint = gameData.gvgAreaPoint.get(pointId);
|
||||
let dicArea = gameData.gvgArea.get(dicAreaPoint?.areaId);
|
||||
if(!dicArea) return '';
|
||||
return dicArea.areaName||'';
|
||||
}
|
||||
|
||||
// function getCityName(cityId: number) {
|
||||
// let dicCity = gameData.gvgCity.get(cityId);
|
||||
// return dicCity?.cityName||'';
|
||||
// }
|
||||
|
||||
// export async function addTeamSettleRec(team: GVGTeamType) {
|
||||
// let { roleId, roleName, leagueCode, configId, cityId, pointId, groupKey } = team;
|
||||
// await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_CITY, recId: GVG_REC_ID.CITY_TEAM_SETTLE, createTime: nowSeconds(), params: [`${roleName}`, getPointName(pointId)] });
|
||||
// await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_LEAGUE, recId: GVG_REC_ID.LEAGUE_TEAM_SETTLE, createTime: nowSeconds(), params: [`${roleName}`, getPointName(pointId)] });
|
||||
// }
|
||||
|
||||
// export async function addTeamLeaveRec(team: GVGTeamType, pointId: number) {
|
||||
// let { roleId, roleName, leagueCode, configId, cityId, groupKey } = team;
|
||||
// await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_LEAGUE, recId: GVG_REC_ID.LEAGUE_TEAM_LEAVE, createTime: nowSeconds(), params: [`${roleName}`, getPointName(pointId)] });
|
||||
// }
|
||||
|
||||
|
||||
// —————— 频道消息 ——————
|
||||
export async function addLeagueLvUpMessage(roleId: string, roleName: string, myLeague: GVGLeagueType, lv: number) {
|
||||
const msgData = await createGroupMsg(roleId, roleName, CHANNEL_PREFIX.LEAGUE, myLeague.leagueCode, MSG_TYPE.RICH_TEXT, MSG_SOURCE.GVG_LV_UP, JSON.stringify({ leagueCode: myLeague.leagueCode, name: myLeague.name, lv }), '', '', getGuildCodeString(myLeague));
|
||||
await pushGroupMsgToRoom(msgData);
|
||||
}
|
||||
|
||||
export async function changeNoticeMessage(roleId: string, roleName: string, myLeague: GVGLeagueType, notice: string) {
|
||||
const msgData = await createGroupMsg(roleId, roleName, CHANNEL_PREFIX.LEAGUE, myLeague.leagueCode, MSG_TYPE.RICH_TEXT, MSG_SOURCE.GVG_NOTICE, JSON.stringify({ leagueCode: myLeague.leagueCode, name: myLeague.name, notice }), '', '', getGuildCodeString(myLeague));
|
||||
await pushGroupMsgToRoom(msgData);
|
||||
}
|
||||
|
||||
export function getGuildCodeString(myLeague: GVGLeagueType) {
|
||||
let guildCodes = myLeague?.guildCodes||[];
|
||||
return guildCodes.join('|')
|
||||
}
|
||||
|
||||
export async function addTechActivateMessage(roleId: string, roleName: string, myLeague: GVGLeagueType, techId: number) {
|
||||
const msgData = await createGroupMsg(roleId, roleName, CHANNEL_PREFIX.LEAGUE, myLeague.leagueCode, MSG_TYPE.RICH_TEXT, MSG_SOURCE.GVG_TECH_ACTIVATE, JSON.stringify({ leagueCode: myLeague.leagueCode, name: myLeague.name, techId }), '', '', getGuildCodeString(myLeague));
|
||||
await pushGroupMsgToRoom(msgData);
|
||||
}
|
||||
|
||||
export async function addTechUnlockMessage(roleId: string, roleName: string, myLeague: GVGLeagueType, techId: number) {
|
||||
const msgData = await createGroupMsg(roleId, roleName, CHANNEL_PREFIX.LEAGUE, myLeague.leagueCode, MSG_TYPE.RICH_TEXT, MSG_SOURCE.GVG_TECH_UNLOCK, JSON.stringify({ leagueCode: myLeague.leagueCode, leaderName: roleName, techId }), '', '', getGuildCodeString(myLeague));
|
||||
await pushGroupMsgToRoom(msgData);
|
||||
}
|
||||
|
||||
export async function addVestigeRankMessage(ranks: { rank: number, field: string }[]) {
|
||||
let leagueCodes = ranks.map(cur => cur.field);
|
||||
let leagues = await GVGLeagueModel.findByCodesWithoutPopulate(leagueCodes, 'leagueCode name guildCodes');
|
||||
for(let { rank, field: leagueCode } of ranks) {
|
||||
let league = leagues.find(cur => cur.leagueCode == leagueCode);
|
||||
if(!league) continue;
|
||||
const msgData = await createGroupMsg('', '', CHANNEL_PREFIX.LEAGUE, leagueCode, MSG_TYPE.RICH_TEXT, MSG_SOURCE.GVG_VESTIGE_ACCOUNT, JSON.stringify({ leagueCode: league.leagueCode, name: league.name, rank }), '', '', getGuildCodeString(league));
|
||||
await pushGroupMsgToRoom(msgData);
|
||||
}
|
||||
}
|
||||
|
||||
export async function addCityGuardMessage(myLeague: GVGLeagueType, cityId: number) {
|
||||
const msgData = await createGroupMsg('', '', CHANNEL_PREFIX.LEAGUE, myLeague.leagueCode, MSG_TYPE.RICH_TEXT, MSG_SOURCE.GVG_OCCUPY_CITY, JSON.stringify({ leagueCode: myLeague.leagueCode, name: myLeague.name, cityId }), '', '', getGuildCodeString(myLeague));
|
||||
await pushGroupMsgToRoom(msgData);
|
||||
}
|
||||
|
||||
@@ -1,339 +1,339 @@
|
||||
import { pinus } from "pinus";
|
||||
import { GVGConfigModel, GVGConfigType } from "../../db/GVGConfig";
|
||||
import { getSeconds, getTimeFun, nowSeconds, WEEK_TO_SECOND } from "../../pubUtils/timeUtil";
|
||||
import { getServerCreateTime } from "../redisService";
|
||||
import { GVG_PERIOD, GVG_SERVER_TYPE, LEAGUE_JOB, PUSH_ROUTE } from "../../consts";
|
||||
import { GVGLeagueModel, GVGLeagueType } from "../../db/GVGLeague";
|
||||
import { GVGLeaguePrepareModel } from "../../db/GVGLeaguePrepare";
|
||||
import { gameData } from "../../pubUtils/data";
|
||||
import { getRandSingleEelm } from "../../pubUtils/util";
|
||||
import { GVG } from "../../pubUtils/dicParam";
|
||||
import { GuildModel, GuildType } from "../../db/Guild";
|
||||
import { GVGLeagueApplyModel } from "../../db/GVGLeagueApply";
|
||||
import { GVGMainData, LeagueContributeInfo } from "../../domain/gvgField/returnData";
|
||||
import { Contribute, GVGUserDataModel, GVGUserDataType } from "../../db/GVGUserData";
|
||||
import { GVGUserItemModel } from "../../db/GVGUserItem";
|
||||
import { GVGUserTaskModel } from "../../db/GVGUserTask";
|
||||
import { getMyAuth } from "./gvgTeamService";
|
||||
import { pick } from "underscore";
|
||||
import { calFighterContribute, calProducerContribute } from "./gvgPrepareService";
|
||||
import { calVestigeLeagueBoxRewards, getFightTimeByPeriod } from "./gvgFightService";
|
||||
import { GVGVestigeLeagueRankModel } from "../../db/GVGVestigeLeagueRank";
|
||||
import { GVGVestigeSumRankModel } from "../../db/GVGVestigeSumRank";
|
||||
import { GVGTeamModel } from "../../db/GVGTeam";
|
||||
import { sendMessageToGuildWithSuc } from "../pushService";
|
||||
import { GVGCityModel } from "../../db/GVGCity";
|
||||
import { GVGRoleDataModel } from "../../db/GVGRoleData";
|
||||
import { getGVGGroupIdOfServer } from "../serverService";
|
||||
import { UserGuildModel } from "../../db/UserGuild";
|
||||
|
||||
// 定时器相关
|
||||
export async function createNewGVGConfig() {
|
||||
let { teamTime, prepareTime, battleTime, scheduleTime } = getPeriodTime();
|
||||
const config = await GVGConfigModel.createNewConfig(teamTime, prepareTime, battleTime, scheduleTime);
|
||||
try {
|
||||
await pinus.app.rpc.guild.guildRemote.setGVGConfig.broadcast(config);
|
||||
await pinus.app.rpc.guild.guildRemote.setServerGroup.broadcast();
|
||||
await pinus.app.rpc.chat.chatRemote.setServerGroup.broadcast();
|
||||
await pinus.app.rpc.connector.connectorRemote.setServerGroup.broadcast();
|
||||
await pinus.app.rpc.gm.gmRemote.setServerGroup.broadcast();
|
||||
await pinus.app.rpc.systimer.systimerRemote.setServerGroup.broadcast();
|
||||
await pinus.app.rpc.guild?.guildRemote?.clearBattleMemory.broadcast();
|
||||
} catch(e) {
|
||||
console.log('remote未初始完');
|
||||
}
|
||||
// 每周自动解散一些联军
|
||||
let autoLeagues = await GVGLeagueModel.findAutoCreateLeague();
|
||||
let needDissmissLeagueId: string[] = [], needDissmissLeagueCodes: string[] = [];
|
||||
for(let league of autoLeagues) {
|
||||
let groupKey = await getGroupKey(league.serverId);
|
||||
if(!await GVGCityModel.checkLeagueHasGuard(groupKey, league.leagueCode)) {
|
||||
needDissmissLeagueId.push(league._id);
|
||||
needDissmissLeagueCodes.push(league.leagueCode);
|
||||
}
|
||||
}
|
||||
await GVGLeagueModel.dismissByIds(needDissmissLeagueId);
|
||||
await GuildModel.leagueAutoDismiss(needDissmissLeagueCodes);
|
||||
for(let league of autoLeagues) {
|
||||
if(needDissmissLeagueCodes.indexOf(league.leagueCode) == -1) continue;
|
||||
for(let guildCode of league.guildCodes) {
|
||||
await sendMessageToGuildWithSuc(guildCode, PUSH_ROUTE.LEAGUE_DISSMISS, { leagueCode: league.leagueCode })
|
||||
}
|
||||
}
|
||||
|
||||
await pinus.app.rpc.systimer.systimerRemote.initGVGConfigSchedule.broadcast();
|
||||
return config;
|
||||
}
|
||||
|
||||
// 获取各个周期的时间,大约每周日5点的时候刷的
|
||||
export function getPeriodTime() {
|
||||
let now = new Date();
|
||||
let curDay = now.getDay(); // 今天星期几
|
||||
|
||||
let teamConfig = gameData.gvgPeriod.get(GVG_PERIOD.TEAM);
|
||||
let prepareConfig = gameData.gvgPeriod.get(GVG_PERIOD.PREPARE);
|
||||
let battleConfig = gameData.gvgPeriod.get(GVG_PERIOD.BATTLE);
|
||||
|
||||
// 如果现在是周日,那么就是本周期的组队开始时间,如果是其他日子(启动初始化),就是下周期的组队开始时间
|
||||
let _teamTime = <number>getTimeFun().getTimeWithWeek(teamConfig.startDay);
|
||||
let _prepareTime = <number>getTimeFun().getTimeWithWeek(prepareConfig.startDay);
|
||||
let _battleTime = <number>getTimeFun().getTimeWithWeek(battleConfig.startDay);
|
||||
console.log('_teamTime: ', _teamTime);
|
||||
|
||||
let teamTime = curDay == 0? _teamTime: _teamTime - 7 * 86400;
|
||||
let prepareTime = curDay == 0? _prepareTime + 7 * 86400: _prepareTime;
|
||||
let battleTime = curDay == 0? _battleTime + 7 * 86400: _battleTime;
|
||||
let scheduleTime = teamTime + 7 * 86400;
|
||||
|
||||
return { teamTime, prepareTime, battleTime, scheduleTime }
|
||||
}
|
||||
|
||||
export async function getGVGConfigFromRemote() {
|
||||
let serverType = pinus.app.getServerType();
|
||||
if(serverType == 'guild') {
|
||||
return getGVGConfig();
|
||||
} else {
|
||||
let guildServers = pinus.app.getServersByType('guild');
|
||||
let server = getRandSingleEelm(guildServers);
|
||||
return await pinus.app.rpc.guild.guildRemote.getGVGConfig.toServer(server.id);
|
||||
}
|
||||
}
|
||||
|
||||
export async function setGVGConfig(config?: GVGConfigType) {
|
||||
if(!config) {
|
||||
config = await GVGConfigModel.findConfig();
|
||||
}
|
||||
if(config.teamTime > nowSeconds()) {
|
||||
config = null;
|
||||
}
|
||||
pinus.app.set('gvgConfigId', config?.configId||0);
|
||||
pinus.app.set('gvgTeamTime', config?.teamTime||0);
|
||||
pinus.app.set('gvgPrepareTime', config?.prepareTime||0);
|
||||
pinus.app.set('gvgBattleTime', config?.battleTime||0);
|
||||
pinus.app.set('gvgScheduleTime', config?.scheduleTime||0);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前的赛期id
|
||||
* @returns
|
||||
*/
|
||||
export function getGVGConfig() {
|
||||
let configId: number = pinus.app.get('gvgConfigId');
|
||||
let teamTime: number = pinus.app.get('gvgTeamTime');
|
||||
let prepareTime: number = pinus.app.get('gvgPrepareTime');
|
||||
let battleTime: number = pinus.app.get('gvgBattleTime');
|
||||
let scheduleTime: number = pinus.app.get('gvgScheduleTime');
|
||||
return { configId, teamTime, prepareTime, battleTime, scheduleTime }
|
||||
}
|
||||
|
||||
export function getServerTypeByTime(openTime: number) {
|
||||
let today = nowSeconds();
|
||||
if(today - openTime < WEEK_TO_SECOND) return GVG_SERVER_TYPE.NO;
|
||||
let toWeek = getCurrentTeamTime(today);
|
||||
let openWeek = getCurrentTeamTime(openTime);
|
||||
let n = Math.floor((toWeek - openWeek) / WEEK_TO_SECOND);
|
||||
let day = new Date(openTime * 1000).getDay();
|
||||
if(day == 6) n--; // 周六开服的服务器延后一周开启跨服
|
||||
return n <= GVG.GVG_CROSS_SERVICE_STARTTIME? GVG_SERVER_TYPE.SINGLE: GVG_SERVER_TYPE.MULTI;
|
||||
}
|
||||
|
||||
function getCurrentTeamTime(time: number) {
|
||||
let teamConfig = gameData.gvgPeriod.get(GVG_PERIOD.TEAM);
|
||||
// 本周日
|
||||
let _teamTime = <number>getTimeFun(time).getTimeWithWeek(teamConfig.startDay, teamConfig.startHour, teamConfig.startMinute, teamConfig.startSecond);
|
||||
return _teamTime > time? _teamTime - WEEK_TO_SECOND: _teamTime;
|
||||
}
|
||||
|
||||
export async function getGVGServerType(serverId: number) {
|
||||
let openTime = await getServerCreateTime(serverId);
|
||||
return getServerTypeByTime(openTime)
|
||||
}
|
||||
|
||||
export function getGVGPeriodData() {
|
||||
let { configId, teamTime, prepareTime, battleTime, scheduleTime } = getGVGConfig();
|
||||
let period = getCurPeriod();
|
||||
let countdownTime = teamTime;
|
||||
switch(period) {
|
||||
case GVG_PERIOD.TEAM: {
|
||||
countdownTime = prepareTime; break;
|
||||
}
|
||||
case GVG_PERIOD.PREPARE: {
|
||||
countdownTime = battleTime; break;
|
||||
}
|
||||
case GVG_PERIOD.BATTLE: {
|
||||
countdownTime = scheduleTime; break;
|
||||
}
|
||||
}
|
||||
|
||||
// console.log('######## getGVGPeriodData', configId, teamTime, prepareTime, battleTime, scheduleTime)
|
||||
return { configId, period, countdownTime };
|
||||
}
|
||||
|
||||
export function getCurPeriod() {
|
||||
let { teamTime, prepareTime, battleTime, scheduleTime } = getGVGConfig();
|
||||
return getPeriodByTime(teamTime, prepareTime, battleTime, scheduleTime)
|
||||
}
|
||||
|
||||
export function getPeriodByTime(teamTime: number, prepareTime: number, battleTime: number, scheduleTime: number) {
|
||||
let now = nowSeconds();
|
||||
if(now >= teamTime && now < prepareTime) {
|
||||
return GVG_PERIOD.TEAM;
|
||||
} else if (now >= prepareTime && now < battleTime) {
|
||||
return GVG_PERIOD.PREPARE;
|
||||
} else if (now >= battleTime && now < scheduleTime){
|
||||
return GVG_PERIOD.BATTLE;
|
||||
} else {
|
||||
return GVG_PERIOD.NO;
|
||||
}
|
||||
}
|
||||
|
||||
export async function initLeaguePrepare() {
|
||||
const config = await GVGConfigModel.findConfig();
|
||||
if(!config) return;
|
||||
const leagues = await GVGLeagueModel.findAllLeague();
|
||||
let groupKeyByServerId = new Map<number, string>();
|
||||
for(let { leagueCode, memberCnt, serverId } of leagues) {
|
||||
let groupKey = groupKeyByServerId.get(serverId);
|
||||
if(!groupKey) {
|
||||
groupKey = await getGroupKey(serverId);
|
||||
groupKeyByServerId.set(serverId, groupKey);
|
||||
}
|
||||
|
||||
await GVGLeaguePrepareModel.initData(config.configId, groupKey, leagueCode, memberCnt);
|
||||
}
|
||||
}
|
||||
|
||||
export async function getGVGInfoInGuild(roleId: string, guild: GuildType) {
|
||||
let hasLeague = !!guild.leagueCode;
|
||||
let serverId = guild.serverId;
|
||||
let { configId, period, countdownTime } = getGVGPeriodData();
|
||||
let { startFightTime, endFightTime } = getFightTimeByPeriod(period);
|
||||
let type = await getGVGServerType(serverId);
|
||||
|
||||
if(hasLeague && configId > 0) {
|
||||
return {
|
||||
hasLeague,
|
||||
configId, period, countdownTime,
|
||||
type,
|
||||
applyCnt: await getApplyCnt(guild.leagueCode),
|
||||
...await getMainData(roleId, guild.leagueCode, configId, period, countdownTime, type),
|
||||
leagueDetailRank: await getLeagueRankBox(configId, guild.leagueCode, roleId),
|
||||
myTeamCnt: await GVGTeamModel.getTeamCntByRole(roleId),
|
||||
startFightTime, endFightTime
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
hasLeague,
|
||||
configId, period, countdownTime,
|
||||
startFightTime, endFightTime,
|
||||
type,
|
||||
invitationCnt: await getInviteCnt(guild.code)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export async function calLeagueCe(league: GVGLeagueType) {
|
||||
const guildCodes = league?.guildCodes||[];
|
||||
const guilds = await GuildModel.findByCodes(guildCodes);
|
||||
return guilds.reduce((pre, guild) => pre + guild.guildCe, 0);
|
||||
}
|
||||
|
||||
// 检查当前赛季阶段
|
||||
export async function checkGVGPeriod(p : GVG_PERIOD) {
|
||||
let { period } = getGVGPeriodData();
|
||||
return period == p;
|
||||
}
|
||||
|
||||
// —————— 红点相关 —————— //
|
||||
// 邀请
|
||||
export async function getInviteCnt(guildCode: string) {
|
||||
let invitation = await GVGLeagueApplyModel.findInviteFromGuildWithoutPopulate(guildCode);
|
||||
return invitation.length
|
||||
}
|
||||
|
||||
// 申请
|
||||
export async function getApplyCnt(leagueCode: string) {
|
||||
let applies = await GVGLeagueApplyModel.findApplyFromLeagueWithoutPopulate(leagueCode);
|
||||
return applies.length
|
||||
}
|
||||
|
||||
export async function getMainData(roleId: string, leagueCode: string, configId: number, period: number, countdownTime: number, serverType: number) {
|
||||
let data = new GVGMainData(configId, period, countdownTime, serverType);
|
||||
|
||||
let league = await GVGLeagueModel.findByCode(leagueCode);
|
||||
if(league) {
|
||||
data.setLeague(league, {});
|
||||
|
||||
let leaguePrepare = await GVGLeaguePrepareModel.findByLeague(configId, league.leagueCode);
|
||||
data.setLeagueParpare(leaguePrepare);
|
||||
data.setTechQueue(leaguePrepare?.techQueue||[]);
|
||||
|
||||
let userData = await GVGUserDataModel.findByRole(configId, league.leagueCode, roleId);
|
||||
let roleData = await GVGRoleDataModel.findByRole(configId, roleId);
|
||||
let items = await GVGUserItemModel.findByRole(configId, league.leagueCode, roleId);
|
||||
let tasks = await GVGUserTaskModel.findByRole(configId, league.leagueCode, roleId);
|
||||
data.setPlayerInfo(userData, roleData, getMyAuth(league, roleId), undefined, undefined, items, tasks);
|
||||
data.setLeagueCe(await calLeagueCe(league));
|
||||
data.setConstribute(await getContribute(userData));
|
||||
}
|
||||
|
||||
let myInfo = pick(data.myInfo, ['auth', 'items', 'tasks', 'receivedLv']);
|
||||
return { ...pick(data, ['guildCnt', 'leagueLv', 'techQueue', 'constribute']), myInfo }
|
||||
}
|
||||
|
||||
export async function getContribute(myUserData: GVGUserDataType) {
|
||||
const { contribute = new Contribute(), box = [] } = myUserData||{};
|
||||
|
||||
const result: LeagueContributeInfo[] = [];
|
||||
for(let curJob of [LEAGUE_JOB.PRODUCER, LEAGUE_JOB.FIGHTER]) {
|
||||
let sumContribute = curJob == LEAGUE_JOB.PRODUCER? calProducerContribute(contribute): calFighterContribute(contribute);
|
||||
let boxReceived = box.filter(boxId => {
|
||||
let dicBox = gameData.gvgContributeBox.get(boxId);
|
||||
return dicBox.job == curJob;
|
||||
});
|
||||
let disObj = new LeagueContributeInfo(curJob, sumContribute, boxReceived);
|
||||
result.push(disObj)
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export async function getLeagueRankBox(configId: number, leagueCode: string, roleId: string) {
|
||||
let joinTime = await getMemberJoinLeagueTime(leagueCode, roleId);
|
||||
let canReceiveLeagueRanks = await GVGVestigeLeagueRankModel.getCanReceiveRanks(configId, leagueCode, roleId, joinTime);
|
||||
let canReceivePlayerRanks = await GVGVestigeSumRankModel.getCanReceiveRanks(configId, roleId);
|
||||
let { canReceiveBox } = calVestigeLeagueBoxRewards(canReceiveLeagueRanks, canReceivePlayerRanks);
|
||||
return { canReceiveBox }
|
||||
}
|
||||
|
||||
export async function getGroupKey(serverId: number) {
|
||||
let serverType = await getGVGServerType(serverId);
|
||||
if(serverType == GVG_SERVER_TYPE.SINGLE) {
|
||||
return `s${serverId}`;
|
||||
} else {
|
||||
let groupId = await getGVGGroupIdOfServer(serverId);
|
||||
return `g${groupId}`;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 之前gvgLeague表的members没有记录加入联军时间,所以如果查询没有time的话,根据userGuild的time来更新一下这个数据
|
||||
*
|
||||
* 获取玩家加入联军时间
|
||||
* @param leagueCode 联军id
|
||||
* @param roleId
|
||||
* @param league 联军表数据
|
||||
* @returns
|
||||
*/
|
||||
export async function getMemberJoinLeagueTime(leagueCode: string, roleId: string, league?: GVGLeagueType) {
|
||||
if(!league) league = await GVGLeagueModel.findByCode(leagueCode, 'members');
|
||||
let members = league?.members||[];
|
||||
let member = members.find(cur => cur.roleId == roleId);
|
||||
if(!member) return 0;
|
||||
if(!member.time) {
|
||||
let userGuild = await UserGuildModel.getMyGuild(roleId, 'createdAt');
|
||||
let time = getSeconds(userGuild.createdAt);
|
||||
await GVGLeagueModel.setMemberTime(leagueCode, roleId, time);
|
||||
return time;
|
||||
}
|
||||
return member.time;
|
||||
}
|
||||
import { pinus } from "pinus";
|
||||
import { GVGConfigModel, GVGConfigType } from "@db/GVGConfig";
|
||||
import { getSeconds, getTimeFun, nowSeconds, WEEK_TO_SECOND } from "@pubUtils/timeUtil";
|
||||
import { getServerCreateTime } from "../redisService";
|
||||
import { GVG_PERIOD, GVG_SERVER_TYPE, LEAGUE_JOB, PUSH_ROUTE } from "@consts";
|
||||
import { GVGLeagueModel, GVGLeagueType } from "@db/GVGLeague";
|
||||
import { GVGLeaguePrepareModel } from "@db/GVGLeaguePrepare";
|
||||
import { gameData } from "@pubUtils/data";
|
||||
import { getRandSingleEelm } from "@pubUtils/util";
|
||||
import { GVG } from "@pubUtils/dicParam";
|
||||
import { GuildModel, GuildType } from "@db/Guild";
|
||||
import { GVGLeagueApplyModel } from "@db/GVGLeagueApply";
|
||||
import { GVGMainData, LeagueContributeInfo } from "@domain/gvgField/returnData";
|
||||
import { Contribute, GVGUserDataModel, GVGUserDataType } from "@db/GVGUserData";
|
||||
import { GVGUserItemModel } from "@db/GVGUserItem";
|
||||
import { GVGUserTaskModel } from "@db/GVGUserTask";
|
||||
import { getMyAuth } from "./gvgTeamService";
|
||||
import { pick } from "underscore";
|
||||
import { calFighterContribute, calProducerContribute } from "./gvgPrepareService";
|
||||
import { calVestigeLeagueBoxRewards, getFightTimeByPeriod } from "./gvgFightService";
|
||||
import { GVGVestigeLeagueRankModel } from "@db/GVGVestigeLeagueRank";
|
||||
import { GVGVestigeSumRankModel } from "@db/GVGVestigeSumRank";
|
||||
import { GVGTeamModel } from "@db/GVGTeam";
|
||||
import { sendMessageToGuildWithSuc } from "../pushService";
|
||||
import { GVGCityModel } from "@db/GVGCity";
|
||||
import { GVGRoleDataModel } from "@db/GVGRoleData";
|
||||
import { getGVGGroupIdOfServer } from "../serverService";
|
||||
import { UserGuildModel } from "@db/UserGuild";
|
||||
|
||||
// 定时器相关
|
||||
export async function createNewGVGConfig() {
|
||||
let { teamTime, prepareTime, battleTime, scheduleTime } = getPeriodTime();
|
||||
const config = await GVGConfigModel.createNewConfig(teamTime, prepareTime, battleTime, scheduleTime);
|
||||
try {
|
||||
await pinus.app.rpc.guild.guildRemote.setGVGConfig.broadcast(config);
|
||||
await pinus.app.rpc.guild.guildRemote.setServerGroup.broadcast();
|
||||
await pinus.app.rpc.chat.chatRemote.setServerGroup.broadcast();
|
||||
await pinus.app.rpc.connector.connectorRemote.setServerGroup.broadcast();
|
||||
await pinus.app.rpc.gm.gmRemote.setServerGroup.broadcast();
|
||||
await pinus.app.rpc.systimer.systimerRemote.setServerGroup.broadcast();
|
||||
await pinus.app.rpc.guild?.guildRemote?.clearBattleMemory.broadcast();
|
||||
} catch(e) {
|
||||
console.log('remote未初始完');
|
||||
}
|
||||
// 每周自动解散一些联军
|
||||
let autoLeagues = await GVGLeagueModel.findAutoCreateLeague();
|
||||
let needDissmissLeagueId: string[] = [], needDissmissLeagueCodes: string[] = [];
|
||||
for(let league of autoLeagues) {
|
||||
let groupKey = await getGroupKey(league.serverId);
|
||||
if(!await GVGCityModel.checkLeagueHasGuard(groupKey, league.leagueCode)) {
|
||||
needDissmissLeagueId.push(league._id);
|
||||
needDissmissLeagueCodes.push(league.leagueCode);
|
||||
}
|
||||
}
|
||||
await GVGLeagueModel.dismissByIds(needDissmissLeagueId);
|
||||
await GuildModel.leagueAutoDismiss(needDissmissLeagueCodes);
|
||||
for(let league of autoLeagues) {
|
||||
if(needDissmissLeagueCodes.indexOf(league.leagueCode) == -1) continue;
|
||||
for(let guildCode of league.guildCodes) {
|
||||
await sendMessageToGuildWithSuc(guildCode, PUSH_ROUTE.LEAGUE_DISSMISS, { leagueCode: league.leagueCode })
|
||||
}
|
||||
}
|
||||
|
||||
await pinus.app.rpc.systimer.systimerRemote.initGVGConfigSchedule.broadcast();
|
||||
return config;
|
||||
}
|
||||
|
||||
// 获取各个周期的时间,大约每周日5点的时候刷的
|
||||
export function getPeriodTime() {
|
||||
let now = new Date();
|
||||
let curDay = now.getDay(); // 今天星期几
|
||||
|
||||
let teamConfig = gameData.gvgPeriod.get(GVG_PERIOD.TEAM);
|
||||
let prepareConfig = gameData.gvgPeriod.get(GVG_PERIOD.PREPARE);
|
||||
let battleConfig = gameData.gvgPeriod.get(GVG_PERIOD.BATTLE);
|
||||
|
||||
// 如果现在是周日,那么就是本周期的组队开始时间,如果是其他日子(启动初始化),就是下周期的组队开始时间
|
||||
let _teamTime = <number>getTimeFun().getTimeWithWeek(teamConfig.startDay);
|
||||
let _prepareTime = <number>getTimeFun().getTimeWithWeek(prepareConfig.startDay);
|
||||
let _battleTime = <number>getTimeFun().getTimeWithWeek(battleConfig.startDay);
|
||||
console.log('_teamTime: ', _teamTime);
|
||||
|
||||
let teamTime = curDay == 0? _teamTime: _teamTime - 7 * 86400;
|
||||
let prepareTime = curDay == 0? _prepareTime + 7 * 86400: _prepareTime;
|
||||
let battleTime = curDay == 0? _battleTime + 7 * 86400: _battleTime;
|
||||
let scheduleTime = teamTime + 7 * 86400;
|
||||
|
||||
return { teamTime, prepareTime, battleTime, scheduleTime }
|
||||
}
|
||||
|
||||
export async function getGVGConfigFromRemote() {
|
||||
let serverType = pinus.app.getServerType();
|
||||
if(serverType == 'guild') {
|
||||
return getGVGConfig();
|
||||
} else {
|
||||
let guildServers = pinus.app.getServersByType('guild');
|
||||
let server = getRandSingleEelm(guildServers);
|
||||
return await pinus.app.rpc.guild.guildRemote.getGVGConfig.toServer(server.id);
|
||||
}
|
||||
}
|
||||
|
||||
export async function setGVGConfig(config?: GVGConfigType) {
|
||||
if(!config) {
|
||||
config = await GVGConfigModel.findConfig();
|
||||
}
|
||||
if(config.teamTime > nowSeconds()) {
|
||||
config = null;
|
||||
}
|
||||
pinus.app.set('gvgConfigId', config?.configId||0);
|
||||
pinus.app.set('gvgTeamTime', config?.teamTime||0);
|
||||
pinus.app.set('gvgPrepareTime', config?.prepareTime||0);
|
||||
pinus.app.set('gvgBattleTime', config?.battleTime||0);
|
||||
pinus.app.set('gvgScheduleTime', config?.scheduleTime||0);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前的赛期id
|
||||
* @returns
|
||||
*/
|
||||
export function getGVGConfig() {
|
||||
let configId: number = pinus.app.get('gvgConfigId');
|
||||
let teamTime: number = pinus.app.get('gvgTeamTime');
|
||||
let prepareTime: number = pinus.app.get('gvgPrepareTime');
|
||||
let battleTime: number = pinus.app.get('gvgBattleTime');
|
||||
let scheduleTime: number = pinus.app.get('gvgScheduleTime');
|
||||
return { configId, teamTime, prepareTime, battleTime, scheduleTime }
|
||||
}
|
||||
|
||||
export function getServerTypeByTime(openTime: number) {
|
||||
let today = nowSeconds();
|
||||
if(today - openTime < WEEK_TO_SECOND) return GVG_SERVER_TYPE.NO;
|
||||
let toWeek = getCurrentTeamTime(today);
|
||||
let openWeek = getCurrentTeamTime(openTime);
|
||||
let n = Math.floor((toWeek - openWeek) / WEEK_TO_SECOND);
|
||||
let day = new Date(openTime * 1000).getDay();
|
||||
if(day == 6) n--; // 周六开服的服务器延后一周开启跨服
|
||||
return n <= GVG.GVG_CROSS_SERVICE_STARTTIME? GVG_SERVER_TYPE.SINGLE: GVG_SERVER_TYPE.MULTI;
|
||||
}
|
||||
|
||||
function getCurrentTeamTime(time: number) {
|
||||
let teamConfig = gameData.gvgPeriod.get(GVG_PERIOD.TEAM);
|
||||
// 本周日
|
||||
let _teamTime = <number>getTimeFun(time).getTimeWithWeek(teamConfig.startDay, teamConfig.startHour, teamConfig.startMinute, teamConfig.startSecond);
|
||||
return _teamTime > time? _teamTime - WEEK_TO_SECOND: _teamTime;
|
||||
}
|
||||
|
||||
export async function getGVGServerType(serverId: number) {
|
||||
let openTime = await getServerCreateTime(serverId);
|
||||
return getServerTypeByTime(openTime)
|
||||
}
|
||||
|
||||
export function getGVGPeriodData() {
|
||||
let { configId, teamTime, prepareTime, battleTime, scheduleTime } = getGVGConfig();
|
||||
let period = getCurPeriod();
|
||||
let countdownTime = teamTime;
|
||||
switch(period) {
|
||||
case GVG_PERIOD.TEAM: {
|
||||
countdownTime = prepareTime; break;
|
||||
}
|
||||
case GVG_PERIOD.PREPARE: {
|
||||
countdownTime = battleTime; break;
|
||||
}
|
||||
case GVG_PERIOD.BATTLE: {
|
||||
countdownTime = scheduleTime; break;
|
||||
}
|
||||
}
|
||||
|
||||
// console.log('######## getGVGPeriodData', configId, teamTime, prepareTime, battleTime, scheduleTime)
|
||||
return { configId, period, countdownTime };
|
||||
}
|
||||
|
||||
export function getCurPeriod() {
|
||||
let { teamTime, prepareTime, battleTime, scheduleTime } = getGVGConfig();
|
||||
return getPeriodByTime(teamTime, prepareTime, battleTime, scheduleTime)
|
||||
}
|
||||
|
||||
export function getPeriodByTime(teamTime: number, prepareTime: number, battleTime: number, scheduleTime: number) {
|
||||
let now = nowSeconds();
|
||||
if(now >= teamTime && now < prepareTime) {
|
||||
return GVG_PERIOD.TEAM;
|
||||
} else if (now >= prepareTime && now < battleTime) {
|
||||
return GVG_PERIOD.PREPARE;
|
||||
} else if (now >= battleTime && now < scheduleTime){
|
||||
return GVG_PERIOD.BATTLE;
|
||||
} else {
|
||||
return GVG_PERIOD.NO;
|
||||
}
|
||||
}
|
||||
|
||||
export async function initLeaguePrepare() {
|
||||
const config = await GVGConfigModel.findConfig();
|
||||
if(!config) return;
|
||||
const leagues = await GVGLeagueModel.findAllLeague();
|
||||
let groupKeyByServerId = new Map<number, string>();
|
||||
for(let { leagueCode, memberCnt, serverId } of leagues) {
|
||||
let groupKey = groupKeyByServerId.get(serverId);
|
||||
if(!groupKey) {
|
||||
groupKey = await getGroupKey(serverId);
|
||||
groupKeyByServerId.set(serverId, groupKey);
|
||||
}
|
||||
|
||||
await GVGLeaguePrepareModel.initData(config.configId, groupKey, leagueCode, memberCnt);
|
||||
}
|
||||
}
|
||||
|
||||
export async function getGVGInfoInGuild(roleId: string, guild: GuildType) {
|
||||
let hasLeague = !!guild.leagueCode;
|
||||
let serverId = guild.serverId;
|
||||
let { configId, period, countdownTime } = getGVGPeriodData();
|
||||
let { startFightTime, endFightTime } = getFightTimeByPeriod(period);
|
||||
let type = await getGVGServerType(serverId);
|
||||
|
||||
if(hasLeague && configId > 0) {
|
||||
return {
|
||||
hasLeague,
|
||||
configId, period, countdownTime,
|
||||
type,
|
||||
applyCnt: await getApplyCnt(guild.leagueCode),
|
||||
...await getMainData(roleId, guild.leagueCode, configId, period, countdownTime, type),
|
||||
leagueDetailRank: await getLeagueRankBox(configId, guild.leagueCode, roleId),
|
||||
myTeamCnt: await GVGTeamModel.getTeamCntByRole(roleId),
|
||||
startFightTime, endFightTime
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
hasLeague,
|
||||
configId, period, countdownTime,
|
||||
startFightTime, endFightTime,
|
||||
type,
|
||||
invitationCnt: await getInviteCnt(guild.code)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export async function calLeagueCe(league: GVGLeagueType) {
|
||||
const guildCodes = league?.guildCodes||[];
|
||||
const guilds = await GuildModel.findByCodes(guildCodes);
|
||||
return guilds.reduce((pre, guild) => pre + guild.guildCe, 0);
|
||||
}
|
||||
|
||||
// 检查当前赛季阶段
|
||||
export async function checkGVGPeriod(p : GVG_PERIOD) {
|
||||
let { period } = getGVGPeriodData();
|
||||
return period == p;
|
||||
}
|
||||
|
||||
// —————— 红点相关 —————— //
|
||||
// 邀请
|
||||
export async function getInviteCnt(guildCode: string) {
|
||||
let invitation = await GVGLeagueApplyModel.findInviteFromGuildWithoutPopulate(guildCode);
|
||||
return invitation.length
|
||||
}
|
||||
|
||||
// 申请
|
||||
export async function getApplyCnt(leagueCode: string) {
|
||||
let applies = await GVGLeagueApplyModel.findApplyFromLeagueWithoutPopulate(leagueCode);
|
||||
return applies.length
|
||||
}
|
||||
|
||||
export async function getMainData(roleId: string, leagueCode: string, configId: number, period: number, countdownTime: number, serverType: number) {
|
||||
let data = new GVGMainData(configId, period, countdownTime, serverType);
|
||||
|
||||
let league = await GVGLeagueModel.findByCode(leagueCode);
|
||||
if(league) {
|
||||
data.setLeague(league, {});
|
||||
|
||||
let leaguePrepare = await GVGLeaguePrepareModel.findByLeague(configId, league.leagueCode);
|
||||
data.setLeagueParpare(leaguePrepare);
|
||||
data.setTechQueue(leaguePrepare?.techQueue||[]);
|
||||
|
||||
let userData = await GVGUserDataModel.findByRole(configId, league.leagueCode, roleId);
|
||||
let roleData = await GVGRoleDataModel.findByRole(configId, roleId);
|
||||
let items = await GVGUserItemModel.findByRole(configId, league.leagueCode, roleId);
|
||||
let tasks = await GVGUserTaskModel.findByRole(configId, league.leagueCode, roleId);
|
||||
data.setPlayerInfo(userData, roleData, getMyAuth(league, roleId), undefined, undefined, items, tasks);
|
||||
data.setLeagueCe(await calLeagueCe(league));
|
||||
data.setConstribute(await getContribute(userData));
|
||||
}
|
||||
|
||||
let myInfo = pick(data.myInfo, ['auth', 'items', 'tasks', 'receivedLv']);
|
||||
return { ...pick(data, ['guildCnt', 'leagueLv', 'techQueue', 'constribute']), myInfo }
|
||||
}
|
||||
|
||||
export async function getContribute(myUserData: GVGUserDataType) {
|
||||
const { contribute = new Contribute(), box = [] } = myUserData||{};
|
||||
|
||||
const result: LeagueContributeInfo[] = [];
|
||||
for(let curJob of [LEAGUE_JOB.PRODUCER, LEAGUE_JOB.FIGHTER]) {
|
||||
let sumContribute = curJob == LEAGUE_JOB.PRODUCER? calProducerContribute(contribute): calFighterContribute(contribute);
|
||||
let boxReceived = box.filter(boxId => {
|
||||
let dicBox = gameData.gvgContributeBox.get(boxId);
|
||||
return dicBox.job == curJob;
|
||||
});
|
||||
let disObj = new LeagueContributeInfo(curJob, sumContribute, boxReceived);
|
||||
result.push(disObj)
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export async function getLeagueRankBox(configId: number, leagueCode: string, roleId: string) {
|
||||
let joinTime = await getMemberJoinLeagueTime(leagueCode, roleId);
|
||||
let canReceiveLeagueRanks = await GVGVestigeLeagueRankModel.getCanReceiveRanks(configId, leagueCode, roleId, joinTime);
|
||||
let canReceivePlayerRanks = await GVGVestigeSumRankModel.getCanReceiveRanks(configId, roleId);
|
||||
let { canReceiveBox } = calVestigeLeagueBoxRewards(canReceiveLeagueRanks, canReceivePlayerRanks);
|
||||
return { canReceiveBox }
|
||||
}
|
||||
|
||||
export async function getGroupKey(serverId: number) {
|
||||
let serverType = await getGVGServerType(serverId);
|
||||
if(serverType == GVG_SERVER_TYPE.SINGLE) {
|
||||
return `s${serverId}`;
|
||||
} else {
|
||||
let groupId = await getGVGGroupIdOfServer(serverId);
|
||||
return `g${groupId}`;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 之前gvgLeague表的members没有记录加入联军时间,所以如果查询没有time的话,根据userGuild的time来更新一下这个数据
|
||||
*
|
||||
* 获取玩家加入联军时间
|
||||
* @param leagueCode 联军id
|
||||
* @param roleId
|
||||
* @param league 联军表数据
|
||||
* @returns
|
||||
*/
|
||||
export async function getMemberJoinLeagueTime(leagueCode: string, roleId: string, league?: GVGLeagueType) {
|
||||
if(!league) league = await GVGLeagueModel.findByCode(leagueCode, 'members');
|
||||
let members = league?.members||[];
|
||||
let member = members.find(cur => cur.roleId == roleId);
|
||||
if(!member) return 0;
|
||||
if(!member.time) {
|
||||
let userGuild = await UserGuildModel.getMyGuild(roleId, 'createdAt');
|
||||
let time = getSeconds(userGuild.createdAt);
|
||||
await GVGLeagueModel.setMemberTime(leagueCode, roleId, time);
|
||||
return time;
|
||||
}
|
||||
return member.time;
|
||||
}
|
||||
|
||||
@@ -1,265 +1,265 @@
|
||||
// 和gvg组建期相关的方法
|
||||
|
||||
import { pinus } from "pinus";
|
||||
import { GUILD_AUTH, GVG_APPLY_TYPE, GVG_PERIOD, GVG_SERVER_TYPE, LEAGUE_AUTH, LEAGUE_MANAGE_TYPE, PUSH_ROUTE, REDIS_KEY, STATUS } from "../../consts";
|
||||
import { GuildModel, GuildType } from "../../db/Guild";
|
||||
import { GVGCityModel } from "../../db/GVGCity";
|
||||
import { GVGCityAreaPointModel } from "../../db/GVGCityAreaPoint";
|
||||
import { GVGLeagueModel, GVGLeagueType, GVGLeagueUpdate } from "../../db/GVGLeague";
|
||||
import { GVGLeagueApplyModel, GVGLeagueApplyType } from "../../db/GVGLeagueApply";
|
||||
import { GVGLeaguePrepareModel, GVGLeaguePrepareType } from "../../db/GVGLeaguePrepare";
|
||||
import { GVGTeamModel } from "../../db/GVGTeam";
|
||||
import { RoleType } from "../../db/Role";
|
||||
import { UserGuildModel } from "../../db/UserGuild";
|
||||
import { LeagueGuildInfo, LeagueListInfo } from "../../domain/gvgField/returnData";
|
||||
import { LeagueLeader } from "../../domain/rank";
|
||||
import { GVG } from "../../pubUtils/dicParam";
|
||||
import { getZeroPointD } from "../../pubUtils/timeUtil";
|
||||
import { resResult } from "../../pubUtils/util";
|
||||
import { updateUserInfo } from "../redisService";
|
||||
import { getGVGBattleData } from "../memoryCache/gvgBattleData";
|
||||
import { guildJoinLeagueRecord } from "./gvgRecService";
|
||||
import { calLeagueCe, getCurPeriod, getGroupKey, getGVGConfig, getGVGPeriodData, getGVGServerType } from "./gvgService";
|
||||
|
||||
/**
|
||||
* 自动创建联军
|
||||
* @param guildCode 创建联军的那个军团
|
||||
* @returns GVGLeagueType
|
||||
*/
|
||||
export async function autoCreateLeague(guildCode: string) {
|
||||
let guild = await GuildModel.findByCode(guildCode, null, '+members +serverId');
|
||||
if(!guild || guild.lv < GVG.GVG_ARMY_LEAGUE_TIME) return;
|
||||
|
||||
let { configId, period } = getGVGPeriodData();
|
||||
if(period == GVG_PERIOD.PREPARE) {
|
||||
let league = await createLeague(guild, {});
|
||||
let groupKey = await getGroupKey(guild.serverId);
|
||||
await GVGLeaguePrepareModel.initData(configId, groupKey, league.leagueCode, guild.memberCnt);
|
||||
return league;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建联军
|
||||
* @param guild 创建联军的那个军团
|
||||
* @param params 联军的一些初始数据
|
||||
* @returns
|
||||
*/
|
||||
export async function createLeague(guild: GuildType, params: GVGLeagueUpdate) {
|
||||
let serverType = await getGVGServerType(guild.serverId);
|
||||
params.type = serverType;
|
||||
params.serverId = guild.serverId;
|
||||
const league = await GVGLeagueModel.createLeague(guild, params);
|
||||
await GuildModel.joinLeague(guild.code, league.leagueCode);
|
||||
return league;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取在联军中的职位
|
||||
* @param league
|
||||
* @param roleId
|
||||
* @returns
|
||||
*/
|
||||
export function getMyAuth(league: GVGLeagueType, roleId: string) {
|
||||
let members = league.members;
|
||||
let member = members.find(cur => cur.roleId == roleId);
|
||||
return member?.auth?? LEAGUE_AUTH.MEMBER;
|
||||
}
|
||||
|
||||
/**
|
||||
* 加入联军的当天如果是在准备期,这天不能去参加内政
|
||||
* @param roleId
|
||||
* @returns
|
||||
*/
|
||||
export async function checkCanPrepare(roleId: string) {
|
||||
let userGuild = await UserGuildModel.getMyGuild(roleId, 'createdAt');
|
||||
let today = getZeroPointD();
|
||||
return userGuild.createdAt < today;
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否可以选择职能,如果选择的人数超过了就不可以选
|
||||
* @param myJob
|
||||
* @param league
|
||||
* @returns
|
||||
*/
|
||||
export function checkCanChooseJob(myJob: number, league: GVGLeaguePrepareType) {
|
||||
if(myJob > 0) return false;
|
||||
if(!league) return false;
|
||||
let { producerCnt, fighterCnt, maxMemberCnt } = league;
|
||||
return producerCnt + fighterCnt <= maxMemberCnt;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取申请数据
|
||||
* @param apply 本条申请原数据
|
||||
* @param serverNames 全服务器的名字from redis
|
||||
* @param invitations 本联军向其他军团发出的邀请
|
||||
* @returns
|
||||
*/
|
||||
export function getLeagueApplyData(apply: GVGLeagueApplyType, serverNames: any, invitations: GVGLeagueApplyType[] ) {
|
||||
let data = new LeagueGuildInfo(<GuildType>apply.guild, serverNames);
|
||||
let hasInvited = !!invitations.find(cur => cur.guildCode == apply.guildCode);
|
||||
data.setHasInvited(hasInvited);
|
||||
return data;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取邀请数据
|
||||
* @param invite 本条邀请原数据
|
||||
* @param serverNames 全服务器的名字from redis
|
||||
* @param applies 本军团向其他联军发出的申请
|
||||
* @returns
|
||||
*/
|
||||
export async function getLeagueInviteData(invite: GVGLeagueApplyType, serverNames: any, applies: GVGLeagueApplyType[]) {
|
||||
let data = new LeagueListInfo(<GVGLeagueType>invite.league, serverNames);
|
||||
let hasApply = !!applies.find(cur => cur.leagueCode == invite.guildCode);
|
||||
data.setHasApply(hasApply);
|
||||
data.setLeagueCe(await calLeagueCe(<GVGLeagueType>invite.league))
|
||||
return data;
|
||||
}
|
||||
|
||||
/**
|
||||
* 联军加入军团
|
||||
* @param myLeague
|
||||
* @param targetGuildCode
|
||||
* @returns
|
||||
*/
|
||||
export async function joinGuildToLeague(league: GVGLeagueType, targetGuildCode: string) {
|
||||
const hasApply = await GVGLeagueApplyModel.checkApply(league.leagueCode, targetGuildCode, GVG_APPLY_TYPE.ALL);
|
||||
if(!hasApply) {
|
||||
return resResult(STATUS.GUILD_NOT_APPLY);
|
||||
}
|
||||
if(league.guildCnt >= GVG.GVG_LEAGUE_COMPOSE) {
|
||||
return resResult(STATUS.LEAGUE_IS_GUILD_MAX);
|
||||
}
|
||||
let hisLeague = await GVGLeagueModel.findLeagueByGuild(targetGuildCode);
|
||||
if(hisLeague) {
|
||||
await GVGLeagueApplyModel.deleteApply(targetGuildCode, league.leagueCode);
|
||||
return resResult(STATUS.TARGET_GUILD_HAS_LEAGUE);
|
||||
}
|
||||
|
||||
const targetGuild = await GuildModel.findByCode(targetGuildCode, null, '+members');
|
||||
if(!targetGuild) return resResult(STATUS.TARGET_GUILD_NOT_FOUND);
|
||||
if(targetGuild.lv < GVG.GVG_ARMY_LEAGUE_TIME) return resResult(STATUS.GUILD_LV_NOT_ENOUGH);
|
||||
|
||||
league = await GVGLeagueModel.joinGuild(league.leagueCode, targetGuild);
|
||||
|
||||
await GuildModel.joinLeague(targetGuildCode, league.leagueCode);
|
||||
guildJoinLeagueRecord(league.leagueCode, targetGuild.name);
|
||||
|
||||
return resResult(STATUS.SUCCESS, league);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否可以进行组建联军等操作
|
||||
* @param serverId
|
||||
* @param serverType
|
||||
* @returns
|
||||
*/
|
||||
export async function checkCanManage(serverId: number, serverType?: number) {
|
||||
if(!serverType) serverType = await getGVGServerType(serverId);
|
||||
if(serverType != GVG_SERVER_TYPE.MULTI) return resResult(STATUS.GVG_TEAM_SERVER_TYPE_ERR);
|
||||
let { period } = getGVGPeriodData();
|
||||
if(period != GVG_PERIOD.TEAM) return resResult(STATUS.GVG_NOT_TEAM_PERIOD);
|
||||
return resResult(STATUS.SUCCESS);
|
||||
}
|
||||
|
||||
/**
|
||||
* 一些操作只能由军团的团长才能操作
|
||||
* @param guildCode
|
||||
* @param roleId
|
||||
* @param guild
|
||||
* @returns
|
||||
*/
|
||||
export async function checkGuildLeader(guildCode: string, roleId: string, guild?: GuildType) {
|
||||
if(!guild) guild = await GuildModel.findByCode(guildCode, null, '+members +serverId');
|
||||
if(!guild) return resResult(STATUS.GVG_HAS_NO_AUTH);
|
||||
if(guild.lv < GVG.GVG_ARMY_LEAGUE_TIME) return resResult(STATUS.GUILD_LV_NOT_ENOUGH);
|
||||
|
||||
const userGuild = await UserGuildModel.getMyGuild(roleId, 'auth');
|
||||
if(!userGuild || userGuild.auth != GUILD_AUTH.LEADER) return resResult(STATUS.GVG_HAS_NO_AUTH);
|
||||
return resResult(STATUS.SUCCESS);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查联军的操作
|
||||
* @param roleId
|
||||
* @param myLeague
|
||||
* @param type
|
||||
* @returns
|
||||
*/
|
||||
export async function checkLeagueAuth(roleId: string, myLeague: GVGLeagueType, type: LEAGUE_MANAGE_TYPE) {
|
||||
const auth = getMyAuth(myLeague, roleId);
|
||||
console.log('****', auth)
|
||||
const needAuth = getAuthFromManageType(type);
|
||||
return needAuth.indexOf(auth) > -1
|
||||
}
|
||||
|
||||
function getAuthFromManageType(type: LEAGUE_MANAGE_TYPE) {
|
||||
switch(type) {
|
||||
case LEAGUE_MANAGE_TYPE.HANDLE_APPLY:
|
||||
case LEAGUE_MANAGE_TYPE.INVITE:
|
||||
case LEAGUE_MANAGE_TYPE.KICK:
|
||||
case LEAGUE_MANAGE_TYPE.DISSMISS:
|
||||
case LEAGUE_MANAGE_TYPE.ABDICATE:
|
||||
case LEAGUE_MANAGE_TYPE.RERUIT:
|
||||
return [LEAGUE_AUTH.LEADER];
|
||||
case LEAGUE_MANAGE_TYPE.QUIT:
|
||||
case LEAGUE_MANAGE_TYPE.BE_ABDICATED:
|
||||
return [LEAGUE_AUTH.SUB_LEADER];
|
||||
case LEAGUE_MANAGE_TYPE.SET_INFO:
|
||||
case LEAGUE_MANAGE_TYPE.SEND_MAIL:
|
||||
case LEAGUE_MANAGE_TYPE.UNLOCK_TECH:
|
||||
case LEAGUE_MANAGE_TYPE.SET_TARGET_CITY:
|
||||
case LEAGUE_MANAGE_TYPE.SET_NOTICE:
|
||||
return [LEAGUE_AUTH.LEADER, LEAGUE_AUTH.SUB_LEADER];
|
||||
case LEAGUE_MANAGE_TYPE.ACTIVATE_TECH:
|
||||
return [LEAGUE_AUTH.LEADER, LEAGUE_AUTH.SUB_LEADER, LEAGUE_AUTH.MEMBER];
|
||||
}
|
||||
}
|
||||
|
||||
export async function memberJoinGuildToLeague(guild: GuildType, role: RoleType) {
|
||||
if(!guild.leagueCode) return;
|
||||
await GVGLeagueModel.joinMember(guild.leagueCode, role.roleId, guild.code);
|
||||
}
|
||||
|
||||
export async function memberQuitGuildToLeague(guild: GuildType, role: RoleType) {
|
||||
if(!guild.leagueCode) return;
|
||||
await GVGLeagueModel.quitMember(guild.leagueCode, role.roleId);
|
||||
}
|
||||
|
||||
export async function guildDismissToLeague(guild: GuildType) {
|
||||
if(!guild.leagueCode) return;
|
||||
await GVGLeagueModel.quitGuild(guild.leagueCode, guild);
|
||||
}
|
||||
|
||||
export async function guildAbdicateToLeague(guild: GuildType, fromRoleId: string, toRole: RoleType) {
|
||||
if(!guild.leagueCode) return;
|
||||
await GVGLeagueModel.abdicateGuild(guild.leagueCode, fromRoleId, toRole.roleId, toRole._id);
|
||||
await updateUserInfo(REDIS_KEY.LEAGUE_INFO, guild.leagueCode, [{ field: 'leader', value: new LeagueLeader(toRole) }]);
|
||||
}
|
||||
|
||||
export async function updateGVGBattleLeagueInfo(serverId: number, leagueCode: string, info: { leagueName?: string, icon?: number }) {
|
||||
await GVGTeamModel.updateLeagueName(leagueCode, info.leagueName);
|
||||
await GVGCityModel.updateLeagueInfo(leagueCode, info.leagueName, info.icon);
|
||||
await GVGCityAreaPointModel.updateLeagueName(leagueCode, info.leagueName)
|
||||
if(info.leagueName) await pinus.app.rpc.guild.guildRemote.updateLeagueNameMem.broadcast(serverId, leagueCode, info.leagueName);
|
||||
}
|
||||
|
||||
export async function updateLeagueNameMem(serverId: number, leagueCode: string, leagueName: string ) {
|
||||
let groupKey = await getGroupKey(serverId);
|
||||
let teamObj = getGVGBattleData(groupKey);
|
||||
teamObj.updateLeagueInfo(leagueCode, leagueName);
|
||||
}
|
||||
|
||||
export async function updateGVGBattleRoleInfo(serverId: number, roleId: string, info: { roleName?: string, lv?: number }) {
|
||||
await GVGTeamModel.updateRoleInfo(roleId, info);
|
||||
await pinus.app.rpc.guild.guildRemote.updateTeamRoleInfoMem.broadcast(serverId, roleId, info);
|
||||
}
|
||||
|
||||
export async function updateTeamRoleInfoMem(serverId: number, roleId: string, info: { roleName?: string, lv?: number } ) {
|
||||
let groupKey = await getGroupKey(serverId);
|
||||
let teamObj = getGVGBattleData(groupKey);
|
||||
teamObj.updateRoleInfo(roleId, info);
|
||||
}
|
||||
// 和gvg组建期相关的方法
|
||||
|
||||
import { pinus } from "pinus";
|
||||
import { GUILD_AUTH, GVG_APPLY_TYPE, GVG_PERIOD, GVG_SERVER_TYPE, LEAGUE_AUTH, LEAGUE_MANAGE_TYPE, PUSH_ROUTE, REDIS_KEY, STATUS } from "@consts";
|
||||
import { GuildModel, GuildType } from "@db/Guild";
|
||||
import { GVGCityModel } from "@db/GVGCity";
|
||||
import { GVGCityAreaPointModel } from "@db/GVGCityAreaPoint";
|
||||
import { GVGLeagueModel, GVGLeagueType, GVGLeagueUpdate } from "@db/GVGLeague";
|
||||
import { GVGLeagueApplyModel, GVGLeagueApplyType } from "@db/GVGLeagueApply";
|
||||
import { GVGLeaguePrepareModel, GVGLeaguePrepareType } from "@db/GVGLeaguePrepare";
|
||||
import { GVGTeamModel } from "@db/GVGTeam";
|
||||
import { RoleType } from "@db/Role";
|
||||
import { UserGuildModel } from "@db/UserGuild";
|
||||
import { LeagueGuildInfo, LeagueListInfo } from "@domain/gvgField/returnData";
|
||||
import { LeagueLeader } from "@domain/rank";
|
||||
import { GVG } from "@pubUtils/dicParam";
|
||||
import { getZeroPointD } from "@pubUtils/timeUtil";
|
||||
import { resResult } from "@pubUtils/util";
|
||||
import { updateUserInfo } from "../redisService";
|
||||
import { getGVGBattleData } from "../memoryCache/gvgBattleData";
|
||||
import { guildJoinLeagueRecord } from "./gvgRecService";
|
||||
import { calLeagueCe, getCurPeriod, getGroupKey, getGVGConfig, getGVGPeriodData, getGVGServerType } from "./gvgService";
|
||||
|
||||
/**
|
||||
* 自动创建联军
|
||||
* @param guildCode 创建联军的那个军团
|
||||
* @returns GVGLeagueType
|
||||
*/
|
||||
export async function autoCreateLeague(guildCode: string) {
|
||||
let guild = await GuildModel.findByCode(guildCode, null, '+members +serverId');
|
||||
if(!guild || guild.lv < GVG.GVG_ARMY_LEAGUE_TIME) return;
|
||||
|
||||
let { configId, period } = getGVGPeriodData();
|
||||
if(period == GVG_PERIOD.PREPARE) {
|
||||
let league = await createLeague(guild, {});
|
||||
let groupKey = await getGroupKey(guild.serverId);
|
||||
await GVGLeaguePrepareModel.initData(configId, groupKey, league.leagueCode, guild.memberCnt);
|
||||
return league;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建联军
|
||||
* @param guild 创建联军的那个军团
|
||||
* @param params 联军的一些初始数据
|
||||
* @returns
|
||||
*/
|
||||
export async function createLeague(guild: GuildType, params: GVGLeagueUpdate) {
|
||||
let serverType = await getGVGServerType(guild.serverId);
|
||||
params.type = serverType;
|
||||
params.serverId = guild.serverId;
|
||||
const league = await GVGLeagueModel.createLeague(guild, params);
|
||||
await GuildModel.joinLeague(guild.code, league.leagueCode);
|
||||
return league;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取在联军中的职位
|
||||
* @param league
|
||||
* @param roleId
|
||||
* @returns
|
||||
*/
|
||||
export function getMyAuth(league: GVGLeagueType, roleId: string) {
|
||||
let members = league.members;
|
||||
let member = members.find(cur => cur.roleId == roleId);
|
||||
return member?.auth?? LEAGUE_AUTH.MEMBER;
|
||||
}
|
||||
|
||||
/**
|
||||
* 加入联军的当天如果是在准备期,这天不能去参加内政
|
||||
* @param roleId
|
||||
* @returns
|
||||
*/
|
||||
export async function checkCanPrepare(roleId: string) {
|
||||
let userGuild = await UserGuildModel.getMyGuild(roleId, 'createdAt');
|
||||
let today = getZeroPointD();
|
||||
return userGuild.createdAt < today;
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否可以选择职能,如果选择的人数超过了就不可以选
|
||||
* @param myJob
|
||||
* @param league
|
||||
* @returns
|
||||
*/
|
||||
export function checkCanChooseJob(myJob: number, league: GVGLeaguePrepareType) {
|
||||
if(myJob > 0) return false;
|
||||
if(!league) return false;
|
||||
let { producerCnt, fighterCnt, maxMemberCnt } = league;
|
||||
return producerCnt + fighterCnt <= maxMemberCnt;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取申请数据
|
||||
* @param apply 本条申请原数据
|
||||
* @param serverNames 全服务器的名字from redis
|
||||
* @param invitations 本联军向其他军团发出的邀请
|
||||
* @returns
|
||||
*/
|
||||
export function getLeagueApplyData(apply: GVGLeagueApplyType, serverNames: any, invitations: GVGLeagueApplyType[] ) {
|
||||
let data = new LeagueGuildInfo(<GuildType>apply.guild, serverNames);
|
||||
let hasInvited = !!invitations.find(cur => cur.guildCode == apply.guildCode);
|
||||
data.setHasInvited(hasInvited);
|
||||
return data;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取邀请数据
|
||||
* @param invite 本条邀请原数据
|
||||
* @param serverNames 全服务器的名字from redis
|
||||
* @param applies 本军团向其他联军发出的申请
|
||||
* @returns
|
||||
*/
|
||||
export async function getLeagueInviteData(invite: GVGLeagueApplyType, serverNames: any, applies: GVGLeagueApplyType[]) {
|
||||
let data = new LeagueListInfo(<GVGLeagueType>invite.league, serverNames);
|
||||
let hasApply = !!applies.find(cur => cur.leagueCode == invite.guildCode);
|
||||
data.setHasApply(hasApply);
|
||||
data.setLeagueCe(await calLeagueCe(<GVGLeagueType>invite.league))
|
||||
return data;
|
||||
}
|
||||
|
||||
/**
|
||||
* 联军加入军团
|
||||
* @param myLeague
|
||||
* @param targetGuildCode
|
||||
* @returns
|
||||
*/
|
||||
export async function joinGuildToLeague(league: GVGLeagueType, targetGuildCode: string) {
|
||||
const hasApply = await GVGLeagueApplyModel.checkApply(league.leagueCode, targetGuildCode, GVG_APPLY_TYPE.ALL);
|
||||
if(!hasApply) {
|
||||
return resResult(STATUS.GUILD_NOT_APPLY);
|
||||
}
|
||||
if(league.guildCnt >= GVG.GVG_LEAGUE_COMPOSE) {
|
||||
return resResult(STATUS.LEAGUE_IS_GUILD_MAX);
|
||||
}
|
||||
let hisLeague = await GVGLeagueModel.findLeagueByGuild(targetGuildCode);
|
||||
if(hisLeague) {
|
||||
await GVGLeagueApplyModel.deleteApply(targetGuildCode, league.leagueCode);
|
||||
return resResult(STATUS.TARGET_GUILD_HAS_LEAGUE);
|
||||
}
|
||||
|
||||
const targetGuild = await GuildModel.findByCode(targetGuildCode, null, '+members');
|
||||
if(!targetGuild) return resResult(STATUS.TARGET_GUILD_NOT_FOUND);
|
||||
if(targetGuild.lv < GVG.GVG_ARMY_LEAGUE_TIME) return resResult(STATUS.GUILD_LV_NOT_ENOUGH);
|
||||
|
||||
league = await GVGLeagueModel.joinGuild(league.leagueCode, targetGuild);
|
||||
|
||||
await GuildModel.joinLeague(targetGuildCode, league.leagueCode);
|
||||
guildJoinLeagueRecord(league.leagueCode, targetGuild.name);
|
||||
|
||||
return resResult(STATUS.SUCCESS, league);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否可以进行组建联军等操作
|
||||
* @param serverId
|
||||
* @param serverType
|
||||
* @returns
|
||||
*/
|
||||
export async function checkCanManage(serverId: number, serverType?: number) {
|
||||
if(!serverType) serverType = await getGVGServerType(serverId);
|
||||
if(serverType != GVG_SERVER_TYPE.MULTI) return resResult(STATUS.GVG_TEAM_SERVER_TYPE_ERR);
|
||||
let { period } = getGVGPeriodData();
|
||||
if(period != GVG_PERIOD.TEAM) return resResult(STATUS.GVG_NOT_TEAM_PERIOD);
|
||||
return resResult(STATUS.SUCCESS);
|
||||
}
|
||||
|
||||
/**
|
||||
* 一些操作只能由军团的团长才能操作
|
||||
* @param guildCode
|
||||
* @param roleId
|
||||
* @param guild
|
||||
* @returns
|
||||
*/
|
||||
export async function checkGuildLeader(guildCode: string, roleId: string, guild?: GuildType) {
|
||||
if(!guild) guild = await GuildModel.findByCode(guildCode, null, '+members +serverId');
|
||||
if(!guild) return resResult(STATUS.GVG_HAS_NO_AUTH);
|
||||
if(guild.lv < GVG.GVG_ARMY_LEAGUE_TIME) return resResult(STATUS.GUILD_LV_NOT_ENOUGH);
|
||||
|
||||
const userGuild = await UserGuildModel.getMyGuild(roleId, 'auth');
|
||||
if(!userGuild || userGuild.auth != GUILD_AUTH.LEADER) return resResult(STATUS.GVG_HAS_NO_AUTH);
|
||||
return resResult(STATUS.SUCCESS);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查联军的操作
|
||||
* @param roleId
|
||||
* @param myLeague
|
||||
* @param type
|
||||
* @returns
|
||||
*/
|
||||
export async function checkLeagueAuth(roleId: string, myLeague: GVGLeagueType, type: LEAGUE_MANAGE_TYPE) {
|
||||
const auth = getMyAuth(myLeague, roleId);
|
||||
console.log('****', auth)
|
||||
const needAuth = getAuthFromManageType(type);
|
||||
return needAuth.indexOf(auth) > -1
|
||||
}
|
||||
|
||||
function getAuthFromManageType(type: LEAGUE_MANAGE_TYPE) {
|
||||
switch(type) {
|
||||
case LEAGUE_MANAGE_TYPE.HANDLE_APPLY:
|
||||
case LEAGUE_MANAGE_TYPE.INVITE:
|
||||
case LEAGUE_MANAGE_TYPE.KICK:
|
||||
case LEAGUE_MANAGE_TYPE.DISSMISS:
|
||||
case LEAGUE_MANAGE_TYPE.ABDICATE:
|
||||
case LEAGUE_MANAGE_TYPE.RERUIT:
|
||||
return [LEAGUE_AUTH.LEADER];
|
||||
case LEAGUE_MANAGE_TYPE.QUIT:
|
||||
case LEAGUE_MANAGE_TYPE.BE_ABDICATED:
|
||||
return [LEAGUE_AUTH.SUB_LEADER];
|
||||
case LEAGUE_MANAGE_TYPE.SET_INFO:
|
||||
case LEAGUE_MANAGE_TYPE.SEND_MAIL:
|
||||
case LEAGUE_MANAGE_TYPE.UNLOCK_TECH:
|
||||
case LEAGUE_MANAGE_TYPE.SET_TARGET_CITY:
|
||||
case LEAGUE_MANAGE_TYPE.SET_NOTICE:
|
||||
return [LEAGUE_AUTH.LEADER, LEAGUE_AUTH.SUB_LEADER];
|
||||
case LEAGUE_MANAGE_TYPE.ACTIVATE_TECH:
|
||||
return [LEAGUE_AUTH.LEADER, LEAGUE_AUTH.SUB_LEADER, LEAGUE_AUTH.MEMBER];
|
||||
}
|
||||
}
|
||||
|
||||
export async function memberJoinGuildToLeague(guild: GuildType, role: RoleType) {
|
||||
if(!guild.leagueCode) return;
|
||||
await GVGLeagueModel.joinMember(guild.leagueCode, role.roleId, guild.code);
|
||||
}
|
||||
|
||||
export async function memberQuitGuildToLeague(guild: GuildType, role: RoleType) {
|
||||
if(!guild.leagueCode) return;
|
||||
await GVGLeagueModel.quitMember(guild.leagueCode, role.roleId);
|
||||
}
|
||||
|
||||
export async function guildDismissToLeague(guild: GuildType) {
|
||||
if(!guild.leagueCode) return;
|
||||
await GVGLeagueModel.quitGuild(guild.leagueCode, guild);
|
||||
}
|
||||
|
||||
export async function guildAbdicateToLeague(guild: GuildType, fromRoleId: string, toRole: RoleType) {
|
||||
if(!guild.leagueCode) return;
|
||||
await GVGLeagueModel.abdicateGuild(guild.leagueCode, fromRoleId, toRole.roleId, toRole._id);
|
||||
await updateUserInfo(REDIS_KEY.LEAGUE_INFO, guild.leagueCode, [{ field: 'leader', value: new LeagueLeader(toRole) }]);
|
||||
}
|
||||
|
||||
export async function updateGVGBattleLeagueInfo(serverId: number, leagueCode: string, info: { leagueName?: string, icon?: number }) {
|
||||
await GVGTeamModel.updateLeagueName(leagueCode, info.leagueName);
|
||||
await GVGCityModel.updateLeagueInfo(leagueCode, info.leagueName, info.icon);
|
||||
await GVGCityAreaPointModel.updateLeagueName(leagueCode, info.leagueName)
|
||||
if(info.leagueName) await pinus.app.rpc.guild.guildRemote.updateLeagueNameMem.broadcast(serverId, leagueCode, info.leagueName);
|
||||
}
|
||||
|
||||
export async function updateLeagueNameMem(serverId: number, leagueCode: string, leagueName: string ) {
|
||||
let groupKey = await getGroupKey(serverId);
|
||||
let teamObj = getGVGBattleData(groupKey);
|
||||
teamObj.updateLeagueInfo(leagueCode, leagueName);
|
||||
}
|
||||
|
||||
export async function updateGVGBattleRoleInfo(serverId: number, roleId: string, info: { roleName?: string, lv?: number }) {
|
||||
await GVGTeamModel.updateRoleInfo(roleId, info);
|
||||
await pinus.app.rpc.guild.guildRemote.updateTeamRoleInfoMem.broadcast(serverId, roleId, info);
|
||||
}
|
||||
|
||||
export async function updateTeamRoleInfoMem(serverId: number, roleId: string, info: { roleName?: string, lv?: number } ) {
|
||||
let groupKey = await getGroupKey(serverId);
|
||||
let teamObj = getGVGBattleData(groupKey);
|
||||
teamObj.updateRoleInfo(roleId, info);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user