diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/UseAndPriceItemHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/UseAndPriceItemHandler.java index dd0c2e2a7..b5fb48e00 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/UseAndPriceItemHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/UseAndPriceItemHandler.java @@ -2,32 +2,16 @@ package com.ljsd.jieling.handler; import com.ljsd.jieling.exception.ErrorCode; import com.ljsd.jieling.exception.ErrorCodeException; -import com.ljsd.jieling.globals.BIReason; -import com.ljsd.jieling.logic.dao.Item; -import com.ljsd.jieling.logic.dao.UserManager; -import com.ljsd.jieling.logic.dao.root.User; -import com.ljsd.jieling.logic.hero.HeroLogic; -import com.ljsd.jieling.logic.hero.HongMengFunctionEnum; import com.ljsd.jieling.logic.item.ItemLogic; import com.ljsd.jieling.network.session.ISession; -import com.ljsd.jieling.util.ItemMap; -import com.ljsd.jieling.util.ItemUtil; -import com.ljsd.jieling.util.MessageUtil; -import com.sun.javafx.collections.MappingChange; -import config.SItem; -import config.SMainLevelConfig; -import config.SRewardGroup; -import rpc.protocols.CommonProto; -import rpc.protocols.MessageTypeProto; -import rpc.protocols.PlayerInfoProto; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; +import rpc.protocols.CommonProto; +import rpc.protocols.MessageTypeProto; +import rpc.protocols.PlayerInfoProto; -import java.util.Arrays; -import java.util.HashMap; import java.util.List; -import java.util.Map; @Component public class UseAndPriceItemHandler extends BaseHandler { @@ -39,93 +23,37 @@ public class UseAndPriceItemHandler extends BaseHandler itemList = useAndPriceItemRequest.getItemsList(); List equipIdsList = useAndPriceItemRequest.getEquipIdsList(); List heroIdsList = useAndPriceItemRequest.getHeroIdsList(); - if (type == 0){ //使用 - ItemLogic.getInstance().useItem(iSession,itemList); - }else if (type ==1){// 分解道具 - ItemLogic.getInstance().priceItem(iSession,itemList); - } else if (type == 2){ //分解装备 - ItemLogic.getInstance().decomposeEquip(iSession,equipIdsList); - } else if(type==3){ - // 验证是否可以使用功能,恭送神将 - String[] heroIds = new String[heroIdsList.size()]; - heroIdsList.toArray(heroIds); - boolean useFunction = HeroLogic.getInstance().isUseFunction(iSession.getUid(), HongMengFunctionEnum.FAREWELL_HERO.getPropertyId(), heroIds); - if (!useFunction){ - throw new ErrorCodeException(ErrorCode.HONGMENG_ING); - } - CommonProto.Drop.Builder baseBuilder =ItemLogic.getInstance().decomposeHero(iSession,heroIdsList,null, MessageTypeProto.MessageType.USER_AND_PRICE_ITEM_RESPONSE_VALUE); - ItemLogic.sendUseAndPriceItemMessage(iSession, MessageTypeProto.MessageType.USER_AND_PRICE_ITEM_RESPONSE_VALUE, baseBuilder); - //鸿蒙阵 - HeroLogic.getInstance().addOrUpdateHongmeng(iSession); - }else if(type==4){//分解宝器 - ItemLogic.getInstance().decomposeJewel(iSession,equipIdsList); - }else if(type==6){ - ItemLogic.getInstance().useItem(iSession,itemList,useAndPriceItemRequest.getItemId()); - }else if (type==7){//资源包 可以获取指定挂机奖励 - int uid = iSession.getUid(); - User user = UserManager.getUser(uid); - int itemId=useAndPriceItemRequest.getItemsList().get(0).getItemId(); - SItem sItem=SItem.getsItemMap().get(itemId); - if (user.getPlayerInfoManager().getLevel()costMap=new HashMap<>(); - costMap.put(itemId,useNum); - int[][]rewardArr=sItem.getUseGain(); - boolean isCost= ItemUtil.itemCost(user, costMap, BIReason.USER_ITEM, 0); - if (!isCost){ - LOGGER.error("资源包道具消耗失败"); - throw new ErrorCodeException(ErrorCode.HANDLE_FAILED); - } - long[][]dropArr=useItemGetHookReward(user,rewardArr,useNum); - ItemUtil.drop(user,dropArr,BIReason.USER_ITEM); - CommonProto.Drop.Builder drop = ItemUtil.drop(user, dropArr, BIReason.USER_ITEM); - ItemLogic.sendUseAndPriceItemMessage(iSession, MessageTypeProto.MessageType.USER_AND_PRICE_ITEM_RESPONSE_VALUE, drop); + switch (type){ + case 0://使用道具 + ItemLogic.getInstance().useItem(iSession,itemList); + break; + case 1://分解道具 + ItemLogic.getInstance().priceItem(iSession,itemList); + break; + case 2://分解装备 + ItemLogic.getInstance().decomposeEquip(iSession,equipIdsList); + break; + case 3://恭送(分解)神将 + ItemLogic.getInstance().decomposeHero(iSession,heroIdsList,null); + break; + case 4://分解宝器 + ItemLogic.getInstance().decomposeJewel(iSession,equipIdsList); + break; + case 6: + ItemLogic.getInstance().useItem(iSession,itemList,useAndPriceItemRequest.getItemId()); + break; + case 7://资源包 可以获取指定挂机奖励 + ItemLogic.getInstance().getAssignInIdleReward(iSession,useAndPriceItemRequest); + break; + default: + throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); } - else{ - throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); - } - } - - /** - * 使用道具获取挂机奖励里面的指定时长奖励 - * @param user - * @param itemDropTime - * @return - * @throws ErrorCodeException - */ - public long[][] useItemGetHookReward(User user, int[][] itemDropTime,long useNum)throws ErrorCodeException{ - long[][]dropArr=new long[itemDropTime.length][2]; - int index=0; - for (int i = 0; i < itemDropTime.length; i++) { - int itemId=itemDropTime[i][0]; - int dropRatio=itemDropTime[i][1]; - ItemMap itemObj=new ItemMap(); - int fightId = user.getMainLevelManager().getFightId(); - SMainLevelConfig targetMainLevelConfig = SMainLevelConfig.config.get(fightId); - - int[] randomRewardMin = targetMainLevelConfig.getRandomRewardMin(); - int[] randomReward = targetMainLevelConfig.getRandomReward(); - - ItemUtil.combineRewardByMainLine(user,false, true, randomRewardMin, dropRatio,itemObj,BIReason.ADVENTURE_BASE_REWARD); - ItemUtil.combineRewardByMainLine(user,true, false,randomReward, dropRatio,itemObj,BIReason.ADVENTURE_RANDOM_REWARDD); - if (itemObj.getItemMap().containsKey(itemId)){ - dropArr[index][0]=itemId; - dropArr[index][1]=itemObj.getItemMap().get(itemId)*useNum; - index++; - } - } - return dropArr; - } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/item/ItemLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/item/ItemLogic.java index 0c18dc3ad..33f534aac 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/item/ItemLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/item/ItemLogic.java @@ -236,6 +236,68 @@ public class ItemLogic { } + /** + * 资源包 可以获取指定挂机奖励 + * @param iSession + * @param proto + * @throws Exception + */ + public void getAssignInIdleReward(ISession iSession, PlayerInfoProto.UseAndPriceItemRequest proto) throws Exception { + User user = UserManager.getUser(iSession.getUid()); + int itemId=proto.getItemsList().get(0).getItemId(); + SItem sItem=SItem.getsItemMap().get(itemId); + if (user.getPlayerInfoManager().getLevel()costMap=new HashMap<>(); + costMap.put(itemId,useNum); + int[][]rewardArr=sItem.getUseGain(); + + boolean isCost= ItemUtil.itemCost(user, costMap, BIReason.USER_ITEM, 0); + if (!isCost){ + LOGGER.error("资源包道具消耗失败"); + throw new ErrorCodeException(ErrorCode.HANDLE_FAILED); + } + long[][]dropArr=useItemGetHookReward(user,rewardArr,useNum); + ItemUtil.drop(user,dropArr,BIReason.USER_ITEM); + CommonProto.Drop.Builder drop = ItemUtil.drop(user, dropArr, BIReason.USER_ITEM); + ItemLogic.sendUseAndPriceItemMessage(iSession, MessageTypeProto.MessageType.USER_AND_PRICE_ITEM_RESPONSE_VALUE, drop); + } + + /** + * 使用道具获取挂机奖励里面的指定时长奖励 + * @param user + * @param itemDropTime + * @return + * @throws ErrorCodeException + */ + public long[][] useItemGetHookReward(User user, int[][] itemDropTime,long useNum)throws ErrorCodeException{ + long[][]dropArr=new long[itemDropTime.length][2]; + int index=0; + for (int i = 0; i < itemDropTime.length; i++) { + int itemId=itemDropTime[i][0]; + int dropRatio=itemDropTime[i][1]; + ItemMap itemObj=new ItemMap(); + int fightId = user.getMainLevelManager().getFightId(); + SMainLevelConfig targetMainLevelConfig = SMainLevelConfig.config.get(fightId); + + int[] randomRewardMin = targetMainLevelConfig.getRandomRewardMin(); + int[] randomReward = targetMainLevelConfig.getRandomReward(); + + ItemUtil.combineRewardByMainLine(user,false, true, randomRewardMin, dropRatio,itemObj,BIReason.ADVENTURE_BASE_REWARD); + ItemUtil.combineRewardByMainLine(user,true, false,randomReward, dropRatio,itemObj,BIReason.ADVENTURE_RANDOM_REWARDD); + if (itemObj.getItemMap().containsKey(itemId)){ + dropArr[index][0]=itemId; + dropArr[index][1]=itemObj.getItemMap().get(itemId)*useNum; + index++; + } + } + return dropArr; + + } + /** * 使用选择宝箱道具 */ @@ -354,66 +416,36 @@ public class ItemLogic { reportIdLevelQuality.append("|"); } reportIdLevelQuality.append(jewel.getEquipId()).append("-").append(jewel.getLevel()).append("-").append(jewel.getBuildLevel()); - if (jewel.getLevel() != 0) { + // 强化 + if (jewel.getLevel() > 0) { Map rankupConfigMap = SJewelRankupConfig.rankupMap.get(config.getLevelupPool()).get(1); - for (SJewelRankupConfig value : rankupConfigMap.values()) { - if (value.getLevel() < propertyItem.getLevel()) { - items.addAll(Arrays.asList(value.getUpExpend())); - if (value.getJewelExpend().length < 1) { - continue; - } - for (int[] count : value.getJewelExpend()) { - if (count[0] == 1) { - items.add(new int[]{jewel.getEquipId(), count[1]}); - } else { - items.add(count); - } - } - } - } + jewelCostBack(rankupConfigMap,jewel,items,jewel.getLevel()); } - if (jewel.getBuildLevel() != 0) { + // 精炼 + if (jewel.getBuildLevel() > 0) { Map buildUpConfigMap = SJewelRankupConfig.rankupMap.get(config.getRankupPool()).get(2); - for (SJewelRankupConfig value : buildUpConfigMap.values()) { - if (value.getLevel() < jewel.getBuildLevel()) { - items.addAll(Arrays.asList(value.getUpExpend())); - if (value.getJewelExpend().length < 1) { - continue; - } - for (int[] count : value.getJewelExpend()) { - if (count[0] == 1) { - items.add(new int[]{jewel.getEquipId(), count[1]}); - } else { - items.add(count); - } - } - } - } + jewelCostBack(buildUpConfigMap,jewel,items,jewel.getBuildLevel()); } + // 神应 + if (jewel.getGodTreeLv() > 0){ + TreeMap treeMap = new TreeMap<>(STableManager.getConfig(SGodHoodTreeLevel.class)); + SortedMap subMap = treeMap.subMap(0, jewel.getGodTreeLv()); + List collect = subMap.values().stream().map(SGodHoodTreeLevel::getLvupCost).collect(Collectors.toList()); + items.addAll(collect); + } + items.add(new int[]{propertyItem.getEquipId(), 1}); } for (String jewelId : jewelList) { user.getEquipManager().remove(jewelId); } - - CommonProto.Drop.Builder drop = ItemUtil.drop(user, StringUtil.parseFiledInt(reward.toString()), 1, 0, BIReason.JEWEL_DECOMPOSE); - - -// ItemMap itemObj = new ItemMap(); -// for (int[] ints : items) { -// long mapNum= ItemUtil.getMapById(ints[0], itemObj); -// if(mapNum>0){ -// -// } -// if (mapRe.containsKey(ints[0])) { -// mapRe.put(ints[0], mapRe.get(ints[0]) + ints[1]); -// } else { -// mapRe.put(ints[0], (long) ints[1]); -// } -// } + items.add(StringUtil.parseFiledInt(reward.toString())); int[][] itemArray = items.toArray(new int[items.size()][]); - ItemUtil.drop(user,itemArray, drop, BIReason.JEWEL_DECOMPOSE); + CommonProto.Drop.Builder drop = ItemUtil.drop(user, itemArray, BIReason.JEWEL_DECOMPOSE); + // 协议返回 + sendUseAndPriceItemMessage(session, MessageTypeProto.MessageType.USER_AND_PRICE_ITEM_RESPONSE_VALUE, drop); + // 日志上报 List reportMap = drop.getItemlistList(); List itemId = new ArrayList<>(reportMap.size()); List itemNum = new ArrayList<>(reportMap.size()); @@ -422,7 +454,25 @@ public class ItemLogic { itemNum.add((int)item.getItemNum()); }); ReportUtil.onReportEvent(user, ReportEventEnum.TREASURE_DECOMPOSITION.getType(), reportIdLevelQuality.toString(), itemId, itemNum); - sendUseAndPriceItemMessage(session, MessageTypeProto.MessageType.USER_AND_PRICE_ITEM_RESPONSE_VALUE, drop); + } + + private void jewelCostBack(Map map, Jewel jewel, List items, int level){ + for (SJewelRankupConfig value : map.values()) { + if (value.getLevel() >= level) { + continue; + } + items.addAll(Arrays.asList(value.getUpExpend())); + if (value.getJewelExpend().length < 1) { + continue; + } + for (int[] count : value.getJewelExpend()) { + if (count[0] == 1) { + items.add(new int[]{jewel.getEquipId(), count[1]}); + } else { + items.add(count); + } + } + } } private ErrorCode checkEquipResolve(List equipIdsList, EquipManager equipManager) { @@ -460,9 +510,16 @@ public class ItemLogic { * @param iSession * @param heroIdsList */ - public CommonProto.Drop.Builder decomposeHero(ISession iSession, List heroIdsList, Set filterItem, int msgId) throws Exception { - int uid = iSession.getUid(); - User user = UserManager.getUser(uid); + public void decomposeHero(ISession iSession, List heroIdsList, Set filterItem) throws Exception { + // 验证是否可以使用功能,恭送神将 + String[] heroIds = new String[heroIdsList.size()]; + heroIdsList.toArray(heroIds); + boolean useFunction = HeroLogic.getInstance().isUseFunction(iSession.getUid(), HongMengFunctionEnum.FAREWELL_HERO.getPropertyId(), heroIds); + if (!useFunction){ + throw new ErrorCodeException(ErrorCode.HONGMENG_ING); + } + // 逻辑 + User user = UserManager.getUser(iSession.getUid()); HeroManager heroManager = user.getHeroManager(); ErrorCode erroMags = checkHeroResolve(heroIdsList, user); if (null != erroMags) { @@ -509,7 +566,7 @@ public class ItemLogic { heroLevelReport.add(hero.getOriginalLevel()); heroStarReport.add(hero.getStar()); - heroManager.removeHero(uid,heroId); + heroManager.removeHero(user.getId(),heroId); int[][] sumConsume = SHeroLevlConfig.getsHeroLevlConfigMap().get(hero.getOriginalLevel()).getSumConsume(); SHeroSacrifice starSHeroSacrifice = STableManager.getFigureConfig(HeroStaticConfig.class).getsHeroSacrificeMap(1, hero.getStar()); @@ -546,9 +603,11 @@ public class ItemLogic { if (reson == BIReason.DECOMPOS_HERO_REWARD) { ReportUtil.onReportEvent(user, ReportEventEnum.SEND_HERO.getType(), heroIdReport, heroLevelReport, heroStarReport, new ArrayList<>(baseItemMap.keySet()), new ArrayList<>(baseItemMap.values())); } - + // 掉落 ItemUtil.drop(user,itemReturnPercent(itemArray,rankUpReturnPercent),reson,drop); - return drop; + // 鸿蒙阵 + HeroLogic.getInstance().addOrUpdateHongmeng(iSession); + ItemLogic.sendUseAndPriceItemMessage(iSession, MessageTypeProto.MessageType.USER_AND_PRICE_ITEM_RESPONSE_VALUE, drop); } /** @@ -792,23 +851,24 @@ public class ItemLogic { public static TreeSet getJewelEquipWithLeve(User user, int type, int rance, int leve) { TreeSet strings = new TreeSet<>(); for (Map.Entry stringPropertyItemEntry : user.getEquipManager().getEquipMap().entrySet()) { - SJewelConfig config = STableManager.getConfig(SJewelConfig.class).get(stringPropertyItemEntry.getValue().getEquipId()); + Jewel jewel = (Jewel)stringPropertyItemEntry.getValue(); + SJewelConfig config = STableManager.getConfig(SJewelConfig.class).get(jewel.getEquipId()); if (config == null) { continue; } if (config.getLocation() != type || config.getRace() != rance || config.getLevel() != leve) { continue; } - if (!StringUtil.isEmpty(stringPropertyItemEntry.getValue().getHeroId())) { - Hero hero = user.getHeroManager().getHero(stringPropertyItemEntry.getValue().getHeroId()); + if (!StringUtil.isEmpty(jewel.getHeroId())) { + Hero hero = user.getHeroManager().getHero(jewel.getHeroId()); if (hero != null && hero.getJewelInfo().contains(stringPropertyItemEntry.getKey())) { continue; } } - if (((Jewel) stringPropertyItemEntry.getValue()).getBuildLevel() != 0 || stringPropertyItemEntry.getValue().getLevel() != 0) { + if (jewel.getBuildLevel() != 0 || jewel.getLevel() != 0 || jewel.getGodTreeLv() != 0) { continue; } - strings.add(stringPropertyItemEntry.getValue().getId()); + strings.add(jewel.getId()); } return strings; }