diff --git a/game-server/app/servers/activity/handler/limitPackageHandler.ts b/game-server/app/servers/activity/handler/limitPackageHandler.ts index f5d2ceafa..34d7933ff 100644 --- a/game-server/app/servers/activity/handler/limitPackageHandler.ts +++ b/game-server/app/servers/activity/handler/limitPackageHandler.ts @@ -122,7 +122,7 @@ export class LimitPackageHandler { let rewardArray = stringToRewardParam(item.reward) let result = await addReward(roleId, roleName, sid, serverId, rewardArray, ITEM_CHANGE_REASON.BUY_LIMIT_PACKAGE); - await ActivityShopModel.addRecord(activityId, roleId, roundIndex, id); + await ActivityShopModel.addRecord(activityId, roleId, roundIndex, id, 1); item.buyCount += 1; return resResult(STATUS.SUCCESS, Object.assign(result, { diff --git a/game-server/app/servers/activity/handler/treasureHuntHandler.ts b/game-server/app/servers/activity/handler/treasureHuntHandler.ts index e062d97a9..3e39a5baf 100644 --- a/game-server/app/servers/activity/handler/treasureHuntHandler.ts +++ b/game-server/app/servers/activity/handler/treasureHuntHandler.ts @@ -80,8 +80,8 @@ export class TreasureHuntHandler { * @param {BackendSession} session * @memberof TreasureHuntHandler */ - async buyGoods(msg: { activityId: number, cellIndex: number }, session: BackendSession) { - const { activityId, cellIndex } = msg; + async buyGoods(msg: { activityId: number, cellIndex: number, count: number }, session: BackendSession) { + const { activityId, cellIndex, count = 1 } = msg; const roleId = session.get('roleId'); const serverId = session.get('serverId'); const sid = session.get('sid'); @@ -96,22 +96,22 @@ export class TreasureHuntHandler { if (item.price > 0) { return resResult(STATUS.ACTIVITY_NEED_PAY, {}); } - if (item.buyCount >= item.countMax) { + if (item.buyCount + count > item.countMax) { return resResult(STATUS.ACTIVITY_MAX_COUNT, {}); } - let consumeStr = item.getConsume(); - let consume = stringToConsumeParam(consumeStr) + let consumeStr = item.getConsume(count); + let consume = stringToConsumeParam(...consumeStr); let resourceResult = await handleCost(roleId, sid, consume, ITEM_CHANGE_REASON.TREASURE_HUNT_SHOP_BUY); if (!resourceResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); //添加购买记录 - await ActivityTreasureHuntShopModel.buyShopRecord(activityId, roleId, playerData.roundIndex, playerData.todayIndex, cellIndex); + await ActivityTreasureHuntShopModel.buyShopRecord(activityId, roleId, playerData.roundIndex, playerData.todayIndex, cellIndex, count); - let rewardParamArr: Array = stringToRewardParam(item.reward); + let rewardParamArr: Array = stringToRewardParam(item.reward).map(cur => ({...cur, count: cur.count * count })); let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.TREASURE_HUNT_SHOP_BUY) - item.buyCount += 1; + item.buyCount += count; return resResult(STATUS.SUCCESS, Object.assign(result, { param: { activityId, cellIndex }, item: item, @@ -195,8 +195,8 @@ export class TreasureHuntHandler { * @param {BackendSession} session * @memberof TreasureHuntHandler */ - async buyTreasureShopGoods(msg: { activityId: number, cellIndex: number }, session: BackendSession) { - const { activityId, cellIndex } = msg; + async buyTreasureShopGoods(msg: { activityId: number, cellIndex: number, count: number }, session: BackendSession) { + const { activityId, cellIndex, count = 1 } = msg; const roleId = session.get('roleId'); const serverId = session.get('serverId'); const sid = session.get('sid'); @@ -208,22 +208,22 @@ export class TreasureHuntHandler { if (!item) { return resResult(STATUS.ACTIVITY_MISSING, {}); } - if (item.buyCount >= item.countMax) { + if (item.buyCount + count > item.countMax) { return resResult(STATUS.ACTIVITY_MAX_COUNT, {}); } - let consumeStr = item.consume; - let consume = stringToConsumeParam(consumeStr) + let consumeStrs = new Array(count).fill(item.consume); + let consume = stringToConsumeParam(...consumeStrs); let resourceResult = await handleCost(roleId, sid, consume, ITEM_CHANGE_REASON.TREASURE_HUNT_SP_SHOP_BUY); if (!resourceResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); //添加购买记录 - await ActivityTreasureHuntTreasureShopModel.addRecord(activityId, roleId, playerData.roundIndex, cellIndex); + await ActivityTreasureHuntTreasureShopModel.addRecord(activityId, roleId, playerData.roundIndex, cellIndex, count); - let rewardParamArr: Array = stringToRewardParam(item.reward); + let rewardParamArr: Array = stringToRewardParam(item.reward).map(cur => ({...cur, count: cur.count * count})); let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.TREASURE_HUNT_SP_SHOP_BUY) - item.buyCount += 1; + item.buyCount += count; return resResult(STATUS.SUCCESS, Object.assign(result, { param: { activityId, cellIndex }, item: item, diff --git a/game-server/app/services/activity/giftPackageService.ts b/game-server/app/services/activity/giftPackageService.ts index b295f3715..8d8539c56 100644 --- a/game-server/app/services/activity/giftPackageService.ts +++ b/game-server/app/services/activity/giftPackageService.ts @@ -183,17 +183,19 @@ export function stringToRewardParam(rewardStr: string): Array { } //数据格式转换'类型&id&数量|类型&id&数量|' ->> Array 资源消耗 -export function stringToConsumeParam(rewardStr: string) { +export function stringToConsumeParam(...rewardStrs: string[]) { let result = new Array<{ type: number, id: number, count: number }>(); - if (!rewardStr) return result; - let decodeArr = decodeArrayListStr(rewardStr); - for (let [type, id, count] of decodeArr) { - if (isNaN(parseInt(type)) || isNaN(parseInt(id)) || isNaN(parseInt(count))) { - throw new Error('data table format wrong'); + for(let rewardStr of rewardStrs) { + if(!rewardStr) continue; + let decodeArr = decodeArrayListStr(rewardStr); + for (let [type, id, count] of decodeArr) { + if (isNaN(parseInt(type)) || isNaN(parseInt(id)) || isNaN(parseInt(count))) { + throw new Error('data table format wrong'); + } + result.push({ type: parseInt(type), id: parseInt(id), count: parseInt(count) }); } - result.push({ type: parseInt(type), id: parseInt(id), count: parseInt(count) }); - } - return result + } + return combineItems(result); } //数据格式转换'id&数量|id&数量|' ->> Array 老资源格式 diff --git a/game-server/app/services/activity/limitPackageService.ts b/game-server/app/services/activity/limitPackageService.ts index eb8782592..409c52d4a 100644 --- a/game-server/app/services/activity/limitPackageService.ts +++ b/game-server/app/services/activity/limitPackageService.ts @@ -132,7 +132,7 @@ export async function makeLimitPackageReward(roleId: string, roleName: string, s let rewardArray = stringToRewardParam(item.reward) let result = await addReward(roleId, roleName, sid, serverId, rewardArray, ITEM_CHANGE_REASON.BUY_LIMIT_PACKAGE); - await ActivityShopModel.addRecord(activityId, roleId, playerData.roundIndex, item.id); + await ActivityShopModel.addRecord(activityId, roleId, playerData.roundIndex, item.id, 1); item.buyCount += 1; return { diff --git a/game-server/app/services/activity/treasureHuntService.ts b/game-server/app/services/activity/treasureHuntService.ts index 7aa8de056..507aa8bfa 100644 --- a/game-server/app/services/activity/treasureHuntService.ts +++ b/game-server/app/services/activity/treasureHuntService.ts @@ -109,7 +109,7 @@ export async function makeShop(roleId: string, roleName: string, sid: string, se let cellIndex = item.cellIndex; //添加购买记录 - await ActivityTreasureHuntShopModel.buyShopRecord(activityId, roleId, playerData.roundIndex, playerData.todayIndex, cellIndex); + await ActivityTreasureHuntShopModel.buyShopRecord(activityId, roleId, playerData.roundIndex, playerData.todayIndex, cellIndex, 1); let rewardParamArr: Array = stringToRewardParam(item.reward); let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.TREASURE_HUNT_SHOP_BUY) diff --git a/game-server/app/services/checkParam.ts b/game-server/app/services/checkParam.ts index 9a9edd7e5..ffd14ae53 100644 --- a/game-server/app/services/checkParam.ts +++ b/game-server/app/services/checkParam.ts @@ -379,7 +379,7 @@ export function checkRouteParam(route: string, msg: any) { } case 'activity.treasureHuntHandler.buyGoods': { - if(!checkNaturalNumbers(msg.activityId, msg.cellIndex)) return false; + if(!checkNaturalNumbers(msg.activityId, msg.cellIndex, msg.count)) return false; break; } case 'activity.treasureHuntHandler.getTaskReward': @@ -394,7 +394,7 @@ export function checkRouteParam(route: string, msg: any) { } case 'activity.treasureHuntHandler.buyTreasureShopGoods': { - if(!checkNaturalNumbers(msg.activityId, msg.cellIndex)) return false; + if(!checkNaturalNumbers(msg.activityId, msg.cellIndex, msg.count)) return false; break; } case 'activity.vipRechargeMoneyHandler.getVipRechargeMoneyReward': diff --git a/shared/db/ActivityShop.ts b/shared/db/ActivityShop.ts index de2910032..83aee44a2 100644 --- a/shared/db/ActivityShop.ts +++ b/shared/db/ActivityShop.ts @@ -30,9 +30,13 @@ export default class Activity_Shop extends BaseModel { records: BuyRecord[]; // 购买记录 //购买领取奖励的记录 - public static async addRecord(activityId: number, roleId: string, roundIndex: number, id: number) { + public static async addRecord(activityId: number, roleId: string, roundIndex: number, id: number, count: number) { + let records = []; + for(let i = 0; i < count; i++) { + records.push({ id, time: new Date() }); + } let result: ActivityShopModelType = await ActivityShopModel.findOneAndUpdate({ roleId, activityId, roundIndex }, - { $push: { records: { id, time: new Date() } } }, { upsert: true, new: true }).lean(true); + { $push: { records: { $each: records } } }, { upsert: true, new: true }).lean(true); return result; } diff --git a/shared/db/ActivityTreasureHuntShop.ts b/shared/db/ActivityTreasureHuntShop.ts index d70255279..12377b9c8 100644 --- a/shared/db/ActivityTreasureHuntShop.ts +++ b/shared/db/ActivityTreasureHuntShop.ts @@ -20,9 +20,13 @@ export default class Activity_Treasure_Hunt_Shop extends ActivityShop { } //购买领取奖励的记录 - public static async buyShopRecord(activityId: number, roleId: string, roundIndex: number, dayIndex: number, id: number) { + public static async buyShopRecord(activityId: number, roleId: string, roundIndex: number, dayIndex: number, id: number, count: number) { + let records = []; + for(let i = 0; i < count; i++) { + records.push({ id, time: new Date() }); + } let result: ActivityTreasureHuntShopModelType = await ActivityTreasureHuntShopModel.findOneAndUpdate({ roleId, activityId, roundIndex, dayIndex }, - { $push: { records: { id, time: new Date() } } }, { upsert: true, new: true }).lean(true); + { $push: { records: { $each: records } } }, { upsert: true, new: true }).lean(true); return result; } } diff --git a/shared/domain/activityField/treasureHuntField.ts b/shared/domain/activityField/treasureHuntField.ts index 1139592c0..0dcf73a84 100644 --- a/shared/domain/activityField/treasureHuntField.ts +++ b/shared/domain/activityField/treasureHuntField.ts @@ -160,9 +160,13 @@ export class TreasureHuntShopItem { } } - public getConsume() { - let index = this.consume.findIndex(obj => { return obj && obj.count === this.buyCount + 1 }); - return (index != -1) ? this.consume[index].consume : ''; + public getConsume(count: number) { + let consumes: string[] = []; + for(let cnt = 1; cnt <= count; cnt ++) { + let index = this.consume.findIndex(obj => { return obj && obj.count === this.buyCount + cnt }); + if (index != -1) consumes.push(this.consume[index].consume); + } + return consumes; } public setBuyCount(record: ActivityTreasureHuntShopModelType) {