From 1452e8b8001dd957f406496361cf83fd4e328a4b Mon Sep 17 00:00:00 2001 From: luying Date: Fri, 27 May 2022 20:46:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=EF=BC=9A=E6=8B=9B=E8=B4=A2?= =?UTF-8?q?=E8=BF=9B=E5=AE=9D=E6=94=B9=E4=B8=BA=E9=A2=86=E5=8F=96=E7=AE=B1?= =?UTF-8?q?=E5=AD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/handler/dailyCoinHandler.ts | 47 ++++-- .../app/services/activity/dailyCoinService.ts | 24 ---- .../services/activity/treasureHuntService.ts | 2 - shared/consts/constModules/activityConst.ts | 6 + shared/consts/constModules/sysConst.ts | 1 + shared/consts/statusCode.ts | 4 +- shared/db/ActivityDailyCoin.ts | 9 ++ shared/domain/activityField/dailyCoinField.ts | 136 ++++++++++++------ 8 files changed, 152 insertions(+), 77 deletions(-) diff --git a/game-server/app/servers/activity/handler/dailyCoinHandler.ts b/game-server/app/servers/activity/handler/dailyCoinHandler.ts index 60d1c5a74..6935fa305 100644 --- a/game-server/app/servers/activity/handler/dailyCoinHandler.ts +++ b/game-server/app/servers/activity/handler/dailyCoinHandler.ts @@ -1,6 +1,6 @@ import { Application, BackendSession, HandlerService } from 'pinus'; import { resResult } from '../../../pubUtils/util'; -import { ACTIVITY_RESOURCES_TYPE, CURRENCY_BY_TYPE, CURRENCY_TYPE, ITEM_CHANGE_REASON, STATUS } from '../../../consts'; +import { ACTIVITY_RESOURCES_TYPE, CURRENCY_BY_TYPE, CURRENCY_TYPE, DAILY_COIN_BOX_STATUS, ITEM_CHANGE_REASON, STATUS } from '../../../consts'; import { getGoldObject, handleCost } from '../../../services/role/rewardService'; import { getPlayerDailyCoinData, mergeData } from '../../../services/activity/dailyCoinService'; import { ConsumeExchangeFormulaItem, CoinRewardFormulaItem } from '../../../domain/activityField/dailyCoinField'; @@ -91,13 +91,6 @@ export class DailyCoinHandler { reward.count = reward.count * rate; } allReward = allReward.concat(baseRewardParamArr); - let extraIndex = playerData.isExtra(index); - if (extraIndex != -1) {//额外奖励 - let extraRewardParamArr: Array = stringToRewardParam(playerData.extraReward); - let extraReward = extraRewardParamArr[extraIndex]; - // console.log('额外奖励', JSON.stringify(extraReward)) - allReward.push(extraReward); - } } let newConsume = mergeData(allConsume); @@ -128,13 +121,47 @@ export class DailyCoinHandler { //免费期间 let time = moment(new Date()).valueOf(); let result = await addReward(roleId, roleName, sid, serverId, newReward, ITEM_CHANGE_REASON.DAILY_COIN_EXCHANGE); - await ActivityDailyCoinModel.addExchangeRecord(serverId, activityId, roleId, playerData.roundIndex, count, addCoin, `${count}&${consumeGold}&${addCoin}&${time}`); + let record = await ActivityDailyCoinModel.addExchangeRecord(serverId, activityId, roleId, playerData.roundIndex, count, addCoin, `${count}&${consumeGold}&${addCoin}&${time}`); + let extraReward = playerData.setAllBoxStatus(record); let exchangeCount = playerData.exchangeCount + count; return resResult(STATUS.SUCCESS, Object.assign(result, { - param: { activityId, count }, + param: { activityId, count, extraReward }, item: { exchangeCount, recordMsg: `${count}&${consumeGold}&${addCoin}&${time}`, rateArray }, })); } + + /** + * @description 领取宝箱 + * @param {{ activityId: number, cellIndex:number}} msg + * @param {BackendSession} session + * @memberof DailyCoinHandler + */ + async receiveExtraReward(msg: { activityId: number, cellIndex: number }, session: BackendSession) { + const { activityId, cellIndex } = msg; + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + const sid = session.get('sid'); + const roleName = session.get('roleName'); + + + let playerData = await getPlayerDailyCoinData(activityId, serverId, roleId) + if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); + let box = await playerData.findBoxByCellIndex(cellIndex); + if(!box) return resResult(STATUS.DAILY_COIN_BOX_NOT_FOUND); + if(box.status != DAILY_COIN_BOX_STATUS.CAN_OPEN) return resResult(STATUS.DAILY_COIN_BOX_CANNOT_RECEIVE); + + let rewardArray = stringToRewardParam(box.reward) + let result = await addReward(roleId, roleName, sid, serverId, rewardArray, ITEM_CHANGE_REASON.ACT_DAILY_COIN_RECEIVE_BOX); + + let record = await ActivityDailyCoinModel.receiveBox(serverId, activityId, roleId, playerData.roundIndex, cellIndex); + let item = playerData.setBoxStatus(cellIndex, record); + + return resResult(STATUS.SUCCESS, Object.assign(result, { + item, + param: { activityId }, + })); + } + } diff --git a/game-server/app/services/activity/dailyCoinService.ts b/game-server/app/services/activity/dailyCoinService.ts index f14955789..7209ffc47 100644 --- a/game-server/app/services/activity/dailyCoinService.ts +++ b/game-server/app/services/activity/dailyCoinService.ts @@ -8,30 +8,6 @@ import { getRoleCreateTime, getServerCreateTime } from '../redisService'; import { getActivitiesByType, getActivityById } from './activityService'; -/** - * 获取活动数据 - * - * @param {number} serverId 区Id - * @param {number} activityId 活动Id - * @param {string} roleId 角色Id - * - */ -export async function dailyCoinActivity(serverId: number, roleId: string) { - let activityDataArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.DAILY_COIN); - if (activityDataArray.length === 0) { - return null; - } - let activityData: ActivityModelType = activityDataArray[0]; - let createTime = await getRoleCreateTime(roleId); - let serverTime = await getServerCreateTime(serverId); - let playerData = new DailyCoinData(activityData, createTime, serverTime); - - let playerRecord: ActivityDailyCoinModelType = await ActivityDailyCoinModel.findData(serverId, activityData.activityId, roleId, playerData.roundIndex); - playerData.setPlayerRecords(playerRecord); - return playerData; -} - - /** * 玩家玩家活动数据 * diff --git a/game-server/app/services/activity/treasureHuntService.ts b/game-server/app/services/activity/treasureHuntService.ts index 144d36149..7aa8de056 100644 --- a/game-server/app/services/activity/treasureHuntService.ts +++ b/game-server/app/services/activity/treasureHuntService.ts @@ -28,8 +28,6 @@ export async function getPlayerTreasureHuntDataShow(activityId: number, serverId */ export async function getPlayerTreasureHuntData(activityId: number, serverId: number, roleId: string, dataType: TREASURE_HUNT_DATA_TYPE = TREASURE_HUNT_DATA_TYPE.ALL) { let activityData = await getActivityById(activityId); - console.log('#####', activityId, activityData) - let createTime = await getRoleCreateTime(roleId); let serverTime = await getServerCreateTime(serverId); let playerData = new TreasureHuntData(activityData, createTime, serverTime); diff --git a/shared/consts/constModules/activityConst.ts b/shared/consts/constModules/activityConst.ts index b4f1696bc..2869f1d9f 100644 --- a/shared/consts/constModules/activityConst.ts +++ b/shared/consts/constModules/activityConst.ts @@ -209,4 +209,10 @@ export enum TREASURE_HUNT_DATA_TYPE { TASK = 3, CHALLENGE = 4, TREASURE_SHOP = 5, +} + +export enum DAILY_COIN_BOX_STATUS { + CAN_NOT_OPEN = 0, // 不可打开 + CAN_OPEN = 1, // 可以打开 + RECEIVED = 2, // 已领取 } \ No newline at end of file diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index f694aca23..b208f7656 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -1017,6 +1017,7 @@ export enum ITEM_CHANGE_REASON { JEWEL_INHERIT = 146, // 天晶继承 RESET_TALENT = 147, // 洗点 RECEIVE_TOWER_BOX = 148, // 领取镇念塔节点奖励 + ACT_DAILY_COIN_RECEIVE_BOX = 149, // 招财进宝领取宝箱 } export enum TA_EVENT { diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 902746498..717f0b1a9 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -471,7 +471,9 @@ export const STATUS = { SHOP_CLOSED: { code: 50034, simStr: '停业' }, ACTIVITY_RECHARGE_ITEM_NOT_ENOUGH: { code: 50035, simStr: '商品不足' }, ACTIVITY_ITEM_CANNOT_RECEIVE: { code: 50036, simStr: '无可领取物品' }, - ACTIVITY_POP_UP_MUST_BUY: { code: 50013, simStr: '该礼包必须购买' }, + ACTIVITY_POP_UP_MUST_BUY: { code: 50037, simStr: '该礼包必须购买' }, + DAILY_COIN_BOX_NOT_FOUND: { code: 50038, simStr: '未找到该宝箱' }, + DAILY_COIN_BOX_CANNOT_RECEIVE: {code: 50013, simStr: '该宝箱不可领取' }, // GM后台相关状态 60000 - 69999 GM_ERR_PASSWORD: { code: 60001, simStr: '账号或密码错误' }, GM_MISS_API: { code: 60002, simStr: '未找到该接口' }, diff --git a/shared/db/ActivityDailyCoin.ts b/shared/db/ActivityDailyCoin.ts index c9cbe655c..a98cf7b25 100644 --- a/shared/db/ActivityDailyCoin.ts +++ b/shared/db/ActivityDailyCoin.ts @@ -24,6 +24,8 @@ export default class Activity_Daily_Coin extends BaseModel { @prop({ required: true }) roundIndex: number; // 周期数 + @prop({ required: true, type: Number }) + receivedBox: number[]; // 周期数 //兑换记录 @@ -33,6 +35,13 @@ export default class Activity_Daily_Coin extends BaseModel { return result; } + // 领取宝箱 + public static async receiveBox(serverId: number, activityId: number, roleId: string, roundIndex: number, cellIndex: number) { + let result = await ActivityDailyCoinModel.findOneAndUpdate({ serverId, activityId, roleId, roundIndex }, + { $push: { receivedBox: cellIndex } }, { upsert: true, new: true }).lean(true) + return result; + } + //根据活动时间查询活动数据 public static async findData(serverId: number, activityId: number, roleId: string, roundIndex: number) { let result: ActivityDailyCoinModelType = await ActivityDailyCoinModel.findOne({ diff --git a/shared/domain/activityField/dailyCoinField.ts b/shared/domain/activityField/dailyCoinField.ts index 5fad26e56..c249bd659 100644 --- a/shared/domain/activityField/dailyCoinField.ts +++ b/shared/domain/activityField/dailyCoinField.ts @@ -1,19 +1,33 @@ -import { random } from 'underscore'; +import { pick, random } from 'underscore'; +import { DAILY_COIN_BOX_STATUS } from '../../consts'; import { ActivityModelType } from '../../db/Activity'; import { ActivityDailyCoinModelType } from '../../db/ActivityDailyCoin'; import { splitString } from '../../pubUtils/util'; import { ActivityBase } from './activityField'; -export class CoinRewardFormulaItem { - levelMin: number; - levelMax: number; - rewardFormula: string; +interface ConsumeExchangeFormulaInDb { + key: number; + countMin: number; // 兑换次数下限 + countMax: number; // 兑换次数上限 + consumeFormula: string; +} - constructor(data: any) { - this.levelMin = data.levelMin; - this.levelMax = data.levelMax; - this.rewardFormula = data.rewardFormula; - } +interface CoinRewardFormulaInDb { + key: number; + levelMin: number; // 玩家等级下限 + levelMax: number; // 玩家等级上限 + rewardFormula: string; +} + +interface DailyCoinDataInDb { + countMax: number; // 每日上限 + freeCount: number; // 每日免费次数 + extraRewardCount: string; // 可额外获得道具奖励的第X次 + extraReward: string; // 额外获得的道具奖励 + double: number; // 2倍暴击触发的概率 + fiveTimes: number; // 5倍暴击触发的概率 + consumeExchangeFormula: ConsumeExchangeFormulaInDb[]; // 消耗的元宝 + coinRewardFormula: CoinRewardFormulaInDb[]; // 获得的硬币 } // 每次配置数据 @@ -22,7 +36,7 @@ export class ConsumeExchangeFormulaItem { countMax: number; consumeFormula: string; - constructor(data: any) { + constructor(data: ConsumeExchangeFormulaInDb) { this.countMin = data.countMin; this.countMax = data.countMax; this.consumeFormula = data.consumeFormula; @@ -30,20 +44,50 @@ export class ConsumeExchangeFormulaItem { } +export class CoinRewardFormulaItem { + levelMin: number; + levelMax: number; + rewardFormula: string; + + constructor(data: CoinRewardFormulaInDb) { + this.levelMin = data.levelMin; + this.levelMax = data.levelMax; + this.rewardFormula = data.rewardFormula; + } +} + +export class ExtraRewardItem { + cellIndex: number; + exchangeCount: number; + reward: string; + status: number = DAILY_COIN_BOX_STATUS.CAN_NOT_OPEN; + + constructor(cellIndex: number, exchangeCount: string, reward: string) { + this.cellIndex = cellIndex; + this.exchangeCount = parseInt(exchangeCount); + this.reward = reward; + } + + setRecord(count: number, receivedBox: number[]) { + this.status = DAILY_COIN_BOX_STATUS.CAN_NOT_OPEN; + if(count >= this.exchangeCount) this.status = DAILY_COIN_BOX_STATUS.CAN_OPEN; + if(receivedBox.indexOf(this.cellIndex) != -1) this.status = DAILY_COIN_BOX_STATUS.RECEIVED; + } +} + // 每日兑换铜币活动数据 export class DailyCoinData extends ActivityBase { - countMax: number = 0;//每日上限 - freeCount: number = 0;//每日免费次数 - extraRewardCount: string = '';//可额外获得道具奖励的第X次 - extraReward: string = '';//额外获得的道具奖励 - double: number = 0;//2倍暴击触发的概率 - fiveTimes: number = 0;//5倍暴击触发的概率 + countMax: number = 0; // 每日上限 + freeCount: number = 0; // 每日免费次数 + double: number = 0; // 2倍暴击触发的概率 + fiveTimes: number = 0; // 5倍暴击触发的概率 consumeExchangeFormulaItem: ConsumeExchangeFormulaItem[] = []; coinRewardFormulaItem: CoinRewardFormulaItem[] = []; + extraReward: ExtraRewardItem[] = []; - exchangeCount: number = 0;//已经兑换次数 - coinCount: number = 0;//已经兑换获得铜币数量 - recordMsg: string[] = [];//历史记录 + exchangeCount: number = 0; // 已经兑换次数 + coinCount: number = 0; // 已经兑换获得铜币数量 + recordMsg: string[] = []; // 历史记录 public getRate() { let ran = (random(99) + 1) * 0.01;//[1,100] @@ -58,10 +102,9 @@ export class DailyCoinData extends ActivityBase { return 1; } - public isExtra(index: number) { - let arr = splitString(this.extraRewardCount, '&'); - return arr.indexOf(index); - } + // public isExtra(index: number) { + // return arr.indexOf(index); + // } public findConsumeExchangeFormulaItem(index: number) { let itemIndex = this.consumeExchangeFormulaItem.findIndex(obj => { return obj.countMin <= index && obj.countMax >= index }); @@ -75,20 +118,38 @@ export class DailyCoinData extends ActivityBase { //解析玩家领取记录 public setPlayerRecords(data: ActivityDailyCoinModelType) { - this.exchangeCount = data && data.exchangeCount ? data.exchangeCount : 0; - this.coinCount = data && data.coinCount ? data.coinCount : 0; - this.recordMsg = data && data.recordMsg ? data.recordMsg : []; + if(!data) return; + this.exchangeCount = data.exchangeCount||0; + this.coinCount = data.coinCount || 0; + this.recordMsg = data.recordMsg || []; + this.setAllBoxStatus(data); + } + + public findBoxByCellIndex(cellIndex: number) { + return this.extraReward.find(cur => cur.cellIndex == cellIndex); + } + + public setAllBoxStatus(data: ActivityDailyCoinModelType) { + for(let box of this.extraReward) { + box.setRecord(this.exchangeCount, data.receivedBox||[]); + } + return this.extraReward; + } + + public setBoxStatus(cellIndex: number, data: ActivityDailyCoinModelType) { + let item = this.extraReward.find(cur => cur.cellIndex == cellIndex); + if(!item) return null; + item.setRecord(data.exchangeCount, data.receivedBox||[]); + return item } public initData(data: string) { this.exchangeCount = 0; this.coinCount = 0; - let dataObj = JSON.parse(data); + let dataObj: DailyCoinDataInDb = JSON.parse(data); this.countMax = dataObj.countMax; this.freeCount = dataObj.freeCount; - this.extraRewardCount = dataObj.extraRewardCount; - this.extraReward = dataObj.extraReward; this.double = dataObj.double; this.fiveTimes = dataObj.fiveTimes; @@ -98,16 +159,11 @@ export class DailyCoinData extends ActivityBase { for (let obj of dataObj.coinRewardFormula) { this.coinRewardFormulaItem.push(new CoinRewardFormulaItem(obj)) } - // let curDate = moment(new Date()); - // if (curDate.hour() < REFRESH_TIME) { - // this.beginTime = curDate.startOf('d').add(-1, 'd').add(REFRESH_TIME, 'h').valueOf(); - // this.endTime = moment(this.beginTime).add(1, 'd').valueOf(); - // } else { - // this.beginTime = curDate.startOf('d').add(REFRESH_TIME, 'h').valueOf(); - // this.endTime = moment(this.beginTime).add(1, 'd').valueOf() - // } - // console.log('ddddddddddddbbbbbbb') - + let counts = splitString(dataObj.extraRewardCount, '&'); + let extraReward = dataObj.extraReward.split('|'); + for(let i = 0; i < counts.length; i++) { + this.extraReward.push(new ExtraRewardItem(i + 1, counts[i], extraReward[i]||'')); + } } constructor(activityData: ActivityModelType, createTime: number, serverTime: number) {