diff --git a/serverlogic/src/main/java/com/ljsd/jieling/globals/GlobalItemType.java b/serverlogic/src/main/java/com/ljsd/jieling/globals/GlobalItemType.java index eb8c78fa0..aef0070af 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/globals/GlobalItemType.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/globals/GlobalItemType.java @@ -6,7 +6,7 @@ public interface GlobalItemType { int WEIGHT_DROP = 2; //随机掉落 int SUCCESSIVELY_RANDOM = 3; // 依次随机 int SELETEONE = 4; //n 选1 - + int NO_REPEATED_FIX_COUNT = 5;//按照物品在组内的占比出(不可重复) // 物品类型 int GEM = 3; // 钻石Id(充值获得) int ITEM = 0; //道具 @@ -32,6 +32,8 @@ public interface GlobalItemType { int SELECTSecretBox=20; // 自选宝箱(前端要区分) int SpecialMonster=21; // 灵兽 int SpecialMonsterItem=22; // 灵兽碎片 + // 万能狗粮 + int AllPowerful_DogFood = 25; //物品使用类型 int NO_USE = 0 ; //不使用 int RANDOM_USE = 1; // 随机使用 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 91b42e349..a089515e7 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,108 @@ 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(); - ErrorCode err = ItemLogic.getInstance().checkHeroResolve(heroIdsList, user); + List heroIdsList = new ArrayList<>(); + consumeMaterial1.getHeroIdsList().stream() + .filter(v->v.getType() == 1) + .forEach(v->heroIdsList.add(v.getItemId())); + ErrorCode err = null; + if (heroIdsList.size() > 0){ + 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()); + // 专属道具代替 + int[][] itemCamp = sHeroRankupGroup.getItemCamp(); + 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 { + int itemId = Integer.parseInt(consume.getItemId()); + if (!items.contains(itemId)){ + boolean camp = upStartItemCamp(scHero.getPropertyName(), itemCamp, itemId); + if (!camp){ + throw new ErrorCodeException(ErrorCode.HERO_ITEM_NOT); + } + } + Integer num = removeItemMap.getOrDefault(itemId, 0); + removeItemMap.put(itemId,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 +1101,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 +1119,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 +1149,26 @@ 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()); } + + /** + * 升星验证同系道具 + * @param type + * @param itemCamp + * @param itemId + * @return + */ + private boolean upStartItemCamp(int type,int[][] itemCamp,int itemId){ + for (int[] ints : itemCamp) { + if (type == ints[0] && itemId == ints[1]){ + return true; + } + } + return false; + } + + private void rankUpHeroExecute(Hero hero)throws Exception { //是否解锁法宝 SGameSetting gameSetting = STableManager.getFigureConfig(CommonStaticConfig.class).getGameSetting(); @@ -1238,7 +1280,7 @@ public class HeroLogic{ // 聚合::根据openlevel倒序,输出list List collect = rankUpConfigs.stream().sorted(Comparator.comparing(SCHeroRankUpConfig::getOpenLevel).reversed()).collect(Collectors.toList()); for(SCHeroRankUpConfig scHeroRankUpConfig : collect){ - if (heroLevel >= scHeroRankUpConfig.getOpenLevel()){ + if (heroLevel > scHeroRankUpConfig.getOpenLevel()){ if (scHeroRankUpConfig.getOpenStar() > 10){ continue; } @@ -1265,7 +1307,7 @@ public class HeroLogic{ // 聚合:根据openlevel倒叙排序,输出成list List collect = rankUpConfigs.stream().sorted(Comparator.comparing(SCHeroRankUpConfig::getOpenLevel).reversed()).collect(Collectors.toList()); for(SCHeroRankUpConfig scHeroRankUpConfig : collect){ - if (heroLevel >= scHeroRankUpConfig.getLimitLevel()){ + if (heroLevel > scHeroRankUpConfig.getLimitLevel()){ return scHeroRankUpConfig.getId(); } } @@ -1292,9 +1334,11 @@ public class HeroLogic{ // 聚合::根据openlevel倒序,输出list List collect = rankUpStar.stream().sorted(Comparator.comparing(SCHeroRankUpConfig::getOpenLevel).reversed()).collect(Collectors.toList()); for(SCHeroRankUpConfig val : collect){ - if (heroLevel >= val.getOpenLevel()){ + if (heroLevel > val.getOpenLevel()){ + // 计算星级需要+1操作 + int result = val.getOpenStar()+1; // 机器人生成星级,最高10星 - return val.getOpenStar()>10?10:val.getOpenStar(); + return result>10?10:result; } } } @@ -1306,7 +1350,7 @@ public class HeroLogic{ // 聚合:根据openlevel倒叙排序,输出成list List collect = rankUpBreak.stream().sorted(Comparator.comparing(SCHeroRankUpConfig::getOpenLevel).reversed()).collect(Collectors.toList()); for(SCHeroRankUpConfig val : collect){ - if (heroLevel >= val.getLimitLevel()){ + if (heroLevel > val.getLimitLevel()){ return val.getOpenStar()>10?10:val.getOpenStar(); } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/CarDealyGuildRank.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/CarDealyGuildRank.java index 206cf0309..ddd65640b 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/CarDealyGuildRank.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/CarDealyGuildRank.java @@ -27,10 +27,6 @@ public class CarDealyGuildRank extends AbstractRank{ @Override protected void getOptional(int index, ZSetOperations.TypedTuple data, PlayerInfoProto.RankResponse.Builder builder) throws Exception { - User everyUser = UserManager.getUser(Integer.parseInt(data.getValue()), true); - if (everyUser == null){ - return; - } String value = data.getValue(); int guildId = Integer.parseInt(value); GuildInfo guildInfo = GuilidManager.guildInfoMap.get(guildId); @@ -46,10 +42,6 @@ public class CarDealyGuildRank extends AbstractRank{ CommonProto.UserRank everyRank = CommonProto.UserRank.newBuilder() .setGuildName(familyName) .setRankInfo(everyRankInfo) - .setSex(everyUser.getPlayerInfoManager().getSex()) - .setUserSkin(everyUser.getPlayerInfoManager().getUserSkin()) - .setUserTitle(everyUser.getPlayerInfoManager().getUserTitle()) - .setUserMount(everyUser.getPlayerInfoManager().getUserMount()) .build(); builder.addRanks(everyRank); } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/DeathPathEveryGuildRank.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/DeathPathEveryGuildRank.java index d162341f0..949cbff9d 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/DeathPathEveryGuildRank.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/DeathPathEveryGuildRank.java @@ -22,15 +22,6 @@ public class DeathPathEveryGuildRank extends AbstractRank { protected void getOptional(int index, ZSetOperations.TypedTuple data, PlayerInfoProto.RankResponse.Builder builder) { GuildInfo guildInfo = GuilidManager.guildInfoMap.get(Integer.parseInt(data.getValue())); - User everyUser = null; - try{ - everyUser = UserManager.getUser(Integer.parseInt(data.getValue()), true); - if (everyUser == null){ - return; - } - }catch(Exception e){ - e.printStackTrace(); - } CommonProto.RankInfo.Builder everyRankInfo = CommonProto.RankInfo.newBuilder() .setRank(index) .setParam1(getParam1(data.getScore())) @@ -39,11 +30,7 @@ public class DeathPathEveryGuildRank extends AbstractRank { CommonProto.UserRank.Builder everyRank = CommonProto.UserRank.newBuilder() .setUid(guildInfo.getId()) .setGuildName(guildInfo.getName()) - .setRankInfo(everyRankInfo) - .setSex(everyUser.getPlayerInfoManager().getSex()) - .setUserSkin(everyUser.getPlayerInfoManager().getUserSkin()) - .setUserTitle(everyUser.getPlayerInfoManager().getUserTitle()) - .setUserMount(everyUser.getPlayerInfoManager().getUserMount()); + .setRankInfo(everyRankInfo); builder.addRanks(everyRank); } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/DeathPathTotalGuildRank.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/DeathPathTotalGuildRank.java index 3b0890cab..aca685928 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/DeathPathTotalGuildRank.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/DeathPathTotalGuildRank.java @@ -40,10 +40,6 @@ public class DeathPathTotalGuildRank extends AbstractRank{ } protected void getOptional(int index, ZSetOperations.TypedTuple data, PlayerInfoProto.RankResponse.Builder builder) throws Exception { - User everyUser = UserManager.getUser(Integer.parseInt(data.getValue()), true); - if (everyUser == null){ - return; - } GuildInfo guildInfo = GuilidManager.guildInfoMap.get(Integer.parseInt(data.getValue())); DeathChallengeCount countInfo = RedisUtil.getInstence().get(RedisKey.DEATH_PATH_TOTAL_CHALLENGE_COUNT, String.valueOf(guildInfo.getId()), DeathChallengeCount.class); CommonProto.RankInfo.Builder everyRankInfo = CommonProto.RankInfo.newBuilder() @@ -54,11 +50,7 @@ public class DeathPathTotalGuildRank extends AbstractRank{ CommonProto.UserRank.Builder everyRank = CommonProto.UserRank.newBuilder() .setUid(guildInfo.getId()) .setGuildName(guildInfo.getName()) - .setRankInfo(everyRankInfo) - .setSex(everyUser.getPlayerInfoManager().getSex()) - .setUserSkin(everyUser.getPlayerInfoManager().getUserSkin()) - .setUserTitle(everyUser.getPlayerInfoManager().getUserTitle()) - .setUserMount(everyUser.getPlayerInfoManager().getUserMount()); + .setRankInfo(everyRankInfo); builder.addRanks(everyRank); } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/GuildSheJiScoreRank.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/GuildSheJiScoreRank.java index a85d738ea..b4e80dfea 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/GuildSheJiScoreRank.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/GuildSheJiScoreRank.java @@ -46,11 +46,7 @@ public class GuildSheJiScoreRank extends AbstractRank { .setUid(user.getId()) .setLevel(user.getPlayerInfoManager().getLevel()) .setGuildName(guildInfo.getName()) - .setRankInfo(everyRankInfo) - .setSex(user.getPlayerInfoManager().getSex()) - .setUserSkin(user.getPlayerInfoManager().getUserSkin()) - .setUserTitle(user.getPlayerInfoManager().getUserTitle()) - .setUserMount(user.getPlayerInfoManager().getUserMount()); + .setRankInfo(everyRankInfo); builder.addRanks(everyRank); } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/util/CBean2Proto.java b/serverlogic/src/main/java/com/ljsd/jieling/util/CBean2Proto.java index a21f41c1f..aab69d6dd 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/util/CBean2Proto.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/util/CBean2Proto.java @@ -384,6 +384,7 @@ public class CBean2Proto { monsterBuilder.setUnitSkillIds(monsterSkillList.toString()); monsterBuilder.setUnitId(String.valueOf(sMonsterConfig.getId())); monsterBuilder.setSkinId(sMonsterConfig.getSkinId()); + monsterBuilder.setStar(sMonsterConfig.getStar()); return monsterBuilder; } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/util/ItemUtil.java b/serverlogic/src/main/java/com/ljsd/jieling/util/ItemUtil.java index 20a93a930..e595635e9 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/util/ItemUtil.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/util/ItemUtil.java @@ -414,6 +414,9 @@ public class ItemUtil { case GlobalItemType.SUCCESSIVELY_RANDOM: getSuccessivelyRandmoMap(user,sRewardGroup,rewards,weights,itemObj,dropRatio); break; + case GlobalItemType.NO_REPEATED_FIX_COUNT: + getFixRandomMap(user,sRewardGroup.getRewardMaxNum(),rewards,weights,itemObj,dropRatio); + break; default: break; } @@ -457,6 +460,29 @@ public class ItemUtil { getMap(sRewardItem.getItemId(),itemNum, itemObj,dropRatio); } } + private static void getFixRandomMap(User user,int randomItemNum ,String[] rewardArr,String[] weightArr,ItemMap itemObj,float dropRatio)throws ErrorCodeException { + + if(rewardArr.length!=weightArr.length||randomItemNum>rewardArr.length){ + throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); + } + int[][] randomArray = new int[rewardArr.length][]; + for(int i = 0 ; i 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(); }