diff --git a/game-server/app.ts b/game-server/app.ts index 6d6d941b0..aa7e8afb5 100644 --- a/game-server/app.ts +++ b/game-server/app.ts @@ -123,6 +123,14 @@ app.configure('production|development|alpha|dev|isbn', 'gm', function () { init();//将gm后台数据加载到gate服 }); +app.configure('production|development|alpha|dev|isbn', 'guild', function () { + app.set('connectorConfig', + { + connector: pinus.connectors.hybridconnector, + useProtobuf: true + }); +}); + app.configure('production|development|alpha|dev|isbn', 'systimer', function () { app.set('connectorConfig', { @@ -176,6 +184,7 @@ app.configure('production|development|alpha|dev|isbn', function () { app.route('chat', routeUtil.chat); app.route('battle', routeUtil.battle); app.route('gm', routeUtil.gm); + app.route('guild', routeUtil.guild); // filter configures app.filter(new pinus.filters.time()); @@ -198,6 +207,7 @@ app.configure('production|development|alpha|dev|isbn', function () { }); }); + app.configure('development', function () { // enable the system monitor modules app.enable('systemMonitor'); diff --git a/game-server/app/servers/chat/remote/guildRemote.ts b/game-server/app/servers/chat/remote/guildRemote.ts index 56e2e9170..fab4125da 100644 --- a/game-server/app/servers/chat/remote/guildRemote.ts +++ b/game-server/app/servers/chat/remote/guildRemote.ts @@ -27,6 +27,7 @@ export class GuildRemote { private GUILD_REC_ADD = 'onGuildRecAdd'; private GUILD_ACT_RANK = 'onGuildGateRankUpdate'; // 军团活动排行榜 private GUILD_GATE_ACT_HP = 'onGuildGateHpUpdate'; // 军团活动蛮夷入侵排行榜 + private GUILD_ACTIVITY_END = 'onGuildActivityEnd'; /** * 封装,军团相关channel名: 'guild'+guildCode @@ -158,6 +159,14 @@ export class GuildRemote { this.pushMessage(guildCode, this.GUILD_REC_ADD, {type, params, createTime}); } + /** + * 向军团推送城门血量 + * @param guildCode + */ + public pushGateHp(guildCode: string, msg: GuildGateRankParam) { + this.pushMessage(guildCode, this.GUILD_GATE_ACT_HP, msg); + } + /** * 向军团推送排行榜名次 * @param guildCode @@ -165,4 +174,13 @@ export class GuildRemote { public pushRank(guildCode: string, msg: GuildGateRankParam) { this.pushMessage(guildCode, this.GUILD_ACT_RANK, msg); } + + /** + * @description 向军团推送结束活动 + * @param guildCode + */ + public async sendGuildActivityEnd(guildCode: string) { + console.log("MSG END") + this.pushMessage(guildCode, this.GUILD_ACTIVITY_END, {}); + } } \ No newline at end of file diff --git a/game-server/app/servers/guild/handler/gateActivityHandler.ts b/game-server/app/servers/guild/handler/gateActivityHandler.ts index a762185cb..f7129be4e 100644 --- a/game-server/app/servers/guild/handler/gateActivityHandler.ts +++ b/game-server/app/servers/guild/handler/gateActivityHandler.ts @@ -1,5 +1,5 @@ -import { Application, BackendSession, ChannelService } from "pinus"; -import { setMedianCe, getMedianCe, getGuildActivityStatus, getRecordScore, getGuildActivityObj, getGuildActivityRank } from "../../../services/guildActivityService"; +import { Application, BackendSession, ChannelService, pinus } from "pinus"; +import { setMedianCe, getMedianCe, getGuildActivityStatus, getRecordScore, getGuildActivityObj, getGuildActivityRank, sendSingleGuildGateActEndMsg, sendGuildActEndMsg } from "../../../services/guildActivityService"; import { resResult } from "../../../pubUtils/util"; import { STATUS, GUILD_ACTIVITY_TYPE, GUILD_POINT_WAYS, ENEMIES_TYPE, GET_POINT_WAYS } from "../../../consts"; import { GameModel } from "../../../db/Game"; @@ -14,6 +14,8 @@ import { setRank, getGuildKeyName, getRankScore, getRank, getUnionRank } from ". import { REDIS_KEY } from "../../../consts"; import { addActive } from "../../../services/guildService"; import { gameData } from "../../../pubUtils/data"; +import { getGuildChannelSid } from "../../../services/chatService"; +import { guildActivityStart } from "../../../services/timeTaskService"; export default function (app: Application) { return new GateActivityHandler(app); @@ -42,7 +44,7 @@ export class GateActivityHandler { if(!guildActivityRec) return resResult(STATUS.INTERNAL_ERR); let { code: sourceCode } = guildActivityRec; - let myGuildActivityRec = await UserGuildActivityRecModel.getRecord(roleId, roleName, guildCode, serverId, sourceCode, [], this.aid); + let myGuildActivityRec = await UserGuildActivityRecModel.getRecord(roleId, roleName, guildCode, serverId, sourceCode, this.aid); let { challengeCnt } = myGuildActivityRec; let ranks = await getGuildActivityRank(guildCode, serverId, roleId, roleName); @@ -64,8 +66,9 @@ export class GateActivityHandler { const serverId = session.get('serverId'); const guildCode = session.get('guildCode'); if(!guildCode) return resResult(STATUS.GUILD_AUTH_NOT_ENOUGH); + let obj = getGuildActivityObj(this.aid); - let gateHp = getGuildActivityObj(this.aid).getGateHpAndInc(guildCode); + let gateHp = obj.getGateHpAndInc(guildCode); if(gateHp <= 0) return resResult(STATUS.GATE_HP_IS_ZERO); let statusResult = getGuildActivityStatus(this.aid); @@ -77,11 +80,15 @@ export class GateActivityHandler { if(!guildActivityRec) return resResult(STATUS.INTERNAL_ERR); let { code: sourceCode } = guildActivityRec; - let myGuildActivityRec = await UserGuildActivityRecModel.getRecord(roleId, roleName, guildCode, serverId, sourceCode, heroes, this.aid); + let myGuildActivityRec = await UserGuildActivityRecModel.getRecord(roleId, roleName, guildCode, serverId, sourceCode, this.aid); + if(myGuildActivityRec.challengeCnt > 0) { + return resResult(STATUS.CHALLENGE_CNT_NOT_ENOUGH); + } + await UserGuildActivityRecModel.incChallengeCnt(myGuildActivityRec.code, heroes); let { code, challengeCnt } = myGuildActivityRec; // 更新公会参与的玩家 - getGuildActivityObj(this.aid).pushMembers(guildCode, serverId, roleId); + obj.pushMembers(guildCode, serverId, roleId); // 返回当前军团总军功 let guildScore = await getRankScore(REDIS_KEY.GUILD_ACTIVITY, serverId, guildCode); @@ -108,21 +115,22 @@ export class GateActivityHandler { let serverId = session.get('serverId'); let { code, record } = msg; + let obj = getGuildActivityObj(this.aid); let statusResult = getGuildActivityStatus(this.aid); if(!statusResult) return resResult(STATUS.DIC_DATA_NOT_FOUND); // TODO 测试完成后去掉这条判断 // if(!statusResult.isOpen) return resResult(STATUS.GUILD_ACTIVITY_NOT_OPEN); - let gateHp = getGuildActivityObj(this.aid).getGateHpAndInc(guildCode); + let gateHp = obj.getGateHpAndInc(guildCode); if(gateHp <= 0) return resResult(STATUS.GATE_HP_IS_ZERO); // 计算record内得分 - let memberRecord = getGuildActivityObj(this.aid).getMemberRecord(code, roleId); + let memberRecord = obj.getMemberRecord(code, roleId); let scoreResult = getRecordScore(this.aid, record, memberRecord); if(!scoreResult) return resResult(STATUS.DIC_DATA_NOT_FOUND); let { score, newRecords, memberRecord: newMemberRecord } = scoreResult; - getGuildActivityObj(this.aid).setMemberRecord(code, memberRecord); + obj.setMemberRecord(code, newMemberRecord); // 更新redis数据 let role = await RoleModel.findByRoleId(roleId); @@ -154,7 +162,8 @@ export class GateActivityHandler { let serverId = session.get('serverId'); let { code, damage } = msg; - let gateHp = getGuildActivityObj(this.aid).getGateHpAndInc(guildCode); + let obj = getGuildActivityObj(this.aid); + let gateHp = obj.getGateHpAndInc(guildCode); if(gateHp <= 0) return resResult(STATUS.GATE_HP_IS_ZERO); let statusResult = getGuildActivityStatus(this.aid); @@ -162,11 +171,14 @@ export class GateActivityHandler { // TODO 测试完成后去掉这条判断 // if(!statusResult.isOpen) return resResult(STATUS.GUILD_ACTIVITY_NOT_OPEN); - gateHp = getGuildActivityObj(this.aid).getGateHpAndInc(guildCode, -1 * damage); + gateHp = obj.getGateHpAndInc(guildCode, -1 * damage); if(gateHp <= 0) { - // TODO 推送 停止活动 + // 推送 停止活动并结算奖励 + await sendSingleGuildGateActEndMsg(guildCode, serverId); } - // TODO 推送 城门血量 + // 推送 城门血量 + let chatSid = await getGuildChannelSid(guildCode); + pinus.app.rpc.chat.guildRemote.pushGateHp.toServer(chatSid, guildCode, { gateHp }); // 返回当前军团总军功 let guildScore = await getRankScore(REDIS_KEY.GUILD_ACTIVITY, serverId, guildCode); @@ -189,6 +201,7 @@ export class GateActivityHandler { let serverId = session.get('serverId'); let { code, isSuccess } = msg; + let obj = getGuildActivityObj(this.aid); let statusResult = getGuildActivityStatus(this.aid); if(!statusResult) return resResult(STATUS.DIC_DATA_NOT_FOUND); @@ -217,7 +230,7 @@ export class GateActivityHandler { let role = await RoleModel.findByRoleId(roleId); let { lv, vLv, head, frame, spine, title } = role; let userParam = new RankParam(roleName, lv, vLv, head, frame, spine, title); - await setRank(getGuildKeyName(REDIS_KEY.USER_GUILD_ACTIVITY, guildCode), serverId, guildCode, score, Date.now(), userParam); + await setRank(getGuildKeyName(REDIS_KEY.USER_GUILD_ACTIVITY, guildCode), serverId, roleId, score, Date.now(), userParam); let guild = await GuildModel.findByCode(guildCode, serverId); let leader = guild.leader; @@ -230,9 +243,9 @@ export class GateActivityHandler { // 返回当前军团总军功 let guildScore = await getRankScore(REDIS_KEY.GUILD_ACTIVITY, serverId, guildCode); let myScore = await getRankScore(getGuildKeyName(REDIS_KEY.USER_GUILD_ACTIVITY, guildCode), serverId, roleId, true); - let gateHp = getGuildActivityObj(this.aid).getGateHpAndInc(guildCode); + let gateHp = obj.getGateHpAndInc(guildCode); - getGuildActivityObj(this.aid).delMemberRecord(code); + obj.delMemberRecord(code); let info = { round, enemyCnt, littleBossCnt, bossCnt, @@ -261,7 +274,9 @@ export class GateActivityHandler { async debugGetPrivate(msg: { }, session: BackendSession) { let guildCode = session.get('guildCode'); - let res = getGuildActivityObj(this.aid).getObj(guildCode); + console.log(guildCode); + let serverId = session.get('serverId'); + let res = getGuildActivityObj(this.aid).getObj(guildCode, serverId); return resResult(STATUS.SUCCESS, res) } @@ -270,4 +285,24 @@ export class GateActivityHandler { let result = await setMedianCe(); return resResult(STATUS.SUCCESS, {result}); } + + async debugIncChallengeCnt(msg: { }, session: BackendSession) { + let roleId = session.get('roleId'); + let res = await UserGuildActivityRecModel.updateInfoByRoleId(roleId, { challengeCnt: 0 }); + + return resResult(STATUS.SUCCESS, { challengeCnt: res.challengeCnt }); + } + + async debugStartActivity(msg: { aid: number }, session: BackendSession) { + let { aid } = msg; + let dic = gameData.guildActivity.get(aid); + await guildActivityStart(dic); + return resResult(STATUS.SUCCESS); + } + + async debugEndActivity(msg: { aid: number }, session: BackendSession) { + let { aid } = msg; + await sendGuildActEndMsg(aid); + return resResult(STATUS.SUCCESS); + } } diff --git a/game-server/app/servers/guild/remote/guildActivitRemote.ts b/game-server/app/servers/guild/remote/guildActivityRemote.ts similarity index 77% rename from game-server/app/servers/guild/remote/guildActivitRemote.ts rename to game-server/app/servers/guild/remote/guildActivityRemote.ts index 6fc90833d..d70f6d92b 100644 --- a/game-server/app/servers/guild/remote/guildActivitRemote.ts +++ b/game-server/app/servers/guild/remote/guildActivityRemote.ts @@ -17,14 +17,14 @@ export class GuildActivityRemote { /** * 从systimer服分发到guild各个服,发送排行榜数据 */ - public async sendRankToGuilds() { - await sendAllGuildRanks(); + public async sendRankToGuilds(aid: number) { + await sendAllGuildRanks(aid); } /** * 发送结束活动消息 */ - public async guildActivityEnd() { - await sendGuildActEndMsg(); + public async guildActivityEnd(aid: number) { + await sendGuildActEndMsg(aid); } } \ No newline at end of file diff --git a/game-server/app/servers/user.rpc.define.ts b/game-server/app/servers/user.rpc.define.ts index c44213e5d..2edede515 100644 --- a/game-server/app/servers/user.rpc.define.ts +++ b/game-server/app/servers/user.rpc.define.ts @@ -11,9 +11,12 @@ import { SystimerRemote } from './systimer/remote/systimerRemote'; import { GuildRemote } from './chat/remote/guildRemote'; import { GMRemote } from './gm/remote/gmRemote'; import { RoleRemote } from './role/remote/roleRemote'; -import { GuildActivityRemote } from './guild/remote/guildActivitRemote'; +import { GuildActivityRemote } from './guild/remote/guildActivityRemote'; declare global { interface UserRpc { + guild: { + guildActivityRemote: RemoterClass; + }, chat: { chatRemote: RemoterClass; guildRemote: RemoterClass; @@ -33,9 +36,6 @@ declare global { }, role: { roleRemote: RemoterClass; - }, - guild: { - guildActivityRemote: RemoterClass; } } } \ No newline at end of file diff --git a/game-server/app/services/guildActivityService.ts b/game-server/app/services/guildActivityService.ts index 7ce6d9a3b..a5e786a16 100644 --- a/game-server/app/services/guildActivityService.ts +++ b/game-server/app/services/guildActivityService.ts @@ -2,17 +2,22 @@ import { ServerlistModel } from "../db/Serverlist"; import { RoleModel } from "../db/Role"; import { reduceCe } from "../pubUtils/util"; import { GUILDACTIVITY } from "../pubUtils/dicParam"; -import { gameData, getTodayGuildActivity } from "../pubUtils/data"; +import { gameData, getGuildAuctionRewards, getTodayGuildActivity } from "../pubUtils/data"; import { getCurHourPoint, getCutDay, nowSeconds } from "../pubUtils/timeUtil"; -import { GUILD_ACTIVITY_STATUS, GET_POINT_WAYS, GUILD_ACTIVITY_TYPE, REDIS_KEY } from "../consts"; -import { Record } from "../db/UserGuildActivityRec"; +import { GUILD_ACTIVITY_STATUS, GET_POINT_WAYS, GUILD_ACTIVITY_TYPE, REDIS_KEY, AUCTION_SOURCE, MAIL_TYPE } from "../consts"; +import { Record, UserGuildActivityRecModel } from "../db/UserGuildActivityRec"; import { GateMembersRec, GateActivityObject } from "../domain/battleField/guildActivity"; import { DicGuildActivity } from "../pubUtils/dictionary/DicGuildActivity"; -import { getUnionRank, getRank, getGuildKeyName } from "./redisService"; +import { getUnionRank, getRank, getGuildKeyName, getMyUnionRank, getRankScore } from "./redisService"; import { GuildModel } from "../db/Guild"; import { SimpleGuildRankParam, SimpleRoleRankParam } from "../domain/rank"; import { getGuildChannelSid, getWorldChannelSid } from "./chatChannelService"; import { pinus } from "pinus"; +import { GuildActivityRecordModel } from "../db/GuildActivityRec"; +import { uniq } from 'underscore' +import { genAuction } from "./auctionService"; +import { sendMail } from "./mailService"; +import { getHonourObject } from '../pubUtils/itemUtils'; let gateActivityObj: GateActivityObject; export function getGuildActivityObj(aid: number) { @@ -177,25 +182,85 @@ export async function getGuildActivityRank(guildCode: string, serverId: number, /** * 对这个guild服内所有军团发排行榜信息 + * @param aid 活动类型 */ -export async function sendAllGuildRanks() { - let obj = getGuildActivityObj(GUILD_ACTIVITY_TYPE.GATE_ACTIVITY); +export async function sendAllGuildRanks(aid: number) { + let obj = getGuildActivityObj(aid); let guilds = obj.getGuilds(); for(let [ serverId, guildCodes ] of guilds) { // TODO 不需要每个军团都排序一次 for(let guildCode of guildCodes) { let ranks = await getGuildActivityRank(guildCode, serverId); let chatSid = await getGuildChannelSid(guildCode); - pinus.app.rpc.chat.guildRemote.pushRank.toServer(chatSid, ranks); + pinus.app.rpc.chat.guildRemote.pushRank.toServer(chatSid, guildCode, ranks); } } } -export async function sendGuildActEndMsg() { - let obj = getGuildActivityObj(GUILD_ACTIVITY_TYPE.GATE_ACTIVITY); +/** + * 活动结束发送结束信号以及结算奖励 + * @param aid 活动类型 + */ +export async function sendGuildActEndMsg(aid: number) { + let obj = getGuildActivityObj(aid); let guilds = obj.getGuilds(); - for(let [ serverId ] of guilds) { + for(let [ serverId, guildCodes ] of guilds) { let chatSid = await getWorldChannelSid(serverId); pinus.app.rpc.chat.chatRemote.sendGuildActivityEnd.toServer(chatSid, serverId); + + if(aid == GUILD_ACTIVITY_TYPE.GATE_ACTIVITY) { + for(let guildCode of guildCodes) { + await gateActivitySettleReward(guildCode, serverId); + } + } } +} + +/** + * 单个军团城门血条破了之后给他发奖励 + * @param guildCode + */ +export async function sendSingleGuildGateActEndMsg(guildCode: string, serverId: number) { + let chatSid = await getGuildChannelSid(guildCode); + pinus.app.rpc.chat.guildRemote.sendGuildActivityEnd.toServer(chatSid, guildCode); + await gateActivitySettleReward(guildCode, serverId); +} + +/** + * 军团结算奖励 + * @param guildCode + * @param serverId + */ +export async function gateActivitySettleReward(guildCode: string, serverId: number) { + let obj = getGuildActivityObj(GUILD_ACTIVITY_TYPE.GATE_ACTIVITY); + let { gateHp, members } = obj.getObj(guildCode, serverId); + members = uniq(members); + + let rank = await getMyUnionRank(REDIS_KEY.GUILD_ACTIVITY, serverId, guildCode); + let guildScore = await getRankScore(REDIS_KEY.GUILD_ACTIVITY, serverId, guildCode); + + let rewards = getGuildAuctionRewards(GUILD_ACTIVITY_TYPE.GATE_ACTIVITY, rank); + + let rec = await GuildActivityRecordModel.updateInfo(guildCode, { + isSuccess: gateHp > 0, + isCompleted: true, + rank, score: guildScore, remainGateHp: gateHp, + members, memberCnt: members.length, + rewards + }); + // 结算功勋等奖励 + let dic = gameData.guildActivity.get(GUILD_ACTIVITY_TYPE.GATE_ACTIVITY); + let memberRankResult = await getRank(getGuildKeyName(REDIS_KEY.USER_GUILD_ACTIVITY, guildCode), serverId, ''); + for(let { rank, roleId, num: myScore } of memberRankResult.ranks) { + let honour = dic.honour + myScore * GUILDACTIVITY.GATEACTIVITY_HONOUR_RATIO; + let honourObj = getHonourObject(Math.floor(honour)); + await sendMail(MAIL_TYPE.GUILD_ACTIVITY_REWARD, roleId, '系统', [], [honourObj]) + + await UserGuildActivityRecModel.updateInfoByRoleId(roleId, { score: myScore, rank }); + } + + // 加入拍卖行 + await genAuction(guildCode, AUCTION_SOURCE.GATE, rec.code, serverId, rewards); + + obj.delGuildRecord(guildCode, serverId); } \ No newline at end of file diff --git a/game-server/app/services/redisService.ts b/game-server/app/services/redisService.ts index 67e39400b..58afa9a13 100644 --- a/game-server/app/services/redisService.ts +++ b/game-server/app/services/redisService.ts @@ -173,7 +173,7 @@ export async function setRank(key: string, serverId: number, myId: string, score if(!hasCurUser) { await redisUserInfoAdd(infoKey, myId, params); } - return true; + return newScore; } // 获取排行榜 diff --git a/game-server/app/services/timeTaskService.ts b/game-server/app/services/timeTaskService.ts index b6954b8cb..b5444141a 100644 --- a/game-server/app/services/timeTaskService.ts +++ b/game-server/app/services/timeTaskService.ts @@ -12,7 +12,7 @@ import { MAIL_TYPE, REDIS_KEY, ADULT_AGE, GUEST_MAX_TIME, ADDICTION_PREVENTION_C import { RankParam } from '../domain/rank'; import { RoleModel } from '../db/Role'; import { MailModel, MailType } from '../db/Mail'; -import { pinus } from 'pinus'; +import { pinus, Application } from 'pinus'; import { indexOf } from 'underscore'; import { PvpSeasonResultModel } from '../db/PvpSeasonResult'; import { settleGuildWeekly } from './guildService'; @@ -20,8 +20,9 @@ import { STATUS } from '../consts/statusCode'; import { getMailContent, sendMail } from './mailService'; import { reportOnline } from '../pubUtils/httpUtil'; import User, { UserModel } from '../db/User'; -import { getGuildActivityByDic, getGuildActivityRank } from './guildActivityService'; +import { getGuildActivityByDic, getGuildActivityRank, setMedianCe } from './guildActivityService'; import { sendUngotDividend, startGuildAuction, startWorldAuction, stopAuction } from './auctionService'; +import { DicGuildActivity } from '../pubUtils/dictionary/DicGuildActivity'; const PER_SECOND = 1 * 1000; const PER_DAY = 24 * 60 * 60; const SETTLE_DIFF = 29 * 60; @@ -68,9 +69,14 @@ export async function init() { // 每5分钟汇报在线玩家在线情况 scheduleJob('reportOnline', '0 0/5 * * * *', reportOnlineSchedule); + // 军团活动排行榜 guildActivitySchedule(); + // 每天0点计算前一天活跃玩家中位数战力 + scheduleJob('setMedian', '0 0 5 * * ?', setMedianCe); + // 拍卖行刷新:拍卖阶段刷新,分红发放 auctionSchedule(); + } function setPvpSeasonSchdule() { @@ -334,8 +340,9 @@ export async function reportOneOnline(roleId: string, userCode: string, sid: str * 军团活动,每晚8点开启 */ async function guildActivitySchedule() { - // 军团晚间活动,每天8点开始 - scheduleJob('guildActivityStart', '0 0 20 * * ?', guildActivityStart); + /***********guildActivitySchedule***********/ + + scheduleJob('guildActivityStart', '0 0 20 * * ?', guildActivityStartSchedule); let dicGuildActivity = getTodayGuildActivity(); let statusResult = getGuildActivityByDic(dicGuildActivity); @@ -347,38 +354,44 @@ async function guildActivitySchedule() { if(dicGuildActivity.id == GUILD_ACTIVITY_TYPE.RACE_ACTIVITY) { seconds = 1; } - guildActSecondsJobId = scheduleJob('guildActivitySeconds', seconds, guildActivitySeconds); + guildActSecondsJobId = scheduleJob('guildActivitySeconds', `*/${seconds} * * * * *`, gateActivitySeconds); } if(!guildActEndJobId) { - guildActEndJobId = scheduleJob('guildActivityEnd', statusResult.time, guildActivityEnd); + guildActEndJobId = scheduleJob('guildActivityEnd', statusResult.time, gateActivityEnd); } } } -// 开始军团活动 -export async function guildActivityStart() { +// 军团晚间活动,每天8点开始 +async function guildActivityStartSchedule() { + await guildActivityStart(); +} - let dicGuildActivity = getTodayGuildActivity(); +export async function guildActivityStart(dicGuildActivity?: DicGuildActivity) { + console.log('***********开始军团晚间活动****') + if(!dicGuildActivity) dicGuildActivity = getTodayGuildActivity(); if(!dicGuildActivity) return; - let seconds = 10; // 每10秒下发一次 - if(dicGuildActivity.id == GUILD_ACTIVITY_TYPE.RACE_ACTIVITY) { - seconds = 1; + if(dicGuildActivity.id == GUILD_ACTIVITY_TYPE.GATE_ACTIVITY) { + guildActSecondsJobId = scheduleJob('guildActivitySeconds', '*/10 * * * * *', gateActivitySeconds); + // 结束时间 + guildActEndJobId = scheduleJob('guildActivityEnd', dicGuildActivity.duringTime, gateActivityEnd); + } else if (dicGuildActivity.id == GUILD_ACTIVITY_TYPE.CITY_ACTIVITY) { + + } else if (dicGuildActivity.id == GUILD_ACTIVITY_TYPE.RACE_ACTIVITY) { + } - guildActSecondsJobId = scheduleJob('guildActivitySeconds', seconds, guildActivitySeconds); - // 结束时间 - guildActEndJobId = scheduleJob('guildActivityEnd', dicGuildActivity.duringTime, guildActivityEnd); } +// 蛮夷入侵 // 结束军团活动 -export async function guildActivityEnd() { +export async function gateActivityEnd() { let servers = pinus.app.getServersByType('guild'); - console.log(servers); for(let { id } of servers) { - await pinus.app.rpc.guild.guildActivityRemote.guildActivityEnd.toServer(id); + await pinus.app.rpc.guild.guildActivityRemote.guildActivityEnd.toServer(id, GUILD_ACTIVITY_TYPE.GATE_ACTIVITY); } if(guildActSecondsJobId) guildActSecondsJobId.cancel(); @@ -386,11 +399,10 @@ export async function guildActivityEnd() { } // 每10秒下发一次的任务 -export async function guildActivitySeconds() { +export async function gateActivitySeconds() { let servers = pinus.app.getServersByType('guild'); - console.log(servers); for(let { id } of servers) { - await pinus.app.rpc.guild.guildActivityRemote.sendRankToGuilds.toServer(id); + await pinus.app.rpc.guild.guildActivityRemote.sendRankToGuilds.toServer(id, GUILD_ACTIVITY_TYPE.GATE_ACTIVITY); } } diff --git a/game-server/app/util/routeUtil.ts b/game-server/app/util/routeUtil.ts index baecf2bb9..2d81c58b9 100644 --- a/game-server/app/util/routeUtil.ts +++ b/game-server/app/util/routeUtil.ts @@ -60,7 +60,10 @@ export function guild(session: Session, msg: any, app: Application, cb: (err: Er if (['guild.gateActivityHandler.checkBattle', // 军团活动蛮夷入侵路由,按军团路由 'guild.gateActivityHandler.action', 'guild.gateActivityHandler.hitGate', - 'guild.gateActivityHandler.battleEnd' + 'guild.gateActivityHandler.battleEnd', + 'guild.gateActivityHandler.debugGetPrivate', + 'guild.gateActivityHandler.debugStartActivity', + 'guild.gateActivityHandler.debugEndActivity' ].indexOf(arg.route) !== -1) { rid = session.get('guildCode'); } diff --git a/game-server/config/servers.ts b/game-server/config/servers.ts index 55f1866de..084e3403d 100644 --- a/game-server/config/servers.ts +++ b/game-server/config/servers.ts @@ -45,8 +45,8 @@ module.exports = { {'id': 'systimer-server-1', 'host': '127.0.0.1', 'port': 6056, "args": " --inspect=9233"} ], 'guild': [ - {'id': 'guild-server-1', 'host': '127.0.0.1', 'port': 6057, "args": " --inspect=9238"}, - {'id': 'guild-server-2', 'host': '127.0.0.1', 'port': 6058, "args": " --inspect=9238"} + {'id': 'guild-server-1', 'host': '127.0.0.1', 'port': 6057, "args": " --inspect=9239"}, + {'id': 'guild-server-2', 'host': '127.0.0.1', 'port': 6058, "args": " --inspect=9240"} ] }, 'production': { @@ -81,8 +81,8 @@ module.exports = { {'id': 'systimer-server-1', 'host': '127.0.0.1', 'port': 6056} ], 'guild': [ - {'id': 'guild-server-1', 'host': '127.0.0.1', 'port': 6057, "args": " --inspect=9238"}, - {'id': 'guild-server-2', 'host': '127.0.0.1', 'port': 6058, "args": " --inspect=9238"} + {'id': 'guild-server-1', 'host': '127.0.0.1', 'port': 6057, "args": " --inspect=9239"}, + {'id': 'guild-server-2', 'host': '127.0.0.1', 'port': 6058, "args": " --inspect=9240"} ] }, 'alpha': { @@ -119,8 +119,8 @@ module.exports = { {'id': 'systimer-server-1', 'host': '127.0.0.1', 'port': 6056} ], 'guild': [ - {'id': 'guild-server-1', 'host': '127.0.0.1', 'port': 6057, "args": " --inspect=9238"}, - {'id': 'guild-server-2', 'host': '127.0.0.1', 'port': 6058, "args": " --inspect=9238"} + {'id': 'guild-server-1', 'host': '127.0.0.1', 'port': 6057, "args": " --inspect=9239"}, + {'id': 'guild-server-2', 'host': '127.0.0.1', 'port': 6058, "args": " --inspect=9240"} ] }, 'dev': { @@ -158,8 +158,8 @@ module.exports = { {'id': 'systimer-server-1', 'host': '127.0.0.1', 'port': 6056, "args": " --inspect=9233"} ], 'guild': [ - {'id': 'guild-server-1', 'host': '127.0.0.1', 'port': 6057, "args": " --inspect=9238"}, - {'id': 'guild-server-2', 'host': '127.0.0.1', 'port': 6058, "args": " --inspect=9238"} + {'id': 'guild-server-1', 'host': '127.0.0.1', 'port': 6057, "args": " --inspect=9239"}, + {'id': 'guild-server-2', 'host': '127.0.0.1', 'port': 6058, "args": " --inspect=9240"} ] }, 'isbn': { @@ -194,8 +194,8 @@ module.exports = { {'id': 'systimer-server-1', 'host': '127.0.0.1', 'port': 6056} ], 'guild': [ - {'id': 'guild-server-1', 'host': '127.0.0.1', 'port': 6057, "args": " --inspect=9238"}, - {'id': 'guild-server-2', 'host': '127.0.0.1', 'port': 6058, "args": " --inspect=9238"} + {'id': 'guild-server-1', 'host': '127.0.0.1', 'port': 6057, "args": " --inspect=9239"}, + {'id': 'guild-server-2', 'host': '127.0.0.1', 'port': 6058, "args": " --inspect=9240"} ] } }; diff --git a/shared/consts/constModules/guildConst.ts b/shared/consts/constModules/guildConst.ts index 489628ebc..836602485 100644 --- a/shared/consts/constModules/guildConst.ts +++ b/shared/consts/constModules/guildConst.ts @@ -164,4 +164,4 @@ export enum ENEMIES_TYPE { ENEMY = 2, // 小兵 LITTLE_BOSS = 3, // 小boss BOSS = 4, // 大boss -} \ No newline at end of file +} diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index a2248913f..bffc386ec 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -341,7 +341,8 @@ export const FILENAME = { DIC_ROLE_FRIEND: 'dic_zyz_friends', DIC_ROLE_FRIEND_LEVEL: 'dic_zyz_closelevel', DIC_GUILD_ACTIVITY: 'dic_zyz_guildActivity', - DIC_GATE_ACTIVITY_POINT: 'dic_zyz_gateActivityPoint' + DIC_GATE_ACTIVITY_POINT: 'dic_zyz_gateActivityPoint', + DIC_GUILD_AUCTION: 'dic_zyz_guildAuction' } export const WAR_RELATE_TABLES = [ @@ -381,7 +382,8 @@ export const MAIL_TYPE = { WISH_POOL_REWARD: 11, PVP_RESULT: 12, PVP_RANK_REWARD: 13, - GUILD_DIVIDEND: 14, // 拍卖行分红 + GUILD_ACTIVITY_REWARD: 14, + GUILD_DIVIDEND: 15, // 拍卖行分红 }; export const CHAT_SERVER = 'chat-server-1'; diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 5ac361185..51b5b7c7a 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -200,6 +200,7 @@ export const STATUS = { // 军团活动 21100-21199 GUILD_ACTIVITY_NOT_OPEN: { code: 21100, simStr: '活动未开放' }, GATE_HP_IS_ZERO: { code: 21101, simStr: '城门已被击破' }, + CHALLENGE_CNT_NOT_ENOUGH: { code: 21102, simStr: '挑战次数不足' }, // 通用 30000 - 30099 DIC_DATA_NOT_FOUND: { code: 30000, simStr: '数据表未找到' }, diff --git a/shared/db/GuildActivityRec.ts b/shared/db/GuildActivityRec.ts index e1ccca487..a38350344 100644 --- a/shared/db/GuildActivityRec.ts +++ b/shared/db/GuildActivityRec.ts @@ -35,12 +35,15 @@ export default class GuildActivityRecord extends BaseModel { @prop({ required: true, default: 0 }) memberCnt: number; // 参加的团员的数量 - @prop({ required: true, type: ()=> ItemReward, default: [] }) + @prop({ required: true, type: ()=> ItemReward, default: [], _id: false }) rewards: ItemReward[]; // 转到拍卖行的道具 @prop({ required: true }) score: number; // 蛮夷入侵总军功 + @prop({ required: true }) + remainGateHp: number; // 城门剩余血量 + @prop({ required: true }) cityId: number; // 诸侯混战占领了的城池 @@ -72,6 +75,14 @@ export default class GuildActivityRecord extends BaseModel { return rec; } + public static async updateInfo(guildCode: string, update: GuildActivityRecordUpdateParam) { + let today = getTodayZeroDate(); + + let rec: GuildActivityRecordType = await GuildActivityRecordModel.findOneAndUpdate( + { guildCode, createdAt: { $gte: today } }, + { $set: update }, { new: true }).lean(); + return rec; + } } export const GuildActivityRecordModel = getModelForClass(GuildActivityRecord); diff --git a/shared/db/UserGuildActivityRec.ts b/shared/db/UserGuildActivityRec.ts index 402b19375..846e811c9 100644 --- a/shared/db/UserGuildActivityRec.ts +++ b/shared/db/UserGuildActivityRec.ts @@ -62,11 +62,11 @@ export default class UserGuildActivityRec extends BaseModel { @prop({ required: true }) score: number; // 个人总军功 - @prop({ required: true, type: Record }) + @prop({ required: true, type: Record, _id: false }) record: Record[]; // 个人总军功 // 每天一条记录 - public static async getRecord(roleId: string, roleName: string, guildCode: string, serverId: number, sourceCode: string, heroes: number[], aid: number) { + public static async getRecord(roleId: string, roleName: string, guildCode: string, serverId: number, sourceCode: string, aid: number) { let today = getTodayZeroDate(); let docs = new UserGuildActivityRecModel(); let code = genCode(10); @@ -76,14 +76,17 @@ export default class UserGuildActivityRec extends BaseModel { { roleId, sourceCode, createdAt: { $gte: today }}, { $setOnInsert: update }, {new: true, upsert: true}).lean(); - if(heroes.length > 0 && rec) { - rec = await UserGuildActivityRecModel.findOneAndUpdate( { code: rec.code}, { $push: { heroes: { $each: heroes}}, $inc: { challengeCnt: 1 }}, {new: true}).lean(); - } + + return rec; + } + + public static async incChallengeCnt(code: string, heroes: number[], inc: number = 1 ) { + let rec = await UserGuildActivityRecModel.findOneAndUpdate( { code}, { $push: { heroes: { $each: heroes}}, $inc: { challengeCnt: inc }}, {new: true}).lean(); return rec; } public static async pushRecord(code: string, records: Record[]) { - let rec: UserGuildActivityRec = await UserGuildActivityRecModel.findOneAndUpdate( + let rec: UserGuildActivityRecType = await UserGuildActivityRecModel.findOneAndUpdate( { code }, { $push: { record: { $each: records } } }, { new: true } @@ -92,7 +95,14 @@ export default class UserGuildActivityRec extends BaseModel { } public static async updateInfo(code: string, update: UserGuildActivityRecUpdateParam) { - let rec: UserGuildActivityRec = await UserGuildActivityRecModel.findOneAndUpdate({ code }, { $set: update }, { new: true }).lean(); + let rec: UserGuildActivityRecType = await UserGuildActivityRecModel.findOneAndUpdate({ code }, { $set: update }, { new: true }).lean(); + return rec; + } + + public static async updateInfoByRoleId(roleId: string, update: UserGuildActivityRecUpdateParam) { + let today = getTodayZeroDate(); + let rec: UserGuildActivityRecType = await UserGuildActivityRecModel.findOneAndUpdate( + { roleId, createdAt: { $gte: today } }, { $set: update }, { new: true }).lean(); return rec; } } diff --git a/shared/domain/battleField/guildActivity.ts b/shared/domain/battleField/guildActivity.ts index f3ce35530..f385be73f 100644 --- a/shared/domain/battleField/guildActivity.ts +++ b/shared/domain/battleField/guildActivity.ts @@ -13,16 +13,18 @@ export class GateMembersRec { // 军团活动蛮夷入侵城门血量等数据存储 export class GateActivityObject { - private gateHp: Map = new Map(); // 城门血条,每个军团有一条血条 - private members: Map> = new Map(); // 每个军团参与的成员 - private membersRecord: Map = new Map(); // 每个成员的回合数和敌军数,防刷 - private guilds: Map = new Map(); // 参加的所有军团 + private gateHp: Map = new Map(); // 城门血条,每个军团有一条血条 guildCode => hp + private members: Map> = new Map(); // 每个军团参与的成员 guildCode => [roleId] + private membersRecord: Map = new Map(); // 每个成员的回合数和敌军数,防刷 recCode => GateMembersRec + private guilds: Map = new Map(); // 参加的所有军团 server => [guildCode] - public getObj(guildCode: string) { + public getObj(guildCode: string, serverId: number) { + console.log(guildCode, serverId) return { gateHp: this.getGateHpAndInc(guildCode), - members: this.members.get(guildCode), - memberesRecord: this.membersRecord.get(guildCode) + members: this.members.get(guildCode)||[], + memberesRecord: [...this.membersRecord], + guilds: this.guilds.get(serverId)||[] } } @@ -48,27 +50,40 @@ export class GateActivityObject { if(this.members.has(guildCode)) { this.members.get(guildCode).push(roleId); } else { + let arr = new Array(); + arr.push(roleId); this.members.set(guildCode, [roleId]); } if(this.guilds.has(serverId)) { - this.guilds.set(serverId, []); - } else { - let arr = this.guilds.get(serverId)||[]; + let arr = this.guilds.get(serverId); if(!arr.includes(guildCode)) arr.push(guildCode); this.guilds.set(serverId, arr); + } else { + this.guilds.set(serverId, [guildCode]); } + } - public getMemberRecord(code: string, roleId: string) { - return this.membersRecord.get(code)||new GateMembersRec(roleId) + public getMemberRecord(recCode: string, roleId: string) { + return this.membersRecord.get(recCode)||new GateMembersRec(roleId) } - public setMemberRecord(code: string, newMemberRecord: GateMembersRec) { - this.membersRecord.set(code, newMemberRecord); + public setMemberRecord(recCode: string, newMemberRecord: GateMembersRec) { + this.membersRecord.set(recCode, newMemberRecord); } - public delMemberRecord(code: string) { - this.membersRecord.delete(code); + public delMemberRecord(recCode: string) { + this.membersRecord.delete(recCode); + } + + public delGuildRecord(guildCode: string, serverId: number) { + let guildList = this.guilds.get(serverId); + if(guildList) { + let index = guildList.indexOf(guildCode); + guildList.splice(index, 1); + } + this.gateHp.delete(guildCode); + this.members.delete(guildCode); } } diff --git a/shared/pubUtils/data.ts b/shared/pubUtils/data.ts index cf50fc576..9b1252cd8 100644 --- a/shared/pubUtils/data.ts +++ b/shared/pubUtils/data.ts @@ -60,6 +60,7 @@ import { dicRoleFriendLv } from "./dictionary/DicRoleFriendLv"; import { Attribute } from "../domain/roleField/attribute"; import { dicGuildActivity, DicGuildActivity } from './dictionary/DicGuildActivity'; import { dicGateActivityPoint } from './dictionary/DicGateActivityPoint'; +import { dicGuildAuction } from './dictionary/DicGuildAuction'; import { getCutDay } from "./timeUtil"; export const gameData = { @@ -144,7 +145,8 @@ export const gameData = { roleFriendLv: dicRoleFriendLv, figureCondition: figureCondition, guildActivity: dicGuildActivity, - gateActivityPoint: dicGateActivityPoint + gateActivityPoint: dicGateActivityPoint, + guildAuction: dicGuildAuction }; // 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据 @@ -456,3 +458,16 @@ export function getTodayGuildActivity() { } return dic; } + +/** + * 根据军团活动排名获得奖励 + * @param aid 活动id + * @param rank 排名 + */ +export function getGuildAuctionRewards(aid: number, rank: number) { + let ranksReward = gameData.guildAuction.get(aid)||[]; + let dic = ranksReward.find(cur => { + return rank >= cur.min && (rank <= cur.max || cur.max == 0); + }); + return dic?dic.rewards: new Array(); +} \ No newline at end of file diff --git a/shared/pubUtils/dictionary/DicGuildAuction.ts b/shared/pubUtils/dictionary/DicGuildAuction.ts new file mode 100644 index 000000000..abc97a55c --- /dev/null +++ b/shared/pubUtils/dictionary/DicGuildAuction.ts @@ -0,0 +1,29 @@ +// 公会权限 +import { readJsonFile, parseGoodStr } from '../util' +import { FILENAME } from '../../consts' +import { RewardInter } from '../../pubUtils/interface'; + +export interface DicGuildAuction { + + // 活动类型 1-蛮夷入侵 2-诸侯混战 3-粮草先行 + readonly id: number; + // 最低名次 + readonly min: number; + // 最高名次 + readonly max: number; + // 奖励 + readonly rewards: RewardInter[]; +} + +const str = readJsonFile(FILENAME.DIC_GUILD_AUCTION); +let arr = JSON.parse(str); + +export const dicGuildAuction = new Map(); + +arr.forEach(o => { + o.rewards = parseGoodStr(o.rewards); + let rank = dicGuildAuction.get(o.id)||[]; + rank.push(o); + dicGuildAuction.set(o.id, rank); +}); +arr = undefined; \ No newline at end of file diff --git a/shared/pubUtils/friendUtil.ts b/shared/pubUtils/friendUtil.ts index b027b174f..8239b0d9f 100644 --- a/shared/pubUtils/friendUtil.ts +++ b/shared/pubUtils/friendUtil.ts @@ -130,7 +130,6 @@ export function setCanReceiveAndCanSend(this: any, roleId: string, friendship: F let frd = outputCnt(roleId, friendship); if(frd) { let { sendHeart, receiveHeart, beSentHeart } = frd; - console.log('***',sendHeart, receiveHeart, beSentHeart) if(sendHeart >= 1) { this.canSend = false; } diff --git a/shared/pubUtils/itemUtils.ts b/shared/pubUtils/itemUtils.ts index 58f6ef4b8..917246449 100644 --- a/shared/pubUtils/itemUtils.ts +++ b/shared/pubUtils/itemUtils.ts @@ -79,7 +79,13 @@ export function getFriendPointObject(count: number) { return { id: CURRENCY_BY_TYPE.get(CURRENCY_TYPE.FRIEND_POINT), count}; } - +/** + * @description 获取功勋物品 { id, count } + * @param count 功勋数量 + */ +export function getHonourObject(count: number) { + return { id: CURRENCY_BY_TYPE.get(CURRENCY_TYPE.HONOUR), count}; +} /** * 解锁头像/相框 * @param roleId 玩家id diff --git a/shared/pubUtils/timeUtil.ts b/shared/pubUtils/timeUtil.ts index dc5838b0e..29e662d05 100644 --- a/shared/pubUtils/timeUtil.ts +++ b/shared/pubUtils/timeUtil.ts @@ -172,11 +172,12 @@ export function getNextTime(date: Date, h: number, m = 0, s = 0, ms = 0): Date { /** * 获得某个时间是星期几 + * @param needHandle 是否处理周日 * @param {Date} time */ -export function getCutDay(time?: Date) { +export function getCutDay( needHandle = false, time?: Date) { if(!time) time = new Date(); let d = time.getDay(); - if(d == 0) d = 7; + if(needHandle && d == 0) d = 7; return d; } diff --git a/shared/resource/jsons/dic_email_content.json b/shared/resource/jsons/dic_email_content.json index cf6d895cf..a0c8ac14a 100644 --- a/shared/resource/jsons/dic_email_content.json +++ b/shared/resource/jsons/dic_email_content.json @@ -1,9 +1,4 @@ [ - { - "id": 0, - "content": "%d", - "time": 24 - }, { "id": 1, "content": "您对军团%d的申请被拒绝", @@ -26,7 +21,7 @@ }, { "id": 5, - "content": "周活跃分成奖励", + "content": "亲爱的小将军,您昨日的军团活跃奖励忘记领取了,现已通过邮件发放,请查收", "time": 24 }, { @@ -68,5 +63,20 @@ "id": 13, "content": "恭喜小将军,您在%d赛季最终获得了第%d名,获得如下奖励:", "time": 24 + }, + { + "id": 14, + "content": "亲爱的小将军,您昨日的军团活动奖励忘记领取了,现已通过邮件发放,请查收:", + "time": 24 + }, + { + "id": 15, + "content": "小将军很抱歉,您在拍卖行的出价已被超过,元宝退还给您,请查收:", + "time": 24 + }, + { + "id": 16, + "content": "恭喜小将军,您已在拍卖行成功拍下以下物品,请查收:", + "time": 24 } ] \ No newline at end of file diff --git a/shared/resource/warJsons/7001.json b/shared/resource/warJsons/7001.json index f5d653bc0..ac29ce9c0 100644 --- a/shared/resource/warJsons/7001.json +++ b/shared/resource/warJsons/7001.json @@ -146,7 +146,7 @@ "outIndex": 6, "dirction": 2, "x": 10, - "y": 11, + "y": 4, "var": 1001, "lv": 0, "hide": 0, @@ -203,7 +203,7 @@ "star": 0, "spine": 0, "bossStage": 0, - "enemyType": 0, + "enemyType": 2, "dest_oppo": 1001 }, { @@ -341,7 +341,7 @@ "star": 0, "spine": 0, "bossStage": 1, - "enemyType": 3, + "enemyType": 4, "dest_oppo": 1001 } ] \ No newline at end of file