浏览代码

使用背包物品打造装备(用装备书等新装备)

toby 1 年之前
父节点
当前提交
2d8d7572aa

+ 1 - 1
logic/bag-logic/src/main/java/com/iohao/mmo/bag/region/internal/equip/BuildEquipUseProcess.java

@@ -95,7 +95,7 @@ public class BuildEquipUseProcess implements UseProcess {
         // 得到对应装备的 itemId
         String equipItemId = buildParam.getEquipItemId();
         CreateEquipMessage createEquipMessage = new CreateEquipMessage();
-        createEquipMessage.itemId = equipItemId;
+        createEquipMessage.itemId = equipItemId; // TODO 这里应该取装备库表(EquipTemplate)的itemId传入
         NewEquipMessage newEquipMessage = EquipExchange.createEquip(createEquipMessage, flowContext);
 
         // 将新装备放到背包中

+ 7 - 8
logic/equip-logic/src/main/java/com/iohao/mmo/equip/action/EquipAction.java

@@ -7,12 +7,14 @@ import com.iohao.game.action.skeleton.protocol.wrapper.StringValue;
 import com.iohao.mmo.common.config.GameCode;
 import com.iohao.mmo.equip.cmd.EquipCmd;
 import com.iohao.mmo.equip.entity.Equip;
+import com.iohao.mmo.equip.entity.EquipTemplate;
 import com.iohao.mmo.equip.mapper.EquipMapper;
 import com.iohao.mmo.equip.proto.CreateEquipMessage;
 import com.iohao.mmo.equip.proto.EquipMessage;
 import com.iohao.mmo.equip.proto.EquipResetMessage;
 import com.iohao.mmo.equip.proto.NewEquipMessage;
 import com.iohao.mmo.equip.service.EquipService;
+import com.iohao.mmo.equip.service.EquipTemplateService;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -35,6 +37,8 @@ import java.util.List;
 public class EquipAction {
     @Resource
     EquipService equipService;
+    @Resource
+    EquipTemplateService equipTemplateService;
 
     /**
      * 获取某人装备列表信息
@@ -99,21 +103,16 @@ public class EquipAction {
         // 玩家
         long userId = flowContext.getUserId();
 
-        // TODO: 开始打造, service.createEquip(createEquipMessage)
-        //  使用 createEquipMessage 所提供的信息来生成新的装备,并得到类似 NewEquipMessage 的信息
-        //  假设 newEquipId 是从打造业务方法所得到的新的装备 id。
-        String newEquipId = new ObjectId().toString();
+        Equip equip = equipTemplateService.randomEquip(createEquipMessage.itemId,BigDecimal.valueOf(createEquipMessage.excellentRate),userId);
 
         /*
          * 将新装备信息给到调用方,
          * 装备模块并不关心调用方是谁,只要调用此 action,就生成新装备。
          */
 
-        // 这里为了方便观察才这样拼接 newEquipId,实际中直接使用 newEquipId 即可。
-        newEquipId = createEquipMessage.itemId + "_" + LocalTime.now().getMinute() + "_" + newEquipId;
         NewEquipMessage newEquipMessage = new NewEquipMessage();
-        newEquipMessage.equipId = newEquipId;
-        newEquipMessage.itemId = createEquipMessage.itemId;
+        newEquipMessage.equipId = equip.getId();
+        newEquipMessage.itemId = equip.getItemId();
 
         return newEquipMessage;
     }

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

@@ -19,6 +19,7 @@
 package com.iohao.mmo.equip.entity;
 
 import lombok.AccessLevel;
+import lombok.Builder;
 import lombok.Data;
 import lombok.experimental.FieldDefaults;
 import org.springframework.data.annotation.Id;
@@ -29,6 +30,7 @@ import org.springframework.data.mongodb.core.mapping.Document;
  * @date 2023-07-26
  */
 @Data
+@Builder
 @Document
 @FieldDefaults(level = AccessLevel.PRIVATE)
 public class Equip {

+ 39 - 18
logic/equip-logic/src/main/java/com/iohao/mmo/equip/service/EquipTemplateService.java

@@ -165,35 +165,56 @@ public class EquipTemplateService {
      * @return
      */
     public Equip randomEquip(String equipTemplateItemId,long userId){
+        return randomEquip(equipTemplateItemId,BigDecimal.ZERO,userId);
+    }
+
+
+    /**
+     * 根据装备库随机一件新的装备
+     * @param equipTemplateItemId 装备库的itemId
+     * @param excellentRate 增加的极品率
+     * @return
+     */
+    public Equip randomEquip(String equipTemplateItemId,BigDecimal excellentRate, long userId){
+        if(excellentRate == null){
+            excellentRate = BigDecimal.ZERO;
+        }
         //取到装备库
         EquipTemplate equipTemplate = findByItemId(equipTemplateItemId);
-
-        Equip equip = new Equip();
+        //将装备库属性拷贝到装备中
+        Equip equip = copyTemplate2Equip(equipTemplate,excellentRate);
+        equip.setUserId(userId);
         //新建装备对应的物品类
         Goods goods = equipTemplate.getGoods();
         goods.setId(null);
         goods.setType(0);
         mongoTemplate.save(goods);
-        //将装备库属性拷贝到装备中
         //对应的物品数据是新建的
-        BeanUtils.copyProperties(equipTemplate,equip);
-        equip.setId(null);
         equip.setItemId(goods.getId());
         equip.setGoods(goods);
-        equip.setName(equipTemplate.getGoods().getName());
-        //品质
-        boolean excellentFlag = RandomUtils.isExcellent(BigDecimal.ZERO);//是否生成极品
-        equip.setQuality(excellentFlag?2:1);
-        //固定属性值
-        equip.setFixedEquipProperty(FixedEquipProperty.randomFixed(equipTemplate.getFixedEquipPropertyMin(),equipTemplate.getFixedEquipPropertyMax()));
-        //额外属性值
-        equip.setAttrTotal(RandomUtils.randomFromExcellent(equipTemplate.getTotalAttrMin(),equipTemplate.getTotalAttrMax(),excellentFlag));
-        equip.setUndistributedAttr(equip.getAttrTotal());
-
-        //初始化分配的具体属性点
-        equip.setElseEquipProperty(ElseEquipProperty.resetElseEquipProperty());
-        equip.setUserId(userId);
         mongoTemplate.save(equip);
         return equip;
     }
+
+    public Equip copyTemplate2Equip(EquipTemplate equipTemplate,BigDecimal excellentRate){
+        //是否极品
+        boolean excellentFlag = RandomUtils.isExcellent(excellentRate);
+        //随机总属性点
+        int attrTotal = RandomUtils.randomFromExcellent(equipTemplate.getTotalAttrMin(),equipTemplate.getTotalAttrMax(),excellentFlag);
+        return Equip.builder()
+                .name(equipTemplate.getGoods().getName())
+                .quality(excellentFlag?2:1) //品质
+                .fixedEquipProperty(FixedEquipProperty.randomFixed(equipTemplate.getFixedEquipPropertyMin(),equipTemplate.getFixedEquipPropertyMax())) //装备固定属性
+                .attrTotal(attrTotal)
+                .undistributedAttr(attrTotal)
+                .elseEquipProperty(ElseEquipProperty.resetElseEquipProperty()) //初始化分配的具体属性点
+                .position(equipTemplate.getPosition())
+                .level(equipTemplate.getLevel())
+                .fixedEquipPropertyMin(equipTemplate.getFixedEquipPropertyMin())
+                .fixedEquipPropertyMax(equipTemplate.getFixedEquipPropertyMax())
+                .totalAttrMin(equipTemplate.getTotalAttrMin())
+                .totalAttrMax(equipTemplate.getTotalAttrMax())
+                .equipTemplateId(equipTemplate.getId())
+                .build();
+    }
 }

+ 1 - 1
provide/equip-provide/src/main/java/com/iohao/mmo/equip/cmd/EquipCmd.java

@@ -44,7 +44,7 @@ public interface EquipCmd {
     int getEquipTemplate = 12;
     /** 根据装备库随机出一件新的装备 */
     int randomEquip = 13;
-    /** 创建新装备 */
+    /** 通过材料直接创建新装备 */
     int createEquip = 14;
 
     static CmdInfo of(int subCmd) {

+ 1 - 1
provide/equip-provide/src/main/java/com/iohao/mmo/equip/proto/CreateEquipMessage.java

@@ -40,5 +40,5 @@ public class CreateEquipMessage {
      * 极品率,就是生成装备时,相对极品的概率。
      * 因为玩家可能使用更好的材料,而在装备模块的角度,是不关心使用的是什么材料
      */
-    int excellentRate;
+    double excellentRate;
 }