Support giftPackage BatchUse

Co-authored-by: pris <lilch1022@hotmail.com>
This commit is contained in:
xtaodada
2022-05-03 11:09:41 +08:00
committed by Melledy
parent 8c7681bd6d
commit 86e6eef4e2
14 changed files with 371 additions and 112 deletions

View File

@@ -58,9 +58,6 @@ public class GameItem {
// Relic
private int mainPropId;
private List<Integer> appendPropIdList;
// shopMailBox
private int rewardBoxId;
private int equipCharacter;
@Transient private int weaponEntityId;
@@ -251,14 +248,6 @@ public class GameItem {
this.mainPropId = mainPropId;
}
public int getRewardBoxId() {
return rewardBoxId;
}
public void setRewardBoxId(int rewardBoxId) {
this.rewardBoxId = rewardBoxId;
}
public List<Integer> getAppendPropIdList() {
return appendPropIdList;
}

View File

@@ -7,13 +7,12 @@ import java.util.stream.Collectors;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.common.ItemParamData;
import emu.grasscutter.data.common.RewardBoxItemData;
import emu.grasscutter.data.custom.OpenConfigEntry;
import emu.grasscutter.data.custom.OpenConfigEntry.SkillPointModifier;
import emu.grasscutter.data.def.AvatarPromoteData;
import emu.grasscutter.data.def.AvatarSkillData;
import emu.grasscutter.data.def.AvatarSkillDepotData;
import emu.grasscutter.data.def.RewardBoxData;
import emu.grasscutter.data.def.ItemData;
import emu.grasscutter.data.def.WeaponPromoteData;
import emu.grasscutter.data.def.AvatarSkillDepotData.InherentProudSkillOpens;
import emu.grasscutter.data.def.AvatarTalentData;
@@ -24,6 +23,8 @@ import emu.grasscutter.game.inventory.ItemType;
import emu.grasscutter.game.inventory.MaterialType;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.ActionReason;
import emu.grasscutter.game.shop.ShopChestBatchUseTable;
import emu.grasscutter.game.shop.ShopChestTable;
import emu.grasscutter.net.proto.ItemParamOuterClass.ItemParam;
import emu.grasscutter.net.proto.MaterialInfoOuterClass.MaterialInfo;
import emu.grasscutter.server.game.GameServer;
@@ -900,27 +901,7 @@ public class InventoryManager {
player.sendPacket(new PacketDestroyMaterialRsp(returnMaterialMap));
}
private boolean handleRewardBox(Player player, GameItem useItem) {
List<RewardBoxData> rewardBoxDataList = GameData.getRewardBoxDataMap().values().stream().filter(x -> x.getId() == useItem.getRewardBoxId()).collect(Collectors.toList());
if (rewardBoxDataList.isEmpty()) {
return false;
}
List<GameItem> rewardItemList = new ArrayList<>();
for (RewardBoxItemData itemData : rewardBoxDataList.get(0).getRewardBoxItemList()) {
if (itemData.getItemId() == 0) {
continue;
}
String[] split = itemData.getItemCount().split(";");
int itemCount = Integer.parseInt(split[(int) (Math.random()* split.length)]);
rewardItemList.add(new GameItem(itemData.getItemId(), itemCount));
}
if (!rewardItemList.isEmpty()) {
player.getInventory().addItems(rewardItemList, ActionReason.Shop);
}
return true;
}
public GameItem useItem(Player player, long targetGuid, long itemGuid, int count) {
public GameItem useItem(Player player, long targetGuid, long itemGuid, int count, int optionId) {
Avatar target = player.getAvatars().getAvatarByGuid(targetGuid);
GameItem useItem = player.getInventory().getItemByGuid(itemGuid);
@@ -952,8 +933,57 @@ public class InventoryManager {
}
break;
case MATERIAL_CHEST:
if (useItem.getRewardBoxId() > 0) {
used = handleRewardBox(player, useItem) ? 1 : 0;
List<ShopChestTable> shopChestTableList = player.getServer().getShopManager().getShopChestData();
List<GameItem> rewardItemList = new ArrayList<>();
for (ShopChestTable shopChestTable : shopChestTableList) {
if (shopChestTable.getItemId() != useItem.getItemId()) {
continue;
}
if (shopChestTable.getContainsItem() == null) {
break;
}
for (ItemParamData itemParamData : shopChestTable.getContainsItem()) {
ItemData itemData = GameData.getItemDataMap().get(itemParamData.getId());
if (itemData == null) {
continue;
}
rewardItemList.add(new GameItem(itemData, itemParamData.getCount()));
}
if (!rewardItemList.isEmpty()) {
player.getInventory().addItems(rewardItemList, ActionReason.Shop);
}
used = 1;
break;
}
break;
case MATERIAL_CHEST_BATCH_USE:
if (optionId < 1) {
break;
}
List<ShopChestBatchUseTable> shopChestBatchUseTableList = player.getServer().getShopManager().getShopChestBatchUseData();
for (ShopChestBatchUseTable shopChestBatchUseTable : shopChestBatchUseTableList) {
if (shopChestBatchUseTable.getItemId() != useItem.getItemId()) {
continue;
}
if (shopChestBatchUseTable.getOptionItem() == null || optionId > shopChestBatchUseTable.getOptionItem().size()) {
break;
}
int optionItemId = shopChestBatchUseTable.getOptionItem().get(optionId - 1);
ItemData itemData = GameData.getItemDataMap().get(optionItemId);
if (itemData == null) {
break;
}
player.getInventory().addItem(new GameItem(itemData, count), ActionReason.Shop);
used = count;
break;
}
break;
default:
@@ -965,12 +995,12 @@ public class InventoryManager {
player.rechargeMoonCard();
used = 1;
}
if (used > 0) {
player.getInventory().removeItem(useItem, used);
return useItem;
}
return null;
}
}

View File

@@ -0,0 +1,25 @@
package emu.grasscutter.game.shop;
import java.util.ArrayList;
import java.util.List;
public class ShopChestBatchUseTable {
private int itemId;
private List<Integer> optionItem = new ArrayList<>();
public int getItemId() {
return itemId;
}
public void setItemId(int itemId) {
this.itemId = itemId;
}
public List<Integer> getOptionItem() {
return optionItem;
}
public void setOptionItem(List<Integer> optionItem) {
this.optionItem = optionItem;
}
}

View File

@@ -0,0 +1,27 @@
package emu.grasscutter.game.shop;
import emu.grasscutter.data.common.ItemParamData;
import java.util.ArrayList;
import java.util.List;
public class ShopChestTable {
private int itemId;
private List<ItemParamData> containsItem = new ArrayList<>();
public int getItemId() {
return itemId;
}
public void setItemId(int itemId) {
this.itemId = itemId;
}
public List<ItemParamData> getContainsItem() {
return containsItem;
}
public void setContainsItem(List<ItemParamData> containsItem) {
this.containsItem = containsItem;
}
}

View File

@@ -13,7 +13,6 @@ public class ShopInfo {
private List<ItemParamData> costItemList;
private int boughtNum = 0;
private int buyLimit = 0;
private int showId = 0;
private int beginTime = 0;
private int endTime = 1924992000;
private int minLevel = 0;
@@ -52,7 +51,6 @@ public class ShopInfo {
this.mcoin = sgd.getCostMcoin();
this.hcoin = sgd.getCostHcoin();
this.buyLimit = sgd.getBuyLimit();
this.showId = sgd.getShowId();
this.minLevel = sgd.getMinPlayerLevel();
this.maxLevel = sgd.getMaxPlayerLevel();
@@ -182,14 +180,6 @@ public class ShopInfo {
this.maxLevel = maxLevel;
}
public int getShowId() {
return showId;
}
public void setShowId(int showId) {
this.showId = showId;
}
public ShopRefreshType getShopRefreshType() {
if (refreshType == null)
return ShopRefreshType.NONE;

View File

@@ -4,7 +4,11 @@ import com.google.gson.reflect.TypeToken;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.common.ItemParamData;
import emu.grasscutter.data.def.ItemData;
import emu.grasscutter.data.def.ShopGoodsData;
import emu.grasscutter.game.inventory.GameItem;
import emu.grasscutter.game.managers.InventoryManager;
import emu.grasscutter.game.props.ActionReason;
import emu.grasscutter.net.proto.ItemParamOuterClass;
import emu.grasscutter.net.proto.ShopGoodsOuterClass;
import emu.grasscutter.server.game.GameServer;
@@ -25,11 +29,23 @@ public class ShopManager {
return shopData;
}
public List<ShopChestTable> getShopChestData() {
return shopChestData;
}
public List<ShopChestBatchUseTable> getShopChestBatchUseData() {
return shopChestBatchUseData;
}
private final Int2ObjectMap<List<ShopInfo>> shopData;
private final List<ShopChestTable> shopChestData;
private final List<ShopChestBatchUseTable> shopChestBatchUseData;
public ShopManager(GameServer server) {
this.server = server;
this.shopData = new Int2ObjectOpenHashMap<>();
this.shopChestData = new ArrayList<>();
this.shopChestBatchUseData = new ArrayList<>();
this.load();
}
@@ -45,7 +61,7 @@ public class ShopManager {
};
}
public synchronized void load() {
private void loadShop() {
try (FileReader fileReader = new FileReader(Grasscutter.getConfig().DATA_FOLDER + "Shop.json")) {
getShopData().clear();
List<ShopTable> banners = Grasscutter.getGsonFactory().fromJson(fileReader, TypeToken.getParameterized(Collection.class, ShopTable.class).getType());
@@ -89,6 +105,42 @@ public class ShopManager {
}
}
private void loadShopChest() {
try (FileReader fileReader = new FileReader(Grasscutter.getConfig().DATA_FOLDER + "ShopChest.json")) {
getShopChestData().clear();
List<ShopChestTable> shopChestTableList = Grasscutter.getGsonFactory().fromJson(fileReader, TypeToken.getParameterized(Collection.class, ShopChestTable.class).getType());
if (shopChestTableList.size() > 0) {
getShopChestData().addAll(shopChestTableList);
Grasscutter.getLogger().info("ShopChest data successfully loaded.");
} else {
Grasscutter.getLogger().error("Unable to load ShopChest data. ShopChest data size is 0.");
}
} catch (Exception e) {
Grasscutter.getLogger().error("Unable to load ShopChest data.", e);
}
}
private void loadShopChestBatchUse() {
try (FileReader fileReader = new FileReader(Grasscutter.getConfig().DATA_FOLDER + "ShopChestBatchUse.json")) {
getShopChestBatchUseData().clear();
List<ShopChestBatchUseTable> shopChestBatchUseTableList = Grasscutter.getGsonFactory().fromJson(fileReader, TypeToken.getParameterized(Collection.class, ShopChestBatchUseTable.class).getType());
if (shopChestBatchUseTableList.size() > 0) {
getShopChestBatchUseData().addAll(shopChestBatchUseTableList);
Grasscutter.getLogger().info("ShopChestBatchUse data successfully loaded.");
} else {
Grasscutter.getLogger().error("Unable to load ShopChestBatchUse data. ShopChestBatchUse data size is 0.");
}
} catch (Exception e) {
Grasscutter.getLogger().error("Unable to load ShopChestBatchUse data.", e);
}
}
public synchronized void load() {
loadShop();
loadShopChest();
loadShopChestBatchUse();
}
public GameServer getServer() {
return server;
}