浏览代码

:whale: 打造装备,消耗背包物品

渔民小镇 1 年之前
父节点
当前提交
9568ca1c14
共有 17 个文件被更改,包括 425 次插入53 次删除
  1. 2 2
      common/common-core/src/main/java/com/iohao/mmo/common/config/GameCode.java
  2. 22 4
      logic/bag-logic/src/main/java/com/iohao/mmo/bag/action/BagAction.java
  3. 7 4
      logic/bag-logic/src/main/java/com/iohao/mmo/bag/config/ItemCommandLineRunner.java
  4. 3 4
      logic/bag-logic/src/main/java/com/iohao/mmo/bag/mapper/ItemMapper.java
  5. 0 1
      logic/bag-logic/src/main/java/com/iohao/mmo/bag/pojo/UseItemPOJO.java
  6. 8 13
      logic/bag-logic/src/main/java/com/iohao/mmo/bag/region/SceneConst.java
  7. 6 1
      logic/bag-logic/src/main/java/com/iohao/mmo/bag/region/UseProcess.java
  8. 8 5
      logic/bag-logic/src/main/java/com/iohao/mmo/bag/region/internal/DefaultUseProcess.java
  9. 134 0
      logic/bag-logic/src/main/java/com/iohao/mmo/bag/region/internal/equip/BuildEquipParse.java
  10. 104 0
      logic/bag-logic/src/main/java/com/iohao/mmo/bag/region/internal/equip/BuildEquipUseProcess.java
  11. 21 4
      logic/bag-logic/src/main/java/com/iohao/mmo/bag/service/BagService.java
  12. 1 1
      one-client/src/main/java/com/iohao/mmo/client/CommonClient.java
  13. 9 0
      provide/bag-provide/src/main/java/com/iohao/mmo/bag/ItemIdConst.java
  14. 30 0
      provide/bag-provide/src/main/java/com/iohao/mmo/bag/ItemIdTypeConst.java
  15. 63 14
      provide/bag-provide/src/main/java/com/iohao/mmo/bag/client/BagInputCommandRegion.java
  16. 2 0
      provide/bag-provide/src/main/java/com/iohao/mmo/bag/cmd/BagCmd.java
  17. 5 0
      provide/bag-provide/src/main/java/com/iohao/mmo/bag/proto/UseMessage.java

+ 2 - 2
common/common-core/src/main/java/com/iohao/mmo/common/config/GameCode.java

@@ -35,8 +35,8 @@ public enum GameCode implements MsgExceptionInfo {
     mapNotExist(1, "地图不存在"),
     /** 升级错误,经验值不足 */
     upLevelError(2, "升级错误,经验值不足"),
-    /** 数量不足 */
-    quantityNotEnough(3, "数量不足"),
+    /** 背包物品数量不足 */
+    quantityNotEnough(3, "背包物品数量不足"),
     ;
 
     /** 消息码 */

+ 22 - 4
logic/bag-logic/src/main/java/com/iohao/mmo/bag/action/BagAction.java

@@ -22,7 +22,6 @@ import com.iohao.game.action.skeleton.annotation.ActionController;
 import com.iohao.game.action.skeleton.annotation.ActionMethod;
 import com.iohao.game.action.skeleton.core.exception.ActionErrorEnum;
 import com.iohao.game.action.skeleton.core.flow.FlowContext;
-import com.iohao.game.common.kit.SafeKit;
 import com.iohao.mmo.bag.cmd.BagCmd;
 import com.iohao.mmo.bag.entity.Bag;
 import com.iohao.mmo.bag.entity.BagItem;
@@ -32,6 +31,7 @@ import com.iohao.mmo.bag.pojo.UsePOJO;
 import com.iohao.mmo.bag.proto.BagItemMessage;
 import com.iohao.mmo.bag.proto.BagMessage;
 import com.iohao.mmo.bag.proto.UseMessage;
+import com.iohao.mmo.bag.region.SceneConst;
 import com.iohao.mmo.bag.region.UseContext;
 import com.iohao.mmo.bag.region.UseRegion;
 import com.iohao.mmo.bag.service.BagService;
@@ -114,6 +114,25 @@ public class BagAction {
      */
     @ActionMethod(BagCmd.use)
     public boolean use(UseMessage useMessage, FlowContext flowContext) {
+        useMessage.scene = SceneConst.defaultScene;
+        extracted(useMessage, flowContext);
+        return true;
+    }
+
+    /**
+     * 使用背包物品来打造装备
+     *
+     * @param useMessage  使用物品
+     * @param flowContext flowContext
+     */
+    @ActionMethod(BagCmd.useBuildEquip)
+    public boolean useBuildEquip(UseMessage useMessage, FlowContext flowContext) {
+        useMessage.scene = SceneConst.buildEquipScene;
+        extracted(useMessage, flowContext);
+        return true;
+    }
+
+    private void extracted(UseMessage useMessage, FlowContext flowContext) {
         ActionErrorEnum.validateErrCode.assertTrue(useMessage.verify());
         /*
          * 各物品的处理逻辑不相同
@@ -121,7 +140,6 @@ public class BagAction {
          * 攻击符、增加临时攻击力;
          */
         UsePOJO usePOJO = ItemMapper.ME.convert(useMessage);
-        usePOJO.scene = SafeKit.getString(usePOJO.scene, "default");
 
         // 使用上下文
         UseContext context = new UseContext();
@@ -132,7 +150,7 @@ public class BagAction {
         useRegion.process(context);
 
         log.info("usePOJO : {}", usePOJO);
-
-        return true;
     }
+
+
 }

+ 7 - 4
logic/bag-logic/src/main/java/com/iohao/mmo/bag/config/ItemCommandLineRunner.java

@@ -23,6 +23,7 @@ import com.iohao.mmo.bag.entity.ItemConfig;
 import com.iohao.mmo.bag.region.ItemConfigRegion;
 import com.iohao.mmo.bag.region.UseRegion;
 import com.iohao.mmo.bag.region.internal.DefaultUseProcess;
+import com.iohao.mmo.bag.region.internal.equip.BuildEquipUseProcess;
 import jakarta.annotation.Resource;
 import lombok.AllArgsConstructor;
 import org.springframework.boot.CommandLineRunner;
@@ -41,10 +42,9 @@ import java.util.List;
 public class ItemCommandLineRunner implements CommandLineRunner {
     @Resource
     MongoTemplate mongoTemplate;
-
-    final DefaultUseProcess defaultUseProcess;
-
     final UseRegion useRegion;
+    final DefaultUseProcess defaultUseProcess;
+    final BuildEquipUseProcess buildEquipUseProcess;
 
     @Override
     public void run(String... args) {
@@ -52,6 +52,7 @@ public class ItemCommandLineRunner implements CommandLineRunner {
         itemConfigs.forEach(ItemConfigRegion::addItemConfig);
 
         useRegion.addUseProcess(defaultUseProcess);
+        useRegion.addUseProcess(buildEquipUseProcess);
     }
 
     private List<ItemConfig> initConfigExcel() {
@@ -64,11 +65,13 @@ public class ItemCommandLineRunner implements CommandLineRunner {
         config.setName("经验值道具");
         config.setDescription("增加经验值");
 
+        config = new ItemConfig();
+        configList.add(config);
         config.setItemId(ItemIdConst.hpId);
         config.setName("气血药");
         config.setDescription("增加气血值");
 
-
+        // 临时配置
         return configList;
     }
 }

+ 3 - 4
logic/bag-logic/src/main/java/com/iohao/mmo/bag/mapper/ItemMapper.java

@@ -28,10 +28,7 @@ import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
 import org.mapstruct.factory.Mappers;
 
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * @author 渔民小镇
@@ -43,6 +40,8 @@ public interface ItemMapper {
 
     BagItem convert(UseItemPOJO useItem);
 
+    List<BagItem> convertToBagItem(Collection<UseItemPOJO> useItem);
+
     @Mapping(target = "useItemMap", source = "useItems")
     UsePOJO convert(UseMessage useMessage);
 

+ 0 - 1
logic/bag-logic/src/main/java/com/iohao/mmo/bag/pojo/UseItemPOJO.java

@@ -35,5 +35,4 @@ public class UseItemPOJO {
     String itemId;
     /** 使用数量 */
     int quantity;
-
 }

+ 8 - 13
logic/bag-logic/src/main/java/com/iohao/mmo/bag/region/internal/ExpItemProcess.java → logic/bag-logic/src/main/java/com/iohao/mmo/bag/region/SceneConst.java

@@ -16,20 +16,15 @@
  * You should have received a copy of the GNU Affero General Public License
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
-package com.iohao.mmo.bag.region.internal;
-
-import lombok.AccessLevel;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.experimental.FieldDefaults;
+package com.iohao.mmo.bag.region;
 
 /**
+ * 物品使用的业务场景
+ *
  * @author 渔民小镇
- * @date 2023-08-06
+ * @date 2023-08-08
  */
-@Getter
-@Setter
-@FieldDefaults(level = AccessLevel.PRIVATE)
-public class ExpItemProcess {
-
-}
+public interface SceneConst {
+    String defaultScene = "default";
+    String buildEquipScene = "buildEquip";
+}

+ 6 - 1
logic/bag-logic/src/main/java/com/iohao/mmo/bag/region/UseProcess.java

@@ -19,7 +19,7 @@
 package com.iohao.mmo.bag.region;
 
 /**
- * 物品处理
+ * 物品使用处理
  *
  * @author 渔民小镇
  * @date 2023-08-06
@@ -27,5 +27,10 @@ package com.iohao.mmo.bag.region;
 public interface UseProcess {
     void process(UseContext context);
 
+    /**
+     * 业务场景
+     *
+     * @return 业务场景
+     */
     String getScene();
 }

+ 8 - 5
logic/bag-logic/src/main/java/com/iohao/mmo/bag/region/internal/DefaultUseProcess.java

@@ -25,12 +25,14 @@ import com.iohao.mmo.bag.entity.BagItem;
 import com.iohao.mmo.bag.mapper.ItemMapper;
 import com.iohao.mmo.bag.pojo.UseItemPOJO;
 import com.iohao.mmo.bag.pojo.UsePOJO;
+import com.iohao.mmo.bag.region.SceneConst;
 import com.iohao.mmo.bag.region.UseContext;
 import com.iohao.mmo.bag.region.UseProcess;
 import com.iohao.mmo.bag.service.BagService;
 import com.iohao.mmo.level.client.LevelExchange;
 import com.iohao.mmo.level.proto.ExpMessage;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
 import java.util.Map;
@@ -45,12 +47,18 @@ import java.util.Map;
  * @author 渔民小镇
  * @date 2023-08-06
  */
+@Slf4j
 @Component
 @AllArgsConstructor
 public class DefaultUseProcess implements UseProcess {
 
     final BagService bagService;
 
+    @Override
+    public String getScene() {
+        return SceneConst.defaultScene;
+    }
+
     @Override
     public void process(UseContext context) {
         UsePOJO usePOJO = context.getUsePOJO();
@@ -88,9 +96,4 @@ public class DefaultUseProcess implements UseProcess {
         // 调用添加经验值 api
         LevelExchange.addExpPerson(expMessage, flowContext);
     }
-
-    @Override
-    public String getScene() {
-        return "default";
-    }
 }

+ 134 - 0
logic/bag-logic/src/main/java/com/iohao/mmo/bag/region/internal/equip/BuildEquipParse.java

@@ -0,0 +1,134 @@
+/*
+ * ioGame
+ * Copyright (C) 2021 - 2023  渔民小镇 (262610965@qq.com、luoyizhu@gmail.com) . All Rights Reserved.
+ * # iohao.com . 渔民小镇
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+package com.iohao.mmo.bag.region.internal.equip;
+
+import com.iohao.game.action.skeleton.core.exception.ActionErrorEnum;
+import com.iohao.game.external.client.kit.SplitParam;
+import com.iohao.mmo.bag.ItemIdTypeConst;
+import com.iohao.mmo.bag.pojo.UseItemPOJO;
+import com.iohao.mmo.common.config.GameCode;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.experimental.FieldDefaults;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 装备制造所需物品解析
+ *
+ * @author 渔民小镇
+ * @date 2023-08-08
+ */
+@FieldDefaults(level = AccessLevel.PRIVATE)
+class BuildEquipParse {
+    final Map<String, BuildParam> paramMap = new HashMap<>();
+
+    BuildEquipParse(Map<String, UseItemPOJO> useItemMap) {
+        for (Map.Entry<String, UseItemPOJO> entry : useItemMap.entrySet()) {
+            UseItemPOJO value = entry.getValue();
+            // 物品 id
+            String itemId = value.itemId;
+
+            var param = new BuildParam(itemId, value);
+            paramMap.put(param.getItemType(), param);
+        }
+    }
+
+    /**
+     * 所需物品校验
+     */
+    void verify() {
+        /*
+         * 装备的制造最少需要两样物品
+         * 1 装备制造书
+         * 2 装备制造材料
+         */
+        ActionErrorEnum validateErrCode = ActionErrorEnum.validateErrCode;
+
+        // 装备打造业务,目前只支持使用两样物品
+        validateErrCode.assertTrue(paramMap.size() == 2);
+
+        // 校验制造书相关
+        BuildParam equipBuildParam = getEquipBuildParam();
+        validateErrCode.assertNonNull(equipBuildParam, "没有使用装备制造书");
+        GameCode.quantityNotEnough
+                .assertTrue(equipBuildParam.useItem.quantity == 1, "制造书数量错误");
+
+        // 校验制造材料相关
+        BuildParam ironBuildParam = getIronBuildParam();
+        validateErrCode.assertNonNull(ironBuildParam, "没有使用装备制造材料");
+        GameCode.quantityNotEnough
+                .assertTrue(ironBuildParam.useItem.quantity == 1, "制造材料数量错误");
+
+        // 校验材料匹配相关
+        boolean result = equipBuildParam.getLevel() > ironBuildParam.getLevel();
+        validateErrCode.assertTrueThrows(result, "装备制造错误,材料不匹配");
+    }
+
+    /**
+     * 得到装备制造书
+     *
+     * @return 装备制造书
+     */
+    BuildParam getEquipBuildParam() {
+        // 得到装备
+        return paramMap.get(ItemIdTypeConst.equip);
+    }
+
+    /**
+     * 得到装备制造材料 - 铁
+     *
+     * @return 装备制造材料 - 铁
+     */
+    BuildParam getIronBuildParam() {
+        // 得到装备制造材料 - 铁
+        return paramMap.get(ItemIdTypeConst.iron);
+    }
+
+    @Getter
+    @FieldDefaults(level = AccessLevel.PRIVATE)
+    static class BuildParam extends SplitParam {
+        final UseItemPOJO useItem;
+
+        public BuildParam(String itemId, UseItemPOJO useItem) {
+            super(itemId, "_");
+            this.useItem = useItem;
+        }
+
+        String getItemType() {
+            return this.getString(0);
+        }
+
+        int getLevel() {
+            // 约定最后一个参数是等级
+            int length = length();
+            return this.getInt(length - 1, 0);
+        }
+
+        int length() {
+            return this.getSplit().length;
+        }
+
+        String getEquipItemId() {
+            String itemId = useItem.itemId;
+            return itemId.replace("book_", "");
+        }
+    }
+}

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

@@ -0,0 +1,104 @@
+/*
+ * ioGame
+ * Copyright (C) 2021 - 2023  渔民小镇 (262610965@qq.com、luoyizhu@gmail.com) . All Rights Reserved.
+ * # iohao.com . 渔民小镇
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+package com.iohao.mmo.bag.region.internal.equip;
+
+import com.iohao.game.action.skeleton.core.exception.ActionErrorEnum;
+import com.iohao.game.action.skeleton.core.flow.FlowContext;
+import com.iohao.game.common.kit.TimeKit;
+import com.iohao.mmo.bag.entity.BagItem;
+import com.iohao.mmo.bag.mapper.ItemMapper;
+import com.iohao.mmo.bag.pojo.UseItemPOJO;
+import com.iohao.mmo.bag.pojo.UsePOJO;
+import com.iohao.mmo.bag.region.SceneConst;
+import com.iohao.mmo.bag.region.UseContext;
+import com.iohao.mmo.bag.region.UseProcess;
+import com.iohao.mmo.bag.service.BagService;
+import com.iohao.mmo.common.config.GameCode;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author 渔民小镇
+ * @date 2023-08-08
+ */
+@Slf4j
+@Component
+@AllArgsConstructor
+public class BuildEquipUseProcess implements UseProcess {
+    final BagService bagService;
+
+    @Override
+    public String getScene() {
+        return SceneConst.buildEquipScene;
+    }
+
+    @Override
+    public void process(UseContext context) {
+        UsePOJO usePOJO = context.getUsePOJO();
+        Map<String, UseItemPOJO> useItemMap = usePOJO.useItemMap;
+        ActionErrorEnum.dataNotExist.assertTrueThrows(useItemMap.isEmpty());
+        FlowContext flowContext = context.getFlowContext();
+        long userId = flowContext.getUserId();
+
+        // 校验物品合法性
+        BuildEquipParse buildEquipParse = new BuildEquipParse(useItemMap);
+        buildEquipParse.verify();
+
+        // 物品数量检测
+        List<BagItem> bagItems = ItemMapper.ME.convertToBagItem(useItemMap.values());
+        boolean contains = bagService.contains(bagItems, userId);
+        GameCode.quantityNotEnough.assertTrue(contains);
+
+        // 减少背包的物品
+        for (BagItem bagItem : bagItems) {
+            bagService.decrementItem(bagItem, userId);
+        }
+
+        // 调用【装备模块】的打造 api
+        BuildEquipParse.BuildParam equipBuildParam = buildEquipParse.getEquipBuildParam();
+        BagItem equip = createEquip(equipBuildParam);
+
+        // 将新装备添加到背包中
+        bagService.incrementItem(equip, userId);
+    }
+
+    private BagItem createEquip(BuildEquipParse.BuildParam buildParam) {
+        // 得到对应装备的 itemId
+        String equipItemId = buildParam.getEquipItemId();
+
+        // 为了方便观察数据,这里生成有规律的装备id
+        String formatter = TimeKit.formatter(System.currentTimeMillis());
+        String equipId = equipItemId + "_" + formatter;
+
+        BagItem bagItem = new BagItem();
+        bagItem.setId(equipId);
+        bagItem.setItemId(equipItemId);
+        bagItem.setQuantity(1);
+
+        log.info("调用【装备模块-api】开始打造装备 : {}", bagItem);
+
+        return bagItem;
+    }
+
+
+}

+ 21 - 4
logic/bag-logic/src/main/java/com/iohao/mmo/bag/service/BagService.java

@@ -28,10 +28,7 @@ import lombok.AllArgsConstructor;
 import org.springframework.data.mongodb.core.MongoTemplate;
 import org.springframework.stereotype.Service;
 
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
+import java.util.*;
 
 /**
  * @author 渔民小镇
@@ -109,6 +106,26 @@ public class BagService {
         return bagItem;
     }
 
+    public boolean contains(List<BagItem> itemList, long userId) {
+        Bag bag = ofBag(userId);
+        Map<String, BagItem> itemMap = bag.getItemMap();
+
+        for (BagItem item : itemList) {
+            String bagItemId = item.getId();
+            BagItem bagItem = itemMap.get(bagItemId);
+            if (Objects.isNull(bagItem)) {
+                return false;
+            }
+
+            // 数量检测
+            if (bagItem.getQuantity() < item.getQuantity()) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
     public void use(UseContext context) {
 
     }

+ 1 - 1
one-client/src/main/java/com/iohao/mmo/client/CommonClient.java

@@ -61,7 +61,7 @@ public class CommonClient {
                 // 登录
                 loginInputCommandRegion
                 // 地图
-                , mapInputCommandRegion
+//                , mapInputCommandRegion
                 // 人物、英雄
 //                , personInputCommandRegion
                 // 等级相关

+ 9 - 0
provide/bag-provide/src/main/java/com/iohao/mmo/bag/ItemIdConst.java

@@ -19,10 +19,19 @@
 package com.iohao.mmo.bag;
 
 /**
+ * 物品 id - itemId
+ *
  * @author 渔民小镇
  * @date 2023-08-06
  */
 public interface ItemIdConst {
     String expId = "exp";
     String hpId = "hp";
+    /** 装备 - 武器书 - 10 级 */
+    String equipWeaponBook_10 = ItemIdTypeConst.equip + "_weapon_book_10";
+    /** 铁 - 10 级 */
+    String iron_10 = ItemIdTypeConst.iron + "_10";
+    /** 装备 - 武器 - 10 级 */
+    String equipWeapon_10 = ItemIdTypeConst.equip + "_weapon_10";
+
 }

+ 30 - 0
provide/bag-provide/src/main/java/com/iohao/mmo/bag/ItemIdTypeConst.java

@@ -0,0 +1,30 @@
+/*
+ * ioGame
+ * Copyright (C) 2021 - 2023  渔民小镇 (262610965@qq.com、luoyizhu@gmail.com) . All Rights Reserved.
+ * # iohao.com . 渔民小镇
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+package com.iohao.mmo.bag;
+
+/**
+ * 物品大类
+ *
+ * @author 渔民小镇
+ * @date 2023-08-08
+ */
+public interface ItemIdTypeConst {
+    String equip = "equip";
+    String iron = "iron";
+}

+ 63 - 14
provide/bag-provide/src/main/java/com/iohao/mmo/bag/client/BagInputCommandRegion.java

@@ -27,6 +27,7 @@ import com.iohao.mmo.bag.ItemIdConst;
 import com.iohao.mmo.bag.cmd.BagCmd;
 import com.iohao.mmo.bag.proto.BagItemMessage;
 import com.iohao.mmo.bag.proto.BagMessage;
+import com.iohao.mmo.bag.proto.UseItemMessage;
 import com.iohao.mmo.bag.proto.UseMessage;
 import com.iohao.mmo.common.provide.kit.JsonKit;
 import com.iohao.mmo.common.snow.SnowKit;
@@ -50,10 +51,22 @@ public class BagInputCommandRegion extends AbstractInputCommandRegion {
     @Override
     public void loginSuccessCallback() {
         // 添加一些经验值道具
-        var bagItemMessage = BagInternalHelper.ofBagItemMessage(ItemIdConst.expId);
+        BagItemMessage bagItemMessage = BagInternalHelper.ofBagItemMessage(ItemIdConst.expId);
         bagItemMessage.quantity = 10;
         log.info("添加 {} 个经验值道具 {}", bagItemMessage.quantity, bagItemMessage);
         ofRequestCommand(BagCmd.incrementItem).request(bagItemMessage);
+
+        // 添加一些装备制造书材料
+        bagItemMessage = BagInternalHelper.ofBagItemMessage(ItemIdConst.equipWeaponBook_10);
+        bagItemMessage.quantity = 1;
+        log.info("添加 {} 【装备-武器】制造书材料 {}", bagItemMessage.quantity, bagItemMessage);
+        ofRequestCommand(BagCmd.incrementItem).request(bagItemMessage);
+
+        // 添加一些装备制造书材料
+        bagItemMessage = BagInternalHelper.ofBagItemMessage(ItemIdConst.iron_10);
+        bagItemMessage.quantity = 1;
+        log.info("添加 {} 装备-制造材料-铁 {}", bagItemMessage.quantity, bagItemMessage);
+        ofRequestCommand(BagCmd.incrementItem).request(bagItemMessage);
     }
 
     private void request() {
@@ -114,24 +127,13 @@ public class BagInputCommandRegion extends AbstractInputCommandRegion {
             // 重新查询一次背包
             ofRequestCommand(BagCmd.bag).request();
         }).setDescription("从背包减少物品").setInputRequestData(inputRequestData);
-
-
     }
 
     private void useRequest() {
         InputRequestData inputRequestData = () -> {
-            ScannerKit.log(() -> log.info("输入需要使用的背包物品,格式 [背包物品id-数量]"));
-            String inputType = ScannerKit.nextLine("1-1");
-
-            SplitParam param = new SplitParam(inputType);
-            String id = param.getString(0);
-            int quantity = param.getInt(1, 1);
-
-            var useItemMessage = BagInternalHelper.ofUseItemMessage(id);
-            useItemMessage.quantity = quantity;
-
             UseMessage useMessage = new UseMessage();
-            useMessage.useItems = List.of(useItemMessage);
+            useMessage.useItems = sceneDefault();
+            ScannerKit.log(() -> log.info("当前所使用的物品信息 : {}", JsonKit.toJsonString(useMessage)));
             return useMessage;
         };
 
@@ -139,5 +141,52 @@ public class BagInputCommandRegion extends AbstractInputCommandRegion {
             var value = result.getValue();
             log.info("value : {}", value);
         }).setDescription("使用背包物品").setInputRequestData(inputRequestData);
+
+        InputRequestData buildEquipInputRequestData = () -> {
+            UseMessage useMessage = new UseMessage();
+            useMessage.useItems = sceneBuildEquip();
+            ScannerKit.log(() -> log.info("打造装备-所使用物品 : {}", JsonKit.toJsonString(useMessage)));
+            return useMessage;
+        };
+
+        ofCommand(BagCmd.useBuildEquip).callback(BoolValue.class, result -> {
+            var value = result.getValue();
+            log.info("value : {}", value);
+        }).setDescription("打造装备").setInputRequestData(buildEquipInputRequestData);
+    }
+
+    private List<UseItemMessage> sceneBuildEquip() {
+        ScannerKit.log(() -> {
+            log.info("装备的制造最少需要使用两样背包物品,1.装备制造书、2.装备制造材料");
+            log.info("格式 [制造书物品id-制造铁物品id]");
+        });
+
+        String defaultValue = ItemIdConst.equipWeaponBook_10 + "-" + ItemIdConst.iron_10;
+        String inputType = defaultValue;
+//         inputType = ScannerKit.nextLine(defaultValue);
+        SplitParam param = new SplitParam(inputType);
+
+        String equipWeaponBook = param.getString(0, ItemIdConst.equipWeaponBook_10);
+        UseItemMessage useItemMessageEquip = BagInternalHelper.ofUseItemMessage(equipWeaponBook);
+
+        String iron = param.getString(1, ItemIdConst.iron_10);
+        UseItemMessage useItemMessageIron = BagInternalHelper.ofUseItemMessage(iron);
+
+        return List.of(useItemMessageEquip, useItemMessageIron);
+    }
+
+    private List<UseItemMessage> sceneDefault() {
+        ScannerKit.log(() -> log.info("输入需要使用的背包物品,格式 [背包物品id-数量]"));
+        String inputType = ScannerKit.nextLine("1-1");
+        SplitParam param = new SplitParam(inputType);
+        // 得到下标 0 的值
+        String id = param.getString(0);
+        // 得到下标 1 的值,如果值不存在,则使用默认的 1 代替
+        int quantity = param.getInt(1, 1);
+
+        var useItemMessage = BagInternalHelper.ofUseItemMessage(id);
+        useItemMessage.quantity = quantity;
+
+        return List.of(useItemMessage);
     }
 }

+ 2 - 0
provide/bag-provide/src/main/java/com/iohao/mmo/bag/cmd/BagCmd.java

@@ -38,6 +38,8 @@ public interface BagCmd {
 
     /** 使用物品 */
     int use = 5;
+    /** 打造装备 */
+    int useBuildEquip = 6;
 
     static CmdInfo of(int subCmd) {
         return CmdInfo.of(cmd, subCmd);

+ 5 - 0
provide/bag-provide/src/main/java/com/iohao/mmo/bag/proto/UseMessage.java

@@ -19,6 +19,7 @@
 package com.iohao.mmo.bag.proto;
 
 import com.baidu.bjf.remoting.protobuf.annotation.ProtobufClass;
+import com.iohao.game.common.kit.CollKit;
 import lombok.AccessLevel;
 import lombok.ToString;
 import lombok.experimental.FieldDefaults;
@@ -47,6 +48,10 @@ public class UseMessage {
      */
     public boolean verify() {
 
+        if (CollKit.isEmpty(this.useItems)) {
+            return false;
+        }
+
         for (UseItemMessage useItem : useItems) {
             if (!useItem.verify()) {
                 return false;