From e0695cf73e3ea44ef0d1804d9ee0423fa008a6d3 Mon Sep 17 00:00:00 2001 From: grimm <1769111741@qq.com> Date: Tue, 4 Jun 2024 18:04:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=8F=E5=85=B5=E6=8B=9B=E5=8B=9F=E5=8A=A0?= =?UTF-8?q?=E4=BF=9D=E5=BA=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ljsd/jieling/logic/arena/ArenaLogic.java | 2 +- .../jieling/logic/dao/MainLevelManager.java | 16 +++ .../jieling/logic/fight/DuoduiTowerLogic.java | 2 +- .../jieling/logic/soldier/SoldierLogic.java | 107 ++++++++++++++++-- 4 files changed, 117 insertions(+), 10 deletions(-) diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/arena/ArenaLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/arena/ArenaLogic.java index 169b3ca24..4cb78f44f 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/arena/ArenaLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/arena/ArenaLogic.java @@ -200,7 +200,7 @@ public class ArenaLogic { */ public void checkChallenge(User user, boolean ifUpdate) throws Exception { if (!user.getTeamPosManager().getTeamPosForHero().containsKey(TeamEnum.TEAM_ARENA_DEFENSE.getTeamId())) { - throw new ErrorTableException(161);//编队未配置 + throw new ErrorTableException(189);//编队未配置 } SArenaSetting sArenaSetting = SArenaSetting.getSArenaSetting(); int battleFree = sArenaSetting.getBattleFree(); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/MainLevelManager.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/MainLevelManager.java index 4a2a9da0c..f002b701e 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/MainLevelManager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/MainLevelManager.java @@ -31,6 +31,8 @@ public class MainLevelManager extends MongoBase { private int upSoldierLvEndTime;//兵力升级结束时间 private int soldierRestartTime;//小兵挂机开始时间 private Map soldierStateInfo = new HashMap<>();//小兵每关单独挂机时间 + private int soldierLowCount;// 小兵最低属性次数 + public void init(){ int nowInt = TimeUtils.nowInt(); setStartTime(nowInt); @@ -269,4 +271,18 @@ public class MainLevelManager extends MongoBase { this.soldierStateInfo.clear(); updateString("soldierStateInfo",soldierStateInfo); } + + public int getSoldierLowCount() { + return soldierLowCount; + } + + public void setSoldierLowCount(int soldierLowCount) { + this.soldierLowCount = soldierLowCount; + updateString("soldierLowCount",soldierLowCount); + } + + public void addSoldierLowCount(int count) { + this.soldierLowCount += count; + updateString("soldierLowCount",soldierLowCount); + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/DuoduiTowerLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/DuoduiTowerLogic.java index ab13690eb..508f1b4a7 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/DuoduiTowerLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/DuoduiTowerLogic.java @@ -101,7 +101,7 @@ public class DuoduiTowerLogic { } if (!verifyTeam(type, user)) { LOGGER.error("队伍存在空阵容,类型:{},当前层数:{},要挑战层数:{},uid:{}", type, rankTier, tier, user.getId()); - throw new ErrorTableException(187); + throw new ErrorTableException(187);//编队为空 } for (SDuoDuiTower tower : towers) { PVEFightEvent pveFightEvent = new PVEFightEvent(user.getId(), tower.getTowerWaveTeam(), 20, GameFightType.DuoduiFight, tower.getId()); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/soldier/SoldierLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/soldier/SoldierLogic.java index 144ef980c..c8a2cb22a 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/soldier/SoldierLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/soldier/SoldierLogic.java @@ -25,6 +25,7 @@ import com.ljsd.jieling.util.ItemUtil; import com.ljsd.jieling.util.MessageUtil; import com.ljsd.jieling.util.ToolsUtil; import config.*; +import org.apache.commons.lang3.RandomUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import rpc.protocols.CommonProto; @@ -159,6 +160,35 @@ public class SoldierLogic { if (lotteryConfig == null){ throw new ErrorCodeException(ErrorCode.CFG_NULL);//配置不存在 } + Soldier soldier = null; + int lowCount = mainLevelManager.getSoldierLowCount();//be + int maxNumber = SSpecialConfig.getIntegerValue("Soldiers_Lottery_Maxnumber"); + if (lowCount >= maxNumber){ + // 特殊招募 + soldier = specialRecruitSoldier(user); + } + if (soldier == null){ + // 普通招募 + soldier = usuallyRecruitSoldier(user); + } + // 消耗 + ItemUtil.itemCost(user, new int[][]{lotteryCost}, BIReason.SOLDIER_LOTTERY_COST, 0); + // 获得 + mainLevelManager.updateSoldier(soldier); + + CommonProto.Soldier soldierProto = CBean2Proto.getSoldierProto(soldier); + MapInfoProto.RecruitSoldierResponse.Builder builder = MapInfoProto.RecruitSoldierResponse.newBuilder().setSoldier(soldierProto); + MessageUtil.sendMessage(session, 1, MessageTypeProto.MessageType.RecruitSoldierResponse_VALUE, builder.build(), true); + } + + /** + * 普通招募小兵 + * @param user 用户 + * @return 小兵 + */ + public Soldier usuallyRecruitSoldier(User user){ + int soldierLv = user.getMainLevelManager().getSoldierLv(); + SSoldiersLotteryConfig lotteryConfig = SSoldiersLotteryConfig.levelMap.get(soldierLv); int[] soldierType = lotteryConfig.getSoldierType(); Random random = new Random(); int typeIndex = random.nextInt(soldierType.length); @@ -193,14 +223,73 @@ public class SoldierLogic { soldier.setLevel(level); soldier.setPosition(-1); soldier.setAttributes(attributes); - // 消耗 - ItemUtil.itemCost(user, new int[][]{lotteryCost}, BIReason.SOLDIER_LOTTERY_COST, 0); - // 获得 - mainLevelManager.updateSoldier(soldier); - CommonProto.Soldier soldierProto = CBean2Proto.getSoldierProto(soldier); - MapInfoProto.RecruitSoldierResponse.Builder builder = MapInfoProto.RecruitSoldierResponse.newBuilder().setSoldier(soldierProto); - MessageUtil.sendMessage(session, 1, MessageTypeProto.MessageType.RecruitSoldierResponse_VALUE, builder.build(), true); + return soldier; + } + + /** + * 特殊小兵招募返回 + * @param user 用户 + * @return 小兵信息 + */ + public Soldier specialRecruitSoldier(User user){ + MainLevelManager manager = user.getMainLevelManager(); + int size = manager.getSoldierMap().values().size(); + if (size == 0){ + LOGGER.error("特殊次数招募小兵退出,玩家当前没有小兵, uid:{}, size:{}",user.getId(), size); + return null; + } + int[] randomIntS = new int[size]; + int index = 0; + for (Soldier value : manager.getSoldierMap().values()) { + randomIntS[index] = value.getPosition(); + index++; + } + int i = RandomUtils.nextInt(0, size); + Soldier soldier = manager.getSoldier(randomIntS[i]); + if (soldier == null){ + LOGGER.error("特殊次数招募小兵退出,随机的位置没有小兵, uid:{}, position:{}",user.getId(), randomIntS[i]); + return null; + } + SSoldiersSetting setting = SSoldiersSetting.idMap.get(soldier.getId()); + if (setting == null){ + LOGGER.error("特殊次数招募小兵退出,小兵id在SoldiersSetting表找不到, uid:{}, id:{}",user.getId(), soldier.getId()); + return null; + } + SSoldiersLevelConfig levelConfig = SSoldiersLevelConfig.libForLevelMap.get(setting.getSoldiers()).get(soldier.getLevel()); + if (levelConfig == null){ + LOGGER.error("特殊次数招募小兵退出,小兵信息在SoldiersLevelConfig表找不到, uid:{}, libraryId:{}, level:{}",user.getId(), setting.getSoldiers(), soldier.getLevel()); + return null; + } + // 最大属性 + HashMap maxAttrMap = new HashMap<>(); + for (int[] ints : levelConfig.getProperty()) { + maxAttrMap.put(ints[0], (long) (ints[1] * (setting.getSoldierProperty()[1]/10000D))); + } + // 属性 + HashMap attributes = new HashMap<>(); + for (Map.Entry entry : soldier.getAttributes().entrySet()) { + int id = entry.getKey(); + long value = entry.getValue(); + Long maxValue = maxAttrMap.getOrDefault(id, 0L); + // 不到最大属性值,则随机增加 + if (maxValue != 0 && value < maxValue){ + attributes.put(id, value+1); + }else { + attributes.put(id, value); + } + } + // 封装 + Soldier resultSoldier = new Soldier(); + resultSoldier.setId(soldier.getId()); + resultSoldier.setType(soldier.getType()); + resultSoldier.setQuality(soldier.getQuality()); + resultSoldier.setLevel(soldier.getLevel()); + resultSoldier.setPosition(-1); + resultSoldier.setAttributes(attributes); + // 清零特殊次数 + manager.setSoldierLowCount(0); + return resultSoldier; } /** @@ -249,6 +338,8 @@ public class SoldierLogic { builder.setDrop(drop); // 删除待招募区小兵 soldierMap.remove(notUsePosition); + // 记录遣散次数 + mainLevelManager.addSoldierLowCount(1); } } @@ -276,7 +367,7 @@ public class SoldierLogic { } boolean levelOpen = MapLogic.getInstance().checkMainLevelOpen(user, stageConfig.getOpenRule()); if (!levelOpen){ - throw new ErrorTableException(162);//关卡条件不满足 + throw new ErrorTableException(188);//关卡条件不满足 } int teamId = TeamEnum.MIAN_LINE_TEAM.getTeamId();