diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/UpHeroStarHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/UpHeroStarHandler.java index d8a7b767a..93b1000ac 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/UpHeroStarHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/UpHeroStarHandler.java @@ -10,6 +10,7 @@ import rpc.protocols.HeroInfoProto; import rpc.protocols.MessageTypeProto; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.List; @Component @@ -36,10 +37,14 @@ public class UpHeroStarHandler extends BaseHandler heroIdsList = consumeMaterialsList.get(i).getHeroIdsList(); - String[] heroIds = new String[heroIdsList.size()]; - heroIdsList.toArray(heroIds); + for (HeroInfoProto.ConsumeMaterial material : consumeMaterialsList) { + List heroIdsList = new ArrayList<>(); + // 获取英雄id + material.getHeroIdsList().stream() + .filter(v->v.getType() == 1) + .forEach(v->heroIdsList.add(v.getItemId())); + String[] heroIds = heroIdsList.toArray(new String[0]); + // 验证神将是否可以消耗 useFunction = HeroLogic.getInstance().isUseFunction(iSession.getUid(), HongMengFunctionEnum.PASSIVE_EAT.getPropertyId(), heroIds); if (!useFunction){ throw new ErrorCodeException(ErrorCode.HONGMENG_ING); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/hero/HeroLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/hero/HeroLogic.java index 494ab939f..3eba5e4c1 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/hero/HeroLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/hero/HeroLogic.java @@ -990,81 +990,98 @@ public class HeroLogic{ if(consumeMaterialInfoByPosition ==null){ throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); } - boolean canUse = true; - Set removeHeroIds = new HashSet<>(); + int needTotalHeroNums = 0; if(consumeMaterialInfoByPosition.size()!=consumeMaterialsList.size()){ throw new ErrorCodeException(ErrorCode.HERO_UN_MATCH); } //判断编队 for(HeroInfoProto.ConsumeMaterial consumeMaterial1 : consumeMaterialsList) { - List heroIdsList = consumeMaterial1.getHeroIdsList(); + List heroIdsList = new ArrayList<>(); + consumeMaterial1.getHeroIdsList().stream() + .filter(v->v.getType() == 1) + .forEach(v->heroIdsList.add(v.getItemId())); ErrorCode err = ItemLogic.getInstance().checkHeroResolve(heroIdsList, user); if(null!=err){ throw new ErrorCodeException(err); } } + List removeHeroIds = new ArrayList<>(); + HashMap removeItemMap = new HashMap<>(); StringBuilder reportConsumeHero = new StringBuilder(); + for(HeroInfoProto.ConsumeMaterial consumeMaterial1 : consumeMaterialsList){ int position = consumeMaterial1.getPosition(); SCHero.ConsumeMaterialInfo consumeMaterialInfo = consumeMaterialInfoByPosition.get(position); int nums = consumeMaterialInfo.getNums(); needTotalHeroNums+=nums; - List heroIdsList = consumeMaterial1.getHeroIdsList(); + List list = consumeMaterial1.getHeroIdsList(); SHeroRankupGroup sHeroRankupGroup = STableManager.getConfig(SHeroRankupGroup.class).get(consumeMaterialInfo.getGroupID()); int isSame = sHeroRankupGroup.getIssame(); int starLimit = sHeroRankupGroup.getStarLimit(); int isSameClan = sHeroRankupGroup.getIsSameClan(); int isId = sHeroRankupGroup.getIsId(); - for(String consumeHero : heroIdsList){ - Hero hero = heroManager.getHero(consumeHero); - if( null == hero ){ - throw new ErrorCodeException(ErrorCode.HERO_UN_MATCH); - } - //上报消耗的英雄数据 - if(reportConsumeHero.length()>0){ - reportConsumeHero.append("|"); - } - reportConsumeHero.append(hero.getTemplateId()).append("-").append(hero.getStar()).append("-").append(hero.getLevel(user.getHeroManager())); - - - if( 1 == isSame) { - if(hero.getTemplateId() != targetHero.getTemplateId()){ + List items = Arrays.stream(sHeroRankupGroup.getItems()).boxed().collect(Collectors.toList()); + for(HeroInfoProto.ConsumeItem consume : list){ + // 英雄 + if (consume.getType() == 1){ + Hero hero = heroManager.getHero(consume.getItemId()); + if( null == hero ){ throw new ErrorCodeException(ErrorCode.HERO_UN_MATCH); } - } - - if( starLimit != 0 ) { - if(hero.getStar() != starLimit){ - throw new ErrorCodeException(ErrorCode.HERO_UN_MATCH); + //上报消耗的英雄数据 + if(reportConsumeHero.length()>0){ + reportConsumeHero.append("|"); } - } + reportConsumeHero.append(hero.getTemplateId()).append("-").append(hero.getStar()).append("-").append(hero.getLevel(user.getHeroManager())); - if( 1 == isSameClan) { - SCHero scHeroTmp = SCHero.getsCHero().get(hero.getTemplateId()); - SCHero targetSHero = SCHero.getsCHero().get(targetHero.getTemplateId()); - if( scHeroTmp.getPropertyName() != targetSHero.getPropertyName() ){ - throw new ErrorCodeException(ErrorCode.HERO_UN_MATCH); - } - } - if( isId != 0) { - if(hero.getTemplateId() != isId){ - throw new ErrorCodeException(ErrorCode.HERO_UN_MATCH); + if( 1 == isSame) { + if(hero.getTemplateId() != targetHero.getTemplateId()){ + throw new ErrorCodeException(ErrorCode.HERO_UN_MATCH); + } } + + if( starLimit != 0 ) { + if(hero.getStar() != starLimit){ + throw new ErrorCodeException(ErrorCode.HERO_UN_MATCH); + } + } + + if( 1 == isSameClan) { + SCHero scHeroTmp = SCHero.getsCHero().get(hero.getTemplateId()); + SCHero targetSHero = SCHero.getsCHero().get(targetHero.getTemplateId()); + if( scHeroTmp.getPropertyName() != targetSHero.getPropertyName() ){ + throw new ErrorCodeException(ErrorCode.HERO_UN_MATCH); + } + } + + if(isId != 0) { + if(hero.getTemplateId() != isId){ + throw new ErrorCodeException(ErrorCode.HERO_UN_MATCH); + } + } + removeHeroIds.add(consume.getItemId()); + } + // 道具 + else { + if (!items.contains(Integer.parseInt(consume.getItemId()))){ + throw new ErrorCodeException(ErrorCode.HERO_ITEM_NOT); + } + Integer num = removeItemMap.getOrDefault(Integer.parseInt(consume.getItemId()), 0); + removeItemMap.put(Integer.parseInt(consume.getItemId()),num+1); } - removeHeroIds.add(consumeHero); } - + // 校验道具数量 + boolean cost = ItemUtil.checkCost(user, removeItemMap); + if (!cost){ + throw new ErrorCodeException(ErrorCode.HERO_ITEM_NOT); + } } - if(needTotalHeroNums!=removeHeroIds.size()){ - canUse=false; + if(needTotalHeroNums != (removeHeroIds.size()+removeItemMap.size())){ LOGGER.error("hero num not enough"); - } - - if(!canUse){ throw new ErrorCodeException(ErrorCode.HERO_UN_MATCH); } @@ -1074,16 +1091,16 @@ public class HeroLogic{ throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); } - //删除hero -// CommonProto.Drop.Builder baseBuilder = ItemLogic.getInstance().decomposeHero(session,new LinkedList<>(removeHeroIds),Collections.singleton(26),MessageTypeProto.MessageType.UP_HERO_STAR_RESPONSE_VALUE); //改成归元获得,同时返还法宝获得 CommonProto.Drop.Builder baseBuilder = heroBackDrop(user,new ArrayList<>(removeHeroIds),10000,BIReason.UPHERO_DECOMPOS_HERO_REWARD,true); + // 删除英雄 for(String rmHeroId:removeHeroIds){ heroManager.removeHero(uid,rmHeroId); } + // 消耗道具 + ItemUtil.itemCost(user,removeItemMap,BIReason.COMPLEX_EQUIP_CONSUME,0); -// recyleHeroBySystem(user,removeHeroIds); rankUpHeroExecute(targetHero); Poster.getPoster().dispatchEvent(new HeroUpStarEvent(user.getId(),targetHero.getTemplateId(),targetHero.getStar())); if (targetHero.getStar()>=5&&targetHero.getStar()!=15){ @@ -1092,15 +1109,13 @@ public class HeroLogic{ } } -// if(targetHero.getStar()==5){ -// Poster.getPoster().dispatchEvent(new HeroFiveStarGetEvent(user.getId())); -// } targetHero.setStarBreakId(scHeroRankUpConfig.getId()); user.getUserMissionManager().onGameEvent(user,GameEvent.HERO_UP,2,targetHero.getTemplateId(),targetHero.getStar()); user.getUserMissionManager().onGameEvent(user,GameEvent.GET_HERO,targetHero.getTemplateId(),targetHero.getStar()); if(isInTeam(user,heroId,1)){ Poster.getPoster().dispatchEvent(new UserMainTeamForceEvent(session.getUid())); } + if (targetHero.getStar() >= SSpecialConfig.getIntegerValue(SSpecialConfig.lamp_awaken_hero_content_parm)) { Set hongmengMaxLevel = heroManager.getHongmengMaxLevel(); boolean add = hongmengMaxLevel.add(targetHero.getTemplateId()); @@ -1124,9 +1139,10 @@ public class HeroLogic{ } String consume = StringUtil.parseArrayToString(consumeMaterial); -// HERO_STRENGTHEN(13,"hero_strengthen", new CommonEventHandler(),new String[]{"hero_id","old_quality","new_quality","strengthen_type","cost_item_list","cost_hero_list"}), ReportUtil.onReportEvent(user, ReportEventEnum.HERO_STRENGTHEN.getType(),String.valueOf(targetHero.getTemplateId()),String.valueOf(oldStar),String.valueOf(targetHero.getStar()),consume,reportConsumeHero.toString()); } + + private void rankUpHeroExecute(Hero hero)throws Exception { //是否解锁法宝 SGameSetting gameSetting = STableManager.getFigureConfig(CommonStaticConfig.class).getGameSetting(); diff --git a/tablemanager/src/main/java/config/SHeroRankupGroup.java b/tablemanager/src/main/java/config/SHeroRankupGroup.java index 16d9478d9..0b8b8fb11 100644 --- a/tablemanager/src/main/java/config/SHeroRankupGroup.java +++ b/tablemanager/src/main/java/config/SHeroRankupGroup.java @@ -15,6 +15,7 @@ public class SHeroRankupGroup implements BaseConfig { private int isId; + private int[] items; @Override public void init() throws Exception { @@ -40,5 +41,7 @@ public class SHeroRankupGroup implements BaseConfig { return isId; } - + public int[] getItems() { + return items; + } } \ No newline at end of file diff --git a/test/src/main/java/com/ljsd/network/client/NettyClient.java b/test/src/main/java/com/ljsd/network/client/NettyClient.java index 76b7dcab4..df3c191b2 100644 --- a/test/src/main/java/com/ljsd/network/client/NettyClient.java +++ b/test/src/main/java/com/ljsd/network/client/NettyClient.java @@ -256,10 +256,11 @@ public class NettyClient { public HeroInfoProto.UpHeroStarRequest upHeroStar(){ String heroId = ""; List consumeMaterialsList = new ArrayList<>(); - consumeMaterialsList.add(HeroInfoProto.ConsumeMaterial.newBuilder().setPosition(1).addHeroIds("").build()); - consumeMaterialsList.add(HeroInfoProto.ConsumeMaterial.newBuilder().setPosition(2).addHeroIds("").build()); - consumeMaterialsList.add(HeroInfoProto.ConsumeMaterial.newBuilder().setPosition(3).addHeroIds("").build()); - consumeMaterialsList.add(HeroInfoProto.ConsumeMaterial.newBuilder().setPosition(4).addHeroIds("").build()); + HeroInfoProto.ConsumeItem.Builder builder = HeroInfoProto.ConsumeItem.newBuilder(); + consumeMaterialsList.add(HeroInfoProto.ConsumeMaterial.newBuilder().setPosition(1).addHeroIds(builder).build()); + consumeMaterialsList.add(HeroInfoProto.ConsumeMaterial.newBuilder().setPosition(2).addHeroIds(builder).build()); + consumeMaterialsList.add(HeroInfoProto.ConsumeMaterial.newBuilder().setPosition(3).addHeroIds(builder).build()); + consumeMaterialsList.add(HeroInfoProto.ConsumeMaterial.newBuilder().setPosition(4).addHeroIds(builder).build()); return HeroInfoProto.UpHeroStarRequest.newBuilder().setHeroId(heroId).addAllConsumeMaterials(consumeMaterialsList).build(); }