Kaynağa Gözat

装备模块和背包模块对接-草稿

tangbin 1 yıl önce
ebeveyn
işleme
7bde747912

+ 4 - 2
logic/equip-logic/src/main/java/com/iohao/mmo/equip/action/EquipAction.java

@@ -15,6 +15,8 @@ import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -76,8 +78,8 @@ public class EquipAction {
      */
     @ActionMethod(EquipCmd.resetEquip)
     public EquipMessage resetEquip(FlowContext flowContext, EquipResetMessage equipResetMessage) { //参数值
-        GameCode.objNotFound.assertTrue(StringUtils.isNotBlank(equipResetMessage.equipId)&&StringUtils.isNotBlank(equipResetMessage.propId));
-        Equip equip = equipService.resetEquip((equipResetMessage.equipId),equipResetMessage.propId);
+        GameCode.objNotFound.assertTrue(StringUtils.isNotBlank(equipResetMessage.equipId)&&StringUtils.isNotBlank(equipResetMessage.excellentRateString));
+        Equip equip = equipService.resetEquip((equipResetMessage.equipId), new BigDecimal(equipResetMessage.excellentRateString));
         return EquipMapper.ME.convert(equip);
     }
 

+ 4 - 0
logic/equip-logic/src/main/java/com/iohao/mmo/equip/entity/Equip.java

@@ -48,10 +48,14 @@ public class Equip {
     int position;
     /** 要求等级 */
     int level;
+    /** 品质 1普通,2极品*/
+    int quality;
     /** 自定义属性随机范围最小值 */
     int totalAttrMin;
     /** 自定义属性随机范围最大值 */
     int totalAttrMax;
+    /** 极品率 0.0000-1.0000*/
+    double excellentRate;
     /** 装备库id */
     String equipTemplateId;
     /** 基础属性 */

+ 9 - 5
logic/equip-logic/src/main/java/com/iohao/mmo/equip/service/EquipService.java

@@ -31,6 +31,8 @@ import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.data.mongodb.core.query.Update;
 import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
 import java.util.Arrays;
 import java.util.List;
 
@@ -137,17 +139,19 @@ public class EquipService {
     /**
      * 重新随机总属性点
      * @param equipId 装备id
-     * @param propId 道具id
+     * @param excellentRate 增加的极品率
      */
-    public Equip resetEquip(String equipId,String propId){
+    public Equip resetEquip(String equipId, BigDecimal excellentRate){
         Equip equip = findById(equipId);
         GameCode.objNotFound.assertTrue(equip!=null);
         // TODO 这里判断道具效果,然后提高装备随机的最小值进行随机,一般是增加最小值的百分比
         int randomMin = equip.getTotalAttrMin();
         int randomMax = equip.getTotalAttrMax();
-        //TODO 这里假设道具增加30%增益效果
-        double gain = 0.3;
-        int newAttrTotal = RandomUtils.randomFromInt(randomMin+(int)((randomMax-randomMin)*gain),randomMax);
+        //品质
+        boolean excellentFlag = RandomUtils.isExcellent(excellentRate);//是否生成极品
+        equip.setQuality(excellentFlag?2:1);
+        //随机属性值
+        int newAttrTotal = RandomUtils.randomFromExcellent(randomMin,randomMax,excellentFlag);
         // 直接替换掉原装备的属性值
         return replaceEquipAttr(equip,newAttrTotal);
     }

+ 5 - 1
logic/equip-logic/src/main/java/com/iohao/mmo/equip/service/EquipTemplateService.java

@@ -36,6 +36,7 @@ import org.springframework.data.mongodb.core.query.Update;
 import org.springframework.stereotype.Service;
 
 import java.beans.JavaBean;
+import java.math.BigDecimal;
 import java.util.Arrays;
 
 /**
@@ -182,8 +183,11 @@ public class EquipTemplateService {
         equip.setId(null);
         equip.setGoods(goods);
         equip.setName(equipTemplate.getGoods().getName());
+        //品质
+        boolean excellentFlag = RandomUtils.isExcellent(BigDecimal.ZERO);//是否生成极品
+        equip.setQuality(excellentFlag?2:1);
         //随机属性值
-        equip.setAttrTotal(RandomUtils.randomFromInt(equipTemplate.getTotalAttrMin(),equipTemplate.getTotalAttrMax()));
+        equip.setAttrTotal(RandomUtils.randomFromExcellent(equipTemplate.getTotalAttrMin(),equipTemplate.getTotalAttrMax(),excellentFlag));
         equip.setUndistributedAttr(equip.getAttrTotal());
 
         //初始化分配的具体属性点

+ 49 - 0
logic/equip-logic/src/main/java/com/iohao/mmo/equip/utils/RandomUtils.java

@@ -2,6 +2,7 @@ package com.iohao.mmo.equip.utils;
 
 import org.springframework.stereotype.Component;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.concurrent.ThreadLocalRandom;
 
@@ -20,6 +21,11 @@ import java.util.concurrent.ThreadLocalRandom;
 @Component
 public class RandomUtils {
 
+    /** 极品率 0.0000-1.0000*/
+    public static BigDecimal excellentRate = BigDecimal.valueOf(0.1000);
+    /** 极品范围占比*/
+    public static BigDecimal excellentProp = BigDecimal.valueOf(0.2000);
+
     private static final ThreadLocalRandom RANDOM = ThreadLocalRandom.current();
 
     ////////////////////////// ↓↓↓算法实现↓↓↓ ///////////////////////////
@@ -66,4 +72,47 @@ public class RandomUtils {
         return RandomUtils.randomFromArr(rangeMin,rangeMax).intValue();
 
     }
+
+    /**
+     * 根据是否极品,由概率随机一个值
+     *
+     * @param randomMin 限定范围的最小值(int)
+     * @param randomMax 限定范围的最大值(int)
+     * @return boolean
+     */
+    public static int randomFromExcellent(int randomMin,int randomMax,boolean excellentFlag) {
+        //普品-极品分界值(属于普品)
+        BigDecimal boundaryValue =
+                BigDecimal.valueOf(randomMin).add(
+                        (BigDecimal.valueOf(randomMax).subtract(BigDecimal.valueOf(randomMin)))
+                                .multiply(excellentProp).setScale(0, RoundingMode.HALF_UP)
+                );
+        BigDecimal rangeMin = BigDecimal.valueOf(randomMin);
+        BigDecimal rangeMax = BigDecimal.valueOf(randomMax);
+        if(excellentFlag){
+            if(boundaryValue.compareTo(rangeMax)<0){
+                rangeMin = boundaryValue.add(BigDecimal.ONE);
+            }else {
+                rangeMin = rangeMax;
+            }
+        }else {
+            if(boundaryValue.compareTo(rangeMin)>0){
+                rangeMax = boundaryValue;
+            }else {
+                rangeMax = rangeMin;
+            }
+        }
+        return RandomUtils.randomFromArr(rangeMin,rangeMax).intValue();
+
+    }
+
+
+    /**
+     * 本次是否生成极品
+     *
+     * @return boolean
+     */
+    public static boolean isExcellent(BigDecimal addExcellentRate) {
+        return isLuck(excellentRate.add(addExcellentRate));
+    }
 }

+ 12 - 11
provide/equip-provide/src/main/java/com/iohao/mmo/equip/client/EquipInputCommandRegion.java

@@ -40,6 +40,7 @@ public class EquipInputCommandRegion extends AbstractInputCommandRegion {
     @Override
     public void initInputCommand() {
         this.inputCommandCreate.cmd = EquipCmd.cmd;
+        this.inputCommandCreate.cmdName = "装备模块";
 
         request();
 
@@ -62,7 +63,7 @@ public class EquipInputCommandRegion extends AbstractInputCommandRegion {
             IntValue intValue = IntValue.of(inputValue);
             return intValue;
         };
-        // 8-1
+        // 10-1
         ofCommand(EquipCmd.getEquipList).callback(ByteValueList.class, result -> {
             List<EquipMessage> value = result.toList(EquipMessage.class);
             log.info("装备列表信息 : {}", JsonKit.toJsonString(value));
@@ -79,7 +80,7 @@ public class EquipInputCommandRegion extends AbstractInputCommandRegion {
             return stringValue;
         };
 
-        // 8-2
+        // 10-2
         ofCommand(EquipCmd.getEquip).callback(EquipMessage.class, result -> {
             EquipMessage value = result.getValue();
             log.info("装备信息 : {}", value);
@@ -105,7 +106,7 @@ public class EquipInputCommandRegion extends AbstractInputCommandRegion {
             return equipMessage;
         };
 
-        // 8-3
+        // 10-3
         ofCommand(EquipCmd.allotEquip).callback(EquipMessage.class, result -> {
             EquipMessage value = result.getValue();
             log.info("装备属性信息 : {}", value);
@@ -114,19 +115,19 @@ public class EquipInputCommandRegion extends AbstractInputCommandRegion {
 
         // 动态请求参数(参数值)
         inputRequestData = () -> {
-            ScannerKit.log(() -> log.info("请输入装备id和消耗道具id,格式 [装备id-消耗道具id]"));
-            String inputValue = ScannerKit.nextLine("1-1");
+            ScannerKit.log(() -> log.info("请输入装备id和消耗道具id,格式 [装备id-增益百分比]"));
+            String inputValue = ScannerKit.nextLine("1-0.3");
             SplitParam param = new SplitParam(inputValue);
             String equipId = param.getString(0);
-            String propId = param.getString(1);
+            String excellentRateString = param.getString(1);
 
             EquipResetMessage equipResetMessage = new EquipResetMessage();
             equipResetMessage.equipId = equipId;
-            equipResetMessage.propId = propId;
+            equipResetMessage.excellentRateString = excellentRateString;
             return equipResetMessage;
         };
 
-        // 8-4
+        // 10-4
         ofCommand(EquipCmd.resetEquip).callback(EquipMessage.class, result -> {
             EquipMessage value = result.getValue();
             log.info("装备属性信息 : {}", value);
@@ -143,13 +144,13 @@ public class EquipInputCommandRegion extends AbstractInputCommandRegion {
             return stringValue;
         };
 
-        // 8-5
+        // 10-5
         ofCommand(EquipCmd.delBatch).callback(EquipMessage.class, result -> {
             EquipMessage value = result.getValue();
             log.info("装备属性信息 : {}", value);
         }).setDescription("批量删除装备").setInputRequestData(inputRequestData);
 
-        // 8-10
+        // 10-10
         ofCommand(EquipCmd.initEquipTemplate).callback(EquipTemplateMessage.class, result -> {
             EquipTemplateMessage value = result.getValue();
             log.info("装备库信息 : {}", value);
@@ -165,7 +166,7 @@ public class EquipInputCommandRegion extends AbstractInputCommandRegion {
 
             return stringValue;
         };
-        // 8-13
+        // 10-13
         ofCommand(EquipCmd.randomEquip).callback(EquipMessage.class, result -> {
             EquipMessage value = result.getValue();
             log.info("装备信息 : {}", value);

+ 2 - 2
provide/equip-provide/src/main/java/com/iohao/mmo/equip/proto/EquipResetMessage.java

@@ -35,6 +35,6 @@ import lombok.experimental.FieldDefaults;
 public class EquipResetMessage {
     /** 装备id */
     String equipId;
-    /** 随机道具id */
-    String propId;
+    /** 增加的极品率 0.0000-1.0000 */
+    String excellentRateString;
 }