From 8e93d63e256d1f023c3452088236cf70d129d0d1 Mon Sep 17 00:00:00 2001 From: dengdan Date: Mon, 12 Sep 2022 11:04:11 +0800 Subject: [PATCH] =?UTF-8?q?=E7=8E=89=E8=99=9A=E8=AE=BA=E9=81=93=E7=8E=A9?= =?UTF-8?q?=E6=B3=95=E8=B0=83=E6=95=B4=E4=B8=BA=E5=8D=8A=E5=85=AC=E5=B9=B3?= =?UTF-8?q?=E7=AB=9E=E6=8A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CrossYuxulundaoChallengeHandler.java | 2 +- .../handler/map/behavior/BehaviorUtil.java | 5 + .../handler/player/ViewHeroInfoHandler.java | 9 +- .../java/com/ljsd/jieling/logic/dao/Hero.java | 8 + .../ljsd/jieling/logic/fight/FightUtil.java | 161 +++++++++++++ .../ljsd/jieling/logic/hero/HeroLogic.java | 213 ++++++++++++++++++ .../jieling/logic/player/PlayerLogic.java | 129 ++++++++++- .../com/ljsd/jieling/util/CBean2Proto.java | 19 ++ 8 files changed, 540 insertions(+), 6 deletions(-) diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/crossServer/CrossYuxulundaoChallengeHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/crossServer/CrossYuxulundaoChallengeHandler.java index 6165cfaeb..fd4306a82 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/crossServer/CrossYuxulundaoChallengeHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/crossServer/CrossYuxulundaoChallengeHandler.java @@ -375,7 +375,7 @@ public class CrossYuxulundaoChallengeHandler extends BaseHandler heroFightInfos = new ArrayList<>(); List teamPosHeroInfos = user.getTeamPosManager().getTeamPosForHero().get(teamId); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/player/ViewHeroInfoHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/player/ViewHeroInfoHandler.java index 3d5688041..f8bed6865 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/player/ViewHeroInfoHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/player/ViewHeroInfoHandler.java @@ -34,6 +34,13 @@ public class ViewHeroInfoHandler extends BaseHandler,Cloneable { } return clone; } + + /** + * 获取玉虚英雄的等级 + * @return + */ + public int getYuXuLevel(){ + return this.level; + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/FightUtil.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/FightUtil.java index 5d47b700f..d3e400b98 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/FightUtil.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/FightUtil.java @@ -6,6 +6,7 @@ import com.ljsd.fight.ArenaRecord; import com.ljsd.fight.CheckFight; import com.ljsd.fight.DefFightSnapData; import com.ljsd.fight.FightType; +import com.ljsd.jieling.core.GlobalsDef; import com.ljsd.jieling.db.redis.RedisKey; import com.ljsd.jieling.db.redis.RedisUtil; import com.ljsd.jieling.exception.ErrorCode; @@ -359,6 +360,11 @@ public class FightUtil { if (teamId == TeamEnum.ENDLESS_TEAM.getTeamId()) { return getEndlessTeam(user, teamId, attackBloodMap); } + //玉虚论道队伍有统一的属性修正 + if (teamId == TeamEnum.CROSS_YU_XU_LUN_DAO_ONE.getTeamId() || teamId == TeamEnum.CROSS_YU_XU_LUN_DAO_TWO.getTeamId() + || teamId == TeamEnum.CROSS_YU_XU_LUN_DAO_THREE.getTeamId()) { + return getYuxuTeam(user, teamId, attackBloodMap,null); + } List heroFightInfos = new ArrayList<>(); List teamPosHeroInfos = user.getTeamPosManager().getTeamPosForHero().get(teamId); for (TeamPosHeroInfo teamPosHeroInfo : teamPosHeroInfos) { @@ -789,4 +795,159 @@ public class FightUtil { .build(); } } + + /** + * 获取玉虚论道战斗队伍 + * @param user + * @param teamId + * @param attackBloodMap + * @return + */ + public static CommonProto.FightTeamInfo getYuxuTeam(User user, int teamId, Map attackBloodMap + ,ArenaRecord arenaRecord) { + List heroFightInfos = new ArrayList<>(); + if(arenaRecord != null){ + int addforce = HeroLogic.getInstance().calTeamTotalForce(user, teamId, false); + arenaRecord.setAttackForce(arenaRecord.getAttackForce() + addforce); + arenaRecord.getYxldDefForce().add(addforce); + } + List teamPosHeroInfos = user.getTeamPosManager().getTeamPosForHero().get(teamId); + for (TeamPosHeroInfo teamPosHeroInfo : teamPosHeroInfos) { + Hero hero = user.getHeroManager().getHero(teamPosHeroInfo.getHeroId()); + if (hero == null) { + continue; + } + //玉虚英雄取通用属性 + Hero yuxuHero = HeroLogic.getInstance().getYuHero(hero.getTemplateId()); + if(yuxuHero == null){ + continue; + } + Map config = STableManager.getConfig(SEndlessHeroProp.class); + SEndlessHeroProp sEndlessHeroProp = config.get(hero.getTemplateId()); + Map heroAttributeMap = new HashMap<>(); + for (int[] prop : sEndlessHeroProp.getProps()) { + heroAttributeMap.put(prop[0], (long) prop[1]); + } + if (attackBloodMap != null && attackBloodMap.containsKey(teamPosHeroInfo.getHeroId())) { + heroAttributeMap.put(HeroAttributeEnum.CurHP.getPropertyId(), heroAttributeMap.get(HeroAttributeEnum.Hp.getPropertyId()) - attackBloodMap.get(teamPosHeroInfo.getHeroId()) * heroAttributeMap.get(HeroAttributeEnum.Hp.getPropertyId()) / 100); + } + heroAttributeMap.put(HeroAttributeEnum.CurHP.getPropertyId(), heroAttributeMap.get(GlobalsDef.HP_TYPE)); + StringBuilder skillSb = new StringBuilder(); + StringBuilder propertySb = new StringBuilder(); + String heroSkill = HeroLogic.getInstance().getYuxuHeroSkills(user, hero, yuxuHero,skillSb).toString(); + String property = HeroLogic.getInstance().getHeroPropertyBuilder(propertySb, hero.getPropertyId(), yuxuHero.getLevel(user.getHeroManager()), heroAttributeMap).toString(); + CommonProto.FightUnitInfo heroFightInfo = CommonProto.FightUnitInfo + .newBuilder() + .setUnitId(Integer.toString(hero.getTemplateId())) + .setUnitSkillIds(heroSkill.substring(0, heroSkill.length() - 1)) + .setProperty(property.substring(0, property.length() - 1)) + .setStar(yuxuHero.getStar()) + .setPosition(teamPosHeroInfo.getPosition()) + .setSkinId(hero.getSkin()) + .setGodSoulLv(yuxuHero.getGodSoulLv()) + .setPropertyId(hero.getPropertyId()) + .build(); + heroFightInfos.add(heroFightInfo); + } + //玉虚不继承任何英雄外的技能 + return CommonProto.FightTeamInfo. + newBuilder() + .addAllFightUnitList(heroFightInfos) + .addAllPokemonUnitList( new ArrayList<>()) + .setTeamPassiveList("") + .setSpecialPassive("") + .setForceScore(HeroLogic.getInstance().calTeamForce(user,teamId)) + .build(); + } + + /** + * 获取跨服玉虚论道战斗队伍 + * @param csPlayer + * @param crossArenaManager + * @param teamId + * @param attackBloodMap + * @return + */ + public static CommonProto.FightTeamInfo getCrossYuxuTeam(CSPlayer csPlayer,CrossArenaManager crossArenaManager, + int teamId,Map attackBloodMap,ArenaRecord arenaRecord) { + List heroFightInfos = new ArrayList<>(); + if(arenaRecord != null){ + int addforcerpc = crossArenaManager.getTotalForceByTeam().get(teamId); + arenaRecord.getYxldDefForce().add(addforcerpc); + arenaRecord.setAttackForce(arenaRecord.getAttackForce() + addforcerpc); + } + List teamPosHeroInfos = crossArenaManager.getTeams().getOrDefault(teamId, new ArrayList<>()); + for (com.ljsd.jieling.thrift.idl.TeamPosHeroInfo teamPosHeroInfo : teamPosHeroInfos) { + com.ljsd.jieling.thrift.idl.ArenaOfHero hero = crossArenaManager.getHeros().get(teamPosHeroInfo.getHeroId()); + if (hero == null) { + continue; + } + //玉虚英雄取通用属性 + Hero yuxuHero = HeroLogic.getInstance().getYuHero(hero.getTemplateId()); + if(yuxuHero == null){ + continue; + } + Map config = STableManager.getConfig(SEndlessHeroProp.class); + SEndlessHeroProp sEndlessHeroProp = config.get(hero.getTemplateId()); + Map heroAttributeMap = new HashMap<>(); + for (int[] prop : sEndlessHeroProp.getProps()) { + heroAttributeMap.put(prop[0], (long) prop[1]); + } + if (attackBloodMap != null && attackBloodMap.containsKey(teamPosHeroInfo.getHeroId())) { + heroAttributeMap.put(HeroAttributeEnum.CurHP.getPropertyId(), heroAttributeMap.get(HeroAttributeEnum.Hp.getPropertyId()) - attackBloodMap.get(teamPosHeroInfo.getHeroId()) * heroAttributeMap.get(HeroAttributeEnum.Hp.getPropertyId()) / 100); + } + heroAttributeMap.put(HeroAttributeEnum.CurHP.getPropertyId(), heroAttributeMap.get(GlobalsDef.HP_TYPE)); + StringBuilder skillSb = new StringBuilder(); + StringBuilder propertySb = new StringBuilder(); + String heroSkill = HeroLogic.getInstance().getCrossYuxuHeroSkills(crossArenaManager,hero,yuxuHero).toString(); + String property = HeroLogic.getInstance().getHeroPropertyBuilder(propertySb, hero.getPropertyId(), yuxuHero.getYuXuLevel(), heroAttributeMap).toString(); + CommonProto.FightUnitInfo heroFightInfo = CommonProto.FightUnitInfo + .newBuilder() + .setUnitId(Integer.toString(hero.getTemplateId())) + .setUnitSkillIds(heroSkill.substring(0, heroSkill.length() - 1)) + .setProperty(property.substring(0, property.length() - 1)) + .setStar(yuxuHero.getStar()) + .setPosition(teamPosHeroInfo.getPosition()) + .setSkinId(hero.getSkin()) + .setGodSoulLv(yuxuHero.getGodSoulLv()) + .setPropertyId(hero.getPropertyId()) + .build(); + heroFightInfos.add(heroFightInfo); + } + return CommonProto.FightTeamInfo. + newBuilder() + .addAllFightUnitList(heroFightInfos) + .addAllPokemonUnitList(HeroLogic.getInstance().getCrossPokemon(crossArenaManager,csPlayer)) + .setTeamPassiveList("") + .setForceScore(crossArenaManager.getMaxHistoryForce()) + .build(); + } + + /** + * 获取玉虚论道跨服战斗数据 + * @param csPlayer + * @param teamId + * @param arenaRecord + * @param crossArenaManager + * @return + * @throws Exception + */ + public static CommonProto.FightTeamInfo makeYuxuCrossPersonData(CSPlayer csPlayer, int teamId, ArenaRecord arenaRecord, CrossArenaManager crossArenaManager) throws Exception { + //CSPlayer csPlayer = CrossServiceLogic.getPlayerByRedis(uid); + if (csPlayer == null) { + return null;//throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); + } + List heroFightInfos = new ArrayList<>(); + if (GameApplication.serverId == csPlayer.getServerId()) { + //本服玩家 + User user = UserManager.getUser(csPlayer.getUserId()); + return getYuxuTeam(user, teamId, null,arenaRecord); + } + //其他服玩家 + if (crossArenaManager == null) { + LOGGER.error("Exception::=>{}", "rpc data is empty"); + throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); + } + return getCrossYuxuTeam(csPlayer,crossArenaManager,teamId,null,arenaRecord); + } } 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 dddd80351..d216c78ad 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 @@ -67,10 +67,13 @@ import java.util.stream.Collectors; public class HeroLogic { private static final Logger LOGGER = LoggerFactory.getLogger(HeroLogic.class); + Map yuxuHeros = new HashMap<>(); + public HeroLogic() { //英雄事件监听 Poster.getPoster().listenEvent(new HeroFiveStarGetEventHandler(), HeroFiveStarGetEvent.class); Poster.getPoster().listenEvent(new PokemonFiveStarGetEventHandler(), PokemonFiveStarGetEvent.class); + this.initYuxuHero(); } public static List transTemplate = new ArrayList<>(); @@ -1205,6 +1208,20 @@ public class HeroLogic { } } heroIds.forEach(heroId -> set.add(heroManager.getEndlessHeroInfo().get(heroId.getHeroId()).getTemplateId())); + } else if (teamId == TeamEnum.CROSS_YU_XU_LUN_DAO_ONE.getTeamId() + || teamId == TeamEnum.CROSS_YU_XU_LUN_DAO_TWO.getTeamId() + || teamId == TeamEnum.CROSS_YU_XU_LUN_DAO_THREE.getTeamId()){ + for (CommonProto.TeamHeroInfo teamHeroInfo : heroIds) { + Hero trueHero = heroManager.getHero(teamHeroInfo.getHeroId()); + if(trueHero == null){ + throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); + } + Hero hero = this.getYuHero(trueHero.getTemplateId()); + if (hero == null) { + throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); + } + } + heroIds.forEach(heroId -> set.add(heroManager.getHero(heroId.getHeroId()).getTemplateId())); } else if (FourChallengeLogic.isFourChallengeTeam(teamId)) { heroIds.forEach(heroId -> { if (heroManager.getHeroMap().containsKey(heroId.getHeroId())) { @@ -6457,4 +6474,200 @@ public class HeroLogic { return result; } + /** + * 初始化玉虚固定英雄池 + */ + private void initYuxuHero(){ + for(Map.Entry entry:STableManager.getConfig(SEndlessHeroProp.class).entrySet()){ + Hero hero = new Hero(entry.getKey(), -1); + yuxuHeros.put(hero.getTemplateId(),hero); + } + } + + /** + * 根据模板id获取玉虚英雄 + * @param heroTemplateId + * @return + */ + public Hero getYuHero(int heroTemplateId){ + if(this.yuxuHeros.containsKey(heroTemplateId)){ + return yuxuHeros.get(heroTemplateId); + } + return null; + } + + /** + * 获取玉虚英雄所有技能,新技能添加到此方法, 英雄星级技能,魂印技能,神印技能取通用的,法宝技能取玩家真实技能 + * @param user + * @param hero + * @param yuxuHero + * @param sb + * @return + */ + public StringBuilder getYuxuHeroSkills(User user, Hero hero, Hero yuxuHero,StringBuilder sb) { + List heroSkillList = getYuxuHeroSkillList(user, hero,yuxuHero); + coverSkill(heroSkillList); + for (int i = 0; i < heroSkillList.size(); i++) { + Integer skill = heroSkillList.get(i); + if (i < 2) { + sb.append(skill).append(DIVISION); + continue; + } + SPassiveSkillLogicConfig config = SPassiveSkillLogicConfig.getConfig(skill); + if (config != null && config.getEffectiveRange() == 1) { + sb.append(skill).append(DIVISION); + } + } + return sb; + } + + /** + * 获取玉虚英雄所有技能,新技能添加到此方法, 英雄星级技能,魂印技能,神印技能取通用的,其余技能取玩家真实技能 + * @param user + * @param hero + * @param yuxuHero + * @return + */ + public List getYuxuHeroSkillList(User user, Hero hero,Hero yuxuHero) { + List skillList = new ArrayList<>(); + SCHero tempHero = SCHero.getsCHero().get(hero.getTemplateId()); + //英雄技能取统一的玉虚配置英雄 + List skillListByStar = tempHero.getSkillListByStar(yuxuHero.getStar()); + if (skillListByStar != null) { + skillList.addAll(skillListByStar); + } + // 大于10星,觉醒技 + if (yuxuHero.getStar() > HERO_MAX_STAR) { + skillList.addAll(tempHero.getAwakSkills(1, yuxuHero.getBreakIdByHongMeng(user.getHeroManager()))); + skillList.addAll(tempHero.getAwakSkills(2, yuxuHero.getStarBreakId())); + } else { + skillList.addAll(tempHero.getPassiveSkills(1, yuxuHero.getBreakIdByHongMeng(user.getHeroManager()))); + skillList.addAll(tempHero.getPassiveSkills(2, yuxuHero.getStarBreakId())); + } + + // 角色初始被动 + int[] skillLogicConfig = tempHero.getInitialPassiveSkillLogicConfig(); + if (skillLogicConfig != null && skillLogicConfig.length > 0){ + for (int skill : skillLogicConfig) { + skillList.add(skill); + } + } + + Map config = STableManager.getConfig(SEquipConfig.class); + + //魂印取统一配置 + Map soulEquipByPositionMap = yuxuHero.getSoulEquipByPositionMap(); + soulEquipByPositionMap.values().forEach(e -> { + Arrays.stream(config.get(e).getPassiveSkill()).forEach(skillList::add); + }); + + //神印取统一配置 + Map godSealByPositionMap = yuxuHero.getGodSealByPositionMap(); + godSealByPositionMap.values().forEach(e -> { + Arrays.stream(config.get(e).getPassiveSkill()).forEach(skillList::add); + }); + + //法宝技能继承真实技能 + int[] equipTalismana = tempHero.getEquipTalismana(); + if (equipTalismana.length >= 2 && hero.getStar() >= equipTalismana[0]) { + int especialEquipLevel = hero.getEspecialEquipLevelByHongmeng(user.getHeroManager(), hero.getId()); + int especialEquipId = equipTalismana[1]; + Map sEquipTalismana = SEquipTalismana.equipTalismanaStarMap.get(especialEquipId); + sEquipTalismana.forEach((k, v) -> { + if (k <= especialEquipLevel && v.getOpenSkillRules() != null) { + Arrays.stream(v.getOpenSkillRules()).forEach(skillList::add); + } + }); + } + return skillList; + } + + /** + * 获取玉虚英雄所有技能,新技能添加到此方法, 英雄星级技能,魂印技能,神印技能取通用的,法宝技能取玩家真实技能 + * @param crossArenaManager + * @param hero + * @param yuxuHero + * @return + */ + public List getCrossYuxuHeroSkillList(CrossArenaManager crossArenaManager, + com.ljsd.jieling.thrift.idl.ArenaOfHero hero,Hero yuxuHero) { + List skillList = new ArrayList<>(); + SCHero tempHero = SCHero.getsCHero().get(hero.getTemplateId()); + //英雄技能取统一的玉虚配置英雄 + List skillListByStar = tempHero.getSkillListByStar(yuxuHero.getStar()); + if (skillListByStar != null) { + skillList.addAll(skillListByStar); + } + // 大于10星,觉醒技 + if (yuxuHero.getStar() > HERO_MAX_STAR) { + skillList.addAll(tempHero.getAwakSkills(1, hero.getBreakId())); + skillList.addAll(tempHero.getAwakSkills(2, yuxuHero.getStarBreakId())); + } else { + skillList.addAll(tempHero.getPassiveSkills(1, hero.getBreakId())); + skillList.addAll(tempHero.getPassiveSkills(2, yuxuHero.getStarBreakId())); + } + + // 角色初始被动 + int[] skillLogicConfig = tempHero.getInitialPassiveSkillLogicConfig(); + if (skillLogicConfig != null && skillLogicConfig.length > 0){ + for (int skill : skillLogicConfig) { + skillList.add(skill); + } + } + + Map config = STableManager.getConfig(SEquipConfig.class); + + //魂印取统一配置 + Map soulEquipByPositionMap = yuxuHero.getSoulEquipByPositionMap(); + soulEquipByPositionMap.values().forEach(e -> { + Arrays.stream(config.get(e).getPassiveSkill()).forEach(skillList::add); + }); + + //神印取统一配置 + Map godSealByPositionMap = yuxuHero.getGodSealByPositionMap(); + godSealByPositionMap.values().forEach(e -> { + Arrays.stream(config.get(e).getPassiveSkill()).forEach(skillList::add); + }); + + //法宝技能继承真实技能 + int[] equipTalismana = tempHero.getEquipTalismana(); + if (equipTalismana.length >= 2 && hero.getStar() >= equipTalismana[0]) { + int especialEquipLevel = hero.getEspecialEquipLevel(); + int especialEquipId = equipTalismana[1]; + Map sEquipTalismana = SEquipTalismana.equipTalismanaStarMap.get(especialEquipId); + sEquipTalismana.forEach((k, v) -> { + if (k <= especialEquipLevel && v.getOpenSkillRules() != null) { + Arrays.stream(v.getOpenSkillRules()).forEach(skillList::add); + } + }); + } + return skillList; + } + + /** + * 获取玉虚英雄所有技能,新技能添加到此方法, 英雄星级技能,魂印技能,神印技能取通用的,其余技能取玩家真实技能 + * @param crossArenaManager + * @param hero + * @param yuxuHero + * @return + */ + public StringBuilder getCrossYuxuHeroSkills(CrossArenaManager crossArenaManager, + com.ljsd.jieling.thrift.idl.ArenaOfHero hero,Hero yuxuHero) { + List heroSkillList = this.getCrossYuxuHeroSkillList(crossArenaManager,hero,yuxuHero); + coverSkill(heroSkillList); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < heroSkillList.size(); i++) { + Integer skill = heroSkillList.get(i); + if (i < 2) { + sb.append(skill).append(DIVISION); + continue; + } + SPassiveSkillLogicConfig config = SPassiveSkillLogicConfig.getConfig(skill); + if (config != null && config.getEffectiveRange() == 1) { + sb.append(skill).append(DIVISION); + } + } + return sb; + } + } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/player/PlayerLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/player/PlayerLogic.java index adf192b59..3acaa8860 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/player/PlayerLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/player/PlayerLogic.java @@ -817,15 +817,20 @@ public class PlayerLogic { if(hero == null){ continue; } + //玉虚取通用属性 + Hero yuxuHero = HeroLogic.getInstance().getYuHero(hero.getTemplateId()); + if(yuxuHero == null){ + continue; + } teamOneTeamInfo.addTeam(CommonProto.TeamSimpleInfo.newBuilder() .setHeroid(hero.getId()) .setHeroTid(hero.getTemplateId()) - .setLevel(hero.getLevel(user.getHeroManager())) - .setStar(hero.getStar()) + .setLevel(yuxuHero.getLevel(user.getHeroManager())) + .setStar(yuxuHero.getStar()) .setPosition(heroInfo.getPosition()) .setSkinId(hero.getSkin()) - .setGodSoulLv(hero.getGodSoulLv()) - .setPropertyId(hero.getPropertyId()) + .setGodSoulLv(yuxuHero.getGodSoulLv()) + .setPropertyId(yuxuHero.getPropertyId()) .build()); } } @@ -1906,4 +1911,120 @@ public class PlayerLogic { LOGGER.info("掉落4->{}->{}",pokemonInfo.getTempId(),1); } } + + /** + * 查看玉虚论道英雄属性 + * @param uid + * @param heroId + * @param teamId + * @return + * @throws Exception + */ + public PlayerInfoProto.ViewHeroInfoResponse viewYuxuHeroInfo(int uid,String heroId,int teamId) throws Exception { + User userInMem = UserManager.getUserInMem(uid); + if(userInMem == null){ + throw new ErrorCodeException(ErrorCode.FRIENDS_USER_NULL); + } + Hero hero = userInMem.getHeroManager().getHeroMap().get(heroId); + if(hero == null){ + throw new ErrorCodeException(ErrorCode.newDefineCode("hero no")); + } + Hero yuxuHero = HeroLogic.getInstance().getYuHero(hero.getTemplateId()); + if(yuxuHero == null){ + throw new ErrorCodeException(ErrorCode.newDefineCode("hero no")); + } + Map config = STableManager.getConfig(SEndlessHeroProp.class); + SEndlessHeroProp sEndlessHeroProp = config.get(hero.getTemplateId()); + Map heroAttributeMap = new HashMap<>(); + for (int[] prop : sEndlessHeroProp.getProps()) { + heroAttributeMap.put(prop[0], (long) prop[1]); + } + PlayerInfoProto.ViewHeroInfoResponse.Builder builder = PlayerInfoProto.ViewHeroInfoResponse.newBuilder(); + for(Map.Entry item : heroAttributeMap.entrySet()){ + builder.addSpecialEffects(CommonProto.SpecialEffects.newBuilder().setPropertyId(item.getKey()).setPropertyValue(item.getValue().intValue()).build()); + } + builder.setForce(HeroLogic.getInstance().calForce(heroAttributeMap)); + builder.setHero(CBean2Proto.getYuxuHero(yuxuHero,hero,userInMem.getHeroManager())); +// Map guildSkill = userInMem.getGuildMyInfo().getGuildSkill(); +//// int profession = SCHero.getsCHero().get(hero.getTemplateId()).getProfession(); +//// Integer skill = guildSkill.getOrDefault(profession, 0); + //公会等级统一为0 + builder.setGuildSkill(0); + return builder.build(); + } + + /** + * 查看跨服玉虚英雄信息 + * @param uid + * @param heroId + * @return + * @throws Exception + */ + public PlayerInfoProto.ViewHeroInfoResponse viewCrossYuxuHeroInfo(int uid,String heroId,int teamId) throws Exception { + CSPlayer csPlayer = CrossServiceLogic.getPlayerByRedis(uid); + if (csPlayer == null){ + throw new ErrorCodeException(ErrorCode.newDefineCode("该玩家没有跨服数据")); + } + if(GameApplication.serverId == csPlayer.getServerId()){ + return viewYuxuHeroInfo(uid,heroId,teamId); + } + //其他服玩家rpc 数据调用 + CrossArenaManager crossArenaManager = PlayerLogic.getInstance().getCrossArenaManagerData(csPlayer); + Map rpcHeroes =crossArenaManager.getHeros(); + com.ljsd.jieling.thrift.idl.ArenaOfHero rpcHero = rpcHeroes.get(heroId); + if(rpcHero == null){ + throw new ErrorCodeException(ErrorCode.newDefineCode("hero no")); + } + //获取玉虚英雄通用配置 + Hero yuxuHero = HeroLogic.getInstance().getYuHero(rpcHero.getTemplateId()); + if(yuxuHero == null){ + throw new ErrorCodeException(ErrorCode.newDefineCode("hero no")); + } + CommonProto.Hero.Builder heroBuilder = CommonProto.Hero.newBuilder(). + setLevel(rpcHero.getLevel()). + setEspecialEquipLevel(rpcHero.getEspecialEquipLevel()). + setStar(yuxuHero.getStar()). + setId(rpcHero.getId()). + setHeroId(rpcHero.getTemplateId()). + setGodSoulLv(yuxuHero.getGodSoulLv()). + setBreakId(rpcHero.getBreakId()).setStarBreakId(rpcHero.getStarBreakId()); + PlayerInfoProto.ViewHeroInfoResponse.Builder builder = PlayerInfoProto.ViewHeroInfoResponse.newBuilder(); + + Map config = STableManager.getConfig(SEndlessHeroProp.class); + SEndlessHeroProp sEndlessHeroProp = config.get(rpcHero.getTemplateId()); + Map heroAttributeMap = new HashMap<>(); + for (int[] prop : sEndlessHeroProp.getProps()) { + heroAttributeMap.put(prop[0], (long) prop[1]); + } + for(Map.Entry item : heroAttributeMap.entrySet()){ + int id = item.getKey(); + int values = item.getValue().intValue(); + builder.addSpecialEffects(CommonProto.SpecialEffects.newBuilder().setPropertyId(id).setPropertyValue(values).build()); + } + + // 无装备 +// for(int equipId : yuxuHero.getEquipByPositionMap().values()){ +// heroBuilder.addEquipIdList(equipId); +// } + // 魂印 + Map soulEquipByPositionMap = yuxuHero.getSoulEquipByPositionMap(); + for(Map.Entry entry: soulEquipByPositionMap.entrySet()){ + heroBuilder.addSoulPos(CommonProto.SoulPos.newBuilder().setEquipId(entry.getValue()).setPosition(entry.getKey())); + } + // 神印 + Map godSealByPositionMap = yuxuHero.getGodSealByPositionMap(); + for(Map.Entry entry: godSealByPositionMap.entrySet()){ + heroBuilder.addGodSeals(CommonProto.SoulPos.newBuilder().setEquipId(entry.getValue()).setPosition(entry.getKey())); + } + // 皮肤 + heroBuilder.setSkinId(rpcHero.getSkin()); + // 公会技能统一为0 +// int profession = SCHero.getsCHero().get(rpcHero.getTemplateId()).getProfession(); + int skill = 0; + builder.setGuildSkill(skill); + // 战力 + builder.setForce(HeroLogic.getInstance().calForce(heroAttributeMap)); + builder.setHero(heroBuilder); + return builder.build(); + } } 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 84c608782..14c4e9ff0 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/util/CBean2Proto.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/util/CBean2Proto.java @@ -1364,4 +1364,23 @@ public class CBean2Proto { }); return list; } + + /*** + * 获取玉虚英雄属性 + * @param hero + * @param heroManager + * @return + */ + public static CommonProto.Hero getYuxuHero(Hero yuxuHero,Hero hero,HeroManager heroManager){ + // 无装备 + Collection equipList =new ArrayList<>(); + CommonProto.Hero hero1 = getHero(yuxuHero); + CommonProto.Hero.Builder builder = hero1.toBuilder(); + builder.addAllEquipIdList(equipList); + builder.setLevel(yuxuHero.getLevel(heroManager)); + builder.setBreakId(hero.getBreakIdByHongMeng(heroManager)); + //显示真实的法宝等级 + builder.setEspecialEquipLevel(hero.getEspecialEquipLevel()); + return builder.build(); + } }