From 6a1faf574c53cc5d69b2d0b2516f11708e94f93f Mon Sep 17 00:00:00 2001 From: jiahuiwen Date: Thu, 17 Dec 2020 15:04:46 +0800 Subject: [PATCH] =?UTF-8?q?=E9=B8=BF=E8=92=99=E9=98=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jieling/handler/GetPlayerInfoHandler.java | 15 +- .../hero/HongmengCleanTimeRequestHandler.java | 3 +- .../hero/HongmengResonanceRequestHandler.java | 14 +- .../hero/HongmengUpgradRequestHandler.java | 6 + .../java/com/ljsd/jieling/logic/dao/Hero.java | 5 + .../ljsd/jieling/logic/dao/HeroManager.java | 36 +++- .../ljsd/jieling/logic/hero/HeroLogic.java | 195 +++++++++++++++--- 7 files changed, 234 insertions(+), 40 deletions(-) diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/GetPlayerInfoHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/GetPlayerInfoHandler.java index 38f4fb95b..003067bef 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/GetPlayerInfoHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/GetPlayerInfoHandler.java @@ -204,6 +204,19 @@ public class GetPlayerInfoHandler extends BaseHandler{ .build(); hongmengHeroInfos.add(hongmengHeroInfo); } + // 组装鸿蒙守卫或者鸿蒙使者信息 + List hongmengGuardsProto = new ArrayList<>(); + Map hongmengGuards = heroManager.getHongmengGuards(); + Map hongmengGuardTime = heroManager.getHongmengGuardTime(); + for (Map.Entry entry : hongmengGuards.entrySet()) { + PlayerInfoProto.HongmengHeroInfo hongmengHeroInfo = PlayerInfoProto.HongmengHeroInfo.newBuilder() + .setGridId(entry.getKey()) + .setHeroId(entry.getValue()) + .setTime(hongmengGuardTime.containsKey(entry.getKey()) ? (hongmengGuardTime.get(entry.getKey()) - now < 0 ? 0 : (hongmengGuardTime.get(entry.getKey()) - now) / 1000) : 0) + .build(); + hongmengGuardsProto.add(hongmengHeroInfo); + } + List hongmengAdditions = new ArrayList<>(); Map resonanceAddition = heroManager.getResonanceAddition(); for (Map.Entry entry : resonanceAddition.entrySet()) { @@ -249,7 +262,7 @@ public class GetPlayerInfoHandler extends BaseHandler{ .setExpeditionLeve(user.getExpeditionManager().getExpeditionLeve()) .setHadLuckTime( user.getPlayerInfoManager().getLuckWheelLimitTime()) .setHadAdvanceLuckTime(user.getPlayerInfoManager().getLuckAdvanceWheelLimitTime()) - .addAllHongmengGuards(heroManager.getHongmengGuard()) + .addAllHongmengGuards(hongmengGuardsProto) .setHongmengTablet(heroManager.getHongmengTablet()) .addAllHongmengHeroInfos(hongmengHeroInfos) .addAllHongmengAdditions(hongmengAdditions) diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/hero/HongmengCleanTimeRequestHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/hero/HongmengCleanTimeRequestHandler.java index 7a561a257..43aa53fbe 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/hero/HongmengCleanTimeRequestHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/hero/HongmengCleanTimeRequestHandler.java @@ -17,6 +17,7 @@ public class HongmengCleanTimeRequestHandler extends BaseHandler{} HONGMENG_RESONANCE_REQUEST wrong type=>{}", session.getUid(), proto.getType()); + throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF); + } } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/hero/HongmengUpgradRequestHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/hero/HongmengUpgradRequestHandler.java index 048683baf..3cc5423c5 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/hero/HongmengUpgradRequestHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/hero/HongmengUpgradRequestHandler.java @@ -3,6 +3,7 @@ package com.ljsd.jieling.handler.hero; import com.google.protobuf.GeneratedMessage; import com.ljsd.jieling.handler.BaseHandler; import com.ljsd.jieling.logic.hero.HeroLogic; +import com.ljsd.jieling.netty.cocdex.PacketNetData; import com.ljsd.jieling.network.session.ISession; import com.ljsd.jieling.protocols.MessageTypeProto; import org.springframework.stereotype.Component; @@ -18,4 +19,9 @@ public class HongmengUpgradRequestHandler extends BaseHandler { public void processWithProto(ISession iSession, GeneratedMessage proto) throws Exception { HeroLogic.getInstance().updateHongmengTablet(iSession, MessageTypeProto.MessageType.HONGMENG_UPGRADE_RESPONSE); } + + @Override + public void process(ISession iSession, PacketNetData netData) throws Exception { + HeroLogic.getInstance().updateHongmengTablet(iSession, MessageTypeProto.MessageType.HONGMENG_UPGRADE_RESPONSE); + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/Hero.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/Hero.java index 90c14c326..03dbaba76 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/Hero.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/Hero.java @@ -161,6 +161,11 @@ public class Hero extends MongoBase { * @return */ public int getLevel(HeroManager heroManager) { + // 如果鸿蒙碑开启 返回鸿蒙系统中神将返回鸿蒙碑等级 + if (heroManager.getHongmengTablet() > 0 && (heroManager.getResonances().values().contains(id) || + heroManager.getHongmengGuards().values().contains(id))) { + return heroManager.getHongmengTablet(); + } if (heroManager.getResonances().values().contains(id)) { HongMengAddAttribute hongMengAddAttribute = heroManager.getResonanceAddition().get(HongMengAttributeEnum.LEVEL); if (hongMengAddAttribute != null) { diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/HeroManager.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/HeroManager.java index 46e936ce8..2ef0b7ba0 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/HeroManager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/HeroManager.java @@ -30,8 +30,11 @@ public class HeroManager extends MongoBase { this.setRootCollection(User._COLLECTION_NAME); } - // 鸿蒙守卫 - private List hongmengGuard = new ArrayList<>(); + // 鸿蒙守卫/鸿蒙使者 <格子id,英雄id> + private Map hongmengGuards = new HashMap<>(); + // 鸿蒙守卫/鸿蒙使者<格子id,冷却时间> + private Map hongmengGuardTime = new HashMap<>(); + // 共鸣英雄<格子id,英雄id> private Map resonances = new HashMap<>(); // 共鸣英雄<格子id,冷却时间> @@ -142,13 +145,32 @@ public class HeroManager extends MongoBase { removeString(getMongoKey()+"skinInfo."+skinId); } - public List getHongmengGuard() { - return hongmengGuard; + public Map getHongmengGuards() { + return hongmengGuards; } - public void setHongmengGuard(List hongmengGuard) { - this.hongmengGuard = hongmengGuard; - updateString("hongmengGuard", hongmengGuard); + public void setHongmengGuards(Map hongmengGuards) { + this.hongmengGuards = hongmengGuards; + updateString("hongmengGuards", hongmengGuards); + } + + public void updateHongmengGuards(int key, String heroId) { + this.hongmengGuards.put(key, heroId); + updateString("hongmengGuards." + key, heroId); + } + + public Map getHongmengGuardTime() { + return hongmengGuardTime; + } + + public void setHongmengGuardTime(Map hongmengGuardTime) { + this.hongmengGuardTime = hongmengGuardTime; + updateString("hongmengGuardTime", hongmengGuardTime); + } + + public void updateHongmengGuardTime(int key, long targetTime) { + this.hongmengGuardTime.put(key, targetTime); + updateString("hongmengGuardTime." + key, targetTime); } public Map getResonances() { 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 554d1c847..9cf690c76 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 @@ -1071,6 +1071,14 @@ public class HeroLogic{ 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()); + if (add) { + // 增加鸿蒙碑神将等级 + heroManager.setHongmengMaxLevel(hongmengMaxLevel); + } + } MessageUtil.sendMessage(session,1,MessageTypeProto.MessageType.UP_HERO_STAR_RESPONSE_VALUE,baseBuilder.build(),true); // 觉醒飘字 if (targetHero.getStar() >= SSpecialConfig.getIntegerValue(SSpecialConfig.lamp_awaken_hero_content_parm)) { @@ -3406,11 +3414,15 @@ public class HeroLogic{ * 添加或更新鸿蒙守卫 * @param user */ - public void addOrUpdateHongmeng(User user) { + public void addOrUpdateHongmeng(User user) throws Exception { if (user.getPlayerInfoManager().getLevel() < SSpecialConfig.getIntegerValue(SSpecialConfig.HONGMENG_OPENLEVEL)) { return; } HeroManager heroManager = user.getHeroManager(); + // 鸿蒙碑开启,不需要再更新鸿蒙使者和鸿蒙守卫 + if (heroManager.getHongmengTablet() > 0) { + return; + } Collection values = heroManager.getHeroMap().values(); List heroes = new ArrayList<>(values); Collections.sort(heroes, new Comparator() { @@ -3423,7 +3435,7 @@ public class HeroLogic{ return Integer.compare(hero2.getStar(), hero1.getStar()); } }); - List hongmengs = new ArrayList<>(); + Map hongmengs = new HashMap<>(); int defaultValue = 1000; // 只要任意鸿蒙守卫中有未穿戴装备的部位,就不会触发装备共鸣,共鸣区域放入神将时不再自动卸下装备 1:不卸下装备 HongMengAddAttribute hongMengAddAttributeEquip = new HongMengAddAttribute(0, defaultValue); @@ -3442,6 +3454,7 @@ public class HeroLogic{ Collection values2 = heroManager.getResonances().values(); Map equipMap = user.getEquipManager().getEquipMap(); String[] openLevel = SSpecialConfig.getStringValue(SSpecialConfig.HONGMENG_UPGRADE_LIMIT).split("#"); + int key = 1; for (int i = 0; i < heroes.size(); i++) { Hero hero = heroes.get(i); if (values2.contains(hero.getId())) { @@ -3459,15 +3472,16 @@ public class HeroLogic{ } // 等级 hongmengLevel(resonanceLevel, hero); - hongmengs.add(hero.getId()); + hongmengs.put(key++, hero.getId()); if (hongmengs.size() >= Integer.parseInt(openLevel[0])) { break; } } + // 不够6个无法开启鸿蒙阵 if (hongmengs.size() < Integer.parseInt(openLevel[0])) { return; } - heroManager.setHongmengGuard(hongmengs); + heroManager.setHongmengGuards(hongmengs); // 第一个格子免费开启 Map resonances = heroManager.getResonances(); if (!resonances.containsKey(1)) { @@ -3502,6 +3516,14 @@ public class HeroLogic{ if (tablet == 1 && heroManager.getHongmengTablet() == 0) { // 开启鸿蒙碑 heroManager.setHongmengTablet(Integer.parseInt(openLevel[1])); + for (String resetLevelId : heroManager.getHongmengGuards().values()) { + Hero hero = heroManager.getHero(resetLevelId); + if (hero == null) { + continue; + } + hero.setLevel(user, 1); + } + } } @@ -3649,7 +3671,7 @@ public class HeroLogic{ LOGGER.info("resonance uid=>{} no the heroId=>{}", user.getId(), heroId); throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF); } - if (heroManager.getHongmengGuard().contains(heroId)) { + if (heroManager.getHongmengGuards().values().contains(heroId)) { LOGGER.info("resonance uid=>{} the heroId=>{} is HongmengGuard", user.getId(), heroId); throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF); } @@ -3666,6 +3688,12 @@ public class HeroLogic{ } // 添加到共鸣区 heroManager.updateResonances(index, heroId); + HongMengAddAttribute hongMengAddAttribute = heroManager.getResonanceAddition().get(HongMengAttributeEnum.EQUIP); + if (hongMengAddAttribute.value == -1) { + Map equipByPositionMap = hero.getEquipByPositionMap(); + equipByPositionMap.clear(); + hero.setEquipByPositionMap(equipByPositionMap); + } MessageUtil.sendMessage(session, 1, messageType.getNumber(), null); } @@ -3707,33 +3735,64 @@ public class HeroLogic{ * @param index * @throws Exception */ - public void cleanTime(ISession session, MessageTypeProto.MessageType messageType, int index) throws Exception { + public void cleanTime(ISession session, MessageTypeProto.MessageType messageType, int index, int type) throws Exception { User user = UserManager.getUser(session.getUid()); HeroManager heroManager = user.getHeroManager(); - Map resonances = heroManager.getResonances(); - String resonanceInfo = resonances.get(index); - if (resonanceInfo == null) { - LOGGER.info("cleanTime uid=>{} the index not open=>{}", user.getId(), index); - throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF); + if (type == 1) { + Map resonances = heroManager.getResonances(); + String resonanceInfo = resonances.get(index); + if (resonanceInfo == null) { + LOGGER.info("cleanTime uid=>{} the index not open=>{}", user.getId(), index); + throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF); + } + Map resonancesTime = heroManager.getResonancesTime(); + Long unloadTime = resonancesTime.get(index); + if (unloadTime == null || unloadTime <= TimeUtils.now()) { + LOGGER.info("cleanTime uid=>{} time =>{}", user.getId(), unloadTime); + throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF); + } + String[] stringValue = SSpecialConfig.getStringValue(SSpecialConfig.HONGMENG_LATTICE_PRICE).split("#"); + long time = unloadTime - TimeUtils.now(); + int count = (int) (time / 1000 * Integer.parseInt(stringValue[0])); + Map cost = new HashMap<>(1); + cost.put(Integer.parseInt(stringValue[1]), count); + boolean checkCost = ItemUtil.checkCost(user, cost); + if (!checkCost) { + LOGGER.info("cleanTime uid=>{} item not enough =>{}", user.getId(), unloadTime); + throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF); + } + ItemUtil.itemCost(user, cost, BIReason.CLEAR_HONGMENG_GRAID, index); + heroManager.updateResonancesTime(index, 0L); + } else { + if (heroManager.getHongmengTablet() == 0) { + LOGGER.info("cleanTime uid=>{} the HongmengTablet not open=>{}", user.getId(), index); + throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF); + } + Map hongmengGuards = heroManager.getHongmengGuards(); + String resonanceInfo = hongmengGuards.get(index); + if (resonanceInfo == null) { + LOGGER.info("cleanTime uid=>{} the index not open=>{}", user.getId(), index); + throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF); + } + Map hongmengGuardTime = heroManager.getHongmengGuardTime(); + Long unloadTime = hongmengGuardTime.get(index); + if (unloadTime == null || unloadTime <= TimeUtils.now()) { + LOGGER.info("cleanTime uid=>{} time =>{}", user.getId(), unloadTime); + throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF); + } + String[] stringValue = SSpecialConfig.getStringValue(SSpecialConfig.HONGMENG_LATTICE_PRICE).split("#"); + long time = unloadTime - TimeUtils.now(); + int count = (int) (time / 1000 * Integer.parseInt(stringValue[0])); + Map cost = new HashMap<>(1); + cost.put(Integer.parseInt(stringValue[1]), count); + boolean checkCost = ItemUtil.checkCost(user, cost); + if (!checkCost) { + LOGGER.info("cleanTime uid=>{} item not enough =>{}", user.getId(), unloadTime); + throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF); + } + ItemUtil.itemCost(user, cost, BIReason.CLEAR_HONGMENG_GRAID, index); + heroManager.updateHongmengGuardTime(index, 0L); } - Map resonancesTime = heroManager.getResonancesTime(); - Long unloadTime = resonancesTime.get(index); - if (unloadTime == null || unloadTime <= TimeUtils.now()) { - LOGGER.info("cleanTime uid=>{} time =>{}", user.getId(), unloadTime); - throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF); - } - String[] stringValue = SSpecialConfig.getStringValue(SSpecialConfig.HONGMENG_LATTICE_PRICE).split("#"); - long time = unloadTime - TimeUtils.now(); - int count = (int) (time / 1000 * Integer.parseInt(stringValue[0])); - Map cost = new HashMap<>(1); - cost.put(Integer.parseInt(stringValue[1]), count); - boolean checkCost = ItemUtil.checkCost(user, cost); - if (!checkCost) { - LOGGER.info("cleanTime uid=>{} item not enough =>{}", user.getId(), unloadTime); - throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF); - } - ItemUtil.itemCost(user, cost, BIReason.CLEAR_HONGMENG_GRAID, index); - heroManager.updateResonancesTime(index, 0L); MessageUtil.sendMessage(session, 1, messageType.getNumber(), null); } @@ -3751,7 +3810,7 @@ public class HeroLogic{ throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF); } String[] split = SSpecialConfig.getStringValue(SSpecialConfig.HONGMENG_UPGRADE_LIMIT).split("#"); - int maxLevel = heroManager.getHongmengMaxLevel().size() * SSpecialConfig.getIntegerValue(SSpecialConfig.HONGMENG_ONEHERO_OPENLEVEL) + Integer.parseInt(split[0]); + int maxLevel = heroManager.getHongmengMaxLevel().size() * SSpecialConfig.getIntegerValue(SSpecialConfig.HONGMENG_ONEHERO_OPENLEVEL) + Integer.parseInt(split[1]); if (heroManager.getHongmengTablet() >= maxLevel) { LOGGER.info("updateHongmengTablet uid=>{} curLevel={} maxLevel =>{}", user.getId(), heroManager.getHongmengTablet(), maxLevel); throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF); @@ -3772,4 +3831,80 @@ public class HeroLogic{ MessageUtil.sendMessage(session, 1, messageType.getNumber(), null); } + + /** + * 添加鸿蒙碑神将 + * @param session + * @param messageType + * @param heroId 需要鸿蒙碑的神将id + * @param index 需要放的鸿蒙碑位置 + */ + public void addHongmengTableHero(ISession session, MessageTypeProto.MessageType messageType, String heroId, int index) throws Exception { + User user = UserManager.getUser(session.getUid()); + HeroManager heroManager = user.getHeroManager(); + if (heroManager.getHongmengTablet() == 0) { + LOGGER.info("addHongmengTableHero uid=>{} HongmengTablet==0", user.getId()); + throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF); + } + Hero hero = heroManager.getHeroMap().get(heroId); + if (hero == null) { + LOGGER.info("addHongmengTableHero uid=>{} no the heroId=>{}", user.getId(), heroId); + throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF); + } + if (heroManager.getHongmengGuards().values().contains(heroId)) { + LOGGER.info("addHongmengTableHero uid=>{} the heroId=>{} is HongmengGuard", user.getId(), heroId); + throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF); + } + Map resonances = heroManager.getHongmengGuards(); + String resonanceInfo = resonances.get(index); + if (resonanceInfo == null || resonanceInfo.isEmpty()) { + LOGGER.info("addHongmengTableHero uid=>{} not hero key=>{}", user.getId(), index); + throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF); + } + Map resonancesTime = heroManager.getHongmengGuardTime(); + if (resonancesTime.get(index) != null && resonancesTime.get(index) > TimeUtils.now()) { + LOGGER.info("addHongmengTableHero uid=>{} time =>{}", user.getId(), resonancesTime.get(index)); + throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF); + } + // 添加鸿蒙碑 + heroManager.updateHongmengGuards(index, heroId); + MessageUtil.sendMessage(session, 1, messageType.getNumber(), null); + } + + + /** + * 卸下鸿蒙碑英雄 + * @param session + * @param messageType + * @param index + * @throws Exception + */ + public void unLoadHongmengTableHero(ISession session, MessageTypeProto.MessageType messageType, int index) throws Exception{ + User user = UserManager.getUser(session.getUid()); + HeroManager heroManager = user.getHeroManager(); + if (heroManager.getHongmengTablet() == 0) { + LOGGER.info("unLoadHongmengTableHero uid=>{} HongmengTablet==0", user.getId()); + throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF); + } + Map resonances = heroManager.getHongmengGuards(); + String heroId = resonances.get(index); + if (heroId == null || heroId.isEmpty()) { + LOGGER.info("unLoadHongmengTableHero uid=>{} no hero=>{}", user.getId(), index); + throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF); + } + Hero hero = heroManager.getHero(heroId); + if (hero == null) { + LOGGER.info("unLoadHongmengTableHero uid=>{} cur hero is null {}", user.getId(), heroId); + throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF); + } + heroManager.updateHongmengGuards(index, ""); + heroManager.updateHongmengGuardTime(index, TimeUtils.now() + SSpecialConfig.getIntegerValue(SSpecialConfig.HONGMENG_LATTICE_WAIT_TIME) * 1000); + HeroInfoProto.ResonanceResponse resonanceResponse = HeroInfoProto.ResonanceResponse + .newBuilder() + .setLeftTime(SSpecialConfig.getIntegerValue(SSpecialConfig.HONGMENG_LATTICE_WAIT_TIME)) + .build(); + MessageUtil.sendMessage(session, 1, messageType.getNumber(), resonanceResponse); + } + + }