Files
ZYZ/game-server/app/servers/guild/handler/gvgBattleHandler.ts
2023-02-17 11:00:25 +08:00

531 lines
24 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { GVGRecModel } from '../../../db/GVGRec';
import { GVGAreaInMap, GVGTeamInList, GVGTeamInListOnPoint, GVGTeamSpineInMap, LeagueGood, MyTeamInfo, MyTeamSimpleInfo } from '../../../domain/gvgField/returnData';
import { GVGTeamModel, GVGTeamType, GVGTeamUpdate } from '../../../db/GVGTeam';
import { GVGUserDataModel } from '../../../db/GVGUserData';
import { GVGCityModel } from '../../../db/GVGCity';
import { Application, BackendSession, ChannelService, HandlerService, pinus } from "pinus";
import { resResult, genCode } from "../../../pubUtils/util";
import { GVGLeagueModel } from '../../../db/GVGLeague';
import { checkGVGPeriod, getGroupIdOfServer, getGVGConfig, getGVGPeriodData, getGVGServerType } from '../../../services/gvg/gvgService';
import { addBattleRankScore, calBattleScoreByCe, checkAreaIsInCity, checkGVGBattleStart, checkMoveStatus, getBattleRanks, getBirthAreaOfCity, getGVGWarId, getOppHeroes, initRobots, pushTeamMoveMessage, teamBreak } from '../../../services/gvg/gvgBattleService';
import { getGVGBattleData } from '../../../services/gvg/gvgBattleMemory';
import { GVGBattleRecModel } from '../../../db/GVGBattleRec';
import { getFightTimeByPeriod } from '../../../services/gvg/gvgFightService';
import { gameData } from '../../../pubUtils/data';
import { getAllServerName } from '../../../services/redisService';
import { checkBattleHeroesByHid } from '../../../services/normalBattleService';
import { SaveTeamParam, SaveTeamUpdateParam } from '../../../domain/gvgField/gvgDb';
import { STATUS } from '../../../consts';
import { GVGHeroInfo } from '../../../domain/dbGeneral';
import { ArtifactModel } from '../../../db/Artifact';
import { getHeroesAttributes } from '../../../services/playerCeService';
import { addRoleToAreaChannel, addRoleToAreaTeamChannel, leaveGVGAreaChannel, leaveGVGAreaTeamChannel } from '../../../services/chatChannelService';
export default function (app: Application) {
new HandlerService(app, {});
return new GVGBattleHandler(app);
}
export class GVGBattleHandler {
channelService: ChannelService;
constructor(private app: Application) {
this.channelService = app.get('channelService');
}
// 获取我的编队信息
async getTeams(msg: {}, session: BackendSession) {
const roleId = session.get('roleId');
const teams = await GVGTeamModel.findByRole(roleId, '-_id teamCode index head frame spine lineup')
return resResult(STATUS.SUCCESS, { teams: teams.map(team => new MyTeamSimpleInfo(team)) });
}
// 保存队伍
// index: 队伍索引位置
// head: 头像
// frame: 相框
// spine: 形象
// lineup: 阵容
async saveTeam(msg: SaveTeamParam, session: BackendSession) {
const roleId = session.get('roleId');
const serverId = session.get('serverId');
const roleName = session.get('roleName');
const guildCode = session.get('guildCode');
const { index, head, spine, frame, lineup } = msg;
let { configId, period } = getGVGPeriodData();
// if (period != GVG_PERIOD.BATTLE) return resResult(STATUS.GVG_NOT_BATTLE_PERIOD); // TODO 测试临时注
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
let { leagueCode, name: leagueName } = myLeague;
let durability = gameData.gvgTeamDurability.get(index)||0;
let updateParam: SaveTeamUpdateParam = { index, head, spine, frame, configId, groupId, serverType }
if(lineup) {
let attrByHid = await getHeroesAttributes(roleId);
let { isOK, heroes } = await checkBattleHeroesByHid(roleId, lineup.map(cur => cur.actorId));
if(!isOK) return resResult(STATUS.BATTLE_HERO_NOT_FOUND);
let newLineup: GVGHeroInfo[] = [];
for(let { actorId, dataId, order } of lineup) {
let hero = heroes.find(cur => cur.hid == actorId);
if(hero) {
let artifact = hero.artifact? await ArtifactModel.findbySeqId(roleId, hero.artifact): null;
let heroInfo = new GVGHeroInfo();
heroInfo.setHeroInfo(hero, artifact);
heroInfo.setDataId(dataId, order);
let attr = attrByHid.get(actorId);
if(!attr) continue;
let attribute = attr.getAttributesToString();
heroInfo.setAttribute(attribute);
newLineup.push(heroInfo);
}
}
let lineupCe = heroes.reduce((pre, cur) => pre + cur.ce, 0);
updateParam.lineup = newLineup;
updateParam.lineupCe = lineupCe;
}
const team = await GVGTeamModel.saveTeam(roleId, index, updateParam, { roleName, serverId, leagueCode, leagueName, durability, maxDurability: durability });
if (!team) {
return resResult(STATUS.GVG_SAVE_TEAM_FAILED);
}
return resResult(STATUS.SUCCESS, { curTeam: new MyTeamSimpleInfo(team) });
}
// 获取城池信息
async getCity(msg: { cityId: number }, session: BackendSession) {
const guildCode = session.get('guildCode');
const { cityId } = msg;
let { configId, period } = getGVGPeriodData();
let { startFightTime, endFightTime } = getFightTimeByPeriod(period);
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
const city = await GVGCityModel.findOne({ configId, cityId }).lean();
const { guardLeague: leagueCode = '', guardLeagueName: name = '', guardLeagueIcon: icon = 0, players } = city;
let ourTeamCnt = 0, oppTeamCnt = 0;
for(let { leagueCode, teamCnt } of players) {
myLeague.leagueCode == leagueCode? (ourTeamCnt+= teamCnt): (oppTeamCnt += teamCnt);
}
return resResult(STATUS.SUCCESS, {
cityId,
guardLeague: { leagueCode, name, icon },
guardStartTime: startFightTime - 3 * 60,// TODO 进系统参数表
startTime: startFightTime,
endTime: endFightTime,
ourTeamCnt,
oppTeamCnt,
});
}
// 进入城池之前的检查
async checkMyTeam(msg: { cityId: number }, session: BackendSession) {
const roleId = session.get('roleId');
const { cityId } = msg;
let hasSettled = false, otherCityId = 0;
const teams = await GVGTeamModel.findByRole(roleId, 'cityId');
// 玩家队伍信息中城池id不一致说明玩家已经进入了其他城池
for(let { cityId: teamCityId } of teams) {
if(teamCityId > 0 && teamCityId != cityId) {
hasSettled = true; otherCityId = teamCityId; break;
}
}
return resResult(STATUS.SUCCESS, { hasSettled, cityId: otherCityId });
}
// 进入城池
async enterCity(msg: { cityId: number }, session: BackendSession) {
const roleId = session.get('roleId');
const roleName = session.get('roleName');
const serverId = session.get('serverId');
const guildCode = session.get('guildCode');
const { cityId } = msg;
let { configId, period } = getGVGPeriodData();
// if (period != GVG_PERIOD.BATTLE) return resResult(STATUS.GVG_NOT_BATTLE_PERIOD); // TODO 测试临时注
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
// 初始化本城池的守擂机器人
await initRobots(configId, groupId, serverType, cityId);
let teams = await GVGTeamModel.findByRole(roleId, '-_id');
// 每赛季初自己的几支队伍恢复耐久、城市、顺便更新一下自己的玩家名、联军
let updateArr: GVGTeamUpdate[] = [], originCityId = 0;
for(let team of teams) {
if(team.configId != configId) {
let { teamCode, maxDurability } = team;
updateArr.push({ teamCode, durability: maxDurability, cityId: 0, areaId: 0, pointId: 0, roleName, guildCode, leagueCode: myLeague.leagueCode, leagueName: myLeague.name, groupId, serverType });
}
if(team.cityId) originCityId = team.cityId;
}
if(updateArr.length > 0) teams = await GVGTeamModel.refreshByConfig(roleId, updateArr);
// 检测是否已经在城池中,玩家不在这个城池中时进行处理
if (originCityId != cityId) {
let gvgUserData = await GVGUserDataModel.findByRole(configId, myLeague.leagueCode, roleId);
if(gvgUserData?.cityId > 0) { // 如果leaveCity没有退出成功玩家还遗留在上一座城中做一下处理
await GVGCityModel.decreasePlayer(configId, groupId, serverType, gvgUserData.cityId, roleId);
}
const roleTeamCnt = await GVGTeamModel.getTeamCntByRole(roleId);
let city = await GVGCityModel.increasePlayer(configId, groupId, serverType, cityId, roleId, myLeague.leagueCode, roleTeamCnt);
if(!city) return resResult(STATUS.GVG_BATTLE_CITY_FULL);
gvgUserData = await GVGUserDataModel.changeCity(configId, myLeague.leagueCode, roleId, cityId);
let areaId = getBirthAreaOfCity(city, myLeague.leagueCode);
await GVGTeamModel.enterCity(roleId, cityId, areaId, groupId, serverType);
teams = await GVGTeamModel.findByRole(roleId, '-_id');
// 更新内存队伍信息
let teamObj = getGVGBattleData(groupId, serverType);
teamObj.enterCity(...teams);
}
const recs = await GVGRecModel.findByCity(cityId, configId);
const teamResult = teams.map(team => new MyTeamInfo(team));
const { ranks, myRank } = await getBattleRanks(configId, groupId, serverType, cityId, myLeague);
return resResult(STATUS.SUCCESS, {
cityId,
ranks, myRank,
recs,
teams: teamResult,
});
}
// 离开城池
async leaveCity(msg: { cityId: number }, session: BackendSession) {
const roleId = session.get('roleId');
const sid = session.get('sid');
const guildCode = session.get('guildCode');
const serverId = session.get('serverId');
const { cityId } = msg;
let { configId, period } = getGVGPeriodData();
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
// 检测是否已经在城池中
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
let gvgUserData = await GVGUserDataModel.findByRole(configId, myLeague.leagueCode, roleId);
if (!gvgUserData) {
return resResult(STATUS.GVG_USER_NOT_FOUND);
}
if (gvgUserData.cityId != cityId) {
return resResult(STATUS.GVG_USER_NOT_IN_CITY);
}
const city = await GVGCityModel.decreasePlayer(configId, groupId, serverType, cityId, roleId);
if (!city) {
return resResult(STATUS.GVG_CITY_NOT_FOUND);
}
// 更新玩家城池和队伍城池
gvgUserData = await GVGUserDataModel.changeCity(configId, myLeague.leagueCode, roleId, 0);
await GVGTeamModel.enterCity(roleId, 0, 0, groupId, serverType);
// 处理内存数据
let teamObj = getGVGBattleData(groupId, serverType);
teamObj.leaveCity(roleId);
await leaveGVGAreaChannel(roleId, sid);
await leaveGVGAreaTeamChannel(roleId, sid);
return resResult(STATUS.SUCCESS);
}
// 获取区域上的队伍
async getAreaTeams(msg: { cityId: number, areaIds: number[] }, session: BackendSession) {
const roleId = session.get('roleId');
const sid = session.get('sid');
const serverId = session.get('serverId');
const { cityId, areaIds } = msg;
if(!checkAreaIsInCity(cityId, areaIds)) return resResult(STATUS.GVG_AREA_NOT_IN_CITY);
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let serverNames = await getAllServerName();
let teamObj = getGVGBattleData(groupId, serverType);
let result: GVGAreaInMap[] = [];
for(let areaId of areaIds) {
let teams = teamObj.findTeamsByArea(areaId);
let spines = teams.map(team => new GVGTeamSpineInMap(team, serverNames));
result.push({ areaId, spines })
}
// 加入频道
await leaveGVGAreaChannel(roleId, sid);
await addRoleToAreaChannel(roleId, groupId, serverType, areaIds, sid);
return resResult(STATUS.SUCCESS, { cityId, areas: result });
}
// 点击自己的编队获取区域列表
async getAreaOfMyTeam(msg: { cityId: number, teamCode: string }, session: BackendSession) {
const roleId = session.get('roleId');
const sid = session.get('sid');
const serverId = session.get('serverId');
const { cityId, teamCode } = msg;
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let myTeam = await GVGTeamModel.findByTeamCode(roleId, teamCode);
if(!myTeam) return resResult(STATUS.GVG_TEAM_NOT_FOUND);
if(myTeam.cityId != cityId) return resResult(STATUS.GVG_BATTLE_IS_NOT_IN_CITY);
let teams = await GVGTeamModel.findByAreaId(groupId, serverType, cityId, myTeam.areaId);
let points: GVGTeamInListOnPoint[] = [], players: GVGTeamInList[] = [];
let pointIds = gameData.gvgPointByAreaId.get(myTeam.areaId)||[];
for(let pointId of pointIds) {
let team = teams.find(cur => cur.pointId == pointId);
let obj = new GVGTeamInListOnPoint(pointId, !!team, team);
points.push(obj);
}
for(let team of teams) {
if(team.pointId == 0) {
let obj = new GVGTeamInList(team);
players.push(obj);
}
}
await leaveGVGAreaTeamChannel(roleId, sid);
await addRoleToAreaTeamChannel(roleId, groupId, serverType, myTeam.areaId, sid);
return resResult(STATUS.SUCCESS, {
cityId, areaId: myTeam.areaId, points, players
});
}
// 开始移动
// areaId: 要移动的目标据点 id
async startMove(msg: { cityId: number, areaId: number, teamCode: string }, session: BackendSession) {
const roleId = session.get('roleId');
const serverId = session.get('serverId');
const { areaId, cityId, teamCode } = msg;
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let team = await GVGTeamModel.findByTeamCode(roleId, teamCode);
let checkResult = checkMoveStatus(team, cityId, areaId);
if(checkResult.code != 0) return resResult(checkResult);
team = await GVGTeamModel.startMove(teamCode, areaId, team.areaId);
// 更新内存数据
let teamObj = getGVGBattleData(groupId, serverType);
teamObj.move(teamCode, areaId, team.fromAreaId, team.startMoveTime, team.stopMoveTime);
await pushTeamMoveMessage(team);
return resResult(STATUS.SUCCESS, { areaId, cityId, stopMoveTime: team.stopMoveTime });
}
// 停止移动
// areaId: 移动到的目标据点 id
async stopMove(msg: { cityId: number, areaId: number, teamCode: string }, session: BackendSession) {
const roleId = session.get('roleId');
const serverId = session.get('serverId');
const { areaId, cityId, teamCode } = msg;
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let team = await GVGTeamModel.findByTeamCode(roleId, teamCode);
if(!team) return resResult(STATUS.GVG_BATTLE_TEAM_NOT_FOUND);
if(team.cityId != cityId && team.areaId != areaId) return resResult(STATUS.GVG_BATTLE_IS_NOT_IN_CITY);
team = await GVGTeamModel.stopMove(teamCode, areaId);
// 更新内存数据
let teamObj = getGVGBattleData(groupId, serverType);
teamObj.move(teamCode, areaId, 0, team.startMoveTime, team.stopMoveTime);
return resResult(STATUS.SUCCESS, { areaId, cityId, curTeam: new MyTeamInfo(team) });
}
// 队伍入驻积分点
async teamSettle(msg: { cityId: number, areaId: number, pointId: number, teamCode: string }, session: BackendSession) {
const roleId = session.get('roleId');
const serverId = session.get('serverId');
const { pointId, teamCode } = msg;
let { configId, period } = getGVGPeriodData();
// if (period != GVG_PERIOD.BATTLE) return resResult(STATUS.GVG_NOT_BATTLE_PERIOD); // TODO 测试临时注
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let myTeam = await GVGTeamModel.findByTeamCode(roleId, teamCode);
if(!myTeam) return resResult(STATUS.GVG_TEAM_NOT_FOUND);
let dicAreaPoint = gameData.gvgAreaPoint.get(pointId);
if(dicAreaPoint.areaId != myTeam.areaId) return resResult(STATUS.GVG_POINT_NOT_AREA);
let hasOtherTeam = await GVGTeamModel.checkPoint(configId, groupId, serverType, pointId);
if(hasOtherTeam) return resResult(STATUS.GVG_POINT_HAS_SETTLED);
const curTeam = await GVGTeamModel.settlePoint(teamCode, pointId);
let teamObj = getGVGBattleData(groupId, serverType);
teamObj.teamSettle(roleId, teamCode, pointId);
return resResult(STATUS.SUCCESS, { curTeam: new MyTeamInfo(curTeam) });
}
// 队伍离开积分点
async teamLeave(msg: { cityId: number, areaId: number, pointId: number, teamCode: string }, session: BackendSession) {
const roleId = session.get('roleId');
const serverId = session.get('serverId');
const { pointId, teamCode } = msg;
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let myTeam = await GVGTeamModel.findByTeamCode(roleId, teamCode);
if(!myTeam) return resResult(STATUS.GVG_TEAM_NOT_FOUND);
let dicAreaPoint = gameData.gvgAreaPoint.get(pointId);
if(dicAreaPoint.areaId != myTeam.areaId) return resResult(STATUS.GVG_POINT_NOT_AREA);
const curTeam = await GVGTeamModel.settlePoint(teamCode, 0);
let teamObj = getGVGBattleData(groupId, serverType);
teamObj.teamSettle(roleId, teamCode, pointId);
return resResult(STATUS.SUCCESS, { curTeam: new MyTeamInfo(curTeam) });
}
// 队伍开始攻击
// teamCode: 攻击方队伍
// oppoTeamCode: 防守方队伍
async battleStart(msg: { cityId: number, teamCode: string, oppoTeamCode: string, pointId: number }, session: BackendSession) {
const roleId = session.get('roleId');
const serverId = session.get('serverId');
const { teamCode, oppoTeamCode } = msg;
let { configId, period } = getGVGPeriodData();
// if (period != GVG_PERIOD.BATTLE) return resResult(STATUS.GVG_NOT_BATTLE_PERIOD); // TODO 测试临时注
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let { attackTeam, defenseTeam } = await GVGTeamModel.findBattleTeams(teamCode, oppoTeamCode);
let checkStatus = checkGVGBattleStart(roleId, attackTeam, defenseTeam);
if(checkStatus.code != 0) return resResult(checkStatus);
const warId = getGVGWarId(defenseTeam);
const battleRecord = await GVGBattleRecModel.createRec(configId, groupId, serverType, warId, attackTeam, defenseTeam);
attackTeam = await GVGTeamModel.battleStartLockAttack(teamCode);
defenseTeam = await GVGTeamModel.battleStartLockDefense(oppoTeamCode, teamCode);
// 内存处理
let teamObj = getGVGBattleData(groupId, serverType);
teamObj.setTime(attackTeam.teamCode, attackTeam);
teamObj.setTime(defenseTeam.teamCode, defenseTeam);
let heroes = getOppHeroes(warId, defenseTeam.isRobot, defenseTeam.lineup)
return resResult(STATUS.SUCCESS, { battleCode: battleRecord.battleCode, warId, isRobot: defenseTeam.isRobot, heroes, curTeam: new MyTeamInfo(attackTeam) });
}
// 队伍停止攻击
async battleEnd(msg: { cityId: number, battleCode: string, isSuccess: boolean }, session: BackendSession) {
const serverId = session.get('serverId');
const { cityId, battleCode, isSuccess } = msg;
let { configId, period } = getGVGPeriodData();
const record = await GVGBattleRecModel.findByBattleCode(battleCode);
if(!record) return resResult(STATUS.GVG_BATTLEREC_NOT_FOUND);
if(record.battleEndTime > 0) return resResult(STATUS.GVG_BATTLEREC_HAS_SUMMIT);
let { attackTeam, defenseTeam } = await GVGTeamModel.findBattleTeams(record.attackTeam.teamCode, record.defenseTeam.teamCode);
if(defenseTeam.lockTeamCode != attackTeam.teamCode) return resResult(STATUS.GVG_LOCK_TIME_OUT)
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let city = await GVGCityModel.findByCityId(configId, groupId, serverType, cityId);
if (!city) return resResult(STATUS.GVG_CITY_NOT_FOUND);
// 计算并更新两支队伍耐久
let { win, fail } = gameData.gvgBattleDurabilityMinus;
let attackScore = calBattleScoreByCe(isSuccess, attackTeam.lineupCe);
let defenseScore = calBattleScoreByCe(!isSuccess, defenseTeam.lineupCe);
attackTeam = await GVGTeamModel.battleEndAttack(attackTeam.teamCode, isSuccess? -win: -fail, attackScore, getBirthAreaOfCity(city, attackTeam.leagueCode));
defenseTeam = await GVGTeamModel.battleEndDefense(defenseTeam.teamCode, isSuccess? -fail: -win, defenseScore, getBirthAreaOfCity(city, defenseTeam.leagueCode));
if(defenseTeam.curTeamBreak && defenseTeam.originPointId > 0 && !attackTeam.curTeamBreak) { // 打败的对手原来占领着一个位置,现在这个位置是你的了
attackTeam = await GVGTeamModel.settlePoint(attackTeam.teamCode, defenseTeam.originPointId);
}
await addBattleRankScore(attackTeam, attackScore);
await addBattleRankScore(defenseTeam, defenseScore);
// 更新内存
let teamObj = getGVGBattleData(groupId, serverType);
teamObj.battleEnd([attackTeam, defenseTeam]);
// 更新rec
await GVGBattleRecModel.battleEnd(battleCode, isSuccess);
return resResult(STATUS.SUCCESS, { curTeam: new MyTeamInfo(attackTeam) });
}
// 使用道具
// teamCode: 要使用道具的队伍
async useItem(msg: { cityId: number, itemId: number, teamCode: string }, session: BackendSession) {
const { itemId, teamCode } = msg;
// ! 检查道具是否存在
// ! 检查道具是否可以使用在该队伍
const team = await GVGTeamModel.findOneAndUpdate({ teamCode }, {}).lean();
// ! 根据 item 使用效果更新 team
return resResult(STATUS.SUCCESS, { team });
}
// 复活队伍
async reviveTeam(msg: { cityId: number, teamCode: string }, session: BackendSession) {
const { teamCode } = msg;
// ! 检查该队伍是否可以复活,可以的话更新队伍状态
const team = await GVGTeamModel.findOneAndUpdate({ teamCode }, {}).lean();
// 更新成功返回队伍信息
return resResult(STATUS.SUCCESS, { team });
}
// 获取战报
// type: 战报类型
async getRecs(msg: { type: number }, session: BackendSession) {
const { type } = msg;
// 根据 type 获取战报
const recs = await GVGRecModel.find({ type }).limit(20).lean();
return resResult(STATUS.SUCCESS, { recs });
}
// 获取概况
async getOverview(msg: {}, session: BackendSession) {
const cities = await GVGCityModel.find({}).lean();
// ! 重新组织每个城市的数据,添加据点和积分点的信息
return resResult(STATUS.SUCCESS, { cities });
}
async debugStartSchedule() {
await pinus.app.rpc.systimer.systimerRemote.gvgBattleStartSchedule.broadcast();
return resResult(STATUS.SUCCESS);
}
async debugEndSchedule() {
await pinus.app.rpc.systimer.systimerRemote.gvgBattleEndSchedule.broadcast();
return resResult(STATUS.SUCCESS);
}
}