/*
* 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 .
*/
package com.iohao.mmo.client.input;
import com.alibaba.fastjson2.JSONObject;
import com.iohao.game.action.skeleton.protocol.wrapper.BoolValue;
import com.iohao.game.action.skeleton.protocol.wrapper.ByteValueList;
import com.iohao.game.action.skeleton.protocol.wrapper.WrapperKit;
import com.iohao.game.external.client.AbstractInputCommandRegion;
import com.iohao.game.external.client.command.InputRequestData;
import com.iohao.game.external.client.kit.ScannerKit;
import com.iohao.game.external.client.kit.SplitParam;
import com.iohao.mmo.bag.ItemTypeIdConst;
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.ItemTypeNodeKit;
import com.iohao.mmo.common.provide.kit.JsonKit;
import com.iohao.mmo.common.snow.SnowKit;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
/**
* @author 渔民小镇
* @date 2023-08-04
*/
@Slf4j
public class BagInputCommandRegion extends AbstractInputCommandRegion {
@Override
public void initInputCommand() {
this.inputCommandCreate.cmd = BagCmd.cmd;
this.inputCommandCreate.cmdName = "背包模块";
request();
useRequest();
listenBroadcast(ByteValueList.class, result -> {
List list = result.toList(BagItemMessage.class);
log.info("物品变更 : {}", list.size());
}, BagCmd.broadcastChangeItems, "接收广播-物品变更");
}
@Override
public void loginSuccessCallback() {
if (true) {
return;
}
List list = new ArrayList<>();
// 添加一些经验值道具
BagItemMessage bagItemMessage = BagInternalHelper.ofBagItemMessage(ItemTypeIdConst.expId);
bagItemMessage.quantity = 10;
list.add(bagItemMessage);
log.info("添加 {} 个经验值道具 {}", bagItemMessage.quantity, bagItemMessage);
// 添加一些装备制造书材料
bagItemMessage = BagInternalHelper.ofBagItemMessage(ItemTypeIdConst.equipWeaponBook10);
bagItemMessage.quantity = 1;
list.add(bagItemMessage);
log.info("添加 {} 【装备-武器】制造书材料 {}", bagItemMessage.quantity, bagItemMessage);
// 添加一些装备制造书材料
bagItemMessage = BagInternalHelper.ofBagItemMessage(ItemTypeIdConst.iron10);
bagItemMessage.quantity = 1;
list.add(bagItemMessage);
log.info("添加 {} 装备-制造材料-铁 {}", bagItemMessage.quantity, bagItemMessage);
ofRequestCommand(BagCmd.incrementItem).request(WrapperKit.ofListByteValue(list));
}
private void request() {
ofCommand(BagCmd.bag).callback(BagMessage.class, result -> {
BagMessage value = result.getValue();
List list = value.itemMap.values().stream().map(bagItemMessage -> {
String itemTypeId = bagItemMessage.itemTypeId;
JSONObject bagItemMessageJson = JsonKit.toJSON(bagItemMessage);
JSONObject itemMessageJson = ItemTypeNodeKit.toJSON(itemTypeId);
return JsonKit.merge(bagItemMessageJson, itemMessageJson);
}).toList();
log.info("查询玩家背包 {}", JsonKit.toJsonString(list));
}).setDescription("查询玩家背包");
ofCommand(BagCmd.incrementItem).callback(BagItemMessage.class, result -> {
var value = result.getValue();
log.info("value : {}", value);
// 重新查询一次背包
ofRequestCommand(BagCmd.bag).request();
}).setDescription("往背包添加(增加)物品").setInputRequestData(() -> {
ScannerKit.log(() -> log.info("输入【1】表示添加一个可叠加的物品。"));
String inputType = ScannerKit.nextLine("1");
String id = "1";
String itemId = "1";
if (!"1".equals(inputType)) {
id = SnowKit.nextToString();
}
BagItemMessage bagItemMessage = new BagItemMessage();
bagItemMessage.id = id;
bagItemMessage.itemTypeId = itemId;
bagItemMessage.quantity = 1;
ScannerKit.log(() -> log.info("{}", bagItemMessage));
// 将请求参数包装成 list
return WrapperKit.ofListByteValue(List.of(bagItemMessage));
});
ofCommand(BagCmd.decrementItem).callback(BagItemMessage.class, result -> {
var value = result.getValue();
log.info("value : {}", value);
// 重新查询一次背包
ofRequestCommand(BagCmd.bag).request();
}).setDescription("从背包减少物品").setInputRequestData(() -> {
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);
BagItemMessage bagItemMessage = new BagItemMessage();
bagItemMessage.id = id;
bagItemMessage.quantity = quantity;
ScannerKit.log(() -> log.info("{}", bagItemMessage));
return bagItemMessage;
});
}
private void useRequest() {
InputRequestData inputRequestData = () -> {
UseMessage useMessage = new UseMessage();
useMessage.useItems = sceneDefault();
ScannerKit.log(() -> log.info("当前所使用的物品信息 : {}", JsonKit.toJsonString(useMessage)));
return useMessage;
};
ofCommand(BagCmd.use).callback(BoolValue.class, result -> {
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 sceneBuildEquip() {
ScannerKit.log(() -> {
log.info("装备的制造最少需要使用两样背包物品,1.装备制造书、2.装备制造材料");
log.info("格式 [制造书物品id-制造铁物品id]");
});
String defaultValue = ItemTypeIdConst.equipWeaponBook10 + "-" + ItemTypeIdConst.iron10;
String inputType = defaultValue;
// inputType = ScannerKit.nextLine(defaultValue);
SplitParam param = new SplitParam(inputType);
String equipWeaponBook = param.getString(0, ItemTypeIdConst.equipWeaponBook10);
UseItemMessage useItemMessageEquip = BagInternalHelper.ofUseItemMessage(equipWeaponBook);
String iron = param.getString(1, ItemTypeIdConst.iron10);
UseItemMessage useItemMessageIron = BagInternalHelper.ofUseItemMessage(iron);
return List.of(useItemMessageEquip, useItemMessageIron);
}
private List 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);
}
}