Browse Source

根据装备库随机新的装备

toby 1 year ago
parent
commit
6d57edb5b5

+ 13 - 0
logic/a-logic-common/src/main/java/com/iohao/mmo/common/kit/RandomKit.java

@@ -2,6 +2,7 @@ package com.iohao.mmo.common.kit;
 
 import org.springframework.stereotype.Component;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.List;
 import java.util.Random;
 import java.util.concurrent.ThreadLocalRandom;
@@ -61,7 +62,19 @@ public class RandomKit {
         return randomFromBigDecimal(BigDecimal.valueOf(randomMin),
                 BigDecimal.valueOf(randomMax))
                 .intValue();
+    }
 
+    /**
+     * 在范围内随机一个值(double保留小数位数)
+     *
+     * @param randomMin 限定范围的最小值(double)
+     * @param randomMax 限定范围的最大值(double)
+     * @return boolean
+     */
+    public static double randomFromDouble(double randomMin,double randomMax) {
+        return randomFromBigDecimal(BigDecimal.valueOf(randomMin),
+                BigDecimal.valueOf(randomMax)).setScale(2, RoundingMode.HALF_UP)
+                .doubleValue();
     }
 
     /**

+ 0 - 2
logic/equip-logic/src/main/java/com/iohao/mmo/equip/config/EquipCommandLineRunner.java

@@ -41,7 +41,5 @@ public class EquipCommandLineRunner implements CommandLineRunner {
     }
 
     private void initConfigExcel() {
-        mongoTemplate.dropCollection(EquipTemplate.class);
-        equipTemplateService.initEquipTemplate();
     }
 }

+ 23 - 7
logic/equip-logic/src/main/java/com/iohao/mmo/equip/entity/EquipPropertyBasic.java

@@ -99,7 +99,7 @@ public class EquipPropertyBasic {
         this.mp = mp;
     }
 
-    public static EquipPropertyBasic randomFixed(EquipPropertyBasic fixedEquipPropertyMin,
+    public static EquipPropertyBasic randomBasic(EquipPropertyBasic fixedEquipPropertyMin,
                                                  EquipPropertyBasic fixedEquipPropertyMax){
 
         EquipPropertyBasic equipPropertyBasic = new EquipPropertyBasic();
@@ -131,23 +131,39 @@ public class EquipPropertyBasic {
 
                     //获取属性上限类中对应字段的值
                     Object maxValue = maxField.get(fixedEquipPropertyMax);
+                    //获取属性的字段类型
+                    Class<?> parameterType = maxValue.getClass();
                     //获取属性上限类中当前字段属性名称
                     String maxName = maxField.getName();
                     //如果下限和上限都取到了同一个属性,并且对应的值都不为空,那么取出来在其中进行范围随机
                     if(minName.equals(maxName)&&maxValue!=null){
-                        //在下限和上限之间随机
-                        Integer randomValue = RandomKit.randomFromInt(Integer.parseInt(minValue.toString()),
-                                Integer.parseInt(maxValue.toString()));
+                        int randomIntegerValue = 0;
+                        double randomDoubleValue = 0.0;
+                        //int类型
+                        if(maxValue.getClass()==Integer.class){
+                            //在下限和上限之间随机
+                            randomIntegerValue = RandomKit.randomFromInt(Integer.parseInt(minValue.toString()),
+                                    Integer.parseInt(maxValue.toString())+1);
+                        }else if(maxValue.getClass()==Double.class){
+                            //在下限和上限之间随机
+                            randomDoubleValue = RandomKit.randomFromDouble(Double.parseDouble(minValue.toString()),
+                                    Double.parseDouble(maxValue.toString()));
+                        }
+
                         //通过属性名称获取对应set方法的名称
                         String methodName = "set" + capitalize(minName);
                         //获取class对象
                         Class<?> clazz = equipPropertyBasic.getClass();
                         //获取赋值的字段类型
-                        Class<?> parameterType = randomValue.getClass();
+//                        Class<?> parameterType = randomValue.getClass();
                         //获取set方法
                         Method method = clazz.getMethod(methodName, parameterType);
                         //对equipPropertyBasic的set方法赋值randomValue
-                        method.invoke(equipPropertyBasic, randomValue);
+                        if(maxValue.getClass()==Integer.class) {
+                            method.invoke(equipPropertyBasic, randomIntegerValue);
+                        }else if(maxValue.getClass()==Double.class) {
+                            method.invoke(equipPropertyBasic, randomDoubleValue);
+                        }
                         break;
                     }
                 }
@@ -177,7 +193,7 @@ public class EquipPropertyBasic {
         fixedEquipPropertyMax.setHp(50);
         fixedEquipPropertyMax.setMp(200);
 
-        EquipPropertyBasic equipPropertyBasic = randomFixed(fixedEquipPropertyMin,fixedEquipPropertyMax);
+        EquipPropertyBasic equipPropertyBasic = randomBasic(fixedEquipPropertyMin,fixedEquipPropertyMax);
         System.out.println(equipPropertyBasic.getHp());
     }
 }

+ 23 - 0
logic/equip-logic/src/main/java/com/iohao/mmo/equip/service/EquipEntryTemplateService.java

@@ -20,6 +20,7 @@ package com.iohao.mmo.equip.service;
 
 import com.iohao.mmo.common.config.GameCode;
 import com.iohao.mmo.common.kit.ConvertKit;
+import com.iohao.mmo.common.kit.RandomKit;
 import com.iohao.mmo.common.provide.item.ItemTypeIdConst;
 import com.iohao.mmo.equip.entity.*;
 import com.iohao.mmo.equip.enums.PropertyNameEnum;
@@ -115,6 +116,7 @@ public class EquipEntryTemplateService {
     public List<EquipEntry> randomEntryBatch(int level,String position,int count){
         List<EquipEntry> equipEntryList = new ArrayList<>();
         List<EquipEntryTemplate> equipEntryTemplateList = randomEntryTemplateBatch(position,count);
+        //根据等级筛选掉不必要的属性
         for(EquipEntryTemplate equipEntryTemplate:equipEntryTemplateList){
             EquipEntry equipEntry = ConvertKit.sourceToTarget(equipEntryTemplate, EquipEntry.class);
             //筛选出符合条件的list
@@ -155,4 +157,25 @@ public class EquipEntryTemplateService {
         return equipEntry;
     }
 
+    /**
+     * 根据等级随机出具体的词条属性
+     * @param level 等级
+     * @param entryList 词条列表
+     */
+    public void propertyDetail(int level,List<EquipEntry> entryList){
+        entryList.forEach(entry ->{
+            entry.getEntryPropertyList().stream()
+                    .filter(equipEntryProperty -> equipEntryProperty.getLevelMin()<=level)
+                    .filter(equipEntryProperty -> equipEntryProperty.getLevelMax()>=level)
+                    .toList()
+                    .forEach(property ->{
+                        property.setPropertyValue(
+                                BigDecimal.valueOf(RandomKit.randomFromInt(
+                                        property.getPropertyValueMin().intValue(),
+                                        property.getPropertyValueMax().intValue()+1)));
+                    });
+        });
+    }
+
+
 }

+ 45 - 55
logic/equip-logic/src/main/java/com/iohao/mmo/equip/service/EquipTemplateService.java

@@ -20,14 +20,14 @@ package com.iohao.mmo.equip.service;
 
 import com.iohao.mmo.common.config.GameCode;
 import com.iohao.mmo.common.kit.RandomKit;
-import com.iohao.mmo.common.provide.item.ItemTypeIdConst;
 import com.iohao.mmo.equip.entity.*;
 import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.mongodb.core.MongoTemplate;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -81,55 +81,6 @@ public class EquipTemplateService {
         mongoTemplate.remove(query, EquipTemplate.class);
     }
 
-
-    /**
-     * 初始化装备库(临时方法,后期移除改为从运营数据中导入)
-     */
-    public void initEquipTemplate() {
-//        // 初始化一些装备配置,后期将移到 excel 中做。
-//        EquipTemplate equipTemplate = new EquipTemplate();
-//        equipTemplate.setPosition(1);
-//        equipTemplate.setLevel(10);
-//        equipTemplate.setFixedEquipPropertyMin(FixedEquipProperty.builder()
-//                        .hp(100)
-//                        .mp(100)
-//                        .physicsDefense(10)
-//                        .magicDefense(10)
-//                .build());
-//        equipTemplate.setFixedEquipPropertyMax(FixedEquipProperty.builder()
-//                .hp(300)
-//                .mp(300)
-//                .physicsDefense(30)
-//                .magicDefense(30)
-//                .build());
-//        equipTemplate.setTotalAttrMin(20);
-//        equipTemplate.setTotalAttrMax(30);
-//
-//        equipTemplate.setItemTypeId(ItemTypeIdConst.equipClothing10);
-//
-//        mongoTemplate.save(equipTemplate);
-//
-//        // 初始化一些装备配置,后期将移到 excel 中做。
-//        EquipTemplate equipTemplate2 = new EquipTemplate();
-//        equipTemplate2.setPosition(2);
-//        equipTemplate2.setLevel(10);
-//        equipTemplate2.setFixedEquipPropertyMin(FixedEquipProperty.builder()
-//                .physicsAttack(10)
-//                .magicAttack(10)
-//                .anger(10)
-//                .build());
-//        equipTemplate2.setFixedEquipPropertyMax(FixedEquipProperty.builder()
-//                .physicsAttack(30)
-//                .magicAttack(30)
-//                .anger(30)
-//                .build());
-//        equipTemplate2.setTotalAttrMin(20);
-//        equipTemplate2.setTotalAttrMax(30);
-//
-//        equipTemplate2.setItemTypeId(ItemTypeIdConst.equipWeapon10);
-//        mongoTemplate.save(equipTemplate2);
-    }
-
     /**
      * 根据装备库列表批量随机新的装备
      * @param itemTypeIdList 物品分类标识列表
@@ -166,8 +117,47 @@ public class EquipTemplateService {
      * @return
      */
     public Equip copyTemplate2Equip(EquipTemplate equipTemplate){
-        int count = RandomKit.randomFromInt(equipTemplate.getEquipPropertyRandomMin(),equipTemplate.getEquipPropertyRandomMax());
-        List<EquipEntry> equipEntryList =equipEntryTemplateService.randomEntryBatch(equipTemplate.getLevel(),equipTemplate.getPosition(),count);
+
+        List<EquipEntry> equipPropertyFixedList = equipTemplate.getEquipPropertyFixedList();
+        int fixedCount = 0;
+        //如果没有预设固定属性,那么就是随机固定属性的装备
+        if(equipPropertyFixedList==null|| equipPropertyFixedList.isEmpty()){
+            fixedCount = RandomKit.randomFromInt(
+                    equipTemplate.getEquipPropertyFixedMin(),
+                    equipTemplate.getEquipPropertyFixedMax()+1);
+            if(fixedCount>0) {
+                //生成随机固定属性
+                equipPropertyFixedList =
+                        equipEntryTemplateService.randomEntryBatch(
+                                equipTemplate.getLevel(),
+                                equipTemplate.getPosition(),
+                                fixedCount);
+            }
+        }
+        if(equipPropertyFixedList!=null&&!equipPropertyFixedList.isEmpty()) {
+            //生成准确的固定属性
+            equipEntryTemplateService.propertyDetail(
+                    equipTemplate.getLevel(),
+                    equipPropertyFixedList);
+        }
+        //随机属性的条数
+        int randomCount = RandomKit.randomFromInt(
+                equipTemplate.getEquipPropertyRandomMin(),
+                equipTemplate.getEquipPropertyRandomMax()+1);
+        //生成随机属性
+        List<EquipEntry> equipEntryList = new ArrayList<>();
+        if(randomCount>0) {
+            equipEntryList = equipEntryTemplateService.randomEntryBatch(
+                    equipTemplate.getLevel(),
+                    equipTemplate.getPosition(),
+                    randomCount);
+        }
+        if(equipEntryList!=null&&!equipEntryList.isEmpty()) {
+            //生成准确的随机属性
+            equipEntryTemplateService.propertyDetail(
+                    equipTemplate.getLevel(),
+                    equipEntryList);
+        }
         return Equip.builder()
                 .itemTypeId(equipTemplate.getItemTypeId())
                 .position(equipTemplate.getPosition())
@@ -180,10 +170,10 @@ public class EquipTemplateService {
                 .equipPropertyBasicMin(equipTemplate.getEquipPropertyBasicMin())
                 .equipPropertyBasicMax(equipTemplate.getEquipPropertyBasicMax())
                 .equipPropertyBasic(
-                        EquipPropertyBasic.randomFixed(
+                        EquipPropertyBasic.randomBasic(
                             equipTemplate.getEquipPropertyBasicMin(),
                             equipTemplate.getEquipPropertyBasicMax()))
-                .equipPropertyFixedList(equipTemplate.getEquipPropertyFixedList())
+                .equipPropertyFixedList(equipPropertyFixedList)
                 .equipPropertyRandomMin(equipTemplate.getEquipPropertyRandomMin())
                 .equipPropertyRandomMax(equipTemplate.getEquipPropertyRandomMax())
                 .equipPropertyRandomList(equipEntryList)

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

@@ -56,8 +56,8 @@ public class EquipMessage{
     FixedEquipPropertyMessage fixedEquipPropertyMax;
     /** 装备固定属性 */
     FixedEquipPropertyMessage fixedEquipProperty;
-    /** 品质 1普通,2极品*/
-    int quality;
+    /** 品质 1白色,2黄色,3绿色,4蓝色,5紫色,6鬼装*/
+    String quality;
     /** 自定义属性随机范围最小值 */
     int totalAttrMin;
     /** 自定义属性随机范围最大值 */