From 80b1659cb17ad2884d58b62ba05050f2c78d2b64 Mon Sep 17 00:00:00 2001 From: duhui Date: Mon, 12 Jul 2021 17:45:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BF=83=E6=84=BF=E6=8A=BD=E5=8D=A1=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jieling/handler/GetPlayerInfoHandler.java | 2 +- .../ljsd/jieling/logic/dao/HeroManager.java | 33 ++++++-- .../ljsd/jieling/logic/hero/HeroLogic.java | 78 ++++++++++--------- tablemanager/src/main/java/config/SCHero.java | 6 ++ 4 files changed, 74 insertions(+), 45 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 bf3726529..c1f9384a2 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/GetPlayerInfoHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/GetPlayerInfoHandler.java @@ -270,7 +270,7 @@ public class GetPlayerInfoHandler extends BaseHandler{ int value = SSpecialConfig.getIntegerValue(SSpecialConfig.UNLOCKCARDWISH); if (num < value){ // 修改次数 - user.getHeroManager().putRandomCount(1,value); + user.getHeroManager().putRandomType(1,value); } } } 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 3d13da815..5ae33e11e 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 @@ -1,17 +1,11 @@ package com.ljsd.jieling.logic.dao; import com.ljsd.common.mogodb.MongoBase; -import com.ljsd.jieling.logic.OnlineUserManager; import com.ljsd.jieling.logic.activity.event.Poster; import com.ljsd.jieling.logic.activity.event.RemoveHeroEvent; import com.ljsd.jieling.logic.dao.root.User; import com.ljsd.jieling.logic.hero.HongMengAttributeEnum; -import com.ljsd.jieling.network.session.ISession; -import com.ljsd.jieling.util.CBean2Proto; -import com.ljsd.jieling.util.MessageUtil; import config.SSpecialConfig; -import rpc.protocols.HeroInfoProto; -import rpc.protocols.MessageTypeProto; import java.util.*; @@ -83,6 +77,11 @@ public class HeroManager extends MongoBase { */ private Map randomCountByType = new HashMap<>(); + /** + * key: 招募类型 value:< key: 星级 value: 数量 > + */ + private Map> randomCountByStar = new HashMap<>(); + public Map getRandomCountByType() { return randomCountByType; } @@ -92,12 +91,30 @@ public class HeroManager extends MongoBase { updateString("randomCountByType", randomCountByType); } - public void putRandomCount(int type,int value) { + public void putRandomType(int type,int value) { randomCountByType.put(type,value); updateString("randomCountByType."+type, value); } - public void updateRandCount(int type,int count){ + public Map> getRandomCountByStar() { + return randomCountByStar; + } + + public Map getRandomStar(int type) { + return randomCountByStar.getOrDefault(type,new HashMap<>()); + } + + public void setRandomCountByStar(Map> randomCountByStar) { + this.randomCountByStar = randomCountByStar; + updateString("randomCountByStar", randomCountByStar); + } + + public void putRandomStar(int type,Map starMap) { + randomCountByStar.put(type,starMap); + updateString("randomCountByStar."+type, starMap); + } + + public void updateRandCount(int type, int count){ updateString("totalCount." + type, count); totalCount.put(type,count); } 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 566ed99b7..b7dcc7792 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 @@ -383,19 +383,33 @@ public class HeroLogic{ */ private int[] drawCard(User user, SLotteryRewardConfig sLotteryRewardConfig, SLotterySetting sLotterySetting){ HeroManager heroManager = user.getHeroManager(); - // 限制次数 + // 参数 + int type = sLotterySetting.getLotteryType(); + int[] reward = sLotteryRewardConfig.getReward(); + // 限制满足次数 int value = SSpecialConfig.getIntegerValue(SSpecialConfig.UNLOCKCARDWISH); // 对应卡池抽奖次数 - Integer num = heroManager.getRandomCountByType().getOrDefault(sLotterySetting.getLotteryType(),0); + Integer num = heroManager.getRandomCountByType().getOrDefault(type,0); // 心愿抽卡 int[] result; - if (sLotterySetting.getLotteryType() == 1 && num >= value){ - result = wishDrawCardCheck(user,sLotteryRewardConfig.getReward()); + if (type == 1 && num >= value){ + // 钻石抽卡并且次数满足 + result = wishDrawCardCheck(user,reward,type); }else { - result = sLotteryRewardConfig.getReward(); + result = reward; } - //记录次数 - heroManager.putRandomCount(sLotterySetting.getLotteryType(),num+1); + //记录卡池抽奖次数 + heroManager.putRandomType(type,num+result[1]); + // 记录卡池,抽奖星级次数 + SCHero scHero = SCHero.getsCHero().get(reward[0]); + if (scHero != null){ + // 获取类型抽奖次数 + Map randomStar = heroManager.getRandomStar(type); + // 更新次数 + randomStar.put(scHero.getStar(),randomStar.getOrDefault(scHero.getStar(),0)+result[1]); + heroManager.putRandomStar(type,randomStar); + } + return result; } @@ -405,7 +419,7 @@ public class HeroLogic{ * @param item * @return */ - private int[] wishDrawCardCheck(User user,int[] item){ + private int[] wishDrawCardCheck(User user,int[] item,int type){ // 查找物品 SItem sItem = SItem.getsItemMap().get(item[0]); // 非英雄奖励直接返回 @@ -417,42 +431,34 @@ public class HeroLogic{ if (scHero.getStar() < 5){ return item; } - /* ======================= 中不中心愿 ======================= */ - // 随机权重 - int totalNum = 10000; - int anInt = MathUtils.randomInt(totalNum); - // 单个格子权重 - int value = SSpecialConfig.getIntegerValue(SSpecialConfig.CARDWISHBLOCKRATE); - // 获取玩家现在的心愿格子信息 - Map cardInfoMap = user.getHeroManager().getWishDrawCardInfoMap(); - // 中将权重值 - int weight = cardInfoMap.size() * value; - // 未中奖 - if (anInt > weight){ + // 获取钻石抽奖抽中五星的次数 + int num = user.getHeroManager().getRandomStar(type).getOrDefault(5, 0)+1; + boolean randomBol = (num - 1) % 3 == 0; + if (!randomBol){ + // 不到次数,不走心愿 return item; } - /*======================== 中心愿随机奖励 ========================*/ - + // 心愿格子信息 + HashMap cardInfoMap = user.getHeroManager().getWishDrawCardInfoMap(); + // 空格子权重 + int empty = SSpecialConfig.getIntegerValue(SSpecialConfig.CARDWISHBLOCKRATE); // 计算权重map HashMap map = new HashMap<>(); - for (Integer key : cardInfoMap.keySet()) { - if (cardInfoMap.get(key).getStatus() == 1){ - // 已经抽中得格子去除 - weight-=value; - continue; + cardInfoMap.forEach((k,v)->{ + if (v.getStatus() == 0 && v.getHeroTid() != 0){ + // 英雄格子 + SCHero hero = SCHero.getsCHero().get(v.getHeroTid()); + map.put(k,hero.getWeight()); + }else { + // 空格子 + map.put(k,empty); } - map.put(key,value); - } - - // 全部抽中 - if (map.isEmpty() || weight == 0){ - return item; - } - + }); + // 随机权重 + int weight = map.values().stream().mapToInt(Integer::intValue).sum(); int randomInt = MathUtils.randomInt(weight); - // 遍历权重 for (Map.Entry entry : map.entrySet()) { if (randomInt <= entry.getValue()){ diff --git a/tablemanager/src/main/java/config/SCHero.java b/tablemanager/src/main/java/config/SCHero.java index fa4188d4d..547c5f3ad 100644 --- a/tablemanager/src/main/java/config/SCHero.java +++ b/tablemanager/src/main/java/config/SCHero.java @@ -60,6 +60,8 @@ public class SCHero implements BaseConfig{ private int maxLevel; + private int weight; + private Map secondaryFactorMap; private Map> skillListByStar; @@ -348,4 +350,8 @@ public class SCHero implements BaseConfig{ public int getMaxLevel() { return maxLevel; } + + public int getWeight() { + return weight; + } }