Advertisement
gigilo1968

Gacha

Mar 24th, 2024
538
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 60.44 KB | None | 0 0
  1. Index: org/l2jmobius/gameserver/enums/ItemLocation.java
  2. ===================================================================
  3. --- org/l2jmobius/gameserver/enums/ItemLocation.java    (revision 650)
  4. +++ org/l2jmobius/gameserver/enums/ItemLocation.java    (working copy)
  5. @@ -9,22 +9,24 @@
  6.   * This program is intellectual property of hi5.ge and can't, be
  7.  * used for any commercial or financial use without the permission
  8.  * of the rightful owners
  9. - */
  10. -package org.l2jmobius.gameserver.enums;
  11. -
  12. -public enum ItemLocation
  13. -{
  14. -   VOID,
  15. -   INVENTORY,
  16. -   PAPERDOLL,
  17. -   WAREHOUSE,
  18. -   CLANWH,
  19. -   PET,
  20. -   PET_EQUIP,
  21. -   LEASE,
  22. -   REFUND,
  23. -   MAIL,
  24. -   FREIGHT,
  25. -   COMMISSION,
  26. -   EXCHANGE
  27. -}
  28. + */
  29. +package org.l2jmobius.gameserver.enums;
  30. +
  31. +public enum ItemLocation
  32. +{
  33. +   VOID,
  34. +   INVENTORY,
  35. +   PAPERDOLL,
  36. +   WAREHOUSE,
  37. +   CLANWH,
  38. +   PET,
  39. +   PET_EQUIP,
  40. +   LEASE,
  41. +   REFUND,
  42. +   MAIL,
  43. +   FREIGHT,
  44. +   COMMISSION,
  45. +   EXCHANGE,
  46. +   RESTORE,
  47. +   GACHA
  48. +}
  49. Index: org/l2jmobius/gameserver/enums/UniqueGachaRank.java
  50. ===================================================================
  51. --- org/l2jmobius/gameserver/enums/UniqueGachaRank.java (nonexistent)
  52. +++ org/l2jmobius/gameserver/enums/UniqueGachaRank.java (working copy)
  53. @@ -0,0 +1,53 @@
  54. +/*
  55. + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
  56. + * This file is part of the Hi5.ge project.
  57. + *
  58. + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
  59. + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
  60. + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
  61. + *
  62. + * This program is intellectual property of hi5.ge and can't, be
  63. + * used for any commercial or financial use without the permission
  64. + * of the rightful owners
  65. + */
  66. +package org.l2jmobius.gameserver.enums;
  67. +
  68. +import java.util.HashMap;
  69. +import java.util.Map;
  70. +
  71. +/**
  72. + * @author Index
  73. + */
  74. +public enum UniqueGachaRank
  75. +{
  76. +   RANK_UR(1),
  77. +   RANK_SR(2),
  78. +   RANK_R(3),;
  79. +  
  80. +   private final int _clientId;
  81. +  
  82. +   private final static Map<Integer, UniqueGachaRank> VALUES;
  83. +   static
  84. +   {
  85. +       VALUES = new HashMap<>(UniqueGachaRank.values().length);
  86. +       for (UniqueGachaRank rank : values())
  87. +       {
  88. +           VALUES.put(rank.getClientId(), rank);
  89. +       }
  90. +   }
  91. +  
  92. +   public static UniqueGachaRank getRankByClientId(int clientId)
  93. +   {
  94. +       return VALUES.getOrDefault(clientId, null);
  95. +   }
  96. +  
  97. +   UniqueGachaRank(int clientId)
  98. +   {
  99. +       _clientId = clientId;
  100. +   }
  101. +  
  102. +   public int getClientId()
  103. +   {
  104. +       return _clientId;
  105. +   }
  106. +}
  107. \ No newline at end of file
  108. Index: org/l2jmobius/gameserver/instancemanager/events/UniqueGachaManager.java
  109. ===================================================================
  110. --- org/l2jmobius/gameserver/instancemanager/events/UniqueGachaManager.java (nonexistent)
  111. +++ org/l2jmobius/gameserver/instancemanager/events/UniqueGachaManager.java (working copy)
  112. @@ -0,0 +1,556 @@
  113. +/*
  114. + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
  115. + * This file is part of the Hi5.ge project.
  116. + *
  117. + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
  118. + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
  119. + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
  120. + *
  121. + * This program is intellectual property of hi5.ge and can't, be
  122. + * used for any commercial or financial use without the permission
  123. + * of the rightful owners
  124. + */
  125. +package org.l2jmobius.gameserver.instancemanager.events;
  126. +
  127. +import java.sql.Connection;
  128. +import java.sql.PreparedStatement;
  129. +import java.sql.ResultSet;
  130. +import java.sql.SQLException;
  131. +import java.sql.Statement;
  132. +import java.util.ArrayList;
  133. +import java.util.Collection;
  134. +import java.util.Collections;
  135. +import java.util.Comparator;
  136. +import java.util.HashMap;
  137. +import java.util.HashSet;
  138. +import java.util.LinkedList;
  139. +import java.util.List;
  140. +import java.util.Map;
  141. +import java.util.Set;
  142. +import java.util.concurrent.TimeUnit;
  143. +
  144. +import org.l2jmobius.commons.database.DatabaseFactory;
  145. +import org.l2jmobius.commons.threads.ThreadPool;
  146. +import org.l2jmobius.commons.util.Rnd;
  147. +import org.l2jmobius.gameserver.data.xml.ItemData;
  148. +import org.l2jmobius.gameserver.enums.UniqueGachaRank;
  149. +import org.l2jmobius.gameserver.instancemanager.QuestManager;
  150. +import org.l2jmobius.gameserver.model.StatSet;
  151. +import org.l2jmobius.gameserver.model.actor.Player;
  152. +import org.l2jmobius.gameserver.model.events.Containers;
  153. +import org.l2jmobius.gameserver.model.events.EventType;
  154. +import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogin;
  155. +import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogout;
  156. +import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
  157. +import org.l2jmobius.gameserver.model.holders.ItemHolder;
  158. +import org.l2jmobius.gameserver.model.holders.uniquegacha.ItemTimeStampHolder;
  159. +import org.l2jmobius.gameserver.model.holders.uniquegacha.UniqueGachaItemHolder;
  160. +import org.l2jmobius.gameserver.model.item.ItemTemplate;
  161. +import org.l2jmobius.gameserver.model.item.instance.Item;
  162. +import org.l2jmobius.gameserver.model.itemcontainer.PlayerGachaWarehouse;
  163. +import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
  164. +import org.l2jmobius.gameserver.model.quest.Quest;
  165. +import org.l2jmobius.gameserver.network.serverpackets.gacha.UniqueGachaSidebarInfo;
  166. +
  167. +import javafx.util.Pair;
  168. +
  169. +/**
  170. + * @author Index
  171. + */
  172. +public class UniqueGachaManager
  173. +{
  174. +   /**
  175. +    * @implNote 0.000001 MAXIMAL OF MINIMUM VALUE
  176. +    */
  177. +   public final static int MINIMUM_CHANCE = 1_000_000;
  178. +   public final static int MINIMUM_CHANCE_AFTER_DOT = 6;
  179. +   public final static String GACHA_PLAYER_VARIABLE = "GACHA_ROLL_COUNT";
  180. +   public final static String GACHA_LOCK_PLAYER_VARIABLE = "UniqueGachaRoll";
  181. +   private final static LinkedList<ItemTimeStampHolder> EMPTY_LINKED_LIST = new LinkedList<>();
  182. +   private final Set<UniqueGachaItemHolder> _visibleItems = new HashSet<>();
  183. +   private final Map<UniqueGachaRank, Set<UniqueGachaItemHolder>> _rewardItems = new HashMap<>();
  184. +   private final Map<UniqueGachaRank, Integer> _rewardChance = new HashMap<>();
  185. +   private final Map<Integer, Long> _gameCosts = new HashMap<>();
  186. +  
  187. +   private final Map<Player, PlayerGachaWarehouse> _temporaryWarehouse = new HashMap<>();
  188. +   private final Map<Integer, LinkedList<ItemTimeStampHolder>> _gachaHistory = new HashMap<>();
  189. +  
  190. +   private boolean _isActive;
  191. +   private long _activeUntilPeriod;
  192. +   private int _guaranteeRoll;
  193. +   private boolean _showProbability;
  194. +   private int _currencyItemId;
  195. +   private int _totalRewardCount = 0;
  196. +   private int _totalChanceSumma = 0;
  197. +  
  198. +   public UniqueGachaManager()
  199. +   {
  200. +       restoreGachaHistory(_gachaHistory);
  201. +       ThreadPool.scheduleAtFixedRate(() -> storeGachaHistory(_gachaHistory), TimeUnit.MINUTES.toMillis(5), TimeUnit.MINUTES.toMillis(5));
  202. +       Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_LOGIN, (final OnPlayerLogin event) -> onPlayerLogin(event), this));
  203. +       Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_LOGOUT, (final OnPlayerLogout event) -> onPlayerLogout(event), this));
  204. +   }
  205. +  
  206. +   public void reload()
  207. +   {
  208. +       final Quest quest = QuestManager.getInstance().getQuest("UniqueGacha");
  209. +       if (quest == null)
  210. +       {
  211. +           return;
  212. +       }
  213. +       _totalRewardCount = 0;
  214. +       _totalChanceSumma = 0;
  215. +       _visibleItems.clear();
  216. +       _rewardItems.clear();
  217. +       _rewardChance.clear();
  218. +       _gameCosts.clear();
  219. +       quest.notifyEvent("RELOAD", null, null);
  220. +   }
  221. +  
  222. +   public void setParameters(StatSet params)
  223. +   {
  224. +       _isActive = params.getBoolean("isActive", false);
  225. +       _activeUntilPeriod = params.getLong("activeUntilPeriod", 0L);
  226. +       _guaranteeRoll = params.getInt("guaranteeRoll", 200);
  227. +       _showProbability = params.getBoolean("showProbability", false);
  228. +       _currencyItemId = params.getInt("currencyItemId", 57);
  229. +   }
  230. +  
  231. +   public void addReward(UniqueGachaRank rank, int itemId, long itemCount, int itemChance, int enchantLevel)
  232. +   {
  233. +       _totalRewardCount += 1;
  234. +       _totalChanceSumma += itemChance;
  235. +       _rewardItems.putIfAbsent(rank, new HashSet<>());
  236. +       _rewardItems.get(rank).add(new UniqueGachaItemHolder(itemId, itemCount, itemChance, enchantLevel, rank));
  237. +   }
  238. +  
  239. +   public void addGameCost(int rollCount, long itemCount)
  240. +   {
  241. +       _gameCosts.put(rollCount, itemCount);
  242. +   }
  243. +  
  244. +   public void recalculateChances()
  245. +   {
  246. +       for (UniqueGachaRank rank : _rewardItems.keySet())
  247. +       {
  248. +           final Set<UniqueGachaItemHolder> items = _rewardItems.get(rank);
  249. +           int totalChance = 0;
  250. +           for (UniqueGachaItemHolder item : items)
  251. +           {
  252. +               totalChance += item.getItemChance();
  253. +           }
  254. +           _rewardChance.put(rank, totalChance);
  255. +       }
  256. +       recalculateVisibleItems();
  257. +   }
  258. +  
  259. +   private void recalculateVisibleItems()
  260. +   {
  261. +       final List<UniqueGachaItemHolder> _rewards = new ArrayList<>(_rewardItems.getOrDefault(UniqueGachaRank.RANK_UR, Set.of()));
  262. +       _rewards.sort(Comparator.comparingInt(UniqueGachaItemHolder::getItemChance));
  263. +       if (_rewards.isEmpty())
  264. +       {
  265. +           return;
  266. +       }
  267. +       _visibleItems.clear();
  268. +       _visibleItems.addAll(_rewards.subList(0, Math.min(4, (_rewards.size()))));
  269. +       _rewards.clear();
  270. +   }
  271. +  
  272. +   private void onPlayerLogin(OnPlayerLogin event)
  273. +   {
  274. +       final Player player = event == null ? null : event.getPlayer();
  275. +       if (player == null)
  276. +       {
  277. +           return;
  278. +       }
  279. +       if (isActive())
  280. +       {
  281. +           PlayerGachaWarehouse warehouse = _temporaryWarehouse.getOrDefault(player, null);
  282. +           if (warehouse == null)
  283. +           {
  284. +               warehouse = new PlayerGachaWarehouse(player);
  285. +               warehouse.restore();
  286. +               _temporaryWarehouse.put(player, warehouse);
  287. +           }
  288. +       }
  289. +       player.sendPacket(isActive() ? UniqueGachaSidebarInfo.GACHA_ON : UniqueGachaSidebarInfo.GACHA_OFF);
  290. +   }
  291. +  
  292. +   private void onPlayerLogout(OnPlayerLogout event)
  293. +   {
  294. +       final Player player = event == null ? null : event.getPlayer();
  295. +       if (player == null)
  296. +       {
  297. +           return;
  298. +       }
  299. +       PlayerGachaWarehouse warehouse = _temporaryWarehouse.getOrDefault(player, null);
  300. +       if (warehouse != null)
  301. +       {
  302. +           warehouse.deleteMe();
  303. +           _temporaryWarehouse.remove(player);
  304. +       }
  305. +   }
  306. +  
  307. +   public Set<UniqueGachaItemHolder> getVisibleItems()
  308. +   {
  309. +       return _visibleItems;
  310. +   }
  311. +  
  312. +   public Map<UniqueGachaRank, Set<UniqueGachaItemHolder>> getRewardItems()
  313. +   {
  314. +       return _rewardItems;
  315. +   }
  316. +  
  317. +   public Map<Integer, Long> getGameCosts()
  318. +   {
  319. +       return _gameCosts;
  320. +   }
  321. +  
  322. +   public boolean isActive()
  323. +   {
  324. +       return _isActive;
  325. +   }
  326. +  
  327. +   public long getActiveUntilPeriod()
  328. +   {
  329. +       return _activeUntilPeriod;
  330. +   }
  331. +  
  332. +   public int getGuaranteeRoll()
  333. +   {
  334. +       return _guaranteeRoll;
  335. +   }
  336. +  
  337. +   public boolean isShowProbability()
  338. +   {
  339. +       return _showProbability;
  340. +   }
  341. +  
  342. +   public int getCurrencyItemId()
  343. +   {
  344. +       return _currencyItemId;
  345. +   }
  346. +  
  347. +   public int getCurrencyCount(Player player)
  348. +   {
  349. +       long count;
  350. +       if (true)
  351. +       {
  352. +           count = player.getInventory().getInventoryItemCount(getCurrencyItemId(), -1);
  353. +       }
  354. +       return (int) Math.min(Integer.MAX_VALUE, count);
  355. +   }
  356. +  
  357. +   private void removeCurrency(Player player, long count)
  358. +   {
  359. +       if (true)
  360. +       {
  361. +           final PlayerInventory inv = player.getInventory();
  362. +           if ((inv == null) || !inv.canManipulateWithItemId(_currencyItemId))
  363. +           {
  364. +               return;
  365. +           }
  366. +           final Item item = inv.getItemByItemId(_currencyItemId);
  367. +           if (item == null)
  368. +           {
  369. +               return;
  370. +           }
  371. +           inv.destroyItem("gacha", item, count, player, null);
  372. +       }
  373. +   }
  374. +  
  375. +   @SuppressWarnings("unused")
  376. +   public int getStepsToGuaranteedReward(Player player)
  377. +   {
  378. +       if (true)
  379. +       {
  380. +           return _guaranteeRoll - player.getVariables().getInt(GACHA_PLAYER_VARIABLE, 0);
  381. +       }
  382. +       return 0;
  383. +   }
  384. +  
  385. +   public Pair<List<UniqueGachaItemHolder>, Boolean> tryToRoll(Player player, int rollCount)
  386. +   {
  387. +       boolean rare = false;
  388. +       final List<UniqueGachaItemHolder> rewards = new ArrayList<>();
  389. +       if (!checkRequirements(player, rollCount))
  390. +       {
  391. +           return returnEmptyList();
  392. +       }
  393. +       try
  394. +       {
  395. +           player.getVariables().set(GACHA_LOCK_PLAYER_VARIABLE, true);
  396. +           removeCurrency(player, _gameCosts.get(rollCount));
  397. +           int playerRollProgress = player.getVariables().getInt(GACHA_PLAYER_VARIABLE, 0);
  398. +           for (int roll = 0; roll < rollCount; roll++)
  399. +           {
  400. +               playerRollProgress += 1;
  401. +               final boolean isGuaranteed = playerRollProgress >= _guaranteeRoll;
  402. +               playerRollProgress = isGuaranteed ? 0 : playerRollProgress;
  403. +               final UniqueGachaRank rank = randomRank(isGuaranteed);
  404. +               final UniqueGachaItemHolder item = getRandomReward(rank);
  405. +               rare = rare || (item.getRank().equals(UniqueGachaRank.RANK_SR) || item.getRank().equals(UniqueGachaRank.RANK_UR));
  406. +               addItemToTemporaryWarehouse(player, item);
  407. +               rewards.add(item);
  408. +               addToHistory(player, item, roll);
  409. +           }
  410. +           player.getVariables().set(GACHA_PLAYER_VARIABLE, playerRollProgress);
  411. +       }
  412. +       finally
  413. +       {
  414. +           player.getVariables().remove(GACHA_LOCK_PLAYER_VARIABLE);
  415. +       }
  416. +       return new Pair<>(rewards, rare);
  417. +   }
  418. +  
  419. +   private boolean checkRequirements(Player player, int rollCount)
  420. +   {
  421. +       if (player.getVariables().getBoolean(GACHA_LOCK_PLAYER_VARIABLE, false))
  422. +       {
  423. +           return false;
  424. +       }
  425. +       final long currencyCount = _gameCosts.getOrDefault(rollCount, -1L);
  426. +       if (currencyCount == -1L)
  427. +       {
  428. +           return false;
  429. +       }
  430. +       final PlayerInventory inv = player.getInventory();
  431. +       if (inv == null)
  432. +       {
  433. +           return false;
  434. +       }
  435. +       if (true && !inv.canManipulateWithItemId(_currencyItemId))
  436. +       {
  437. +           return false;
  438. +       }
  439. +       if (getCurrencyCount(player) < currencyCount)
  440. +       {
  441. +           return false;
  442. +       }
  443. +       final PlayerGachaWarehouse warehouse = _temporaryWarehouse.getOrDefault(player, null);
  444. +       if (warehouse == null)
  445. +       {
  446. +           return false;
  447. +       }
  448. +       if (warehouse.getSize() >= PlayerGachaWarehouse.MAXIMUM_TEMPORARY_WAREHOUSE_COUNT)
  449. +       {
  450. +           return false;
  451. +       }
  452. +       return true;
  453. +   }
  454. +  
  455. +   private void addToHistory(Player player, UniqueGachaItemHolder item, int roll)
  456. +   {
  457. +       final String count = String.valueOf(roll);
  458. +       final String timeStamp = String.valueOf(System.currentTimeMillis() / 1000L) + "0".repeat(3 - count.length()) + (count);
  459. +       _gachaHistory.computeIfAbsent(player.getObjectId(), v -> new LinkedList<>()).addLast(new ItemTimeStampHolder(item.getId(), item.getCount(), item.getEnchantLevel(), item.getRank(), Long.parseLong(timeStamp), false));
  460. +   }
  461. +  
  462. +   private boolean addItemToTemporaryWarehouse(Player player, UniqueGachaItemHolder reward)
  463. +   {
  464. +       final PlayerGachaWarehouse warehouse = _temporaryWarehouse.getOrDefault(player, null);
  465. +       if (warehouse == null)
  466. +       {
  467. +           return false;
  468. +       }
  469. +       final ItemTemplate template = ItemData.getInstance().getTemplate(reward.getId());
  470. +       if (template == null)
  471. +       {
  472. +           return false;
  473. +       }
  474. +       boolean isSuccess = false;
  475. +       if (!template.isStackable())
  476. +       {
  477. +           for (long index = 0; index < reward.getCount(); index++)
  478. +           {
  479. +               final Item item = warehouse.addItem("Gacha Reward", reward.getId(), reward.getCount(), player, null);
  480. +               if (item == null)
  481. +               {
  482. +                   isSuccess = false;
  483. +                   break;
  484. +               }
  485. +               isSuccess = true;
  486. +           }
  487. +       }
  488. +       else
  489. +       {
  490. +           isSuccess = warehouse.addItem("Gacha Reward", reward.getId(), reward.getCount(), player, null) != null;
  491. +       }
  492. +       return isSuccess;
  493. +   }
  494. +  
  495. +   @SuppressWarnings("null")
  496. +   public boolean receiveItemsFromTemporaryWarehouse(Player player, List<ItemHolder> requestedItems)
  497. +   {
  498. +       final PlayerGachaWarehouse warehouse = _temporaryWarehouse.getOrDefault(player, null);
  499. +       final PlayerInventory inventory = player.getInventory();
  500. +       if ((warehouse == null) || (inventory == null))
  501. +       {
  502. +           return false;
  503. +       }
  504. +       // check items
  505. +       for (ItemHolder requestedItem : requestedItems)
  506. +       {
  507. +           final ItemTemplate template = ItemData.getInstance().getTemplate(requestedItem.getId());
  508. +           final List<Item> item = template == null ? null : template.isStackable() ? List.of(warehouse.getItemByItemId(requestedItem.getId())) : new ArrayList<>(warehouse.getAllItemsByItemId(requestedItem.getId()));
  509. +           if ((item == null) || item.isEmpty())
  510. +           {
  511. +               return false;
  512. +           }
  513. +           if (template.isStackable() ? item.get(0).getCount() < requestedItem.getCount() : item.size() < requestedItem.getCount())
  514. +           {
  515. +               return false;
  516. +           }
  517. +       }
  518. +       for (ItemHolder requestedItem : requestedItems)
  519. +       {
  520. +           final ItemTemplate template = ItemData.getInstance().getTemplate(requestedItem.getId());
  521. +           final List<Item> item = template.isStackable() ? List.of(warehouse.getItemByItemId(requestedItem.getId())) : new ArrayList<>(warehouse.getAllItemsByItemId(requestedItem.getId()));
  522. +           for (Item wareHouseItem : item)
  523. +           {
  524. +               warehouse.transferItem("Gacha receive from Warehous", wareHouseItem.getObjectId(), (template.isStackable() ? requestedItem.getCount() : 1), inventory, player, null);
  525. +           }
  526. +       }
  527. +       return true;
  528. +   }
  529. +  
  530. +   public Collection<Item> getTemporaryWarehouse(Player player)
  531. +   {
  532. +       final PlayerGachaWarehouse warehouse = _temporaryWarehouse.getOrDefault(player, null);
  533. +       if (warehouse == null)
  534. +       {
  535. +           return Collections.emptyList();
  536. +       }
  537. +       return warehouse.getItems();
  538. +   }
  539. +  
  540. +   private UniqueGachaRank randomRank(boolean isGuaranteed)
  541. +   {
  542. +       int sumChance = 0;
  543. +       final int rollRank = Rnd.get(0, _totalChanceSumma);
  544. +       final UniqueGachaRank rank;
  545. +       if ((isGuaranteed && (Rnd.get(0, 100) <= 10)) || (rollRank <= (sumChance += _rewardChance.getOrDefault(UniqueGachaRank.RANK_UR, 0))))
  546. +       {
  547. +           rank = UniqueGachaRank.RANK_UR;
  548. +       }
  549. +       else if (isGuaranteed || (rollRank <= (sumChance + _rewardChance.getOrDefault(UniqueGachaRank.RANK_SR, 0))))
  550. +       {
  551. +           rank = UniqueGachaRank.RANK_SR;
  552. +       }
  553. +       else
  554. +       {
  555. +           rank = UniqueGachaRank.RANK_R;
  556. +       }
  557. +       return rank;
  558. +   }
  559. +  
  560. +   private UniqueGachaItemHolder getRandomReward(UniqueGachaRank rank)
  561. +   {
  562. +       final List<UniqueGachaItemHolder> rollRewards = new ArrayList<>(_rewardItems.getOrDefault(rank, Set.of()));
  563. +       Collections.shuffle(rollRewards);
  564. +       int rollChance = 0;
  565. +       final int rollReward = Rnd.get(0, _rewardChance.getOrDefault(rank, MINIMUM_CHANCE));
  566. +       UniqueGachaItemHolder rewardItem = null;
  567. +       for (UniqueGachaItemHolder item : rollRewards)
  568. +       {
  569. +           rewardItem = item;
  570. +           rollChance += item.getItemChance();
  571. +           if (rollChance >= rollReward)
  572. +           {
  573. +               break;
  574. +           }
  575. +       }
  576. +       return rewardItem;
  577. +   }
  578. +  
  579. +   public int getTotalRewardCount()
  580. +   {
  581. +       return _totalRewardCount;
  582. +   }
  583. +  
  584. +   public List<ItemTimeStampHolder> getGachaCharacterHistory(Player player)
  585. +   {
  586. +       return _gachaHistory.getOrDefault(player.getObjectId(), EMPTY_LINKED_LIST);
  587. +   }
  588. +  
  589. +   private static void restoreGachaHistory(Map<Integer, LinkedList<ItemTimeStampHolder>> history)
  590. +   {
  591. +       try (Connection con = DatabaseFactory.getConnection();
  592. +           Statement st = con.createStatement();
  593. +           ResultSet rset = st.executeQuery("SELECT * FROM character_gacha_history ORDER BY receive_time DESC"))
  594. +       {
  595. +           while (rset.next())
  596. +           {
  597. +               final int characterId = rset.getInt("char_id");
  598. +               final int itemId = rset.getInt("item_id");
  599. +               final long itemCount = rset.getLong("item_count");
  600. +               final int enchantLevel = rset.getInt("item_enchant");
  601. +               final int itemRank = rset.getInt("item_rank");
  602. +               final long receiveTime = rset.getLong("receive_time");
  603. +               history.computeIfAbsent(characterId, v -> new LinkedList<>()).addLast(new ItemTimeStampHolder(itemId, itemCount, enchantLevel, UniqueGachaRank.getRankByClientId(itemRank), receiveTime, true));
  604. +           }
  605. +       }
  606. +       catch (Exception e)
  607. +       {
  608. +           e.printStackTrace();
  609. +       }
  610. +   }
  611. +  
  612. +   private static void storeGachaHistory(Map<Integer, LinkedList<ItemTimeStampHolder>> history)
  613. +   {
  614. +       final Map<Integer, LinkedList<ItemTimeStampHolder>> map = new HashMap<>(history);
  615. +       try (Connection con = DatabaseFactory.getConnection();
  616. +           PreparedStatement statement = con.prepareStatement("INSERT INTO `character_gacha_history`(`char_id`, `item_id`, `item_count`, `item_enchant`, `item_rank`, `receive_time`) VALUES(?, ?, ?, ?, ?, ?)"))
  617. +       {
  618. +           boolean containsUpdate = false;
  619. +           for (Map.Entry<Integer, LinkedList<ItemTimeStampHolder>> entry : map.entrySet())
  620. +           {
  621. +               final int charId = entry.getKey();
  622. +               final LinkedList<ItemTimeStampHolder> list = new LinkedList<>(entry.getValue());
  623. +               for (ItemTimeStampHolder item : list)
  624. +               {
  625. +                   if (item.getStoredStatus())
  626. +                   {
  627. +                       continue;
  628. +                   }
  629. +                   statement.setInt(1, charId);
  630. +                   statement.setInt(2, item.getId());
  631. +                   statement.setLong(3, item.getCount());
  632. +                   statement.setInt(4, item.getEnchantLevel());
  633. +                   statement.setInt(5, item.getRank().getClientId());
  634. +                   statement.setLong(6, item.getTimeStamp());
  635. +                   statement.addBatch();
  636. +                   containsUpdate = true;
  637. +               }
  638. +           }
  639. +           if (containsUpdate)
  640. +           {
  641. +               statement.executeBatch();
  642. +           }
  643. +           else
  644. +           {
  645. +               statement.close();
  646. +           }
  647. +       }
  648. +       catch (SQLException e)
  649. +       {
  650. +           e.printStackTrace();
  651. +       }
  652. +   }
  653. +  
  654. +   private static Pair<List<UniqueGachaItemHolder>, Boolean> returnEmptyList()
  655. +   {
  656. +       return new Pair<>(Collections.emptyList(), false);
  657. +   }
  658. +  
  659. +   public static UniqueGachaManager getInstance()
  660. +   {
  661. +       return UniqueGachaManager.SingletonHolder.INSTANCE;
  662. +   }
  663. +  
  664. +   private static class SingletonHolder
  665. +   {
  666. +       protected static final UniqueGachaManager INSTANCE = new UniqueGachaManager();
  667. +   }
  668. +}
  669. Index: org/l2jmobius/gameserver/model/holders/uniquegacha/ItemTimeStampHolder.java
  670. ===================================================================
  671. --- org/l2jmobius/gameserver/model/holders/uniquegacha/ItemTimeStampHolder.java (nonexistent)
  672. +++ org/l2jmobius/gameserver/model/holders/uniquegacha/ItemTimeStampHolder.java (working copy)
  673. @@ -0,0 +1,53 @@
  674. +/*
  675. + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
  676. + * This file is part of the Hi5.ge project.
  677. + *
  678. + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
  679. + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
  680. + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
  681. + *
  682. + * This program is intellectual property of hi5.ge and can't, be
  683. + * used for any commercial or financial use without the permission
  684. + * of the rightful owners
  685. + */
  686. +package org.l2jmobius.gameserver.model.holders.uniquegacha;
  687. +
  688. +import org.l2jmobius.gameserver.enums.UniqueGachaRank;
  689. +
  690. +/**
  691. + * @author Index
  692. + */
  693. +public class ItemTimeStampHolder extends UniqueGachaItemHolder
  694. +{
  695. +   private final long _timeStamp;
  696. +   private boolean _storedInDatabase;
  697. +  
  698. +   public ItemTimeStampHolder(int itemId, long itemCount, int enchantLevel, UniqueGachaRank rank, long timeStamp, boolean stored)
  699. +   {
  700. +       super(itemId, itemCount, 0, enchantLevel, rank);
  701. +       _timeStamp = timeStamp;
  702. +       _storedInDatabase = stored;
  703. +   }
  704. +  
  705. +   public long getTimeStamp()
  706. +   {
  707. +       return _timeStamp;
  708. +   }
  709. +  
  710. +   public int getTimeStampFromNow()
  711. +   {
  712. +       final long timeOfReceive = _timeStamp / 1000L;
  713. +       final long currentTime = System.currentTimeMillis() / 1000L;
  714. +       return (int) (currentTime - timeOfReceive);
  715. +   }
  716. +  
  717. +   public boolean getStoredStatus()
  718. +   {
  719. +       if (_storedInDatabase)
  720. +       {
  721. +           return true;
  722. +       }
  723. +       _storedInDatabase = true;
  724. +       return false;
  725. +   }
  726. +}
  727. Index: org/l2jmobius/gameserver/model/holders/uniquegacha/UniqueGachaItemHolder.java
  728. ===================================================================
  729. --- org/l2jmobius/gameserver/model/holders/uniquegacha/UniqueGachaItemHolder.java   (nonexistent)
  730. +++ org/l2jmobius/gameserver/model/holders/uniquegacha/UniqueGachaItemHolder.java   (working copy)
  731. @@ -0,0 +1,49 @@
  732. +/*
  733. + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
  734. + * This file is part of the Hi5.ge project.
  735. + *
  736. + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
  737. + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
  738. + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
  739. + *
  740. + * This program is intellectual property of hi5.ge and can't, be
  741. + * used for any commercial or financial use without the permission
  742. + * of the rightful owners
  743. + */
  744. +package org.l2jmobius.gameserver.model.holders.uniquegacha;
  745. +
  746. +import org.l2jmobius.gameserver.enums.UniqueGachaRank;
  747. +import org.l2jmobius.gameserver.model.holders.ItemHolder;
  748. +
  749. +/**
  750. + * @author Index
  751. + */
  752. +public class UniqueGachaItemHolder extends ItemHolder
  753. +{
  754. +   private final int _itemChance;
  755. +   private final int _enchantLevel;
  756. +   private final UniqueGachaRank _rank;
  757. +  
  758. +   public UniqueGachaItemHolder(int itemId, long itemCount, int itemChance, int enchantLevel, UniqueGachaRank rank)
  759. +   {
  760. +       super(itemId, itemCount);
  761. +       _itemChance = itemChance;
  762. +       _enchantLevel = enchantLevel;
  763. +       _rank = rank;
  764. +   }
  765. +  
  766. +   public int getItemChance()
  767. +   {
  768. +       return _itemChance;
  769. +   }
  770. +  
  771. +   public int getEnchantLevel()
  772. +   {
  773. +       return _enchantLevel;
  774. +   }
  775. +  
  776. +   public UniqueGachaRank getRank()
  777. +   {
  778. +       return _rank;
  779. +   }
  780. +}
  781. \ No newline at end of file
  782. Index: org/l2jmobius/gameserver/model/itemcontainer/PlayerGachaWarehouse.java
  783. ===================================================================
  784. --- org/l2jmobius/gameserver/model/itemcontainer/PlayerGachaWarehouse.java  (nonexistent)
  785. +++ org/l2jmobius/gameserver/model/itemcontainer/PlayerGachaWarehouse.java  (working copy)
  786. @@ -0,0 +1,44 @@
  787. +/*
  788. + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
  789. + * This file is part of the Hi5.ge project.
  790. + *
  791. + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
  792. + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
  793. + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
  794. + *
  795. + * This program is intellectual property of hi5.ge and can't, be
  796. + * used for any commercial or financial use without the permission
  797. + * of the rightful owners
  798. + */
  799. +package org.l2jmobius.gameserver.model.itemcontainer;
  800. +
  801. +import org.l2jmobius.gameserver.enums.ItemLocation;
  802. +import org.l2jmobius.gameserver.model.actor.Creature;
  803. +import org.l2jmobius.gameserver.model.actor.Player;
  804. +
  805. +/**
  806. + * @author Index
  807. + */
  808. +public class PlayerGachaWarehouse extends Warehouse
  809. +{
  810. +   public final static int MAXIMUM_TEMPORARY_WAREHOUSE_COUNT = 1_100;
  811. +  
  812. +   private final Creature _owner;
  813. +  
  814. +   public PlayerGachaWarehouse(Player player)
  815. +   {
  816. +       _owner = player;
  817. +   }
  818. +  
  819. +   @Override
  820. +   protected Creature getOwner()
  821. +   {
  822. +       return _owner;
  823. +   }
  824. +  
  825. +   @Override
  826. +   protected ItemLocation getBaseLocation()
  827. +   {
  828. +       return ItemLocation.GACHA;
  829. +   }
  830. +}
  831. Index: org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaGame.java
  832. ===================================================================
  833. --- org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaGame.java (nonexistent)
  834. +++ org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaGame.java (working copy)
  835. @@ -0,0 +1,53 @@
  836. +/*
  837. + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
  838. + * This file is part of the Hi5.ge project.
  839. + *
  840. + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
  841. + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
  842. + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
  843. + *
  844. + * This program is intellectual property of hi5.ge and can't, be
  845. + * used for any commercial or financial use without the permission
  846. + * of the rightful owners
  847. + */
  848. +package org.l2jmobius.gameserver.network.clientpackets.gacha;
  849. +
  850. +import java.util.List;
  851. +
  852. +import org.l2jmobius.gameserver.instancemanager.events.UniqueGachaManager;
  853. +import org.l2jmobius.gameserver.model.actor.Player;
  854. +import org.l2jmobius.gameserver.model.holders.uniquegacha.UniqueGachaItemHolder;
  855. +import org.l2jmobius.gameserver.network.clientpackets.ClientPacket;
  856. +import org.l2jmobius.gameserver.network.serverpackets.gacha.UniqueGachaGame;
  857. +import org.l2jmobius.gameserver.network.serverpackets.gacha.UniqueGachaInvenAddItem;
  858. +
  859. +import javafx.util.Pair;
  860. +
  861. +/**
  862. + * @author Index
  863. + */
  864. +public class ExUniqueGachaGame extends ClientPacket
  865. +{
  866. +   private int _gameCount;
  867. +  
  868. +   @Override
  869. +   protected void readImpl()
  870. +   {
  871. +       _gameCount = readInt();
  872. +   }
  873. +  
  874. +   @Override
  875. +   protected void runImpl()
  876. +   {
  877. +       final Player player = getPlayer();
  878. +       if (player == null)
  879. +       {
  880. +           return;
  881. +       }
  882. +       final Pair<List<UniqueGachaItemHolder>, Boolean> pair = UniqueGachaManager.getInstance().tryToRoll(player, _gameCount);
  883. +       final List<UniqueGachaItemHolder> rewards = pair.getKey();
  884. +       final boolean rare = pair.getValue().booleanValue();
  885. +       player.sendPacket(new UniqueGachaGame(rewards.isEmpty() ? UniqueGachaGame.FAILURE : UniqueGachaGame.SUCCESS, player, rewards, rare));
  886. +       player.sendPacket(new UniqueGachaInvenAddItem(rewards));
  887. +   }
  888. +}
  889. \ No newline at end of file
  890. Index: org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaHistory.java
  891. ===================================================================
  892. --- org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaHistory.java  (nonexistent)
  893. +++ org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaHistory.java  (working copy)
  894. @@ -0,0 +1,48 @@
  895. +/*
  896. + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
  897. + * This file is part of the Hi5.ge project.
  898. + *
  899. + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
  900. + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
  901. + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
  902. + *
  903. + * This program is intellectual property of hi5.ge and can't, be
  904. + * used for any commercial or financial use without the permission
  905. + * of the rightful owners
  906. + */
  907. +package org.l2jmobius.gameserver.network.clientpackets.gacha;
  908. +
  909. +import java.util.List;
  910. +
  911. +import org.l2jmobius.gameserver.instancemanager.events.UniqueGachaManager;
  912. +import org.l2jmobius.gameserver.model.actor.Player;
  913. +import org.l2jmobius.gameserver.model.holders.uniquegacha.ItemTimeStampHolder;
  914. +import org.l2jmobius.gameserver.network.clientpackets.ClientPacket;
  915. +import org.l2jmobius.gameserver.network.serverpackets.gacha.UniqueGachaHistory;
  916. +
  917. +/**
  918. + * @author Index
  919. + */
  920. +public class ExUniqueGachaHistory extends ClientPacket
  921. +{
  922. +   @SuppressWarnings("unused")
  923. +   private int _inventoryType;
  924. +  
  925. +   @Override
  926. +   protected void readImpl()
  927. +   {
  928. +       _inventoryType = readByte();
  929. +   }
  930. +  
  931. +   @Override
  932. +   protected void runImpl()
  933. +   {
  934. +       final Player player = getPlayer();
  935. +       if (player == null)
  936. +       {
  937. +           return;
  938. +       }
  939. +       final List<ItemTimeStampHolder> itemHistory = UniqueGachaManager.getInstance().getGachaCharacterHistory(player);
  940. +       player.sendPacket(new UniqueGachaHistory(itemHistory));
  941. +   }
  942. +}
  943. Index: org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaInvenGetItem.java
  944. ===================================================================
  945. --- org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaInvenGetItem.java (nonexistent)
  946. +++ org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaInvenGetItem.java (working copy)
  947. @@ -0,0 +1,53 @@
  948. +/*
  949. + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
  950. + * This file is part of the Hi5.ge project.
  951. + *
  952. + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
  953. + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
  954. + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
  955. + *
  956. + * This program is intellectual property of hi5.ge and can't, be
  957. + * used for any commercial or financial use without the permission
  958. + * of the rightful owners
  959. + */
  960. +package org.l2jmobius.gameserver.network.clientpackets.gacha;
  961. +
  962. +import java.util.ArrayList;
  963. +import java.util.List;
  964. +
  965. +import org.l2jmobius.gameserver.instancemanager.events.UniqueGachaManager;
  966. +import org.l2jmobius.gameserver.model.actor.Player;
  967. +import org.l2jmobius.gameserver.model.holders.ItemHolder;
  968. +import org.l2jmobius.gameserver.network.clientpackets.ClientPacket;
  969. +import org.l2jmobius.gameserver.network.serverpackets.gacha.UniqueGachaInvenGetItem;
  970. +
  971. +/**
  972. + * @author Index
  973. + */
  974. +public class ExUniqueGachaInvenGetItem extends ClientPacket
  975. +{
  976. +   private List<ItemHolder> _requestedItems;
  977. +  
  978. +   @Override
  979. +   protected void readImpl()
  980. +   {
  981. +       final int size = readInt();
  982. +       _requestedItems = new ArrayList<>(size);
  983. +       for (int index = 0; index < size; index++)
  984. +       {
  985. +           _requestedItems.add(new ItemHolder(readInt(), readLong()));
  986. +       }
  987. +   }
  988. +  
  989. +   @Override
  990. +   protected void runImpl()
  991. +   {
  992. +       final Player player = getPlayer();
  993. +       if (player == null)
  994. +       {
  995. +           return;
  996. +       }
  997. +       final boolean isSuccess = UniqueGachaManager.getInstance().receiveItemsFromTemporaryWarehouse(player, _requestedItems);
  998. +       player.sendPacket(new UniqueGachaInvenGetItem(isSuccess));
  999. +   }
  1000. +}
  1001. \ No newline at end of file
  1002. Index: org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaInvenItemList.java
  1003. ===================================================================
  1004. --- org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaInvenItemList.java    (nonexistent)
  1005. +++ org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaInvenItemList.java    (working copy)
  1006. @@ -0,0 +1,58 @@
  1007. +/*
  1008. + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
  1009. + * This file is part of the Hi5.ge project.
  1010. + *
  1011. + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
  1012. + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
  1013. + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
  1014. + *
  1015. + * This program is intellectual property of hi5.ge and can't, be
  1016. + * used for any commercial or financial use without the permission
  1017. + * of the rightful owners
  1018. + */
  1019. +package org.l2jmobius.gameserver.network.clientpackets.gacha;
  1020. +
  1021. +import java.util.ArrayList;
  1022. +import java.util.List;
  1023. +
  1024. +import org.l2jmobius.gameserver.instancemanager.events.UniqueGachaManager;
  1025. +import org.l2jmobius.gameserver.model.actor.Player;
  1026. +import org.l2jmobius.gameserver.model.item.instance.Item;
  1027. +import org.l2jmobius.gameserver.network.clientpackets.ClientPacket;
  1028. +import org.l2jmobius.gameserver.network.serverpackets.gacha.UniqueGachaInvenItemList;
  1029. +
  1030. +/**
  1031. + * @author Index
  1032. + */
  1033. +public class ExUniqueGachaInvenItemList extends ClientPacket
  1034. +{
  1035. +   @SuppressWarnings("unused")
  1036. +   private int _inventoryType;
  1037. +  
  1038. +   @Override
  1039. +   protected void readImpl()
  1040. +   {
  1041. +       _inventoryType = readByte();
  1042. +   }
  1043. +  
  1044. +   @Override
  1045. +   protected void runImpl()
  1046. +   {
  1047. +       final Player player = getPlayer();
  1048. +       if (player == null)
  1049. +       {
  1050. +           return;
  1051. +       }
  1052. +       final List<Item> items = new ArrayList<>(UniqueGachaManager.getInstance().getTemporaryWarehouse(player));
  1053. +       final int totalSize = items.size();
  1054. +       final int perPage = 150;
  1055. +       final int totalPages = totalSize / perPage;
  1056. +      
  1057. +       for (int i = 0; i <= totalPages; i++)
  1058. +       {
  1059. +           // page on client should start from 1, not 0.
  1060. +           // if page is set to 0 - nothing shows up at all.
  1061. +           player.sendPacket(new UniqueGachaInvenItemList((i + 1), (totalPages + 1), items.subList(i * perPage, Math.min((i + 1) * perPage, totalSize))));
  1062. +       }
  1063. +   }
  1064. +}
  1065. \ No newline at end of file
  1066. Index: org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaOpen.java
  1067. ===================================================================
  1068. --- org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaOpen.java (nonexistent)
  1069. +++ org/l2jmobius/gameserver/network/clientpackets/gacha/ExUniqueGachaOpen.java (working copy)
  1070. @@ -0,0 +1,44 @@
  1071. +/*
  1072. + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
  1073. + * This file is part of the Hi5.ge project.
  1074. + *
  1075. + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
  1076. + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
  1077. + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
  1078. + *
  1079. + * This program is intellectual property of hi5.ge and can't, be
  1080. + * used for any commercial or financial use without the permission
  1081. + * of the rightful owners
  1082. + */
  1083. +package org.l2jmobius.gameserver.network.clientpackets.gacha;
  1084. +
  1085. +import org.l2jmobius.gameserver.model.actor.Player;
  1086. +import org.l2jmobius.gameserver.network.clientpackets.ClientPacket;
  1087. +import org.l2jmobius.gameserver.network.serverpackets.gacha.UniqueGachaOpen;
  1088. +
  1089. +/**
  1090. + * @author Index
  1091. + */
  1092. +public class ExUniqueGachaOpen extends ClientPacket
  1093. +{
  1094. +   private int _fullInfo;
  1095. +   private int _openMode;
  1096. +  
  1097. +   @Override
  1098. +   protected void readImpl()
  1099. +   {
  1100. +       _fullInfo = readByte();
  1101. +       _openMode = readByte();
  1102. +   }
  1103. +  
  1104. +   @Override
  1105. +   protected void runImpl()
  1106. +   {
  1107. +       final Player player = getPlayer();
  1108. +       if (player == null)
  1109. +       {
  1110. +           return;
  1111. +       }
  1112. +       player.sendPacket(new UniqueGachaOpen(player, _fullInfo, _openMode));
  1113. +   }
  1114. +}
  1115. Index: org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaGame.java
  1116. ===================================================================
  1117. --- org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaGame.java   (nonexistent)
  1118. +++ org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaGame.java   (working copy)
  1119. @@ -0,0 +1,65 @@
  1120. +/*
  1121. + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
  1122. + * This file is part of the Hi5.ge project.
  1123. + *
  1124. + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
  1125. + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
  1126. + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
  1127. + *
  1128. + * This program is intellectual property of hi5.ge and can't, be
  1129. + * used for any commercial or financial use without the permission
  1130. + * of the rightful owners
  1131. + */
  1132. +package org.l2jmobius.gameserver.network.serverpackets.gacha;
  1133. +
  1134. +import java.util.List;
  1135. +
  1136. +import org.l2jmobius.commons.network.WritableBuffer;
  1137. +import org.l2jmobius.gameserver.instancemanager.events.UniqueGachaManager;
  1138. +import org.l2jmobius.gameserver.model.actor.Player;
  1139. +import org.l2jmobius.gameserver.model.holders.uniquegacha.UniqueGachaItemHolder;
  1140. +import org.l2jmobius.gameserver.network.GameClient;
  1141. +import org.l2jmobius.gameserver.network.ServerPackets;
  1142. +import org.l2jmobius.gameserver.network.serverpackets.ServerPacket;
  1143. +
  1144. +/**
  1145. + * @author Index
  1146. + */
  1147. +public class UniqueGachaGame extends ServerPacket
  1148. +{
  1149. +   public final static int FAILURE = 0;
  1150. +   public final static int SUCCESS = 1;
  1151. +  
  1152. +   private final int _success;
  1153. +   private final Player _player;
  1154. +   private final List<UniqueGachaItemHolder> _rewards;
  1155. +   private final boolean _rare;
  1156. +  
  1157. +   public UniqueGachaGame(int success, Player player, List<UniqueGachaItemHolder> rewards, boolean rare)
  1158. +   {
  1159. +       _success = success;
  1160. +       _player = player;
  1161. +       _rewards = rewards;
  1162. +       _rare = rare;
  1163. +   }
  1164. +  
  1165. +   @Override
  1166. +   public void writeImpl(GameClient client, WritableBuffer buffer)
  1167. +   {
  1168. +       final UniqueGachaManager manager = UniqueGachaManager.getInstance();
  1169. +       ServerPackets.EX_UNIQUE_GACHA_GAME.writeId(this, buffer);
  1170. +       buffer.writeByte(_success); // result // char
  1171. +       buffer.writeLong(manager.getCurrencyCount(_player)); // amount // int
  1172. +       buffer.writeInt(manager.getStepsToGuaranteedReward(_player)); // guaruant // int
  1173. +       // 0 - yellow
  1174. +       // 1 - purple
  1175. +       buffer.writeByte(_rare ? 1 : 0); // rank // char
  1176. +       buffer.writeInt(_rewards.size()); // size // int
  1177. +       for (UniqueGachaItemHolder item : _rewards)
  1178. +       {
  1179. +           buffer.writeByte(item.getRank().getClientId()); // rank // char
  1180. +           buffer.writeInt(item.getId()); // itemId // int
  1181. +           buffer.writeLong(item.getCount()); // count // long
  1182. +       }
  1183. +   }
  1184. +}
  1185. Index: org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaHistory.java
  1186. ===================================================================
  1187. --- org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaHistory.java    (nonexistent)
  1188. +++ org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaHistory.java    (working copy)
  1189. @@ -0,0 +1,51 @@
  1190. +/*
  1191. + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
  1192. + * This file is part of the Hi5.ge project.
  1193. + *
  1194. + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
  1195. + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
  1196. + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
  1197. + *
  1198. + * This program is intellectual property of hi5.ge and can't, be
  1199. + * used for any commercial or financial use without the permission
  1200. + * of the rightful owners
  1201. + */
  1202. +package org.l2jmobius.gameserver.network.serverpackets.gacha;
  1203. +
  1204. +import java.util.List;
  1205. +
  1206. +import org.l2jmobius.commons.network.WritableBuffer;
  1207. +import org.l2jmobius.gameserver.model.holders.uniquegacha.ItemTimeStampHolder;
  1208. +import org.l2jmobius.gameserver.network.GameClient;
  1209. +import org.l2jmobius.gameserver.network.ServerPackets;
  1210. +import org.l2jmobius.gameserver.network.serverpackets.ServerPacket;
  1211. +
  1212. +/**
  1213. + * @author Index
  1214. + */
  1215. +public class UniqueGachaHistory extends ServerPacket
  1216. +{
  1217. +   private final static int SHORT_PACKET_SIZE = 2 + 1 + 4 + 8;
  1218. +  
  1219. +   private final List<ItemTimeStampHolder> _items;
  1220. +  
  1221. +   public UniqueGachaHistory(List<ItemTimeStampHolder> items)
  1222. +   {
  1223. +       _items = items;
  1224. +   }
  1225. +  
  1226. +   @Override
  1227. +   public void writeImpl(GameClient client, WritableBuffer buffer)
  1228. +   {
  1229. +       ServerPackets.EX_UNIQUE_GACHA_HISTORY.writeId(this, buffer);
  1230. +       buffer.writeInt(_items.size());
  1231. +       for (ItemTimeStampHolder item : _items)
  1232. +       {
  1233. +           buffer.writeShort(SHORT_PACKET_SIZE);
  1234. +           buffer.writeByte(item.getRank().getClientId());
  1235. +           buffer.writeInt(item.getId());
  1236. +           buffer.writeLong(item.getCount());
  1237. +           buffer.writeLong(item.getTimeStampFromNow());
  1238. +       }
  1239. +   }
  1240. +}
  1241. Index: org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaInvenAddItem.java
  1242. ===================================================================
  1243. --- org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaInvenAddItem.java   (nonexistent)
  1244. +++ org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaInvenAddItem.java   (working copy)
  1245. @@ -0,0 +1,47 @@
  1246. +/*
  1247. + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
  1248. + * This file is part of the Hi5.ge project.
  1249. + *
  1250. + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
  1251. + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
  1252. + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
  1253. + *
  1254. + * This program is intellectual property of hi5.ge and can't, be
  1255. + * used for any commercial or financial use without the permission
  1256. + * of the rightful owners
  1257. + */
  1258. +package org.l2jmobius.gameserver.network.serverpackets.gacha;
  1259. +
  1260. +import java.util.List;
  1261. +
  1262. +import org.l2jmobius.commons.network.WritableBuffer;
  1263. +import org.l2jmobius.gameserver.model.holders.ItemHolder;
  1264. +import org.l2jmobius.gameserver.model.holders.uniquegacha.UniqueGachaItemHolder;
  1265. +import org.l2jmobius.gameserver.network.GameClient;
  1266. +import org.l2jmobius.gameserver.network.ServerPackets;
  1267. +import org.l2jmobius.gameserver.network.serverpackets.ServerPacket;
  1268. +
  1269. +/**
  1270. + * @author Index
  1271. + */
  1272. +public class UniqueGachaInvenAddItem extends ServerPacket
  1273. +{
  1274. +   private final List<UniqueGachaItemHolder> _rewards;
  1275. +  
  1276. +   public UniqueGachaInvenAddItem(List<UniqueGachaItemHolder> rewards)
  1277. +   {
  1278. +       _rewards = rewards;
  1279. +   }
  1280. +  
  1281. +   @Override
  1282. +   public void writeImpl(GameClient client, WritableBuffer buffer)
  1283. +   {
  1284. +       ServerPackets.EX_UNIQUE_GACHA_INVEN_ADD_ITEM.writeId(this, buffer);
  1285. +       buffer.writeInt(_rewards.size());
  1286. +       for (ItemHolder item : _rewards)
  1287. +       {
  1288. +           buffer.writeInt(item.getId());
  1289. +           buffer.writeLong(item.getCount());
  1290. +       }
  1291. +   }
  1292. +}
  1293. \ No newline at end of file
  1294. Index: org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaInvenGetItem.java
  1295. ===================================================================
  1296. --- org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaInvenGetItem.java   (nonexistent)
  1297. +++ org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaInvenGetItem.java   (working copy)
  1298. @@ -0,0 +1,38 @@
  1299. +/*
  1300. + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
  1301. + * This file is part of the Hi5.ge project.
  1302. + *
  1303. + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
  1304. + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
  1305. + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
  1306. + *
  1307. + * This program is intellectual property of hi5.ge and can't, be
  1308. + * used for any commercial or financial use without the permission
  1309. + * of the rightful owners
  1310. + */
  1311. +package org.l2jmobius.gameserver.network.serverpackets.gacha;
  1312. +
  1313. +import org.l2jmobius.commons.network.WritableBuffer;
  1314. +import org.l2jmobius.gameserver.network.GameClient;
  1315. +import org.l2jmobius.gameserver.network.ServerPackets;
  1316. +import org.l2jmobius.gameserver.network.serverpackets.ServerPacket;
  1317. +
  1318. +/**
  1319. + * @author Index
  1320. + */
  1321. +public class UniqueGachaInvenGetItem extends ServerPacket
  1322. +{
  1323. +   private final int _result;
  1324. +  
  1325. +   public UniqueGachaInvenGetItem(boolean result)
  1326. +   {
  1327. +       _result = result ? 1 : 0;
  1328. +   }
  1329. +  
  1330. +   @Override
  1331. +   public void writeImpl(GameClient client, WritableBuffer buffer)
  1332. +   {
  1333. +       ServerPackets.EX_UNIQUE_GACHA_INVEN_GET_ITEM.writeId(this, buffer);
  1334. +       buffer.writeByte(_result);
  1335. +   }
  1336. +}
  1337. \ No newline at end of file
  1338. Index: org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaInvenItemList.java
  1339. ===================================================================
  1340. --- org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaInvenItemList.java  (nonexistent)
  1341. +++ org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaInvenItemList.java  (working copy)
  1342. @@ -0,0 +1,52 @@
  1343. +/*
  1344. + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
  1345. + * This file is part of the Hi5.ge project.
  1346. + *
  1347. + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
  1348. + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
  1349. + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
  1350. + *
  1351. + * This program is intellectual property of hi5.ge and can't, be
  1352. + * used for any commercial or financial use without the permission
  1353. + * of the rightful owners
  1354. + */
  1355. +package org.l2jmobius.gameserver.network.serverpackets.gacha;
  1356. +
  1357. +import java.util.List;
  1358. +
  1359. +import org.l2jmobius.commons.network.WritableBuffer;
  1360. +import org.l2jmobius.gameserver.model.item.instance.Item;
  1361. +import org.l2jmobius.gameserver.network.GameClient;
  1362. +import org.l2jmobius.gameserver.network.ServerPackets;
  1363. +import org.l2jmobius.gameserver.network.serverpackets.ServerPacket;
  1364. +
  1365. +/**
  1366. + * @author Index
  1367. + */
  1368. +public class UniqueGachaInvenItemList extends ServerPacket
  1369. +{
  1370. +   private final int _currPage;
  1371. +   private final int _maxPages;
  1372. +   private final List<Item> _items;
  1373. +  
  1374. +   public UniqueGachaInvenItemList(int currPage, int maxPages, List<Item> items)
  1375. +   {
  1376. +       _currPage = currPage;
  1377. +       _maxPages = maxPages;
  1378. +       _items = items;
  1379. +   }
  1380. +  
  1381. +   @Override
  1382. +   public void writeImpl(GameClient client, WritableBuffer buffer)
  1383. +   {
  1384. +       ServerPackets.EX_UNIQUE_GACHA_INVEN_ITEM_LIST.writeId(this, buffer);
  1385. +       buffer.writeByte(_currPage);
  1386. +       buffer.writeByte(_maxPages);
  1387. +       buffer.writeLong(_items.size());
  1388. +       for (Item item : _items)
  1389. +       {
  1390. +           buffer.writeInt(item.getDisplayId());
  1391. +           buffer.writeLong(item.getCount());
  1392. +       }
  1393. +   }
  1394. +}
  1395. \ No newline at end of file
  1396. Index: org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaOpen.java
  1397. ===================================================================
  1398. --- org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaOpen.java   (nonexistent)
  1399. +++ org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaOpen.java   (working copy)
  1400. @@ -0,0 +1,115 @@
  1401. +/*
  1402. + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
  1403. + * This file is part of the Hi5.ge project.
  1404. + *
  1405. + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
  1406. + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
  1407. + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
  1408. + *
  1409. + * This program is intellectual property of hi5.ge and can't, be
  1410. + * used for any commercial or financial use without the permission
  1411. + * of the rightful owners
  1412. + */
  1413. +package org.l2jmobius.gameserver.network.serverpackets.gacha;
  1414. +
  1415. +import java.util.Map;
  1416. +import java.util.Set;
  1417. +
  1418. +import org.l2jmobius.commons.network.WritableBuffer;
  1419. +import org.l2jmobius.gameserver.instancemanager.events.UniqueGachaManager;
  1420. +import org.l2jmobius.gameserver.model.actor.Player;
  1421. +import org.l2jmobius.gameserver.model.holders.uniquegacha.UniqueGachaItemHolder;
  1422. +import org.l2jmobius.gameserver.network.GameClient;
  1423. +import org.l2jmobius.gameserver.network.ServerPackets;
  1424. +import org.l2jmobius.gameserver.network.serverpackets.ServerPacket;
  1425. +
  1426. +/**
  1427. + * @author Index
  1428. + */
  1429. +public class UniqueGachaOpen extends ServerPacket
  1430. +{
  1431. +   private final static int SHORT_PACKET_INFO = 2 + 1 + 4 + 8;
  1432. +  
  1433. +   private final Player _player;
  1434. +   private final int _fullInfo;
  1435. +   private final int _openMode;
  1436. +  
  1437. +   public UniqueGachaOpen(Player player, int fullInfo, int openMode)
  1438. +   {
  1439. +       _player = player;
  1440. +       _fullInfo = fullInfo;
  1441. +       _openMode = openMode;
  1442. +   }
  1443. +  
  1444. +   @Override
  1445. +   public void writeImpl(GameClient client, WritableBuffer buffer)
  1446. +   {
  1447. +       final UniqueGachaManager manager = UniqueGachaManager.getInstance();
  1448. +       ServerPackets.EX_UNIQUE_GACHA_OPEN.writeId(this, buffer);
  1449. +       /**
  1450. +        * open mode 1 = const GACHA_TITLE_FORM = 1; = will open main window?
  1451. +        */
  1452. +       buffer.writeByte(_openMode); // open mode // char // 1 = main menu
  1453. +       buffer.writeByte(0); // result // char // not used?
  1454. +       buffer.writeInt(manager.getCurrencyCount(_player)); // my cost item amount // int // current item count for roll?
  1455. +       buffer.writeInt(manager.getStepsToGuaranteedReward(_player)); // my confirm count // int // left to guarant
  1456. +       buffer.writeInt((int) ((manager.getActiveUntilPeriod() - System.currentTimeMillis()) / 1000L)); // remain time in seconds // int
  1457. +       buffer.writeByte(_fullInfo); // full info // char
  1458. +       buffer.writeByte(manager.isShowProbability() ? 1 : 0); // show probability // char
  1459. +       if (_fullInfo == 1)
  1460. +       {
  1461. +           writeFullInfo(buffer, manager);
  1462. +       }
  1463. +       else
  1464. +       {
  1465. +           writeDummyInfo(buffer);
  1466. +       }
  1467. +   }
  1468. +  
  1469. +   private void writeFullInfo(WritableBuffer buffer, UniqueGachaManager manager)
  1470. +   {
  1471. +       buffer.writeInt(manager.getVisibleItems().size()); // show items size // int
  1472. +       for (UniqueGachaItemHolder item : manager.getVisibleItems())
  1473. +       {
  1474. +           buffer.writeShort(SHORT_PACKET_INFO); // current size // short
  1475. +           buffer.writeByte(item.getRank().getClientId()); // rank type // char
  1476. +           buffer.writeInt(item.getId()); // item type // int
  1477. +           buffer.writeLong(item.getCount()); // amount // long
  1478. +           buffer.writeDouble(getChance(manager.isShowProbability(), item.getItemChance())); // probability // double
  1479. +       }
  1480. +       buffer.writeInt(manager.getTotalRewardCount()); // reward item size // int
  1481. +       for (Set<UniqueGachaItemHolder> items : manager.getRewardItems().values())
  1482. +       {
  1483. +           for (UniqueGachaItemHolder item : items)
  1484. +           {
  1485. +               buffer.writeShort(SHORT_PACKET_INFO); // current size // short
  1486. +               buffer.writeByte(item.getRank().getClientId()); // rank type // char
  1487. +               buffer.writeInt(item.getId()); // item type // int
  1488. +               buffer.writeLong(item.getCount()); // amount // long
  1489. +               buffer.writeDouble(getChance(manager.isShowProbability(), item.getItemChance())); // probability // double
  1490. +           }
  1491. +       }
  1492. +       buffer.writeByte(1); // cost type // char // bool?
  1493. +       buffer.writeInt(manager.getCurrencyItemId()); // cost item type // int // item id
  1494. +       buffer.writeInt(manager.getGameCosts().size()); // cost amount item info // int
  1495. +       for (Map.Entry<Integer, Long> entry : manager.getGameCosts().entrySet())
  1496. +       {
  1497. +           buffer.writeInt(entry.getKey()); // game count // int
  1498. +           buffer.writeLong(entry.getValue()); // amount // long
  1499. +       }
  1500. +   }
  1501. +  
  1502. +   private void writeDummyInfo(WritableBuffer buffer)
  1503. +   {
  1504. +       buffer.writeInt(0); // show items size // int
  1505. +       buffer.writeInt(0); // reward item size // int
  1506. +       buffer.writeByte(0); // cost type // char // bool?
  1507. +       buffer.writeInt(0); // cost item type // int // item id
  1508. +       buffer.writeInt(0); // cost amount item info // int
  1509. +   }
  1510. +  
  1511. +   private double getChance(boolean showChance, int itemChance)
  1512. +   {
  1513. +       return showChance ? (double) ((double) itemChance / (double) UniqueGachaManager.MINIMUM_CHANCE) : 0;
  1514. +   }
  1515. +}
  1516. \ No newline at end of file
  1517. Index: org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaSidebarInfo.java
  1518. ===================================================================
  1519. --- org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaSidebarInfo.java    (nonexistent)
  1520. +++ org/l2jmobius/gameserver/network/serverpackets/gacha/UniqueGachaSidebarInfo.java    (working copy)
  1521. @@ -0,0 +1,41 @@
  1522. +/*
  1523. + * ეს ფაილი არის ნაწილი Hi5.ge პროექტის.
  1524. + * This file is part of the Hi5.ge project.
  1525. + *
  1526. + * პროგრამა წარმოადგენს Hi5.ge პროექტის ავტორების ინტელექტუალურ საკუთრაებას და არ
  1527. + * შეიძლება გამოყენებული იქნას კომერციული ან სხვა რაიმე მიზნობრივი საქმიანობისთვის,
  1528. + * ამის შესახებ ავტორების წინასწარ გაფრთხილების და თანხმობის გარეშე.
  1529. + *
  1530. + * This program is intellectual property of hi5.ge and can't, be
  1531. + * used for any commercial or financial use without the permission
  1532. + * of the rightful owners
  1533. + */
  1534. +package org.l2jmobius.gameserver.network.serverpackets.gacha;
  1535. +
  1536. +import org.l2jmobius.commons.network.WritableBuffer;
  1537. +import org.l2jmobius.gameserver.network.GameClient;
  1538. +import org.l2jmobius.gameserver.network.ServerPackets;
  1539. +import org.l2jmobius.gameserver.network.serverpackets.ServerPacket;
  1540. +
  1541. +/**
  1542. + * @author Index
  1543. + */
  1544. +public class UniqueGachaSidebarInfo extends ServerPacket
  1545. +{
  1546. +   public final static UniqueGachaSidebarInfo GACHA_ON = new UniqueGachaSidebarInfo(true);
  1547. +   public final static UniqueGachaSidebarInfo GACHA_OFF = new UniqueGachaSidebarInfo(false);
  1548. +  
  1549. +   private final boolean _turnedOn;
  1550. +  
  1551. +   private UniqueGachaSidebarInfo(boolean turnedOn)
  1552. +   {
  1553. +       _turnedOn = turnedOn;
  1554. +   }
  1555. +  
  1556. +   @Override
  1557. +   public void writeImpl(GameClient client, WritableBuffer buffer)
  1558. +   {
  1559. +       ServerPackets.EX_UNIQUE_GACHA_SIDEBAR_INFO.writeId(this, buffer);
  1560. +       buffer.writeByte(_turnedOn ? 1 : 0);
  1561. +   }
  1562. +}
  1563.  
Tags: Gacha
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement