diff --git a/game-server/app/servers/battle/handler/comBattleHandler.ts b/game-server/app/servers/battle/handler/comBattleHandler.ts index 1355bff25..1d66ecdba 100644 --- a/game-server/app/servers/battle/handler/comBattleHandler.ts +++ b/game-server/app/servers/battle/handler/comBattleHandler.ts @@ -1,4 +1,4 @@ -import { MemComBtlTeam } from './../../../domain/battleField/ComBattleTeamField'; +import { ComBattleInvitation, MemComBtlTeam } from './../../../domain/battleField/ComBattleTeamField'; import { difference } from 'underscore'; /* * @Author: 梁桐川 @@ -14,8 +14,8 @@ import { resResult, getRandSingleEelm, cal } from '../../../pubUtils/util'; import { RoleStatus, ComBattleTeamModel, ComBattleTeamType, BossHp, ComRoleStatusHero } from '../../../db/ComBattleTeam'; import { ItemModel, ItemType } from '../../../db/Item'; import { addItems, handleCost } from '../../../services/role/rewardService'; -import { checkRoleInQueue, rmRoleFromQueue, setTeamSearchReq } from '../../../services/redisService'; -import { getRandBlueprtId, clearComBtlTimer, getFrd, updateRobotHurtByTime, comBtlLvInvalid, clearRobotHurtTimer, setDismissTimer, dismissTeam, handleComBtlProgress, getComBattleFriendAdd, teammateInBlackList, blueprtIdValid, hasEnoughBlueprt, addRoleToTeam, addRoleStToTeam, addValidSearchingRoles, validToJoin, addRobotsToTeam, addRobotsLater, teamIsFullToStart, oneTeamNotInBlack, getAllAssistCnt, checkHasMyTeam, checkTeamStatusAndSend } from '../../../services/comBattleService'; +import { checkRoleInQueue, getServerName, rmRoleFromQueue, setTeamSearchReq } from '../../../services/redisService'; +import { getRandBlueprtId, clearComBtlTimer, getFrd, updateRobotHurtByTime, comBtlLvInvalid, clearRobotHurtTimer, setDismissTimer, dismissTeam, handleComBtlProgress, getComBattleFriendAdd, teammateInBlackList, blueprtIdValid, hasEnoughBlueprt, addRoleToTeam, addRoleStToTeam, addValidSearchingRoles, validToJoin, addRobotsToTeam, addRobotsLater, teamIsFullToStart, oneTeamNotInBlack, getAllAssistCnt, checkHasMyTeam, checkTeamStatusAndSend, getComBtlLvByPlayerLv } from '../../../services/comBattleService'; import { setAp } from '../../../services/actionPointService'; import { roleLevelup } from '../../../services/normalBattleService'; import { getSimpleRoleInfo } from '../../../services/roleService'; @@ -689,7 +689,8 @@ export class ComBattleHandler { const { teamCode } = msg; let teamStatus = this.teamMap.get(teamCode); if(!teamStatus) return resResult(STATUS.WRONG_PARMS); - await pushTeamInviteMsg(roleId, roleName, serverId, guildCode, teamCode, teamStatus.blueprtId); + await pushTeamInviteMsg(roleId, roleName, serverId, teamCode, teamStatus.blueprtId, teamStatus.lv, teamStatus.ceLimit); + await ComBattleTeamModel.invite(teamCode, 'world'); return resResult(STATUS.SUCCESS); } @@ -707,6 +708,15 @@ export class ComBattleHandler { let teamStatus = this.teamMap.get(teamCode); if(!teamStatus) return resResult(STATUS.WRONG_PARMS); + let role = await RoleModel.findByRoleId(targetRoleId, 'lv'); + if(comBtlLvInvalid(role.lv, [teamStatus.lv])) { + return resResult(STATUS.COM_BATTLE_INVITE_LV_NOT_ENOUGH); + } + if (role.topLineupCe < teamStatus.ceLimit) { + return resResult(STATUS.COM_BATTLE_CE_LIMIT); + } + + await ComBattleTeamModel.invite(teamCode, targetRoleId); let relation = await getFriendRelationType(roleId, targetRoleId); const msgData = await pushFriendTeamInviteMsg(roleId, roleName, teamCode, teamStatus.blueprtId, targetRoleId, relation); if (!msgData) return resResult(STATUS.WRONG_PARMS); @@ -746,4 +756,28 @@ export class ComBattleHandler { return resResult(STATUS.SUCCESS, { list: result }); } + + async getTeamInvitation(msg: { }, session: BackendSession) { + let roleId = session.get('roleId'); + let role = await RoleModel.findByRoleId(roleId, 'lv topLineupCe'); + const assistCnt = await getAllAssistCnt(roleId); + + let { minLv, maxLv } = getComBtlLvByPlayerLv(role.lv); + let refreshTime = nowSeconds() - 60; + const invitations = await ComBattleTeamModel.findInvitations(roleId, minLv, maxLv, role.topLineupCe, refreshTime, 10); + let roleIds = invitations.map(cur => cur.capId); + let roles = await RoleModel.findByRoleIds(roleIds); + const teams: ComBattleInvitation[] = []; + for(let invitation of invitations) { + let leader = roles.find(role => role.roleId == invitation.capId); + if(leader) { + let leaderParam = new FriendParams(leader); + let serverName = await getServerName(leader.serverId); + leaderParam.setServerName(leader.serverId, serverName); + teams.push(new ComBattleInvitation(invitation, leaderParam)); + } + } + + return resResult(STATUS.SUCCESS, { teams, assistCnt }); + } } diff --git a/game-server/app/servers/connector/handler/entryHandler.ts b/game-server/app/servers/connector/handler/entryHandler.ts index 15c2f8355..72bc12b9b 100644 --- a/game-server/app/servers/connector/handler/entryHandler.ts +++ b/game-server/app/servers/connector/handler/entryHandler.ts @@ -64,7 +64,7 @@ export class EntryHandler { } let serverName = this.app.getServerId(); - await roleLogin(role.roleId, user.userCode, serverName, user.pkgName, role.createTime, role.serverId); // 保存在线用户 + await roleLogin(role.roleId, user.userCode, serverName, role.createTime, role.serverId, role.lv, role.topLineupCe); // 保存在线用户 await this.addSession(user, role, session); await reportCreateRoleEventToTa(role, this.getIp(session)); diff --git a/game-server/app/servers/gm/handler/gmHandler.ts b/game-server/app/servers/gm/handler/gmHandler.ts index 7199444fc..49473adf1 100644 --- a/game-server/app/servers/gm/handler/gmHandler.ts +++ b/game-server/app/servers/gm/handler/gmHandler.ts @@ -2,7 +2,7 @@ import { Application, BackendSession, pinus } from 'pinus'; import { getRandSingleEelm, resResult } from '../../../pubUtils/util'; import { STATUS } from '../../../consts/statusCode'; import { GMMailModel, GMMailType } from '../../../db/GMMail'; -import { delGuildActivityRank, getRoleOnlineInfo } from '../../../services/redisService'; +import { delGuildActivityRank } from '../../../services/redisService'; import { ACTIVITY_TYPE, GM_MAIL_STATUS, GM_MAIL_TYPE, MAIL_TIME_TYPE, PUSH_ROUTE, SURVEY_SELECT } from '../../../consts'; import { checkActivityEditable, checkActivityGroupType, checkActivityGroupTypeWithId } from '../../../services/activity/activityService'; import { ActivityModel } from '../../../db/Activity'; diff --git a/game-server/app/services/chatService.ts b/game-server/app/services/chatService.ts index a1177ee19..e94711443 100644 --- a/game-server/app/services/chatService.ts +++ b/game-server/app/services/chatService.ts @@ -13,7 +13,9 @@ import { getRoleOnlineInfo } from './redisService'; import { ChatInfoModel } from '../db/ChatInfo'; import { AccuseRecModel, AccueseParam } from '../db/AccuseRec'; import { getSimpleRoleInfo, getSimpleRoleInfos } from './roleService'; -import { sendMessageToCityWithSuc, sendMessageToGuildWithSuc, sendMessageToServerWithSuc, sendMessageToTeam, sendMessageToUserWithSuc } from './pushService'; +import { sendMessageToAllWithSuc, sendMessageToCityWithSuc, sendMessageToGuildWithSuc, sendMessageToServerWithSuc, sendMessageToTeam, sendMessageToUserWithSuc } from './pushService'; +import { comBtlLvInvalid } from './comBattleService'; +import { gameData } from '../pubUtils/data'; export * from './chatChannelService'; export * from './sysChatService'; @@ -163,6 +165,12 @@ export async function pushGroupMsgToRoom(msg: GroupMessageType) { } } +export async function pushGroupMsgToAll(msg: GroupMessageType, filterCb?: ({ lv, topLineupCe }) => boolean) { + if (!msg) return; + const roleInfo = await getSimpleRoleInfo(msg.roleId); + await sendMessageToAllWithSuc(PUSH_ROUTE.GROUP_MSG, { ...msg, roleInfo }, filterCb); +} + /** * @description 获取私聊历史消息 * @export @@ -369,16 +377,12 @@ export async function delPrivateMsg(roleId: string, targetRoleId: string) { * @description 发送组队一键邀请消息 * @param {string} teamCode 队伍唯一标识 */ -export async function pushTeamInviteMsg(roleId: string, roleName: string, serverId: number, guildCode: string, teamCode: string, blueprtId: number) { +export async function pushTeamInviteMsg(roleId: string, roleName: string, serverId: number, teamCode: string, blueprtId: number, blueprtLv: number, ceLimit: number) { let msgDataWorld = await createGroupMsg(roleId, roleName, CHANNEL_PREFIX.WORLD, `${serverId}`, MSG_TYPE.RICH_TEXT, MSG_SOURCE.TEAM_INVITE, JSON.stringify({ roleName, teamCode, blueprtId }), null, null); - await pushGroupMsgToRoom(msgDataWorld); - - let msgDataGuild: GroupMessageType; - if(guildCode) { - msgDataGuild = await createGroupMsg(roleId, roleName, CHANNEL_PREFIX.GUILD, `${guildCode}`, MSG_TYPE.RICH_TEXT, MSG_SOURCE.TEAM_INVITE, JSON.stringify({ roleName, teamCode, blueprtId }), null, null); - await pushGroupMsgToRoom(msgDataGuild); - } - return { msgDataWorld, msgDataGuild }; + await pushGroupMsgToAll(msgDataWorld, (data: {lv: number, topLineupCe: number}) => { + return data.topLineupCe >= ceLimit && !comBtlLvInvalid(data.lv, [blueprtLv]); + }); + return { msgDataWorld }; } /** diff --git a/game-server/app/services/comBattleService.ts b/game-server/app/services/comBattleService.ts index 2dbfeff1b..4a39679dc 100644 --- a/game-server/app/services/comBattleService.ts +++ b/game-server/app/services/comBattleService.ts @@ -335,6 +335,16 @@ export function comBtlLvInvalid(playerLv: number, blueprtLvs: number[]) { return false } +export function getComBtlLvByPlayerLv(playerLv: number) { + let lvs: number[] = []; + for(let [lv, {min, max}] of gameData.comBtlLvRange) { + if(playerLv >= min && playerLv <= max) lvs.push(lv); + } + let minLv = Math.min(...lvs); + let maxLv = Math.max(...lvs); + return { minLv, maxLv } +} + export async function dismissTeam(teamStatus: MemComBtlTeam, teamMap: Map, roleId: string, teamDisTimer: Map) { const { teamCode } = teamStatus; if (!teamStatus || !teamStatus.roleIds || teamStatus.roleIds.indexOf(roleId) === -1) return resResult(STATUS.COM_BATTLE_TEAM_INVALID); diff --git a/game-server/app/services/connectorService.ts b/game-server/app/services/connectorService.ts index d8c404336..d4f3068e9 100644 --- a/game-server/app/services/connectorService.ts +++ b/game-server/app/services/connectorService.ts @@ -15,7 +15,7 @@ import { getFriendList, getApplyList } from './friendService'; import { getDailyBattleList } from './dailyBattleService'; import { getExpeditionStatus } from './expeditionService'; import { getTowerStatus, getHungupRewards, getTasks } from './battleService'; -import { getAllAssistCnt } from './comBattleService'; +import { getAllAssistCnt, getComBtlLvByPlayerLv } from './comBattleService'; import { getDungeonData } from './dungeonService'; import { PvpSeasonResultModel } from '../db/PvpSeasonResult'; import { nowSeconds, getZeroPoint } from '../pubUtils/timeUtil'; @@ -44,6 +44,7 @@ import { HeroParam } from '../domain/roleField/hero'; import { pick } from 'underscore'; import { sendMessageToAllWithSuc, sendMessageToServerWithSuc, sendMessageToUser, sendMessageToUserWithSuc } from './pushService'; import { getSurvey } from './gmService'; +import { ComBattleTeamModel } from '../db/ComBattleTeam'; /** * init: 初始的时候是否推送 true-推 false-不推 @@ -146,9 +147,7 @@ export async function getModuleData(type: string, data: { role: RoleType, sessio case 'tower': // 镇念塔 return await getTowerEntryData(role); case 'comBattle': // 寻宝 - const assistCnt = await getAllAssistCnt(roleId); - const blueprts = await Item.findByRoleAndType(roleId, CONSUME_TYPE.BLUEPRT); - return { assistCnt, blueprts } + return await getComBattleEntryData(role); case 'dungeon': // 秘境 return await getDungeonData(role); case 'pvp': // pvp @@ -289,6 +288,16 @@ async function getGuildEntryData(role: RoleType, sid: string, session: FrontendO return { hasGuild: false } } +async function getComBattleEntryData(role: RoleType) { + let { roleId, lv, topLineupCe } = role; + const assistCnt = await getAllAssistCnt(roleId); + const blueprts = await Item.findByRoleAndType(roleId, CONSUME_TYPE.BLUEPRT); + let { minLv, maxLv } = getComBtlLvByPlayerLv(lv); + let refreshTime = nowSeconds() - 60; + const invitations = await ComBattleTeamModel.findInvitations(roleId, minLv, maxLv, topLineupCe, refreshTime, 1); + return { assistCnt, blueprts, hasInvitation: invitations.length > 0, invitationTime: invitations.length > 0?invitations[0].inviteTime: 0 } +} + export async function pushRefreshTime() { let todayZeroPoint = getZeroPoint(); await sendMessageToAllWithSuc(PUSH_ROUTE.REFRESH_TIME, { todayZeroPoint }); diff --git a/game-server/app/services/normalBattleService.ts b/game-server/app/services/normalBattleService.ts index 6e33dbff1..f8bce99c2 100644 --- a/game-server/app/services/normalBattleService.ts +++ b/game-server/app/services/normalBattleService.ts @@ -2,7 +2,7 @@ import { HeroModel, HeroType } from '../db/Hero'; import Role, { RoleModel, RoleType } from '../db/Role' import { getLvByExp, getExpByLv, gameData, getDicApByLv } from '../pubUtils/data'; -import { updateUserInfo } from './redisService'; +import { updateRoleOnlineInfo, updateUserInfo } from './redisService'; // import { switchOnFunc } from './funcSwitchService'; import { FUNC_OPT_TYPE, TASK_TYPE, WAR_TYPE, STATUS, KING_EXP_RATIO_TYPE, ITEM_CHANGE_REASON, POP_UP_SHOP_CONDITION_TYPE, HERO_SYSTEM_TYPE, PUSH_ROUTE } from '../consts'; import { BackendSession, pinus } from 'pinus'; @@ -49,6 +49,8 @@ export async function roleLevelup(type: KING_EXP_RATIO_TYPE, roleId: string, kin await checkPopUpCondition(serverId, roleId, POP_UP_SHOP_CONDITION_TYPE.LV_TO, { oldLv: lv, newLv }) // await calculateCeWithRole(HERO_SYSTEM_TYPE.ROLE_LV, roleId, serverId, sid, { lv: newLv }); + await updateRoleOnlineInfo(roleId, { lv: newLv }); + } let actordata: { lv: number, exp: number, getExp: number, mostExp: number }[] = []; for (let i = lv; i <= newLv; i++) { diff --git a/game-server/app/services/playerCeService.ts b/game-server/app/services/playerCeService.ts index d6e1d7af4..b90bfd549 100644 --- a/game-server/app/services/playerCeService.ts +++ b/game-server/app/services/playerCeService.ts @@ -7,7 +7,7 @@ import { EPlace, HeroModel, HeroType, HeroUpdate } from '../db/Hero'; import { RoleUpdate, RoleType, RoleModel } from '../db/Role'; import { Rank } from './rankService'; import { HERO_SYSTEM_TYPE, PUSH_ROUTE, REDIS_KEY } from '../consts'; -import { updateUserInfo } from './redisService'; +import { updateRoleOnlineInfo, updateUserInfo } from './redisService'; import { GuildModel, GuildType } from '../db/Guild'; import { CalCe } from './role/calCe'; import { RoleCeModel, RoleCeUpdate } from '../db/RoleCe'; @@ -359,11 +359,12 @@ export async function calculateCes(type: HERO_SYSTEM_TYPE, roleId: string, serve } } - let { topLineup, topLineupCe } = calCe.getTopLineup(); + let { topLineup, topLineupCe, hasTopCeChange } = calCe.getTopLineup(); let roleCeUpdate: RoleCeUpdate = calCe.getRoleCeTable(); if(topLineupCe > roleCe?.historyLineupCe??0) { roleCeUpdate = { ...roleCeUpdate, historyLineupCe: topLineupCe }; } + roleCe = await RoleCeModel.updateRoleCe(roleId, roleCeUpdate); let role = await RoleModel.incRoleInfo(roleId, { ...roleIncUpdate, ce: roleInc }, { ...roleUpdate, topLineup, topLineupCe }); let guild = await GuildModel.updateCe(roleId, roleInc); // 公会更新战力 @@ -371,7 +372,7 @@ export async function calculateCes(type: HERO_SYSTEM_TYPE, roleId: string, serve saveCeChangeLog(role, roleInc, role.ce, type, changeHids); updateRank(roleId, serverId, topLineupCe, role, pushHeros, guild); sendMessageToUserWithSuc(roleId, PUSH_ROUTE.PLAYER_CE_UPDATE, { ce: role.ce, heros: pushHeros, topLineupCe }, sid); - + if(hasTopCeChange) await updateRoleOnlineInfo(roleId, { topLineupCe }); if(guild) { await updateUserInfo(REDIS_KEY.GUILD_INFO, guild.code, [{ field: 'guildCe', value: guild.guildCe }]); } diff --git a/game-server/app/services/pushService.ts b/game-server/app/services/pushService.ts index dff0a6b0d..073b19c50 100644 --- a/game-server/app/services/pushService.ts +++ b/game-server/app/services/pushService.ts @@ -5,12 +5,15 @@ import { getCityChannelSid, getGuildChannelSid, getWorldChannelSid, groupRoomId import { getAllOnlineRoles, getRoleOnlineInfo } from "./redisService"; import { errlogger, infologger } from '../util/logger'; -export async function sendMessageToAllWithSuc(route: string, data: any) { - await sendMessageToAll(route, resResult(STATUS.SUCCESS, data)); +export async function sendMessageToAllWithSuc(route: string, data: any, filterCb?: ({ lv, topLineupCe }) => boolean) { + await sendMessageToAll(route, resResult(STATUS.SUCCESS, data), filterCb); } -export async function sendMessageToAll(route: string, data: any) { +export async function sendMessageToAll(route: string, data: any, filterCb?: ({ lv, topLineupCe }) => boolean) { let allOnlineUsers = await getAllOnlineRoles(); + if(filterCb) { + allOnlineUsers = allOnlineUsers.filter(filterCb); + } let n = Math.ceil(allOnlineUsers.length / PUSH_BATCH); // 一共多少批 let sendToUser = (i: number) => { let users = allOnlineUsers.slice(i * PUSH_BATCH, (i + 1) * PUSH_BATCH - 1); diff --git a/game-server/app/services/redisService.ts b/game-server/app/services/redisService.ts index b4c4dfa0f..b2f16316b 100644 --- a/game-server/app/services/redisService.ts +++ b/game-server/app/services/redisService.ts @@ -310,10 +310,17 @@ export async function clearChannelServers() { * @param userCode user表唯一字符串标识 * @param sid connector服的那个sid */ -export async function roleLogin(roleId: string, userCode: string, sid: string, pkgName: string, createTime: number, serverId: number) { +export async function roleLogin(roleId: string, userCode: string, sid: string, createTime: number, serverId: number, lv: number, topLineupCe: number) { await redisClient().hincrbyAsync(REDIS_KEY.ONLINE_CNT, roleId, 1); await redisClient().hsetAsync(REDIS_KEY.USER_CODE, userCode, roleId); - return await redisClient().hsetAsync(REDIS_KEY.ONLINE_USERS, roleId, `${userCode}|${sid}|${pkgName}|${createTime}|${serverId}`); + return await redisClient().hsetAsync(REDIS_KEY.ONLINE_USERS, roleId, `${userCode}|${sid}|${createTime}|${serverId}|${lv}|${topLineupCe}`); +} + +export async function updateRoleOnlineInfo(roleId: string, updateData: {lv?: number, topLineupCe?: number}) { + let info = await getRoleOnlineInfo(roleId); + if(info.isOnline) { + return await redisClient().hsetAsync(REDIS_KEY.ONLINE_USERS, roleId, `${info.userCode}|${info.sid}|${info.createtime}|${info.serverId}|${updateData?.lv??info.lv}|${updateData?.topLineupCe??info.topLineupCe}`); + } } /** @@ -354,11 +361,13 @@ export async function getRoleOnlineInfo(roleId: string) { if(str) { try { let result = str.split('|'); - let [userCode, sid, pkgName, createTime, serverId] = result; + let [userCode, sid, createTime, serverId, lv, topLineupCe] = result; return { - isOnline: true, userCode, sid, pkgName, + isOnline: true, userCode, sid, createtime: parseInt(createTime), - serverId: parseInt(serverId) + serverId: parseInt(serverId), + lv: parseInt(lv), + topLineupCe: parseInt(topLineupCe) } } catch(e) { return { isOnline: false } @@ -385,13 +394,13 @@ export async function getRoleCreateTime(roleId: string, role?: RoleType) { */ export async function getAllOnlineRoles() { let allRoles = await redisClient().hgetallAsync(REDIS_KEY.ONLINE_USERS); - let result = new Array<{roleId: string, userCode: string, sid: string, pkgName: string, serverId: number}>(); + let result = new Array<{roleId: string, userCode: string, sid: string, serverId: number, lv: number, topLineupCe: number}>(); for(let roleId in allRoles) { try{ let param = allRoles[roleId].split('|'); - let [userCode, sid, pkgName, _createTime, serverId] = param; + let [userCode, sid, _createTime, serverId, lv, topLineupCe] = param; - result.push({ roleId, userCode, sid, pkgName, serverId: parseInt(serverId) }); + result.push({ roleId, userCode, sid, serverId: parseInt(serverId), lv: parseInt(lv), topLineupCe: parseInt(topLineupCe) }); } catch(e) { continue; diff --git a/game-server/app/services/role/calCe.ts b/game-server/app/services/role/calCe.ts index cff534948..5bbcb89c2 100644 --- a/game-server/app/services/role/calCe.ts +++ b/game-server/app/services/role/calCe.ts @@ -15,6 +15,7 @@ export class CalCe { resultCes: Map = new Map(); // hid => ce data: CalCeData; attrsByHid: Map = new Map(); + originTopHeroCe: number; constructor(roleId: string) { this.roleId = roleId; @@ -23,6 +24,7 @@ export class CalCe { public setRoleCe(roleCe: RoleCeType) { this.data = new CalCeData(roleCe) this.originCes = this.calHeroCe(); + this.originTopHeroCe = this.getTopLineup().topLineupCe; } public clearRoleCe() { @@ -126,7 +128,7 @@ export class CalCe { topLineupCe += ce; } } - return { topLineup, topLineupCe }; + return { topLineup, topLineupCe, hasTopCeChange: topLineupCe == this.originTopHeroCe }; } // 玩家等级 diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index c32eceda1..8f078f5b1 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -147,6 +147,8 @@ export const STATUS = { COM_BATTLE_CREATE_CE_LIMIT: { code: 20635, simStr: '你的战力不足,不可设置该级别限制' }, COM_BATTLE_TEAM_NOT_DEFAULT: { code: 20636, simStr: '队伍已过期' }, COM_BATTLE_IS_RUNNING: { code: 20637, simStr: '您有队伍正在进行中' }, + COM_BATTLE_INVITE_LV_NOT_ENOUGH: { code: 20638, simStr: '对方队伍等级不足,无法邀请' }, + COM_BATTLE_INVITE_CE_LIMIT: { code: 20639, simStr: '对方队伍战力不足,无法邀请' }, // 共斗藏宝图合成 COM_BLUEPRT_QUALITY_CANNOT_COMPOSE: { code: 20650, simStr: '该品质藏宝图不可合成' }, COM_BLUEPRT_COUNT_ERROR: { code: 20651, simStr: '材料数量不足' }, diff --git a/shared/db/ComBattleTeam.ts b/shared/db/ComBattleTeam.ts index 446bd3a93..9591fc3f5 100644 --- a/shared/db/ComBattleTeam.ts +++ b/shared/db/ComBattleTeam.ts @@ -2,6 +2,7 @@ import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; import { EXTERIOR } from '../pubUtils/dicParam'; import { ItemReward } from '../domain/dbGeneral'; +import { nowSeconds } from '../pubUtils/timeUtil'; export class ComRoleStatusHero { @prop({ required: true }) @@ -187,10 +188,22 @@ export default class ComBattleTeam extends BaseModel { // 黑名单 blacklist: string[] = []; - // 黑名单 + // 结束时间 @prop({ required: true, default: 0 }) endTime: number = 0; + // 是否发出邀请了 + @prop({ required: true, default: false }) + isInviting: boolean = false; + + // 邀请时间 + @prop({ required: true, default: 0 }) + inviteTime: number = 0; + + // 邀请对象 + @prop({ required: true, default: [], type: String, _id: false }) + inviteTarget: string[] = []; + public static async createTeam(teamData: ComBattleTeamParam, lean = true) { const team: ComBattleTeamType = await ComBattleTeamModel.findOneAndUpdate({ teamCode: teamData.teamCode }, {$set :{...teamData, roleCnt: teamData.roleIds.length}}, {upsert: true, new: true}).lean(lean); return team; @@ -341,6 +354,16 @@ export default class ComBattleTeam extends BaseModel { const team: ComBattleTeamType = await ComBattleTeamModel.findOne({teamCode}).lean(lean); return team; } + + public static async invite(teamCode: string, target: string) { + const team: ComBattleTeamType = await ComBattleTeamModel.findOneAndUpdate({teamCode}, { $set: { isInviting: true, inviteTime: nowSeconds()}, $push: { inviteTarget: target }}, {new: true}).lean(); + return team; + } + + public static async findInvitations(roleId: string, minLv: number, maxLv: number, ce: number, refreshTime: number, limit: number) { + const invitations: ComBattleTeamType[] = await ComBattleTeamModel.find({ status: 0, isInviting: true, lv: { $gte: minLv, $lte: maxLv }, ceLimit: { $lte: ce }, inviteTime: { $gte: refreshTime } }).sort({ inviteTime: -1 }).limit(limit).lean(); + return invitations; + } } export const ComBattleTeamModel = getModelForClass(ComBattleTeam); diff --git a/shared/domain/battleField/ComBattleTeamField.ts b/shared/domain/battleField/ComBattleTeamField.ts index cba0bcf7d..5b06afc39 100644 --- a/shared/domain/battleField/ComBattleTeamField.ts +++ b/shared/domain/battleField/ComBattleTeamField.ts @@ -2,6 +2,7 @@ import { COM_TEAM_STATUS } from '../../consts'; import { getBossHpByBlueprtId, getDicBlueprtById } from '../../pubUtils/data'; import ComBattleTeam from './../../db/ComBattleTeam'; import { cloneDeep } from 'lodash' +import { FriendParams } from '../roleField/friend'; /** * 拷贝敌军数组并添加当前血量字段 @@ -48,3 +49,18 @@ export class MemComBtlTeam extends ComBattleTeam { return this.roleStatus.find(cur => cur.roleId == roleId); } }; + + + export class ComBattleInvitation { + blueprtId: number; + leader: FriendParams; + roleCnt: number; + status: number; + + constructor(comBattle: ComBattleTeam, leader: FriendParams) { + this.blueprtId = comBattle.blueprtId; + this.leader = leader; + this.roleCnt = comBattle.roleCnt; + this.status = comBattle.status; + } + } \ No newline at end of file diff --git a/shared/pubUtils/interface.ts b/shared/pubUtils/interface.ts index ee4d8e5f2..0c16db178 100644 --- a/shared/pubUtils/interface.ts +++ b/shared/pubUtils/interface.ts @@ -62,4 +62,4 @@ export interface mailData { export interface guildInter { myUserGuild: UserGuildType; hisUserGuild: UserGuildType; -} +} \ No newline at end of file