import { GVG_RETURN_ITEM_TYPE, ITEM_CHANGE_REASON, LEAGUE_ITEM_REFRESH_TYPE, GVG_ITEM, PUSH_ROUTE } from "../../consts"; import { GVGUserItemModel } from "../../db/GVGUserItem"; import { gameData } from "../../pubUtils/data"; import { RewardInter } from "../../pubUtils/interface"; import { saveGVGItemChangeLog } from "../../pubUtils/logUtil"; import { DAY_TO_SECOND, getZeroPoint, getFutureTime } from "../../pubUtils/timeUtil"; import { sendMessageToUserWithSuc } from "../pushService"; import { addItems, handleCost } from "../role/rewardService"; import { getGVGConfig } from "./gvgService"; /** * 获取道具(必须在guild进程下使用) * @param roleId * @param roleName * @param leagueCode * @param sid * @param leagueItems GVG内专用道具 * @param items 普通道具 * @param reason * @returns */ export async function addGVGReward(roleId: string, roleName: string, leagueCode: string, sid: string, leagueItems: RewardInter[], items: RewardInter[], reason: ITEM_CHANGE_REASON) { let returnGoods: { id: number, count: number, itemType: number }[] = [], pushGoods: { id: number, count: number, expireTime: number, inc: number, reason: number }[] = []; let { configId } = getGVGConfig(); if(items.length > 0) { const goods = await addItems(roleId, roleName, sid, items, reason); for(let { id, count } of goods) { returnGoods.push({ id, count, itemType: GVG_RETURN_ITEM_TYPE.NORMAL_ITEM }); } } for(let { id, count } of leagueItems) { let dicItem = gameData.gvgItem.get(id); if(!dicItem) continue; let item = await GVGUserItemModel.increaseItem(configId, leagueCode, roleId, id, count, getExpireTime(dicItem.refreshType)); returnGoods.push({ id, count, itemType: GVG_RETURN_ITEM_TYPE.GVG_ITEM }); pushGoods.push({ id, count: item.count, inc: count, expireTime: item.expireTime, reason }); } if(pushGoods.length > 0) { await sendMessageToUserWithSuc(roleId, PUSH_ROUTE.LEAGUE_ITEM_UPDATE, { items: pushGoods }, sid); saveGVGItemChangeLog(roleId, leagueCode, pushGoods, reason); } return returnGoods; } function getExpireTime(refreshType: number) { if(refreshType == LEAGUE_ITEM_REFRESH_TYPE.DAILY) { return getZeroPoint() + DAY_TO_SECOND; } return getFutureTime(); } /** * 消耗道具 * @param roleId * @param leagueCode * @param sid * @param leagueItems GVG内专用道具 * @param items 普通背包道具 * @param reason * @returns */ export async function handleGVGCost(roleId: string, leagueCode: string, sid: string, leagueItems: RewardInter[], items: RewardInter[], reason: ITEM_CHANGE_REASON) { let { configId } = getGVGConfig(); // 检查本地道具数量 const curItems = await GVGUserItemModel.findByRoleAndIds(configId, leagueCode, roleId, leagueItems.map(cur => cur.id)); for(let { id, count } of leagueItems) { let curItem = curItems.find(cur => cur.id == id); if(!curItem || curItem.count < count) { return false; } } const itemResult = await handleCost(roleId, sid, items, reason); if(!itemResult) return false; const decreaseResult = await GVGUserItemModel.decreaseItem(configId, leagueCode, roleId, leagueItems); const pushGoods = decreaseResult.map(item => { let leagueItem = leagueItems.find(cur => cur.id == item.id); return { id: item.id, count: item.count, expireTime: item.expireTime, inc: leagueItem?.count } }); if(pushGoods.length > 0) { await sendMessageToUserWithSuc(roleId, PUSH_ROUTE.LEAGUE_ITEM_UPDATE, { items: pushGoods }, sid); saveGVGItemChangeLog(roleId, leagueCode, pushGoods, reason); } return true; } export function getProduceCoinCnt(items: RewardInter[]) { let produceCoinCnt = 0; for(let { id, count } of items) { if(id == GVG_ITEM.PRODUCE_COIN) { produceCoinCnt = count; break; } } return produceCoinCnt; } export function combinePushItem(targetItems: RewardInter[], dicItems: RewardInter[]) { for(let { id, count } of dicItems) { let obj = targetItems.find(obj => obj.id == id); if(!obj) { targetItems.push({ id, count }); } else { obj.count += count; } } }