Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Index: org/l2jmobius/gameserver/enums/ItemLocation.java
- ===================================================================
- --- org/l2jmobius/gameserver/enums/ItemLocation.java (revision 650)
- +++ org/l2jmobius/gameserver/enums/ItemLocation.java (working copy)
- @@ -9,22 +9,24 @@
- * This program is intellectual property of hi5.ge and can't, be
- * used for any commercial or financial use without the permission
- * of the rightful owners
- - */
- -package org.l2jmobius.gameserver.enums;
- -
- -public enum ItemLocation
- -{
- - VOID,
- - INVENTORY,
- - PAPERDOLL,
- - WAREHOUSE,
- - CLANWH,
- - PET,
- - PET_EQUIP,
- - LEASE,
- - REFUND,
- - MAIL,
- - FREIGHT,
- - COMMISSION,
- - EXCHANGE
- -}
- + */
- +package org.l2jmobius.gameserver.enums;
- +
- +public enum ItemLocation
- +{
- + VOID,
- + INVENTORY,
- + PAPERDOLL,
- + WAREHOUSE,
- + CLANWH,
- + PET,
- + PET_EQUIP,
- + LEASE,
- + REFUND,
- + MAIL,
- + FREIGHT,
- + COMMISSION,
- + EXCHANGE,
- + RESTORE,
- + GACHA
- +}
- Index: org/l2jmobius/gameserver/enums/UniqueGachaRank.java
- ===================================================================
- --- org/l2jmobius/gameserver/enums/UniqueGachaRank.java (nonexistent)
- +++ org/l2jmobius/gameserver/enums/UniqueGachaRank.java (working copy)
- @@ -0,0 +1,53 @@
- +/*
- + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
- + * This file is part of the Hi5.ge project.
- + *
- + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
- + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
- + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
- + *
- + * This program is intellectual property of hi5.ge and can't, be
- + * used for any commercial or financial use without the permission
- + * of the rightful owners
- + */
- +package org.l2jmobius.gameserver.enums;
- +
- +import java.util.HashMap;
- +import java.util.Map;
- +
- +/**
- + * @author Index
- + */
- +public enum UniqueGachaRank
- +{
- + RANK_UR(1),
- + RANK_SR(2),
- + RANK_R(3),;
- +
- + private final int _clientId;
- +
- + private final static Map<Integer, UniqueGachaRank> VALUES;
- + static
- + {
- + VALUES = new HashMap<>(UniqueGachaRank.values().length);
- + for (UniqueGachaRank rank : values())
- + {
- + VALUES.put(rank.getClientId(), rank);
- + }
- + }
- +
- + public static UniqueGachaRank getRankByClientId(int clientId)
- + {
- + return VALUES.getOrDefault(clientId, null);
- + }
- +
- + UniqueGachaRank(int clientId)
- + {
- + _clientId = clientId;
- + }
- +
- + public int getClientId()
- + {
- + return _clientId;
- + }
- +}
- \ No newline at end of file
- Index: org/l2jmobius/gameserver/instancemanager/events/UniqueGachaManager.java
- ===================================================================
- --- org/l2jmobius/gameserver/instancemanager/events/UniqueGachaManager.java (nonexistent)
- +++ org/l2jmobius/gameserver/instancemanager/events/UniqueGachaManager.java (working copy)
- @@ -0,0 +1,556 @@
- +/*
- + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
- + * This file is part of the Hi5.ge project.
- + *
- + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
- + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
- + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
- + *
- + * This program is intellectual property of hi5.ge and can't, be
- + * used for any commercial or financial use without the permission
- + * of the rightful owners
- + */
- +package org.l2jmobius.gameserver.instancemanager.events;
- +
- +import java.sql.Connection;
- +import java.sql.PreparedStatement;
- +import java.sql.ResultSet;
- +import java.sql.SQLException;
- +import java.sql.Statement;
- +import java.util.ArrayList;
- +import java.util.Collection;
- +import java.util.Collections;
- +import java.util.Comparator;
- +import java.util.HashMap;
- +import java.util.HashSet;
- +import java.util.LinkedList;
- +import java.util.List;
- +import java.util.Map;
- +import java.util.Set;
- +import java.util.concurrent.TimeUnit;
- +
- +import org.l2jmobius.commons.database.DatabaseFactory;
- +import org.l2jmobius.commons.threads.ThreadPool;
- +import org.l2jmobius.commons.util.Rnd;
- +import org.l2jmobius.gameserver.data.xml.ItemData;
- +import org.l2jmobius.gameserver.enums.UniqueGachaRank;
- +import org.l2jmobius.gameserver.instancemanager.QuestManager;
- +import org.l2jmobius.gameserver.model.StatSet;
- +import org.l2jmobius.gameserver.model.actor.Player;
- +import org.l2jmobius.gameserver.model.events.Containers;
- +import org.l2jmobius.gameserver.model.events.EventType;
- +import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogin;
- +import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogout;
- +import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
- +import org.l2jmobius.gameserver.model.holders.ItemHolder;
- +import org.l2jmobius.gameserver.model.holders.uniquegacha.ItemTimeStampHolder;
- +import org.l2jmobius.gameserver.model.holders.uniquegacha.UniqueGachaItemHolder;
- +import org.l2jmobius.gameserver.model.item.ItemTemplate;
- +import org.l2jmobius.gameserver.model.item.instance.Item;
- +import org.l2jmobius.gameserver.model.itemcontainer.PlayerGachaWarehouse;
- +import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
- +import org.l2jmobius.gameserver.model.quest.Quest;
- +import org.l2jmobius.gameserver.network.serverpackets.gacha.UniqueGachaSidebarInfo;
- +
- +import javafx.util.Pair;
- +
- +/**
- + * @author Index
- + */
- +public class UniqueGachaManager
- +{
- + /**
- + * @implNote 0.000001 MAXIMAL OF MINIMUM VALUE
- + */
- + public final static int MINIMUM_CHANCE = 1_000_000;
- + public final static int MINIMUM_CHANCE_AFTER_DOT = 6;
- + public final static String GACHA_PLAYER_VARIABLE = "GACHA_ROLL_COUNT";
- + public final static String GACHA_LOCK_PLAYER_VARIABLE = "UniqueGachaRoll";
- + private final static LinkedList<ItemTimeStampHolder> EMPTY_LINKED_LIST = new LinkedList<>();
- + private final Set<UniqueGachaItemHolder> _visibleItems = new HashSet<>();
- + private final Map<UniqueGachaRank, Set<UniqueGachaItemHolder>> _rewardItems = new HashMap<>();
- + private final Map<UniqueGachaRank, Integer> _rewardChance = new HashMap<>();
- + private final Map<Integer, Long> _gameCosts = new HashMap<>();
- +
- + private final Map<Player, PlayerGachaWarehouse> _temporaryWarehouse = new HashMap<>();
- + private final Map<Integer, LinkedList<ItemTimeStampHolder>> _gachaHistory = new HashMap<>();
- +
- + private boolean _isActive;
- + private long _activeUntilPeriod;
- + private int _guaranteeRoll;
- + private boolean _showProbability;
- + private int _currencyItemId;
- + private int _totalRewardCount = 0;
- + private int _totalChanceSumma = 0;
- +
- + public UniqueGachaManager()
- + {
- + restoreGachaHistory(_gachaHistory);
- + ThreadPool.scheduleAtFixedRate(() -> storeGachaHistory(_gachaHistory), TimeUnit.MINUTES.toMillis(5), TimeUnit.MINUTES.toMillis(5));
- + Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_LOGIN, (final OnPlayerLogin event) -> onPlayerLogin(event), this));
- + Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_LOGOUT, (final OnPlayerLogout event) -> onPlayerLogout(event), this));
- + }
- +
- + public void reload()
- + {
- + final Quest quest = QuestManager.getInstance().getQuest("UniqueGacha");
- + if (quest == null)
- + {
- + return;
- + }
- + _totalRewardCount = 0;
- + _totalChanceSumma = 0;
- + _visibleItems.clear();
- + _rewardItems.clear();
- + _rewardChance.clear();
- + _gameCosts.clear();
- + quest.notifyEvent("RELOAD", null, null);
- + }
- +
- + public void setParameters(StatSet params)
- + {
- + _isActive = params.getBoolean("isActive", false);
- + _activeUntilPeriod = params.getLong("activeUntilPeriod", 0L);
- + _guaranteeRoll = params.getInt("guaranteeRoll", 200);
- + _showProbability = params.getBoolean("showProbability", false);
- + _currencyItemId = params.getInt("currencyItemId", 57);
- + }
- +
- + public void addReward(UniqueGachaRank rank, int itemId, long itemCount, int itemChance, int enchantLevel)
- + {
- + _totalRewardCount += 1;
- + _totalChanceSumma += itemChance;
- + _rewardItems.putIfAbsent(rank, new HashSet<>());
- + _rewardItems.get(rank).add(new UniqueGachaItemHolder(itemId, itemCount, itemChance, enchantLevel, rank));
- + }
- +
- + public void addGameCost(int rollCount, long itemCount)
- + {
- + _gameCosts.put(rollCount, itemCount);
- + }
- +
- + public void recalculateChances()
- + {
- + for (UniqueGachaRank rank : _rewardItems.keySet())
- + {
- + final Set<UniqueGachaItemHolder> items = _rewardItems.get(rank);
- + int totalChance = 0;
- + for (UniqueGachaItemHolder item : items)
- + {
- + totalChance += item.getItemChance();
- + }
- + _rewardChance.put(rank, totalChance);
- + }
- + recalculateVisibleItems();
- + }
- +
- + private void recalculateVisibleItems()
- + {
- + final List<UniqueGachaItemHolder> _rewards = new ArrayList<>(_rewardItems.getOrDefault(UniqueGachaRank.RANK_UR, Set.of()));
- + _rewards.sort(Comparator.comparingInt(UniqueGachaItemHolder::getItemChance));
- + if (_rewards.isEmpty())
- + {
- + return;
- + }
- + _visibleItems.clear();
- + _visibleItems.addAll(_rewards.subList(0, Math.min(4, (_rewards.size()))));
- + _rewards.clear();
- + }
- +
- + private void onPlayerLogin(OnPlayerLogin event)
- + {
- + final Player player = event == null ? null : event.getPlayer();
- + if (player == null)
- + {
- + return;
- + }
- + if (isActive())
- + {
- + PlayerGachaWarehouse warehouse = _temporaryWarehouse.getOrDefault(player, null);
- + if (warehouse == null)
- + {
- + warehouse = new PlayerGachaWarehouse(player);
- + warehouse.restore();
- + _temporaryWarehouse.put(player, warehouse);
- + }
- + }
- + player.sendPacket(isActive() ? UniqueGachaSidebarInfo.GACHA_ON : UniqueGachaSidebarInfo.GACHA_OFF);
- + }
- +
- + private void onPlayerLogout(OnPlayerLogout event)
- + {
- + final Player player = event == null ? null : event.getPlayer();
- + if (player == null)
- + {
- + return;
- + }
- + PlayerGachaWarehouse warehouse = _temporaryWarehouse.getOrDefault(player, null);
- + if (warehouse != null)
- + {
- + warehouse.deleteMe();
- + _temporaryWarehouse.remove(player);
- + }
- + }
- +
- + public Set<UniqueGachaItemHolder> getVisibleItems()
- + {
- + return _visibleItems;
- + }
- +
- + public Map<UniqueGachaRank, Set<UniqueGachaItemHolder>> getRewardItems()
- + {
- + return _rewardItems;
- + }
- +
- + public Map<Integer, Long> getGameCosts()
- + {
- + return _gameCosts;
- + }
- +
- + public boolean isActive()
- + {
- + return _isActive;
- + }
- +
- + public long getActiveUntilPeriod()
- + {
- + return _activeUntilPeriod;
- + }
- +
- + public int getGuaranteeRoll()
- + {
- + return _guaranteeRoll;
- + }
- +
- + public boolean isShowProbability()
- + {
- + return _showProbability;
- + }
- +
- + public int getCurrencyItemId()
- + {
- + return _currencyItemId;
- + }
- +
- + public int getCurrencyCount(Player player)
- + {
- + long count;
- + if (true)
- + {
- + count = player.getInventory().getInventoryItemCount(getCurrencyItemId(), -1);
- + }
- + return (int) Math.min(Integer.MAX_VALUE, count);
- + }
- +
- + private void removeCurrency(Player player, long count)
- + {
- + if (true)
- + {
- + final PlayerInventory inv = player.getInventory();
- + if ((inv == null) || !inv.canManipulateWithItemId(_currencyItemId))
- + {
- + return;
- + }
- + final Item item = inv.getItemByItemId(_currencyItemId);
- + if (item == null)
- + {
- + return;
- + }
- + inv.destroyItem("gacha", item, count, player, null);
- + }
- + }
- +
- + @SuppressWarnings("unused")
- + public int getStepsToGuaranteedReward(Player player)
- + {
- + if (true)
- + {
- + return _guaranteeRoll - player.getVariables().getInt(GACHA_PLAYER_VARIABLE, 0);
- + }
- + return 0;
- + }
- +
- + public Pair<List<UniqueGachaItemHolder>, Boolean> tryToRoll(Player player, int rollCount)
- + {
- + boolean rare = false;
- + final List<UniqueGachaItemHolder> rewards = new ArrayList<>();
- + if (!checkRequirements(player, rollCount))
- + {
- + return returnEmptyList();
- + }
- + try
- + {
- + player.getVariables().set(GACHA_LOCK_PLAYER_VARIABLE, true);
- + removeCurrency(player, _gameCosts.get(rollCount));
- + int playerRollProgress = player.getVariables().getInt(GACHA_PLAYER_VARIABLE, 0);
- + for (int roll = 0; roll < rollCount; roll++)
- + {
- + playerRollProgress += 1;
- + final boolean isGuaranteed = playerRollProgress >= _guaranteeRoll;
- + playerRollProgress = isGuaranteed ? 0 : playerRollProgress;
- + final UniqueGachaRank rank = randomRank(isGuaranteed);
- + final UniqueGachaItemHolder item = getRandomReward(rank);
- + rare = rare || (item.getRank().equals(UniqueGachaRank.RANK_SR) || item.getRank().equals(UniqueGachaRank.RANK_UR));
- + addItemToTemporaryWarehouse(player, item);
- + rewards.add(item);
- + addToHistory(player, item, roll);
- + }
- + player.getVariables().set(GACHA_PLAYER_VARIABLE, playerRollProgress);
- + }
- + finally
- + {
- + player.getVariables().remove(GACHA_LOCK_PLAYER_VARIABLE);
- + }
- + return new Pair<>(rewards, rare);
- + }
- +
- + private boolean checkRequirements(Player player, int rollCount)
- + {
- + if (player.getVariables().getBoolean(GACHA_LOCK_PLAYER_VARIABLE, false))
- + {
- + return false;
- + }
- + final long currencyCount = _gameCosts.getOrDefault(rollCount, -1L);
- + if (currencyCount == -1L)
- + {
- + return false;
- + }
- + final PlayerInventory inv = player.getInventory();
- + if (inv == null)
- + {
- + return false;
- + }
- + if (true && !inv.canManipulateWithItemId(_currencyItemId))
- + {
- + return false;
- + }
- + if (getCurrencyCount(player) < currencyCount)
- + {
- + return false;
- + }
- + final PlayerGachaWarehouse warehouse = _temporaryWarehouse.getOrDefault(player, null);
- + if (warehouse == null)
- + {
- + return false;
- + }
- + if (warehouse.getSize() >= PlayerGachaWarehouse.MAXIMUM_TEMPORARY_WAREHOUSE_COUNT)
- + {
- + return false;
- + }
- + return true;
- + }
- +
- + private void addToHistory(Player player, UniqueGachaItemHolder item, int roll)
- + {
- + final String count = String.valueOf(roll);
- + final String timeStamp = String.valueOf(System.currentTimeMillis() / 1000L) + "0".repeat(3 - count.length()) + (count);
- + _gachaHistory.computeIfAbsent(player.getObjectId(), v -> new LinkedList<>()).addLast(new ItemTimeStampHolder(item.getId(), item.getCount(), item.getEnchantLevel(), item.getRank(), Long.parseLong(timeStamp), false));
- + }
- +
- + private boolean addItemToTemporaryWarehouse(Player player, UniqueGachaItemHolder reward)
- + {
- + final PlayerGachaWarehouse warehouse = _temporaryWarehouse.getOrDefault(player, null);
- + if (warehouse == null)
- + {
- + return false;
- + }
- + final ItemTemplate template = ItemData.getInstance().getTemplate(reward.getId());
- + if (template == null)
- + {
- + return false;
- + }
- + boolean isSuccess = false;
- + if (!template.isStackable())
- + {
- + for (long index = 0; index < reward.getCount(); index++)
- + {
- + final Item item = warehouse.addItem("Gacha Reward", reward.getId(), reward.getCount(), player, null);
- + if (item == null)
- + {
- + isSuccess = false;
- + break;
- + }
- + isSuccess = true;
- + }
- + }
- + else
- + {
- + isSuccess = warehouse.addItem("Gacha Reward", reward.getId(), reward.getCount(), player, null) != null;
- + }
- + return isSuccess;
- + }
- +
- + @SuppressWarnings("null")
- + public boolean receiveItemsFromTemporaryWarehouse(Player player, List<ItemHolder> requestedItems)
- + {
- + final PlayerGachaWarehouse warehouse = _temporaryWarehouse.getOrDefault(player, null);
- + final PlayerInventory inventory = player.getInventory();
- + if ((warehouse == null) || (inventory == null))
- + {
- + return false;
- + }
- + // check items
- + for (ItemHolder requestedItem : requestedItems)
- + {
- + final ItemTemplate template = ItemData.getInstance().getTemplate(requestedItem.getId());
- + final List<Item> item = template == null ? null : template.isStackable() ? List.of(warehouse.getItemByItemId(requestedItem.getId())) : new ArrayList<>(warehouse.getAllItemsByItemId(requestedItem.getId()));
- + if ((item == null) || item.isEmpty())
- + {
- + return false;
- + }
- + if (template.isStackable() ? item.get(0).getCount() < requestedItem.getCount() : item.size() < requestedItem.getCount())
- + {
- + return false;
- + }
- + }
- + for (ItemHolder requestedItem : requestedItems)
- + {
- + final ItemTemplate template = ItemData.getInstance().getTemplate(requestedItem.getId());
- + final List<Item> item = template.isStackable() ? List.of(warehouse.getItemByItemId(requestedItem.getId())) : new ArrayList<>(warehouse.getAllItemsByItemId(requestedItem.getId()));
- + for (Item wareHouseItem : item)
- + {
- + warehouse.transferItem("Gacha receive from Warehous", wareHouseItem.getObjectId(), (template.isStackable() ? requestedItem.getCount() : 1), inventory, player, null);
- + }
- + }
- + return true;
- + }
- +
- + public Collection<Item> getTemporaryWarehouse(Player player)
- + {
- + final PlayerGachaWarehouse warehouse = _temporaryWarehouse.getOrDefault(player, null);
- + if (warehouse == null)
- + {
- + return Collections.emptyList();
- + }
- + return warehouse.getItems();
- + }
- +
- + private UniqueGachaRank randomRank(boolean isGuaranteed)
- + {
- + int sumChance = 0;
- + final int rollRank = Rnd.get(0, _totalChanceSumma);
- + final UniqueGachaRank rank;
- + if ((isGuaranteed && (Rnd.get(0, 100) <= 10)) || (rollRank <= (sumChance += _rewardChance.getOrDefault(UniqueGachaRank.RANK_UR, 0))))
- + {
- + rank = UniqueGachaRank.RANK_UR;
- + }
- + else if (isGuaranteed || (rollRank <= (sumChance + _rewardChance.getOrDefault(UniqueGachaRank.RANK_SR, 0))))
- + {
- + rank = UniqueGachaRank.RANK_SR;
- + }
- + else
- + {
- + rank = UniqueGachaRank.RANK_R;
- + }
- + return rank;
- + }
- +
- + private UniqueGachaItemHolder getRandomReward(UniqueGachaRank rank)
- + {
- + final List<UniqueGachaItemHolder> rollRewards = new ArrayList<>(_rewardItems.getOrDefault(rank, Set.of()));
- + Collections.shuffle(rollRewards);
- + int rollChance = 0;
- + final int rollReward = Rnd.get(0, _rewardChance.getOrDefault(rank, MINIMUM_CHANCE));
- + UniqueGachaItemHolder rewardItem = null;
- + for (UniqueGachaItemHolder item : rollRewards)
- + {
- + rewardItem = item;
- + rollChance += item.getItemChance();
- + if (rollChance >= rollReward)
- + {
- + break;
- + }
- + }
- + return rewardItem;
- + }
- +
- + public int getTotalRewardCount()
- + {
- + return _totalRewardCount;
- + }
- +
- + public List<ItemTimeStampHolder> getGachaCharacterHistory(Player player)
- + {
- + return _gachaHistory.getOrDefault(player.getObjectId(), EMPTY_LINKED_LIST);
- + }
- +
- + private static void restoreGachaHistory(Map<Integer, LinkedList<ItemTimeStampHolder>> history)
- + {
- + try (Connection con = DatabaseFactory.getConnection();
- + Statement st = con.createStatement();
- + ResultSet rset = st.executeQuery("SELECT * FROM character_gacha_history ORDER BY receive_time DESC"))
- + {
- + while (rset.next())
- + {
- + final int characterId = rset.getInt("char_id");
- + final int itemId = rset.getInt("item_id");
- + final long itemCount = rset.getLong("item_count");
- + final int enchantLevel = rset.getInt("item_enchant");
- + final int itemRank = rset.getInt("item_rank");
- + final long receiveTime = rset.getLong("receive_time");
- + history.computeIfAbsent(characterId, v -> new LinkedList<>()).addLast(new ItemTimeStampHolder(itemId, itemCount, enchantLevel, UniqueGachaRank.getRankByClientId(itemRank), receiveTime, true));
- + }
- + }
- + catch (Exception e)
- + {
- + e.printStackTrace();
- + }
- + }
- +
- + private static void storeGachaHistory(Map<Integer, LinkedList<ItemTimeStampHolder>> history)
- + {
- + final Map<Integer, LinkedList<ItemTimeStampHolder>> map = new HashMap<>(history);
- + try (Connection con = DatabaseFactory.getConnection();
- + PreparedStatement statement = con.prepareStatement("INSERT INTO `character_gacha_history`(`char_id`, `item_id`, `item_count`, `item_enchant`, `item_rank`, `receive_time`) VALUES(?, ?, ?, ?, ?, ?)"))
- + {
- + boolean containsUpdate = false;
- + for (Map.Entry<Integer, LinkedList<ItemTimeStampHolder>> entry : map.entrySet())
- + {
- + final int charId = entry.getKey();
- + final LinkedList<ItemTimeStampHolder> list = new LinkedList<>(entry.getValue());
- + for (ItemTimeStampHolder item : list)
- + {
- + if (item.getStoredStatus())
- + {
- + continue;
- + }
- + statement.setInt(1, charId);
- + statement.setInt(2, item.getId());
- + statement.setLong(3, item.getCount());
- + statement.setInt(4, item.getEnchantLevel());
- + statement.setInt(5, item.getRank().getClientId());
- + statement.setLong(6, item.getTimeStamp());
- + statement.addBatch();
- + containsUpdate = true;
- + }
- + }
- + if (containsUpdate)
- + {
- + statement.executeBatch();
- + }
- + else
- + {
- + statement.close();
- + }
- + }
- + catch (SQLException e)
- + {
- + e.printStackTrace();
- + }
- + }
- +
- + private static Pair<List<UniqueGachaItemHolder>, Boolean> returnEmptyList()
- + {
- + return new Pair<>(Collections.emptyList(), false);
- + }
- +
- + public static UniqueGachaManager getInstance()
- + {
- + return UniqueGachaManager.SingletonHolder.INSTANCE;
- + }
- +
- + private static class SingletonHolder
- + {
- + protected static final UniqueGachaManager INSTANCE = new UniqueGachaManager();
- + }
- +}
- Index: org/l2jmobius/gameserver/model/holders/uniquegacha/ItemTimeStampHolder.java
- ===================================================================
- --- org/l2jmobius/gameserver/model/holders/uniquegacha/ItemTimeStampHolder.java (nonexistent)
- +++ org/l2jmobius/gameserver/model/holders/uniquegacha/ItemTimeStampHolder.java (working copy)
- @@ -0,0 +1,53 @@
- +/*
- + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
- + * This file is part of the Hi5.ge project.
- + *
- + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
- + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
- + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
- + *
- + * This program is intellectual property of hi5.ge and can't, be
- + * used for any commercial or financial use without the permission
- + * of the rightful owners
- + */
- +package org.l2jmobius.gameserver.model.holders.uniquegacha;
- +
- +import org.l2jmobius.gameserver.enums.UniqueGachaRank;
- +
- +/**
- + * @author Index
- + */
- +public class ItemTimeStampHolder extends UniqueGachaItemHolder
- +{
- + private final long _timeStamp;
- + private boolean _storedInDatabase;
- +
- + public ItemTimeStampHolder(int itemId, long itemCount, int enchantLevel, UniqueGachaRank rank, long timeStamp, boolean stored)
- + {
- + super(itemId, itemCount, 0, enchantLevel, rank);
- + _timeStamp = timeStamp;
- + _storedInDatabase = stored;
- + }
- +
- + public long getTimeStamp()
- + {
- + return _timeStamp;
- + }
- +
- + public int getTimeStampFromNow()
- + {
- + final long timeOfReceive = _timeStamp / 1000L;
- + final long currentTime = System.currentTimeMillis() / 1000L;
- + return (int) (currentTime - timeOfReceive);
- + }
- +
- + public boolean getStoredStatus()
- + {
- + if (_storedInDatabase)
- + {
- + return true;
- + }
- + _storedInDatabase = true;
- + return false;
- + }
- +}
- Index: org/l2jmobius/gameserver/model/holders/uniquegacha/UniqueGachaItemHolder.java
- ===================================================================
- --- org/l2jmobius/gameserver/model/holders/uniquegacha/UniqueGachaItemHolder.java (nonexistent)
- +++ org/l2jmobius/gameserver/model/holders/uniquegacha/UniqueGachaItemHolder.java (working copy)
- @@ -0,0 +1,49 @@
- +/*
- + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
- + * This file is part of the Hi5.ge project.
- + *
- + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
- + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
- + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
- + *
- + * This program is intellectual property of hi5.ge and can't, be
- + * used for any commercial or financial use without the permission
- + * of the rightful owners
- + */
- +package org.l2jmobius.gameserver.model.holders.uniquegacha;
- +
- +import org.l2jmobius.gameserver.enums.UniqueGachaRank;
- +import org.l2jmobius.gameserver.model.holders.ItemHolder;
- +
- +/**
- + * @author Index
- + */
- +public class UniqueGachaItemHolder extends ItemHolder
- +{
- + private final int _itemChance;
- + private final int _enchantLevel;
- + private final UniqueGachaRank _rank;
- +
- + public UniqueGachaItemHolder(int itemId, long itemCount, int itemChance, int enchantLevel, UniqueGachaRank rank)
- + {
- + super(itemId, itemCount);
- + _itemChance = itemChance;
- + _enchantLevel = enchantLevel;
- + _rank = rank;
- + }
- +
- + public int getItemChance()
- + {
- + return _itemChance;
- + }
- +
- + public int getEnchantLevel()
- + {
- + return _enchantLevel;
- + }
- +
- + public UniqueGachaRank getRank()
- + {
- + return _rank;
- + }
- +}
- \ No newline at end of file
- Index: org/l2jmobius/gameserver/model/itemcontainer/PlayerGachaWarehouse.java
- ===================================================================
- --- org/l2jmobius/gameserver/model/itemcontainer/PlayerGachaWarehouse.java (nonexistent)
- +++ org/l2jmobius/gameserver/model/itemcontainer/PlayerGachaWarehouse.java (working copy)
- @@ -0,0 +1,44 @@
- +/*
- + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
- + * This file is part of the Hi5.ge project.
- + *
- + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
- + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
- + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
- + *
- + * This program is intellectual property of hi5.ge and can't, be
- + * used for any commercial or financial use without the permission
- + * of the rightful owners
- + */
- +package org.l2jmobius.gameserver.model.itemcontainer;
- +
- +import org.l2jmobius.gameserver.enums.ItemLocation;
- +import org.l2jmobius.gameserver.model.actor.Creature;
- +import org.l2jmobius.gameserver.model.actor.Player;
- +
- +/**
- + * @author Index
- + */
- +public class PlayerGachaWarehouse extends Warehouse
- +{
- + public final static int MAXIMUM_TEMPORARY_WAREHOUSE_COUNT = 1_100;
- +
- + private final Creature _owner;
- +
- + public PlayerGachaWarehouse(Player player)
- + {
- + _owner = player;
- + }
- +
- + @Override
- + protected Creature getOwner()
- + {
- + return _owner;
- + }
- +
- + @Override
- + protected ItemLocation getBaseLocation()
- + {
- + return ItemLocation.GACHA;
- + }
- +}
- Index: org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaGame.java
- ===================================================================
- --- org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaGame.java (nonexistent)
- +++ org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaGame.java (working copy)
- @@ -0,0 +1,53 @@
- +/*
- + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
- + * This file is part of the Hi5.ge project.
- + *
- + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
- + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
- + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
- + *
- + * This program is intellectual property of hi5.ge and can't, be
- + * used for any commercial or financial use without the permission
- + * of the rightful owners
- + */
- +package org.l2jmobius.gameserver.network.clientpackets.gacha;
- +
- +import java.util.List;
- +
- +import org.l2jmobius.gameserver.instancemanager.events.UniqueGachaManager;
- +import org.l2jmobius.gameserver.model.actor.Player;
- +import org.l2jmobius.gameserver.model.holders.uniquegacha.UniqueGachaItemHolder;
- +import org.l2jmobius.gameserver.network.clientpackets.ClientPacket;
- +import org.l2jmobius.gameserver.network.serverpackets.gacha.UniqueGachaGame;
- +import org.l2jmobius.gameserver.network.serverpackets.gacha.UniqueGachaInvenAddItem;
- +
- +import javafx.util.Pair;
- +
- +/**
- + * @author Index
- + */
- +public class ExUniqueGachaGame extends ClientPacket
- +{
- + private int _gameCount;
- +
- + @Override
- + protected void readImpl()
- + {
- + _gameCount = readInt();
- + }
- +
- + @Override
- + protected void runImpl()
- + {
- + final Player player = getPlayer();
- + if (player == null)
- + {
- + return;
- + }
- + final Pair<List<UniqueGachaItemHolder>, Boolean> pair = UniqueGachaManager.getInstance().tryToRoll(player, _gameCount);
- + final List<UniqueGachaItemHolder> rewards = pair.getKey();
- + final boolean rare = pair.getValue().booleanValue();
- + player.sendPacket(new UniqueGachaGame(rewards.isEmpty() ? UniqueGachaGame.FAILURE : UniqueGachaGame.SUCCESS, player, rewards, rare));
- + player.sendPacket(new UniqueGachaInvenAddItem(rewards));
- + }
- +}
- \ No newline at end of file
- Index: org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaHistory.java
- ===================================================================
- --- org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaHistory.java (nonexistent)
- +++ org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaHistory.java (working copy)
- @@ -0,0 +1,48 @@
- +/*
- + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
- + * This file is part of the Hi5.ge project.
- + *
- + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
- + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
- + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
- + *
- + * This program is intellectual property of hi5.ge and can't, be
- + * used for any commercial or financial use without the permission
- + * of the rightful owners
- + */
- +package org.l2jmobius.gameserver.network.clientpackets.gacha;
- +
- +import java.util.List;
- +
- +import org.l2jmobius.gameserver.instancemanager.events.UniqueGachaManager;
- +import org.l2jmobius.gameserver.model.actor.Player;
- +import org.l2jmobius.gameserver.model.holders.uniquegacha.ItemTimeStampHolder;
- +import org.l2jmobius.gameserver.network.clientpackets.ClientPacket;
- +import org.l2jmobius.gameserver.network.serverpackets.gacha.UniqueGachaHistory;
- +
- +/**
- + * @author Index
- + */
- +public class ExUniqueGachaHistory extends ClientPacket
- +{
- + @SuppressWarnings("unused")
- + private int _inventoryType;
- +
- + @Override
- + protected void readImpl()
- + {
- + _inventoryType = readByte();
- + }
- +
- + @Override
- + protected void runImpl()
- + {
- + final Player player = getPlayer();
- + if (player == null)
- + {
- + return;
- + }
- + final List<ItemTimeStampHolder> itemHistory = UniqueGachaManager.getInstance().getGachaCharacterHistory(player);
- + player.sendPacket(new UniqueGachaHistory(itemHistory));
- + }
- +}
- Index: org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaInvenGetItem.java
- ===================================================================
- --- org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaInvenGetItem.java (nonexistent)
- +++ org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaInvenGetItem.java (working copy)
- @@ -0,0 +1,53 @@
- +/*
- + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
- + * This file is part of the Hi5.ge project.
- + *
- + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
- + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
- + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
- + *
- + * This program is intellectual property of hi5.ge and can't, be
- + * used for any commercial or financial use without the permission
- + * of the rightful owners
- + */
- +package org.l2jmobius.gameserver.network.clientpackets.gacha;
- +
- +import java.util.ArrayList;
- +import java.util.List;
- +
- +import org.l2jmobius.gameserver.instancemanager.events.UniqueGachaManager;
- +import org.l2jmobius.gameserver.model.actor.Player;
- +import org.l2jmobius.gameserver.model.holders.ItemHolder;
- +import org.l2jmobius.gameserver.network.clientpackets.ClientPacket;
- +import org.l2jmobius.gameserver.network.serverpackets.gacha.UniqueGachaInvenGetItem;
- +
- +/**
- + * @author Index
- + */
- +public class ExUniqueGachaInvenGetItem extends ClientPacket
- +{
- + private List<ItemHolder> _requestedItems;
- +
- + @Override
- + protected void readImpl()
- + {
- + final int size = readInt();
- + _requestedItems = new ArrayList<>(size);
- + for (int index = 0; index < size; index++)
- + {
- + _requestedItems.add(new ItemHolder(readInt(), readLong()));
- + }
- + }
- +
- + @Override
- + protected void runImpl()
- + {
- + final Player player = getPlayer();
- + if (player == null)
- + {
- + return;
- + }
- + final boolean isSuccess = UniqueGachaManager.getInstance().receiveItemsFromTemporaryWarehouse(player, _requestedItems);
- + player.sendPacket(new UniqueGachaInvenGetItem(isSuccess));
- + }
- +}
- \ No newline at end of file
- Index: org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaInvenItemList.java
- ===================================================================
- --- org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaInvenItemList.java (nonexistent)
- +++ org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaInvenItemList.java (working copy)
- @@ -0,0 +1,58 @@
- +/*
- + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
- + * This file is part of the Hi5.ge project.
- + *
- + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
- + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
- + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
- + *
- + * This program is intellectual property of hi5.ge and can't, be
- + * used for any commercial or financial use without the permission
- + * of the rightful owners
- + */
- +package org.l2jmobius.gameserver.network.clientpackets.gacha;
- +
- +import java.util.ArrayList;
- +import java.util.List;
- +
- +import org.l2jmobius.gameserver.instancemanager.events.UniqueGachaManager;
- +import org.l2jmobius.gameserver.model.actor.Player;
- +import org.l2jmobius.gameserver.model.item.instance.Item;
- +import org.l2jmobius.gameserver.network.clientpackets.ClientPacket;
- +import org.l2jmobius.gameserver.network.serverpackets.gacha.UniqueGachaInvenItemList;
- +
- +/**
- + * @author Index
- + */
- +public class ExUniqueGachaInvenItemList extends ClientPacket
- +{
- + @SuppressWarnings("unused")
- + private int _inventoryType;
- +
- + @Override
- + protected void readImpl()
- + {
- + _inventoryType = readByte();
- + }
- +
- + @Override
- + protected void runImpl()
- + {
- + final Player player = getPlayer();
- + if (player == null)
- + {
- + return;
- + }
- + final List<Item> items = new ArrayList<>(UniqueGachaManager.getInstance().getTemporaryWarehouse(player));
- + final int totalSize = items.size();
- + final int perPage = 150;
- + final int totalPages = totalSize / perPage;
- +
- + for (int i = 0; i <= totalPages; i++)
- + {
- + // page on client should start from 1, not 0.
- + // if page is set to 0 - nothing shows up at all.
- + player.sendPacket(new UniqueGachaInvenItemList((i + 1), (totalPages + 1), items.subList(i * perPage, Math.min((i + 1) * perPage, totalSize))));
- + }
- + }
- +}
- \ No newline at end of file
- Index: org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaOpen.java
- ===================================================================
- --- org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaOpen.java (nonexistent)
- +++ org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaOpen.java (working copy)
- @@ -0,0 +1,44 @@
- +/*
- + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
- + * This file is part of the Hi5.ge project.
- + *
- + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
- + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
- + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
- + *
- + * This program is intellectual property of hi5.ge and can't, be
- + * used for any commercial or financial use without the permission
- + * of the rightful owners
- + */
- +package org.l2jmobius.gameserver.network.clientpackets.gacha;
- +
- +import org.l2jmobius.gameserver.model.actor.Player;
- +import org.l2jmobius.gameserver.network.clientpackets.ClientPacket;
- +import org.l2jmobius.gameserver.network.serverpackets.gacha.UniqueGachaOpen;
- +
- +/**
- + * @author Index
- + */
- +public class ExUniqueGachaOpen extends ClientPacket
- +{
- + private int _fullInfo;
- + private int _openMode;
- +
- + @Override
- + protected void readImpl()
- + {
- + _fullInfo = readByte();
- + _openMode = readByte();
- + }
- +
- + @Override
- + protected void runImpl()
- + {
- + final Player player = getPlayer();
- + if (player == null)
- + {
- + return;
- + }
- + player.sendPacket(new UniqueGachaOpen(player, _fullInfo, _openMode));
- + }
- +}
- Index: org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaGame.java
- ===================================================================
- --- org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaGame.java (nonexistent)
- +++ org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaGame.java (working copy)
- @@ -0,0 +1,65 @@
- +/*
- + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
- + * This file is part of the Hi5.ge project.
- + *
- + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
- + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
- + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
- + *
- + * This program is intellectual property of hi5.ge and can't, be
- + * used for any commercial or financial use without the permission
- + * of the rightful owners
- + */
- +package org.l2jmobius.gameserver.network.serverpackets.gacha;
- +
- +import java.util.List;
- +
- +import org.l2jmobius.commons.network.WritableBuffer;
- +import org.l2jmobius.gameserver.instancemanager.events.UniqueGachaManager;
- +import org.l2jmobius.gameserver.model.actor.Player;
- +import org.l2jmobius.gameserver.model.holders.uniquegacha.UniqueGachaItemHolder;
- +import org.l2jmobius.gameserver.network.GameClient;
- +import org.l2jmobius.gameserver.network.ServerPackets;
- +import org.l2jmobius.gameserver.network.serverpackets.ServerPacket;
- +
- +/**
- + * @author Index
- + */
- +public class UniqueGachaGame extends ServerPacket
- +{
- + public final static int FAILURE = 0;
- + public final static int SUCCESS = 1;
- +
- + private final int _success;
- + private final Player _player;
- + private final List<UniqueGachaItemHolder> _rewards;
- + private final boolean _rare;
- +
- + public UniqueGachaGame(int success, Player player, List<UniqueGachaItemHolder> rewards, boolean rare)
- + {
- + _success = success;
- + _player = player;
- + _rewards = rewards;
- + _rare = rare;
- + }
- +
- + @Override
- + public void writeImpl(GameClient client, WritableBuffer buffer)
- + {
- + final UniqueGachaManager manager = UniqueGachaManager.getInstance();
- + ServerPackets.EX_UNIQUE_GACHA_GAME.writeId(this, buffer);
- + buffer.writeByte(_success); // result // char
- + buffer.writeLong(manager.getCurrencyCount(_player)); // amount // int
- + buffer.writeInt(manager.getStepsToGuaranteedReward(_player)); // guaruant // int
- + // 0 - yellow
- + // 1 - purple
- + buffer.writeByte(_rare ? 1 : 0); // rank // char
- + buffer.writeInt(_rewards.size()); // size // int
- + for (UniqueGachaItemHolder item : _rewards)
- + {
- + buffer.writeByte(item.getRank().getClientId()); // rank // char
- + buffer.writeInt(item.getId()); // itemId // int
- + buffer.writeLong(item.getCount()); // count // long
- + }
- + }
- +}
- Index: org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaHistory.java
- ===================================================================
- --- org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaHistory.java (nonexistent)
- +++ org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaHistory.java (working copy)
- @@ -0,0 +1,51 @@
- +/*
- + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
- + * This file is part of the Hi5.ge project.
- + *
- + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
- + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
- + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
- + *
- + * This program is intellectual property of hi5.ge and can't, be
- + * used for any commercial or financial use without the permission
- + * of the rightful owners
- + */
- +package org.l2jmobius.gameserver.network.serverpackets.gacha;
- +
- +import java.util.List;
- +
- +import org.l2jmobius.commons.network.WritableBuffer;
- +import org.l2jmobius.gameserver.model.holders.uniquegacha.ItemTimeStampHolder;
- +import org.l2jmobius.gameserver.network.GameClient;
- +import org.l2jmobius.gameserver.network.ServerPackets;
- +import org.l2jmobius.gameserver.network.serverpackets.ServerPacket;
- +
- +/**
- + * @author Index
- + */
- +public class UniqueGachaHistory extends ServerPacket
- +{
- + private final static int SHORT_PACKET_SIZE = 2 + 1 + 4 + 8;
- +
- + private final List<ItemTimeStampHolder> _items;
- +
- + public UniqueGachaHistory(List<ItemTimeStampHolder> items)
- + {
- + _items = items;
- + }
- +
- + @Override
- + public void writeImpl(GameClient client, WritableBuffer buffer)
- + {
- + ServerPackets.EX_UNIQUE_GACHA_HISTORY.writeId(this, buffer);
- + buffer.writeInt(_items.size());
- + for (ItemTimeStampHolder item : _items)
- + {
- + buffer.writeShort(SHORT_PACKET_SIZE);
- + buffer.writeByte(item.getRank().getClientId());
- + buffer.writeInt(item.getId());
- + buffer.writeLong(item.getCount());
- + buffer.writeLong(item.getTimeStampFromNow());
- + }
- + }
- +}
- Index: org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaInvenAddItem.java
- ===================================================================
- --- org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaInvenAddItem.java (nonexistent)
- +++ org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaInvenAddItem.java (working copy)
- @@ -0,0 +1,47 @@
- +/*
- + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
- + * This file is part of the Hi5.ge project.
- + *
- + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
- + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
- + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
- + *
- + * This program is intellectual property of hi5.ge and can't, be
- + * used for any commercial or financial use without the permission
- + * of the rightful owners
- + */
- +package org.l2jmobius.gameserver.network.serverpackets.gacha;
- +
- +import java.util.List;
- +
- +import org.l2jmobius.commons.network.WritableBuffer;
- +import org.l2jmobius.gameserver.model.holders.ItemHolder;
- +import org.l2jmobius.gameserver.model.holders.uniquegacha.UniqueGachaItemHolder;
- +import org.l2jmobius.gameserver.network.GameClient;
- +import org.l2jmobius.gameserver.network.ServerPackets;
- +import org.l2jmobius.gameserver.network.serverpackets.ServerPacket;
- +
- +/**
- + * @author Index
- + */
- +public class UniqueGachaInvenAddItem extends ServerPacket
- +{
- + private final List<UniqueGachaItemHolder> _rewards;
- +
- + public UniqueGachaInvenAddItem(List<UniqueGachaItemHolder> rewards)
- + {
- + _rewards = rewards;
- + }
- +
- + @Override
- + public void writeImpl(GameClient client, WritableBuffer buffer)
- + {
- + ServerPackets.EX_UNIQUE_GACHA_INVEN_ADD_ITEM.writeId(this, buffer);
- + buffer.writeInt(_rewards.size());
- + for (ItemHolder item : _rewards)
- + {
- + buffer.writeInt(item.getId());
- + buffer.writeLong(item.getCount());
- + }
- + }
- +}
- \ No newline at end of file
- Index: org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaInvenGetItem.java
- ===================================================================
- --- org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaInvenGetItem.java (nonexistent)
- +++ org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaInvenGetItem.java (working copy)
- @@ -0,0 +1,38 @@
- +/*
- + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
- + * This file is part of the Hi5.ge project.
- + *
- + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
- + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
- + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
- + *
- + * This program is intellectual property of hi5.ge and can't, be
- + * used for any commercial or financial use without the permission
- + * of the rightful owners
- + */
- +package org.l2jmobius.gameserver.network.serverpackets.gacha;
- +
- +import org.l2jmobius.commons.network.WritableBuffer;
- +import org.l2jmobius.gameserver.network.GameClient;
- +import org.l2jmobius.gameserver.network.ServerPackets;
- +import org.l2jmobius.gameserver.network.serverpackets.ServerPacket;
- +
- +/**
- + * @author Index
- + */
- +public class UniqueGachaInvenGetItem extends ServerPacket
- +{
- + private final int _result;
- +
- + public UniqueGachaInvenGetItem(boolean result)
- + {
- + _result = result ? 1 : 0;
- + }
- +
- + @Override
- + public void writeImpl(GameClient client, WritableBuffer buffer)
- + {
- + ServerPackets.EX_UNIQUE_GACHA_INVEN_GET_ITEM.writeId(this, buffer);
- + buffer.writeByte(_result);
- + }
- +}
- \ No newline at end of file
- Index: org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaInvenItemList.java
- ===================================================================
- --- org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaInvenItemList.java (nonexistent)
- +++ org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaInvenItemList.java (working copy)
- @@ -0,0 +1,52 @@
- +/*
- + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
- + * This file is part of the Hi5.ge project.
- + *
- + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
- + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
- + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
- + *
- + * This program is intellectual property of hi5.ge and can't, be
- + * used for any commercial or financial use without the permission
- + * of the rightful owners
- + */
- +package org.l2jmobius.gameserver.network.serverpackets.gacha;
- +
- +import java.util.List;
- +
- +import org.l2jmobius.commons.network.WritableBuffer;
- +import org.l2jmobius.gameserver.model.item.instance.Item;
- +import org.l2jmobius.gameserver.network.GameClient;
- +import org.l2jmobius.gameserver.network.ServerPackets;
- +import org.l2jmobius.gameserver.network.serverpackets.ServerPacket;
- +
- +/**
- + * @author Index
- + */
- +public class UniqueGachaInvenItemList extends ServerPacket
- +{
- + private final int _currPage;
- + private final int _maxPages;
- + private final List<Item> _items;
- +
- + public UniqueGachaInvenItemList(int currPage, int maxPages, List<Item> items)
- + {
- + _currPage = currPage;
- + _maxPages = maxPages;
- + _items = items;
- + }
- +
- + @Override
- + public void writeImpl(GameClient client, WritableBuffer buffer)
- + {
- + ServerPackets.EX_UNIQUE_GACHA_INVEN_ITEM_LIST.writeId(this, buffer);
- + buffer.writeByte(_currPage);
- + buffer.writeByte(_maxPages);
- + buffer.writeLong(_items.size());
- + for (Item item : _items)
- + {
- + buffer.writeInt(item.getDisplayId());
- + buffer.writeLong(item.getCount());
- + }
- + }
- +}
- \ No newline at end of file
- Index: org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaOpen.java
- ===================================================================
- --- org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaOpen.java (nonexistent)
- +++ org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaOpen.java (working copy)
- @@ -0,0 +1,115 @@
- +/*
- + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
- + * This file is part of the Hi5.ge project.
- + *
- + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
- + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
- + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
- + *
- + * This program is intellectual property of hi5.ge and can't, be
- + * used for any commercial or financial use without the permission
- + * of the rightful owners
- + */
- +package org.l2jmobius.gameserver.network.serverpackets.gacha;
- +
- +import java.util.Map;
- +import java.util.Set;
- +
- +import org.l2jmobius.commons.network.WritableBuffer;
- +import org.l2jmobius.gameserver.instancemanager.events.UniqueGachaManager;
- +import org.l2jmobius.gameserver.model.actor.Player;
- +import org.l2jmobius.gameserver.model.holders.uniquegacha.UniqueGachaItemHolder;
- +import org.l2jmobius.gameserver.network.GameClient;
- +import org.l2jmobius.gameserver.network.ServerPackets;
- +import org.l2jmobius.gameserver.network.serverpackets.ServerPacket;
- +
- +/**
- + * @author Index
- + */
- +public class UniqueGachaOpen extends ServerPacket
- +{
- + private final static int SHORT_PACKET_INFO = 2 + 1 + 4 + 8;
- +
- + private final Player _player;
- + private final int _fullInfo;
- + private final int _openMode;
- +
- + public UniqueGachaOpen(Player player, int fullInfo, int openMode)
- + {
- + _player = player;
- + _fullInfo = fullInfo;
- + _openMode = openMode;
- + }
- +
- + @Override
- + public void writeImpl(GameClient client, WritableBuffer buffer)
- + {
- + final UniqueGachaManager manager = UniqueGachaManager.getInstance();
- + ServerPackets.EX_UNIQUE_GACHA_OPEN.writeId(this, buffer);
- + /**
- + * open mode 1 = const GACHA_TITLE_FORM = 1; = will open main window?
- + */
- + buffer.writeByte(_openMode); // open mode // char // 1 = main menu
- + buffer.writeByte(0); // result // char // not used?
- + buffer.writeInt(manager.getCurrencyCount(_player)); // my cost item amount // int // current item count for roll?
- + buffer.writeInt(manager.getStepsToGuaranteedReward(_player)); // my confirm count // int // left to guarant
- + buffer.writeInt((int) ((manager.getActiveUntilPeriod() - System.currentTimeMillis()) / 1000L)); // remain time in seconds // int
- + buffer.writeByte(_fullInfo); // full info // char
- + buffer.writeByte(manager.isShowProbability() ? 1 : 0); // show probability // char
- + if (_fullInfo == 1)
- + {
- + writeFullInfo(buffer, manager);
- + }
- + else
- + {
- + writeDummyInfo(buffer);
- + }
- + }
- +
- + private void writeFullInfo(WritableBuffer buffer, UniqueGachaManager manager)
- + {
- + buffer.writeInt(manager.getVisibleItems().size()); // show items size // int
- + for (UniqueGachaItemHolder item : manager.getVisibleItems())
- + {
- + buffer.writeShort(SHORT_PACKET_INFO); // current size // short
- + buffer.writeByte(item.getRank().getClientId()); // rank type // char
- + buffer.writeInt(item.getId()); // item type // int
- + buffer.writeLong(item.getCount()); // amount // long
- + buffer.writeDouble(getChance(manager.isShowProbability(), item.getItemChance())); // probability // double
- + }
- + buffer.writeInt(manager.getTotalRewardCount()); // reward item size // int
- + for (Set<UniqueGachaItemHolder> items : manager.getRewardItems().values())
- + {
- + for (UniqueGachaItemHolder item : items)
- + {
- + buffer.writeShort(SHORT_PACKET_INFO); // current size // short
- + buffer.writeByte(item.getRank().getClientId()); // rank type // char
- + buffer.writeInt(item.getId()); // item type // int
- + buffer.writeLong(item.getCount()); // amount // long
- + buffer.writeDouble(getChance(manager.isShowProbability(), item.getItemChance())); // probability // double
- + }
- + }
- + buffer.writeByte(1); // cost type // char // bool?
- + buffer.writeInt(manager.getCurrencyItemId()); // cost item type // int // item id
- + buffer.writeInt(manager.getGameCosts().size()); // cost amount item info // int
- + for (Map.Entry<Integer, Long> entry : manager.getGameCosts().entrySet())
- + {
- + buffer.writeInt(entry.getKey()); // game count // int
- + buffer.writeLong(entry.getValue()); // amount // long
- + }
- + }
- +
- + private void writeDummyInfo(WritableBuffer buffer)
- + {
- + buffer.writeInt(0); // show items size // int
- + buffer.writeInt(0); // reward item size // int
- + buffer.writeByte(0); // cost type // char // bool?
- + buffer.writeInt(0); // cost item type // int // item id
- + buffer.writeInt(0); // cost amount item info // int
- + }
- +
- + private double getChance(boolean showChance, int itemChance)
- + {
- + return showChance ? (double) ((double) itemChance / (double) UniqueGachaManager.MINIMUM_CHANCE) : 0;
- + }
- +}
- \ No newline at end of file
- Index: org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaSidebarInfo.java
- ===================================================================
- --- org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaSidebarInfo.java (nonexistent)
- +++ org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaSidebarInfo.java (working copy)
- @@ -0,0 +1,41 @@
- +/*
- + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
- + * This file is part of the Hi5.ge project.
- + *
- + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
- + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
- + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
- + *
- + * This program is intellectual property of hi5.ge and can't, be
- + * used for any commercial or financial use without the permission
- + * of the rightful owners
- + */
- +package org.l2jmobius.gameserver.network.serverpackets.gacha;
- +
- +import org.l2jmobius.commons.network.WritableBuffer;
- +import org.l2jmobius.gameserver.network.GameClient;
- +import org.l2jmobius.gameserver.network.ServerPackets;
- +import org.l2jmobius.gameserver.network.serverpackets.ServerPacket;
- +
- +/**
- + * @author Index
- + */
- +public class UniqueGachaSidebarInfo extends ServerPacket
- +{
- + public final static UniqueGachaSidebarInfo GACHA_ON = new UniqueGachaSidebarInfo(true);
- + public final static UniqueGachaSidebarInfo GACHA_OFF = new UniqueGachaSidebarInfo(false);
- +
- + private final boolean _turnedOn;
- +
- + private UniqueGachaSidebarInfo(boolean turnedOn)
- + {
- + _turnedOn = turnedOn;
- + }
- +
- + @Override
- + public void writeImpl(GameClient client, WritableBuffer buffer)
- + {
- + ServerPackets.EX_UNIQUE_GACHA_SIDEBAR_INFO.writeId(this, buffer);
- + buffer.writeByte(_turnedOn ? 1 : 0);
- + }
- +}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement