Guest User

PremiumManager.java

a guest
Aug 3rd, 2019
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.67 KB | None | 0 0
  1. package net.sf.l2j.gameserver.instancemanager;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. import java.util.Map;
  10. import java.util.concurrent.ConcurrentHashMap;
  11.  
  12. import net.sf.l2j.commons.config.Config;
  13. import net.sf.l2j.commons.db.DatabaseFactory;
  14. import net.sf.l2j.gameserver.model.L2Object;
  15. import net.sf.l2j.gameserver.model.L2World;
  16. import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  17. import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
  18. import net.sf.l2j.gameserver.model.item.kind.Premium;
  19. import net.sf.l2j.gameserver.network.SystemMessageId;
  20. import net.sf.l2j.gameserver.network.serverpackets.ItemList;
  21. import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
  22.  
  23. import org.slf4j.Logger;
  24. import org.slf4j.LoggerFactory;
  25.  
  26. public class PremiumManager
  27. {
  28.     protected static final Logger _log = LoggerFactory.getLogger(PremiumManager.class.getName());
  29.    
  30.     private static int time_multiplier = 1 * 60 * 60; //1 * 60 * 60 equals to hours
  31.     private static PremiumManager _instance;
  32.     private final Map<Integer, Premium> _items = new ConcurrentHashMap<>();
  33.    
  34.     public static final PremiumManager getInstance()
  35.     {
  36.         if (_instance == null)
  37.         {
  38.             _instance = new PremiumManager();
  39.         }
  40.         return _instance;
  41.     }
  42.    
  43.     private PremiumManager()
  44.     {
  45.         restore();
  46.     }
  47.    
  48.     /**
  49.      * Вызывается только РєРѕРіРґР° РёРіСЂРѕРє сам удаляет предмет
  50.      * @param instance
  51.      */
  52.     public synchronized void destroyItem(ItemInstance instance)
  53.     {
  54.         final Premium item = _items.get(instance.getObjectId());
  55.         if (item != null)
  56.         {
  57.             try
  58.             {
  59.                 final String query = "DELETE FROM character_premium_items WHERE charId=? AND itemId=?";
  60.                 try (Connection con = DatabaseFactory.getInstance().getConnection();
  61.                     PreparedStatement statement = con.prepareStatement(query))
  62.                 {
  63.                     statement.setInt(1, item.getCharId());
  64.                     statement.setInt(2, item.getItemId());
  65.                     statement.execute();
  66.                 }
  67.             }
  68.             catch (SQLException e)
  69.             {
  70.                 _log.warn(e.toString());
  71.             }
  72.         }
  73.     }
  74.    
  75.     public synchronized void addPremiumItem(ItemInstance instance, int index)
  76.     {
  77.         Premium item = _items.get(instance.getObjectId());
  78.         if (item != null)
  79.         {
  80.             item.setCharId(instance.getOwnerId());
  81.         }
  82.         else
  83.         {
  84.             item = new Premium();
  85.             item.setActivationTime(System.currentTimeMillis() / 1000 + Config.PREMIUM_ITEM_TIME[index] * time_multiplier);
  86.             item.setCharId(instance.getOwnerId());
  87.             item.setItemId(instance.getObjectId());
  88.             _items.put(item.getItemId(), item);
  89.         }
  90.        
  91.         try
  92.         {
  93.             String query = "UPDATE character_premium_items SET charId=? WHERE itemId=?";
  94.             try (Connection con = DatabaseFactory.getInstance().getConnection();
  95.                 PreparedStatement statement_update = con.prepareStatement(query))
  96.             {
  97.                 statement_update.setInt(1, item.getCharId());
  98.                 statement_update.setInt(2, item.getItemId());
  99.                 if (statement_update.executeUpdate() == 0)
  100.                 {
  101.                     query = "INSERT INTO character_premium_items (charId,itemId,time) VALUES (?,?,?)";
  102.                     try (PreparedStatement statement_insert = con.prepareStatement(query))
  103.                     {
  104.                         statement_insert.setInt(1, item.getCharId());
  105.                         statement_insert.setInt(2, item.getItemId());
  106.                         statement_insert.setLong(3, item.getActivationTime());
  107.                         statement_insert.execute();
  108.                     }
  109.                 }
  110.             }
  111.         }
  112.         catch (SQLException e)
  113.         {
  114.             _log.warn(e.toString());
  115.         }
  116.     }
  117.    
  118.     private void restore()
  119.     {
  120.         try
  121.         {
  122.             final String query = "SELECT charId,itemId,time FROM character_premium_items";
  123.             try (Connection con = DatabaseFactory.getInstance().getConnection();
  124.                 PreparedStatement statement = con.prepareStatement(query);
  125.                 ResultSet result = statement.executeQuery())
  126.             {
  127.                 while (result.next())
  128.                 {
  129.                     final Premium item = new Premium();
  130.                     item.setActivationTime(result.getLong("time"));
  131.                     item.setCharId(result.getInt("charId"));
  132.                     item.setItemId(result.getInt("itemId"));
  133.                     _items.put(item.getItemId(), item);
  134.                 }
  135.                 _log.info(String.format("PremiumItems: Loaded %s items ", _items.size()));
  136.             }
  137.         }
  138.         catch (SQLException e)
  139.         {
  140.             _log.warn(e.toString());
  141.         }
  142.     }
  143.    
  144.     private void deleteItem(Premium item)
  145.     {
  146.         _items.remove(item.getItemId());
  147.         try
  148.         {
  149.             final String query = "DELETE FROM character_premium_items WHERE charId=? AND itemId=?";
  150.             try (Connection con = DatabaseFactory.getInstance().getConnection();
  151.                 PreparedStatement statement = con.prepareStatement(query))
  152.             {
  153.                 statement.setInt(1, item.getCharId());
  154.                 statement.setInt(2, item.getItemId());
  155.                 statement.execute();
  156.             }
  157.         }
  158.         catch (SQLException e)
  159.         {
  160.             _log.warn(e.toString());
  161.         }
  162.        
  163.         L2PcInstance pl = L2World.getInstance().getPlayer(item.getCharId());
  164.         if (pl != null)
  165.         {
  166.             ItemInstance instance = pl.getInventory().getItemByObjectId(item.getItemId());
  167.             if (instance != null)
  168.             {
  169.                 if (instance.isEquipped())
  170.                 {
  171.                     pl.getInventory().unEquipItemInSlot(instance.getLocationSlot());
  172.                 }
  173.                 pl.getInventory().destroyItem("timeLost", instance, pl, pl);
  174.                 pl.sendPacket(new ItemList(pl, false));
  175.                 pl.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.S1_DISAPPEARED).addItemName(instance));
  176.                 pl.calculatePremiumAttributes();
  177.             }
  178.         }
  179.         else
  180.         {
  181.             try
  182.             {
  183.                 final String query = "DELETE FROM items WHERE owner_id=? AND object_id=?";
  184.                 if (item.getCharId() != 0)
  185.                 {
  186.                     try (Connection con = DatabaseFactory.getInstance().getConnection();
  187.                         PreparedStatement statement = con.prepareStatement(query))
  188.                     {
  189.                         statement.setInt(1, item.getCharId());
  190.                         statement.setInt(2, item.getItemId());
  191.                         statement.execute();
  192.                     }
  193.                 }
  194.                 else
  195.                 {
  196.                     for (L2Object o : L2World.getInstance().getAllVisibleObjects().values())
  197.                     {
  198.                         if (o.getObjectId() == item.getItemId())
  199.                         {
  200.                             L2World.getInstance().removeVisibleObject(o, o.getWorldRegion());
  201.                             break;
  202.                         }
  203.                     }
  204.                 }
  205.             }
  206.             catch (SQLException e)
  207.             {
  208.                 _log.warn(e.toString());
  209.             }
  210.         }
  211.     }
  212.    
  213.     public void deleteItemShedule()
  214.     {
  215.         for (final Premium item : _items.values())
  216.         {
  217.             if (item.getActivationTime() < (System.currentTimeMillis() / 1000))
  218.             {
  219.                 deleteItem(item);
  220.             }
  221.         }
  222.     }
  223.    
  224.     public Map<Integer, Premium> getPremiumItems()
  225.     {
  226.         return _items;
  227.     }
  228.    
  229.     public Premium getPremiumItem(int objId)
  230.     {
  231.         return _items.get(objId);
  232.     }
  233.    
  234.     public List<Premium> getPremiumItemsByOwner(int charId)
  235.     {
  236.         final List<Premium> value = new ArrayList<>();
  237.         for (Premium item : _items.values())
  238.         {
  239.             if (item.getCharId() == charId)
  240.             {
  241.                 value.add(item);
  242.             }
  243.         }
  244.         return value;
  245.     }
  246.    
  247.     public int getItemIndex(int itemId)
  248.     {
  249.         int[] premiumIdsArray = Config.PREMIUM_ITEM_IDS;
  250.         for (int i = 0; i < premiumIdsArray.length; i++)
  251.         {
  252.             if (premiumIdsArray[i] == itemId)
  253.             {
  254.                 return i;
  255.             }
  256.         }
  257.         return -1;
  258.     }
  259.    
  260.     public Premium getFirstPremiumItem(L2PcInstance player)
  261.     {
  262.         long activationTime = Long.MIN_VALUE;
  263.         Premium firstItem = null;
  264.        
  265.         if (player == null)
  266.         {
  267.             return null;
  268.         }
  269.        
  270.         for (Premium premium : getPremiumItemsByOwner(player.getObjectId()))
  271.         {
  272.             ItemInstance item = player.getInventory().getItemByObjectId(premium.getItemId());
  273.             if (item != null)
  274.             {
  275.                 long temp = (premium.getActivationTime() - Config.PREMIUM_ITEM_IDS[getItemIndex(item.getItemId())] * time_multiplier) * 1000;
  276.                 if (temp > activationTime)
  277.                 {
  278.                     activationTime = temp;
  279.                     firstItem = premium;
  280.                 }
  281.             }
  282.         }
  283.        
  284.         return firstItem;
  285.     }
  286. }
Add Comment
Please, Sign In to add comment