diff --git a/serverlogic/src/main/java/com/ljsd/jieling/globals/BIReason.java b/serverlogic/src/main/java/com/ljsd/jieling/globals/BIReason.java index 26e946fe2..0426a53c6 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/globals/BIReason.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/globals/BIReason.java @@ -329,4 +329,6 @@ public interface BIReason { int EQUIP_UPLEVEL_COST = 1092;//装备升星消耗 int EQUIP_UPLEVEL_REWARD = 1093;//装备升星获得 int TA_SUI_LING_XIAO = 1094;//踏碎凌霄 + + int UP_PRACTICE_LEVEL = 1100;//修行升级 } \ No newline at end of file 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 d3abd1bb9..cfa6866a7 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/GetPlayerInfoHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/GetPlayerInfoHandler.java @@ -219,6 +219,8 @@ public class GetPlayerInfoHandler extends BaseHandler{ .addAllUserMountList(CBean2Proto.getUserMountList(user)) .addAllUserSkinList(CBean2Proto.getUserSkinList(user)) .addAllUserTitleList(CBean2Proto.getUserTitleList(user)) + .setPracticeLevel(heroManager.getPracticeLevel()) + .addAllSealList(CBean2Proto.getPurpleMansionSealInfo(user)) .build(); ReportUtil.onReportEvent(user, ReportEventEnum.APP_LOGIN.getType()); try { @@ -227,14 +229,11 @@ public class GetPlayerInfoHandler extends BaseHandler{ MessageUtil.sendIndicationMessage(iSession, 1, MessageTypeProto.MessageType.WorldLevelIndication_VALUE, PlayerInfoProto.WorldLevelIndication.newBuilder().setWorldLeve(GlobleSystemLogic.getGloableWorldLeveCache()).build(), true); MessageUtil.sendMessage(iSession, 1, MessageTypeProto.MessageType.GET_PLAYERINFO_RESPONSE_VALUE, getPlayerInfoResponse, true); - // DoFix.getInstance().loginFix(user); if(playerInfoManager.getIsdayFirst()==0){ playerInfoManager.setIsdayFirst(1); } RedisUtil.getInstence().set(RedisKey.USER_LOGIN_URL + userId, RPCServerTask.userCallBackUrl); - /*if(user.getPlayerInfoManager().getGuidePoints().get(1)!=-1){ - user.getPlayerInfoManager().updateGuidePoint(1,-1); - }*/ + } catch (Exception e) { e.printStackTrace(); } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/hero/ReplacePurpleMansionSealHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/hero/ReplacePurpleMansionSealHandler.java new file mode 100644 index 000000000..1643142ac --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/hero/ReplacePurpleMansionSealHandler.java @@ -0,0 +1,102 @@ +package com.ljsd.jieling.handler.hero; + +import com.google.protobuf.GeneratedMessage; +import com.ljsd.jieling.exception.ErrorCode; +import com.ljsd.jieling.exception.ErrorCodeException; +import com.ljsd.jieling.handler.BaseHandler; +import com.ljsd.jieling.logic.dao.PurpleMansionSeal; +import com.ljsd.jieling.logic.dao.UserManager; +import com.ljsd.jieling.logic.dao.root.User; +import com.ljsd.jieling.network.session.ISession; +import com.ljsd.jieling.util.CBean2Proto; +import com.ljsd.jieling.util.MessageUtil; +import org.springframework.stereotype.Component; +import rpc.protocols.CommonProto; +import rpc.protocols.HeroInfoProto; +import rpc.protocols.MessageTypeProto; + +import java.util.List; +import java.util.Map; +/** + * @Author hj + * @Description 修改神印状态 + * 三种类型 + * 1: oldSealId != newSealId : 替换神印 + * 2: oldSealId == newSealId && newSealId.subId == subId : 卸载神印 + * 3: oldSealId == newSealId && newSealId.subId != subId : 替换神印英雄 + * @Date $ $ + * @Param $ + * @return $ + **/ + +@Component +public class ReplacePurpleMansionSealHandler extends BaseHandler { + @Override + public MessageTypeProto.MessageType getMessageCode() { + return MessageTypeProto.MessageType.ReplacePurpleMansionSealRequest; + } + + @Override + public void processWithProto(ISession iSession, HeroInfoProto.ReplacePurpleMansionSealRequest proto) throws Exception { + // 用户信息 + User user = UserManager.getUser(iSession.getUid()); + if (user == null) { + throw new ErrorCodeException(ErrorCode.UNKNOWN); + } + + // 获取参数 + int oldSealId = proto.getOldSealId(); + int newSealId = proto.getNewSealId(); + String subId = proto.getSubId(); + + // 神印列表 + Map sealMap = user.getHeroManager().getPurpleMansionSeal(); + + // 替换神印 + if (oldSealId != newSealId){ + PurpleMansionSeal newSeal = sealMap.get(newSealId); + if (newSeal == null){ + throw new ErrorCodeException("神印不存在!"); + } + if (newSeal.getType() == 1 && (subId == null || "".equals(subId))){ + throw new ErrorCodeException("英雄id不能为空!"); + } + // 旧神印状态修改 + PurpleMansionSeal oldSeal = sealMap.get(oldSealId); + if (oldSeal != null){ + oldSeal.setState(0); + user.getHeroManager().putPurpleMansionSeal(oldSeal); + } + + // 新神印状态修改 + newSeal.setState(1); + // 附属英雄id修改,类型之后需要读表 + if (!newSeal.getSubId().equals(subId) && newSeal.getType() == 1){ + newSeal.setSubId(subId); + } + user.getHeroManager().putPurpleMansionSeal(newSeal); + } + // 相同神印 + else { + PurpleMansionSeal seal = sealMap.get(newSealId); + // 卸载神印 + if (seal.getSubId().equals(subId)){ + seal.setState(0); + } + // 替换英雄id + else { + if (seal.getType() != 1){ + throw new ErrorCodeException("神印类型错误!"); + } + seal.setSubId(subId); + } + user.getHeroManager().putPurpleMansionSeal(seal); + } + + // 返回最新神印列表 + List sealInfo = CBean2Proto.getPurpleMansionSealInfo(user); + HeroInfoProto.ReplacePrupleMansionSealResponse build = HeroInfoProto.ReplacePrupleMansionSealResponse.newBuilder().addAllSealList(sealInfo).build(); + + MessageUtil.sendMessage(iSession,1,MessageTypeProto.MessageType.ReplacePurpleMansionSealResponse_VALUE,build,true); + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/hero/UpPracticeLevelHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/hero/UpPracticeLevelHandler.java new file mode 100644 index 000000000..ab41bd960 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/hero/UpPracticeLevelHandler.java @@ -0,0 +1,81 @@ +package com.ljsd.jieling.handler.hero; + +import com.google.protobuf.GeneratedMessage; +import com.ljsd.jieling.exception.ErrorCode; +import com.ljsd.jieling.exception.ErrorCodeException; +import com.ljsd.jieling.globals.BIReason; +import com.ljsd.jieling.handler.BaseHandler; +import com.ljsd.jieling.logic.dao.PurpleMansionSeal; +import com.ljsd.jieling.logic.dao.UserManager; +import com.ljsd.jieling.logic.dao.root.User; +import com.ljsd.jieling.util.ItemUtil; +import config.SXiuXian; +import config.SXiuXianSkill; +import manager.STableManager; +import org.springframework.stereotype.Component; +import rpc.protocols.HeroInfoProto; +import rpc.protocols.MessageTypeProto; +/** + * @Author hj + * @Description 修行玩法,升级 + * @Date $ $ + * @Param $ + * @return $ + **/ +@Component +public class UpPracticeLevelHandler extends BaseHandler { + + @Override + public MessageTypeProto.MessageType getMessageCode() { + return MessageTypeProto.MessageType.UpPracticeLevelRequest; + } + + @Override + public GeneratedMessage processWithProto(int uid, HeroInfoProto.UpPracticeLevelRequest proto) throws Exception { + // 用户信息 + User user = UserManager.getUser(uid); + if (user == null) { + throw new ErrorCodeException(ErrorCode.UNKNOWN); + } + + // 获取当前等级和之后的等级 + int level = user.getHeroManager().getPracticeLevel(); + if (level <= 0){ + level = 1; + } + + SXiuXian xiuXian = STableManager.getConfig(SXiuXian.class).get(level); + SXiuXian xiuXian2 = STableManager.getConfig(SXiuXian.class).get(level+1); + if (xiuXian == null || xiuXian2 == null){ + throw new ErrorCodeException("已修行至世间巅峰"); + } + + // 山河社稷图的星星,先用等级代替,之后要改 + int star = user.getPlayerInfoManager().getLevel(); + if (star < xiuXian.getNeedStarNum()){ + throw new ErrorCodeException("无法破境,请前往山河社稷图获取更多星星!"); + } + + // 验证道具消耗 + boolean cost = ItemUtil.itemCost(user, xiuXian.getLevelUpCost(), BIReason.UP_PRACTICE_LEVEL, 0); + if (!cost){ + throw new ErrorCodeException("道具不足!",ErrorCode.ITEM_NOT_ENOUGH); + } + + // 升级 + user.getHeroManager().setPracticeLevel(xiuXian2.getId()); + + // 添加技能 + if (xiuXian2.getTeamSkill() != null){ + for (int seal : xiuXian2.getTeamSkill()) { + SXiuXianSkill xianSkill = STableManager.getConfig(SXiuXianSkill.class).get(seal); + // 添加新神印 + PurpleMansionSeal purpleMansionSeal = new PurpleMansionSeal(seal, xianSkill.getType(),"",0); + user.getHeroManager().putPurpleMansionSeal(purpleMansionSeal); + } + } + + return HeroInfoProto.UpPracticeLevelResponse.newBuilder().setPracticeLevel(xiuXian2.getId()).build(); + } + +} 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 dffed29b8..4d4176aef 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 @@ -7,10 +7,7 @@ import com.ljsd.jieling.logic.dao.root.User; import com.ljsd.jieling.logic.hero.HongMengAttributeEnum; import config.SSpecialConfig; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; public class HeroManager extends MongoBase { @@ -53,15 +50,14 @@ public class HeroManager extends MongoBase { // 鸿蒙碑最大等级,添加限制, private Set hongmengMaxLevel = new HashSet<>(); - // 修行境界等级 + /** + * 修行等级 + */ private int practiceLevel; /** - * 装备得紫府神印 - * key: 神印id - * value: 0 通用 - * -1 未添加英雄 + * 紫府神印 */ - private Map purpleMansionSeal = new HashMap<>(); + private Map purpleMansionSeal = new HashMap<>(); public void updateRandCount(int type,int count){ updateString("totalCount." + type, count); @@ -285,18 +281,18 @@ public class HeroManager extends MongoBase { updateString("practiceLevel", practiceLevel); } - public void addPracticeLevel() { - this.practiceLevel+=1; - updateString("practiceLevel", practiceLevel); - } - - public Map getPurpleMansionSeal() { + public Map getPurpleMansionSeal() { return purpleMansionSeal; } - public void setPurpleMansionSeal(Map purpleMansionSeal) { + public void setPurpleMansionSeal(Map purpleMansionSeal) { this.purpleMansionSeal = purpleMansionSeal; updateString("purpleMansionSeal", purpleMansionSeal); } + + public void putPurpleMansionSeal(PurpleMansionSeal seal) { + purpleMansionSeal.put(seal.getSealId(),seal); + updateString("purpleMansionSeal", purpleMansionSeal); + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/PurpleMansionSeal.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/PurpleMansionSeal.java new file mode 100644 index 000000000..aa6d7a44e --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/PurpleMansionSeal.java @@ -0,0 +1,76 @@ +package com.ljsd.jieling.logic.dao; + +/** + * @Author hj + * @Description //TODO $ + * @Date $ $ + * @Param $ + * @return $ + **/ + +import com.ljsd.common.mogodb.MongoBase; + +public class PurpleMansionSeal extends MongoBase { + + /** + * 印章id + */ + private int sealId; + /** + * 印章类型 + */ + private int type; + /** + * 附属id,英雄id + */ + private String subId; + /** + * 状态 + * 0:未使用 + * 1:已使用 + */ + private int state; + + public PurpleMansionSeal(int sealId, int type, String subId, int state) { + this.sealId = sealId; + this.type = type; + this.subId = subId; + this.state = state; + } + + public int getSealId() { + return sealId; + } + + public void setSealId(int sealId) { + this.sealId = sealId; + updateString("sealId", sealId); + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + updateString("type", type); + } + + public String getSubId() { + return subId; + } + + public void setSubId(String subId) { + this.subId = subId; + updateString("subId", subId); + } + + public int getState() { + return state; + } + + public void setState(int state) { + this.state = state; + updateString("state", state); + } +} 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 e1b45dda7..8cb52bed3 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 @@ -29,7 +29,6 @@ import com.ljsd.jieling.logic.fight.passiveSkillCal.PassiveskillCalEnum; import com.ljsd.jieling.logic.item.ItemLogic; import com.ljsd.jieling.logic.mission.GameEvent; import com.ljsd.jieling.logic.player.PlayerLogic; -import com.ljsd.jieling.network.server.ProtocolsManager; import com.ljsd.jieling.network.session.ISession; import com.ljsd.jieling.util.*; import config.*; @@ -46,7 +45,6 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; -import java.util.stream.Stream; public class HeroLogic{ private static final Logger LOGGER = LoggerFactory.getLogger(HeroLogic.class); @@ -1446,27 +1444,14 @@ public class HeroLogic{ skillList.addAll(tempHero.getPassiveSkills(1, hero.getBreakIdByHongMeng(user.getHeroManager()))); skillList.addAll(tempHero.getPassiveSkills(2, hero.getStarBreakId())); } - //装备没有技能不用计算 -// Map equipByPositionMap = hero.getEquipByPositionMap(); -// if(!equipByPositionMap.isEmpty()){ -// Map equipMap = hero.getCreateType()==1?user.getExpeditionManager().getEquipMap():user.getEquipManager().getEquipMap(); -// for(Integer position : equipSkillPositionTemaplge){ -// Integer equipId = equipByPositionMap.get(position); -// if(equipId==null){ -// continue; -// } -// int skillId = equipMap.get(equipId).getSkill(); -// if(skillId!=0){ -// skillList.add(skillId); -// } -// } -// } + //魂印 Map soulEquipByPositionMap = hero.getSoulEquipByPositionMap(); Map config = STableManager.getConfig(SEquipConfig.class); soulEquipByPositionMap.values().forEach(e->{ Arrays.stream(config.get(e).getPassiveSkill()).forEach(skillList::add); }); + //法宝技能 int[] equipTalismana = tempHero.getEquipTalismana(); if(equipTalismana.length<1 ||hero.getStar()skillList.add(i)); } }); + + // 紫府神印技能 + Collection seals = user.getHeroManager().getPurpleMansionSeal().values(); + seals.forEach(v->{ + // 使用中神印 + if (v.getState() == 1){ + // 附身神印 + if (v.getType() == 1){ + if (v.getSubId().equals(hero.getId())){ + getPurpleMansionSealSkill(v.getSealId(),tempHero,skillList); + } + } + // 通用神印 + else { + getPurpleMansionSealSkill(v.getSealId(),tempHero,skillList); + } + } + }); + return skillList; } + /** + * 获取紫府神印技能 + * @param sealId + * @param tempHero + * @param skillList + */ + private void getPurpleMansionSealSkill(int sealId,SCHero tempHero,List skillList){ + SXiuXianSkill xianSkill = STableManager.getConfig(SXiuXianSkill.class).get(sealId); + // 技能数组转list + int skillId = xianSkill.getSkillId(); + // 适用范围 + int[] fitList = xianSkill.getFitList(); + switch (fitList[0]){ + case 0: + // 不限 + skillList.add(skillId); + break; + case 1: + // 阵营限制 + if (tempHero.getPropertyName() == fitList[1]){ + skillList.add(skillId); + } + break; + case 2: + // 职业限制 + if (tempHero.getProfession() == fitList[1]){ + skillList.add(skillId); + } + break; + default: + break; + } + } + public void coverSkill(List heroSkillList){ Set coverSkillIds = new HashSet<>(); heroSkillList.forEach(skill->{ @@ -1889,6 +1927,15 @@ public class HeroLogic{ } }); + // 修行等级属性加成 + Map xiuXianMap = STableManager.getConfig(SXiuXian.class); + int practiceLevel = user.getHeroManager().getPracticeLevel(); + xiuXianMap.values().forEach(v->{ + if (v.getId() >= practiceLevel && v.getTotalPros() != null){ + combinedAttribute(v.getTotalPros(),heroAllAttribute); + } + }); + // //皮肤、称号加成 -- 前端未实现,暂时注释 // int decoration = user.getPlayerInfoManager().getDecoration(); // int designation = user.getPlayerInfoManager().getDesignation(); 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 def20ef6d..54337bf71 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/util/CBean2Proto.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/util/CBean2Proto.java @@ -698,11 +698,29 @@ public class CBean2Proto { return builder.build(); } - public static CommonProto.TeamSimpleInfo getSimpleTeamInfoByHero(User user, Hero hero,int position){ return CommonProto.TeamSimpleInfo.newBuilder().setHeroid(hero.getId()).setHeroTid(hero.getTemplateId()).setLevel(hero.getLevel(user.getHeroManager())).setStar(hero.getStar()).setPosition(position).setSkinId(hero.getSkin()).build(); } public static CommonProto.TeamSimpleInfo getSimpleTeamInfoByPokeMon(Pokemon pokemon,int position){ return CommonProto.TeamSimpleInfo.newBuilder().setHeroid(pokemon.getId()).setHeroTid(pokemon.getTmpId()).setLevel(pokemon.getLevel()).setStar(pokemon.getStar()).setPosition(position).build(); } + + /** + * 获取紫府神印list by proto + * @param user + * @return + */ + public static List getPurpleMansionSealInfo(User user){ + ArrayList list = new ArrayList<>(); + user.getHeroManager().getPurpleMansionSeal().values().forEach(v->{ + CommonProto.PurpleMansionSeal seal = CommonProto.PurpleMansionSeal.newBuilder() + .setId(v.getSealId()) + .setType(v.getType()) + .setSubId(v.getSubId()) + .setState(v.getState()) + .build(); + list.add(seal); + }); + return list; + } } diff --git a/tablemanager/src/main/java/config/SXiuXian.java b/tablemanager/src/main/java/config/SXiuXian.java new file mode 100644 index 000000000..91b389231 --- /dev/null +++ b/tablemanager/src/main/java/config/SXiuXian.java @@ -0,0 +1,61 @@ +package config; + +import manager.STableManager; +import manager.Table; + +import java.util.Map; + +@Table(name ="XiuXian") +public class SXiuXian implements BaseConfig { + + private int id; + + private int realmId; + + private int realmLevel; + + private int[][] levelUpCost; + + private int[][] totalPros; + + private int needStarNum; + + private int[] teamSkill; + + + @Override + public void init() throws Exception { + + } + + + public int getId() { + return id; + } + + public int getRealmId() { + return realmId; + } + + public int getRealmLevel() { + return realmLevel; + } + + public int[][] getLevelUpCost() { + return levelUpCost; + } + + public int[][] getTotalPros() { + return totalPros; + } + + public int getNeedStarNum() { + return needStarNum; + } + + public int[] getTeamSkill() { + return teamSkill; + } + + +} \ No newline at end of file diff --git a/tablemanager/src/main/java/config/SXiuXianSkill.java b/tablemanager/src/main/java/config/SXiuXianSkill.java new file mode 100644 index 000000000..ab5d14cef --- /dev/null +++ b/tablemanager/src/main/java/config/SXiuXianSkill.java @@ -0,0 +1,41 @@ +package config; + +import manager.STableManager; +import manager.Table; + +import java.util.HashMap; +import java.util.Map; + +@Table(name ="XiuXianSkill") +public class SXiuXianSkill implements BaseConfig { + + private int id; + + private int type; + + private int[] fitList; + + private int skillId; + + @Override + public void init() throws Exception { + + } + + + public int getId() { + return id; + } + + public int getType() { + return type; + } + + public int[] getFitList() { + return fitList; + } + + public int getSkillId() { + return skillId; + } +} \ No newline at end of file