diff --git a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java index 01567438b3..d200cd7502 100644 --- a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java +++ b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java @@ -16,19 +16,21 @@ */ package org.l2jmobius.gameserver.model.holders; +import java.util.concurrent.atomic.AtomicInteger; + /** * @author Gustavo Fonseca */ public class LimitShopRandomCraftReward { private final int _itemId; - private final int _count; + private final AtomicInteger _count; private final int _rewardIndex; public LimitShopRandomCraftReward(int itemId, int count, int rewardIndex) { _itemId = itemId; - _count = count; + _count = new AtomicInteger(count); _rewardIndex = rewardIndex; } @@ -37,7 +39,7 @@ public class LimitShopRandomCraftReward return _itemId; } - public int getCount() + public AtomicInteger getCount() { return _count; } diff --git a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java index 5f867dcd74..2847fff813 100644 --- a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java +++ b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java @@ -16,9 +16,10 @@ */ package org.l2jmobius.gameserver.network.clientpackets.limitshop; -import java.util.ArrayList; import java.util.Collection; -import java.util.List; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import org.l2jmobius.commons.network.ReadablePacket; import org.l2jmobius.commons.util.Rnd; @@ -44,10 +45,10 @@ import org.l2jmobius.gameserver.network.serverpackets.primeshop.ExBRBuyProduct; */ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { + private int _shopIndex; private int _productId; private int _amount; private LimitShopProductHolder _product; - private int _shopIndex; @Override public void read(ReadablePacket packet) @@ -92,24 +93,28 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket if ((_amount < 1) || (_amount > 10000)) { player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.INVENTORY_OVERFLOW)); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } if (!player.isInventoryUnder80(false)) { player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.INVENTORY_OVERFLOW)); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } if ((player.getLevel() < _product.getMinLevel()) || (player.getLevel() > _product.getMaxLevel())) { player.sendPacket(SystemMessageId.YOUR_LEVEL_CANNOT_PURCHASE_THIS_ITEM); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } if (player.hasItemRequest() || player.hasRequest(PrimeShopRequest.class)) { player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.INVALID_USER_STATE)); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } @@ -123,6 +128,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendMessage("You have reached your daily limit."); // TODO: Retail system message? player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } } @@ -132,11 +138,13 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendMessage("You cannot buy any more of this item."); // TODO: Retail system message? player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } } // Check existing items. + final int remainingInfo = Math.max(0, Math.max(_product.getAccountBuyLimit(), _product.getAccountDailyLimit())); for (int i = 0; i < _product.getIngredientIds().length; i++) { if (_product.getIngredientIds()[i] == 0) @@ -149,6 +157,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT_2); player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, remainingInfo, Collections.emptyList())); return; } } @@ -158,6 +167,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT_2); player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, remainingInfo, Collections.emptyList())); return; } } @@ -165,6 +175,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT_2); player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, remainingInfo, Collections.emptyList())); return; } } @@ -208,43 +219,42 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket } // Reward. - final List rewards = new ArrayList<>(); + final Map rewards = new HashMap<>(); if (_product.getProductionId2() > 0) { for (int i = 0; i < _amount; i++) { if (Rnd.get(100) < _product.getChance()) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId(), (int) _product.getCount(), 0)); + rewards.computeIfAbsent(0, k -> new LimitShopRandomCraftReward(_product.getProductionId(), 0, 0)).getCount().addAndGet((int) _product.getCount()); player.addItem("LCoinShop", _product.getProductionId(), _product.getCount(), player, true); } else if ((Rnd.get(100) < _product.getChance2()) || (_product.getProductionId3() == 0)) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId2(), (int) _product.getCount2(), 1)); + rewards.computeIfAbsent(1, k -> new LimitShopRandomCraftReward(_product.getProductionId2(), 0, 1)).getCount().addAndGet((int) _product.getCount2()); player.addItem("LCoinShop", _product.getProductionId2(), _product.getCount2(), player, true); } else if ((Rnd.get(100) < _product.getChance3()) || (_product.getProductionId4() == 0)) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId3(), (int) _product.getCount3(), 2)); + rewards.computeIfAbsent(2, k -> new LimitShopRandomCraftReward(_product.getProductionId3(), 0, 2)).getCount().addAndGet((int) _product.getCount3()); player.addItem("LCoinShop", _product.getProductionId3(), _product.getCount3(), player, true); } else if ((Rnd.get(100) < _product.getChance4()) || (_product.getProductionId5() == 0)) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId4(), (int) _product.getCount4(), 3)); + rewards.computeIfAbsent(3, k -> new LimitShopRandomCraftReward(_product.getProductionId4(), 0, 3)).getCount().addAndGet((int) _product.getCount4()); player.addItem("LCoinShop", _product.getProductionId4(), _product.getCount4(), player, true); } else if (_product.getProductionId5() > 0) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId5(), (int) _product.getCount5(), 4)); + rewards.computeIfAbsent(4, k -> new LimitShopRandomCraftReward(_product.getProductionId5(), 0, 4)).getCount().addAndGet((int) _product.getCount5()); player.addItem("LCoinShop", _product.getProductionId5(), _product.getCount5(), player, true); } } } else if (Rnd.get(100) < _product.getChance()) { - final int amount = (int) (_product.getCount() * _amount); - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId(), amount, 0)); - player.addItem("LCoinShop", _product.getProductionId(), amount, player, true); + rewards.put(0, new LimitShopRandomCraftReward(_product.getProductionId(), (int) (_product.getCount() * _amount), 0)); + player.addItem("LCoinShop", _product.getProductionId(), _product.getCount() * _amount, player, true); } // Update account variables. @@ -257,7 +267,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket player.getAccountVariables().set(AccountVariables.LCOIN_SHOP_PRODUCT_COUNT + _product.getProductionId(), player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_COUNT + _product.getProductionId(), 0) + _amount); } - player.sendPacket(new ExPurchaseLimitShopItemResult(true, _shopIndex, _productId, rewards)); + player.sendPacket(new ExPurchaseLimitShopItemResult(true, _shopIndex, _productId, Math.max(remainingInfo - _amount, 0), rewards.values())); player.sendItemList(); // Remove request. diff --git a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java index e297d56193..59f30f3e2b 100644 --- a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java +++ b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java @@ -16,11 +16,8 @@ */ package org.l2jmobius.gameserver.network.serverpackets.limitshop; -import java.util.List; +import java.util.Collection; -import org.l2jmobius.gameserver.data.xml.LimitShopCraftData; -import org.l2jmobius.gameserver.data.xml.LimitShopData; -import org.l2jmobius.gameserver.model.holders.LimitShopProductHolder; import org.l2jmobius.gameserver.model.holders.LimitShopRandomCraftReward; import org.l2jmobius.gameserver.network.ServerPackets; import org.l2jmobius.gameserver.network.serverpackets.ServerPacket; @@ -32,66 +29,32 @@ public class ExPurchaseLimitShopItemResult extends ServerPacket { private final int _category, _productId; private final boolean _isSuccess; - private final List _rewards; - private final LimitShopProductHolder _product; + private final int _remainingInfo; + private final Collection _rewards; - public ExPurchaseLimitShopItemResult(boolean isSuccess, int category, int productId, List rewards) + public ExPurchaseLimitShopItemResult(boolean isSuccess, int category, int productId, int remainingInfo, Collection rewards) { _isSuccess = isSuccess; _category = category; _productId = productId; + _remainingInfo = remainingInfo; _rewards = rewards; - switch (_category) - { - case 3: // Normal Lcoin Shop - { - _product = LimitShopData.getInstance().getProduct(_productId); - break; - } - case 4: // Lcoin Special Craft - { - _product = LimitShopCraftData.getInstance().getProduct(_productId); - break; - } - default: - { - _product = null; - } - } } @Override public void write() { ServerPackets.EX_PURCHASE_LIMIT_SHOP_ITEM_BUY.writeId(this); - if ((_product == null) || !_isSuccess) + writeByte(_isSuccess ? 0 : 1); + writeByte(_category); + writeInt(_productId); + writeInt(_rewards.size()); + for (LimitShopRandomCraftReward entry : _rewards) { - writeByte(1); - writeByte(_category); - writeInt(_productId); - writeInt(1); - writeByte(1); - writeInt(0); - writeLong(0); - } - else - { - writeByte(0); // success - writeByte(_category); - writeInt(_productId); - writeInt(_rewards.size()); - int counter = 0; - for (LimitShopRandomCraftReward entry : _rewards) - { - if (counter == _rewards.size()) - { - break; - } - writeByte(entry.getRewardIndex()); - writeInt(0); - writeInt(entry.getCount()); - counter++; - } + writeByte(entry.getRewardIndex()); + writeInt(entry.getItemId()); + writeInt(entry.getCount().get()); } + writeInt(_remainingInfo); } } \ No newline at end of file diff --git a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java index 01567438b3..d200cd7502 100644 --- a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java +++ b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java @@ -16,19 +16,21 @@ */ package org.l2jmobius.gameserver.model.holders; +import java.util.concurrent.atomic.AtomicInteger; + /** * @author Gustavo Fonseca */ public class LimitShopRandomCraftReward { private final int _itemId; - private final int _count; + private final AtomicInteger _count; private final int _rewardIndex; public LimitShopRandomCraftReward(int itemId, int count, int rewardIndex) { _itemId = itemId; - _count = count; + _count = new AtomicInteger(count); _rewardIndex = rewardIndex; } @@ -37,7 +39,7 @@ public class LimitShopRandomCraftReward return _itemId; } - public int getCount() + public AtomicInteger getCount() { return _count; } diff --git a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java index 867806d063..879b72c309 100644 --- a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java +++ b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java @@ -16,9 +16,10 @@ */ package org.l2jmobius.gameserver.network.clientpackets.limitshop; -import java.util.ArrayList; import java.util.Collection; -import java.util.List; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import org.l2jmobius.commons.network.ReadablePacket; import org.l2jmobius.commons.util.Rnd; @@ -45,10 +46,10 @@ import org.l2jmobius.gameserver.network.serverpackets.primeshop.ExBRBuyProduct; */ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { + private int _shopIndex; private int _productId; private int _amount; private LimitShopProductHolder _product; - private int _shopIndex; @Override public void read(ReadablePacket packet) @@ -96,24 +97,28 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket if ((_amount < 1) || (_amount > 10000)) { player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.INVENTORY_OVERFLOW)); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } if (!player.isInventoryUnder80(false)) { player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.INVENTORY_OVERFLOW)); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } if ((player.getLevel() < _product.getMinLevel()) || (player.getLevel() > _product.getMaxLevel())) { player.sendPacket(SystemMessageId.YOUR_LEVEL_CANNOT_PURCHASE_THIS_ITEM); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } if (player.hasItemRequest() || player.hasRequest(PrimeShopRequest.class)) { player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.INVALID_USER_STATE)); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } @@ -127,6 +132,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendMessage("You have reached your daily limit."); // TODO: Retail system message? player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } } @@ -136,11 +142,13 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendMessage("You cannot buy any more of this item."); // TODO: Retail system message? player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } } // Check existing items. + final int remainingInfo = Math.max(0, Math.max(_product.getAccountBuyLimit(), _product.getAccountDailyLimit())); for (int i = 0; i < _product.getIngredientIds().length; i++) { if (_product.getIngredientIds()[i] == 0) @@ -153,6 +161,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT_2); player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, remainingInfo, Collections.emptyList())); return; } } @@ -162,6 +171,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT_2); player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, remainingInfo, Collections.emptyList())); return; } } @@ -171,6 +181,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT_2); player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, remainingInfo, Collections.emptyList())); return; } } @@ -178,6 +189,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT_2); player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, remainingInfo, Collections.emptyList())); return; } } @@ -227,43 +239,42 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket } // Reward. - final List rewards = new ArrayList<>(); + final Map rewards = new HashMap<>(); if (_product.getProductionId2() > 0) { for (int i = 0; i < _amount; i++) { if (Rnd.get(100) < _product.getChance()) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId(), (int) _product.getCount(), 0)); + rewards.computeIfAbsent(0, k -> new LimitShopRandomCraftReward(_product.getProductionId(), 0, 0)).getCount().addAndGet((int) _product.getCount()); player.addItem("LCoinShop", _product.getProductionId(), _product.getCount(), player, true); } else if ((Rnd.get(100) < _product.getChance2()) || (_product.getProductionId3() == 0)) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId2(), (int) _product.getCount2(), 1)); + rewards.computeIfAbsent(1, k -> new LimitShopRandomCraftReward(_product.getProductionId2(), 0, 1)).getCount().addAndGet((int) _product.getCount2()); player.addItem("LCoinShop", _product.getProductionId2(), _product.getCount2(), player, true); } else if ((Rnd.get(100) < _product.getChance3()) || (_product.getProductionId4() == 0)) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId3(), (int) _product.getCount3(), 2)); + rewards.computeIfAbsent(2, k -> new LimitShopRandomCraftReward(_product.getProductionId3(), 0, 2)).getCount().addAndGet((int) _product.getCount3()); player.addItem("LCoinShop", _product.getProductionId3(), _product.getCount3(), player, true); } else if ((Rnd.get(100) < _product.getChance4()) || (_product.getProductionId5() == 0)) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId4(), (int) _product.getCount4(), 3)); + rewards.computeIfAbsent(3, k -> new LimitShopRandomCraftReward(_product.getProductionId4(), 0, 3)).getCount().addAndGet((int) _product.getCount4()); player.addItem("LCoinShop", _product.getProductionId4(), _product.getCount4(), player, true); } else if (_product.getProductionId5() > 0) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId5(), (int) _product.getCount5(), 4)); + rewards.computeIfAbsent(4, k -> new LimitShopRandomCraftReward(_product.getProductionId5(), 0, 4)).getCount().addAndGet((int) _product.getCount5()); player.addItem("LCoinShop", _product.getProductionId5(), _product.getCount5(), player, true); } } } else if (Rnd.get(100) < _product.getChance()) { - final int amount = (int) (_product.getCount() * _amount); - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId(), amount, 0)); - player.addItem("LCoinShop", _product.getProductionId(), amount, player, true); + rewards.put(0, new LimitShopRandomCraftReward(_product.getProductionId(), (int) (_product.getCount() * _amount), 0)); + player.addItem("LCoinShop", _product.getProductionId(), _product.getCount() * _amount, player, true); } // Update account variables. @@ -276,7 +287,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket player.getAccountVariables().set(AccountVariables.LCOIN_SHOP_PRODUCT_COUNT + _product.getProductionId(), player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_COUNT + _product.getProductionId(), 0) + _amount); } - player.sendPacket(new ExPurchaseLimitShopItemResult(true, _shopIndex, _productId, rewards)); + player.sendPacket(new ExPurchaseLimitShopItemResult(true, _shopIndex, _productId, Math.max(remainingInfo - _amount, 0), rewards.values())); player.sendItemList(); // Remove request. diff --git a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java index e297d56193..59f30f3e2b 100644 --- a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java +++ b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java @@ -16,11 +16,8 @@ */ package org.l2jmobius.gameserver.network.serverpackets.limitshop; -import java.util.List; +import java.util.Collection; -import org.l2jmobius.gameserver.data.xml.LimitShopCraftData; -import org.l2jmobius.gameserver.data.xml.LimitShopData; -import org.l2jmobius.gameserver.model.holders.LimitShopProductHolder; import org.l2jmobius.gameserver.model.holders.LimitShopRandomCraftReward; import org.l2jmobius.gameserver.network.ServerPackets; import org.l2jmobius.gameserver.network.serverpackets.ServerPacket; @@ -32,66 +29,32 @@ public class ExPurchaseLimitShopItemResult extends ServerPacket { private final int _category, _productId; private final boolean _isSuccess; - private final List _rewards; - private final LimitShopProductHolder _product; + private final int _remainingInfo; + private final Collection _rewards; - public ExPurchaseLimitShopItemResult(boolean isSuccess, int category, int productId, List rewards) + public ExPurchaseLimitShopItemResult(boolean isSuccess, int category, int productId, int remainingInfo, Collection rewards) { _isSuccess = isSuccess; _category = category; _productId = productId; + _remainingInfo = remainingInfo; _rewards = rewards; - switch (_category) - { - case 3: // Normal Lcoin Shop - { - _product = LimitShopData.getInstance().getProduct(_productId); - break; - } - case 4: // Lcoin Special Craft - { - _product = LimitShopCraftData.getInstance().getProduct(_productId); - break; - } - default: - { - _product = null; - } - } } @Override public void write() { ServerPackets.EX_PURCHASE_LIMIT_SHOP_ITEM_BUY.writeId(this); - if ((_product == null) || !_isSuccess) + writeByte(_isSuccess ? 0 : 1); + writeByte(_category); + writeInt(_productId); + writeInt(_rewards.size()); + for (LimitShopRandomCraftReward entry : _rewards) { - writeByte(1); - writeByte(_category); - writeInt(_productId); - writeInt(1); - writeByte(1); - writeInt(0); - writeLong(0); - } - else - { - writeByte(0); // success - writeByte(_category); - writeInt(_productId); - writeInt(_rewards.size()); - int counter = 0; - for (LimitShopRandomCraftReward entry : _rewards) - { - if (counter == _rewards.size()) - { - break; - } - writeByte(entry.getRewardIndex()); - writeInt(0); - writeInt(entry.getCount()); - counter++; - } + writeByte(entry.getRewardIndex()); + writeInt(entry.getItemId()); + writeInt(entry.getCount().get()); } + writeInt(_remainingInfo); } } \ No newline at end of file diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java index 01567438b3..d200cd7502 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java @@ -16,19 +16,21 @@ */ package org.l2jmobius.gameserver.model.holders; +import java.util.concurrent.atomic.AtomicInteger; + /** * @author Gustavo Fonseca */ public class LimitShopRandomCraftReward { private final int _itemId; - private final int _count; + private final AtomicInteger _count; private final int _rewardIndex; public LimitShopRandomCraftReward(int itemId, int count, int rewardIndex) { _itemId = itemId; - _count = count; + _count = new AtomicInteger(count); _rewardIndex = rewardIndex; } @@ -37,7 +39,7 @@ public class LimitShopRandomCraftReward return _itemId; } - public int getCount() + public AtomicInteger getCount() { return _count; } diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java index 504bb596ed..41b6c730c6 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java @@ -16,9 +16,10 @@ */ package org.l2jmobius.gameserver.network.clientpackets.limitshop; -import java.util.ArrayList; import java.util.Collection; -import java.util.List; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import org.l2jmobius.Config; import org.l2jmobius.commons.network.ReadablePacket; @@ -44,10 +45,10 @@ import org.l2jmobius.gameserver.network.serverpackets.primeshop.ExBRBuyProduct; */ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { + private int _shopIndex; private int _productId; private int _amount; private LimitShopProductHolder _product; - private int _shopIndex; @Override public void read(ReadablePacket packet) @@ -92,24 +93,28 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket if ((_amount < 1) || (_amount > 10000)) { player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.INVENTORY_OVERFLOW)); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } if (!player.isInventoryUnder80(false)) { player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.INVENTORY_OVERFLOW)); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } if ((player.getLevel() < _product.getMinLevel()) || (player.getLevel() > _product.getMaxLevel())) { player.sendPacket(SystemMessageId.YOUR_LEVEL_CANNOT_PURCHASE_THIS_ITEM); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } if (player.hasItemRequest() || player.hasRequest(PrimeShopRequest.class)) { player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.INVALID_USER_STATE)); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } @@ -123,6 +128,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendMessage("You have reached your daily limit."); // TODO: Retail system message? player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } } @@ -132,11 +138,13 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendMessage("You cannot buy any more of this item."); // TODO: Retail system message? player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } } // Check existing items. + final int remainingInfo = Math.max(0, Math.max(_product.getAccountBuyLimit(), _product.getAccountDailyLimit())); for (int i = 0; i < _product.getIngredientIds().length; i++) { if (_product.getIngredientIds()[i] == 0) @@ -149,6 +157,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT_2); player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, remainingInfo, Collections.emptyList())); return; } } @@ -156,6 +165,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT_2); player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, remainingInfo, Collections.emptyList())); return; } } @@ -199,43 +209,42 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket } // Reward. - final List rewards = new ArrayList<>(); + final Map rewards = new HashMap<>(); if (_product.getProductionId2() > 0) { for (int i = 0; i < _amount; i++) { if (Rnd.get(100) < _product.getChance()) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId(), (int) _product.getCount(), 0)); + rewards.computeIfAbsent(0, k -> new LimitShopRandomCraftReward(_product.getProductionId(), 0, 0)).getCount().addAndGet((int) _product.getCount()); player.addItem("LCoinShop", _product.getProductionId(), _product.getCount(), player, true); } else if ((Rnd.get(100) < _product.getChance2()) || (_product.getProductionId3() == 0)) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId2(), (int) _product.getCount2(), 1)); + rewards.computeIfAbsent(1, k -> new LimitShopRandomCraftReward(_product.getProductionId2(), 0, 1)).getCount().addAndGet((int) _product.getCount2()); player.addItem("LCoinShop", _product.getProductionId2(), _product.getCount2(), player, true); } else if ((Rnd.get(100) < _product.getChance3()) || (_product.getProductionId4() == 0)) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId3(), (int) _product.getCount3(), 2)); + rewards.computeIfAbsent(2, k -> new LimitShopRandomCraftReward(_product.getProductionId3(), 0, 2)).getCount().addAndGet((int) _product.getCount3()); player.addItem("LCoinShop", _product.getProductionId3(), _product.getCount3(), player, true); } else if ((Rnd.get(100) < _product.getChance4()) || (_product.getProductionId5() == 0)) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId4(), (int) _product.getCount4(), 3)); + rewards.computeIfAbsent(3, k -> new LimitShopRandomCraftReward(_product.getProductionId4(), 0, 3)).getCount().addAndGet((int) _product.getCount4()); player.addItem("LCoinShop", _product.getProductionId4(), _product.getCount4(), player, true); } else if (_product.getProductionId5() > 0) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId5(), (int) _product.getCount5(), 4)); + rewards.computeIfAbsent(4, k -> new LimitShopRandomCraftReward(_product.getProductionId5(), 0, 4)).getCount().addAndGet((int) _product.getCount5()); player.addItem("LCoinShop", _product.getProductionId5(), _product.getCount5(), player, true); } } } else if (Rnd.get(100) < _product.getChance()) { - final int amount = (int) (_product.getCount() * _amount); - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId(), amount, 0)); - player.addItem("LCoinShop", _product.getProductionId(), amount, player, true); + rewards.put(0, new LimitShopRandomCraftReward(_product.getProductionId(), (int) (_product.getCount() * _amount), 0)); + player.addItem("LCoinShop", _product.getProductionId(), _product.getCount() * _amount, player, true); } // Update account variables. @@ -248,7 +257,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket player.getAccountVariables().set(AccountVariables.LCOIN_SHOP_PRODUCT_COUNT + _product.getProductionId(), player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_COUNT + _product.getProductionId(), 0) + _amount); } - player.sendPacket(new ExPurchaseLimitShopItemResult(true, _shopIndex, _productId, rewards)); + player.sendPacket(new ExPurchaseLimitShopItemResult(true, _shopIndex, _productId, Math.max(remainingInfo - _amount, 0), rewards.values())); player.sendItemList(); // Remove request. diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java index e297d56193..59f30f3e2b 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java @@ -16,11 +16,8 @@ */ package org.l2jmobius.gameserver.network.serverpackets.limitshop; -import java.util.List; +import java.util.Collection; -import org.l2jmobius.gameserver.data.xml.LimitShopCraftData; -import org.l2jmobius.gameserver.data.xml.LimitShopData; -import org.l2jmobius.gameserver.model.holders.LimitShopProductHolder; import org.l2jmobius.gameserver.model.holders.LimitShopRandomCraftReward; import org.l2jmobius.gameserver.network.ServerPackets; import org.l2jmobius.gameserver.network.serverpackets.ServerPacket; @@ -32,66 +29,32 @@ public class ExPurchaseLimitShopItemResult extends ServerPacket { private final int _category, _productId; private final boolean _isSuccess; - private final List _rewards; - private final LimitShopProductHolder _product; + private final int _remainingInfo; + private final Collection _rewards; - public ExPurchaseLimitShopItemResult(boolean isSuccess, int category, int productId, List rewards) + public ExPurchaseLimitShopItemResult(boolean isSuccess, int category, int productId, int remainingInfo, Collection rewards) { _isSuccess = isSuccess; _category = category; _productId = productId; + _remainingInfo = remainingInfo; _rewards = rewards; - switch (_category) - { - case 3: // Normal Lcoin Shop - { - _product = LimitShopData.getInstance().getProduct(_productId); - break; - } - case 4: // Lcoin Special Craft - { - _product = LimitShopCraftData.getInstance().getProduct(_productId); - break; - } - default: - { - _product = null; - } - } } @Override public void write() { ServerPackets.EX_PURCHASE_LIMIT_SHOP_ITEM_BUY.writeId(this); - if ((_product == null) || !_isSuccess) + writeByte(_isSuccess ? 0 : 1); + writeByte(_category); + writeInt(_productId); + writeInt(_rewards.size()); + for (LimitShopRandomCraftReward entry : _rewards) { - writeByte(1); - writeByte(_category); - writeInt(_productId); - writeInt(1); - writeByte(1); - writeInt(0); - writeLong(0); - } - else - { - writeByte(0); // success - writeByte(_category); - writeInt(_productId); - writeInt(_rewards.size()); - int counter = 0; - for (LimitShopRandomCraftReward entry : _rewards) - { - if (counter == _rewards.size()) - { - break; - } - writeByte(entry.getRewardIndex()); - writeInt(0); - writeInt(entry.getCount()); - counter++; - } + writeByte(entry.getRewardIndex()); + writeInt(entry.getItemId()); + writeInt(entry.getCount().get()); } + writeInt(_remainingInfo); } } \ No newline at end of file diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java index 01567438b3..d200cd7502 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java @@ -16,19 +16,21 @@ */ package org.l2jmobius.gameserver.model.holders; +import java.util.concurrent.atomic.AtomicInteger; + /** * @author Gustavo Fonseca */ public class LimitShopRandomCraftReward { private final int _itemId; - private final int _count; + private final AtomicInteger _count; private final int _rewardIndex; public LimitShopRandomCraftReward(int itemId, int count, int rewardIndex) { _itemId = itemId; - _count = count; + _count = new AtomicInteger(count); _rewardIndex = rewardIndex; } @@ -37,7 +39,7 @@ public class LimitShopRandomCraftReward return _itemId; } - public int getCount() + public AtomicInteger getCount() { return _count; } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java index e9895b7527..09dc41511d 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java @@ -16,9 +16,10 @@ */ package org.l2jmobius.gameserver.network.clientpackets.limitshop; -import java.util.ArrayList; import java.util.Collection; -import java.util.List; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import org.l2jmobius.Config; import org.l2jmobius.commons.network.ReadablePacket; @@ -46,10 +47,10 @@ import org.l2jmobius.gameserver.network.serverpackets.primeshop.ExBRBuyProduct; */ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { + private int _shopIndex; private int _productId; private int _amount; private LimitShopProductHolder _product; - private int _shopIndex; @Override public void read(ReadablePacket packet) @@ -99,24 +100,28 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket if ((_amount < 1) || (_amount > 10000)) { player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.INVENTORY_OVERFLOW)); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } if (!player.isInventoryUnder80(false)) { player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.INVENTORY_OVERFLOW)); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } if ((player.getLevel() < _product.getMinLevel()) || (player.getLevel() > _product.getMaxLevel())) { player.sendPacket(SystemMessageId.YOUR_LEVEL_CANNOT_PURCHASE_THIS_ITEM); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } if (player.hasItemRequest() || player.hasRequest(PrimeShopRequest.class)) { player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.INVALID_USER_STATE)); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } @@ -130,6 +135,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendMessage("You have reached your daily limit."); // TODO: Retail system message? player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } } @@ -139,11 +145,13 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendMessage("You cannot buy any more of this item."); // TODO: Retail system message? player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } } // Check existing items. + final int remainingInfo = Math.max(0, Math.max(_product.getAccountBuyLimit(), _product.getAccountDailyLimit())); for (int i = 0; i < _product.getIngredientIds().length; i++) { if (_product.getIngredientIds()[i] == 0) @@ -156,6 +164,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT_2); player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, remainingInfo, Collections.emptyList())); return; } } @@ -165,6 +174,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT_2); player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, remainingInfo, Collections.emptyList())); return; } } @@ -172,6 +182,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT_2); player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, remainingInfo, Collections.emptyList())); return; } } @@ -219,43 +230,42 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket } // Reward. - final List rewards = new ArrayList<>(); + final Map rewards = new HashMap<>(); if (_product.getProductionId2() > 0) { for (int i = 0; i < _amount; i++) { if (Rnd.get(100) < _product.getChance()) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId(), (int) _product.getCount(), 0)); + rewards.computeIfAbsent(0, k -> new LimitShopRandomCraftReward(_product.getProductionId(), 0, 0)).getCount().addAndGet((int) _product.getCount()); player.addItem("LCoinShop", _product.getProductionId(), _product.getCount(), player, true); } else if ((Rnd.get(100) < _product.getChance2()) || (_product.getProductionId3() == 0)) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId2(), (int) _product.getCount2(), 1)); + rewards.computeIfAbsent(1, k -> new LimitShopRandomCraftReward(_product.getProductionId2(), 0, 1)).getCount().addAndGet((int) _product.getCount2()); player.addItem("LCoinShop", _product.getProductionId2(), _product.getCount2(), player, true); } else if ((Rnd.get(100) < _product.getChance3()) || (_product.getProductionId4() == 0)) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId3(), (int) _product.getCount3(), 2)); + rewards.computeIfAbsent(2, k -> new LimitShopRandomCraftReward(_product.getProductionId3(), 0, 2)).getCount().addAndGet((int) _product.getCount3()); player.addItem("LCoinShop", _product.getProductionId3(), _product.getCount3(), player, true); } else if ((Rnd.get(100) < _product.getChance4()) || (_product.getProductionId5() == 0)) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId4(), (int) _product.getCount4(), 3)); + rewards.computeIfAbsent(3, k -> new LimitShopRandomCraftReward(_product.getProductionId4(), 0, 3)).getCount().addAndGet((int) _product.getCount4()); player.addItem("LCoinShop", _product.getProductionId4(), _product.getCount4(), player, true); } else if (_product.getProductionId5() > 0) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId5(), (int) _product.getCount5(), 4)); + rewards.computeIfAbsent(4, k -> new LimitShopRandomCraftReward(_product.getProductionId5(), 0, 4)).getCount().addAndGet((int) _product.getCount5()); player.addItem("LCoinShop", _product.getProductionId5(), _product.getCount5(), player, true); } } } else if (Rnd.get(100) < _product.getChance()) { - final int amount = (int) (_product.getCount() * _amount); - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId(), amount, 0)); - player.addItem("LCoinShop", _product.getProductionId(), amount, player, true); + rewards.put(0, new LimitShopRandomCraftReward(_product.getProductionId(), (int) (_product.getCount() * _amount), 0)); + player.addItem("LCoinShop", _product.getProductionId(), _product.getCount() * _amount, player, true); } // Update account variables. @@ -268,7 +278,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket player.getAccountVariables().set(AccountVariables.LCOIN_SHOP_PRODUCT_COUNT + _product.getProductionId(), player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_COUNT + _product.getProductionId(), 0) + _amount); } - player.sendPacket(new ExPurchaseLimitShopItemResult(true, _shopIndex, _productId, rewards)); + player.sendPacket(new ExPurchaseLimitShopItemResult(true, _shopIndex, _productId, Math.max(remainingInfo - _amount, 0), rewards.values())); player.sendItemList(); // Remove request. diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java index 95df57e67a..59f30f3e2b 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java @@ -16,12 +16,8 @@ */ package org.l2jmobius.gameserver.network.serverpackets.limitshop; -import java.util.List; +import java.util.Collection; -import org.l2jmobius.gameserver.data.xml.LimitShopClanData; -import org.l2jmobius.gameserver.data.xml.LimitShopCraftData; -import org.l2jmobius.gameserver.data.xml.LimitShopData; -import org.l2jmobius.gameserver.model.holders.LimitShopProductHolder; import org.l2jmobius.gameserver.model.holders.LimitShopRandomCraftReward; import org.l2jmobius.gameserver.network.ServerPackets; import org.l2jmobius.gameserver.network.serverpackets.ServerPacket; @@ -33,71 +29,32 @@ public class ExPurchaseLimitShopItemResult extends ServerPacket { private final int _category, _productId; private final boolean _isSuccess; - private final List _rewards; - private final LimitShopProductHolder _product; + private final int _remainingInfo; + private final Collection _rewards; - public ExPurchaseLimitShopItemResult(boolean isSuccess, int category, int productId, List rewards) + public ExPurchaseLimitShopItemResult(boolean isSuccess, int category, int productId, int remainingInfo, Collection rewards) { _isSuccess = isSuccess; _category = category; _productId = productId; + _remainingInfo = remainingInfo; _rewards = rewards; - switch (_category) - { - case 3: // Normal Lcoin Shop - { - _product = LimitShopData.getInstance().getProduct(_productId); - break; - } - case 4: // Lcoin Special Craft - { - _product = LimitShopCraftData.getInstance().getProduct(_productId); - break; - } - case 100: // Clan Shop - { - _product = LimitShopClanData.getInstance().getProduct(_productId); - break; - } - default: - { - _product = null; - } - } } @Override public void write() { ServerPackets.EX_PURCHASE_LIMIT_SHOP_ITEM_BUY.writeId(this); - if ((_product == null) || !_isSuccess) + writeByte(_isSuccess ? 0 : 1); + writeByte(_category); + writeInt(_productId); + writeInt(_rewards.size()); + for (LimitShopRandomCraftReward entry : _rewards) { - writeByte(1); - writeByte(_category); - writeInt(_productId); - writeInt(1); - writeByte(1); - writeInt(0); - writeLong(0); - } - else - { - writeByte(0); // success - writeByte(_category); - writeInt(_productId); - writeInt(_rewards.size()); - int counter = 0; - for (LimitShopRandomCraftReward entry : _rewards) - { - if (counter == _rewards.size()) - { - break; - } - writeByte(entry.getRewardIndex()); - writeInt(0); - writeInt(entry.getCount()); - counter++; - } + writeByte(entry.getRewardIndex()); + writeInt(entry.getItemId()); + writeInt(entry.getCount().get()); } + writeInt(_remainingInfo); } } \ No newline at end of file diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java index 01567438b3..d200cd7502 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java @@ -16,19 +16,21 @@ */ package org.l2jmobius.gameserver.model.holders; +import java.util.concurrent.atomic.AtomicInteger; + /** * @author Gustavo Fonseca */ public class LimitShopRandomCraftReward { private final int _itemId; - private final int _count; + private final AtomicInteger _count; private final int _rewardIndex; public LimitShopRandomCraftReward(int itemId, int count, int rewardIndex) { _itemId = itemId; - _count = count; + _count = new AtomicInteger(count); _rewardIndex = rewardIndex; } @@ -37,7 +39,7 @@ public class LimitShopRandomCraftReward return _itemId; } - public int getCount() + public AtomicInteger getCount() { return _count; } diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java index e9895b7527..09dc41511d 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java @@ -16,9 +16,10 @@ */ package org.l2jmobius.gameserver.network.clientpackets.limitshop; -import java.util.ArrayList; import java.util.Collection; -import java.util.List; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import org.l2jmobius.Config; import org.l2jmobius.commons.network.ReadablePacket; @@ -46,10 +47,10 @@ import org.l2jmobius.gameserver.network.serverpackets.primeshop.ExBRBuyProduct; */ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { + private int _shopIndex; private int _productId; private int _amount; private LimitShopProductHolder _product; - private int _shopIndex; @Override public void read(ReadablePacket packet) @@ -99,24 +100,28 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket if ((_amount < 1) || (_amount > 10000)) { player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.INVENTORY_OVERFLOW)); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } if (!player.isInventoryUnder80(false)) { player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.INVENTORY_OVERFLOW)); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } if ((player.getLevel() < _product.getMinLevel()) || (player.getLevel() > _product.getMaxLevel())) { player.sendPacket(SystemMessageId.YOUR_LEVEL_CANNOT_PURCHASE_THIS_ITEM); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } if (player.hasItemRequest() || player.hasRequest(PrimeShopRequest.class)) { player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.INVALID_USER_STATE)); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } @@ -130,6 +135,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendMessage("You have reached your daily limit."); // TODO: Retail system message? player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } } @@ -139,11 +145,13 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendMessage("You cannot buy any more of this item."); // TODO: Retail system message? player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } } // Check existing items. + final int remainingInfo = Math.max(0, Math.max(_product.getAccountBuyLimit(), _product.getAccountDailyLimit())); for (int i = 0; i < _product.getIngredientIds().length; i++) { if (_product.getIngredientIds()[i] == 0) @@ -156,6 +164,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT_2); player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, remainingInfo, Collections.emptyList())); return; } } @@ -165,6 +174,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT_2); player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, remainingInfo, Collections.emptyList())); return; } } @@ -172,6 +182,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT_2); player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, remainingInfo, Collections.emptyList())); return; } } @@ -219,43 +230,42 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket } // Reward. - final List rewards = new ArrayList<>(); + final Map rewards = new HashMap<>(); if (_product.getProductionId2() > 0) { for (int i = 0; i < _amount; i++) { if (Rnd.get(100) < _product.getChance()) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId(), (int) _product.getCount(), 0)); + rewards.computeIfAbsent(0, k -> new LimitShopRandomCraftReward(_product.getProductionId(), 0, 0)).getCount().addAndGet((int) _product.getCount()); player.addItem("LCoinShop", _product.getProductionId(), _product.getCount(), player, true); } else if ((Rnd.get(100) < _product.getChance2()) || (_product.getProductionId3() == 0)) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId2(), (int) _product.getCount2(), 1)); + rewards.computeIfAbsent(1, k -> new LimitShopRandomCraftReward(_product.getProductionId2(), 0, 1)).getCount().addAndGet((int) _product.getCount2()); player.addItem("LCoinShop", _product.getProductionId2(), _product.getCount2(), player, true); } else if ((Rnd.get(100) < _product.getChance3()) || (_product.getProductionId4() == 0)) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId3(), (int) _product.getCount3(), 2)); + rewards.computeIfAbsent(2, k -> new LimitShopRandomCraftReward(_product.getProductionId3(), 0, 2)).getCount().addAndGet((int) _product.getCount3()); player.addItem("LCoinShop", _product.getProductionId3(), _product.getCount3(), player, true); } else if ((Rnd.get(100) < _product.getChance4()) || (_product.getProductionId5() == 0)) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId4(), (int) _product.getCount4(), 3)); + rewards.computeIfAbsent(3, k -> new LimitShopRandomCraftReward(_product.getProductionId4(), 0, 3)).getCount().addAndGet((int) _product.getCount4()); player.addItem("LCoinShop", _product.getProductionId4(), _product.getCount4(), player, true); } else if (_product.getProductionId5() > 0) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId5(), (int) _product.getCount5(), 4)); + rewards.computeIfAbsent(4, k -> new LimitShopRandomCraftReward(_product.getProductionId5(), 0, 4)).getCount().addAndGet((int) _product.getCount5()); player.addItem("LCoinShop", _product.getProductionId5(), _product.getCount5(), player, true); } } } else if (Rnd.get(100) < _product.getChance()) { - final int amount = (int) (_product.getCount() * _amount); - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId(), amount, 0)); - player.addItem("LCoinShop", _product.getProductionId(), amount, player, true); + rewards.put(0, new LimitShopRandomCraftReward(_product.getProductionId(), (int) (_product.getCount() * _amount), 0)); + player.addItem("LCoinShop", _product.getProductionId(), _product.getCount() * _amount, player, true); } // Update account variables. @@ -268,7 +278,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket player.getAccountVariables().set(AccountVariables.LCOIN_SHOP_PRODUCT_COUNT + _product.getProductionId(), player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_COUNT + _product.getProductionId(), 0) + _amount); } - player.sendPacket(new ExPurchaseLimitShopItemResult(true, _shopIndex, _productId, rewards)); + player.sendPacket(new ExPurchaseLimitShopItemResult(true, _shopIndex, _productId, Math.max(remainingInfo - _amount, 0), rewards.values())); player.sendItemList(); // Remove request. diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java index 95df57e67a..59f30f3e2b 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java @@ -16,12 +16,8 @@ */ package org.l2jmobius.gameserver.network.serverpackets.limitshop; -import java.util.List; +import java.util.Collection; -import org.l2jmobius.gameserver.data.xml.LimitShopClanData; -import org.l2jmobius.gameserver.data.xml.LimitShopCraftData; -import org.l2jmobius.gameserver.data.xml.LimitShopData; -import org.l2jmobius.gameserver.model.holders.LimitShopProductHolder; import org.l2jmobius.gameserver.model.holders.LimitShopRandomCraftReward; import org.l2jmobius.gameserver.network.ServerPackets; import org.l2jmobius.gameserver.network.serverpackets.ServerPacket; @@ -33,71 +29,32 @@ public class ExPurchaseLimitShopItemResult extends ServerPacket { private final int _category, _productId; private final boolean _isSuccess; - private final List _rewards; - private final LimitShopProductHolder _product; + private final int _remainingInfo; + private final Collection _rewards; - public ExPurchaseLimitShopItemResult(boolean isSuccess, int category, int productId, List rewards) + public ExPurchaseLimitShopItemResult(boolean isSuccess, int category, int productId, int remainingInfo, Collection rewards) { _isSuccess = isSuccess; _category = category; _productId = productId; + _remainingInfo = remainingInfo; _rewards = rewards; - switch (_category) - { - case 3: // Normal Lcoin Shop - { - _product = LimitShopData.getInstance().getProduct(_productId); - break; - } - case 4: // Lcoin Special Craft - { - _product = LimitShopCraftData.getInstance().getProduct(_productId); - break; - } - case 100: // Clan Shop - { - _product = LimitShopClanData.getInstance().getProduct(_productId); - break; - } - default: - { - _product = null; - } - } } @Override public void write() { ServerPackets.EX_PURCHASE_LIMIT_SHOP_ITEM_BUY.writeId(this); - if ((_product == null) || !_isSuccess) + writeByte(_isSuccess ? 0 : 1); + writeByte(_category); + writeInt(_productId); + writeInt(_rewards.size()); + for (LimitShopRandomCraftReward entry : _rewards) { - writeByte(1); - writeByte(_category); - writeInt(_productId); - writeInt(1); - writeByte(1); - writeInt(0); - writeLong(0); - } - else - { - writeByte(0); // success - writeByte(_category); - writeInt(_productId); - writeInt(_rewards.size()); - int counter = 0; - for (LimitShopRandomCraftReward entry : _rewards) - { - if (counter == _rewards.size()) - { - break; - } - writeByte(entry.getRewardIndex()); - writeInt(0); - writeInt(entry.getCount()); - counter++; - } + writeByte(entry.getRewardIndex()); + writeInt(entry.getItemId()); + writeInt(entry.getCount().get()); } + writeInt(_remainingInfo); } } \ No newline at end of file diff --git a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java index 01567438b3..d200cd7502 100644 --- a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java +++ b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/model/holders/LimitShopRandomCraftReward.java @@ -16,19 +16,21 @@ */ package org.l2jmobius.gameserver.model.holders; +import java.util.concurrent.atomic.AtomicInteger; + /** * @author Gustavo Fonseca */ public class LimitShopRandomCraftReward { private final int _itemId; - private final int _count; + private final AtomicInteger _count; private final int _rewardIndex; public LimitShopRandomCraftReward(int itemId, int count, int rewardIndex) { _itemId = itemId; - _count = count; + _count = new AtomicInteger(count); _rewardIndex = rewardIndex; } @@ -37,7 +39,7 @@ public class LimitShopRandomCraftReward return _itemId; } - public int getCount() + public AtomicInteger getCount() { return _count; } diff --git a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java index 5bd0bd506f..36948b0480 100644 --- a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java +++ b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/network/clientpackets/limitshop/RequestPurchaseLimitShopItemBuy.java @@ -16,9 +16,10 @@ */ package org.l2jmobius.gameserver.network.clientpackets.limitshop; -import java.util.ArrayList; import java.util.Collection; -import java.util.List; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import org.l2jmobius.Config; import org.l2jmobius.commons.network.ReadablePacket; @@ -47,10 +48,10 @@ import org.l2jmobius.gameserver.network.serverpackets.primeshop.ExBRBuyProduct; */ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { + private int _shopIndex; private int _productId; private int _amount; private LimitShopProductHolder _product; - private int _shopIndex; @Override public void read(ReadablePacket packet) @@ -103,24 +104,28 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket if ((_amount < 1) || (_amount > 10000)) { player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.INVENTORY_OVERFLOW)); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } if (!player.isInventoryUnder80(false)) { player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.INVENTORY_OVERFLOW)); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } if ((player.getLevel() < _product.getMinLevel()) || (player.getLevel() > _product.getMaxLevel())) { player.sendPacket(SystemMessageId.YOUR_LEVEL_CANNOT_PURCHASE_THIS_ITEM); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } if (player.hasItemRequest() || player.hasRequest(PrimeShopRequest.class)) { player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.INVALID_USER_STATE)); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } @@ -134,6 +139,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendMessage("You have reached your daily limit."); // TODO: Retail system message? player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } } @@ -143,11 +149,13 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendMessage("You cannot buy any more of this item."); // TODO: Retail system message? player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, 0, Collections.emptyList())); return; } } // Check existing items. + final int remainingInfo = Math.max(0, Math.max(_product.getAccountBuyLimit(), _product.getAccountDailyLimit())); for (int i = 0; i < _product.getIngredientIds().length; i++) { if (_product.getIngredientIds()[i] == 0) @@ -160,6 +168,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT_2); player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, remainingInfo, Collections.emptyList())); return; } } @@ -169,6 +178,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT_2); player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, remainingInfo, Collections.emptyList())); return; } } @@ -178,6 +188,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT_2); player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, remainingInfo, Collections.emptyList())); return; } } @@ -185,6 +196,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket { player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT_2); player.removeRequest(PrimeShopRequest.class); + player.sendPacket(new ExPurchaseLimitShopItemResult(false, _shopIndex, _productId, remainingInfo, Collections.emptyList())); return; } } @@ -238,43 +250,42 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket } // Reward. - final List rewards = new ArrayList<>(); + final Map rewards = new HashMap<>(); if (_product.getProductionId2() > 0) { for (int i = 0; i < _amount; i++) { if (Rnd.get(100) < _product.getChance()) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId(), (int) _product.getCount(), 0)); + rewards.computeIfAbsent(0, k -> new LimitShopRandomCraftReward(_product.getProductionId(), 0, 0)).getCount().addAndGet((int) _product.getCount()); player.addItem("LCoinShop", _product.getProductionId(), _product.getCount(), player, true); } else if ((Rnd.get(100) < _product.getChance2()) || (_product.getProductionId3() == 0)) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId2(), (int) _product.getCount2(), 1)); + rewards.computeIfAbsent(1, k -> new LimitShopRandomCraftReward(_product.getProductionId2(), 0, 1)).getCount().addAndGet((int) _product.getCount2()); player.addItem("LCoinShop", _product.getProductionId2(), _product.getCount2(), player, true); } else if ((Rnd.get(100) < _product.getChance3()) || (_product.getProductionId4() == 0)) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId3(), (int) _product.getCount3(), 2)); + rewards.computeIfAbsent(2, k -> new LimitShopRandomCraftReward(_product.getProductionId3(), 0, 2)).getCount().addAndGet((int) _product.getCount3()); player.addItem("LCoinShop", _product.getProductionId3(), _product.getCount3(), player, true); } else if ((Rnd.get(100) < _product.getChance4()) || (_product.getProductionId5() == 0)) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId4(), (int) _product.getCount4(), 3)); + rewards.computeIfAbsent(3, k -> new LimitShopRandomCraftReward(_product.getProductionId4(), 0, 3)).getCount().addAndGet((int) _product.getCount4()); player.addItem("LCoinShop", _product.getProductionId4(), _product.getCount4(), player, true); } else if (_product.getProductionId5() > 0) { - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId5(), (int) _product.getCount5(), 4)); + rewards.computeIfAbsent(4, k -> new LimitShopRandomCraftReward(_product.getProductionId5(), 0, 4)).getCount().addAndGet((int) _product.getCount5()); player.addItem("LCoinShop", _product.getProductionId5(), _product.getCount5(), player, true); } } } else if (Rnd.get(100) < _product.getChance()) { - final int amount = (int) (_product.getCount() * _amount); - rewards.add(new LimitShopRandomCraftReward(_product.getProductionId(), amount, 0)); - player.addItem("LCoinShop", _product.getProductionId(), amount, player, true); + rewards.put(0, new LimitShopRandomCraftReward(_product.getProductionId(), (int) (_product.getCount() * _amount), 0)); + player.addItem("LCoinShop", _product.getProductionId(), _product.getCount() * _amount, player, true); } // Update account variables. @@ -287,7 +298,7 @@ public class RequestPurchaseLimitShopItemBuy implements ClientPacket player.getAccountVariables().set(AccountVariables.LCOIN_SHOP_PRODUCT_COUNT + _product.getProductionId(), player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_COUNT + _product.getProductionId(), 0) + _amount); } - player.sendPacket(new ExPurchaseLimitShopItemResult(true, _shopIndex, _productId, rewards)); + player.sendPacket(new ExPurchaseLimitShopItemResult(true, _shopIndex, _productId, Math.max(remainingInfo - _amount, 0), rewards.values())); player.sendItemList(); // Remove request. diff --git a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java index 95df57e67a..59f30f3e2b 100644 --- a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java +++ b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/network/serverpackets/limitshop/ExPurchaseLimitShopItemResult.java @@ -16,12 +16,8 @@ */ package org.l2jmobius.gameserver.network.serverpackets.limitshop; -import java.util.List; +import java.util.Collection; -import org.l2jmobius.gameserver.data.xml.LimitShopClanData; -import org.l2jmobius.gameserver.data.xml.LimitShopCraftData; -import org.l2jmobius.gameserver.data.xml.LimitShopData; -import org.l2jmobius.gameserver.model.holders.LimitShopProductHolder; import org.l2jmobius.gameserver.model.holders.LimitShopRandomCraftReward; import org.l2jmobius.gameserver.network.ServerPackets; import org.l2jmobius.gameserver.network.serverpackets.ServerPacket; @@ -33,71 +29,32 @@ public class ExPurchaseLimitShopItemResult extends ServerPacket { private final int _category, _productId; private final boolean _isSuccess; - private final List _rewards; - private final LimitShopProductHolder _product; + private final int _remainingInfo; + private final Collection _rewards; - public ExPurchaseLimitShopItemResult(boolean isSuccess, int category, int productId, List rewards) + public ExPurchaseLimitShopItemResult(boolean isSuccess, int category, int productId, int remainingInfo, Collection rewards) { _isSuccess = isSuccess; _category = category; _productId = productId; + _remainingInfo = remainingInfo; _rewards = rewards; - switch (_category) - { - case 3: // Normal Lcoin Shop - { - _product = LimitShopData.getInstance().getProduct(_productId); - break; - } - case 4: // Lcoin Special Craft - { - _product = LimitShopCraftData.getInstance().getProduct(_productId); - break; - } - case 100: // Clan Shop - { - _product = LimitShopClanData.getInstance().getProduct(_productId); - break; - } - default: - { - _product = null; - } - } } @Override public void write() { ServerPackets.EX_PURCHASE_LIMIT_SHOP_ITEM_BUY.writeId(this); - if ((_product == null) || !_isSuccess) + writeByte(_isSuccess ? 0 : 1); + writeByte(_category); + writeInt(_productId); + writeInt(_rewards.size()); + for (LimitShopRandomCraftReward entry : _rewards) { - writeByte(1); - writeByte(_category); - writeInt(_productId); - writeInt(1); - writeByte(1); - writeInt(0); - writeLong(0); - } - else - { - writeByte(0); // success - writeByte(_category); - writeInt(_productId); - writeInt(_rewards.size()); - int counter = 0; - for (LimitShopRandomCraftReward entry : _rewards) - { - if (counter == _rewards.size()) - { - break; - } - writeByte(entry.getRewardIndex()); - writeInt(0); - writeInt(entry.getCount()); - counter++; - } + writeByte(entry.getRewardIndex()); + writeInt(entry.getItemId()); + writeInt(entry.getCount().get()); } + writeInt(_remainingInfo); } } \ No newline at end of file