diff --git a/L2J_Mobius_01.0_Ertheia/dist/game/data/PrimeShop.xml b/L2J_Mobius_01.0_Ertheia/dist/game/data/PrimeShop.xml index 75fc5021fe..0062325355 100644 --- a/L2J_Mobius_01.0_Ertheia/dist/game/data/PrimeShop.xml +++ b/L2J_Mobius_01.0_Ertheia/dist/game/data/PrimeShop.xml @@ -6,149 +6,149 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -157,7 +157,7 @@ - + @@ -165,7 +165,7 @@ - + @@ -173,535 +173,535 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/L2J_Mobius_01.0_Ertheia/dist/game/data/xsd/PrimeShop.xsd b/L2J_Mobius_01.0_Ertheia/dist/game/data/xsd/PrimeShop.xsd index 44a4e34fbe..32fdb15a3f 100644 --- a/L2J_Mobius_01.0_Ertheia/dist/game/data/xsd/PrimeShop.xsd +++ b/L2J_Mobius_01.0_Ertheia/dist/game/data/xsd/PrimeShop.xsd @@ -32,8 +32,8 @@ - - + + diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java index f7b36243c1..ce0a18fa16 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java @@ -29,6 +29,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.data.sql.ClanTable; +import org.l2jmobius.gameserver.data.xml.PrimeShopData; import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.stat.PlayerStat; @@ -36,6 +37,8 @@ import org.l2jmobius.gameserver.model.clan.Clan; import org.l2jmobius.gameserver.model.clan.ClanMember; import org.l2jmobius.gameserver.model.holders.SubClassHolder; import org.l2jmobius.gameserver.model.olympiad.Olympiad; +import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.network.serverpackets.ExVoteSystemInfo; import org.l2jmobius.gameserver.network.serverpackets.ExWorldChatCnt; @@ -107,6 +110,7 @@ public class DailyTaskManager resetClanBonus(); resetDailySkills(); resetWorldChatPoints(); + resetDailyPrimeShopData(); resetRecommends(); resetTrainingCamp(); } @@ -333,6 +337,32 @@ public class DailyTaskManager } } + private void resetDailyPrimeShopData() + { + for (PrimeShopGroup holder : PrimeShopData.getInstance().getPrimeItems().values()) + { + // Update data for offline players. + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement ps = con.prepareStatement("DELETE FROM account_gsdata WHERE var=?")) + { + ps.setString(1, AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + ps.executeUpdate(); + } + catch (Exception e) + { + LOGGER.log(Level.SEVERE, getClass().getSimpleName() + ": Could not reset PrimeShopData: " + e); + } + + // Update data for online players. + for (Player player : World.getInstance().getPlayers()) + { + player.getVariables().remove(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + player.getAccountVariables().storeMe(); + } + } + LOGGER.info("PrimeShopData has been resetted."); + } + public static DailyTaskManager getInstance() { return SingletonHolder.INSTANCE; diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java index d1efd49454..dbd25eac74 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java @@ -45,8 +45,8 @@ public class PrimeShopGroup private final int _maxLevel; private final int _minBirthday; private final int _maxBirthday; - private final int _restrictionDay; - private final int _availableCount; + private final int _accountDailyLimit; + private final int _accountBuyLimit; private final List _items; public PrimeShopGroup(StatSet set, List items) @@ -71,8 +71,8 @@ public class PrimeShopGroup _maxLevel = set.getInt("maxLevel", 0); _minBirthday = set.getInt("minBirthday", 0); _maxBirthday = set.getInt("maxBirthday", 0); - _restrictionDay = set.getInt("restrictionDay", 0); - _availableCount = set.getInt("availableCount", 0); + _accountDailyLimit = set.getInt("accountDailyLimit", 0); + _accountBuyLimit = set.getInt("accountBuyLimit", 0); _items = items; } @@ -186,14 +186,14 @@ public class PrimeShopGroup return _maxBirthday; } - public int getRestrictionDay() + public int getAccountDailyLimit() { - return _restrictionDay; + return _accountDailyLimit; } - public int getAvailableCount() + public int getAccountBuyLimit() { - return _availableCount; + return _accountBuyLimit; } public List getItems() diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java index dbce4c8eea..a2ff71995d 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java @@ -41,6 +41,8 @@ public class AccountVariables extends AbstractVariables // Public variable names public static final String HWID = "HWID"; public static final String HWIDSLIT_VAR = " "; + public static final String PRIME_SHOP_PRODUCT_COUNT = "PSPCount"; + public static final String PRIME_SHOP_PRODUCT_DAILY_COUNT = "PSPDailyCount"; private final String _accountName; diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java index 03540f5789..9669e6cd19 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java @@ -28,6 +28,7 @@ import org.l2jmobius.gameserver.model.actor.request.PrimeShopRequest; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; import org.l2jmobius.gameserver.network.serverpackets.primeshop.ExBRBuyProduct; @@ -105,6 +106,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.addItem("PrimeShop", subItem.getId(), subItem.getCount() * _count, player, true); } + // Update account variables. + if (item.getAccountDailyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + else if (item.getAccountBuyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SUCCESS)); player.sendPacket(new ExBRGamePoint(player)); } @@ -168,6 +179,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.AFTER_SALE_DATE)); return false; } + else if ((item.getAccountDailyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0)) > item.getAccountDailyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } + else if ((item.getAccountBuyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0)) > item.getAccountBuyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } final int weight = item.getWeight() * count; final long slots = item.getCount() * count; diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java index 0f042ba043..609d459cc6 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java @@ -22,6 +22,7 @@ import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; @@ -64,15 +65,49 @@ public class ExBRProductList implements IClientOutgoingPacket packet.writeC(brItem.getStartMinute()); packet.writeC(brItem.getStopHour()); packet.writeC(brItem.getStopMinute()); - packet.writeD(brItem.getStock()); - packet.writeD(brItem.getTotal()); + + // Daily account limit. + if ((brItem.getAccountDailyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + brItem.getBrId(), 0) >= brItem.getAccountDailyLimit())) + { + packet.writeD(brItem.getAccountDailyLimit()); + packet.writeD(brItem.getAccountDailyLimit()); + } + // General account limit. + else if ((brItem.getAccountBuyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + brItem.getBrId(), 0) >= brItem.getAccountBuyLimit())) + { + packet.writeD(brItem.getAccountBuyLimit()); + packet.writeD(brItem.getAccountBuyLimit()); + } + else + { + packet.writeD(brItem.getStock()); + packet.writeD(brItem.getTotal()); + } + packet.writeC(brItem.getSalePercent()); packet.writeC(brItem.getMinLevel()); packet.writeC(brItem.getMaxLevel()); packet.writeD(brItem.getMinBirthday()); packet.writeD(brItem.getMaxBirthday()); - packet.writeD(brItem.getRestrictionDay()); - packet.writeD(brItem.getAvailableCount()); + + // Daily account limit. + if (brItem.getAccountDailyLimit() > 0) + { + packet.writeD(1); // Days + packet.writeD(brItem.getAccountDailyLimit()); // Amount + } + // General account limit. + else if (brItem.getAccountBuyLimit() > 0) + { + packet.writeD(-1); // Days + packet.writeD(brItem.getAccountBuyLimit()); // Amount + } + else + { + packet.writeD(0); // Days + packet.writeD(0); // Amount + } + packet.writeC(brItem.getItems().size()); for (PrimeShopItem item : brItem.getItems()) { diff --git a/L2J_Mobius_02.5_Underground/dist/game/data/PrimeShop.xml b/L2J_Mobius_02.5_Underground/dist/game/data/PrimeShop.xml index 75fc5021fe..0062325355 100644 --- a/L2J_Mobius_02.5_Underground/dist/game/data/PrimeShop.xml +++ b/L2J_Mobius_02.5_Underground/dist/game/data/PrimeShop.xml @@ -6,149 +6,149 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -157,7 +157,7 @@ - + @@ -165,7 +165,7 @@ - + @@ -173,535 +173,535 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/L2J_Mobius_02.5_Underground/dist/game/data/xsd/PrimeShop.xsd b/L2J_Mobius_02.5_Underground/dist/game/data/xsd/PrimeShop.xsd index 44a4e34fbe..32fdb15a3f 100644 --- a/L2J_Mobius_02.5_Underground/dist/game/data/xsd/PrimeShop.xsd +++ b/L2J_Mobius_02.5_Underground/dist/game/data/xsd/PrimeShop.xsd @@ -32,8 +32,8 @@ - - + + diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java index aaa91fbb17..6779359988 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java @@ -30,6 +30,7 @@ import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.data.sql.ClanTable; import org.l2jmobius.gameserver.data.xml.DailyMissionData; +import org.l2jmobius.gameserver.data.xml.PrimeShopData; import org.l2jmobius.gameserver.model.DailyMissionDataHolder; import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.actor.Player; @@ -38,6 +39,8 @@ import org.l2jmobius.gameserver.model.clan.Clan; import org.l2jmobius.gameserver.model.clan.ClanMember; import org.l2jmobius.gameserver.model.holders.SubClassHolder; import org.l2jmobius.gameserver.model.olympiad.Olympiad; +import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.network.serverpackets.ExVoteSystemInfo; import org.l2jmobius.gameserver.network.serverpackets.ExWorldChatCnt; @@ -109,6 +112,7 @@ public class DailyTaskManager resetClanBonus(); resetDailySkills(); resetWorldChatPoints(); + resetDailyPrimeShopData(); resetRecommends(); resetTrainingCamp(); resetDailyMissionRewards(); @@ -396,6 +400,32 @@ public class DailyTaskManager } } + private void resetDailyPrimeShopData() + { + for (PrimeShopGroup holder : PrimeShopData.getInstance().getPrimeItems().values()) + { + // Update data for offline players. + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement ps = con.prepareStatement("DELETE FROM account_gsdata WHERE var=?")) + { + ps.setString(1, AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + ps.executeUpdate(); + } + catch (Exception e) + { + LOGGER.log(Level.SEVERE, getClass().getSimpleName() + ": Could not reset PrimeShopData: " + e); + } + + // Update data for online players. + for (Player player : World.getInstance().getPlayers()) + { + player.getVariables().remove(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + player.getAccountVariables().storeMe(); + } + } + LOGGER.info("PrimeShopData has been resetted."); + } + public static DailyTaskManager getInstance() { return SingletonHolder.INSTANCE; diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java index d1efd49454..dbd25eac74 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java @@ -45,8 +45,8 @@ public class PrimeShopGroup private final int _maxLevel; private final int _minBirthday; private final int _maxBirthday; - private final int _restrictionDay; - private final int _availableCount; + private final int _accountDailyLimit; + private final int _accountBuyLimit; private final List _items; public PrimeShopGroup(StatSet set, List items) @@ -71,8 +71,8 @@ public class PrimeShopGroup _maxLevel = set.getInt("maxLevel", 0); _minBirthday = set.getInt("minBirthday", 0); _maxBirthday = set.getInt("maxBirthday", 0); - _restrictionDay = set.getInt("restrictionDay", 0); - _availableCount = set.getInt("availableCount", 0); + _accountDailyLimit = set.getInt("accountDailyLimit", 0); + _accountBuyLimit = set.getInt("accountBuyLimit", 0); _items = items; } @@ -186,14 +186,14 @@ public class PrimeShopGroup return _maxBirthday; } - public int getRestrictionDay() + public int getAccountDailyLimit() { - return _restrictionDay; + return _accountDailyLimit; } - public int getAvailableCount() + public int getAccountBuyLimit() { - return _availableCount; + return _accountBuyLimit; } public List getItems() diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java index dbce4c8eea..a2ff71995d 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java @@ -41,6 +41,8 @@ public class AccountVariables extends AbstractVariables // Public variable names public static final String HWID = "HWID"; public static final String HWIDSLIT_VAR = " "; + public static final String PRIME_SHOP_PRODUCT_COUNT = "PSPCount"; + public static final String PRIME_SHOP_PRODUCT_DAILY_COUNT = "PSPDailyCount"; private final String _accountName; diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java index 03540f5789..9669e6cd19 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java @@ -28,6 +28,7 @@ import org.l2jmobius.gameserver.model.actor.request.PrimeShopRequest; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; import org.l2jmobius.gameserver.network.serverpackets.primeshop.ExBRBuyProduct; @@ -105,6 +106,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.addItem("PrimeShop", subItem.getId(), subItem.getCount() * _count, player, true); } + // Update account variables. + if (item.getAccountDailyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + else if (item.getAccountBuyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SUCCESS)); player.sendPacket(new ExBRGamePoint(player)); } @@ -168,6 +179,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.AFTER_SALE_DATE)); return false; } + else if ((item.getAccountDailyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0)) > item.getAccountDailyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } + else if ((item.getAccountBuyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0)) > item.getAccountBuyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } final int weight = item.getWeight() * count; final long slots = item.getCount() * count; diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java index 0f042ba043..609d459cc6 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java @@ -22,6 +22,7 @@ import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; @@ -64,15 +65,49 @@ public class ExBRProductList implements IClientOutgoingPacket packet.writeC(brItem.getStartMinute()); packet.writeC(brItem.getStopHour()); packet.writeC(brItem.getStopMinute()); - packet.writeD(brItem.getStock()); - packet.writeD(brItem.getTotal()); + + // Daily account limit. + if ((brItem.getAccountDailyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + brItem.getBrId(), 0) >= brItem.getAccountDailyLimit())) + { + packet.writeD(brItem.getAccountDailyLimit()); + packet.writeD(brItem.getAccountDailyLimit()); + } + // General account limit. + else if ((brItem.getAccountBuyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + brItem.getBrId(), 0) >= brItem.getAccountBuyLimit())) + { + packet.writeD(brItem.getAccountBuyLimit()); + packet.writeD(brItem.getAccountBuyLimit()); + } + else + { + packet.writeD(brItem.getStock()); + packet.writeD(brItem.getTotal()); + } + packet.writeC(brItem.getSalePercent()); packet.writeC(brItem.getMinLevel()); packet.writeC(brItem.getMaxLevel()); packet.writeD(brItem.getMinBirthday()); packet.writeD(brItem.getMaxBirthday()); - packet.writeD(brItem.getRestrictionDay()); - packet.writeD(brItem.getAvailableCount()); + + // Daily account limit. + if (brItem.getAccountDailyLimit() > 0) + { + packet.writeD(1); // Days + packet.writeD(brItem.getAccountDailyLimit()); // Amount + } + // General account limit. + else if (brItem.getAccountBuyLimit() > 0) + { + packet.writeD(-1); // Days + packet.writeD(brItem.getAccountBuyLimit()); // Amount + } + else + { + packet.writeD(0); // Days + packet.writeD(0); // Amount + } + packet.writeC(brItem.getItems().size()); for (PrimeShopItem item : brItem.getItems()) { diff --git a/L2J_Mobius_03.0_Helios/dist/game/data/PrimeShop.xml b/L2J_Mobius_03.0_Helios/dist/game/data/PrimeShop.xml index 75fc5021fe..0062325355 100644 --- a/L2J_Mobius_03.0_Helios/dist/game/data/PrimeShop.xml +++ b/L2J_Mobius_03.0_Helios/dist/game/data/PrimeShop.xml @@ -6,149 +6,149 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -157,7 +157,7 @@ - + @@ -165,7 +165,7 @@ - + @@ -173,535 +173,535 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/L2J_Mobius_03.0_Helios/dist/game/data/xsd/PrimeShop.xsd b/L2J_Mobius_03.0_Helios/dist/game/data/xsd/PrimeShop.xsd index 44a4e34fbe..32fdb15a3f 100644 --- a/L2J_Mobius_03.0_Helios/dist/game/data/xsd/PrimeShop.xsd +++ b/L2J_Mobius_03.0_Helios/dist/game/data/xsd/PrimeShop.xsd @@ -32,8 +32,8 @@ - - + + diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java index aaa91fbb17..6779359988 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java @@ -30,6 +30,7 @@ import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.data.sql.ClanTable; import org.l2jmobius.gameserver.data.xml.DailyMissionData; +import org.l2jmobius.gameserver.data.xml.PrimeShopData; import org.l2jmobius.gameserver.model.DailyMissionDataHolder; import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.actor.Player; @@ -38,6 +39,8 @@ import org.l2jmobius.gameserver.model.clan.Clan; import org.l2jmobius.gameserver.model.clan.ClanMember; import org.l2jmobius.gameserver.model.holders.SubClassHolder; import org.l2jmobius.gameserver.model.olympiad.Olympiad; +import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.network.serverpackets.ExVoteSystemInfo; import org.l2jmobius.gameserver.network.serverpackets.ExWorldChatCnt; @@ -109,6 +112,7 @@ public class DailyTaskManager resetClanBonus(); resetDailySkills(); resetWorldChatPoints(); + resetDailyPrimeShopData(); resetRecommends(); resetTrainingCamp(); resetDailyMissionRewards(); @@ -396,6 +400,32 @@ public class DailyTaskManager } } + private void resetDailyPrimeShopData() + { + for (PrimeShopGroup holder : PrimeShopData.getInstance().getPrimeItems().values()) + { + // Update data for offline players. + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement ps = con.prepareStatement("DELETE FROM account_gsdata WHERE var=?")) + { + ps.setString(1, AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + ps.executeUpdate(); + } + catch (Exception e) + { + LOGGER.log(Level.SEVERE, getClass().getSimpleName() + ": Could not reset PrimeShopData: " + e); + } + + // Update data for online players. + for (Player player : World.getInstance().getPlayers()) + { + player.getVariables().remove(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + player.getAccountVariables().storeMe(); + } + } + LOGGER.info("PrimeShopData has been resetted."); + } + public static DailyTaskManager getInstance() { return SingletonHolder.INSTANCE; diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java index d1efd49454..dbd25eac74 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java @@ -45,8 +45,8 @@ public class PrimeShopGroup private final int _maxLevel; private final int _minBirthday; private final int _maxBirthday; - private final int _restrictionDay; - private final int _availableCount; + private final int _accountDailyLimit; + private final int _accountBuyLimit; private final List _items; public PrimeShopGroup(StatSet set, List items) @@ -71,8 +71,8 @@ public class PrimeShopGroup _maxLevel = set.getInt("maxLevel", 0); _minBirthday = set.getInt("minBirthday", 0); _maxBirthday = set.getInt("maxBirthday", 0); - _restrictionDay = set.getInt("restrictionDay", 0); - _availableCount = set.getInt("availableCount", 0); + _accountDailyLimit = set.getInt("accountDailyLimit", 0); + _accountBuyLimit = set.getInt("accountBuyLimit", 0); _items = items; } @@ -186,14 +186,14 @@ public class PrimeShopGroup return _maxBirthday; } - public int getRestrictionDay() + public int getAccountDailyLimit() { - return _restrictionDay; + return _accountDailyLimit; } - public int getAvailableCount() + public int getAccountBuyLimit() { - return _availableCount; + return _accountBuyLimit; } public List getItems() diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java index dbce4c8eea..a2ff71995d 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java @@ -41,6 +41,8 @@ public class AccountVariables extends AbstractVariables // Public variable names public static final String HWID = "HWID"; public static final String HWIDSLIT_VAR = " "; + public static final String PRIME_SHOP_PRODUCT_COUNT = "PSPCount"; + public static final String PRIME_SHOP_PRODUCT_DAILY_COUNT = "PSPDailyCount"; private final String _accountName; diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java index 03540f5789..9669e6cd19 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java @@ -28,6 +28,7 @@ import org.l2jmobius.gameserver.model.actor.request.PrimeShopRequest; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; import org.l2jmobius.gameserver.network.serverpackets.primeshop.ExBRBuyProduct; @@ -105,6 +106,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.addItem("PrimeShop", subItem.getId(), subItem.getCount() * _count, player, true); } + // Update account variables. + if (item.getAccountDailyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + else if (item.getAccountBuyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SUCCESS)); player.sendPacket(new ExBRGamePoint(player)); } @@ -168,6 +179,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.AFTER_SALE_DATE)); return false; } + else if ((item.getAccountDailyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0)) > item.getAccountDailyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } + else if ((item.getAccountBuyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0)) > item.getAccountBuyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } final int weight = item.getWeight() * count; final long slots = item.getCount() * count; diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java index 0f042ba043..609d459cc6 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java @@ -22,6 +22,7 @@ import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; @@ -64,15 +65,49 @@ public class ExBRProductList implements IClientOutgoingPacket packet.writeC(brItem.getStartMinute()); packet.writeC(brItem.getStopHour()); packet.writeC(brItem.getStopMinute()); - packet.writeD(brItem.getStock()); - packet.writeD(brItem.getTotal()); + + // Daily account limit. + if ((brItem.getAccountDailyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + brItem.getBrId(), 0) >= brItem.getAccountDailyLimit())) + { + packet.writeD(brItem.getAccountDailyLimit()); + packet.writeD(brItem.getAccountDailyLimit()); + } + // General account limit. + else if ((brItem.getAccountBuyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + brItem.getBrId(), 0) >= brItem.getAccountBuyLimit())) + { + packet.writeD(brItem.getAccountBuyLimit()); + packet.writeD(brItem.getAccountBuyLimit()); + } + else + { + packet.writeD(brItem.getStock()); + packet.writeD(brItem.getTotal()); + } + packet.writeC(brItem.getSalePercent()); packet.writeC(brItem.getMinLevel()); packet.writeC(brItem.getMaxLevel()); packet.writeD(brItem.getMinBirthday()); packet.writeD(brItem.getMaxBirthday()); - packet.writeD(brItem.getRestrictionDay()); - packet.writeD(brItem.getAvailableCount()); + + // Daily account limit. + if (brItem.getAccountDailyLimit() > 0) + { + packet.writeD(1); // Days + packet.writeD(brItem.getAccountDailyLimit()); // Amount + } + // General account limit. + else if (brItem.getAccountBuyLimit() > 0) + { + packet.writeD(-1); // Days + packet.writeD(brItem.getAccountBuyLimit()); // Amount + } + else + { + packet.writeD(0); // Days + packet.writeD(0); // Amount + } + packet.writeC(brItem.getItems().size()); for (PrimeShopItem item : brItem.getItems()) { diff --git a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/PrimeShop.xml b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/PrimeShop.xml index 75fc5021fe..0062325355 100644 --- a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/PrimeShop.xml +++ b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/PrimeShop.xml @@ -6,149 +6,149 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -157,7 +157,7 @@ - + @@ -165,7 +165,7 @@ - + @@ -173,535 +173,535 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/xsd/PrimeShop.xsd b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/xsd/PrimeShop.xsd index 44a4e34fbe..32fdb15a3f 100644 --- a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/xsd/PrimeShop.xsd +++ b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/xsd/PrimeShop.xsd @@ -32,8 +32,8 @@ - - + + diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java index aaa91fbb17..6779359988 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java @@ -30,6 +30,7 @@ import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.data.sql.ClanTable; import org.l2jmobius.gameserver.data.xml.DailyMissionData; +import org.l2jmobius.gameserver.data.xml.PrimeShopData; import org.l2jmobius.gameserver.model.DailyMissionDataHolder; import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.actor.Player; @@ -38,6 +39,8 @@ import org.l2jmobius.gameserver.model.clan.Clan; import org.l2jmobius.gameserver.model.clan.ClanMember; import org.l2jmobius.gameserver.model.holders.SubClassHolder; import org.l2jmobius.gameserver.model.olympiad.Olympiad; +import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.network.serverpackets.ExVoteSystemInfo; import org.l2jmobius.gameserver.network.serverpackets.ExWorldChatCnt; @@ -109,6 +112,7 @@ public class DailyTaskManager resetClanBonus(); resetDailySkills(); resetWorldChatPoints(); + resetDailyPrimeShopData(); resetRecommends(); resetTrainingCamp(); resetDailyMissionRewards(); @@ -396,6 +400,32 @@ public class DailyTaskManager } } + private void resetDailyPrimeShopData() + { + for (PrimeShopGroup holder : PrimeShopData.getInstance().getPrimeItems().values()) + { + // Update data for offline players. + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement ps = con.prepareStatement("DELETE FROM account_gsdata WHERE var=?")) + { + ps.setString(1, AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + ps.executeUpdate(); + } + catch (Exception e) + { + LOGGER.log(Level.SEVERE, getClass().getSimpleName() + ": Could not reset PrimeShopData: " + e); + } + + // Update data for online players. + for (Player player : World.getInstance().getPlayers()) + { + player.getVariables().remove(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + player.getAccountVariables().storeMe(); + } + } + LOGGER.info("PrimeShopData has been resetted."); + } + public static DailyTaskManager getInstance() { return SingletonHolder.INSTANCE; diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java index d1efd49454..dbd25eac74 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java @@ -45,8 +45,8 @@ public class PrimeShopGroup private final int _maxLevel; private final int _minBirthday; private final int _maxBirthday; - private final int _restrictionDay; - private final int _availableCount; + private final int _accountDailyLimit; + private final int _accountBuyLimit; private final List _items; public PrimeShopGroup(StatSet set, List items) @@ -71,8 +71,8 @@ public class PrimeShopGroup _maxLevel = set.getInt("maxLevel", 0); _minBirthday = set.getInt("minBirthday", 0); _maxBirthday = set.getInt("maxBirthday", 0); - _restrictionDay = set.getInt("restrictionDay", 0); - _availableCount = set.getInt("availableCount", 0); + _accountDailyLimit = set.getInt("accountDailyLimit", 0); + _accountBuyLimit = set.getInt("accountBuyLimit", 0); _items = items; } @@ -186,14 +186,14 @@ public class PrimeShopGroup return _maxBirthday; } - public int getRestrictionDay() + public int getAccountDailyLimit() { - return _restrictionDay; + return _accountDailyLimit; } - public int getAvailableCount() + public int getAccountBuyLimit() { - return _availableCount; + return _accountBuyLimit; } public List getItems() diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java index dbce4c8eea..a2ff71995d 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java @@ -41,6 +41,8 @@ public class AccountVariables extends AbstractVariables // Public variable names public static final String HWID = "HWID"; public static final String HWIDSLIT_VAR = " "; + public static final String PRIME_SHOP_PRODUCT_COUNT = "PSPCount"; + public static final String PRIME_SHOP_PRODUCT_DAILY_COUNT = "PSPDailyCount"; private final String _accountName; diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java index 03540f5789..9669e6cd19 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java @@ -28,6 +28,7 @@ import org.l2jmobius.gameserver.model.actor.request.PrimeShopRequest; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; import org.l2jmobius.gameserver.network.serverpackets.primeshop.ExBRBuyProduct; @@ -105,6 +106,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.addItem("PrimeShop", subItem.getId(), subItem.getCount() * _count, player, true); } + // Update account variables. + if (item.getAccountDailyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + else if (item.getAccountBuyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SUCCESS)); player.sendPacket(new ExBRGamePoint(player)); } @@ -168,6 +179,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.AFTER_SALE_DATE)); return false; } + else if ((item.getAccountDailyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0)) > item.getAccountDailyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } + else if ((item.getAccountBuyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0)) > item.getAccountBuyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } final int weight = item.getWeight() * count; final long slots = item.getCount() * count; diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java index 0f042ba043..609d459cc6 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java @@ -22,6 +22,7 @@ import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; @@ -64,15 +65,49 @@ public class ExBRProductList implements IClientOutgoingPacket packet.writeC(brItem.getStartMinute()); packet.writeC(brItem.getStopHour()); packet.writeC(brItem.getStopMinute()); - packet.writeD(brItem.getStock()); - packet.writeD(brItem.getTotal()); + + // Daily account limit. + if ((brItem.getAccountDailyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + brItem.getBrId(), 0) >= brItem.getAccountDailyLimit())) + { + packet.writeD(brItem.getAccountDailyLimit()); + packet.writeD(brItem.getAccountDailyLimit()); + } + // General account limit. + else if ((brItem.getAccountBuyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + brItem.getBrId(), 0) >= brItem.getAccountBuyLimit())) + { + packet.writeD(brItem.getAccountBuyLimit()); + packet.writeD(brItem.getAccountBuyLimit()); + } + else + { + packet.writeD(brItem.getStock()); + packet.writeD(brItem.getTotal()); + } + packet.writeC(brItem.getSalePercent()); packet.writeC(brItem.getMinLevel()); packet.writeC(brItem.getMaxLevel()); packet.writeD(brItem.getMinBirthday()); packet.writeD(brItem.getMaxBirthday()); - packet.writeD(brItem.getRestrictionDay()); - packet.writeD(brItem.getAvailableCount()); + + // Daily account limit. + if (brItem.getAccountDailyLimit() > 0) + { + packet.writeD(1); // Days + packet.writeD(brItem.getAccountDailyLimit()); // Amount + } + // General account limit. + else if (brItem.getAccountBuyLimit() > 0) + { + packet.writeD(-1); // Days + packet.writeD(brItem.getAccountBuyLimit()); // Amount + } + else + { + packet.writeD(0); // Days + packet.writeD(0); // Amount + } + packet.writeC(brItem.getItems().size()); for (PrimeShopItem item : brItem.getItems()) { diff --git a/L2J_Mobius_05.0_Salvation/dist/game/data/PrimeShop.xml b/L2J_Mobius_05.0_Salvation/dist/game/data/PrimeShop.xml index 015c92c18f..5b9397983e 100644 --- a/L2J_Mobius_05.0_Salvation/dist/game/data/PrimeShop.xml +++ b/L2J_Mobius_05.0_Salvation/dist/game/data/PrimeShop.xml @@ -7,323 +7,323 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + \ No newline at end of file diff --git a/L2J_Mobius_05.0_Salvation/dist/game/data/xsd/PrimeShop.xsd b/L2J_Mobius_05.0_Salvation/dist/game/data/xsd/PrimeShop.xsd index 44a4e34fbe..32fdb15a3f 100644 --- a/L2J_Mobius_05.0_Salvation/dist/game/data/xsd/PrimeShop.xsd +++ b/L2J_Mobius_05.0_Salvation/dist/game/data/xsd/PrimeShop.xsd @@ -32,8 +32,8 @@ - - + + diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java index 8d319670bd..91e7e3cc13 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java @@ -29,6 +29,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.data.sql.ClanTable; +import org.l2jmobius.gameserver.data.xml.PrimeShopData; import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.stat.PlayerStat; @@ -36,6 +37,8 @@ import org.l2jmobius.gameserver.model.clan.Clan; import org.l2jmobius.gameserver.model.clan.ClanMember; import org.l2jmobius.gameserver.model.holders.SubClassHolder; import org.l2jmobius.gameserver.model.olympiad.Olympiad; +import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.network.serverpackets.ExVoteSystemInfo; import org.l2jmobius.gameserver.network.serverpackets.ExWorldChatCnt; @@ -108,6 +111,7 @@ public class DailyTaskManager // Daily tasks. resetDailySkills(); resetWorldChatPoints(); + resetDailyPrimeShopData(); resetRecommends(); resetTrainingCamp(); resetAttendanceRewards(); @@ -442,6 +446,32 @@ public class DailyTaskManager } } + private void resetDailyPrimeShopData() + { + for (PrimeShopGroup holder : PrimeShopData.getInstance().getPrimeItems().values()) + { + // Update data for offline players. + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement ps = con.prepareStatement("DELETE FROM account_gsdata WHERE var=?")) + { + ps.setString(1, AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + ps.executeUpdate(); + } + catch (Exception e) + { + LOGGER.log(Level.SEVERE, getClass().getSimpleName() + ": Could not reset PrimeShopData: " + e); + } + + // Update data for online players. + for (Player player : World.getInstance().getPlayers()) + { + player.getVariables().remove(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + player.getAccountVariables().storeMe(); + } + } + LOGGER.info("PrimeShopData has been resetted."); + } + public static DailyTaskManager getInstance() { return SingletonHolder.INSTANCE; diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java index d1efd49454..dbd25eac74 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java @@ -45,8 +45,8 @@ public class PrimeShopGroup private final int _maxLevel; private final int _minBirthday; private final int _maxBirthday; - private final int _restrictionDay; - private final int _availableCount; + private final int _accountDailyLimit; + private final int _accountBuyLimit; private final List _items; public PrimeShopGroup(StatSet set, List items) @@ -71,8 +71,8 @@ public class PrimeShopGroup _maxLevel = set.getInt("maxLevel", 0); _minBirthday = set.getInt("minBirthday", 0); _maxBirthday = set.getInt("maxBirthday", 0); - _restrictionDay = set.getInt("restrictionDay", 0); - _availableCount = set.getInt("availableCount", 0); + _accountDailyLimit = set.getInt("accountDailyLimit", 0); + _accountBuyLimit = set.getInt("accountBuyLimit", 0); _items = items; } @@ -186,14 +186,14 @@ public class PrimeShopGroup return _maxBirthday; } - public int getRestrictionDay() + public int getAccountDailyLimit() { - return _restrictionDay; + return _accountDailyLimit; } - public int getAvailableCount() + public int getAccountBuyLimit() { - return _availableCount; + return _accountBuyLimit; } public List getItems() diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java index dbce4c8eea..a2ff71995d 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java @@ -41,6 +41,8 @@ public class AccountVariables extends AbstractVariables // Public variable names public static final String HWID = "HWID"; public static final String HWIDSLIT_VAR = " "; + public static final String PRIME_SHOP_PRODUCT_COUNT = "PSPCount"; + public static final String PRIME_SHOP_PRODUCT_DAILY_COUNT = "PSPDailyCount"; private final String _accountName; diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java index 03540f5789..9669e6cd19 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java @@ -28,6 +28,7 @@ import org.l2jmobius.gameserver.model.actor.request.PrimeShopRequest; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; import org.l2jmobius.gameserver.network.serverpackets.primeshop.ExBRBuyProduct; @@ -105,6 +106,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.addItem("PrimeShop", subItem.getId(), subItem.getCount() * _count, player, true); } + // Update account variables. + if (item.getAccountDailyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + else if (item.getAccountBuyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SUCCESS)); player.sendPacket(new ExBRGamePoint(player)); } @@ -168,6 +179,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.AFTER_SALE_DATE)); return false; } + else if ((item.getAccountDailyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0)) > item.getAccountDailyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } + else if ((item.getAccountBuyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0)) > item.getAccountBuyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } final int weight = item.getWeight() * count; final long slots = item.getCount() * count; diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java index 0f042ba043..609d459cc6 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java @@ -22,6 +22,7 @@ import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; @@ -64,15 +65,49 @@ public class ExBRProductList implements IClientOutgoingPacket packet.writeC(brItem.getStartMinute()); packet.writeC(brItem.getStopHour()); packet.writeC(brItem.getStopMinute()); - packet.writeD(brItem.getStock()); - packet.writeD(brItem.getTotal()); + + // Daily account limit. + if ((brItem.getAccountDailyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + brItem.getBrId(), 0) >= brItem.getAccountDailyLimit())) + { + packet.writeD(brItem.getAccountDailyLimit()); + packet.writeD(brItem.getAccountDailyLimit()); + } + // General account limit. + else if ((brItem.getAccountBuyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + brItem.getBrId(), 0) >= brItem.getAccountBuyLimit())) + { + packet.writeD(brItem.getAccountBuyLimit()); + packet.writeD(brItem.getAccountBuyLimit()); + } + else + { + packet.writeD(brItem.getStock()); + packet.writeD(brItem.getTotal()); + } + packet.writeC(brItem.getSalePercent()); packet.writeC(brItem.getMinLevel()); packet.writeC(brItem.getMaxLevel()); packet.writeD(brItem.getMinBirthday()); packet.writeD(brItem.getMaxBirthday()); - packet.writeD(brItem.getRestrictionDay()); - packet.writeD(brItem.getAvailableCount()); + + // Daily account limit. + if (brItem.getAccountDailyLimit() > 0) + { + packet.writeD(1); // Days + packet.writeD(brItem.getAccountDailyLimit()); // Amount + } + // General account limit. + else if (brItem.getAccountBuyLimit() > 0) + { + packet.writeD(-1); // Days + packet.writeD(brItem.getAccountBuyLimit()); // Amount + } + else + { + packet.writeD(0); // Days + packet.writeD(0); // Amount + } + packet.writeC(brItem.getItems().size()); for (PrimeShopItem item : brItem.getItems()) { diff --git a/L2J_Mobius_05.5_EtinasFate/dist/game/data/PrimeShop.xml b/L2J_Mobius_05.5_EtinasFate/dist/game/data/PrimeShop.xml index 015c92c18f..5b9397983e 100644 --- a/L2J_Mobius_05.5_EtinasFate/dist/game/data/PrimeShop.xml +++ b/L2J_Mobius_05.5_EtinasFate/dist/game/data/PrimeShop.xml @@ -7,323 +7,323 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + \ No newline at end of file diff --git a/L2J_Mobius_05.5_EtinasFate/dist/game/data/xsd/PrimeShop.xsd b/L2J_Mobius_05.5_EtinasFate/dist/game/data/xsd/PrimeShop.xsd index 44a4e34fbe..32fdb15a3f 100644 --- a/L2J_Mobius_05.5_EtinasFate/dist/game/data/xsd/PrimeShop.xsd +++ b/L2J_Mobius_05.5_EtinasFate/dist/game/data/xsd/PrimeShop.xsd @@ -32,8 +32,8 @@ - - + + diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java index 8d319670bd..91e7e3cc13 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java @@ -29,6 +29,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.data.sql.ClanTable; +import org.l2jmobius.gameserver.data.xml.PrimeShopData; import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.stat.PlayerStat; @@ -36,6 +37,8 @@ import org.l2jmobius.gameserver.model.clan.Clan; import org.l2jmobius.gameserver.model.clan.ClanMember; import org.l2jmobius.gameserver.model.holders.SubClassHolder; import org.l2jmobius.gameserver.model.olympiad.Olympiad; +import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.network.serverpackets.ExVoteSystemInfo; import org.l2jmobius.gameserver.network.serverpackets.ExWorldChatCnt; @@ -108,6 +111,7 @@ public class DailyTaskManager // Daily tasks. resetDailySkills(); resetWorldChatPoints(); + resetDailyPrimeShopData(); resetRecommends(); resetTrainingCamp(); resetAttendanceRewards(); @@ -442,6 +446,32 @@ public class DailyTaskManager } } + private void resetDailyPrimeShopData() + { + for (PrimeShopGroup holder : PrimeShopData.getInstance().getPrimeItems().values()) + { + // Update data for offline players. + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement ps = con.prepareStatement("DELETE FROM account_gsdata WHERE var=?")) + { + ps.setString(1, AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + ps.executeUpdate(); + } + catch (Exception e) + { + LOGGER.log(Level.SEVERE, getClass().getSimpleName() + ": Could not reset PrimeShopData: " + e); + } + + // Update data for online players. + for (Player player : World.getInstance().getPlayers()) + { + player.getVariables().remove(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + player.getAccountVariables().storeMe(); + } + } + LOGGER.info("PrimeShopData has been resetted."); + } + public static DailyTaskManager getInstance() { return SingletonHolder.INSTANCE; diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java index d1efd49454..dbd25eac74 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java @@ -45,8 +45,8 @@ public class PrimeShopGroup private final int _maxLevel; private final int _minBirthday; private final int _maxBirthday; - private final int _restrictionDay; - private final int _availableCount; + private final int _accountDailyLimit; + private final int _accountBuyLimit; private final List _items; public PrimeShopGroup(StatSet set, List items) @@ -71,8 +71,8 @@ public class PrimeShopGroup _maxLevel = set.getInt("maxLevel", 0); _minBirthday = set.getInt("minBirthday", 0); _maxBirthday = set.getInt("maxBirthday", 0); - _restrictionDay = set.getInt("restrictionDay", 0); - _availableCount = set.getInt("availableCount", 0); + _accountDailyLimit = set.getInt("accountDailyLimit", 0); + _accountBuyLimit = set.getInt("accountBuyLimit", 0); _items = items; } @@ -186,14 +186,14 @@ public class PrimeShopGroup return _maxBirthday; } - public int getRestrictionDay() + public int getAccountDailyLimit() { - return _restrictionDay; + return _accountDailyLimit; } - public int getAvailableCount() + public int getAccountBuyLimit() { - return _availableCount; + return _accountBuyLimit; } public List getItems() diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java index dbce4c8eea..a2ff71995d 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java @@ -41,6 +41,8 @@ public class AccountVariables extends AbstractVariables // Public variable names public static final String HWID = "HWID"; public static final String HWIDSLIT_VAR = " "; + public static final String PRIME_SHOP_PRODUCT_COUNT = "PSPCount"; + public static final String PRIME_SHOP_PRODUCT_DAILY_COUNT = "PSPDailyCount"; private final String _accountName; diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java index 03540f5789..9669e6cd19 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java @@ -28,6 +28,7 @@ import org.l2jmobius.gameserver.model.actor.request.PrimeShopRequest; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; import org.l2jmobius.gameserver.network.serverpackets.primeshop.ExBRBuyProduct; @@ -105,6 +106,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.addItem("PrimeShop", subItem.getId(), subItem.getCount() * _count, player, true); } + // Update account variables. + if (item.getAccountDailyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + else if (item.getAccountBuyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SUCCESS)); player.sendPacket(new ExBRGamePoint(player)); } @@ -168,6 +179,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.AFTER_SALE_DATE)); return false; } + else if ((item.getAccountDailyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0)) > item.getAccountDailyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } + else if ((item.getAccountBuyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0)) > item.getAccountBuyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } final int weight = item.getWeight() * count; final long slots = item.getCount() * count; diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java index 0f042ba043..609d459cc6 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java @@ -22,6 +22,7 @@ import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; @@ -64,15 +65,49 @@ public class ExBRProductList implements IClientOutgoingPacket packet.writeC(brItem.getStartMinute()); packet.writeC(brItem.getStopHour()); packet.writeC(brItem.getStopMinute()); - packet.writeD(brItem.getStock()); - packet.writeD(brItem.getTotal()); + + // Daily account limit. + if ((brItem.getAccountDailyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + brItem.getBrId(), 0) >= brItem.getAccountDailyLimit())) + { + packet.writeD(brItem.getAccountDailyLimit()); + packet.writeD(brItem.getAccountDailyLimit()); + } + // General account limit. + else if ((brItem.getAccountBuyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + brItem.getBrId(), 0) >= brItem.getAccountBuyLimit())) + { + packet.writeD(brItem.getAccountBuyLimit()); + packet.writeD(brItem.getAccountBuyLimit()); + } + else + { + packet.writeD(brItem.getStock()); + packet.writeD(brItem.getTotal()); + } + packet.writeC(brItem.getSalePercent()); packet.writeC(brItem.getMinLevel()); packet.writeC(brItem.getMaxLevel()); packet.writeD(brItem.getMinBirthday()); packet.writeD(brItem.getMaxBirthday()); - packet.writeD(brItem.getRestrictionDay()); - packet.writeD(brItem.getAvailableCount()); + + // Daily account limit. + if (brItem.getAccountDailyLimit() > 0) + { + packet.writeD(1); // Days + packet.writeD(brItem.getAccountDailyLimit()); // Amount + } + // General account limit. + else if (brItem.getAccountBuyLimit() > 0) + { + packet.writeD(-1); // Days + packet.writeD(brItem.getAccountBuyLimit()); // Amount + } + else + { + packet.writeD(0); // Days + packet.writeD(0); // Amount + } + packet.writeC(brItem.getItems().size()); for (PrimeShopItem item : brItem.getItems()) { diff --git a/L2J_Mobius_06.0_Fafurion/dist/game/data/PrimeShop.xml b/L2J_Mobius_06.0_Fafurion/dist/game/data/PrimeShop.xml index bbbbbcfc71..e4f84a6d83 100644 --- a/L2J_Mobius_06.0_Fafurion/dist/game/data/PrimeShop.xml +++ b/L2J_Mobius_06.0_Fafurion/dist/game/data/PrimeShop.xml @@ -7,326 +7,326 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + \ No newline at end of file diff --git a/L2J_Mobius_06.0_Fafurion/dist/game/data/xsd/PrimeShop.xsd b/L2J_Mobius_06.0_Fafurion/dist/game/data/xsd/PrimeShop.xsd index 44a4e34fbe..32fdb15a3f 100644 --- a/L2J_Mobius_06.0_Fafurion/dist/game/data/xsd/PrimeShop.xsd +++ b/L2J_Mobius_06.0_Fafurion/dist/game/data/xsd/PrimeShop.xsd @@ -32,8 +32,8 @@ - - + + diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java index 8d319670bd..91e7e3cc13 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java @@ -29,6 +29,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.data.sql.ClanTable; +import org.l2jmobius.gameserver.data.xml.PrimeShopData; import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.stat.PlayerStat; @@ -36,6 +37,8 @@ import org.l2jmobius.gameserver.model.clan.Clan; import org.l2jmobius.gameserver.model.clan.ClanMember; import org.l2jmobius.gameserver.model.holders.SubClassHolder; import org.l2jmobius.gameserver.model.olympiad.Olympiad; +import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.network.serverpackets.ExVoteSystemInfo; import org.l2jmobius.gameserver.network.serverpackets.ExWorldChatCnt; @@ -108,6 +111,7 @@ public class DailyTaskManager // Daily tasks. resetDailySkills(); resetWorldChatPoints(); + resetDailyPrimeShopData(); resetRecommends(); resetTrainingCamp(); resetAttendanceRewards(); @@ -442,6 +446,32 @@ public class DailyTaskManager } } + private void resetDailyPrimeShopData() + { + for (PrimeShopGroup holder : PrimeShopData.getInstance().getPrimeItems().values()) + { + // Update data for offline players. + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement ps = con.prepareStatement("DELETE FROM account_gsdata WHERE var=?")) + { + ps.setString(1, AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + ps.executeUpdate(); + } + catch (Exception e) + { + LOGGER.log(Level.SEVERE, getClass().getSimpleName() + ": Could not reset PrimeShopData: " + e); + } + + // Update data for online players. + for (Player player : World.getInstance().getPlayers()) + { + player.getVariables().remove(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + player.getAccountVariables().storeMe(); + } + } + LOGGER.info("PrimeShopData has been resetted."); + } + public static DailyTaskManager getInstance() { return SingletonHolder.INSTANCE; diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java index d1efd49454..dbd25eac74 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java @@ -45,8 +45,8 @@ public class PrimeShopGroup private final int _maxLevel; private final int _minBirthday; private final int _maxBirthday; - private final int _restrictionDay; - private final int _availableCount; + private final int _accountDailyLimit; + private final int _accountBuyLimit; private final List _items; public PrimeShopGroup(StatSet set, List items) @@ -71,8 +71,8 @@ public class PrimeShopGroup _maxLevel = set.getInt("maxLevel", 0); _minBirthday = set.getInt("minBirthday", 0); _maxBirthday = set.getInt("maxBirthday", 0); - _restrictionDay = set.getInt("restrictionDay", 0); - _availableCount = set.getInt("availableCount", 0); + _accountDailyLimit = set.getInt("accountDailyLimit", 0); + _accountBuyLimit = set.getInt("accountBuyLimit", 0); _items = items; } @@ -186,14 +186,14 @@ public class PrimeShopGroup return _maxBirthday; } - public int getRestrictionDay() + public int getAccountDailyLimit() { - return _restrictionDay; + return _accountDailyLimit; } - public int getAvailableCount() + public int getAccountBuyLimit() { - return _availableCount; + return _accountBuyLimit; } public List getItems() diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java index dbce4c8eea..a2ff71995d 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java @@ -41,6 +41,8 @@ public class AccountVariables extends AbstractVariables // Public variable names public static final String HWID = "HWID"; public static final String HWIDSLIT_VAR = " "; + public static final String PRIME_SHOP_PRODUCT_COUNT = "PSPCount"; + public static final String PRIME_SHOP_PRODUCT_DAILY_COUNT = "PSPDailyCount"; private final String _accountName; diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java index 03540f5789..9669e6cd19 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java @@ -28,6 +28,7 @@ import org.l2jmobius.gameserver.model.actor.request.PrimeShopRequest; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; import org.l2jmobius.gameserver.network.serverpackets.primeshop.ExBRBuyProduct; @@ -105,6 +106,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.addItem("PrimeShop", subItem.getId(), subItem.getCount() * _count, player, true); } + // Update account variables. + if (item.getAccountDailyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + else if (item.getAccountBuyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SUCCESS)); player.sendPacket(new ExBRGamePoint(player)); } @@ -168,6 +179,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.AFTER_SALE_DATE)); return false; } + else if ((item.getAccountDailyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0)) > item.getAccountDailyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } + else if ((item.getAccountBuyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0)) > item.getAccountBuyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } final int weight = item.getWeight() * count; final long slots = item.getCount() * count; diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java index 0f042ba043..609d459cc6 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java @@ -22,6 +22,7 @@ import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; @@ -64,15 +65,49 @@ public class ExBRProductList implements IClientOutgoingPacket packet.writeC(brItem.getStartMinute()); packet.writeC(brItem.getStopHour()); packet.writeC(brItem.getStopMinute()); - packet.writeD(brItem.getStock()); - packet.writeD(brItem.getTotal()); + + // Daily account limit. + if ((brItem.getAccountDailyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + brItem.getBrId(), 0) >= brItem.getAccountDailyLimit())) + { + packet.writeD(brItem.getAccountDailyLimit()); + packet.writeD(brItem.getAccountDailyLimit()); + } + // General account limit. + else if ((brItem.getAccountBuyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + brItem.getBrId(), 0) >= brItem.getAccountBuyLimit())) + { + packet.writeD(brItem.getAccountBuyLimit()); + packet.writeD(brItem.getAccountBuyLimit()); + } + else + { + packet.writeD(brItem.getStock()); + packet.writeD(brItem.getTotal()); + } + packet.writeC(brItem.getSalePercent()); packet.writeC(brItem.getMinLevel()); packet.writeC(brItem.getMaxLevel()); packet.writeD(brItem.getMinBirthday()); packet.writeD(brItem.getMaxBirthday()); - packet.writeD(brItem.getRestrictionDay()); - packet.writeD(brItem.getAvailableCount()); + + // Daily account limit. + if (brItem.getAccountDailyLimit() > 0) + { + packet.writeD(1); // Days + packet.writeD(brItem.getAccountDailyLimit()); // Amount + } + // General account limit. + else if (brItem.getAccountBuyLimit() > 0) + { + packet.writeD(-1); // Days + packet.writeD(brItem.getAccountBuyLimit()); // Amount + } + else + { + packet.writeD(0); // Days + packet.writeD(0); // Amount + } + packet.writeC(brItem.getItems().size()); for (PrimeShopItem item : brItem.getItems()) { diff --git a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/PrimeShop.xml b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/PrimeShop.xml index bbbbbcfc71..e4f84a6d83 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/PrimeShop.xml +++ b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/PrimeShop.xml @@ -7,326 +7,326 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + \ No newline at end of file diff --git a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/xsd/PrimeShop.xsd b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/xsd/PrimeShop.xsd index 44a4e34fbe..32fdb15a3f 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/xsd/PrimeShop.xsd +++ b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/xsd/PrimeShop.xsd @@ -32,8 +32,8 @@ - - + + diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java index 55fcefedc3..adf24eb8f9 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java @@ -29,6 +29,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.data.sql.ClanTable; +import org.l2jmobius.gameserver.data.xml.PrimeShopData; import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData; import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.actor.Player; @@ -38,6 +39,8 @@ import org.l2jmobius.gameserver.model.clan.ClanMember; import org.l2jmobius.gameserver.model.holders.SubClassHolder; import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder; import org.l2jmobius.gameserver.model.olympiad.Olympiad; +import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.network.serverpackets.ExVoteSystemInfo; import org.l2jmobius.gameserver.network.serverpackets.ExWorldChatCnt; @@ -111,6 +114,7 @@ public class DailyTaskManager // Daily tasks. resetDailySkills(); resetWorldChatPoints(); + resetDailyPrimeShopData(); resetRecommends(); resetTrainingCamp(); resetTimedHuntingZones(); @@ -518,6 +522,32 @@ public class DailyTaskManager } } + private void resetDailyPrimeShopData() + { + for (PrimeShopGroup holder : PrimeShopData.getInstance().getPrimeItems().values()) + { + // Update data for offline players. + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement ps = con.prepareStatement("DELETE FROM account_gsdata WHERE var=?")) + { + ps.setString(1, AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + ps.executeUpdate(); + } + catch (Exception e) + { + LOGGER.log(Level.SEVERE, getClass().getSimpleName() + ": Could not reset PrimeShopData: " + e); + } + + // Update data for online players. + for (Player player : World.getInstance().getPlayers()) + { + player.getVariables().remove(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + player.getAccountVariables().storeMe(); + } + } + LOGGER.info("PrimeShopData has been resetted."); + } + public static DailyTaskManager getInstance() { return SingletonHolder.INSTANCE; diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java index d1efd49454..dbd25eac74 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java @@ -45,8 +45,8 @@ public class PrimeShopGroup private final int _maxLevel; private final int _minBirthday; private final int _maxBirthday; - private final int _restrictionDay; - private final int _availableCount; + private final int _accountDailyLimit; + private final int _accountBuyLimit; private final List _items; public PrimeShopGroup(StatSet set, List items) @@ -71,8 +71,8 @@ public class PrimeShopGroup _maxLevel = set.getInt("maxLevel", 0); _minBirthday = set.getInt("minBirthday", 0); _maxBirthday = set.getInt("maxBirthday", 0); - _restrictionDay = set.getInt("restrictionDay", 0); - _availableCount = set.getInt("availableCount", 0); + _accountDailyLimit = set.getInt("accountDailyLimit", 0); + _accountBuyLimit = set.getInt("accountBuyLimit", 0); _items = items; } @@ -186,14 +186,14 @@ public class PrimeShopGroup return _maxBirthday; } - public int getRestrictionDay() + public int getAccountDailyLimit() { - return _restrictionDay; + return _accountDailyLimit; } - public int getAvailableCount() + public int getAccountBuyLimit() { - return _availableCount; + return _accountBuyLimit; } public List getItems() diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java index dbce4c8eea..a2ff71995d 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java @@ -41,6 +41,8 @@ public class AccountVariables extends AbstractVariables // Public variable names public static final String HWID = "HWID"; public static final String HWIDSLIT_VAR = " "; + public static final String PRIME_SHOP_PRODUCT_COUNT = "PSPCount"; + public static final String PRIME_SHOP_PRODUCT_DAILY_COUNT = "PSPDailyCount"; private final String _accountName; diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java index 03540f5789..9669e6cd19 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java @@ -28,6 +28,7 @@ import org.l2jmobius.gameserver.model.actor.request.PrimeShopRequest; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; import org.l2jmobius.gameserver.network.serverpackets.primeshop.ExBRBuyProduct; @@ -105,6 +106,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.addItem("PrimeShop", subItem.getId(), subItem.getCount() * _count, player, true); } + // Update account variables. + if (item.getAccountDailyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + else if (item.getAccountBuyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SUCCESS)); player.sendPacket(new ExBRGamePoint(player)); } @@ -168,6 +179,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.AFTER_SALE_DATE)); return false; } + else if ((item.getAccountDailyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0)) > item.getAccountDailyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } + else if ((item.getAccountBuyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0)) > item.getAccountBuyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } final int weight = item.getWeight() * count; final long slots = item.getCount() * count; diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java index 0f042ba043..609d459cc6 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java @@ -22,6 +22,7 @@ import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; @@ -64,15 +65,49 @@ public class ExBRProductList implements IClientOutgoingPacket packet.writeC(brItem.getStartMinute()); packet.writeC(brItem.getStopHour()); packet.writeC(brItem.getStopMinute()); - packet.writeD(brItem.getStock()); - packet.writeD(brItem.getTotal()); + + // Daily account limit. + if ((brItem.getAccountDailyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + brItem.getBrId(), 0) >= brItem.getAccountDailyLimit())) + { + packet.writeD(brItem.getAccountDailyLimit()); + packet.writeD(brItem.getAccountDailyLimit()); + } + // General account limit. + else if ((brItem.getAccountBuyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + brItem.getBrId(), 0) >= brItem.getAccountBuyLimit())) + { + packet.writeD(brItem.getAccountBuyLimit()); + packet.writeD(brItem.getAccountBuyLimit()); + } + else + { + packet.writeD(brItem.getStock()); + packet.writeD(brItem.getTotal()); + } + packet.writeC(brItem.getSalePercent()); packet.writeC(brItem.getMinLevel()); packet.writeC(brItem.getMaxLevel()); packet.writeD(brItem.getMinBirthday()); packet.writeD(brItem.getMaxBirthday()); - packet.writeD(brItem.getRestrictionDay()); - packet.writeD(brItem.getAvailableCount()); + + // Daily account limit. + if (brItem.getAccountDailyLimit() > 0) + { + packet.writeD(1); // Days + packet.writeD(brItem.getAccountDailyLimit()); // Amount + } + // General account limit. + else if (brItem.getAccountBuyLimit() > 0) + { + packet.writeD(-1); // Days + packet.writeD(brItem.getAccountBuyLimit()); // Amount + } + else + { + packet.writeD(0); // Days + packet.writeD(0); // Amount + } + packet.writeC(brItem.getItems().size()); for (PrimeShopItem item : brItem.getItems()) { diff --git a/L2J_Mobius_08.2_Homunculus/dist/game/data/PrimeShop.xml b/L2J_Mobius_08.2_Homunculus/dist/game/data/PrimeShop.xml index bbbbbcfc71..e4f84a6d83 100644 --- a/L2J_Mobius_08.2_Homunculus/dist/game/data/PrimeShop.xml +++ b/L2J_Mobius_08.2_Homunculus/dist/game/data/PrimeShop.xml @@ -7,326 +7,326 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + \ No newline at end of file diff --git a/L2J_Mobius_08.2_Homunculus/dist/game/data/xsd/PrimeShop.xsd b/L2J_Mobius_08.2_Homunculus/dist/game/data/xsd/PrimeShop.xsd index 44a4e34fbe..32fdb15a3f 100644 --- a/L2J_Mobius_08.2_Homunculus/dist/game/data/xsd/PrimeShop.xsd +++ b/L2J_Mobius_08.2_Homunculus/dist/game/data/xsd/PrimeShop.xsd @@ -32,8 +32,8 @@ - - + + diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java index 8b6e342a1e..78d64cde57 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java @@ -31,6 +31,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.data.sql.ClanTable; +import org.l2jmobius.gameserver.data.xml.PrimeShopData; import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData; import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.actor.Player; @@ -40,6 +41,8 @@ import org.l2jmobius.gameserver.model.clan.ClanMember; import org.l2jmobius.gameserver.model.holders.SubClassHolder; import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder; import org.l2jmobius.gameserver.model.olympiad.Olympiad; +import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.network.serverpackets.ExVoteSystemInfo; import org.l2jmobius.gameserver.network.serverpackets.ExWorldChatCnt; @@ -113,6 +116,7 @@ public class DailyTaskManager // Daily tasks. resetDailySkills(); resetWorldChatPoints(); + resetDailyPrimeShopData(); resetRecommends(); resetTrainingCamp(); resetThroneOfHeroes(); @@ -590,6 +594,32 @@ public class DailyTaskManager } } + private void resetDailyPrimeShopData() + { + for (PrimeShopGroup holder : PrimeShopData.getInstance().getPrimeItems().values()) + { + // Update data for offline players. + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement ps = con.prepareStatement("DELETE FROM account_gsdata WHERE var=?")) + { + ps.setString(1, AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + ps.executeUpdate(); + } + catch (Exception e) + { + LOGGER.log(Level.SEVERE, getClass().getSimpleName() + ": Could not reset PrimeShopData: " + e); + } + + // Update data for online players. + for (Player player : World.getInstance().getPlayers()) + { + player.getVariables().remove(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + player.getAccountVariables().storeMe(); + } + } + LOGGER.info("PrimeShopData has been resetted."); + } + public static DailyTaskManager getInstance() { return SingletonHolder.INSTANCE; diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java index d1efd49454..dbd25eac74 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java @@ -45,8 +45,8 @@ public class PrimeShopGroup private final int _maxLevel; private final int _minBirthday; private final int _maxBirthday; - private final int _restrictionDay; - private final int _availableCount; + private final int _accountDailyLimit; + private final int _accountBuyLimit; private final List _items; public PrimeShopGroup(StatSet set, List items) @@ -71,8 +71,8 @@ public class PrimeShopGroup _maxLevel = set.getInt("maxLevel", 0); _minBirthday = set.getInt("minBirthday", 0); _maxBirthday = set.getInt("maxBirthday", 0); - _restrictionDay = set.getInt("restrictionDay", 0); - _availableCount = set.getInt("availableCount", 0); + _accountDailyLimit = set.getInt("accountDailyLimit", 0); + _accountBuyLimit = set.getInt("accountBuyLimit", 0); _items = items; } @@ -186,14 +186,14 @@ public class PrimeShopGroup return _maxBirthday; } - public int getRestrictionDay() + public int getAccountDailyLimit() { - return _restrictionDay; + return _accountDailyLimit; } - public int getAvailableCount() + public int getAccountBuyLimit() { - return _availableCount; + return _accountBuyLimit; } public List getItems() diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java index dbce4c8eea..a2ff71995d 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java @@ -41,6 +41,8 @@ public class AccountVariables extends AbstractVariables // Public variable names public static final String HWID = "HWID"; public static final String HWIDSLIT_VAR = " "; + public static final String PRIME_SHOP_PRODUCT_COUNT = "PSPCount"; + public static final String PRIME_SHOP_PRODUCT_DAILY_COUNT = "PSPDailyCount"; private final String _accountName; diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java index 03540f5789..9669e6cd19 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java @@ -28,6 +28,7 @@ import org.l2jmobius.gameserver.model.actor.request.PrimeShopRequest; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; import org.l2jmobius.gameserver.network.serverpackets.primeshop.ExBRBuyProduct; @@ -105,6 +106,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.addItem("PrimeShop", subItem.getId(), subItem.getCount() * _count, player, true); } + // Update account variables. + if (item.getAccountDailyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + else if (item.getAccountBuyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SUCCESS)); player.sendPacket(new ExBRGamePoint(player)); } @@ -168,6 +179,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.AFTER_SALE_DATE)); return false; } + else if ((item.getAccountDailyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0)) > item.getAccountDailyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } + else if ((item.getAccountBuyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0)) > item.getAccountBuyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } final int weight = item.getWeight() * count; final long slots = item.getCount() * count; diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java index 0f042ba043..609d459cc6 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java @@ -22,6 +22,7 @@ import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; @@ -64,15 +65,49 @@ public class ExBRProductList implements IClientOutgoingPacket packet.writeC(brItem.getStartMinute()); packet.writeC(brItem.getStopHour()); packet.writeC(brItem.getStopMinute()); - packet.writeD(brItem.getStock()); - packet.writeD(brItem.getTotal()); + + // Daily account limit. + if ((brItem.getAccountDailyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + brItem.getBrId(), 0) >= brItem.getAccountDailyLimit())) + { + packet.writeD(brItem.getAccountDailyLimit()); + packet.writeD(brItem.getAccountDailyLimit()); + } + // General account limit. + else if ((brItem.getAccountBuyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + brItem.getBrId(), 0) >= brItem.getAccountBuyLimit())) + { + packet.writeD(brItem.getAccountBuyLimit()); + packet.writeD(brItem.getAccountBuyLimit()); + } + else + { + packet.writeD(brItem.getStock()); + packet.writeD(brItem.getTotal()); + } + packet.writeC(brItem.getSalePercent()); packet.writeC(brItem.getMinLevel()); packet.writeC(brItem.getMaxLevel()); packet.writeD(brItem.getMinBirthday()); packet.writeD(brItem.getMaxBirthday()); - packet.writeD(brItem.getRestrictionDay()); - packet.writeD(brItem.getAvailableCount()); + + // Daily account limit. + if (brItem.getAccountDailyLimit() > 0) + { + packet.writeD(1); // Days + packet.writeD(brItem.getAccountDailyLimit()); // Amount + } + // General account limit. + else if (brItem.getAccountBuyLimit() > 0) + { + packet.writeD(-1); // Days + packet.writeD(brItem.getAccountBuyLimit()); // Amount + } + else + { + packet.writeD(0); // Days + packet.writeD(0); // Amount + } + packet.writeC(brItem.getItems().size()); for (PrimeShopItem item : brItem.getItems()) { diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/PrimeShop.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/PrimeShop.xml index bbbbbcfc71..e4f84a6d83 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/PrimeShop.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/PrimeShop.xml @@ -7,326 +7,326 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + \ No newline at end of file diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/xsd/PrimeShop.xsd b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/xsd/PrimeShop.xsd index 44a4e34fbe..32fdb15a3f 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/xsd/PrimeShop.xsd +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/xsd/PrimeShop.xsd @@ -32,8 +32,8 @@ - - + + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java index 8b6e342a1e..78d64cde57 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java @@ -31,6 +31,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.data.sql.ClanTable; +import org.l2jmobius.gameserver.data.xml.PrimeShopData; import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData; import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.actor.Player; @@ -40,6 +41,8 @@ import org.l2jmobius.gameserver.model.clan.ClanMember; import org.l2jmobius.gameserver.model.holders.SubClassHolder; import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder; import org.l2jmobius.gameserver.model.olympiad.Olympiad; +import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.network.serverpackets.ExVoteSystemInfo; import org.l2jmobius.gameserver.network.serverpackets.ExWorldChatCnt; @@ -113,6 +116,7 @@ public class DailyTaskManager // Daily tasks. resetDailySkills(); resetWorldChatPoints(); + resetDailyPrimeShopData(); resetRecommends(); resetTrainingCamp(); resetThroneOfHeroes(); @@ -590,6 +594,32 @@ public class DailyTaskManager } } + private void resetDailyPrimeShopData() + { + for (PrimeShopGroup holder : PrimeShopData.getInstance().getPrimeItems().values()) + { + // Update data for offline players. + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement ps = con.prepareStatement("DELETE FROM account_gsdata WHERE var=?")) + { + ps.setString(1, AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + ps.executeUpdate(); + } + catch (Exception e) + { + LOGGER.log(Level.SEVERE, getClass().getSimpleName() + ": Could not reset PrimeShopData: " + e); + } + + // Update data for online players. + for (Player player : World.getInstance().getPlayers()) + { + player.getVariables().remove(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + player.getAccountVariables().storeMe(); + } + } + LOGGER.info("PrimeShopData has been resetted."); + } + public static DailyTaskManager getInstance() { return SingletonHolder.INSTANCE; diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java index d1efd49454..dbd25eac74 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java @@ -45,8 +45,8 @@ public class PrimeShopGroup private final int _maxLevel; private final int _minBirthday; private final int _maxBirthday; - private final int _restrictionDay; - private final int _availableCount; + private final int _accountDailyLimit; + private final int _accountBuyLimit; private final List _items; public PrimeShopGroup(StatSet set, List items) @@ -71,8 +71,8 @@ public class PrimeShopGroup _maxLevel = set.getInt("maxLevel", 0); _minBirthday = set.getInt("minBirthday", 0); _maxBirthday = set.getInt("maxBirthday", 0); - _restrictionDay = set.getInt("restrictionDay", 0); - _availableCount = set.getInt("availableCount", 0); + _accountDailyLimit = set.getInt("accountDailyLimit", 0); + _accountBuyLimit = set.getInt("accountBuyLimit", 0); _items = items; } @@ -186,14 +186,14 @@ public class PrimeShopGroup return _maxBirthday; } - public int getRestrictionDay() + public int getAccountDailyLimit() { - return _restrictionDay; + return _accountDailyLimit; } - public int getAvailableCount() + public int getAccountBuyLimit() { - return _availableCount; + return _accountBuyLimit; } public List getItems() diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java index dbce4c8eea..a2ff71995d 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java @@ -41,6 +41,8 @@ public class AccountVariables extends AbstractVariables // Public variable names public static final String HWID = "HWID"; public static final String HWIDSLIT_VAR = " "; + public static final String PRIME_SHOP_PRODUCT_COUNT = "PSPCount"; + public static final String PRIME_SHOP_PRODUCT_DAILY_COUNT = "PSPDailyCount"; private final String _accountName; diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java index 03540f5789..9669e6cd19 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java @@ -28,6 +28,7 @@ import org.l2jmobius.gameserver.model.actor.request.PrimeShopRequest; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; import org.l2jmobius.gameserver.network.serverpackets.primeshop.ExBRBuyProduct; @@ -105,6 +106,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.addItem("PrimeShop", subItem.getId(), subItem.getCount() * _count, player, true); } + // Update account variables. + if (item.getAccountDailyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + else if (item.getAccountBuyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SUCCESS)); player.sendPacket(new ExBRGamePoint(player)); } @@ -168,6 +179,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.AFTER_SALE_DATE)); return false; } + else if ((item.getAccountDailyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0)) > item.getAccountDailyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } + else if ((item.getAccountBuyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0)) > item.getAccountBuyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } final int weight = item.getWeight() * count; final long slots = item.getCount() * count; diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java index 0f042ba043..609d459cc6 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java @@ -22,6 +22,7 @@ import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; @@ -64,15 +65,49 @@ public class ExBRProductList implements IClientOutgoingPacket packet.writeC(brItem.getStartMinute()); packet.writeC(brItem.getStopHour()); packet.writeC(brItem.getStopMinute()); - packet.writeD(brItem.getStock()); - packet.writeD(brItem.getTotal()); + + // Daily account limit. + if ((brItem.getAccountDailyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + brItem.getBrId(), 0) >= brItem.getAccountDailyLimit())) + { + packet.writeD(brItem.getAccountDailyLimit()); + packet.writeD(brItem.getAccountDailyLimit()); + } + // General account limit. + else if ((brItem.getAccountBuyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + brItem.getBrId(), 0) >= brItem.getAccountBuyLimit())) + { + packet.writeD(brItem.getAccountBuyLimit()); + packet.writeD(brItem.getAccountBuyLimit()); + } + else + { + packet.writeD(brItem.getStock()); + packet.writeD(brItem.getTotal()); + } + packet.writeC(brItem.getSalePercent()); packet.writeC(brItem.getMinLevel()); packet.writeC(brItem.getMaxLevel()); packet.writeD(brItem.getMinBirthday()); packet.writeD(brItem.getMaxBirthday()); - packet.writeD(brItem.getRestrictionDay()); - packet.writeD(brItem.getAvailableCount()); + + // Daily account limit. + if (brItem.getAccountDailyLimit() > 0) + { + packet.writeD(1); // Days + packet.writeD(brItem.getAccountDailyLimit()); // Amount + } + // General account limit. + else if (brItem.getAccountBuyLimit() > 0) + { + packet.writeD(-1); // Days + packet.writeD(brItem.getAccountBuyLimit()); // Amount + } + else + { + packet.writeD(0); // Days + packet.writeD(0); // Amount + } + packet.writeC(brItem.getItems().size()); for (PrimeShopItem item : brItem.getItems()) { diff --git a/L2J_Mobius_10.1_MasterClass/dist/game/data/PrimeShop.xml b/L2J_Mobius_10.1_MasterClass/dist/game/data/PrimeShop.xml index bbbbbcfc71..e4f84a6d83 100644 --- a/L2J_Mobius_10.1_MasterClass/dist/game/data/PrimeShop.xml +++ b/L2J_Mobius_10.1_MasterClass/dist/game/data/PrimeShop.xml @@ -7,326 +7,326 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + \ No newline at end of file diff --git a/L2J_Mobius_10.1_MasterClass/dist/game/data/xsd/PrimeShop.xsd b/L2J_Mobius_10.1_MasterClass/dist/game/data/xsd/PrimeShop.xsd index 44a4e34fbe..32fdb15a3f 100644 --- a/L2J_Mobius_10.1_MasterClass/dist/game/data/xsd/PrimeShop.xsd +++ b/L2J_Mobius_10.1_MasterClass/dist/game/data/xsd/PrimeShop.xsd @@ -32,8 +32,8 @@ - - + + diff --git a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java index fead10560d..ca10ad4ee5 100644 --- a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java +++ b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java @@ -32,6 +32,7 @@ import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.data.sql.ClanTable; import org.l2jmobius.gameserver.data.xml.LimitShopData; +import org.l2jmobius.gameserver.data.xml.PrimeShopData; import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData; import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.actor.Player; @@ -42,6 +43,7 @@ import org.l2jmobius.gameserver.model.holders.LimitShopProductHolder; import org.l2jmobius.gameserver.model.holders.SubClassHolder; import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder; import org.l2jmobius.gameserver.model.olympiad.Olympiad; +import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.network.serverpackets.ExVoteSystemInfo; @@ -116,6 +118,7 @@ public class DailyTaskManager // Daily tasks. resetAttendanceRewards(); resetDailySkills(); + resetDailyPrimeShopData(); resetDailyLimitShopData(); resetHomunculusResetPoints(); resetRecommends(); @@ -594,6 +597,32 @@ public class DailyTaskManager } } + private void resetDailyPrimeShopData() + { + for (PrimeShopGroup holder : PrimeShopData.getInstance().getPrimeItems().values()) + { + // Update data for offline players. + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement ps = con.prepareStatement("DELETE FROM account_gsdata WHERE var=?")) + { + ps.setString(1, AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + ps.executeUpdate(); + } + catch (Exception e) + { + LOGGER.log(Level.SEVERE, getClass().getSimpleName() + ": Could not reset PrimeShopData: " + e); + } + + // Update data for online players. + for (Player player : World.getInstance().getPlayers()) + { + player.getVariables().remove(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + player.getAccountVariables().storeMe(); + } + } + LOGGER.info("PrimeShopData has been resetted."); + } + private void resetDailyLimitShopData() { for (LimitShopProductHolder holder : LimitShopData.getInstance().getProducts()) diff --git a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java index d1efd49454..dbd25eac74 100644 --- a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java +++ b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java @@ -45,8 +45,8 @@ public class PrimeShopGroup private final int _maxLevel; private final int _minBirthday; private final int _maxBirthday; - private final int _restrictionDay; - private final int _availableCount; + private final int _accountDailyLimit; + private final int _accountBuyLimit; private final List _items; public PrimeShopGroup(StatSet set, List items) @@ -71,8 +71,8 @@ public class PrimeShopGroup _maxLevel = set.getInt("maxLevel", 0); _minBirthday = set.getInt("minBirthday", 0); _maxBirthday = set.getInt("maxBirthday", 0); - _restrictionDay = set.getInt("restrictionDay", 0); - _availableCount = set.getInt("availableCount", 0); + _accountDailyLimit = set.getInt("accountDailyLimit", 0); + _accountBuyLimit = set.getInt("accountBuyLimit", 0); _items = items; } @@ -186,14 +186,14 @@ public class PrimeShopGroup return _maxBirthday; } - public int getRestrictionDay() + public int getAccountDailyLimit() { - return _restrictionDay; + return _accountDailyLimit; } - public int getAvailableCount() + public int getAccountBuyLimit() { - return _availableCount; + return _accountBuyLimit; } public List getItems() diff --git a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java index bfc010518e..13697a87c2 100644 --- a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java +++ b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java @@ -41,6 +41,8 @@ public class AccountVariables extends AbstractVariables // Public variable names public static final String HWID = "HWID"; public static final String HWIDSLIT_VAR = " "; + public static final String PRIME_SHOP_PRODUCT_COUNT = "PSPCount"; + public static final String PRIME_SHOP_PRODUCT_DAILY_COUNT = "PSPDailyCount"; public static final String LCOIN_SHOP_PRODUCT_COUNT = "LCSCount"; public static final String LCOIN_SHOP_PRODUCT_DAILY_COUNT = "LCSDailyCount"; diff --git a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java index 03540f5789..9669e6cd19 100644 --- a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java +++ b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java @@ -28,6 +28,7 @@ import org.l2jmobius.gameserver.model.actor.request.PrimeShopRequest; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; import org.l2jmobius.gameserver.network.serverpackets.primeshop.ExBRBuyProduct; @@ -105,6 +106,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.addItem("PrimeShop", subItem.getId(), subItem.getCount() * _count, player, true); } + // Update account variables. + if (item.getAccountDailyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + else if (item.getAccountBuyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SUCCESS)); player.sendPacket(new ExBRGamePoint(player)); } @@ -168,6 +179,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.AFTER_SALE_DATE)); return false; } + else if ((item.getAccountDailyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0)) > item.getAccountDailyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } + else if ((item.getAccountBuyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0)) > item.getAccountBuyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } final int weight = item.getWeight() * count; final long slots = item.getCount() * count; diff --git a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java index 0f042ba043..609d459cc6 100644 --- a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java +++ b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java @@ -22,6 +22,7 @@ import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; @@ -64,15 +65,49 @@ public class ExBRProductList implements IClientOutgoingPacket packet.writeC(brItem.getStartMinute()); packet.writeC(brItem.getStopHour()); packet.writeC(brItem.getStopMinute()); - packet.writeD(brItem.getStock()); - packet.writeD(brItem.getTotal()); + + // Daily account limit. + if ((brItem.getAccountDailyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + brItem.getBrId(), 0) >= brItem.getAccountDailyLimit())) + { + packet.writeD(brItem.getAccountDailyLimit()); + packet.writeD(brItem.getAccountDailyLimit()); + } + // General account limit. + else if ((brItem.getAccountBuyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + brItem.getBrId(), 0) >= brItem.getAccountBuyLimit())) + { + packet.writeD(brItem.getAccountBuyLimit()); + packet.writeD(brItem.getAccountBuyLimit()); + } + else + { + packet.writeD(brItem.getStock()); + packet.writeD(brItem.getTotal()); + } + packet.writeC(brItem.getSalePercent()); packet.writeC(brItem.getMinLevel()); packet.writeC(brItem.getMaxLevel()); packet.writeD(brItem.getMinBirthday()); packet.writeD(brItem.getMaxBirthday()); - packet.writeD(brItem.getRestrictionDay()); - packet.writeD(brItem.getAvailableCount()); + + // Daily account limit. + if (brItem.getAccountDailyLimit() > 0) + { + packet.writeD(1); // Days + packet.writeD(brItem.getAccountDailyLimit()); // Amount + } + // General account limit. + else if (brItem.getAccountBuyLimit() > 0) + { + packet.writeD(-1); // Days + packet.writeD(brItem.getAccountBuyLimit()); // Amount + } + else + { + packet.writeD(0); // Days + packet.writeD(0); // Amount + } + packet.writeC(brItem.getItems().size()); for (PrimeShopItem item : brItem.getItems()) { diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/PrimeShop.xml b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/PrimeShop.xml index a887d51f61..168eb818dc 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/PrimeShop.xml +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/PrimeShop.xml @@ -11,51 +11,51 @@ for the price to be used as golden or silver, vipTier needs to be > 0 --> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + \ No newline at end of file diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/xsd/PrimeShop.xsd b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/xsd/PrimeShop.xsd index 530eeae8ab..004ef069c3 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/xsd/PrimeShop.xsd +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/xsd/PrimeShop.xsd @@ -32,8 +32,8 @@ - - + + diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java index 3b43ade755..c8d54b47ee 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java @@ -30,6 +30,7 @@ import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.data.sql.ClanTable; import org.l2jmobius.gameserver.data.xml.DailyMissionData; +import org.l2jmobius.gameserver.data.xml.PrimeShopData; import org.l2jmobius.gameserver.model.DailyMissionDataHolder; import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.actor.Player; @@ -38,6 +39,7 @@ import org.l2jmobius.gameserver.model.clan.Clan; import org.l2jmobius.gameserver.model.clan.ClanMember; import org.l2jmobius.gameserver.model.holders.SubClassHolder; import org.l2jmobius.gameserver.model.olympiad.Olympiad; +import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.model.vip.VipManager; @@ -110,6 +112,7 @@ public class DailyTaskManager // Daily tasks. resetClanBonus(); resetDailySkills(); + resetDailyPrimeShopData(); resetWorldChatPoints(); resetRecommends(); resetTrainingCamp(); @@ -417,6 +420,32 @@ public class DailyTaskManager } } + private void resetDailyPrimeShopData() + { + for (PrimeShopGroup holder : PrimeShopData.getInstance().getPrimeItems().values()) + { + // Update data for offline players. + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement ps = con.prepareStatement("DELETE FROM account_gsdata WHERE var=?")) + { + ps.setString(1, AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + ps.executeUpdate(); + } + catch (Exception e) + { + LOGGER.log(Level.SEVERE, getClass().getSimpleName() + ": Could not reset PrimeShopData: " + e); + } + + // Update data for online players. + for (Player player : World.getInstance().getPlayers()) + { + player.getVariables().remove(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + player.getAccountVariables().storeMe(); + } + } + LOGGER.info("PrimeShopData has been resetted."); + } + public static DailyTaskManager getInstance() { return SingletonHolder.INSTANCE; diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java index e9d87771f6..7812bc5c28 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java @@ -45,8 +45,8 @@ public class PrimeShopGroup private final int _maxLevel; private final int _minBirthday; private final int _maxBirthday; - private final int _restrictionDay; - private final int _availableCount; + private final int _accountDailyLimit; + private final int _accountBuyLimit; private final boolean _isVipGift; private final int _vipTier; private final int _silverCoin; @@ -74,8 +74,8 @@ public class PrimeShopGroup _maxLevel = set.getInt("maxLevel", 0); _minBirthday = set.getInt("minBirthday", 0); _maxBirthday = set.getInt("maxBirthday", 0); - _restrictionDay = set.getInt("restrictionDay", 0); - _availableCount = set.getInt("availableCount", 0); + _accountDailyLimit = set.getInt("accountDailyLimit", 0); + _accountBuyLimit = set.getInt("accountBuyLimit", 0); _isVipGift = set.getBoolean("isVipGift", false); _vipTier = set.getInt("vipTier", 0); _silverCoin = set.getInt("silverCoin", 0); @@ -193,14 +193,14 @@ public class PrimeShopGroup return _maxBirthday; } - public int getRestrictionDay() + public int getAccountDailyLimit() { - return _restrictionDay; + return _accountDailyLimit; } - public int getAvailableCount() + public int getAccountBuyLimit() { - return _availableCount; + return _accountBuyLimit; } public boolean isVipGift() diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java index 1e8c85d8fc..2c93f7ac59 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java @@ -42,6 +42,8 @@ public class AccountVariables extends AbstractVariables // Public variable names public static final String HWID = "HWID"; public static final String HWIDSLIT_VAR = " "; + public static final String PRIME_SHOP_PRODUCT_COUNT = "PSPCount"; + public static final String PRIME_SHOP_PRODUCT_DAILY_COUNT = "PSPDailyCount"; public static final String VIP_POINTS = "VipPoints"; public static final String VIP_TIER = "VipTier"; public static final String VIP_EXPIRATION = "VipExpiration"; diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java index 409c6e9d46..6091190154 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java @@ -138,6 +138,17 @@ public class RequestBRBuyProduct implements IClientIncomingPacket { player.getAccountVariables().set(AccountVariables.VIP_ITEM_BOUGHT, Calendar.getInstance().getTimeInMillis()); } + + // Update account variables. + if (item.getAccountDailyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + else if (item.getAccountBuyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SUCCESS)); player.sendPacket(new ExBRGamePoint(player)); } @@ -201,6 +212,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.AFTER_SALE_DATE)); return false; } + else if ((item.getAccountDailyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0)) > item.getAccountDailyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } + else if ((item.getAccountBuyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0)) > item.getAccountBuyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } if ((item.getVipTier() > player.getVipTier()) || (item.isVipGift() && !canReceiveGift(player, item))) { @@ -250,8 +271,7 @@ public class RequestBRBuyProduct implements IClientIncomingPacket } else { - long timeBought = player.getAccountVariables().getLong(AccountVariables.VIP_ITEM_BOUGHT, 0L); - return timeBought <= 0; + return player.getAccountVariables().getLong(AccountVariables.VIP_ITEM_BOUGHT, 0) <= 0; } } diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java index 0f042ba043..609d459cc6 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java @@ -22,6 +22,7 @@ import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; @@ -64,15 +65,49 @@ public class ExBRProductList implements IClientOutgoingPacket packet.writeC(brItem.getStartMinute()); packet.writeC(brItem.getStopHour()); packet.writeC(brItem.getStopMinute()); - packet.writeD(brItem.getStock()); - packet.writeD(brItem.getTotal()); + + // Daily account limit. + if ((brItem.getAccountDailyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + brItem.getBrId(), 0) >= brItem.getAccountDailyLimit())) + { + packet.writeD(brItem.getAccountDailyLimit()); + packet.writeD(brItem.getAccountDailyLimit()); + } + // General account limit. + else if ((brItem.getAccountBuyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + brItem.getBrId(), 0) >= brItem.getAccountBuyLimit())) + { + packet.writeD(brItem.getAccountBuyLimit()); + packet.writeD(brItem.getAccountBuyLimit()); + } + else + { + packet.writeD(brItem.getStock()); + packet.writeD(brItem.getTotal()); + } + packet.writeC(brItem.getSalePercent()); packet.writeC(brItem.getMinLevel()); packet.writeC(brItem.getMaxLevel()); packet.writeD(brItem.getMinBirthday()); packet.writeD(brItem.getMaxBirthday()); - packet.writeD(brItem.getRestrictionDay()); - packet.writeD(brItem.getAvailableCount()); + + // Daily account limit. + if (brItem.getAccountDailyLimit() > 0) + { + packet.writeD(1); // Days + packet.writeD(brItem.getAccountDailyLimit()); // Amount + } + // General account limit. + else if (brItem.getAccountBuyLimit() > 0) + { + packet.writeD(-1); // Days + packet.writeD(brItem.getAccountBuyLimit()); // Amount + } + else + { + packet.writeD(0); // Days + packet.writeD(0); // Amount + } + packet.writeC(brItem.getItems().size()); for (PrimeShopItem item : brItem.getItems()) { diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/PrimeShop.xml b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/PrimeShop.xml index a887d51f61..168eb818dc 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/PrimeShop.xml +++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/PrimeShop.xml @@ -11,51 +11,51 @@ for the price to be used as golden or silver, vipTier needs to be > 0 --> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + \ No newline at end of file diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/xsd/PrimeShop.xsd b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/xsd/PrimeShop.xsd index 530eeae8ab..004ef069c3 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/xsd/PrimeShop.xsd +++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/xsd/PrimeShop.xsd @@ -32,8 +32,8 @@ - - + + diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java index 3b43ade755..c8d54b47ee 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java @@ -30,6 +30,7 @@ import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.data.sql.ClanTable; import org.l2jmobius.gameserver.data.xml.DailyMissionData; +import org.l2jmobius.gameserver.data.xml.PrimeShopData; import org.l2jmobius.gameserver.model.DailyMissionDataHolder; import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.actor.Player; @@ -38,6 +39,7 @@ import org.l2jmobius.gameserver.model.clan.Clan; import org.l2jmobius.gameserver.model.clan.ClanMember; import org.l2jmobius.gameserver.model.holders.SubClassHolder; import org.l2jmobius.gameserver.model.olympiad.Olympiad; +import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.model.vip.VipManager; @@ -110,6 +112,7 @@ public class DailyTaskManager // Daily tasks. resetClanBonus(); resetDailySkills(); + resetDailyPrimeShopData(); resetWorldChatPoints(); resetRecommends(); resetTrainingCamp(); @@ -417,6 +420,32 @@ public class DailyTaskManager } } + private void resetDailyPrimeShopData() + { + for (PrimeShopGroup holder : PrimeShopData.getInstance().getPrimeItems().values()) + { + // Update data for offline players. + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement ps = con.prepareStatement("DELETE FROM account_gsdata WHERE var=?")) + { + ps.setString(1, AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + ps.executeUpdate(); + } + catch (Exception e) + { + LOGGER.log(Level.SEVERE, getClass().getSimpleName() + ": Could not reset PrimeShopData: " + e); + } + + // Update data for online players. + for (Player player : World.getInstance().getPlayers()) + { + player.getVariables().remove(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + player.getAccountVariables().storeMe(); + } + } + LOGGER.info("PrimeShopData has been resetted."); + } + public static DailyTaskManager getInstance() { return SingletonHolder.INSTANCE; diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java index e9d87771f6..7812bc5c28 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java @@ -45,8 +45,8 @@ public class PrimeShopGroup private final int _maxLevel; private final int _minBirthday; private final int _maxBirthday; - private final int _restrictionDay; - private final int _availableCount; + private final int _accountDailyLimit; + private final int _accountBuyLimit; private final boolean _isVipGift; private final int _vipTier; private final int _silverCoin; @@ -74,8 +74,8 @@ public class PrimeShopGroup _maxLevel = set.getInt("maxLevel", 0); _minBirthday = set.getInt("minBirthday", 0); _maxBirthday = set.getInt("maxBirthday", 0); - _restrictionDay = set.getInt("restrictionDay", 0); - _availableCount = set.getInt("availableCount", 0); + _accountDailyLimit = set.getInt("accountDailyLimit", 0); + _accountBuyLimit = set.getInt("accountBuyLimit", 0); _isVipGift = set.getBoolean("isVipGift", false); _vipTier = set.getInt("vipTier", 0); _silverCoin = set.getInt("silverCoin", 0); @@ -193,14 +193,14 @@ public class PrimeShopGroup return _maxBirthday; } - public int getRestrictionDay() + public int getAccountDailyLimit() { - return _restrictionDay; + return _accountDailyLimit; } - public int getAvailableCount() + public int getAccountBuyLimit() { - return _availableCount; + return _accountBuyLimit; } public boolean isVipGift() diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java index 1e8c85d8fc..2c93f7ac59 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java @@ -42,6 +42,8 @@ public class AccountVariables extends AbstractVariables // Public variable names public static final String HWID = "HWID"; public static final String HWIDSLIT_VAR = " "; + public static final String PRIME_SHOP_PRODUCT_COUNT = "PSPCount"; + public static final String PRIME_SHOP_PRODUCT_DAILY_COUNT = "PSPDailyCount"; public static final String VIP_POINTS = "VipPoints"; public static final String VIP_TIER = "VipTier"; public static final String VIP_EXPIRATION = "VipExpiration"; diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java index 409c6e9d46..6091190154 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java @@ -138,6 +138,17 @@ public class RequestBRBuyProduct implements IClientIncomingPacket { player.getAccountVariables().set(AccountVariables.VIP_ITEM_BOUGHT, Calendar.getInstance().getTimeInMillis()); } + + // Update account variables. + if (item.getAccountDailyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + else if (item.getAccountBuyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SUCCESS)); player.sendPacket(new ExBRGamePoint(player)); } @@ -201,6 +212,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.AFTER_SALE_DATE)); return false; } + else if ((item.getAccountDailyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0)) > item.getAccountDailyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } + else if ((item.getAccountBuyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0)) > item.getAccountBuyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } if ((item.getVipTier() > player.getVipTier()) || (item.isVipGift() && !canReceiveGift(player, item))) { @@ -250,8 +271,7 @@ public class RequestBRBuyProduct implements IClientIncomingPacket } else { - long timeBought = player.getAccountVariables().getLong(AccountVariables.VIP_ITEM_BOUGHT, 0L); - return timeBought <= 0; + return player.getAccountVariables().getLong(AccountVariables.VIP_ITEM_BOUGHT, 0) <= 0; } } diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java index 0f042ba043..609d459cc6 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java @@ -22,6 +22,7 @@ import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; @@ -64,15 +65,49 @@ public class ExBRProductList implements IClientOutgoingPacket packet.writeC(brItem.getStartMinute()); packet.writeC(brItem.getStopHour()); packet.writeC(brItem.getStopMinute()); - packet.writeD(brItem.getStock()); - packet.writeD(brItem.getTotal()); + + // Daily account limit. + if ((brItem.getAccountDailyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + brItem.getBrId(), 0) >= brItem.getAccountDailyLimit())) + { + packet.writeD(brItem.getAccountDailyLimit()); + packet.writeD(brItem.getAccountDailyLimit()); + } + // General account limit. + else if ((brItem.getAccountBuyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + brItem.getBrId(), 0) >= brItem.getAccountBuyLimit())) + { + packet.writeD(brItem.getAccountBuyLimit()); + packet.writeD(brItem.getAccountBuyLimit()); + } + else + { + packet.writeD(brItem.getStock()); + packet.writeD(brItem.getTotal()); + } + packet.writeC(brItem.getSalePercent()); packet.writeC(brItem.getMinLevel()); packet.writeC(brItem.getMaxLevel()); packet.writeD(brItem.getMinBirthday()); packet.writeD(brItem.getMaxBirthday()); - packet.writeD(brItem.getRestrictionDay()); - packet.writeD(brItem.getAvailableCount()); + + // Daily account limit. + if (brItem.getAccountDailyLimit() > 0) + { + packet.writeD(1); // Days + packet.writeD(brItem.getAccountDailyLimit()); // Amount + } + // General account limit. + else if (brItem.getAccountBuyLimit() > 0) + { + packet.writeD(-1); // Days + packet.writeD(brItem.getAccountBuyLimit()); // Amount + } + else + { + packet.writeD(0); // Days + packet.writeD(0); // Amount + } + packet.writeC(brItem.getItems().size()); for (PrimeShopItem item : brItem.getItems()) { diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/PrimeShop.xml b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/PrimeShop.xml index a887d51f61..168eb818dc 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/PrimeShop.xml +++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/PrimeShop.xml @@ -11,51 +11,51 @@ for the price to be used as golden or silver, vipTier needs to be > 0 --> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + \ No newline at end of file diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/xsd/PrimeShop.xsd b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/xsd/PrimeShop.xsd index 530eeae8ab..004ef069c3 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/xsd/PrimeShop.xsd +++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/xsd/PrimeShop.xsd @@ -32,8 +32,8 @@ - - + + diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java index 3b43ade755..c8d54b47ee 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java @@ -30,6 +30,7 @@ import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.data.sql.ClanTable; import org.l2jmobius.gameserver.data.xml.DailyMissionData; +import org.l2jmobius.gameserver.data.xml.PrimeShopData; import org.l2jmobius.gameserver.model.DailyMissionDataHolder; import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.actor.Player; @@ -38,6 +39,7 @@ import org.l2jmobius.gameserver.model.clan.Clan; import org.l2jmobius.gameserver.model.clan.ClanMember; import org.l2jmobius.gameserver.model.holders.SubClassHolder; import org.l2jmobius.gameserver.model.olympiad.Olympiad; +import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.model.vip.VipManager; @@ -110,6 +112,7 @@ public class DailyTaskManager // Daily tasks. resetClanBonus(); resetDailySkills(); + resetDailyPrimeShopData(); resetWorldChatPoints(); resetRecommends(); resetTrainingCamp(); @@ -417,6 +420,32 @@ public class DailyTaskManager } } + private void resetDailyPrimeShopData() + { + for (PrimeShopGroup holder : PrimeShopData.getInstance().getPrimeItems().values()) + { + // Update data for offline players. + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement ps = con.prepareStatement("DELETE FROM account_gsdata WHERE var=?")) + { + ps.setString(1, AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + ps.executeUpdate(); + } + catch (Exception e) + { + LOGGER.log(Level.SEVERE, getClass().getSimpleName() + ": Could not reset PrimeShopData: " + e); + } + + // Update data for online players. + for (Player player : World.getInstance().getPlayers()) + { + player.getVariables().remove(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + player.getAccountVariables().storeMe(); + } + } + LOGGER.info("PrimeShopData has been resetted."); + } + public static DailyTaskManager getInstance() { return SingletonHolder.INSTANCE; diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java index e9d87771f6..7812bc5c28 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java @@ -45,8 +45,8 @@ public class PrimeShopGroup private final int _maxLevel; private final int _minBirthday; private final int _maxBirthday; - private final int _restrictionDay; - private final int _availableCount; + private final int _accountDailyLimit; + private final int _accountBuyLimit; private final boolean _isVipGift; private final int _vipTier; private final int _silverCoin; @@ -74,8 +74,8 @@ public class PrimeShopGroup _maxLevel = set.getInt("maxLevel", 0); _minBirthday = set.getInt("minBirthday", 0); _maxBirthday = set.getInt("maxBirthday", 0); - _restrictionDay = set.getInt("restrictionDay", 0); - _availableCount = set.getInt("availableCount", 0); + _accountDailyLimit = set.getInt("accountDailyLimit", 0); + _accountBuyLimit = set.getInt("accountBuyLimit", 0); _isVipGift = set.getBoolean("isVipGift", false); _vipTier = set.getInt("vipTier", 0); _silverCoin = set.getInt("silverCoin", 0); @@ -193,14 +193,14 @@ public class PrimeShopGroup return _maxBirthday; } - public int getRestrictionDay() + public int getAccountDailyLimit() { - return _restrictionDay; + return _accountDailyLimit; } - public int getAvailableCount() + public int getAccountBuyLimit() { - return _availableCount; + return _accountBuyLimit; } public boolean isVipGift() diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java index 1e8c85d8fc..2c93f7ac59 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java @@ -42,6 +42,8 @@ public class AccountVariables extends AbstractVariables // Public variable names public static final String HWID = "HWID"; public static final String HWIDSLIT_VAR = " "; + public static final String PRIME_SHOP_PRODUCT_COUNT = "PSPCount"; + public static final String PRIME_SHOP_PRODUCT_DAILY_COUNT = "PSPDailyCount"; public static final String VIP_POINTS = "VipPoints"; public static final String VIP_TIER = "VipTier"; public static final String VIP_EXPIRATION = "VipExpiration"; diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java index 409c6e9d46..6091190154 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java @@ -138,6 +138,17 @@ public class RequestBRBuyProduct implements IClientIncomingPacket { player.getAccountVariables().set(AccountVariables.VIP_ITEM_BOUGHT, Calendar.getInstance().getTimeInMillis()); } + + // Update account variables. + if (item.getAccountDailyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + else if (item.getAccountBuyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SUCCESS)); player.sendPacket(new ExBRGamePoint(player)); } @@ -201,6 +212,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.AFTER_SALE_DATE)); return false; } + else if ((item.getAccountDailyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0)) > item.getAccountDailyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } + else if ((item.getAccountBuyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0)) > item.getAccountBuyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } if ((item.getVipTier() > player.getVipTier()) || (item.isVipGift() && !canReceiveGift(player, item))) { @@ -250,8 +271,7 @@ public class RequestBRBuyProduct implements IClientIncomingPacket } else { - long timeBought = player.getAccountVariables().getLong(AccountVariables.VIP_ITEM_BOUGHT, 0L); - return timeBought <= 0; + return player.getAccountVariables().getLong(AccountVariables.VIP_ITEM_BOUGHT, 0) <= 0; } } diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java index 0f042ba043..609d459cc6 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java @@ -22,6 +22,7 @@ import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; @@ -64,15 +65,49 @@ public class ExBRProductList implements IClientOutgoingPacket packet.writeC(brItem.getStartMinute()); packet.writeC(brItem.getStopHour()); packet.writeC(brItem.getStopMinute()); - packet.writeD(brItem.getStock()); - packet.writeD(brItem.getTotal()); + + // Daily account limit. + if ((brItem.getAccountDailyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + brItem.getBrId(), 0) >= brItem.getAccountDailyLimit())) + { + packet.writeD(brItem.getAccountDailyLimit()); + packet.writeD(brItem.getAccountDailyLimit()); + } + // General account limit. + else if ((brItem.getAccountBuyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + brItem.getBrId(), 0) >= brItem.getAccountBuyLimit())) + { + packet.writeD(brItem.getAccountBuyLimit()); + packet.writeD(brItem.getAccountBuyLimit()); + } + else + { + packet.writeD(brItem.getStock()); + packet.writeD(brItem.getTotal()); + } + packet.writeC(brItem.getSalePercent()); packet.writeC(brItem.getMinLevel()); packet.writeC(brItem.getMaxLevel()); packet.writeD(brItem.getMinBirthday()); packet.writeD(brItem.getMaxBirthday()); - packet.writeD(brItem.getRestrictionDay()); - packet.writeD(brItem.getAvailableCount()); + + // Daily account limit. + if (brItem.getAccountDailyLimit() > 0) + { + packet.writeD(1); // Days + packet.writeD(brItem.getAccountDailyLimit()); // Amount + } + // General account limit. + else if (brItem.getAccountBuyLimit() > 0) + { + packet.writeD(-1); // Days + packet.writeD(brItem.getAccountBuyLimit()); // Amount + } + else + { + packet.writeD(0); // Days + packet.writeD(0); // Amount + } + packet.writeC(brItem.getItems().size()); for (PrimeShopItem item : brItem.getItems()) { diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/PrimeShop.xml b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/PrimeShop.xml index a887d51f61..168eb818dc 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/PrimeShop.xml +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/PrimeShop.xml @@ -11,51 +11,51 @@ for the price to be used as golden or silver, vipTier needs to be > 0 --> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + \ No newline at end of file diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/xsd/PrimeShop.xsd b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/xsd/PrimeShop.xsd index 530eeae8ab..004ef069c3 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/xsd/PrimeShop.xsd +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/xsd/PrimeShop.xsd @@ -32,8 +32,8 @@ - - + + diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java index 3b43ade755..c8d54b47ee 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java @@ -30,6 +30,7 @@ import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.data.sql.ClanTable; import org.l2jmobius.gameserver.data.xml.DailyMissionData; +import org.l2jmobius.gameserver.data.xml.PrimeShopData; import org.l2jmobius.gameserver.model.DailyMissionDataHolder; import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.actor.Player; @@ -38,6 +39,7 @@ import org.l2jmobius.gameserver.model.clan.Clan; import org.l2jmobius.gameserver.model.clan.ClanMember; import org.l2jmobius.gameserver.model.holders.SubClassHolder; import org.l2jmobius.gameserver.model.olympiad.Olympiad; +import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.model.vip.VipManager; @@ -110,6 +112,7 @@ public class DailyTaskManager // Daily tasks. resetClanBonus(); resetDailySkills(); + resetDailyPrimeShopData(); resetWorldChatPoints(); resetRecommends(); resetTrainingCamp(); @@ -417,6 +420,32 @@ public class DailyTaskManager } } + private void resetDailyPrimeShopData() + { + for (PrimeShopGroup holder : PrimeShopData.getInstance().getPrimeItems().values()) + { + // Update data for offline players. + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement ps = con.prepareStatement("DELETE FROM account_gsdata WHERE var=?")) + { + ps.setString(1, AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + ps.executeUpdate(); + } + catch (Exception e) + { + LOGGER.log(Level.SEVERE, getClass().getSimpleName() + ": Could not reset PrimeShopData: " + e); + } + + // Update data for online players. + for (Player player : World.getInstance().getPlayers()) + { + player.getVariables().remove(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + player.getAccountVariables().storeMe(); + } + } + LOGGER.info("PrimeShopData has been resetted."); + } + public static DailyTaskManager getInstance() { return SingletonHolder.INSTANCE; diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java index e9d87771f6..7812bc5c28 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java @@ -45,8 +45,8 @@ public class PrimeShopGroup private final int _maxLevel; private final int _minBirthday; private final int _maxBirthday; - private final int _restrictionDay; - private final int _availableCount; + private final int _accountDailyLimit; + private final int _accountBuyLimit; private final boolean _isVipGift; private final int _vipTier; private final int _silverCoin; @@ -74,8 +74,8 @@ public class PrimeShopGroup _maxLevel = set.getInt("maxLevel", 0); _minBirthday = set.getInt("minBirthday", 0); _maxBirthday = set.getInt("maxBirthday", 0); - _restrictionDay = set.getInt("restrictionDay", 0); - _availableCount = set.getInt("availableCount", 0); + _accountDailyLimit = set.getInt("accountDailyLimit", 0); + _accountBuyLimit = set.getInt("accountBuyLimit", 0); _isVipGift = set.getBoolean("isVipGift", false); _vipTier = set.getInt("vipTier", 0); _silverCoin = set.getInt("silverCoin", 0); @@ -193,14 +193,14 @@ public class PrimeShopGroup return _maxBirthday; } - public int getRestrictionDay() + public int getAccountDailyLimit() { - return _restrictionDay; + return _accountDailyLimit; } - public int getAvailableCount() + public int getAccountBuyLimit() { - return _availableCount; + return _accountBuyLimit; } public boolean isVipGift() diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java index 1e8c85d8fc..2c93f7ac59 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java @@ -42,6 +42,8 @@ public class AccountVariables extends AbstractVariables // Public variable names public static final String HWID = "HWID"; public static final String HWIDSLIT_VAR = " "; + public static final String PRIME_SHOP_PRODUCT_COUNT = "PSPCount"; + public static final String PRIME_SHOP_PRODUCT_DAILY_COUNT = "PSPDailyCount"; public static final String VIP_POINTS = "VipPoints"; public static final String VIP_TIER = "VipTier"; public static final String VIP_EXPIRATION = "VipExpiration"; diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java index 409c6e9d46..6091190154 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java @@ -138,6 +138,17 @@ public class RequestBRBuyProduct implements IClientIncomingPacket { player.getAccountVariables().set(AccountVariables.VIP_ITEM_BOUGHT, Calendar.getInstance().getTimeInMillis()); } + + // Update account variables. + if (item.getAccountDailyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + else if (item.getAccountBuyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SUCCESS)); player.sendPacket(new ExBRGamePoint(player)); } @@ -201,6 +212,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.AFTER_SALE_DATE)); return false; } + else if ((item.getAccountDailyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0)) > item.getAccountDailyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } + else if ((item.getAccountBuyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0)) > item.getAccountBuyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } if ((item.getVipTier() > player.getVipTier()) || (item.isVipGift() && !canReceiveGift(player, item))) { @@ -250,8 +271,7 @@ public class RequestBRBuyProduct implements IClientIncomingPacket } else { - long timeBought = player.getAccountVariables().getLong(AccountVariables.VIP_ITEM_BOUGHT, 0L); - return timeBought <= 0; + return player.getAccountVariables().getLong(AccountVariables.VIP_ITEM_BOUGHT, 0) <= 0; } } diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java index 0f042ba043..609d459cc6 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java @@ -22,6 +22,7 @@ import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; @@ -64,15 +65,49 @@ public class ExBRProductList implements IClientOutgoingPacket packet.writeC(brItem.getStartMinute()); packet.writeC(brItem.getStopHour()); packet.writeC(brItem.getStopMinute()); - packet.writeD(brItem.getStock()); - packet.writeD(brItem.getTotal()); + + // Daily account limit. + if ((brItem.getAccountDailyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + brItem.getBrId(), 0) >= brItem.getAccountDailyLimit())) + { + packet.writeD(brItem.getAccountDailyLimit()); + packet.writeD(brItem.getAccountDailyLimit()); + } + // General account limit. + else if ((brItem.getAccountBuyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + brItem.getBrId(), 0) >= brItem.getAccountBuyLimit())) + { + packet.writeD(brItem.getAccountBuyLimit()); + packet.writeD(brItem.getAccountBuyLimit()); + } + else + { + packet.writeD(brItem.getStock()); + packet.writeD(brItem.getTotal()); + } + packet.writeC(brItem.getSalePercent()); packet.writeC(brItem.getMinLevel()); packet.writeC(brItem.getMaxLevel()); packet.writeD(brItem.getMinBirthday()); packet.writeD(brItem.getMaxBirthday()); - packet.writeD(brItem.getRestrictionDay()); - packet.writeD(brItem.getAvailableCount()); + + // Daily account limit. + if (brItem.getAccountDailyLimit() > 0) + { + packet.writeD(1); // Days + packet.writeD(brItem.getAccountDailyLimit()); // Amount + } + // General account limit. + else if (brItem.getAccountBuyLimit() > 0) + { + packet.writeD(-1); // Days + packet.writeD(brItem.getAccountBuyLimit()); // Amount + } + else + { + packet.writeD(0); // Days + packet.writeD(0); // Amount + } + packet.writeC(brItem.getItems().size()); for (PrimeShopItem item : brItem.getItems()) { diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/PrimeShop.xml b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/PrimeShop.xml index a887d51f61..168eb818dc 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/PrimeShop.xml +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/PrimeShop.xml @@ -11,51 +11,51 @@ for the price to be used as golden or silver, vipTier needs to be > 0 --> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + \ No newline at end of file diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/xsd/PrimeShop.xsd b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/xsd/PrimeShop.xsd index 530eeae8ab..004ef069c3 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/xsd/PrimeShop.xsd +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/xsd/PrimeShop.xsd @@ -32,8 +32,8 @@ - - + + diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java index 3b43ade755..c8d54b47ee 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java @@ -30,6 +30,7 @@ import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.data.sql.ClanTable; import org.l2jmobius.gameserver.data.xml.DailyMissionData; +import org.l2jmobius.gameserver.data.xml.PrimeShopData; import org.l2jmobius.gameserver.model.DailyMissionDataHolder; import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.actor.Player; @@ -38,6 +39,7 @@ import org.l2jmobius.gameserver.model.clan.Clan; import org.l2jmobius.gameserver.model.clan.ClanMember; import org.l2jmobius.gameserver.model.holders.SubClassHolder; import org.l2jmobius.gameserver.model.olympiad.Olympiad; +import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.model.vip.VipManager; @@ -110,6 +112,7 @@ public class DailyTaskManager // Daily tasks. resetClanBonus(); resetDailySkills(); + resetDailyPrimeShopData(); resetWorldChatPoints(); resetRecommends(); resetTrainingCamp(); @@ -417,6 +420,32 @@ public class DailyTaskManager } } + private void resetDailyPrimeShopData() + { + for (PrimeShopGroup holder : PrimeShopData.getInstance().getPrimeItems().values()) + { + // Update data for offline players. + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement ps = con.prepareStatement("DELETE FROM account_gsdata WHERE var=?")) + { + ps.setString(1, AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + ps.executeUpdate(); + } + catch (Exception e) + { + LOGGER.log(Level.SEVERE, getClass().getSimpleName() + ": Could not reset PrimeShopData: " + e); + } + + // Update data for online players. + for (Player player : World.getInstance().getPlayers()) + { + player.getVariables().remove(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + player.getAccountVariables().storeMe(); + } + } + LOGGER.info("PrimeShopData has been resetted."); + } + public static DailyTaskManager getInstance() { return SingletonHolder.INSTANCE; diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java index e9d87771f6..7812bc5c28 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java @@ -45,8 +45,8 @@ public class PrimeShopGroup private final int _maxLevel; private final int _minBirthday; private final int _maxBirthday; - private final int _restrictionDay; - private final int _availableCount; + private final int _accountDailyLimit; + private final int _accountBuyLimit; private final boolean _isVipGift; private final int _vipTier; private final int _silverCoin; @@ -74,8 +74,8 @@ public class PrimeShopGroup _maxLevel = set.getInt("maxLevel", 0); _minBirthday = set.getInt("minBirthday", 0); _maxBirthday = set.getInt("maxBirthday", 0); - _restrictionDay = set.getInt("restrictionDay", 0); - _availableCount = set.getInt("availableCount", 0); + _accountDailyLimit = set.getInt("accountDailyLimit", 0); + _accountBuyLimit = set.getInt("accountBuyLimit", 0); _isVipGift = set.getBoolean("isVipGift", false); _vipTier = set.getInt("vipTier", 0); _silverCoin = set.getInt("silverCoin", 0); @@ -193,14 +193,14 @@ public class PrimeShopGroup return _maxBirthday; } - public int getRestrictionDay() + public int getAccountDailyLimit() { - return _restrictionDay; + return _accountDailyLimit; } - public int getAvailableCount() + public int getAccountBuyLimit() { - return _availableCount; + return _accountBuyLimit; } public boolean isVipGift() diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java index 1e8c85d8fc..2c93f7ac59 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java @@ -42,6 +42,8 @@ public class AccountVariables extends AbstractVariables // Public variable names public static final String HWID = "HWID"; public static final String HWIDSLIT_VAR = " "; + public static final String PRIME_SHOP_PRODUCT_COUNT = "PSPCount"; + public static final String PRIME_SHOP_PRODUCT_DAILY_COUNT = "PSPDailyCount"; public static final String VIP_POINTS = "VipPoints"; public static final String VIP_TIER = "VipTier"; public static final String VIP_EXPIRATION = "VipExpiration"; diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java index 409c6e9d46..6091190154 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java @@ -138,6 +138,17 @@ public class RequestBRBuyProduct implements IClientIncomingPacket { player.getAccountVariables().set(AccountVariables.VIP_ITEM_BOUGHT, Calendar.getInstance().getTimeInMillis()); } + + // Update account variables. + if (item.getAccountDailyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + else if (item.getAccountBuyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SUCCESS)); player.sendPacket(new ExBRGamePoint(player)); } @@ -201,6 +212,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.AFTER_SALE_DATE)); return false; } + else if ((item.getAccountDailyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0)) > item.getAccountDailyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } + else if ((item.getAccountBuyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0)) > item.getAccountBuyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } if ((item.getVipTier() > player.getVipTier()) || (item.isVipGift() && !canReceiveGift(player, item))) { @@ -250,8 +271,7 @@ public class RequestBRBuyProduct implements IClientIncomingPacket } else { - long timeBought = player.getAccountVariables().getLong(AccountVariables.VIP_ITEM_BOUGHT, 0L); - return timeBought <= 0; + return player.getAccountVariables().getLong(AccountVariables.VIP_ITEM_BOUGHT, 0) <= 0; } } diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java index 0f042ba043..609d459cc6 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java @@ -22,6 +22,7 @@ import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; @@ -64,15 +65,49 @@ public class ExBRProductList implements IClientOutgoingPacket packet.writeC(brItem.getStartMinute()); packet.writeC(brItem.getStopHour()); packet.writeC(brItem.getStopMinute()); - packet.writeD(brItem.getStock()); - packet.writeD(brItem.getTotal()); + + // Daily account limit. + if ((brItem.getAccountDailyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + brItem.getBrId(), 0) >= brItem.getAccountDailyLimit())) + { + packet.writeD(brItem.getAccountDailyLimit()); + packet.writeD(brItem.getAccountDailyLimit()); + } + // General account limit. + else if ((brItem.getAccountBuyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + brItem.getBrId(), 0) >= brItem.getAccountBuyLimit())) + { + packet.writeD(brItem.getAccountBuyLimit()); + packet.writeD(brItem.getAccountBuyLimit()); + } + else + { + packet.writeD(brItem.getStock()); + packet.writeD(brItem.getTotal()); + } + packet.writeC(brItem.getSalePercent()); packet.writeC(brItem.getMinLevel()); packet.writeC(brItem.getMaxLevel()); packet.writeD(brItem.getMinBirthday()); packet.writeD(brItem.getMaxBirthday()); - packet.writeD(brItem.getRestrictionDay()); - packet.writeD(brItem.getAvailableCount()); + + // Daily account limit. + if (brItem.getAccountDailyLimit() > 0) + { + packet.writeD(1); // Days + packet.writeD(brItem.getAccountDailyLimit()); // Amount + } + // General account limit. + else if (brItem.getAccountBuyLimit() > 0) + { + packet.writeD(-1); // Days + packet.writeD(brItem.getAccountBuyLimit()); // Amount + } + else + { + packet.writeD(0); // Days + packet.writeD(0); // Amount + } + packet.writeC(brItem.getItems().size()); for (PrimeShopItem item : brItem.getItems()) { diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/PrimeShop.xml b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/PrimeShop.xml index 091eab60af..8f40495d33 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/PrimeShop.xml +++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/PrimeShop.xml @@ -11,63 +11,63 @@ for the price to be used as golden or silver, vipTier needs to be > 0 --> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + \ No newline at end of file diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/xsd/PrimeShop.xsd b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/xsd/PrimeShop.xsd index 530eeae8ab..004ef069c3 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/xsd/PrimeShop.xsd +++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/xsd/PrimeShop.xsd @@ -32,8 +32,8 @@ - - + + diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java index 311666d314..b5bc13b2d1 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java @@ -30,6 +30,7 @@ import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.data.sql.ClanTable; import org.l2jmobius.gameserver.data.xml.DailyMissionData; +import org.l2jmobius.gameserver.data.xml.PrimeShopData; import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData; import org.l2jmobius.gameserver.model.DailyMissionDataHolder; import org.l2jmobius.gameserver.model.World; @@ -40,6 +41,7 @@ import org.l2jmobius.gameserver.model.clan.ClanMember; import org.l2jmobius.gameserver.model.holders.SubClassHolder; import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder; import org.l2jmobius.gameserver.model.olympiad.Olympiad; +import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.model.vip.VipManager; @@ -113,6 +115,7 @@ public class DailyTaskManager // Daily tasks. resetClanBonus(); resetDailySkills(); + resetDailyPrimeShopData(); resetWorldChatPoints(); resetRecommends(); resetTrainingCamp(); @@ -493,6 +496,32 @@ public class DailyTaskManager } } + private void resetDailyPrimeShopData() + { + for (PrimeShopGroup holder : PrimeShopData.getInstance().getPrimeItems().values()) + { + // Update data for offline players. + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement ps = con.prepareStatement("DELETE FROM account_gsdata WHERE var=?")) + { + ps.setString(1, AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + ps.executeUpdate(); + } + catch (Exception e) + { + LOGGER.log(Level.SEVERE, getClass().getSimpleName() + ": Could not reset PrimeShopData: " + e); + } + + // Update data for online players. + for (Player player : World.getInstance().getPlayers()) + { + player.getVariables().remove(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + player.getAccountVariables().storeMe(); + } + } + LOGGER.info("PrimeShopData has been resetted."); + } + public static DailyTaskManager getInstance() { return SingletonHolder.INSTANCE; diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java index e9d87771f6..7812bc5c28 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java @@ -45,8 +45,8 @@ public class PrimeShopGroup private final int _maxLevel; private final int _minBirthday; private final int _maxBirthday; - private final int _restrictionDay; - private final int _availableCount; + private final int _accountDailyLimit; + private final int _accountBuyLimit; private final boolean _isVipGift; private final int _vipTier; private final int _silverCoin; @@ -74,8 +74,8 @@ public class PrimeShopGroup _maxLevel = set.getInt("maxLevel", 0); _minBirthday = set.getInt("minBirthday", 0); _maxBirthday = set.getInt("maxBirthday", 0); - _restrictionDay = set.getInt("restrictionDay", 0); - _availableCount = set.getInt("availableCount", 0); + _accountDailyLimit = set.getInt("accountDailyLimit", 0); + _accountBuyLimit = set.getInt("accountBuyLimit", 0); _isVipGift = set.getBoolean("isVipGift", false); _vipTier = set.getInt("vipTier", 0); _silverCoin = set.getInt("silverCoin", 0); @@ -193,14 +193,14 @@ public class PrimeShopGroup return _maxBirthday; } - public int getRestrictionDay() + public int getAccountDailyLimit() { - return _restrictionDay; + return _accountDailyLimit; } - public int getAvailableCount() + public int getAccountBuyLimit() { - return _availableCount; + return _accountBuyLimit; } public boolean isVipGift() diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java index 1e8c85d8fc..2c93f7ac59 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java @@ -42,6 +42,8 @@ public class AccountVariables extends AbstractVariables // Public variable names public static final String HWID = "HWID"; public static final String HWIDSLIT_VAR = " "; + public static final String PRIME_SHOP_PRODUCT_COUNT = "PSPCount"; + public static final String PRIME_SHOP_PRODUCT_DAILY_COUNT = "PSPDailyCount"; public static final String VIP_POINTS = "VipPoints"; public static final String VIP_TIER = "VipTier"; public static final String VIP_EXPIRATION = "VipExpiration"; diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java index 409c6e9d46..6091190154 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java @@ -138,6 +138,17 @@ public class RequestBRBuyProduct implements IClientIncomingPacket { player.getAccountVariables().set(AccountVariables.VIP_ITEM_BOUGHT, Calendar.getInstance().getTimeInMillis()); } + + // Update account variables. + if (item.getAccountDailyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + else if (item.getAccountBuyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SUCCESS)); player.sendPacket(new ExBRGamePoint(player)); } @@ -201,6 +212,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.AFTER_SALE_DATE)); return false; } + else if ((item.getAccountDailyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0)) > item.getAccountDailyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } + else if ((item.getAccountBuyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0)) > item.getAccountBuyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } if ((item.getVipTier() > player.getVipTier()) || (item.isVipGift() && !canReceiveGift(player, item))) { @@ -250,8 +271,7 @@ public class RequestBRBuyProduct implements IClientIncomingPacket } else { - long timeBought = player.getAccountVariables().getLong(AccountVariables.VIP_ITEM_BOUGHT, 0L); - return timeBought <= 0; + return player.getAccountVariables().getLong(AccountVariables.VIP_ITEM_BOUGHT, 0) <= 0; } } diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java index 0f042ba043..609d459cc6 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java @@ -22,6 +22,7 @@ import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; @@ -64,15 +65,49 @@ public class ExBRProductList implements IClientOutgoingPacket packet.writeC(brItem.getStartMinute()); packet.writeC(brItem.getStopHour()); packet.writeC(brItem.getStopMinute()); - packet.writeD(brItem.getStock()); - packet.writeD(brItem.getTotal()); + + // Daily account limit. + if ((brItem.getAccountDailyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + brItem.getBrId(), 0) >= brItem.getAccountDailyLimit())) + { + packet.writeD(brItem.getAccountDailyLimit()); + packet.writeD(brItem.getAccountDailyLimit()); + } + // General account limit. + else if ((brItem.getAccountBuyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + brItem.getBrId(), 0) >= brItem.getAccountBuyLimit())) + { + packet.writeD(brItem.getAccountBuyLimit()); + packet.writeD(brItem.getAccountBuyLimit()); + } + else + { + packet.writeD(brItem.getStock()); + packet.writeD(brItem.getTotal()); + } + packet.writeC(brItem.getSalePercent()); packet.writeC(brItem.getMinLevel()); packet.writeC(brItem.getMaxLevel()); packet.writeD(brItem.getMinBirthday()); packet.writeD(brItem.getMaxBirthday()); - packet.writeD(brItem.getRestrictionDay()); - packet.writeD(brItem.getAvailableCount()); + + // Daily account limit. + if (brItem.getAccountDailyLimit() > 0) + { + packet.writeD(1); // Days + packet.writeD(brItem.getAccountDailyLimit()); // Amount + } + // General account limit. + else if (brItem.getAccountBuyLimit() > 0) + { + packet.writeD(-1); // Days + packet.writeD(brItem.getAccountBuyLimit()); // Amount + } + else + { + packet.writeD(0); // Days + packet.writeD(0); // Amount + } + packet.writeC(brItem.getItems().size()); for (PrimeShopItem item : brItem.getItems()) { diff --git a/L2J_Mobius_Classic_Interlude/dist/game/data/xsd/PrimeShop.xsd b/L2J_Mobius_Classic_Interlude/dist/game/data/xsd/PrimeShop.xsd index 44a4e34fbe..32fdb15a3f 100644 --- a/L2J_Mobius_Classic_Interlude/dist/game/data/xsd/PrimeShop.xsd +++ b/L2J_Mobius_Classic_Interlude/dist/game/data/xsd/PrimeShop.xsd @@ -32,8 +32,8 @@ - - + + diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java index aaa91fbb17..6779359988 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java @@ -30,6 +30,7 @@ import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.data.sql.ClanTable; import org.l2jmobius.gameserver.data.xml.DailyMissionData; +import org.l2jmobius.gameserver.data.xml.PrimeShopData; import org.l2jmobius.gameserver.model.DailyMissionDataHolder; import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.actor.Player; @@ -38,6 +39,8 @@ import org.l2jmobius.gameserver.model.clan.Clan; import org.l2jmobius.gameserver.model.clan.ClanMember; import org.l2jmobius.gameserver.model.holders.SubClassHolder; import org.l2jmobius.gameserver.model.olympiad.Olympiad; +import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.network.serverpackets.ExVoteSystemInfo; import org.l2jmobius.gameserver.network.serverpackets.ExWorldChatCnt; @@ -109,6 +112,7 @@ public class DailyTaskManager resetClanBonus(); resetDailySkills(); resetWorldChatPoints(); + resetDailyPrimeShopData(); resetRecommends(); resetTrainingCamp(); resetDailyMissionRewards(); @@ -396,6 +400,32 @@ public class DailyTaskManager } } + private void resetDailyPrimeShopData() + { + for (PrimeShopGroup holder : PrimeShopData.getInstance().getPrimeItems().values()) + { + // Update data for offline players. + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement ps = con.prepareStatement("DELETE FROM account_gsdata WHERE var=?")) + { + ps.setString(1, AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + ps.executeUpdate(); + } + catch (Exception e) + { + LOGGER.log(Level.SEVERE, getClass().getSimpleName() + ": Could not reset PrimeShopData: " + e); + } + + // Update data for online players. + for (Player player : World.getInstance().getPlayers()) + { + player.getVariables().remove(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + player.getAccountVariables().storeMe(); + } + } + LOGGER.info("PrimeShopData has been resetted."); + } + public static DailyTaskManager getInstance() { return SingletonHolder.INSTANCE; diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java index d1efd49454..dbd25eac74 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java @@ -45,8 +45,8 @@ public class PrimeShopGroup private final int _maxLevel; private final int _minBirthday; private final int _maxBirthday; - private final int _restrictionDay; - private final int _availableCount; + private final int _accountDailyLimit; + private final int _accountBuyLimit; private final List _items; public PrimeShopGroup(StatSet set, List items) @@ -71,8 +71,8 @@ public class PrimeShopGroup _maxLevel = set.getInt("maxLevel", 0); _minBirthday = set.getInt("minBirthday", 0); _maxBirthday = set.getInt("maxBirthday", 0); - _restrictionDay = set.getInt("restrictionDay", 0); - _availableCount = set.getInt("availableCount", 0); + _accountDailyLimit = set.getInt("accountDailyLimit", 0); + _accountBuyLimit = set.getInt("accountBuyLimit", 0); _items = items; } @@ -186,14 +186,14 @@ public class PrimeShopGroup return _maxBirthday; } - public int getRestrictionDay() + public int getAccountDailyLimit() { - return _restrictionDay; + return _accountDailyLimit; } - public int getAvailableCount() + public int getAccountBuyLimit() { - return _availableCount; + return _accountBuyLimit; } public List getItems() diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java index dbce4c8eea..a2ff71995d 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java @@ -41,6 +41,8 @@ public class AccountVariables extends AbstractVariables // Public variable names public static final String HWID = "HWID"; public static final String HWIDSLIT_VAR = " "; + public static final String PRIME_SHOP_PRODUCT_COUNT = "PSPCount"; + public static final String PRIME_SHOP_PRODUCT_DAILY_COUNT = "PSPDailyCount"; private final String _accountName; diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java index 03540f5789..9669e6cd19 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java @@ -28,6 +28,7 @@ import org.l2jmobius.gameserver.model.actor.request.PrimeShopRequest; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; import org.l2jmobius.gameserver.network.serverpackets.primeshop.ExBRBuyProduct; @@ -105,6 +106,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.addItem("PrimeShop", subItem.getId(), subItem.getCount() * _count, player, true); } + // Update account variables. + if (item.getAccountDailyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + else if (item.getAccountBuyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SUCCESS)); player.sendPacket(new ExBRGamePoint(player)); } @@ -168,6 +179,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.AFTER_SALE_DATE)); return false; } + else if ((item.getAccountDailyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0)) > item.getAccountDailyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } + else if ((item.getAccountBuyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0)) > item.getAccountBuyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } final int weight = item.getWeight() * count; final long slots = item.getCount() * count; diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java index 0f042ba043..609d459cc6 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java @@ -22,6 +22,7 @@ import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; @@ -64,15 +65,49 @@ public class ExBRProductList implements IClientOutgoingPacket packet.writeC(brItem.getStartMinute()); packet.writeC(brItem.getStopHour()); packet.writeC(brItem.getStopMinute()); - packet.writeD(brItem.getStock()); - packet.writeD(brItem.getTotal()); + + // Daily account limit. + if ((brItem.getAccountDailyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + brItem.getBrId(), 0) >= brItem.getAccountDailyLimit())) + { + packet.writeD(brItem.getAccountDailyLimit()); + packet.writeD(brItem.getAccountDailyLimit()); + } + // General account limit. + else if ((brItem.getAccountBuyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + brItem.getBrId(), 0) >= brItem.getAccountBuyLimit())) + { + packet.writeD(brItem.getAccountBuyLimit()); + packet.writeD(brItem.getAccountBuyLimit()); + } + else + { + packet.writeD(brItem.getStock()); + packet.writeD(brItem.getTotal()); + } + packet.writeC(brItem.getSalePercent()); packet.writeC(brItem.getMinLevel()); packet.writeC(brItem.getMaxLevel()); packet.writeD(brItem.getMinBirthday()); packet.writeD(brItem.getMaxBirthday()); - packet.writeD(brItem.getRestrictionDay()); - packet.writeD(brItem.getAvailableCount()); + + // Daily account limit. + if (brItem.getAccountDailyLimit() > 0) + { + packet.writeD(1); // Days + packet.writeD(brItem.getAccountDailyLimit()); // Amount + } + // General account limit. + else if (brItem.getAccountBuyLimit() > 0) + { + packet.writeD(-1); // Days + packet.writeD(brItem.getAccountBuyLimit()); // Amount + } + else + { + packet.writeD(0); // Days + packet.writeD(0); // Amount + } + packet.writeC(brItem.getItems().size()); for (PrimeShopItem item : brItem.getItems()) { diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/PrimeShop.xml b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/PrimeShop.xml index 139ea16ec8..77ee2e926b 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/PrimeShop.xml +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/PrimeShop.xml @@ -9,65 +9,65 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + \ No newline at end of file diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/xsd/PrimeShop.xsd b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/xsd/PrimeShop.xsd index 8556f5ed3f..fcf4df3a96 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/xsd/PrimeShop.xsd +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/xsd/PrimeShop.xsd @@ -32,8 +32,8 @@ - - + + diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java index 5f6f011c15..117a1286d3 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java @@ -31,6 +31,7 @@ import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.data.sql.ClanTable; import org.l2jmobius.gameserver.data.xml.DailyMissionData; import org.l2jmobius.gameserver.data.xml.LimitShopData; +import org.l2jmobius.gameserver.data.xml.PrimeShopData; import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData; import org.l2jmobius.gameserver.model.DailyMissionDataHolder; import org.l2jmobius.gameserver.model.World; @@ -42,6 +43,7 @@ import org.l2jmobius.gameserver.model.holders.LimitShopProductHolder; import org.l2jmobius.gameserver.model.holders.SubClassHolder; import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder; import org.l2jmobius.gameserver.model.olympiad.Olympiad; +import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.model.vip.VipManager; @@ -116,6 +118,7 @@ public class DailyTaskManager // Daily tasks. resetClanBonus(); resetDailySkills(); + resetDailyPrimeShopData(); resetDailyLimitShopData(); resetWorldChatPoints(); resetRecommends(); @@ -505,6 +508,32 @@ public class DailyTaskManager } } + private void resetDailyPrimeShopData() + { + for (PrimeShopGroup holder : PrimeShopData.getInstance().getPrimeItems().values()) + { + // Update data for offline players. + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement ps = con.prepareStatement("DELETE FROM account_gsdata WHERE var=?")) + { + ps.setString(1, AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + ps.executeUpdate(); + } + catch (Exception e) + { + LOGGER.log(Level.SEVERE, getClass().getSimpleName() + ": Could not reset PrimeShopData: " + e); + } + + // Update data for online players. + for (Player player : World.getInstance().getPlayers()) + { + player.getVariables().remove(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + player.getAccountVariables().storeMe(); + } + } + LOGGER.info("PrimeShopData has been resetted."); + } + private void resetDailyLimitShopData() { for (LimitShopProductHolder holder : LimitShopData.getInstance().getProducts()) diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java index b41635fc4d..efd923d8b4 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java @@ -45,8 +45,8 @@ public class PrimeShopGroup private final int _maxLevel; private final int _minBirthday; private final int _maxBirthday; - private final int _restrictionDay; - private final int _availableCount; + private final int _accountDailyLimit; + private final int _accountBuyLimit; private final boolean _isVipGift; private final int _vipTier; private final List _items; @@ -73,8 +73,8 @@ public class PrimeShopGroup _maxLevel = set.getInt("maxLevel", 0); _minBirthday = set.getInt("minBirthday", 0); _maxBirthday = set.getInt("maxBirthday", 0); - _restrictionDay = set.getInt("restrictionDay", 0); - _availableCount = set.getInt("availableCount", 0); + _accountDailyLimit = set.getInt("accountDailyLimit", 0); + _accountBuyLimit = set.getInt("accountBuyLimit", 0); _isVipGift = set.getBoolean("isVipGift", false); _vipTier = set.getInt("vipTier", 0); @@ -191,14 +191,14 @@ public class PrimeShopGroup return _maxBirthday; } - public int getRestrictionDay() + public int getAccountDailyLimit() { - return _restrictionDay; + return _accountDailyLimit; } - public int getAvailableCount() + public int getAccountBuyLimit() { - return _availableCount; + return _accountBuyLimit; } public boolean isVipGift() diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java index db69e5334d..6e56897205 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java @@ -42,6 +42,8 @@ public class AccountVariables extends AbstractVariables // Public variable names public static final String HWID = "HWID"; public static final String HWIDSLIT_VAR = " "; + public static final String PRIME_SHOP_PRODUCT_COUNT = "PSPCount"; + public static final String PRIME_SHOP_PRODUCT_DAILY_COUNT = "PSPDailyCount"; public static final String LCOIN_SHOP_PRODUCT_COUNT = "LCSCount"; public static final String LCOIN_SHOP_PRODUCT_DAILY_COUNT = "LCSDailyCount"; public static final String VIP_POINTS = "VipPoints"; diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java index 3d9118244e..17a65db854 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java @@ -113,6 +113,17 @@ public class RequestBRBuyProduct implements IClientIncomingPacket { player.getAccountVariables().set(AccountVariables.VIP_ITEM_BOUGHT, Calendar.getInstance().getTimeInMillis()); } + + // Update account variables. + if (item.getAccountDailyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + else if (item.getAccountBuyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SUCCESS)); player.sendPacket(new ExBRGamePoint(player)); } @@ -176,6 +187,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.AFTER_SALE_DATE)); return false; } + else if ((item.getAccountDailyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0)) > item.getAccountDailyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } + else if ((item.getAccountBuyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0)) > item.getAccountBuyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } if ((item.getVipTier() > player.getVipTier()) || (item.isVipGift() && !canReceiveGift(player, item))) { @@ -225,8 +246,7 @@ public class RequestBRBuyProduct implements IClientIncomingPacket } else { - long timeBought = player.getAccountVariables().getLong(AccountVariables.VIP_ITEM_BOUGHT, 0L); - return timeBought <= 0; + return player.getAccountVariables().getLong(AccountVariables.VIP_ITEM_BOUGHT, 0) <= 0; } } diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java index 0f042ba043..609d459cc6 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java @@ -22,6 +22,7 @@ import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; @@ -64,15 +65,49 @@ public class ExBRProductList implements IClientOutgoingPacket packet.writeC(brItem.getStartMinute()); packet.writeC(brItem.getStopHour()); packet.writeC(brItem.getStopMinute()); - packet.writeD(brItem.getStock()); - packet.writeD(brItem.getTotal()); + + // Daily account limit. + if ((brItem.getAccountDailyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + brItem.getBrId(), 0) >= brItem.getAccountDailyLimit())) + { + packet.writeD(brItem.getAccountDailyLimit()); + packet.writeD(brItem.getAccountDailyLimit()); + } + // General account limit. + else if ((brItem.getAccountBuyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + brItem.getBrId(), 0) >= brItem.getAccountBuyLimit())) + { + packet.writeD(brItem.getAccountBuyLimit()); + packet.writeD(brItem.getAccountBuyLimit()); + } + else + { + packet.writeD(brItem.getStock()); + packet.writeD(brItem.getTotal()); + } + packet.writeC(brItem.getSalePercent()); packet.writeC(brItem.getMinLevel()); packet.writeC(brItem.getMaxLevel()); packet.writeD(brItem.getMinBirthday()); packet.writeD(brItem.getMaxBirthday()); - packet.writeD(brItem.getRestrictionDay()); - packet.writeD(brItem.getAvailableCount()); + + // Daily account limit. + if (brItem.getAccountDailyLimit() > 0) + { + packet.writeD(1); // Days + packet.writeD(brItem.getAccountDailyLimit()); // Amount + } + // General account limit. + else if (brItem.getAccountBuyLimit() > 0) + { + packet.writeD(-1); // Days + packet.writeD(brItem.getAccountBuyLimit()); // Amount + } + else + { + packet.writeD(0); // Days + packet.writeD(0); // Amount + } + packet.writeC(brItem.getItems().size()); for (PrimeShopItem item : brItem.getItems()) { diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/PrimeShop.xml b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/PrimeShop.xml index 139ea16ec8..77ee2e926b 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/PrimeShop.xml +++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/PrimeShop.xml @@ -9,65 +9,65 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + \ No newline at end of file diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/xsd/PrimeShop.xsd b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/xsd/PrimeShop.xsd index 8556f5ed3f..fcf4df3a96 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/xsd/PrimeShop.xsd +++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/xsd/PrimeShop.xsd @@ -32,8 +32,8 @@ - - + + diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java index 4451a890ea..775dff7767 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java @@ -31,6 +31,7 @@ import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.data.sql.ClanTable; import org.l2jmobius.gameserver.data.xml.DailyMissionData; import org.l2jmobius.gameserver.data.xml.LimitShopData; +import org.l2jmobius.gameserver.data.xml.PrimeShopData; import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData; import org.l2jmobius.gameserver.model.DailyMissionDataHolder; import org.l2jmobius.gameserver.model.World; @@ -42,6 +43,7 @@ import org.l2jmobius.gameserver.model.holders.LimitShopProductHolder; import org.l2jmobius.gameserver.model.holders.SubClassHolder; import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder; import org.l2jmobius.gameserver.model.olympiad.Olympiad; +import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.model.vip.VipManager; @@ -118,6 +120,7 @@ public class DailyTaskManager resetClanContributionList(); resetClanDonationPoints(); resetDailySkills(); + resetDailyPrimeShopData(); resetDailyLimitShopData(); resetWorldChatPoints(); resetRecommends(); @@ -536,6 +539,32 @@ public class DailyTaskManager } } + private void resetDailyPrimeShopData() + { + for (PrimeShopGroup holder : PrimeShopData.getInstance().getPrimeItems().values()) + { + // Update data for offline players. + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement ps = con.prepareStatement("DELETE FROM account_gsdata WHERE var=?")) + { + ps.setString(1, AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + ps.executeUpdate(); + } + catch (Exception e) + { + LOGGER.log(Level.SEVERE, getClass().getSimpleName() + ": Could not reset PrimeShopData: " + e); + } + + // Update data for online players. + for (Player player : World.getInstance().getPlayers()) + { + player.getVariables().remove(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + player.getAccountVariables().storeMe(); + } + } + LOGGER.info("PrimeShopData has been resetted."); + } + private void resetDailyLimitShopData() { for (LimitShopProductHolder holder : LimitShopData.getInstance().getProducts()) diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java index b41635fc4d..efd923d8b4 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java @@ -45,8 +45,8 @@ public class PrimeShopGroup private final int _maxLevel; private final int _minBirthday; private final int _maxBirthday; - private final int _restrictionDay; - private final int _availableCount; + private final int _accountDailyLimit; + private final int _accountBuyLimit; private final boolean _isVipGift; private final int _vipTier; private final List _items; @@ -73,8 +73,8 @@ public class PrimeShopGroup _maxLevel = set.getInt("maxLevel", 0); _minBirthday = set.getInt("minBirthday", 0); _maxBirthday = set.getInt("maxBirthday", 0); - _restrictionDay = set.getInt("restrictionDay", 0); - _availableCount = set.getInt("availableCount", 0); + _accountDailyLimit = set.getInt("accountDailyLimit", 0); + _accountBuyLimit = set.getInt("accountBuyLimit", 0); _isVipGift = set.getBoolean("isVipGift", false); _vipTier = set.getInt("vipTier", 0); @@ -191,14 +191,14 @@ public class PrimeShopGroup return _maxBirthday; } - public int getRestrictionDay() + public int getAccountDailyLimit() { - return _restrictionDay; + return _accountDailyLimit; } - public int getAvailableCount() + public int getAccountBuyLimit() { - return _availableCount; + return _accountBuyLimit; } public boolean isVipGift() diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java index db69e5334d..6e56897205 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java @@ -42,6 +42,8 @@ public class AccountVariables extends AbstractVariables // Public variable names public static final String HWID = "HWID"; public static final String HWIDSLIT_VAR = " "; + public static final String PRIME_SHOP_PRODUCT_COUNT = "PSPCount"; + public static final String PRIME_SHOP_PRODUCT_DAILY_COUNT = "PSPDailyCount"; public static final String LCOIN_SHOP_PRODUCT_COUNT = "LCSCount"; public static final String LCOIN_SHOP_PRODUCT_DAILY_COUNT = "LCSDailyCount"; public static final String VIP_POINTS = "VipPoints"; diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java index 3d9118244e..17a65db854 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java @@ -113,6 +113,17 @@ public class RequestBRBuyProduct implements IClientIncomingPacket { player.getAccountVariables().set(AccountVariables.VIP_ITEM_BOUGHT, Calendar.getInstance().getTimeInMillis()); } + + // Update account variables. + if (item.getAccountDailyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + else if (item.getAccountBuyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SUCCESS)); player.sendPacket(new ExBRGamePoint(player)); } @@ -176,6 +187,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.AFTER_SALE_DATE)); return false; } + else if ((item.getAccountDailyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0)) > item.getAccountDailyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } + else if ((item.getAccountBuyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0)) > item.getAccountBuyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } if ((item.getVipTier() > player.getVipTier()) || (item.isVipGift() && !canReceiveGift(player, item))) { @@ -225,8 +246,7 @@ public class RequestBRBuyProduct implements IClientIncomingPacket } else { - long timeBought = player.getAccountVariables().getLong(AccountVariables.VIP_ITEM_BOUGHT, 0L); - return timeBought <= 0; + return player.getAccountVariables().getLong(AccountVariables.VIP_ITEM_BOUGHT, 0) <= 0; } } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java index 0f042ba043..609d459cc6 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java @@ -22,6 +22,7 @@ import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; @@ -64,15 +65,49 @@ public class ExBRProductList implements IClientOutgoingPacket packet.writeC(brItem.getStartMinute()); packet.writeC(brItem.getStopHour()); packet.writeC(brItem.getStopMinute()); - packet.writeD(brItem.getStock()); - packet.writeD(brItem.getTotal()); + + // Daily account limit. + if ((brItem.getAccountDailyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + brItem.getBrId(), 0) >= brItem.getAccountDailyLimit())) + { + packet.writeD(brItem.getAccountDailyLimit()); + packet.writeD(brItem.getAccountDailyLimit()); + } + // General account limit. + else if ((brItem.getAccountBuyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + brItem.getBrId(), 0) >= brItem.getAccountBuyLimit())) + { + packet.writeD(brItem.getAccountBuyLimit()); + packet.writeD(brItem.getAccountBuyLimit()); + } + else + { + packet.writeD(brItem.getStock()); + packet.writeD(brItem.getTotal()); + } + packet.writeC(brItem.getSalePercent()); packet.writeC(brItem.getMinLevel()); packet.writeC(brItem.getMaxLevel()); packet.writeD(brItem.getMinBirthday()); packet.writeD(brItem.getMaxBirthday()); - packet.writeD(brItem.getRestrictionDay()); - packet.writeD(brItem.getAvailableCount()); + + // Daily account limit. + if (brItem.getAccountDailyLimit() > 0) + { + packet.writeD(1); // Days + packet.writeD(brItem.getAccountDailyLimit()); // Amount + } + // General account limit. + else if (brItem.getAccountBuyLimit() > 0) + { + packet.writeD(-1); // Days + packet.writeD(brItem.getAccountBuyLimit()); // Amount + } + else + { + packet.writeD(0); // Days + packet.writeD(0); // Amount + } + packet.writeC(brItem.getItems().size()); for (PrimeShopItem item : brItem.getItems()) { diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/PrimeShop.xml b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/PrimeShop.xml index 139ea16ec8..77ee2e926b 100644 --- a/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/PrimeShop.xml +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/PrimeShop.xml @@ -9,65 +9,65 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + \ No newline at end of file diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/xsd/PrimeShop.xsd b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/xsd/PrimeShop.xsd index 8556f5ed3f..fcf4df3a96 100644 --- a/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/xsd/PrimeShop.xsd +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/xsd/PrimeShop.xsd @@ -32,8 +32,8 @@ - - + + diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java index 77574ff0d3..fc6a6cf89a 100644 --- a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/instancemanager/DailyTaskManager.java @@ -31,6 +31,7 @@ import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.data.sql.ClanTable; import org.l2jmobius.gameserver.data.xml.DailyMissionData; import org.l2jmobius.gameserver.data.xml.LimitShopData; +import org.l2jmobius.gameserver.data.xml.PrimeShopData; import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData; import org.l2jmobius.gameserver.model.DailyMissionDataHolder; import org.l2jmobius.gameserver.model.World; @@ -42,6 +43,7 @@ import org.l2jmobius.gameserver.model.holders.LimitShopProductHolder; import org.l2jmobius.gameserver.model.holders.SubClassHolder; import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder; import org.l2jmobius.gameserver.model.olympiad.Olympiad; +import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.model.vip.VipManager; @@ -119,6 +121,7 @@ public class DailyTaskManager resetClanDonationPoints(); resetDailyHennaPattern(); resetDailySkills(); + resetDailyPrimeShopData(); resetDailyLimitShopData(); resetWorldChatPoints(); resetRecommends(); @@ -537,6 +540,32 @@ public class DailyTaskManager } } + private void resetDailyPrimeShopData() + { + for (PrimeShopGroup holder : PrimeShopData.getInstance().getPrimeItems().values()) + { + // Update data for offline players. + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement ps = con.prepareStatement("DELETE FROM account_gsdata WHERE var=?")) + { + ps.setString(1, AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + ps.executeUpdate(); + } + catch (Exception e) + { + LOGGER.log(Level.SEVERE, getClass().getSimpleName() + ": Could not reset PrimeShopData: " + e); + } + + // Update data for online players. + for (Player player : World.getInstance().getPlayers()) + { + player.getVariables().remove(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + holder.getBrId()); + player.getAccountVariables().storeMe(); + } + } + LOGGER.info("PrimeShopData has been resetted."); + } + private void resetDailyLimitShopData() { for (LimitShopProductHolder holder : LimitShopData.getInstance().getProducts()) diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java index b41635fc4d..efd923d8b4 100644 --- a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/primeshop/PrimeShopGroup.java @@ -45,8 +45,8 @@ public class PrimeShopGroup private final int _maxLevel; private final int _minBirthday; private final int _maxBirthday; - private final int _restrictionDay; - private final int _availableCount; + private final int _accountDailyLimit; + private final int _accountBuyLimit; private final boolean _isVipGift; private final int _vipTier; private final List _items; @@ -73,8 +73,8 @@ public class PrimeShopGroup _maxLevel = set.getInt("maxLevel", 0); _minBirthday = set.getInt("minBirthday", 0); _maxBirthday = set.getInt("maxBirthday", 0); - _restrictionDay = set.getInt("restrictionDay", 0); - _availableCount = set.getInt("availableCount", 0); + _accountDailyLimit = set.getInt("accountDailyLimit", 0); + _accountBuyLimit = set.getInt("accountBuyLimit", 0); _isVipGift = set.getBoolean("isVipGift", false); _vipTier = set.getInt("vipTier", 0); @@ -191,14 +191,14 @@ public class PrimeShopGroup return _maxBirthday; } - public int getRestrictionDay() + public int getAccountDailyLimit() { - return _restrictionDay; + return _accountDailyLimit; } - public int getAvailableCount() + public int getAccountBuyLimit() { - return _availableCount; + return _accountBuyLimit; } public boolean isVipGift() diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java index db69e5334d..6e56897205 100644 --- a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/variables/AccountVariables.java @@ -42,6 +42,8 @@ public class AccountVariables extends AbstractVariables // Public variable names public static final String HWID = "HWID"; public static final String HWIDSLIT_VAR = " "; + public static final String PRIME_SHOP_PRODUCT_COUNT = "PSPCount"; + public static final String PRIME_SHOP_PRODUCT_DAILY_COUNT = "PSPDailyCount"; public static final String LCOIN_SHOP_PRODUCT_COUNT = "LCSCount"; public static final String LCOIN_SHOP_PRODUCT_DAILY_COUNT = "LCSDailyCount"; public static final String VIP_POINTS = "VipPoints"; diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java index 3d9118244e..17a65db854 100644 --- a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/primeshop/RequestBRBuyProduct.java @@ -113,6 +113,17 @@ public class RequestBRBuyProduct implements IClientIncomingPacket { player.getAccountVariables().set(AccountVariables.VIP_ITEM_BOUGHT, Calendar.getInstance().getTimeInMillis()); } + + // Update account variables. + if (item.getAccountDailyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + else if (item.getAccountBuyLimit() > 0) + { + player.getAccountVariables().set(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0) + (item.getCount() * _count)); + } + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SUCCESS)); player.sendPacket(new ExBRGamePoint(player)); } @@ -176,6 +187,16 @@ public class RequestBRBuyProduct implements IClientIncomingPacket player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.AFTER_SALE_DATE)); return false; } + else if ((item.getAccountDailyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + item.getBrId(), 0)) > item.getAccountDailyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } + else if ((item.getAccountBuyLimit() > 0) && ((count + player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + item.getBrId(), 0)) > item.getAccountBuyLimit())) + { + player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT)); + return false; + } if ((item.getVipTier() > player.getVipTier()) || (item.isVipGift() && !canReceiveGift(player, item))) { @@ -225,8 +246,7 @@ public class RequestBRBuyProduct implements IClientIncomingPacket } else { - long timeBought = player.getAccountVariables().getLong(AccountVariables.VIP_ITEM_BOUGHT, 0L); - return timeBought <= 0; + return player.getAccountVariables().getLong(AccountVariables.VIP_ITEM_BOUGHT, 0) <= 0; } } diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java index 0f042ba043..609d459cc6 100644 --- a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/primeshop/ExBRProductList.java @@ -22,6 +22,7 @@ import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup; import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem; +import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; @@ -64,15 +65,49 @@ public class ExBRProductList implements IClientOutgoingPacket packet.writeC(brItem.getStartMinute()); packet.writeC(brItem.getStopHour()); packet.writeC(brItem.getStopMinute()); - packet.writeD(brItem.getStock()); - packet.writeD(brItem.getTotal()); + + // Daily account limit. + if ((brItem.getAccountDailyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_DAILY_COUNT + brItem.getBrId(), 0) >= brItem.getAccountDailyLimit())) + { + packet.writeD(brItem.getAccountDailyLimit()); + packet.writeD(brItem.getAccountDailyLimit()); + } + // General account limit. + else if ((brItem.getAccountBuyLimit() > 0) && (_player.getAccountVariables().getInt(AccountVariables.PRIME_SHOP_PRODUCT_COUNT + brItem.getBrId(), 0) >= brItem.getAccountBuyLimit())) + { + packet.writeD(brItem.getAccountBuyLimit()); + packet.writeD(brItem.getAccountBuyLimit()); + } + else + { + packet.writeD(brItem.getStock()); + packet.writeD(brItem.getTotal()); + } + packet.writeC(brItem.getSalePercent()); packet.writeC(brItem.getMinLevel()); packet.writeC(brItem.getMaxLevel()); packet.writeD(brItem.getMinBirthday()); packet.writeD(brItem.getMaxBirthday()); - packet.writeD(brItem.getRestrictionDay()); - packet.writeD(brItem.getAvailableCount()); + + // Daily account limit. + if (brItem.getAccountDailyLimit() > 0) + { + packet.writeD(1); // Days + packet.writeD(brItem.getAccountDailyLimit()); // Amount + } + // General account limit. + else if (brItem.getAccountBuyLimit() > 0) + { + packet.writeD(-1); // Days + packet.writeD(brItem.getAccountBuyLimit()); // Amount + } + else + { + packet.writeD(0); // Days + packet.writeD(0); // Amount + } + packet.writeC(brItem.getItems().size()); for (PrimeShopItem item : brItem.getItems()) {