瀏覽代碼

:whale: 提供装备打造 api,与背包模块联调。

渔民小镇 1 年之前
父節點
當前提交
50137b2629

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

@@ -20,7 +20,6 @@ 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.UseItemMapper;
 import com.iohao.mmo.bag.pojo.UseItemPOJO;
@@ -31,7 +30,8 @@ import com.iohao.mmo.bag.region.UseProcess;
 import com.iohao.mmo.bag.service.BagService;
 import com.iohao.mmo.common.config.GameCode;
 import com.iohao.mmo.equip.client.EquipExchange;
-import com.iohao.mmo.equip.proto.EquipResetMessage;
+import com.iohao.mmo.equip.proto.CreateEquipMessage;
+import com.iohao.mmo.equip.proto.NewEquipMessage;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
@@ -85,31 +85,26 @@ public class BuildEquipUseProcess implements UseProcess {
 
         // 调用【装备模块】的打造 api
         BuildEquipParse.BuildParam equipBuildParam = buildEquipParse.getEquipBuildParam();
-        BagItem equip = createEquip(equipBuildParam,flowContext);
+        BagItem equip = createEquip(equipBuildParam, flowContext);
 
         // 将新装备添加到背包中
         bagService.incrementItem(equip, userId);
     }
 
-    private BagItem createEquip(BuildEquipParse.BuildParam buildParam,FlowContext flowContext) {
-        // TODO 这里后续调用【装备模块】生成装备的 action,目前先暂时写假数据。
+    private BagItem createEquip(BuildEquipParse.BuildParam buildParam, FlowContext flowContext) {
         // 得到对应装备的 itemId
         String equipItemId = buildParam.getEquipItemId();
+        CreateEquipMessage createEquipMessage = new CreateEquipMessage();
+        createEquipMessage.itemId = equipItemId;
+        NewEquipMessage newEquipMessage = EquipExchange.createEquip(createEquipMessage, flowContext);
 
-        // 为了方便观察数据,这里生成有规律的装备id
-        String formatter = TimeKit.formatter(System.currentTimeMillis());
-        String equipId = equipItemId + "_" + formatter;
-
+        // 将新装备放到背包中
+        String equipId = newEquipMessage.equipId;
         BagItem bagItem = new BagItem();
         bagItem.setId(equipId);
         bagItem.setItemId(equipItemId);
         bagItem.setQuantity(1);
 
-        log.info("调用【装备模块-api】开始打造装备 : {}", bagItem);
-        EquipResetMessage equipResetMessage = new EquipResetMessage();
-        equipResetMessage.itemId = "64dce13e57b5d15c8a6972d0";
-        equipResetMessage.excellentRateString = "0.5";
-        EquipExchange.resetEquip(equipResetMessage,flowContext);
         return bagItem;
     }
 }

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

@@ -8,15 +8,19 @@ 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.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 jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.bson.types.ObjectId;
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
+import java.time.LocalTime;
 import java.util.Arrays;
 import java.util.List;
 
@@ -69,12 +73,12 @@ public class EquipAction {
     /**
      * 重新随机总属性点
      *
-     * @param flowContext flowContext
+     * @param flowContext       flowContext
      * @param equipResetMessage 重新随机装备总属性点参数对象
      */
     @ActionMethod(EquipCmd.resetEquip)
     public EquipMessage resetEquip(FlowContext flowContext, EquipResetMessage equipResetMessage) { //参数值
-        GameCode.objNotFound.assertTrue(StringUtils.isNotBlank(equipResetMessage.itemId)&&StringUtils.isNotBlank(equipResetMessage.excellentRateString));
+        GameCode.objNotFound.assertTrue(StringUtils.isNotBlank(equipResetMessage.itemId) && StringUtils.isNotBlank(equipResetMessage.excellentRateString));
         Equip equip = equipService.resetEquip((equipResetMessage.itemId), new BigDecimal(equipResetMessage.excellentRateString));
         return EquipMapper.ME.convert(equip);
     }
@@ -89,4 +93,28 @@ public class EquipAction {
     public void delEquipBatch(FlowContext flowContext, StringValue stringValue) {
         equipService.delBatch(Arrays.asList(stringValue.value.split("-")));
     }
+
+    @ActionMethod(EquipCmd.createEquip)
+    public NewEquipMessage internalCreateEquip(CreateEquipMessage createEquipMessage, FlowContext flowContext) {
+        // 玩家
+        long userId = flowContext.getUserId();
+
+        // TODO: 开始打造, service.createEquip(createEquipMessage)
+        //  使用 createEquipMessage 所提供的信息来生成新的装备,并得到类似 NewEquipMessage 的信息
+        //  假设 newEquipId 是从打造业务方法所得到的新的装备 id。
+        String newEquipId = new ObjectId().toString();
+
+        /*
+         * 将新装备信息给到调用方,
+         * 装备模块并不关心调用方是谁,只要调用此 action,就生成新装备。
+         */
+
+        // 这里为了方便观察才这样拼接 newEquipId,实际中直接使用 newEquipId 即可。
+        newEquipId = createEquipMessage.itemId + "_" + LocalTime.now().getMinute() + "_" + newEquipId;
+        NewEquipMessage newEquipMessage = new NewEquipMessage();
+        newEquipMessage.equipId = newEquipId;
+        newEquipMessage.itemId = createEquipMessage.itemId;
+
+        return newEquipMessage;
+    }
 }

+ 12 - 0
provide/equip-provide/src/main/java/com/iohao/mmo/equip/client/EquipExchange.java

@@ -19,10 +19,14 @@
 package com.iohao.mmo.equip.client;
 
 import com.iohao.game.action.skeleton.core.CmdInfo;
+import com.iohao.game.action.skeleton.core.DataCodecKit;
 import com.iohao.game.action.skeleton.core.flow.FlowContext;
+import com.iohao.game.action.skeleton.protocol.ResponseMessage;
 import com.iohao.mmo.common.provide.client.ExchangeKit;
 import com.iohao.mmo.equip.cmd.EquipCmd;
+import com.iohao.mmo.equip.proto.CreateEquipMessage;
 import com.iohao.mmo.equip.proto.EquipResetMessage;
+import com.iohao.mmo.equip.proto.NewEquipMessage;
 import lombok.experimental.UtilityClass;
 
 /**
@@ -38,4 +42,12 @@ public class EquipExchange {
         ExchangeKit.invokeModuleVoidMessage(flowContext, cmdInfo, equipResetMessage);
     }
 
+    public NewEquipMessage createEquip(CreateEquipMessage createEquipMessage, FlowContext flowContext) {
+
+        CmdInfo cmdInfo = EquipCmd.of(EquipCmd.createEquip);
+
+        ResponseMessage responseMessage = ExchangeKit.invokeModuleMessage(flowContext, cmdInfo, createEquipMessage);
+
+        return DataCodecKit.decode(responseMessage.getData(), NewEquipMessage.class);
+    }
 }

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

@@ -44,7 +44,9 @@ public interface EquipCmd {
     int getEquipTemplate = 12;
     /** 根据装备库随机出一件新的装备 */
     int randomEquip = 13;
-    
+    /** 创建新装备 */
+    int createEquip = 14;
+
     static CmdInfo of(int subCmd) {
         return CmdInfo.of(cmd, subCmd);
     }

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

@@ -0,0 +1,44 @@
+/*
+ * 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.equip.proto;
+
+import com.baidu.bjf.remoting.protobuf.annotation.ProtobufClass;
+import lombok.AccessLevel;
+import lombok.ToString;
+import lombok.experimental.FieldDefaults;
+
+/**
+ * 创建新装备(未鉴定的)
+ *
+ * @author 渔民小镇
+ * @date 2023-08-20
+ */
+@ToString
+@ProtobufClass
+@FieldDefaults(level = AccessLevel.PUBLIC)
+public class CreateEquipMessage {
+
+    /** 打造的装备部位,这个 itemId 是系统的所有物品表 */
+    String itemId;
+    /**
+     * 极品率,就是生成装备时,相对极品的概率。
+     * 因为玩家可能使用更好的材料,而在装备模块的角度,是不关心使用的是什么材料
+     */
+    int excellentRate;
+}

+ 39 - 0
provide/equip-provide/src/main/java/com/iohao/mmo/equip/proto/NewEquipMessage.java

@@ -0,0 +1,39 @@
+/*
+ * 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.equip.proto;
+
+import com.baidu.bjf.remoting.protobuf.annotation.ProtobufClass;
+import lombok.AccessLevel;
+import lombok.ToString;
+import lombok.experimental.FieldDefaults;
+
+/**
+ * 新的装备(未鉴定的装备)
+ * @author 渔民小镇
+ * @date 2023-08-20
+ */
+@ToString
+@ProtobufClass
+@FieldDefaults(level = AccessLevel.PUBLIC)
+public class NewEquipMessage {
+    /** 新装备的id */
+    String equipId;
+    /** 对应的物品表(装备所属部位) */
+    String itemId;
+}