diff --git a/common/src/main/java/com/ljsd/common/mogodb/MongoBase.java b/common/src/main/java/com/ljsd/common/mogodb/MongoBase.java index fbdc57fbb..7bd432323 100644 --- a/common/src/main/java/com/ljsd/common/mogodb/MongoBase.java +++ b/common/src/main/java/com/ljsd/common/mogodb/MongoBase.java @@ -24,12 +24,22 @@ public abstract class MongoBase implements Serializable { } public void updateString(String fieldName, Object value) { - if("".equals(mongoKey)){ - MongoUpdateCacheThreadLocal.addUpdateRequest(this, fieldName, value); - }else{ - MongoUpdateCacheThreadLocal.addUpdateRequest(this, mongoKey + "." + fieldName, value); + if(null == value){ + if("".equals(mongoKey)){ + MongoUpdateCacheThreadLocal.removeRequest(this, fieldName); + }else{ + MongoUpdateCacheThreadLocal.removeRequest(this, mongoKey + "." + fieldName); + } + + }else { + if("".equals(mongoKey)){ + MongoUpdateCacheThreadLocal.addUpdateRequest(this, fieldName, value); + }else{ + MongoUpdateCacheThreadLocal.addUpdateRequest(this, mongoKey + "." + fieldName, value); + } } + } public void removeSubString(String key) { 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 baf51435f..1faf9ef61 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/globals/BIReason.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/globals/BIReason.java @@ -145,6 +145,8 @@ public interface BIReason { int EQUIP_UNLOAD_REWARD = 79;//卸下装备 int ESPECIAL_BACK = 80;//法宝归元获得 + int HERO_CHANGE= 81;//抽卡 + int ADVENTURE_UPLEVEL_CONSUME = 1000;//秘境升级 int SECRETBOX_CONSUME = 1001;//秘盒抽卡 diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/hero/CancelHeroChangeRequestHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/hero/CancelHeroChangeRequestHandler.java new file mode 100644 index 000000000..2ef185a21 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/hero/CancelHeroChangeRequestHandler.java @@ -0,0 +1,36 @@ +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.Hero; +import com.ljsd.jieling.logic.dao.UserManager; +import com.ljsd.jieling.logic.dao.root.User; +import com.ljsd.jieling.protocols.HeroInfoProto; +import com.ljsd.jieling.protocols.MessageTypeProto; + +/** + * Description: 清除英雄 + * Author: zsx + * CreateDate: 2020/8/10 10:51 + */ +public class CancelHeroChangeRequestHandler extends BaseHandler { + + @Override + public MessageTypeProto.MessageType getMessageCode() { + return null; + } + + @Override + public GeneratedMessage processWithProto(int uid, HeroInfoProto.CancelHeroChangeRequest proto) throws Exception { + + User user = UserManager.getUser(uid); + Hero hero = user.getHeroManager().getHero(proto.getHeroId()); + if (hero == null){ + throw new ErrorCodeException( ErrorCode.ITEM_DECOMPOSE_NO_HERO); + } + hero.setChangeId(0); + return HeroInfoProto.CancelHeroChangeResponse.newBuilder().build(); + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/hero/DoHeroChangeRequestHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/hero/DoHeroChangeRequestHandler.java new file mode 100644 index 000000000..8f73a59a7 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/hero/DoHeroChangeRequestHandler.java @@ -0,0 +1,73 @@ +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.Hero; +import com.ljsd.jieling.logic.dao.UserManager; +import com.ljsd.jieling.logic.dao.root.User; +import com.ljsd.jieling.logic.expedition.ExpeditionLogic; +import com.ljsd.jieling.logic.hero.HeroLogic; +import com.ljsd.jieling.protocols.CommonProto; +import com.ljsd.jieling.protocols.HeroInfoProto; +import com.ljsd.jieling.protocols.MessageTypeProto; +import com.ljsd.jieling.util.CBean2Proto; +import com.ljsd.jieling.util.ItemUtil; +import config.SCHero; +import config.SSpecialConfig; + +/** + * Description: des + * Author: zsx + * CreateDate: 2020/8/10 10:51 + */ +public class DoHeroChangeRequestHandler extends BaseHandler { + @Override + public MessageTypeProto.MessageType getMessageCode() { + return null; + } + + @Override + public GeneratedMessage processWithProto(int uid, HeroInfoProto.DoHeroChangeRequest proto) throws Exception { + + User user = UserManager.getUser(uid); + Hero hero = user.getHeroManager().getHero(proto.getHeroId()); + if (hero == null){ + throw new ErrorCodeException( ErrorCode.ITEM_DECOMPOSE_NO_HERO); + } + if(hero.getChangeId()==0){ + throw new ErrorCodeException("未置换"); + } + //check lock + if(hero.getIsLock() == 1){ + throw new ErrorCodeException( ErrorCode.ITEM_DECOMPOSE_HERO_LOCK); + } + //check cfg + SCHero hero1 = SCHero.getsCHero().get(hero.getTemplateId()); + if(null == hero1){ + throw new ErrorCodeException(ErrorCode.CFG_NULL); + } + +// int[][] ints = new int[1][2]; +// ints[0][0]=hero.getChangeId(); +// ints[0][1]= 1; + + //check in team + int[] teamId = SSpecialConfig.getOnceArrayValue(SSpecialConfig.HERO_RESOLVE_LICENCE); + boolean battleArray = HeroLogic.getInstance().isBattleArray(user, proto.getHeroId(),teamId); + if (!battleArray){ + throw new ErrorCodeException(ErrorCode.ITEM_DECOMPOSE_HERO_TEAM); + } + + user.getHeroManager().removeHero(uid,hero.getId()); + + CommonProto.Drop.Builder drop = CommonProto.Drop.newBuilder(); + //random tempid + Hero newHero = new Hero(uid,hero.getChangeId(),hero.getStar(),hero); + user.getHeroManager().addHero(newHero); + drop.addHero(CBean2Proto.getHero(newHero)); + return HeroInfoProto.DoHeroChangeResponse.newBuilder().setDrop(drop).build(); + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/hero/SaveHeroChangeRequestHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/hero/SaveHeroChangeRequestHandler.java new file mode 100644 index 000000000..e146e2c93 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/hero/SaveHeroChangeRequestHandler.java @@ -0,0 +1,120 @@ +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.Hero; +import com.ljsd.jieling.logic.dao.TeamPosHeroInfo; +import com.ljsd.jieling.logic.dao.UserManager; +import com.ljsd.jieling.logic.dao.root.User; +import com.ljsd.jieling.logic.hero.HeroLogic; +import com.ljsd.jieling.logic.player.PlayerLogic; +import com.ljsd.jieling.protocols.CommonProto; +import com.ljsd.jieling.protocols.HeroInfoProto; +import com.ljsd.jieling.protocols.MessageTypeProto; +import com.ljsd.jieling.util.ItemUtil; +import config.SCHero; +import config.SLotteryRewardConfig; +import config.SLotterySetting; +import config.SSpecialConfig; +import manager.STableManager; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + +/** + * Description: des + * Author: zsx + * CreateDate: 2020/8/10 10:51 + */ +public class SaveHeroChangeRequestHandler extends BaseHandler { + @Override + public MessageTypeProto.MessageType getMessageCode() { + return null; + } + + @Override + public GeneratedMessage processWithProto(int uid, HeroInfoProto.SaveHeroChangeRequest proto) throws Exception { + + User user = UserManager.getUser(uid); + Hero hero = user.getHeroManager().getHero(proto.getHeroId()); + if (hero == null){ + throw new ErrorCodeException( ErrorCode.ITEM_DECOMPOSE_NO_HERO); + } + //check lock + if(hero.getIsLock() == 1){ + throw new ErrorCodeException( ErrorCode.ITEM_DECOMPOSE_HERO_LOCK); + } + //check cfg + SCHero hero1 = SCHero.getsCHero().get(hero.getTemplateId()); + if(null == hero1){ + throw new ErrorCodeException(ErrorCode.CFG_NULL); + } + + + //check in team + int[] teamId = SSpecialConfig.getOnceArrayValue(SSpecialConfig.HERO_RESOLVE_LICENCE); + AtomicBoolean inTeams = HeroLogic.getInstance().isInTeams(user, proto.getHeroId(), teamId); + if(!inTeams.get()){ + throw new ErrorCodeException(ErrorCode.ITEM_DECOMPOSE_HERO_TEAM); + } + + int propertyName = hero1.getPropertyName(); + int heroStar = hero.getStar(); + Map integerIntegerMap = SLotterySetting.getChangeIds().get(heroStar); + if(null == integerIntegerMap|| integerIntegerMap.size() ==0){ + throw new ErrorCodeException(ErrorCode.CFG_NULL); + } + + int type =integerIntegerMap.get(propertyName); + + SLotterySetting sLotterySetting = STableManager.getConfig(SLotterySetting.class).get(type); + int perCount = sLotterySetting.getPerCount(); + + //check item + boolean enoughCost = false; + for (int[] cost:sLotterySetting.getCostItem()){ + int [][] costItems = new int[][]{cost}; + enoughCost = ItemUtil.itemCost(user, costItems,BIReason.RANDOM_HERO_CONSUME,type); + if(enoughCost){ + break; + } + } + if(!enoughCost){ + throw new ErrorCodeException(ErrorCode.ITEM_NOT_ENOUGH); + } + + + //random Hero + int result =hero.getTemplateId(); + int j=0; + while (j<1000&&result==hero.getTemplateId()){ + j++; + //所有获得物品 + int[][] resultRandom = new int[perCount][]; + //进行抽取 + for(int i = 0 ;i specialConfigs = SLotterySpecialConfig.getLotterySpecialConfigListByType(mergePool); @@ -401,7 +405,7 @@ public class HeroLogic{ return poolId; } - private int getPooId(SLotterySetting sLotterySetting) throws Exception { + private static int getPooId(SLotterySetting sLotterySetting) throws Exception { int[][] diamondBoxContain = sLotterySetting.getDiamondBoxContain(); int totalWeight = 0; for(int i=0;i sLotteryRewardConfigs = new ArrayList<>(); List sLotteryRewardConfigListByPoolId = SLotteryRewardConfig.getSLotteryRewardConfigListByPoolId(poolId); int totalCountByPoolId =0; @@ -2189,19 +2193,16 @@ public class HeroLogic{ //妖灵师是否在阵容中 - public boolean isBattleArray (User user,String heroId){ + public boolean isBattleArray (User user,String heroId,int[] teamId){ Map> teamPosForHero = user.getTeamPosManager().getTeamPosForHero(); //判断是否不可下阵中有该英雄 - AtomicBoolean result = new AtomicBoolean(true); - int[] teamId = SSpecialConfig.getOnceArrayValue(SSpecialConfig.HERO_RESOLVE_LICENCE); + + List list = new ArrayList<>(); Arrays.stream(teamId).forEach(i->list.add(i)); - list.stream().filter(tId->teamPosForHero.containsKey(tId)).forEach(tId->teamPosForHero.get(tId).forEach(hero->{ - if(hero.getHeroId().equals(heroId)){ - result.set(false); - } - })); + AtomicBoolean result = isInTeams(user, heroId, teamId); + //直接删除英雄 if(result.get()){ teamPosForHero.entrySet().stream().filter(entry-> @@ -2227,6 +2228,22 @@ public class HeroLogic{ return result.get(); } + public AtomicBoolean isInTeams(User user,String heroId,int[] teamId){ + Map> teamPosForHero = user.getTeamPosManager().getTeamPosForHero(); + //判断是否不可下阵中有该英雄 + AtomicBoolean result = new AtomicBoolean(true); + + List list = new ArrayList<>(); + Arrays.stream(teamId).forEach(i->list.add(i)); + + list.stream().filter(tId->teamPosForHero.containsKey(tId)).forEach(tId->teamPosForHero.get(tId).forEach(hero->{ + if(hero.getHeroId().equals(heroId)){ + result.set(false); + } + })); + return result; + } + public int calPokenmonForce(Pokemon pokemon){ Map pokemonAttributeMap = new HashMap<>(); combinePokemonAttribute(pokemonAttributeMap, pokemon,false); @@ -2609,7 +2626,7 @@ public class HeroLogic{ } Map returnItems = new HashMap<>(); equipIdsList.forEach(e->{ - soulEquipByPositionMap.remove(e.getPosition()); + hero.removeSoulEquip(e.getPosition()); returnItems.put(e.getEquipId(),1); }); ItemUtil.dropMap(user,returnItems,BIReason.UNLOAD_SOUL_REWARD); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/item/ItemLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/item/ItemLogic.java index fb07a6371..35fff7c63 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/item/ItemLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/item/ItemLogic.java @@ -464,7 +464,8 @@ public class ItemLogic { if(hero.getIsLock() == 1){ return ErrorCode.ITEM_DECOMPOSE_HERO_LOCK; } - boolean battleArray = HeroLogic.getInstance().isBattleArray(user, heroId); + int[] teamId = SSpecialConfig.getOnceArrayValue(SSpecialConfig.HERO_RESOLVE_LICENCE); + boolean battleArray = HeroLogic.getInstance().isBattleArray(user, heroId,teamId); if (!battleArray){ return ErrorCode.ITEM_DECOMPOSE_HERO_TEAM; } 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 30ad00ce7..dbff9d087 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/util/CBean2Proto.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/util/CBean2Proto.java @@ -105,6 +105,7 @@ public class CBean2Proto { .setLockState(hero.getIsLock()) .addAllJewels(hero.getJewelInfo()) .setCreatetype(hero.getCreateType()) + .setChangeId(hero.getChangeId()) .build(); } diff --git a/tablemanager/src/main/java/config/SLotterySetting.java b/tablemanager/src/main/java/config/SLotterySetting.java index 12738a742..f17b974d9 100644 --- a/tablemanager/src/main/java/config/SLotterySetting.java +++ b/tablemanager/src/main/java/config/SLotterySetting.java @@ -1,38 +1,56 @@ package config; +import manager.STableManager; import manager.Table; +import java.util.HashMap; +import java.util.Map; + @Table(name ="LotterySetting") public class SLotterySetting implements BaseConfig { private int id; - private int diamondBoxInterval; - - private int[][] cost; - - - private int[][] diamondBoxContain; - - private int[][] tenTimesMustGetItem; - - private int[][] costItem; - - private int perCount; - private int lotteryType; - private int mergePool; + private int propertyType; - private int activityId; + private int diamondBoxInterval; + + private int[][] costItem; private int freeTimes; private int maxTimes; + private int[][] diamondBoxContain; - @Override + private int[][] tenTimesMustGetItem; + + private int perCount; + + private int mergePool; + + private int activityId; + + public static Map> changeIds = new HashMap<>(); + + @Override public void init() throws Exception { + Map> integerMapMap = new HashMap<>(); + Map config = STableManager.getConfig(SLotterySetting.class); + for (Map.Entry entry:config.entrySet()) { + if(entry.getValue().getLotteryType()==7){ + Map orDefault = integerMapMap.getOrDefault(4, new HashMap<>()); + orDefault.put(entry.getValue().getPropertyType(),entry.getKey()); + integerMapMap.put(4,orDefault); + }else if (entry.getValue().getLotteryType()==8){ + Map orDefault = integerMapMap.getOrDefault(5, new HashMap<>()); + orDefault.put(entry.getValue().getPropertyType(),entry.getKey()); + integerMapMap.put(5,orDefault); + } + } + changeIds = integerMapMap; } @@ -41,49 +59,56 @@ public class SLotterySetting implements BaseConfig { return id; } + public int getLotteryType() { + return lotteryType; + } + + public int getPropertyType() { + return propertyType; + } + public int getDiamondBoxInterval() { return diamondBoxInterval; } - public int[][] getCost() { - return cost; + public int[][] getCostItem() { + return costItem; } + public int getFreeTimes() { + return freeTimes; + } + + public int getMaxTimes() { + return maxTimes; + } public int[][] getDiamondBoxContain() { return diamondBoxContain; } - public int[][] getTenTimesMustGetItem() { + public int[][] getTenTimesMustGetItem() { return tenTimesMustGetItem; } - public int getPerCount() { + public int getPerCount() { return perCount; } - public int[][] getCostItem() { - return costItem; - } - - public int getLotteryType() { - return lotteryType; - } - - public int getMergePool() { + public int getMergePool() { return mergePool; } - - public int getActivityId() { + public int getActivityId() { return activityId; } - public int getFreeTimes() { - return freeTimes; + + public static Map> getChangeIds() { + return changeIds; } - public int getMaxTimes() { - return maxTimes; + public static void setChangeIds(Map> changeIds) { + SLotterySetting.changeIds = changeIds; } } \ No newline at end of file diff --git a/tablemanager/src/main/java/config/SSpecialConfig.java b/tablemanager/src/main/java/config/SSpecialConfig.java index a6ba918f1..75d596e96 100644 --- a/tablemanager/src/main/java/config/SSpecialConfig.java +++ b/tablemanager/src/main/java/config/SSpecialConfig.java @@ -67,6 +67,9 @@ public class SSpecialConfig implements BaseConfig { public static final String DISCOUNT_LEVEL= "discount_level";//限时折扣推送等级#推送间隔等级 public static final String GUILD_WAR_ISOPEN = "Guild_war_isopen";//老公会战是否开启 public static final String LUCKYTURNDAILYLIMIT = "LuckyTurnDailyLimit";//幸运探宝每日上限 + + public static final String REPLACE_ITEM_ID = "replace_item_id";//置换玉道具ID + public static final String REPLACE_COST = "replace_cost";//置换玉消耗 @Override public void init() throws Exception {