From 53d4af4e09741e146580b23a634761de4861ed95 Mon Sep 17 00:00:00 2001 From: luying Date: Wed, 9 Nov 2022 18:01:02 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(=E5=85=BC=E5=AE=B9):=20?= =?UTF-8?q?=E9=85=8D=E8=A1=A8=E4=BD=BF=E7=94=A8=E5=90=8E=E5=8F=B0=E9=9A=90?= =?UTF-8?q?=E8=97=8F=E7=89=A9=E5=93=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game-server/app.ts | 3 + .../servers/activity/handler/gachaHandler.ts | 5 + .../servers/activity/remote/activityRemote.ts | 9 ++ .../battle/handler/comBattleHandler.ts | 2 + .../battle/handler/expeditionBattleHandler.ts | 4 +- .../servers/battle/handler/ladderHandler.ts | 5 + .../battle/handler/normalBattleHandler.ts | 2 + .../app/servers/battle/handler/pvpHandler.ts | 4 + .../battle/handler/towerBattleHandler.ts | 4 +- .../app/servers/battle/remote/battleRemote.ts | 9 ++ .../app/servers/chat/remote/chatRemote.ts | 9 ++ .../servers/connector/handler/entryHandler.ts | 6 + .../connector/remote/connectorRemote.ts | 10 ++ .../app/servers/gm/handler/gmServerHandler.ts | 53 ++++++++- game-server/app/servers/gm/remote/gmRemote.ts | 15 ++- .../servers/guild/handler/auctionHandler.ts | 4 +- .../servers/guild/handler/guildBossHandler.ts | 4 +- .../servers/guild/handler/wishPoolHandler.ts | 5 + .../app/servers/guild/remote/guildRemote.ts | 9 ++ .../app/servers/order/remote/orderRemote.ts | 9 ++ .../app/servers/role/handler/heroHandler.ts | 43 ++++++-- .../app/servers/role/handler/roleHandler.ts | 21 +++- .../app/servers/role/handler/shopHandler.ts | 2 + .../app/servers/role/remote/roleRemote.ts | 9 ++ .../servers/systimer/remote/systimerRemote.ts | 10 ++ .../app/services/activity/gachaService.ts | 13 ++- .../services/activity/giftPackageService.ts | 27 +++-- game-server/app/services/auctionService.ts | 49 ++++++++- game-server/app/services/connectorService.ts | 4 + game-server/app/services/dataService.ts | 96 ++++++++++++++++ game-server/app/services/gmService.ts | 26 +++++ .../guildActivity/guildActivityService.ts | 4 +- game-server/app/services/guildBossService.ts | 2 +- game-server/app/services/pushService.ts | 9 +- game-server/app/services/redisService.ts | 10 +- game-server/app/services/role/createHero.ts | 3 +- .../app/services/role/rewardService.ts | 5 +- game-server/app/services/shopService.ts | 4 + game-server/app/services/timeTaskService.ts | 41 ++++++- game-server/app/util/logger.ts | 5 +- game-server/config/alpha/log4js.ts | 15 +++ game-server/config/dev/log4js.ts | 15 +++ game-server/config/servers.ts | 2 +- gm-server/app/controller/game.ts | 14 +++ gm-server/app/router.ts | 2 + gm-server/app/service/Game.ts | 23 ++++ shared/consts/constModules/chatConst.ts | 1 + shared/consts/constModules/sysConst.ts | 3 +- shared/consts/statusCode.ts | 7 ++ shared/db/HiddenData.ts | 44 ++++++++ shared/db/HiddenDataById.ts | 103 ++++++++++++++++++ shared/domain/backEndField/params.ts | 25 +++++ shared/pubUtils/data.ts | 48 +------- shared/resource/jsons/dic_api.json | 14 +++ 54 files changed, 768 insertions(+), 102 deletions(-) create mode 100644 game-server/app/services/dataService.ts create mode 100644 shared/db/HiddenData.ts create mode 100644 shared/db/HiddenDataById.ts diff --git a/game-server/app.ts b/game-server/app.ts index d6944700a..e2a809a9e 100644 --- a/game-server/app.ts +++ b/game-server/app.ts @@ -197,6 +197,9 @@ async function treatStartLogic(app: _pinus.Application) { timeTaskService.setPvpSeasonNum(); timeTaskService.setPvpSettleSeasonNum(); } + if(app.getServerType() != 'systimer') { + timeTaskService.initHiddenData(); + } if(app.isMaster()) { redisService.initAllRank(); diff --git a/game-server/app/servers/activity/handler/gachaHandler.ts b/game-server/app/servers/activity/handler/gachaHandler.ts index 818b97283..04bd61d9a 100644 --- a/game-server/app/servers/activity/handler/gachaHandler.ts +++ b/game-server/app/servers/activity/handler/gachaHandler.ts @@ -15,6 +15,7 @@ import { checkTaskInGacha } from "../../../services/task/taskService"; import { createHeroes } from "../../../services/role/createHero"; import { getGuideGachaData } from "../../../services/activity/gachaService"; import { getPlayerNewHeroGachaData } from "../../../services/activity/newHeroService"; +import { isHeroHidden } from "../../../services/dataService"; export default function (app: Application) { new HandlerService(app, {}); @@ -225,6 +226,9 @@ export class GachaHandler { const { gachaId, activityId = 0, pickHero } = msg; const roleId: string = session.get('roleId'); const serverId: number = session.get('serverId'); + + if(isHeroHidden(pickHero)) return resResult(STATUS.HERO_IS_HIDDEN); + let dicHero = gameData.hero.get(pickHero); if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND); @@ -271,6 +275,7 @@ export class GachaHandler { const sid: string = session.get('sid'); const { hid } = msg; + if(isHeroHidden(hid)) return resResult(STATUS.HERO_IS_HIDDEN); let dicHero = gameData.hero.get(hid); if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND); let dicRecruit = gameData.recruit.get(hid); diff --git a/game-server/app/servers/activity/remote/activityRemote.ts b/game-server/app/servers/activity/remote/activityRemote.ts index 0fdaf2096..bf907963e 100644 --- a/game-server/app/servers/activity/remote/activityRemote.ts +++ b/game-server/app/servers/activity/remote/activityRemote.ts @@ -10,6 +10,7 @@ import { ActivityGroupModel } from '../../../db/ActivityGroup'; import { deleteActivities, loadActivities, saveActivitiesToGroup, updateActivities, _getActivityById, _getActivitiesByType, _getActivities, _getActivitiesByServerId, saveGroupToServer } from '../../../services/activity/activityRemoteService'; import { saveActivityMemory } from '../../../services/log/memoryLogService'; import { setApiIsClose } from '../../../services/chatService'; +import { setHiddenData } from '../../../services/dataService'; export default function (app: Application) { new HandlerService(app, {}); @@ -148,4 +149,12 @@ export class ActivityRemote { errlogger.error(`remote ${__filename} \n ${e.stack}`); } } + + public async setHiddenData(heroes: number[], goods: number[], refTime: number) { + try { + setHiddenData(heroes, goods, refTime); + } catch(e) { + errlogger.error(`remote ${__filename} \n ${e.stack}`); + } + } } \ No newline at end of file diff --git a/game-server/app/servers/battle/handler/comBattleHandler.ts b/game-server/app/servers/battle/handler/comBattleHandler.ts index aea33c2df..d3f5abd78 100644 --- a/game-server/app/servers/battle/handler/comBattleHandler.ts +++ b/game-server/app/servers/battle/handler/comBattleHandler.ts @@ -29,6 +29,7 @@ import { HeroModel } from '../../../db/Hero'; import { addUserToTeamChannel, delTeamChannel, removeFromTeamChannel, sendMessageToTeam, sendMessageToUsersWithSuc, sendMessageToUserWithSuc } from '../../../services/pushService'; import { getFriendRelationType, getRecommendType } from '../../../services/friendService'; import { FriendRelationModel } from '../../../db/FriendRelation'; +import { isHeroHidden } from '../../../services/dataService'; export default function(app: Application) { return new ComBattleHandler(app); @@ -301,6 +302,7 @@ export class ComBattleHandler { let roleId = session.get('roleId'); let { teamCode, heroes: hids, battleCode = 'default' } = msg; if (!hids || hids.length === 0) return resResult(STATUS.COM_BATTLE_HEROES_ERR); + if(isHeroHidden(...hids)) return resResult(STATUS.HERO_IS_HIDDEN); let teamStatus = this.teamMap.get(teamCode); if (!teamStatus || !teamStatus.roleIds || teamStatus.roleIds.indexOf(roleId) === -1) return resResult(STATUS.COM_BATTLE_TEAM_INVALID); diff --git a/game-server/app/servers/battle/handler/expeditionBattleHandler.ts b/game-server/app/servers/battle/handler/expeditionBattleHandler.ts index 254c5d2d0..217204b16 100644 --- a/game-server/app/servers/battle/handler/expeditionBattleHandler.ts +++ b/game-server/app/servers/battle/handler/expeditionBattleHandler.ts @@ -20,6 +20,7 @@ import { getSeconds, nowSeconds } from '../../../pubUtils/timeUtil'; import { reportTAEvent } from '../../../services/sdkService'; import { getSumCe } from '../../../services/playerCeService'; import { vipCanSkipExpedition } from '../../../services/activity/monthlyTicketService'; +import { isHeroHidden } from '../../../services/dataService'; export default function (app: Application) { new HandlerService(app, {}); @@ -149,7 +150,8 @@ export class ExpeditionBattleHandler { let { isOK, hids } = await checkBattleHeroes(roleId, seqIds); if (!isOK) return resResult(STATUS.BATTLE_HERO_NOT_FOUND); - + if(isHeroHidden(...hids)) return resResult(STATUS.HERO_IS_HIDDEN); + let expeditionWarRecord = await ExpeditionWarRecordModel.getRecordByCodeAndId(expeditionCode, expeditionId); if (!expeditionWarRecord) { return resResult(STATUS.EXPEDITION_MISS_WAR_RECORD); diff --git a/game-server/app/servers/battle/handler/ladderHandler.ts b/game-server/app/servers/battle/handler/ladderHandler.ts index ef42c414e..19b7dbc66 100644 --- a/game-server/app/servers/battle/handler/ladderHandler.ts +++ b/game-server/app/servers/battle/handler/ladderHandler.ts @@ -18,6 +18,7 @@ import { saveLadderDefCeByData } from '../../../services/redisService'; import { pushLadderTopChangeMsg } from '../../../services/sysChatService'; import { checkTaskInLadderEnd, checkTaskInLadderStart, checkTaskInLadderSweep } from '../../../services/task/taskService'; import { BattleRecordModel } from '../../../db/BattleRecord'; +import { isHeroHidden } from '../../../services/dataService'; export default function (app: Application) { new HandlerService(app, {}); @@ -148,6 +149,9 @@ export class LadderHandler { if(!rec || rec.roleId1 != roleId) return resResult(STATUS.LADDER_REC_NOT_FOUND); if(rec.status != LADDER_STATUS.CHECK) return resResult(STATUS.LADDER_REC_STATUS_ERR); + for(let { actorId } of heroes) { + if(isHeroHidden(actorId)) return resResult(STATUS.HERO_IS_HIDDEN); + } let { isOK, heroes: dbHeroes } = await checkBattleHeroesByHid(roleId, heroes.map(cur => cur.actorId)); if(!isOK) return resResult(STATUS.BATTLE_HERO_NOT_FOUND); @@ -273,6 +277,7 @@ export class LadderHandler { if(!ladderData) return resResult(STATUS.LADDER_NOT_OPEN); let hids: number[] = heroes.map(cur => cur.actorId); + if(isHeroHidden(...hids)) return resResult(STATUS.HERO_IS_HIDDEN); let dbHeroes = await HeroModel.findByHidRange(hids, roleId, '_id hid ce', true); let defenseHeroes = heroes.map(cur => { diff --git a/game-server/app/servers/battle/handler/normalBattleHandler.ts b/game-server/app/servers/battle/handler/normalBattleHandler.ts index a179176f6..69a340912 100644 --- a/game-server/app/servers/battle/handler/normalBattleHandler.ts +++ b/game-server/app/servers/battle/handler/normalBattleHandler.ts @@ -31,6 +31,7 @@ import { RewardInter } from '../../../pubUtils/interface'; import { addItems } from '../../../services/role/rewardService'; import { treasureHuntChallengeConsume } from '../../../services/activity/treasureHuntService'; import { combineItems } from '../../../services/role/util'; +import { isHeroHidden } from '../../../services/dataService'; export default function (app: Application) { new HandlerService(app, {}); @@ -73,6 +74,7 @@ export class NormalBattleHandler { let { isOK, hids, heroes, lineup } = await checkBattleHeroes(roleId, seqIds); if (!isOK) return resResult(STATUS.BATTLE_HERO_NOT_FOUND); + if(isHeroHidden(...hids)) return resResult(STATUS.HERO_IS_HIDDEN); const battleCode = genCode(8); // 关卡唯一值 let dailyNum = {}; diff --git a/game-server/app/servers/battle/handler/pvpHandler.ts b/game-server/app/servers/battle/handler/pvpHandler.ts index ecfaf610b..c4629b4ca 100644 --- a/game-server/app/servers/battle/handler/pvpHandler.ts +++ b/game-server/app/servers/battle/handler/pvpHandler.ts @@ -26,6 +26,7 @@ import { PvpSaveDataModel } from '../../../db/PvpSaveData'; import { PVPConfigModel } from '../../../db/PvpConfig'; import { getAllServerName, getServerName } from '../../../services/redisService'; import { RoleRankInfo } from '../../../domain/rank'; +import { isHeroHidden } from '../../../services/dataService'; export default function (app: Application) { new HandlerService(app, {}); @@ -363,6 +364,7 @@ export class PvpHandler { // 更新挑战阵容 let scores: number[] = []; for(let { actorId } of heroes) { + if(isHeroHidden(actorId)) return resResult(STATUS.HERO_IS_HIDDEN); let heroScore = pvpDefense.heroScores.find(cur => cur.hid == actorId); if(heroScore) { scores.push(heroScore.score); @@ -431,6 +433,8 @@ export class PvpHandler { // 更新防守阵容 let scores: number[] = [], heroIdMap = new Map(), hids: number[] = []; for(let { actorId } of heroes) { + if(isHeroHidden(actorId)) return resResult(STATUS.HERO_IS_HIDDEN); + let heroScore = pvpDefense.heroScores.find(cur => cur.hid == actorId); if(heroScore) { scores.push(heroScore.score); diff --git a/game-server/app/servers/battle/handler/towerBattleHandler.ts b/game-server/app/servers/battle/handler/towerBattleHandler.ts index 6d030d513..f89eba7bc 100644 --- a/game-server/app/servers/battle/handler/towerBattleHandler.ts +++ b/game-server/app/servers/battle/handler/towerBattleHandler.ts @@ -21,6 +21,7 @@ import { combineItems } from '../../../services/role/util'; import { checkTaskInSkipTower } from '../../../services/task/taskService'; import { Rank } from '../../../services/rankService'; import { checkPopUpCondition } from '../../../services/activity/popUpShopService'; +import { isHeroHidden } from '../../../services/dataService'; export default function(app: Application) { return new TowerBattleHandler(app); @@ -227,8 +228,9 @@ export class TowerBattleHandler { if (seqIds.length !== dicTask.actorNeeded) { // 武将数,从策划表中读取 return resResult(STATUS.TOWER_TASK_MAX_HERO); } - let { isOK, heroes } = await checkBattleHeroes(roleId, seqIds); + let { isOK, heroes, hids } = await checkBattleHeroes(roleId, seqIds); if(!isOK) return resResult(STATUS.BATTLE_HERO_NOT_FOUND); + if(isHeroHidden(...hids)) return resResult(STATUS.HERO_IS_HIDDEN); if (tasksCode.indexOf(taskCode) === -1) { return resResult(STATUS.TOWER_TASK_CODE_NOT_FOUND); } diff --git a/game-server/app/servers/battle/remote/battleRemote.ts b/game-server/app/servers/battle/remote/battleRemote.ts index 94cb84a30..c612c1c8a 100644 --- a/game-server/app/servers/battle/remote/battleRemote.ts +++ b/game-server/app/servers/battle/remote/battleRemote.ts @@ -2,6 +2,7 @@ import { Application, ChannelService, HandlerService, } from 'pinus'; import { PVPConfigModel, PVPConfigType } from '../../../db/PvpConfig'; import { reloadResources } from '../../../pubUtils/data'; import { setApiIsClose } from '../../../services/chatService'; +import { setHiddenData } from '../../../services/dataService'; import { getServerMainten, setServerMainten, stopServerMainten } from '../../../services/gmService'; import { savePvpSeasonMemory } from '../../../services/log/memoryLogService'; import { taflush } from '../../../services/sdkService'; @@ -155,4 +156,12 @@ export class BattleRemote { errlogger.error(`remote ${__filename} \n ${e.stack}`); } } + + public async setHiddenData(heroes: number[], goods: number[], refTime: number) { + try { + setHiddenData(heroes, goods, refTime); + } catch(e) { + errlogger.error(`remote ${__filename} \n ${e.stack}`); + } + } } \ No newline at end of file diff --git a/game-server/app/servers/chat/remote/chatRemote.ts b/game-server/app/servers/chat/remote/chatRemote.ts index e8437c101..ffd501806 100644 --- a/game-server/app/servers/chat/remote/chatRemote.ts +++ b/game-server/app/servers/chat/remote/chatRemote.ts @@ -5,6 +5,7 @@ import { getServerMainten, setServerMainten, stopServerMainten } from '../../../ import { errlogger } from '../../../util/logger'; import { addUserToChannel, sendMessageToChannel, sendMessgeToChannelByBatch } from '../../../services/pushService'; import { setApiIsClose } from '../../../services/chatService'; +import { setHiddenData } from '../../../services/dataService'; export default function (app: Application) { new HandlerService(app, {}); @@ -156,4 +157,12 @@ export class ChatRemote { errlogger.error(`remote ${__filename} \n ${e.stack}`); } } + + public async setHiddenData(heroes: number[], goods: number[], refTime: number) { + try { + setHiddenData(heroes, goods, refTime); + } catch(e) { + errlogger.error(`remote ${__filename} \n ${e.stack}`); + } + } } diff --git a/game-server/app/servers/connector/handler/entryHandler.ts b/game-server/app/servers/connector/handler/entryHandler.ts index e63757fdc..6bcc4702a 100644 --- a/game-server/app/servers/connector/handler/entryHandler.ts +++ b/game-server/app/servers/connector/handler/entryHandler.ts @@ -24,6 +24,7 @@ import { sendMessageToAllWithSuc, sendMessageToUserWithSuc } from '../../../serv import { checkServerIsOpen, getIpLocation } from '../../../services/roleService'; import { dispatch } from '../../../pubUtils/dispatcher'; import { leaveRaceActivityToRemote } from '../../../services/guildActivity/guildActivityService'; +import { getHiddenData } from '../../../services/dataService'; export default function (app: Application) { new HandlerService(app, {}); @@ -176,6 +177,11 @@ export class EntryHandler { return resResult(STATUS.SUCCESS, { todayZeroPoint }); } + async getHiddenData(msg: { }, session: FrontendSession) { + let data = getHiddenData(); + return resResult(STATUS.SUCCESS, data); + } + /** * User log out handler * diff --git a/game-server/app/servers/connector/remote/connectorRemote.ts b/game-server/app/servers/connector/remote/connectorRemote.ts index 82ea1dcc8..81efcf4b2 100644 --- a/game-server/app/servers/connector/remote/connectorRemote.ts +++ b/game-server/app/servers/connector/remote/connectorRemote.ts @@ -11,6 +11,8 @@ import { setWeek } from '../../../pubUtils/timeUtil'; import { savePvpSeasonMemory } from '../../../services/log/memoryLogService'; import { setApiIsClose } from '../../../services/chatService'; import { setPvpSeasonNum, setPvpSettleSeasonNum } from '../../../services/timeTaskService'; +import { setHiddenData } from '../../../services/dataService'; + export default function (app: Application) { new HandlerService(app, {}); return new ConnectorRemote(app); @@ -183,4 +185,12 @@ export class ConnectorRemote { errlogger.error(`remote ${__filename} \n ${e.stack}`); } } + + public async setHiddenData(heroes: number[], goods: number[], refTime: number) { + try { + setHiddenData(heroes, goods, refTime); + } catch(e) { + errlogger.error(`remote ${__filename} \n ${e.stack}`); + } + } } diff --git a/game-server/app/servers/gm/handler/gmServerHandler.ts b/game-server/app/servers/gm/handler/gmServerHandler.ts index e70fb0e8e..f7a8b0749 100644 --- a/game-server/app/servers/gm/handler/gmServerHandler.ts +++ b/game-server/app/servers/gm/handler/gmServerHandler.ts @@ -1,17 +1,19 @@ import { Application, BackendSession, pinus } from 'pinus'; import { genCode, getRandSingleEelm, resResult } from '../../../pubUtils/util'; import { STATUS } from '../../../consts/statusCode'; -import moment = require('moment'); -import { CreatePvpConfigParam, CreateServerParam, UpdateRegionParams } from '../../../domain/backEndField/params'; +import { UpdateHiddenDataParam, CreatePvpConfigParam, CreateServerParam, UpdateRegionParams } from '../../../domain/backEndField/params'; import { RegionModel, RegionType } from '../../../db/Region'; import { gameData } from '../../../pubUtils/data'; import { Maintenance, ServerlistModel, ServerlistUpdate } from '../../../db/Serverlist'; import { nowSeconds } from '../../../pubUtils/timeUtil'; -import { createNewServer, sendOpenServerMail } from '../../../services/gmService'; +import { calHiddenData, createNewServer, getFutureTime, getPastTime } from '../../../services/gmService'; import { isNumber } from 'util'; import { MarqueeModel } from '../../../db/Marquee'; import { setApiIsCloseToRemote } from '../../../services/chatService'; import { PVPConfigModel } from '../../../db/PvpConfig'; +import { initHiddenDataSchedule } from '../../../services/timeTaskService'; +import { HiddenDataByIdModel, HiddenDataByIdModelTypeParam } from '../../../db/HiddenDataById'; +import { isDevelopEnv } from '../../../services/utilService'; export default function (app: Application) { return new GmHandler(app); @@ -198,4 +200,49 @@ export class GmHandler { return resResult(STATUS.SUCCESS); } + + async initHiddenData(msg: {pubArr: number[], hideArr: number[], type: number}, session: BackendSession) { + let { pubArr = [], hideArr = [], type } = msg; + let uid = session.get('uid'); + let datas = await HiddenDataByIdModel.findExistData(type); + let existIds = datas.map(cur => cur.id); + let insertParam: HiddenDataByIdModelTypeParam[] = []; + for(let id of pubArr) { + if(existIds.indexOf(id) == -1) { + insertParam.push({ type, id, publishTime: getPastTime(), createdBy: uid, updatedBy: uid }); + } + } + for(let id of hideArr) { + if(existIds.indexOf(id) == -1) { + insertParam.push({ type, id, publishTime: getFutureTime(), createdBy: uid, updatedBy: uid }); + } + } + await HiddenDataByIdModel.createDatas(insertParam); + await calHiddenData(uid); + await initHiddenDataSchedule(false); + + return resResult(STATUS.SUCCESS); + } + + async saveHiddenData(msg: UpdateHiddenDataParam, session: BackendSession) { + let params = new UpdateHiddenDataParam(msg); + if(!params.checkParams()) return resResult(STATUS.WRONG_PARMS); + let uid = session.get('uid'); + let heroes: number[] = [], goods: number[] = []; + for(let {type, id} of params.arr) { + if(type == 1) heroes.push(id); + if(type == 2) goods.push(id); + } + if(!isDevelopEnv()) { + if(!await HiddenDataByIdModel.checkById(1, heroes, params.publishTime) || !await HiddenDataByIdModel.checkById(2, goods, params.publishTime)) { + return resResult(STATUS.GM_OLD_REF_TIME_ERR); + } + } + for(let {type, id} of params.arr) { + await HiddenDataByIdModel.updateData(type, id, params.publishTime, uid); + } + await calHiddenData(uid); + await initHiddenDataSchedule(false); + return resResult(STATUS.SUCCESS); + } } \ No newline at end of file diff --git a/game-server/app/servers/gm/remote/gmRemote.ts b/game-server/app/servers/gm/remote/gmRemote.ts index 13d4556f1..b346a3bf0 100644 --- a/game-server/app/servers/gm/remote/gmRemote.ts +++ b/game-server/app/servers/gm/remote/gmRemote.ts @@ -1,8 +1,7 @@ import { Application, ChannelService, HandlerService, } from 'pinus'; -import { resResult } from '../../../pubUtils/util'; -import { STATUS } from '../../../consts'; -import { mongoose } from '@typegoose/typegoose'; -const { ObjectId } = mongoose.Types; +import { setHiddenData } from '../../../services/dataService'; +import { errlogger } from '../../../util/logger'; + export default function (app: Application) { new HandlerService(app, {}); return new GMRemote(app); @@ -28,5 +27,13 @@ export class GMRemote { private channelService: ChannelService; + + public async setHiddenData(heroes: number[], goods: number[], refTime: number) { + try { + setHiddenData(heroes, goods, refTime); + } catch(e) { + errlogger.error(`remote ${__filename} \n ${e.stack}`); + } + } } \ No newline at end of file diff --git a/game-server/app/servers/guild/handler/auctionHandler.ts b/game-server/app/servers/guild/handler/auctionHandler.ts index bf698c2ff..5c01780dd 100644 --- a/game-server/app/servers/guild/handler/auctionHandler.ts +++ b/game-server/app/servers/guild/handler/auctionHandler.ts @@ -4,7 +4,7 @@ import { AUCTION_STAGE, DEBUG_MAGIC_WORD, STATUS, CURRENCY_BY_TYPE, CURRENCY_TYP import { LotModel } from "../../../db/Lot"; import { ItemReward } from "../../../domain/dbGeneral"; import { genCode, resResult } from "../../../pubUtils/util"; -import { auctionStage, calculateDividend, genAuction, sendUngotDividend, startGuildAuction, startWorldAuction, stopAuction, todayGuildBegin, getBasePrice, debugAuctionLots, officialAuctionLots, auctionBidStatus, getMaxPrice, guildBidStatus, getAuction, pushAuctionOver, pushAuctionUpdate, checkAuctionStage, processDividendFormat, processSingleDividendFormat, tomorrowGuildBegin, processLotsFormat, processSingleLotFormat } from "../../../services/auctionService"; +import { auctionStage, calculateDividend, genAuction, sendUngotDividend, startGuildAuction, startWorldAuction, stopAuction, todayGuildBegin, getBasePrice, debugAuctionLots, officialAuctionLots, auctionBidStatus, getMaxPrice, guildBidStatus, getAuction, pushAuctionOver, pushAuctionUpdate, checkAuctionStage, processDividendFormat, processSingleDividendFormat, tomorrowGuildBegin, processLotsFormat, processSingleLotFormat, getAuctionRewardByPoolId } from "../../../services/auctionService"; import { addItems, getGoldObject, handleCost } from '../../../services/role/rewardService'; import { getSimpleRoleInfo } from '../../../services/roleService'; import { getRoleOnlineInfo } from '../../../services/redisService'; @@ -16,7 +16,7 @@ import { unlockTrain } from '../../../services/guildTrainService'; import { UserGuildModel } from '../../../db/UserGuild'; import { UserGuildApplyModel } from '../../../db/UserGuildApply'; import * as dicParam from '../../../pubUtils/dicParam'; -import { gameData, getAuctionRewardByPoolId } from '../../../pubUtils/data'; +import { gameData } from '../../../pubUtils/data'; import { sendMailByContent } from '../../../services/mailService'; import { reportTAEvent } from '../../../services/sdkService'; import { sendMessageToGuildWithSuc, sendMessageToServerWithSuc } from '../../../services/pushService'; diff --git a/game-server/app/servers/guild/handler/guildBossHandler.ts b/game-server/app/servers/guild/handler/guildBossHandler.ts index a7e553bbc..457034da4 100644 --- a/game-server/app/servers/guild/handler/guildBossHandler.ts +++ b/game-server/app/servers/guild/handler/guildBossHandler.ts @@ -11,7 +11,7 @@ import { DATA_NAME } from '../../../consts/dataName'; import { UserGuildModel } from '../../../db/UserGuild'; import { addActive } from '../../../services/guildService'; import { GuildModel } from '../../../db/Guild'; -import { gameData, getAuctionRewardByPoolId, getBossByLv } from '../../../pubUtils/data'; +import { gameData, getBossByLv } from '../../../pubUtils/data'; import { lockData } from '../../../services/redLockService'; import { pushGuildBossSucMsg, getGuildChannelSid } from '../../../services/chatService'; import { checkTask } from '../../../services/task/taskService'; @@ -20,7 +20,7 @@ import { addItems, getGoldObject, handleCost } from '../../../services/role/rewa import * as dicParam from '../../../pubUtils/dicParam'; import { RoleModel } from '../../../db/Role'; import { sendMailToGuildByContent } from '../../../services/mailService'; -import { genAuction } from '../../../services/auctionService'; +import { genAuction, getAuctionRewardByPoolId } from '../../../services/auctionService'; import { sendMessageToGuildWithSuc } from '../../../services/pushService'; export default function (app: Application) { diff --git a/game-server/app/servers/guild/handler/wishPoolHandler.ts b/game-server/app/servers/guild/handler/wishPoolHandler.ts index 8c8003f52..86668ad99 100644 --- a/game-server/app/servers/guild/handler/wishPoolHandler.ts +++ b/game-server/app/servers/guild/handler/wishPoolHandler.ts @@ -16,6 +16,7 @@ import { ARMY } from '../../../pubUtils/dicParam'; import { guildInter } from '../../../pubUtils/interface'; import { getSeconds, getZeroPoint, nowSeconds } from '../../../pubUtils/timeUtil'; import { sendMessageToUserWithSuc } from '../../../services/pushService'; +import { isGoodsHidden } from '../../../services/dataService'; export default function(app: Application) { return new WishPoolHandler(app); } @@ -39,6 +40,8 @@ export class WishPoolHandler { const { goodId, type, myUserGuild } = msg; const roleId: string = session.get('roleId'); const serverId: number = parseInt(session.get('serverId')); + + if(isGoodsHidden(goodId)) return resResult(STATUS.ITEM_IS_HIDDEN); let dicGoods = getGoodById(goodId) if (!dicGoods) return resResult(STATUS.DIC_DATA_NOT_FOUND); let dicItid = ITID.get(dicGoods.itid); @@ -101,6 +104,8 @@ export class WishPoolHandler { if (wishGood.receiveCnt >= wishGood.count) return resResult(STATUS.HAS_RECEIVE_WISH_GOOD);//已经收到 + if(isGoodsHidden(wishGood.goodId)) return resResult(STATUS.ITEM_IS_HIDDEN); + let dicWishReward = getWishPoolReward(wishGood.goodId); if(!dicWishReward) return resResult(STATUS.DIC_DATA_NOT_FOUND); diff --git a/game-server/app/servers/guild/remote/guildRemote.ts b/game-server/app/servers/guild/remote/guildRemote.ts index 4beb00169..7d414f7de 100644 --- a/game-server/app/servers/guild/remote/guildRemote.ts +++ b/game-server/app/servers/guild/remote/guildRemote.ts @@ -4,6 +4,7 @@ import { taflush, treatGuildName } from '../../../services/sdkService'; import { getServerMainten, setServerMainten, stopServerMainten } from '../../../services/gmService'; import { errlogger } from '../../../util/logger'; import { setApiIsClose } from '../../../services/chatService'; +import { setHiddenData } from '../../../services/dataService'; export default function (app: Application) { new HandlerService(app, {}); @@ -74,4 +75,12 @@ export class GuildRemote { errlogger.error(`remote ${__filename} \n ${e.stack}`); } } + + public async setHiddenData(heroes: number[], goods: number[], refTime: number) { + try { + setHiddenData(heroes, goods, refTime); + } catch(e) { + errlogger.error(`remote ${__filename} \n ${e.stack}`); + } + } } \ No newline at end of file diff --git a/game-server/app/servers/order/remote/orderRemote.ts b/game-server/app/servers/order/remote/orderRemote.ts index 366e44572..b34fe580d 100644 --- a/game-server/app/servers/order/remote/orderRemote.ts +++ b/game-server/app/servers/order/remote/orderRemote.ts @@ -5,6 +5,7 @@ import { getServerMainten, setServerMainten, stopServerMainten } from '../../../ import { taflush } from '../../../services/sdkService'; import { errlogger } from '../../../util/logger'; import { setApiIsClose } from '../../../services/chatService'; +import { setHiddenData } from '../../../services/dataService'; export default function (app: Application) { new HandlerService(app, {}); @@ -86,4 +87,12 @@ export class OrderRemote { errlogger.error(`remote ${__filename} \n ${e.stack}`); } } + + public async setHiddenData(heroes: number[], goods: number[], refTime: number) { + try { + setHiddenData(heroes, goods, refTime); + } catch(e) { + errlogger.error(`remote ${__filename} \n ${e.stack}`); + } + } } \ No newline at end of file diff --git a/game-server/app/servers/role/handler/heroHandler.ts b/game-server/app/servers/role/handler/heroHandler.ts index 620f974e4..1c43a50ab 100644 --- a/game-server/app/servers/role/handler/heroHandler.ts +++ b/game-server/app/servers/role/handler/heroHandler.ts @@ -25,6 +25,7 @@ import { SchoolModel } from '../../../db/School'; import { SkinModel } from '../../../db/Skin'; import { RoleCeModel } from '../../../db/RoleCe'; import { saveRebirthLog } from '../../../pubUtils/logUtil'; +import { isGoodsHidden, isHeroHidden } from '../../../services/dataService'; export default function (app: Application) { new HandlerService(app, {}); @@ -43,15 +44,15 @@ export class HeroHandler { let sid: string = session.get('sid'); let serverId: number = session.get('serverId'); - let { hid } = msg; + if(isHeroHidden(hid)) return resResult(STATUS.HERO_IS_HIDDEN); + let dicHero = gameData.hero.get(hid); + if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND); // 检查是否存在武将 let hasHero = await HeroModel.findByHidAndRole(hid, roleId); if (hasHero) return resResult(STATUS.ROLE_HERO_EXISTS); // 根据dic_hero 获得 1. 碎片id 2. 碎片数量 3. 初始武将星级 4. 初始品质 - let dicHero = gameData.hero.get(hid); - if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND); let { pieceId, pieceCount } = dicHero; // 碎片数量是否足够 let costResult = await handleCost(roleId, sid, [{ id: pieceId, count: pieceCount }], ITEM_CHANGE_REASON.COMPOSE_HERO); @@ -71,6 +72,7 @@ export class HeroHandler { const serverId = session.get('serverId'); let { hid, type } = msg; + if(isHeroHidden(hid)) return resResult(STATUS.HERO_IS_HIDDEN); let addLv = 0; if (type == 1) { @@ -144,8 +146,9 @@ export class HeroHandler { const serverId = session.get('serverId'); let sid: string = session.get('sid'); - let { hid, star, starStage, isOneClick } = msg; + if(isHeroHidden(hid)) return resResult(STATUS.HERO_IS_HIDDEN); + // 根据dic_hero 获得 1. 碎片id 2. 碎片数量 3. 初始武将星级 4. 初始品质 let dicHero = gameData.hero.get(hid); if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND); @@ -208,8 +211,9 @@ export class HeroHandler { let sid: string = session.get('sid'); let serverId: number = session.get('serverId'); - let { hid, quality } = msg; + if(isHeroHidden(hid)) return resResult(STATUS.HERO_IS_HIDDEN); + let dicHero = gameData.hero.get(hid); if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND); // 根据dic_hero 获得 碎片id @@ -259,8 +263,9 @@ export class HeroHandler { let roleName: string = session.get('roleName'); const serverId = session.get('serverId'); - let { hid, colorStar, colorStarStage, isOneClick } = msg; + if(isHeroHidden(hid)) return resResult(STATUS.HERO_IS_HIDDEN); + // 根据dic_hero 获得 1. 碎片id 2. 碎片数量 3. 初始武将星级 4. 初始品质 let dicHero = gameData.hero.get(hid); if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND); @@ -336,6 +341,8 @@ export class HeroHandler { const serverId = session.get('serverId'); let { hid, isOneClick, canReplace = false } = msg; + if(isHeroHidden(hid)) return resResult(STATUS.HERO_IS_HIDDEN); + let hero = await HeroModel.findByHidAndRole(hid, roleId); if (!hero) return resResult(STATUS.HERO_NOT_FIND); @@ -387,6 +394,8 @@ export class HeroHandler { let sid: string = session.get('sid'); let { hid } = msg; + if(isHeroHidden(hid)) return resResult(STATUS.HERO_IS_HIDDEN); + let hero = await HeroModel.findByHidAndRole(hid, roleId); if (!hero) return resResult(STATUS.HERO_NOT_FIND); @@ -424,6 +433,7 @@ export class HeroHandler { let serverId: number = session.get('serverId'); let { hid, shipId, type } = msg; + if(isHeroHidden(hid)) return resResult(STATUS.HERO_IS_HIDDEN); let dicFriendShip = getFriendShipByIdAndLv(hid, shipId, 1); if(!dicFriendShip) return resResult(STATUS.DIC_DATA_NOT_FOUND); @@ -506,9 +516,12 @@ export class HeroHandler { let serverId: number = session.get('serverId'); let { id } = msg; + if(isGoodsHidden(id)) return resResult(STATUS.FASHION_IS_HIDDEN); let dicSkin = gameData.fashion.get(id); // console.log('*****', id, dicSkin) if (!dicSkin) return resResult(STATUS.HERO_SKIN_NOT_FIND); + if(isHeroHidden(dicSkin.actorId)) return resResult(STATUS.HERO_IS_HIDDEN); + let hero = await HeroModel.findByHidAndRole(dicSkin.actorId, roleId); if (!hero) return resResult(STATUS.HERO_NOT_FIND); @@ -637,11 +650,13 @@ export class HeroHandler { let serverId = session.get('serverId'); let { hid, id } = msg; - let hero = await HeroModel.findByHidAndRole(hid, roleId); - if(!hero) return resResult(STATUS.HERO_NOT_FIND); + if(isHeroHidden(hid)) return resResult(STATUS.HERO_IS_HIDDEN); let dicHeroTalent = gameData.heroTalent.get(id); - if(!dicHeroTalent) return resResult(STATUS.WRONG_PARMS); + if(!dicHeroTalent) return resResult(STATUS.DIC_DATA_NOT_FOUND); + + let hero = await HeroModel.findByHidAndRole(hid, roleId); + if(!hero) return resResult(STATUS.HERO_NOT_FIND); let skins = hero.skins||[]; let curSkin = skins.find(cur => cur.enable); @@ -676,6 +691,11 @@ export class HeroHandler { let serverId = session.get('serverId'); let { hid, id } = msg; + if(isHeroHidden(hid)) return resResult(STATUS.HERO_IS_HIDDEN); + + let dicHeroTalent = gameData.heroTalent.get(id); + if(!dicHeroTalent) return resResult(STATUS.DIC_DATA_NOT_FOUND); + let hero = await HeroModel.findByHidAndRole(hid, roleId); if(!hero) return resResult(STATUS.HERO_NOT_FIND); @@ -686,9 +706,6 @@ export class HeroHandler { let talent = curSkin.talent.find(cur => cur.id == id); if(!talent) return resResult(STATUS.TALENT_NOT_UNLOCKED); - let dicHeroTalent = gameData.heroTalent.get(id); - if(!dicHeroTalent) return resResult(STATUS.WRONG_PARMS); - let usedTalentPoint = curSkin.usedTalentPoint; let totalTalentPoint = gameData.talentPointOfJob.get(hero.job); let nextLv = dicHeroTalent.level.find(cur => cur.lv == talent.level + 1); @@ -712,6 +729,8 @@ export class HeroHandler { let serverId = session.get('serverId'); let { hid } = msg; + if(isHeroHidden(hid)) return resResult(STATUS.HERO_IS_HIDDEN); + let hero = await HeroModel.findByHidAndRole(hid, roleId); if(!hero) return resResult(STATUS.HERO_NOT_FIND); diff --git a/game-server/app/servers/role/handler/roleHandler.ts b/game-server/app/servers/role/handler/roleHandler.ts index 8c5e222a6..433cc1565 100644 --- a/game-server/app/servers/role/handler/roleHandler.ts +++ b/game-server/app/servers/role/handler/roleHandler.ts @@ -29,6 +29,7 @@ import { calculateCeWithHero, calculateCeWithRole } from '../../../services/play import { sendMessageToUserWithSuc } from '../../../services/pushService'; import { GuildLeader } from '../../../domain/rank'; import { checkPopUpCondition } from '../../../services/activity/popUpShopService'; +import { isGoodsHidden, isHeroHidden } from '../../../services/dataService'; export default function (app: Application) { new HandlerService(app, {}); @@ -200,6 +201,9 @@ export class RoleHandler { const serverId = session.get('serverId'); let { schoolId, positionId, hid } = msg; + + if(isHeroHidden(hid)) return resResult(STATUS.HERO_IS_HIDDEN); + if (!gameData.school.has(schoolId)) { return resResult(STATUS.DIC_DATA_NOT_FOUND); } @@ -289,12 +293,14 @@ export class RoleHandler { let { hid } = msg; - let hero = await HeroModel.findByHidAndRole(hid, roleId, 'hid lv star colorStar quality scrollId scrollActive scrollStar scrollColorStar scrollQuality connections attr ce'); - if (!hero) return resResult(STATUS.HERO_NOT_FIND); + if(isHeroHidden(hid)) return resResult(STATUS.HERO_IS_HIDDEN); let dicHero = gameData.hero.get(hid); if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND); + let hero = await HeroModel.findByHidAndRole(hid, roleId, 'hid lv star colorStar quality scrollId scrollActive scrollStar scrollColorStar scrollQuality connections attr ce'); + if (!hero) return resResult(STATUS.HERO_NOT_FIND); + let { star, colorStar, quality, scrollId, scrollActive, scrollStar, scrollColorStar, scrollQuality } = hero; let update = { @@ -338,6 +344,8 @@ export class RoleHandler { let roleId = session.get('roleId'); let serverId = session.get('serverId'); + if(isHeroHidden(...showLineup)) return resResult(STATUS.HERO_IS_HIDDEN); + let checkHeroes = await checkBattleHeroesByHid(roleId, showLineup); if (showLineup.length > 0 && !checkHeroes) return resResult(STATUS.BATTLE_HERO_NOT_FOUND); @@ -357,6 +365,9 @@ export class RoleHandler { let { id } = msg; let roleId = session.get('roleId'); let guildCode = session.get('guildCode'); + + if(isGoodsHidden(id)) return resResult(STATUS.ITEM_IS_HIDDEN); + let role = await RoleModel.findByRoleId(roleId, ROLE_SELECT.GET_HEADS); if (!role) return resResult(STATUS.ROLE_NOT_FOUND); @@ -386,6 +397,9 @@ export class RoleHandler { let { id } = msg; let roleId = session.get('roleId'); let guildCode = session.get('guildCode'); + + if(isGoodsHidden(id)) return resResult(STATUS.ITEM_IS_HIDDEN); + let role = await RoleModel.findByRoleId(roleId, ROLE_SELECT.GET_HEADS); if (!role) return resResult(STATUS.ROLE_NOT_FOUND); @@ -415,6 +429,9 @@ export class RoleHandler { let { id } = msg; let roleId = session.get('roleId'); let guildCode = session.get('guildCode'); + + if(isGoodsHidden(id)) return resResult(STATUS.ITEM_IS_HIDDEN); + let role = await RoleModel.findByRoleId(roleId, ROLE_SELECT.GET_HEADS); if (!role) return resResult(STATUS.ROLE_NOT_FOUND); diff --git a/game-server/app/servers/role/handler/shopHandler.ts b/game-server/app/servers/role/handler/shopHandler.ts index aaea014c7..e13a739d1 100644 --- a/game-server/app/servers/role/handler/shopHandler.ts +++ b/game-server/app/servers/role/handler/shopHandler.ts @@ -10,6 +10,7 @@ import { checkShopInPurchase, getShopDicById, getShopListByType, getShopPrice } import { RewardInter } from "../../../pubUtils/interface"; import { UserShopTypeModel } from "../../../db/UserShopType"; import { nowSeconds } from "../../../pubUtils/timeUtil"; +import { isGoodsHidden } from "../../../services/dataService"; export default function(app: Application) { return new ShopHandler(app); @@ -99,6 +100,7 @@ export class ShopHandler { let sid = session.get('sid'); let { goodsId, count } = msg; + if(isGoodsHidden(goodsId)) return resResult(STATUS.ITEM_IS_HIDDEN); let dicGoods = gameData.goods.get(goodsId); if(!dicGoods) return resResult(STATUS.DIC_DATA_NOT_FOUND); let dicItid = ITID.get(dicGoods.itid); diff --git a/game-server/app/servers/role/remote/roleRemote.ts b/game-server/app/servers/role/remote/roleRemote.ts index 900823a3d..2db526a4e 100644 --- a/game-server/app/servers/role/remote/roleRemote.ts +++ b/game-server/app/servers/role/remote/roleRemote.ts @@ -8,6 +8,7 @@ import { getServerMainten, setServerMainten, stopServerMainten } from '../../../ import { errlogger } from '../../../util/logger'; import { setApiIsClose } from '../../../services/chatService'; import { setPvpSeasonNum, setPvpSettleSeasonNum } from '../../../services/timeTaskService'; +import { setHiddenData } from '../../../services/dataService'; export default function (app: Application) { new HandlerService(app, {}); @@ -141,4 +142,12 @@ export class RoleRemote { errlogger.error(`remote ${__filename} \n ${e.stack}`); } } + + public async setHiddenData(heroes: number[], goods: number[], refTime: number) { + try { + setHiddenData(heroes, goods, refTime); + } catch(e) { + errlogger.error(`remote ${__filename} \n ${e.stack}`); + } + } } diff --git a/game-server/app/servers/systimer/remote/systimerRemote.ts b/game-server/app/servers/systimer/remote/systimerRemote.ts index 464ba285d..fb069aad1 100644 --- a/game-server/app/servers/systimer/remote/systimerRemote.ts +++ b/game-server/app/servers/systimer/remote/systimerRemote.ts @@ -17,6 +17,7 @@ import { ServerMailType } from '../../../db/ServerMail'; import { ActivityModelType } from '../../../db/Activity'; import { GUILD_ACTIVITY_TYPE, LADDER_STATUS } from '../../../consts'; import { setApiIsClose } from '../../../services/chatService'; +import { setHiddenData } from '../../../services/dataService'; export default function (app: Application) { return new SystimerRemote(app); @@ -232,4 +233,13 @@ export class SystimerRemote { errlogger.error(`remote ${__filename} \n ${e.stack}`); } } + + public async setHiddenData(heroes: number[], goods: number[], refTime: number) { + try { + setHiddenData(heroes, goods, refTime); + } catch(e) { + errlogger.error(`remote ${__filename} \n ${e.stack}`); + } + } + } diff --git a/game-server/app/services/activity/gachaService.ts b/game-server/app/services/activity/gachaService.ts index 146c15d74..78aff8578 100644 --- a/game-server/app/services/activity/gachaService.ts +++ b/game-server/app/services/activity/gachaService.ts @@ -12,6 +12,7 @@ import { getActivityById } from "./activityService"; import { transPiece } from "../role/util"; import { getRoleCreateTime, getServerCreateTime } from "../redisService"; import { SimpleResult, GuideGachaData } from "../../domain/activityField/guideGachaField"; +import { isGoodsHidden, isHeroHidden } from "../dataService"; /** * 获取招募列表 @@ -211,7 +212,17 @@ export class GachaResults { } private getRandomDetail(planId: number) { - let details = gameData.gachaPlan.get(planId)||[] + let details = (gameData.gachaPlan.get(planId)||[]).filter(detail => { + switch(detail.type) { + case GACHA_PLAN_TYPE.HERO: + return !isHeroHidden(detail.content); + case GACHA_PLAN_TYPE.ITEM: + return !isGoodsHidden(detail.content); + case GACHA_PLAN_TYPE.ASSIGN_HERO: + case GACHA_PLAN_TYPE.ASSIGN_ITEM: + return true; + } + }); let { dic } = getRandEelmWithWeight(details); return dic } diff --git a/game-server/app/services/activity/giftPackageService.ts b/game-server/app/services/activity/giftPackageService.ts index 333ee22b9..b295f3715 100644 --- a/game-server/app/services/activity/giftPackageService.ts +++ b/game-server/app/services/activity/giftPackageService.ts @@ -11,6 +11,7 @@ import { GuildModel } from '../../db/Guild'; import { pushGuildInfoUpdate } from '../guildService'; import { combineItems } from '../role/util'; import { recordGuildFund } from './timeLimitRankService'; +import { filterGoods, isGoodsHidden, isHeroHidden } from '../dataService'; @@ -53,8 +54,8 @@ export async function useGiftPackage(roleId: string, roleName: string, sid: stri if (selected.length != count) { break; } - let selectedReward = getSelectedReward(giftPackageData, selected) - let allReward = []; + let selectedReward = getSelectedReward(giftPackageData.reward, selected) + let allReward: { type: number, id: number, count: number }[] = []; if (giftCount > 1) { for (let obj of selectedReward) { allReward.push({ type: obj.type, id: obj.id, count: obj.count * giftCount }) @@ -62,17 +63,23 @@ export async function useGiftPackage(roleId: string, roleName: string, sid: stri } else { allReward = selectedReward; } + let gids = allReward.filter(cur => cur.type == 2).map(cur => cur.id); + if(gids.length > 0 && isGoodsHidden(...gids)) return resResult(STATUS.ITEM_IS_HIDDEN); + let hids = allReward.filter(cur => cur.type == 1).map(cur => cur.id); + if(hids.length > 0 && isHeroHidden(...gids)) return resResult(STATUS.HERO_IS_HIDDEN); + result = await addReward(roleId, roleName, sid, serverId, allReward, ITEM_CHANGE_REASON.USE_GIFT_PACKAGE); break; } case GIFT_PACKAGE_TYPE.RANDOM_X://随机 { let count = giftPackageData.count;//随机个数 - let allReward = []; + let pool = giftPackageData.reward.filter(cur => cur.type == 1? !isHeroHidden(cur.id): !isGoodsHidden(cur.id)); + let allReward: { type: number, id: number, count: number }[] = []; for (let i = 0; i < giftCount; i++) { - let selectedArray = randomSelectedData(giftPackageData.reward.length, count); - let selectedReward = getSelectedReward(giftPackageData, selectedArray) - allReward = allReward.concat(selectedReward); + let selectedArray = randomSelectedData(pool.length, count); + let selectedReward = getSelectedReward(pool, selectedArray) + allReward.push(...selectedReward); } result = await addReward(roleId, roleName, sid, serverId, allReward, ITEM_CHANGE_REASON.USE_GIFT_PACKAGE); break; @@ -137,14 +144,14 @@ export function rewardItemData(reward: Array) { return { goods, heroes } } -export function getSelectedReward(giftData: DicGiftPackage, selected: Array): Array { - console.log('bbbbbbbbbbbbbbbbbbb', JSON.stringify(selected), JSON.stringify(giftData)) +export function getSelectedReward(reward: RewardParam[], selected: Array): Array { + console.log('bbbbbbbbbbbbbbbbbbb', JSON.stringify(selected), JSON.stringify(reward)) let selectedReward: Array = []; for (let i = 0; i < selected.length; i++) { let index = selected[i]; - if (giftData.reward.length > index) { - selectedReward.push(giftData.reward[index]); + if (reward.length > index) { + selectedReward.push(reward[index]); } } return selectedReward; diff --git a/game-server/app/services/auctionService.ts b/game-server/app/services/auctionService.ts index 35334dfca..018465fd6 100644 --- a/game-server/app/services/auctionService.ts +++ b/game-server/app/services/auctionService.ts @@ -1,7 +1,7 @@ import { DividendModel } from './../db/Dividend'; import { LOT_CODE_LEN, AUCTION_STAGE, AUCTION_TIME, DIVIDEND_CODE_LEN, DIVIDEND_STATUS, LOT_STATUS, MAIL_TYPE, CURRENCY_BY_TYPE, CURRENCY_TYPE, ROLE_RECEIVE_STATUS, AUCTION_BID_STATUS, DEBUG_MAGIC_WORD, AUCTION_SOURCE, TA_EVENT, getAuctionSourceTypeName, PUSH_ROUTE, GUILD_JOB } from './../consts'; import { DividendRec, } from "../domain/dbGeneral"; -import { genCode, getRandSingleEelm } from '../pubUtils/util'; +import { genCode, getRandEelmWithWeight, getRandSingleEelm } from '../pubUtils/util'; import Lot, { LotModel, LotParam, LotType } from '../db/Lot'; import { getCurDay, getSeconds, getTimeFunD, getTimeFunM, nowSeconds } from '../pubUtils/timeUtil'; import { gameData, getGoodById } from '../pubUtils/data'; @@ -19,6 +19,7 @@ import { isDebugTime } from '../pubUtils/sdkUtil'; import { pick } from 'underscore'; import { AuctionRewardInter } from '../domain/battleField/auction'; import { CounterLotsModel } from '../db/CounterAuction'; +import { isGoodsHidden } from './dataService'; // ! 获取底价,假数据 export function getBasePrice(gid: number, count: number) { @@ -568,4 +569,50 @@ export function processSingleLotFormat(lot: LotType) { export function processLotsFormat(lots: LotType[]) { return lots.map(processSingleLotFormat); +} + +/** + * 根据军团活动排名获得奖励 + * @param aid 活动id + * @param rank 排名 + */ + function getGuildAuction(aid: number, rank: number, struLv: number, cityId: number = 0) { + let ranksReward = gameData.guildAuction.get(`${aid}_${struLv}_${cityId}`) || []; + return ranksReward.find(cur => { + return rank >= cur.min && (rank <= cur.max || cur.max == 0); + }); +} + +export function getGuildAuctionBasicNum(aid: number, rank: number, struLv: number, cityId: number = 0) { + let dic = getGuildAuction(aid, rank, struLv, cityId); + return dic?.basicDividend||0; +} + +export function getGuildAuctionRewards(aid: number, rank: number, struLv: number, cityId: number = 0) { + let dic = getGuildAuction(aid, rank, struLv, cityId); + if(dic) { + return getAuctionRewardByPoolId(dic.rewards); + } else { + return new Map(); + } +} + +export function getAuctionRewardByPoolId(poolId: number) { + let pools = gameData.auctionPool.get(poolId); + let rewards: Map = new Map(); + for(let { count, basicPool } of pools) { + let { rewardBasicPool, basePrice, maxPrice, sort } = basicPool + for(let i = 0; i < count; i++) { + let result = getRandEelmWithWeight(rewardBasicPool); + if(result && result.dic) { + let { id, count } = result.dic; + if(isGoodsHidden(id)) continue; + if(!rewards.has(id)) { + rewards.set(id, []); + } + rewards.get(id).push({ goods: {id, count}, basePrice, maxPrice, sort }); + } + } + } + return rewards; } \ No newline at end of file diff --git a/game-server/app/services/connectorService.ts b/game-server/app/services/connectorService.ts index a313a8fdb..9ed8839d6 100644 --- a/game-server/app/services/connectorService.ts +++ b/game-server/app/services/connectorService.ts @@ -49,6 +49,7 @@ import { INFO_WINDOW } from '../pubUtils/dicParam'; import { getLadderData } from './ladderService'; import { dispatch } from '../pubUtils/dispatcher'; import { PvpDataReturn } from '../domain/battleField/pvp'; +import { getHiddenData } from './dataService'; /** * init: 初始的时候是否推送 true-推 false-不推 @@ -83,6 +84,7 @@ const modules = [ { id: 25, type: 'shop', init: false, refresh: true, guild: false }, { id: 26, type: 'survey', init: false, refresh: true, guild: false }, { id: 27, type: 'ladder', init: false, refresh: true, guild: false }, + { id: 28, type: 'hiddenData', init: true, refresh: true, guild: false }, ] export async function pushData(hasInit: boolean, role: RoleType, session: FrontendOrBackendSession, pushType: 'entry' | 'refresh' = 'entry') { @@ -212,6 +214,8 @@ export async function getModuleData(type: string, data: { role: RoleType, sessio return await getSurvey(role.roleId, role.lv); case 'ladder': return await getLadderData(role.roleId, false); + case 'hiddenData': + return getHiddenData(); default: return null; } diff --git a/game-server/app/services/dataService.ts b/game-server/app/services/dataService.ts new file mode 100644 index 000000000..3269e6aa5 --- /dev/null +++ b/game-server/app/services/dataService.ts @@ -0,0 +1,96 @@ +import { pinus } from 'pinus'; +import { isEqual } from 'underscore'; +import { ITEM_CHANGE_REASON, PUSH_ROUTE } from '../consts'; +import { HiddenDataModelType } from '../db/HiddenData'; +import { sendMessageToAllServersWithSuc } from './pushService'; +import { itemLogger } from '../util/logger'; + +export function setHiddenData(heroes: number[], goods: number[], refTime: number) { + pinus.app.set('hiddenHeroees', heroes||[]); + pinus.app.set('hiddenGoods', goods||[]); + pinus.app.set('hiddenRefTime', refTime||0); +} + +export async function setHiddenDataToMemory(data: HiddenDataModelType, nextData: HiddenDataModelType) { + let heroes = data?.heroes??[]; + let goods = data?.goods??[]; + let refTime = nextData?.refTime||0; + sendUpdateMessage(getHiddenData(), heroes, goods, refTime); + pinus.app.rpc.activity.activityRemote.setHiddenData.broadcast(heroes, goods, refTime); + pinus.app.rpc.battle.battleRemote.setHiddenData.broadcast(heroes, goods, refTime); + pinus.app.rpc.chat.chatRemote.setHiddenData.broadcast(heroes, goods, refTime); + pinus.app.rpc.connector.connectorRemote.setHiddenData.broadcast(heroes, goods, refTime); + pinus.app.rpc.guild.guildRemote.setHiddenData.broadcast(heroes, goods, refTime); + pinus.app.rpc.order.orderRemote.setHiddenData.broadcast(heroes, goods, refTime); + pinus.app.rpc.role.roleRemote.setHiddenData.broadcast(heroes, goods, refTime); + if(pinus.app.getServerType() != 'gm') { + pinus.app.rpc.gm.gmRemote.setHiddenData.broadcast(heroes, goods, refTime); + } + if(pinus.app.getServerType() != 'systimer') { + pinus.app.rpc.systimer.systimerRemote.setHiddenData.broadcast(heroes, goods, refTime); + } + setHiddenData(heroes, goods, refTime); +} + +async function sendUpdateMessage(origin: {heroes: number[], items: number[], refTime: number}, heroes: number[], goods: number[], refTime: number) { + console.log('##### sendUpdateMessage', origin.refTime, refTime, origin.heroes, heroes, origin.items, goods) + if(origin.refTime != refTime || !isEqual(origin.heroes, heroes) || !isEqual(origin.items, goods)) { + console.log('******'); + await sendMessageToAllServersWithSuc(PUSH_ROUTE.HIDDEN_DATA, { heroes, items: goods, refTime }); + } +} + +export function getHiddenData() { + let heroes: number[] = pinus.app.get('hiddenHeroees')||[]; + let goods: number[] = pinus.app.get('hiddenGoods')||[]; + let refTime = pinus.app.get('hiddenRefTime')||0; + return { + refTime, heroes, items: goods + } +} + +export function filterHeroes(arr: T[], cb?: (obj: T) => number, roleId?: string) { + return arr.filter(obj => { + let hid = cb? cb(obj): (typeof obj == 'number'? obj: 0); + let { heroes } = getHiddenData(); + if(heroes.indexOf(hid) != -1) { + if(roleId) itemLogger.error(`玩家 ${roleId} 的武将 ${hid} 未获得`); + return false; + } + return true; + }); +} + +export function filterGoods(arr: T[], cb?: (obj: T) => number, roleId?: string, reason?: ITEM_CHANGE_REASON) { + return arr.filter(obj => { + let gid = cb? cb(obj): (typeof obj == 'number'? obj: 0); + let { items } = getHiddenData(); + if(items.indexOf(gid) != -1) { + if(roleId) itemLogger.error(`玩家 ${roleId} 的道具 ${gid} 未获得 (${reason})`); + return false; + } + return true; + }); +} + +export function isHeroHidden(...hids: number[]) { + for(let hid of hids) { + let { heroes } = getHiddenData(); + if(heroes.indexOf(hid) != -1) { + itemLogger.error(`武将 ${hid} 被拦截`); + return true; + } + } + return false; +} + +export function isGoodsHidden(...gids: number[]) { + for(let gid of gids) { + let { items } = getHiddenData(); + if(items.indexOf(gid) != -1) { + itemLogger.error(`道具 ${gid} 被拦截`); + return true; + } + } + return false; +} \ No newline at end of file diff --git a/game-server/app/services/gmService.ts b/game-server/app/services/gmService.ts index 85048f1ff..443f8bc48 100644 --- a/game-server/app/services/gmService.ts +++ b/game-server/app/services/gmService.ts @@ -37,6 +37,9 @@ import { gameData } from "../pubUtils/data"; import { GuildModel } from "../db/Guild"; import { GuildTrainModel } from "../db/GuildTrain"; import { unlockTrain } from "./guildTrainService"; +import { HiddenDataModel, HiddenDataModelType } from "../db/HiddenData"; +import { HiddenDataByIdModel } from "../db/HiddenDataById"; +import moment = require("moment"); // —————————————— 跑马灯 —————————————— // // 初始 @@ -388,4 +391,27 @@ export async function setTrainLv(guildCode: string, trainLv: string) { await unlockTrain(guildCode, trainId); } } +} + +export async function calHiddenData(uid: number) { + let result = await HiddenDataByIdModel.findAllData(); + console.log('####', JSON.stringify(result)) + let heroes: number[] = [], goods: number[] = []; + await HiddenDataModel.clearData(); + for(let { _id, ids } of result) { + await HiddenDataModel.updateHiddenData(_id, heroes, goods, uid); + for(let {type, id} of ids) { + if(type == 1) heroes.push(id); + if(type == 2) goods.push(id); + } + } + await HiddenDataModel.updateHiddenData(getPastTime(), heroes, goods, uid); +} + +export function getPastTime() { + return moment('2022-01-01').unix(); +} + +export function getFutureTime() { + return moment('2100-01-01').unix(); } \ No newline at end of file diff --git a/game-server/app/services/guildActivity/guildActivityService.ts b/game-server/app/services/guildActivity/guildActivityService.ts index cc8148f92..9918f17c4 100644 --- a/game-server/app/services/guildActivity/guildActivityService.ts +++ b/game-server/app/services/guildActivity/guildActivityService.ts @@ -1,7 +1,7 @@ import { ServerlistModel, ServerlistType } from "../../db/Serverlist"; import { RoleModel } from "../../db/Role"; import { GUILDACTIVITY } from "../../pubUtils/dicParam"; -import { gameData, getGuildAuctionRewards, getCityActivityRewards, getGuildAuctionBasicNum } from "../../pubUtils/data"; +import { gameData, getCityActivityRewards } from "../../pubUtils/data"; import { getCurDay, nowSeconds, getTimeFun, getZeroPoint } from "../../pubUtils/timeUtil"; import { GUILD_ACTIVITY_STATUS, GET_POINT_WAYS, GUILD_ACTIVITY_TYPE, REDIS_KEY, AUCTION_SOURCE, MAIL_TYPE, CITY_STATUS, DEBUG_MAGIC_WORD, GUILD_POINT_WAYS, TASK_TYPE, AUCTION_TIME, CITY_ACTIVITY_DOOR, ABI_TYPE, PUSH_ROUTE, RACE_ACTIVITY_STATUS, SHOP_REFRESH_TYPE, COUNTER, RACE_EVENT_TYPE } from "../../consts"; import { Record, UserGuildActivityRecModel } from "../../db/UserGuildActivityRec"; @@ -11,7 +11,7 @@ import { getAllServers, getRoleOnlineInfo } from "../redisService"; import { SimpleGuildRankParam, SimpleRoleRankParam, GuildRankInfo, RoleRankInfo } from "../../domain/rank"; import { pinus } from "pinus"; import { GuildActivityRecordModel } from "../../db/GuildActivityRec"; -import { genAuction, getRewardToDbFromMap, guildAuctionPreview } from "../auctionService"; +import { genAuction, getGuildAuctionBasicNum, getGuildAuctionRewards, getRewardToDbFromMap, guildAuctionPreview } from "../auctionService"; import { sendMailByContent } from "../mailService"; import { GuildActivityCityType, GuildActivityCityModel } from "../../db/GuildActivityCity"; import { DicCityActivity } from "../../pubUtils/dictionary/DicCityActivity"; diff --git a/game-server/app/services/guildBossService.ts b/game-server/app/services/guildBossService.ts index 98b32b108..092d9a810 100644 --- a/game-server/app/services/guildBossService.ts +++ b/game-server/app/services/guildBossService.ts @@ -6,7 +6,7 @@ import { pinus } from 'pinus'; import { STATUS } from '../consts/statusCode'; import { resResult, shouldRefresh } from '../pubUtils/util'; import { BattleRecordModel } from '../db/BattleRecord'; -import { getArmyBossRank, gameData, getAuctionRewardByPoolId } from '../pubUtils/data'; +import { getArmyBossRank, gameData } from '../pubUtils/data'; import { sendMailToGuildByContent } from '../services/mailService'; import { MAIL_TYPE, AUCTION_SOURCE, ABI_TYPE, PUSH_ROUTE } from '../consts'; import { GUILD_BOSS_STATUS } from '../consts/constModules/guildConst'; diff --git a/game-server/app/services/pushService.ts b/game-server/app/services/pushService.ts index 296909700..ff418c8dd 100644 --- a/game-server/app/services/pushService.ts +++ b/game-server/app/services/pushService.ts @@ -2,7 +2,7 @@ import { Channel, pinus } from "pinus"; import { CHANNEL_PREFIX, PUSH_BATCH, PUSH_INTERVAL, PUSH_ROUTE, STATUS } from "../consts"; import { genCode, resResult } from "../pubUtils/util"; import { getCityChannelSid, getGuildChannelSid, getWorldChannelSid, groupRoomId, getGroupShopSid } from "./chatService"; -import { getAllOnlineRoles, getRoleOnlineInfo } from "./redisService"; +import { getAllOnlineRoles, getAllServers, getRoleOnlineInfo } from "./redisService"; import { errlogger, infologger } from '../util/logger'; import { MsgEncrypt } from "../pubUtils/sysUtil"; import { isSkipEncode } from "../pubUtils/sdkUtil"; @@ -34,6 +34,13 @@ export async function sendMessageToAll(route: string, data: any, filterCb?: ({ l }, PUSH_INTERVAL); } +export async function sendMessageToAllServersWithSuc(route: string, data: any) { + let servers = await getAllServers(); + for(let serverId of servers) { + await sendMessageToServerWithSuc(serverId, route, data); + } +} + export async function sendMessageToServerWithSuc(serverId: number, route: string, data: any, isBatch = false) { await sendMessageToServer(serverId, route, resResult(STATUS.SUCCESS, data), isBatch); } diff --git a/game-server/app/services/redisService.ts b/game-server/app/services/redisService.ts index b1a971148..65ee615b0 100644 --- a/game-server/app/services/redisService.ts +++ b/game-server/app/services/redisService.ts @@ -513,10 +513,12 @@ async function setServerList() { await redisClient().delAsync(REDIS_KEY.SERVER); await redisClient().delAsync(REDIS_KEY.SERVER_OPEN_TIME); - for(let { id, name, openTime } of serverList) { - // console.log(roleId); - await redisClient().hsetAsync(REDIS_KEY.SERVER, `${id}`, `${name}`); - await redisClient().hsetAsync(REDIS_KEY.SERVER_OPEN_TIME, `${id}`, `${openTime}`); + for(let { id, name, openTime, env } of serverList) { + if(env == pinus.app.get('env')) { + // console.log(roleId); + await redisClient().hsetAsync(REDIS_KEY.SERVER, `${id}`, `${name}`); + await redisClient().hsetAsync(REDIS_KEY.SERVER_OPEN_TIME, `${id}`, `${openTime}`); + } } } diff --git a/game-server/app/services/role/createHero.ts b/game-server/app/services/role/createHero.ts index 0c374ca9f..8754e06dc 100644 --- a/game-server/app/services/role/createHero.ts +++ b/game-server/app/services/role/createHero.ts @@ -14,7 +14,7 @@ import { calculateCes } from "../playerCeService"; import { RoleModel, RoleType, RoleUpdate } from "../../db/Role"; import { sendMessageToUserWithSuc } from "../pushService"; import { checkTaskInCreateHero } from "../task/taskService"; -import { Rank } from "../rankService"; +import { filterHeroes } from "../dataService"; /** * 创建多个武将 @@ -24,6 +24,7 @@ import { Rank } from "../rankService"; * @param heroInfo */ export async function createHeroes(roleId: string, roleName: string, sid: string, serverId: number, heroInfo: CreateHeroParam[], initRoleInfos?: RoleUpdate) { + heroInfo = filterHeroes(heroInfo, obj => obj.hid, roleId); let hids = heroInfo.map(cur => cur.hid); let userHeroesMap = await HeroModel.findMapByHidRange(hids, roleId); diff --git a/game-server/app/services/role/rewardService.ts b/game-server/app/services/role/rewardService.ts index 33ca87f57..d28d4dfa0 100644 --- a/game-server/app/services/role/rewardService.ts +++ b/game-server/app/services/role/rewardService.ts @@ -26,6 +26,7 @@ import { combineItems, getCoinEventProperties, getGoldEventProperties, sortItems import { nowSeconds } from '../../pubUtils/timeUtil'; import { calculateCeWithHero, calculateCeWithRole } from '../playerCeService'; import { sendMessageToUsersWithSuc, sendMessageToUserWithSuc } from '../pushService'; +import { filterGoods } from '../dataService'; @@ -113,6 +114,7 @@ export async function handleCost(roleId: string, sid: string, goods: Array, reason: ITEM_CHANGE_REASON) { + goods = filterGoods(goods, obj => obj.id, roleId, reason); let { items, jewels, gold, coin, ap, skins, figures } = sortItems(goods, HANDLE_REWARD_TYPE.RECEIVE); let showItems: { id: number, seqId?: number, count: number, isBag?: boolean }[] = []; let role = await RoleModel.findByRoleId(roleId); @@ -494,11 +496,12 @@ export function getHonourObject(count: number) { */ export function unlockFigureWithoutSave(conditions: { type: number, paramHid?: number, paramFavourLv?: number, paramSkinId?: number, paramWinStreakNum?: number }[], role: RoleType) { - let { heads, frames, spines } = role; + let { heads, frames, spines, roleId } = role; let figureInfo = { heads: new Array
(), frames: new Array
(), spines: new Array
() }; for (let { type, paramHid, paramFavourLv, paramSkinId, paramWinStreakNum } of conditions) { let canUnLockList = gameData.figureCondition.get(type); if (canUnLockList) { + canUnLockList = filterGoods(canUnLockList, obj => obj.gid, roleId, ITEM_CHANGE_REASON.GET_HERO_UNLOCK_FIGURE); let reason = 0; for (let { id, params, gid } of canUnLockList) { diff --git a/game-server/app/services/shopService.ts b/game-server/app/services/shopService.ts index 055c0c747..22a08335c 100644 --- a/game-server/app/services/shopService.ts +++ b/game-server/app/services/shopService.ts @@ -13,6 +13,7 @@ import { BackendSession, pinus } from "pinus"; import { ActivityModelType } from "../db/Activity"; import { addItems } from "./role/rewardService"; import { LadderMatchModel } from "../db/LadderMatch"; +import { isGoodsHidden } from "./dataService"; export async function getAllShopList(roleId: string, serverId: number) { let seasonNum = pinus.app.get('pvpSeasonNum'); @@ -178,6 +179,9 @@ export async function checkShopItemCanBuy(activityId: number, shopItemId: number } } } + if(isGoodsHidden(dicShopItem.goodId)) { + return STATUS.ITEM_IS_HIDDEN; + } return STATUS.SUCCESS } diff --git a/game-server/app/services/timeTaskService.ts b/game-server/app/services/timeTaskService.ts index 2be218067..d96abf9e3 100644 --- a/game-server/app/services/timeTaskService.ts +++ b/game-server/app/services/timeTaskService.ts @@ -15,7 +15,6 @@ import { DicGuildActivity } from '../pubUtils/dictionary/DicGuildActivity'; import { dispatch } from '../pubUtils/dispatcher'; import { createNewServer, initMarquee, setServerMainten } from './gmService'; import moment = require('moment'); -import { CounterModel } from '../db/Counter'; import { reportOneOnline } from './authenticateService'; import { LADDER, PVP } from '../pubUtils/dicParam'; import { fetch37Words } from './sdkService'; @@ -32,7 +31,7 @@ import { ActivityModel, ActivityModelType } from '../db/Activity'; import { TimeLimitRankData } from '../domain/activityField/timeLimitRankField'; import { sendRankMail, takeSnapshot } from './activity/timeLimitRankService'; import { ActivityGroupModel } from '../db/ActivityGroup'; -import { sendMessageToGroupShopWithSuc, sendMessageToServer } from './pushService'; +import { sendMessageToServer } from './pushService'; import { resResult } from '../pubUtils/util'; import { checkPopUpConditionWhenGuildActivityEnd } from './activity/popUpShopService'; import { pushRefreshTime } from './connectorService'; @@ -41,6 +40,8 @@ import { ladderTimeout, ladderTimeWillout, sendLadderDailyReward } from './ladde import { LadderMatchRecModel } from '../db/LadderMatchRec'; import { LadderMatchModel } from '../db/LadderMatch'; import { getGroupShopTimers, refundGroupShop, setGroupShopToSetSum } from './activity/groupShopService'; +import { HiddenDataModel, HiddenDataModelType } from '../db/HiddenData'; +import { setHiddenData, setHiddenDataToMemory } from './dataService'; const PER_SECOND = 1 * 1000; const PER_DAY = 24 * 60 * 60; @@ -102,6 +103,9 @@ export async function init() { // 团购定时器 initGroupShopSchedule(); + + // 隐藏数据定时器 + initHiddenDataSchedule(true); } // 每日刷新 @@ -854,4 +858,35 @@ export async function initSumSchedule() { } } -// —————————————— 团购定时器 end —————————————— // \ No newline at end of file +// —————————————— 团购定时器 end —————————————— // + +// —————————————— 配表兼容 start —————————————— // +let hiddenDataJob: Job; +export async function initHiddenData(data?: HiddenDataModelType, nextData?: HiddenDataModelType) { + let now = nowSeconds(); + if(!data) data = await HiddenDataModel.findCurData(now); + if(!nextData) nextData = await HiddenDataModel.findNextData(now); + setHiddenData(data?.heroes, data?.goods, nextData?.refTime); +} + +export async function initHiddenDataSchedule(isInit: boolean, data?: HiddenDataModelType) { + if(hiddenDataJob) hiddenDataJob.cancel(); + let now = nowSeconds(); + if(!data) data = await HiddenDataModel.findCurData(now); + let nextData = await HiddenDataModel.findNextData(data?.refTime??now); + + if(isInit) { + await initHiddenData(data, nextData) + } else { + await setHiddenDataToMemory(data, nextData); + } + console.log('######## initHiddenDataSchedule', nextData); + if(nextData) { + scheduleJob(`hiddenData`, nextData.refTime * 1000, async () => { + console.log('######## hiddenDataSchedule', nextData); + + await initHiddenDataSchedule(false, nextData); + }); + } +} +// —————————————— 配表兼容 end —————————————— // \ No newline at end of file diff --git a/game-server/app/util/logger.ts b/game-server/app/util/logger.ts index 92090bdcd..6a249d064 100644 --- a/game-server/app/util/logger.ts +++ b/game-server/app/util/logger.ts @@ -4,17 +4,20 @@ let logger: Logger; let infologger: Logger; let errlogger: Logger; let taLogger: Logger; +let itemLogger: Logger; export function loadLogger(sid: string) { logger = getLogger(); infologger = getLogger('info', sid); errlogger = getLogger('err', sid); taLogger = getLogger('ta'); + itemLogger = getLogger('item'); } export { logger, infologger, errlogger, - taLogger + taLogger, + itemLogger } \ No newline at end of file diff --git a/game-server/config/alpha/log4js.ts b/game-server/config/alpha/log4js.ts index 04e5d9369..db25024c3 100644 --- a/game-server/config/alpha/log4js.ts +++ b/game-server/config/alpha/log4js.ts @@ -113,6 +113,17 @@ module.exports = { 'pattern': '%m', }, 'backups': 240, + }, + 'item': { + 'type': 'file', + 'filename': '/zyz_logs/item/log', + 'pattern': 'yyyy-MM-dd-hh', + 'alwaysIncludePattern': true, + 'layout': { + 'type': 'pattern', + 'pattern': '%m', + }, + 'backups': 240, } }, @@ -168,6 +179,10 @@ module.exports = { 'ta': { 'appenders': ['console', 'ta'], 'level': 'info' + }, + 'item': { + 'appenders': ['console', 'item'], + 'level': 'info' } }, 'replaceConsole': true, diff --git a/game-server/config/dev/log4js.ts b/game-server/config/dev/log4js.ts index 04e5d9369..db25024c3 100644 --- a/game-server/config/dev/log4js.ts +++ b/game-server/config/dev/log4js.ts @@ -113,6 +113,17 @@ module.exports = { 'pattern': '%m', }, 'backups': 240, + }, + 'item': { + 'type': 'file', + 'filename': '/zyz_logs/item/log', + 'pattern': 'yyyy-MM-dd-hh', + 'alwaysIncludePattern': true, + 'layout': { + 'type': 'pattern', + 'pattern': '%m', + }, + 'backups': 240, } }, @@ -168,6 +179,10 @@ module.exports = { 'ta': { 'appenders': ['console', 'ta'], 'level': 'info' + }, + 'item': { + 'appenders': ['console', 'item'], + 'level': 'info' } }, 'replaceConsole': true, diff --git a/game-server/config/servers.ts b/game-server/config/servers.ts index afb9b626d..648e7d085 100644 --- a/game-server/config/servers.ts +++ b/game-server/config/servers.ts @@ -151,6 +151,7 @@ module.exports = { { 'id': 'guild-server-1', 'host': '172.26.145.161', 'port': 6057, "args": " --inspect=9239" }, ], 'activity': [ + { 'id': 'activity-server-1', 'host': '172.26.145.161', 'port': 6059, "args": " --inspect=9241" }, ], 'order': [ { 'id': 'order-server-1', 'host': '172.26.145.161', 'port': 6060, "args": " --inspect=9242" }, @@ -286,7 +287,6 @@ module.exports = { { 'id': 'guild-server-3', 'host': '172.26.145.171', 'port': 6071 }, ], 'activity': [ - { 'id': 'activity-server-1', 'host': '172.26.145.171', 'port': 6059, "args": " --inspect=9241" }, ], }, 'sq1': { diff --git a/gm-server/app/controller/game.ts b/gm-server/app/controller/game.ts index 17a911360..51e0e6c0c 100644 --- a/gm-server/app/controller/game.ts +++ b/gm-server/app/controller/game.ts @@ -201,4 +201,18 @@ export default class GameController extends Controller { ctx.body = await ctx.service.game.getPvpConfig(page, pageSize, sortField, sortOrder); return } + + public async getHiddenData() { + const { ctx } = this; + const { page, pageSize, sortField, sortOrder, form } = ctx.request.body; + ctx.body = await ctx.service.game.getHiddenData(page, pageSize, sortField, sortOrder, form); + return + } + + public async getExistHiddenData() { + const { ctx } = this; + const { type } = ctx.request.body; + ctx.body = await ctx.service.game.getExistHiddenData(type); + return + } } diff --git a/gm-server/app/router.ts b/gm-server/app/router.ts index 67b21758c..92b010227 100644 --- a/gm-server/app/router.ts +++ b/gm-server/app/router.ts @@ -57,6 +57,8 @@ export default (app: Application) => { router.post('/api/game/getsurveylist', tokenParser, controller.game.getSurveylist); router.post('/api/game/getchannelinfo', controller.game.getChannelInfo); router.post('/api/game/updatechannel', controller.game.updateChannel); + router.post('/api/game/gethiddendata', controller.game.getHiddenData); + router.post('/api/game/getexisthiddendata', controller.game.getExistHiddenData); router.post('/api/dic/getdicgoods', tokenParser, controller.game.getDicGoods); router.post('/api/dic/getdichero', tokenParser, controller.game.getDicHero); diff --git a/gm-server/app/service/Game.ts b/gm-server/app/service/Game.ts index 37bb12813..1f63f142b 100644 --- a/gm-server/app/service/Game.ts +++ b/gm-server/app/service/Game.ts @@ -22,6 +22,7 @@ import { SurveyModel } from '@db/Survery'; import { RedisClient } from 'redis'; import { ChannelInfoModel } from '@db/ChannelInfo'; import { PVPConfigModel } from '@db/PvpConfig'; +import { HiddenDataByIdModel } from '@db/HiddenDataById'; /** * Test Service @@ -324,4 +325,26 @@ export default class Game extends Service { list, total }); } + + public async getHiddenData(page: number, pageSize: number, sortField: string, sortOrder: string, form: any) { + const { ctx } = this; + + const list = await HiddenDataByIdModel.findByCondition(page, pageSize, sortField, sortOrder, form); + const total = await HiddenDataByIdModel.countByCondition(form); + return ctx.service.utils.resResult(STATUS.SUCCESS, { + list: list.map(cur => { + return { ...cur, env: this.app.config.realEnv } + }), total + }); + } + + public async getExistHiddenData(type: number) { + const { ctx } = this; + let datas = await HiddenDataByIdModel.findExistData(type); + let existIds = datas.map(cur => cur.id); + + return ctx.service.utils.resResult(STATUS.SUCCESS, { + ids: existIds + }); + } } diff --git a/shared/consts/constModules/chatConst.ts b/shared/consts/constModules/chatConst.ts index 21dfaf914..a2bd06988 100644 --- a/shared/consts/constModules/chatConst.ts +++ b/shared/consts/constModules/chatConst.ts @@ -166,4 +166,5 @@ export const PUSH_ROUTE = { LADDER_BATTLE_STOP: 'onLadderBattleStop', LADDER_RANK_UPDATE: 'onLadderRankUpdate', GROUP_SHOP_UPDATE: 'onGroupShopUpdate', + HIDDEN_DATA: 'onHiddenData', } \ No newline at end of file diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index 1b3c7f12c..8212c53e8 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -51,7 +51,8 @@ export const COUNTER = { REGION: { name: 'region', def: 1 }, GATE_ACTIVITY: { name: 'guildAct', def: 1 }, CITY_ACTIVITY: { name: 'cityAct', def: 1 }, - RACE_ACTIVITY: { name: 'raceAct', def: 1 } + RACE_ACTIVITY: { name: 'raceAct', def: 1 }, + HIDDEN_DATA: { name: 'hiddendata', def: 1 }, }; export const DEFAULT_HEROES = [19, 53,]; diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index a6474d368..b4a77d640 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -330,6 +330,9 @@ export const STATUS = { TALENT_POINT_NOT_ENOUGH: { code: 30313, simStr: '天赋点不足' }, TALENT_NOT_UNLOCKED: { code: 30314, simStr: '该天赋未解锁' }, TALENT_LEVEL_MAX: { code: 30315, simStr: '该天赋等级已达最高' }, + HERO_IS_HIDDEN: { code: 30316, simStr: '未找到该武将' }, + FASHION_IS_HIDDEN: { code: 30317, simStr: '未找到该时装' }, + ITEM_IS_HIDDEN: { code: 30318, simStr: '未找到该道具' }, // 装备养成 30400-30499 ROLE_EQUIP_PLACE_NOT_ENOUGH: { code: 30400, simStr: '装备栏未装备或无可强化' }, @@ -542,6 +545,10 @@ export const STATUS = { GM_MAIL_NOT_FOUND: { code: 60024, simStr: '未找到该邮件' }, GM_MAIL_HAS_SENT: { code: 60025, simStr: '邮件已经审批过了' }, GM_MAIL_CAN_NOT_SENT: { code: 60026, simStr: '邮件不可发送' }, + GM_REMOVED_GID: { code: 60027, simStr: '已移除过隐藏的id不可再次隐藏' }, + GM_HIDDEN_TIME_ERR: { code: 60028, simStr: '时间不可有所重叠' }, + GM_OLD_REF_TIME_ERR: { code: 60029, simStr: '正在进行中的时间不可更新成未来' }, + GM_HIDDEN_CANNOT_INIT: { code: 60030, simStr: '已初始化过' }, // 支付相关状态 70000 - 79999 NO_PRODUCT_ID: { code: 70001, simStr: '无效商品' }, NO_PAY_TYPE: { code: 70002, simStr: '无效支付类型' }, diff --git a/shared/db/HiddenData.ts b/shared/db/HiddenData.ts new file mode 100644 index 000000000..69ad26089 --- /dev/null +++ b/shared/db/HiddenData.ts @@ -0,0 +1,44 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; + +/** + * 累计充值活动 +*/ +@index({ refTime: -1 }) + +export default class HiddenData extends BaseModel { + + @prop({ required: true }) + refTime: number; // 刷新时间 + + @prop({ required: true, type: Number }) + heroes: number[]; // 武将id + + @prop({ required: true, type: Number }) + goods: number[]; // 物品id + + public static async clearData() { + await HiddenDataModel.deleteMany({}); + } + + public static async updateHiddenData(refTime: number, heroes: number[], goods: number[], uid: number) { + let result: HiddenDataModelType = await HiddenDataModel.findOneAndUpdate({ refTime }, { $setOnInsert: { createdBy: uid }, $set: { heroes, goods, updatedBy: uid } }, { new: true, upsert: true}); + return result; + } + + public static async findCurData(now: number) { + let result: HiddenDataModelType = await HiddenDataModel.findOne({ refTime: { $lte: now }}).sort({ refTime: -1 }); + return result; + } + + public static async findNextData(now: number) { + console.log('####', now) + let result: HiddenDataModelType = await HiddenDataModel.findOne({ refTime: { $gt: now } }).sort({ refTime: 1 }); + return result; + } +} + +export const HiddenDataModel = getModelForClass(HiddenData); + +export interface HiddenDataModelType extends Pick, keyof HiddenData> { } +export type HiddenDataModelTypeParam = Partial; // 将所有字段变成可选项 \ No newline at end of file diff --git a/shared/db/HiddenDataById.ts b/shared/db/HiddenDataById.ts new file mode 100644 index 000000000..f42f849e7 --- /dev/null +++ b/shared/db/HiddenDataById.ts @@ -0,0 +1,103 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; +import { nowSeconds } from '../pubUtils/timeUtil'; +import { isArray } from 'util'; + +/** + * 累计充值活动 +*/ +@index({ type: 1, id: -1 }) +@index({ refTime: 1 }) + +export default class HiddenDataById extends BaseModel { + + @prop({ required: true }) + type: number; // 1-武将 2-道具 + + @prop({ required: true }) + id: number; // 武将id or 道具id + + @prop({ required: false }) + publishTime: number; // 结束隐藏时间 + + public static async checkHasInit(type: number, ids: number[]) { + return await HiddenDataByIdModel.exists({ type, id: ids }); + } + + private static getSearchObj(form: any) { + let searchObj = {}; + let orData = []; + if(form.heroes && isArray(form.heroes) && form.heroes.length > 0) { + orData.push({ type: 1, id: { $in: form.heroes }}); + } + if(form.goods && isArray(form.goods) && form.goods.length > 0) { + orData.push({ type: 2, id: { $in: form.goods }}); + } + if(orData.length > 0) { + searchObj['$or'] = orData; + } + return searchObj + } + + public static async findByCondition(page: number, pageSize: number, sortField: string = 'updatedAt', sortOrder: string = 'descend', form: any = {}) { + + let searchObj = this.getSearchObj(form); + let sort = {}; + if(sortField && sortOrder) { + if(sortOrder == 'ascend') { + sort[sortField] = 1; + } else if (sortOrder == 'descend') { + sort[sortField] = -1; + } + } + const result: HiddenDataByIdModelType[] = await HiddenDataByIdModel.find(searchObj).limit(pageSize).skip((page - 1) * pageSize).sort(sort).lean({ getters: true, virtuals: true }); + return result; + + } + + public static async countByCondition(form: any = {}) { + + let searchObj = this.getSearchObj(form); + const result = await HiddenDataByIdModel.count(searchObj); + return result; + } + + public static async createDatas(datas: HiddenDataByIdModelTypeParam[]) { + await HiddenDataByIdModel.insertMany(datas); + } + + public static async findAllData() { + let result: { _id: number, ids: {type: number, id: number }[]}[] = await HiddenDataByIdModel.aggregate([ + { $match: { publishTime: { $gte: nowSeconds() } } }, + { $group: { _id: '$publishTime', ids: { $push: { type: '$type', id: '$id' } }} }, + { $sort: { _id: -1 } } + ]); + return result; + } + + public static async findExistData(type: number) { + let result: { type: number, id: number }[] = await HiddenDataByIdModel.aggregate([ + { $match: { type } }, + { $project: { id: 1 } } + ]); + return result; + } + + public static async checkById(type: number, ids: number[], publishTime: number) { + let now = nowSeconds(); + if (publishTime >= now) { // 设为隐藏,不可有原来公开着的 + let result = await HiddenDataByIdModel.exists({ type, id: { $in: ids }, publishTime: { $lt: now } }); + return !result + } + return true; + } + + public static async updateData(type: number, id: number, publishTime: number, uid: number) { + await HiddenDataByIdModel.findOneAndUpdate({ type, id }, { $set: { publishTime, updatedBy: uid }, $setOnInsert: { createdBy: uid } }, { new: true, upsert: true }).lean(); + } +} + +export const HiddenDataByIdModel = getModelForClass(HiddenDataById); + +export interface HiddenDataByIdModelType extends Pick, keyof HiddenDataById> { } +export type HiddenDataByIdModelTypeParam = Partial; // 将所有字段变成可选项 \ No newline at end of file diff --git a/shared/domain/backEndField/params.ts b/shared/domain/backEndField/params.ts index 20775480e..9c3e4ffd0 100644 --- a/shared/domain/backEndField/params.ts +++ b/shared/domain/backEndField/params.ts @@ -470,4 +470,29 @@ export class CreatePvpConfigParam { let { seasonStartTime, seasonEndTime, seasonRewardTime, warIds } = this; return { seasonStartTime, seasonEndTime, seasonRewardTime, warIds: parseNumberList(warIds)} } +} + +export class UpdateHiddenDataParam { + env: string = ''; + arr: { type: number, id: number }[] = []; + publishTime: number = 0; + constructor(obj?: any) { + if(obj) { + for(let key in obj) { + this[key] = obj[key]; + } + } + } + + checkParams() { + // console.log('##### createNew', this.env, this.openTime, this.stopRegisterTime, this.hasOpenMail, this.hasCircleMail) + if(!isArray(this.arr)) return false; + for(let { type, id } of this.arr) { + if(!isNumber(type) || !isNumber(id)) return false; + } + if(!this.env || !isNumber(this.publishTime)) { + return false + } + return true; + } } \ No newline at end of file diff --git a/shared/pubUtils/data.ts b/shared/pubUtils/data.ts index 78624d22e..b33dcbadc 100644 --- a/shared/pubUtils/data.ts +++ b/shared/pubUtils/data.ts @@ -57,7 +57,7 @@ import { dicCityActivityReward, loadCityActivityReward } from "./dictionary/DicC import { dicRaceActivity, dicRaceTypes, loadRaceActivity } from './dictionary/DicRaceActivity'; import { GUILDACTIVITY, RECRUIT } from "./dicParam"; import * as param from "./dicParam"; -import { decodeIdCntArrayStr, parseGoodStr, decodeArrayListStr, getRandEelm, readTsFile, getRandEelmWithWeight, getRandSingleEelm } from "./util"; +import { decodeIdCntArrayStr, parseGoodStr, decodeArrayListStr, getRandEelm, readTsFile, getRandSingleEelm } from "./util"; import { RACE_EVENT_TYPE } from "../consts"; import { dicShopByType, dicShopItem, loadShop } from "./dictionary/DicShop"; import { dicShopType, loadShopType } from "./dictionary/DicShopType"; @@ -110,7 +110,6 @@ import { dicLadderMatch, loadLadderMatch } from "./dictionary/DicLadderMatch"; import { dicLadderDifficultRatio, loadLadderDifficultRatio } from "./dictionary/DicLadderDifficultRatio"; import { dicLadderRankReward, loadLadderRankReward } from "./dictionary/DicLadderRankReward"; import { dicGeneralGoods, loadGeneralGoods } from "./dictionary/DicGeneralGoods"; -import { AuctionRewardInter } from "../domain/battleField/auction"; export const gameData = { daily: dicDaily, @@ -654,51 +653,6 @@ export function getTodayGuildActivity() { return dic; } -/** - * 根据军团活动排名获得奖励 - * @param aid 活动id - * @param rank 排名 - */ -function getGuildAuction(aid: number, rank: number, struLv: number, cityId: number = 0) { - let ranksReward = gameData.guildAuction.get(`${aid}_${struLv}_${cityId}`) || []; - return ranksReward.find(cur => { - return rank >= cur.min && (rank <= cur.max || cur.max == 0); - }); -} - -export function getGuildAuctionRewards(aid: number, rank: number, struLv: number, cityId: number = 0) { - let dic = getGuildAuction(aid, rank, struLv, cityId); - if(dic) { - return getAuctionRewardByPoolId(dic.rewards); - } else { - return new Map(); - } -} - -export function getGuildAuctionBasicNum(aid: number, rank: number, struLv: number, cityId: number = 0) { - let dic = getGuildAuction(aid, rank, struLv, cityId); - return dic?.basicDividend||0; -} - -export function getAuctionRewardByPoolId(poolId: number) { - let pools = gameData.auctionPool.get(poolId); - let rewards: Map = new Map(); - for(let { count, basicPool } of pools) { - let { rewardBasicPool, basePrice, maxPrice, sort } = basicPool - for(let i = 0; i < count; i++) { - let result = getRandEelmWithWeight(rewardBasicPool); - if(result && result.dic) { - let { id, count } = result.dic; - if(!rewards.has(id)) { - rewards.set(id, []); - } - rewards.get(id).push({ goods: {id, count}, basePrice, maxPrice, sort }); - } - } - } - return rewards; -} - /** * 根据军团活动排名获得功勋奖励 * @param type 城池类型 diff --git a/shared/resource/jsons/dic_api.json b/shared/resource/jsons/dic_api.json index a83f09cee..e3e8ecbac 100644 --- a/shared/resource/jsons/dic_api.json +++ b/shared/resource/jsons/dic_api.json @@ -908,5 +908,19 @@ "name": "保存pvp赛季", "module": "sys", "type": "update" + }, + { + "id": 131, + "api": "gm.gmServerHandler.initHiddenData", + "name": "初始隐藏数据", + "module": "sys", + "type": "update" + }, + { + "id": 132, + "api": "gm.gmServerHandler.saveHiddenData", + "name": "更新隐藏数据", + "module": "sys", + "type": "update" } ] \ No newline at end of file