Noticias:

No tienes permiso para ver los enlaces. Para poder verlos Registrate o Conectate.

Menú Principal

Prime Shop (Fissban)

Iniciado por fissban, Jul 27, 2025, 12:41 AM

Tema anterior - Siguiente tema

fissban


CitarCORE:

diff --git a/L2J_Server/dist/libs/._L2J_GeoDriver.jar3291838113424536152.tmp b/L2J_Server/dist/libs/._L2J_GeoDriver.jar3291838113424536152.tmp
new file mode 100644
index 0000000..ae15f5e
--- /dev/null
+++ b/L2J_Server/dist/libs/._L2J_GeoDriver.jar3291838113424536152.tmp
Binary files differ
diff --git a/L2J_Server/java/com/l2jserver/gameserver/GameServer.java b/L2J_Server/java/com/l2jserver/gameserver/GameServer.java
index 25de90c..ff23b33 100644
--- a/L2J_Server/java/com/l2jserver/gameserver/GameServer.java
+++ b/L2J_Server/java/com/l2jserver/gameserver/GameServer.java
@@ -83,6 +83,7 @@
 import com.l2jserver.gameserver.datatables.EventDroplist;
 import com.l2jserver.gameserver.datatables.ItemTable;
 import com.l2jserver.gameserver.datatables.MerchantPriceConfigTable;
+import com.l2jserver.gameserver.datatables.PrimeShopTable;
 import com.l2jserver.gameserver.datatables.SkillData;
 import com.l2jserver.gameserver.datatables.SpawnTable;
 import com.l2jserver.gameserver.handler.EffectHandler;
@@ -229,6 +230,9 @@
         FishingRodsData.getInstance();
         HennaData.getInstance();
         
+        // PrimeShop
+        PrimeShopTable.getInstance();
+        
         printSection("Characters");
         ClassListData.getInstance();
         InitialEquipmentData.getInstance();
diff --git a/L2J_Server/java/com/l2jserver/gameserver/datatables/PrimeShopTable.java b/L2J_Server/java/com/l2jserver/gameserver/datatables/PrimeShopTable.java
new file mode 100644
index 0000000..d89dbb2
--- /dev/null
+++ b/L2J_Server/java/com/l2jserver/gameserver/datatables/PrimeShopTable.java
@@ -0,0 +1,492 @@
+package com.l2jserver.gameserver.datatables;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+import com.l2jserver.Config;
+import com.l2jserver.L2DatabaseFactory;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.items.L2Item;
+import com.l2jserver.gameserver.network.serverpackets.ExBrBuyProduct;
+import com.l2jserver.gameserver.network.serverpackets.ExBrProductInfo;
+import com.l2jserver.gameserver.util.Util;
+import com.l2jserver.util.data.xml.IXmlReader;
+
+/**
+ * @author fissban
+ */
+public class PrimeShopTable implements IXmlReader
+{
+    private static final Logger _log = Logger.getLogger(PrimeShopTable.class.getName());
+    
+    private final Map<Integer, PrimeShopItem> _primeItems = new HashMap<>();
+    
+    public final int BR_BUY_SUCCESS = 1;
+    public final int BR_BUY_LACK_OF_POINT = -1;
+    public final int BR_BUY_INVALID_PRODUCT = -2;
+    public final int BR_BUY_USER_CANCEL = -3;
+    public final int BR_BUY_INVENTROY_OVERFLOW = -4;
+    public final int BR_BUY_CLOSED_PRODUCT = -5;
+    public final int BR_BUY_SERVER_ERROR = -6;
+    public final int BR_BUY_BEFORE_SALE_DATE = -7;
+    public final int BR_BUY_AFTER_SALE_DATE = -8;
+    public final int BR_BUY_INVALID_USER = -9;
+    public final int BR_BUY_INVALID_ITEM = -10;
+    public final int BR_BUY_INVALID_USER_STATE = -11;
+    public final int BR_BUY_NOT_DAY_OF_WEEK = -12;
+    public final int BR_BUY_NOT_TIME_OF_DAY = -13;
+    public final int BR_BUY_SOLD_OUT = -14;
+    
+    public PrimeShopTable()
+    {
+        load();
+    }
+    
+    @Override
+    public void load()
+    {
+        _primeItems.clear();
+        parseDatapackFile("data/PrimeShop.xml");
+    }
+    
+    public final void reload()
+    {
+        _primeItems.clear();
+        load();
+    }
+    
+    @Override
+    public void parseDocument(Document doc)
+    {
+        for (Node a = doc.getFirstChild(); a != null; a = a.getNextSibling())
+        {
+            if (!"list".equalsIgnoreCase(a.getNodeName()))
+            {
+                continue;
+            }
+            for (Node b = a.getFirstChild(); b != null; b = b.getNextSibling())
+            {
+                if (!"item".equalsIgnoreCase(b.getNodeName()))
+                {
+                    continue;
+                }
+                NamedNodeMap attrs = b.getAttributes();
+                
+                int type = 0;
+                
+                Node att = attrs.getNamedItem("brId");
+                if (att == null)
+                {
+                    _log.severe("[PrimeShop] Missing brId, skipping");
+                    continue;
+                }
+                final int brId = Integer.parseInt(att.getNodeValue());
+                
+                att = attrs.getNamedItem("itemId");
+                if (att == null)
+                {
+                    _log.severe("[PrimeShop] Missing itemId, skipping");
+                    continue;
+                }
+                final int itemId = Integer.parseInt(att.getNodeValue());
+                
+                att = attrs.getNamedItem("cat");
+                if (att == null)
+                {
+                    _log.severe("[PrimeShop] Missing category, skipping");
+                    continue;
+                }
+                final int cat = Integer.parseInt(att.getNodeValue());
+                
+                att = attrs.getNamedItem("price");
+                if (att == null)
+                {
+                    _log.severe("[PrimeShop] Missing price, skipping");
+                    continue;
+                }
+                final int price = Integer.parseInt(att.getNodeValue());
+                
+                att = attrs.getNamedItem("count");
+                if (att == null)
+                {
+                    _log.severe("[PrimeShop] Missing count, skipping");
+                    continue;
+                }
+                final int count = Integer.parseInt(att.getNodeValue());
+                
+                att = attrs.getNamedItem("event");
+                if (att == null)
+                {
+                    _log.severe("[PrimeShop] Missing event, skipping");
+                    continue;
+                }
+                final boolean event = Boolean.parseBoolean(att.getNodeValue());
+                
+                att = attrs.getNamedItem("best");
+                if (att == null)
+                {
+                    _log.severe("[PrimeShop] Missing best, skipping");
+                    continue;
+                }
+                final boolean best = Boolean.parseBoolean(att.getNodeValue());
+                
+                if (event)
+                {
+                    type++;
+                }
+                if (best)
+                {
+                    type += 2;
+                }
+                L2Item item = ItemTable.getInstance().getTemplate(itemId);
+                if (item == null)
+                {
+                    _log.severe("[PrimeShop] Item template null");
+                }
+                else
+                {
+                    att = attrs.getNamedItem("sale_start_date");
+                    if (att == null)
+                    {
+                        _log.severe("[PrimeShop] Missing brId, skipping");
+                        continue;
+                    }
+                    final String sale_start_date = att.getNodeValue();
+                    
+                    att = attrs.getNamedItem("sale_end_date");
+                    if (att == null)
+                    {
+                        _log.severe("[PrimeShop] Missing brId, skipping");
+                        continue;
+                    }
+                    final String sale_end_date = att.getNodeValue();
+                    
+                    _primeItems.put(Integer.valueOf(brId), new PrimeShopItem(itemId, cat, price, count, item.getWeight(), item.isTradeable(), type, sale_start_date, sale_end_date));
+                }
+            }
+        }
+        
+        if (_primeItems.size() > 0)
+        {
+            _log.info("[PrimeShop] Loaded: " + _primeItems.size() + " items");
+        }
+    }
+    
+    public int getMaxStock(int brId)
+    {
+        int maxStock = 0;
+        
+        try (Connection con = L2DatabaseFactory.getInstance().getConnection();
+            PreparedStatement statement = con.prepareStatement("SELECT maxStock FROM primeshop WHERE brId=" + brId))
+        {
+            try (ResultSet rset = statement.executeQuery())
+            {
+                while (rset.next())
+                {
+                    return maxStock = rset.getInt("maxStock");
+                }
+            }
+        }
+        catch (Exception e)
+        {
+            _log.log(Level.WARNING, "Exception: error while loading get stock for product: " + brId + e, e);
+        }
+        return maxStock;
+    }
+    
+    public int getActualStock(int brId)
+    {
+        int getActualStock = 0;
+        
+        try (Connection con = L2DatabaseFactory.getInstance().getConnection();
+            PreparedStatement statement = con.prepareStatement("SELECT getStock FROM primeshop WHERE brId=?"))
+        {
+            statement.setInt(1, brId);
+            try (ResultSet rset = statement.executeQuery())
+            {
+                while (rset.next())
+                {
+                    return getActualStock = rset.getInt("getStock");
+                }
+            }
+        }
+        catch (Exception e)
+        {
+            _log.log(Level.WARNING, "Exception: error while loading actual stock for product: " + brId + e, e);
+        }
+        return getActualStock;
+    }
+    
+    public void discountStock(int brId, int Stock, int count)
+    {
+        Stock += count;
+        
+        try (Connection con = L2DatabaseFactory.getInstance().getConnection();
+            PreparedStatement statement = con.prepareStatement("UPDATE primeshop SET getStock=? WHERE brId=?"))
+        {
+            statement.setInt(1, Stock);
+            statement.setInt(2, brId);
+            statement.execute();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+    
+    public void buyItem(L2PcInstance player, int brId, int count)
+    {
+        if ((count < 1) && (count > 99))
+        {
+            Util.handleIllegalPlayerAction(player, "Player " + player.getName() + " tried to buy invalid itemcount [" + count + "] from Prime", Config.DEFAULT_PUNISH);
+            return;
+        }
+        
+        int Stock = getActualStock(brId);
+        int MaxStock = getMaxStock(brId);
+        
+        if (MaxStock != 0) // TODO solo sale 0 cuando no tienen maximo de stock
+        {
+            if ((MaxStock - Stock) < count)
+            {
+                player.sendPacket(new ExBrBuyProduct(-14)); // TODO no puede comprar tantos items
+                return;
+            }
+        }
+        
+        if (_primeItems.containsKey(Integer.valueOf(brId)))
+        {
+            PrimeShopItem item = _primeItems.get(Integer.valueOf(brId));
+            
+            long points = player.getGamePoints();
+            
+            // TODO hace falta poner las 2 condiciones? quizas solo con la segunda y sin el && ultimo deberia funcionar
+            if (points >= (item.getPrimeItemPrice() * count))
+            {
+                L2Item dummy = ItemTable.getInstance().getTemplate(item.getPrimeItemId());
+                if (dummy != null)
+                {
+                    int weight = item.getPrimeItemCount() * item.getPrimeWeight() * count;
+                    
+                    if (player.getInventory().validateWeight(weight))
+                    {
+                        int slots = 0;
+                        if (dummy.isStackable())
+                        {
+                            slots = 1;
+                        }
+                        else
+                        {
+                            slots = item.getPrimeItemCount() * count;
+                        }
+                        if (player.getInventory().validateCapacity(slots))
+                        {
+                            if (player.addItem("PrimeShop", item.getPrimeItemId(), count * item.getPrimeItemCount(), player, true) != null)
+                            {
+                                player.sendPacket(new ExBrBuyProduct(1));
+                                
+                                player.setGamePoints(player.getGamePoints() - (item.getPrimeItemPrice() * count));
+                                
+                                if (MaxStock != 0)
+                                {
+                                    discountStock(brId, Stock, count);
+                                }
+                            }
+                            else
+                            {
+                                player.sendPacket(new ExBrBuyProduct(-6));
+                            }
+                        }
+                        else
+                        {
+                            player.sendPacket(new ExBrBuyProduct(-4));
+                        }
+                    }
+                    else
+                    {
+                        player.sendPacket(new ExBrBuyProduct(-4));
+                    }
+                }
+                else
+                {
+                    player.sendPacket(new ExBrBuyProduct(-6));
+                }
+            }
+            else
+            {
+                player.sendPacket(new ExBrBuyProduct(-1));
+            }
+        }
+        else
+        {
+            player.sendPacket(new ExBrBuyProduct(-2));
+            Util.handleIllegalPlayerAction(player, "Player " + player.getName() + " tried to buy invalid brId from Prime", Config.DEFAULT_PUNISH);
+        }
+    }
+    
+    public void showProductInfo(L2PcInstance player, int itemId)
+    {
+        if ((player == null) || (itemId == 0))
+        {
+            return;
+        }
+        if (_primeItems.containsKey(itemId))
+        {
+            PrimeShopItem item = _primeItems.get(itemId);
+            
+            player.sendPacket(new ExBrProductInfo(itemId, item));
+        }
+    }
+    
+    public Map<Integer, PrimeShopItem> getPrimeItems()
+    {
+        return _primeItems;
+    }
+    
+    public class PrimeShopItem
+    {
+        int _itemId;
+        int _category;
+        int _price;
+        int _count;
+        int _weight;
+        int _tradable;
+        int _type;
+        
+        long _sale_start_date;
+        long _sale_end_date;
+        
+        int _startHour;
+        int _endHour;
+        int _startMin;
+        int _endMin;
+        
+        public PrimeShopItem(int itemId, int category, int price, int count, int weight, boolean tradable, int type, String sale_start_date, String sale_end_date)
+        {
+            new Date().getTime();
+            
+            _itemId = itemId;
+            _category = category;
+            _price = price;
+            _weight = weight;
+            _count = count;
+            _tradable = (tradable ? 1 : 0);
+            _type = type;
+            
+            DateFormat df = new SimpleDateFormat("yyyy.MM.dd HH:mm");
+            try
+            {
+                Date time_start = df.parse(sale_start_date);
+                Date time_end = df.parse(sale_end_date);
+                Calendar calendar = Calendar.getInstance();
+                
+                calendar.setTime(time_start);
+                _sale_start_date = time_start.getTime();
+                _startHour = calendar.get(Calendar.HOUR_OF_DAY);
+                _startMin = calendar.get(Calendar.MINUTE);
+                
+                calendar.setTime(time_end);
+                _sale_end_date = time_end.getTime();
+                _endHour = calendar.get(Calendar.HOUR_OF_DAY);
+                _endMin = calendar.get(Calendar.MINUTE);
+            }
+            catch (Exception e)
+            {
+                e.printStackTrace();
+            }
+        }
+        
+        public int getPrimeItemId()
+        {
+            return _itemId;
+        }
+        
+        public int getPrimeItemCat()
+        {
+            return _category;
+        }
+        
+        public int getPrimeItemPrice()
+        {
+            return _price;
+        }
+        
+        public int getPrimeItemCount()
+        {
+            return _count;
+        }
+        
+        public int getPrimeWeight()
+        {
+            return _weight;
+        }
+        
+        public int getPrimeTradable()
+        {
+            return _tradable;
+        }
+        
+        public long sale_start_date()
+        {
+            return _sale_start_date;
+        }
+        
+        public long sale_end_date()
+        {
+            return _sale_end_date;
+        }
+        
+        public int getStartHour()
+        {
+            return _startHour;
+        }
+        
+        public int getStartMin()
+        {
+            return _startMin;
+        }
+        
+        public int getEndHour()
+        {
+            return _endHour;
+        }
+        
+        public int getEndMin()
+        {
+            return _endMin;
+        }
+        
+        public int getPrimeType()
+        {
+            return _type;
+        }
+    }
+    
+    public PrimeShopItem getProduct(int id)
+    {
+        return _primeItems.get(id);
+    }
+    
+    public static PrimeShopTable getInstance()
+    {
+        return SingletonHolder._instance;
+    }
+    
+    private static class SingletonHolder
+    {
+        protected static final PrimeShopTable _instance = new PrimeShopTable();
+    }
+}
\ No newline at end of file
diff --git a/L2J_Server/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java b/L2J_Server/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
index ebe0026..3e2aaf0 100644
--- a/L2J_Server/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
+++ b/L2J_Server/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
@@ -354,7 +354,7 @@
     
     // Character Character SQL String Definitions:
     private static final String INSERT_CHARACTER = "INSERT INTO characters (account_name,charId,char_name,level,maxHp,curHp,maxCp,curCp,maxMp,curMp,face,hairStyle,hairColor,sex,exp,sp,karma,fame,pvpkills,pkkills,clanid,race,classid,deletetime,cancraft,title,title_color,accesslevel,online,isin7sdungeon,clan_privs,wantspeace,base_class,newbie,nobless,power_grade,createDate) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
-    private static final String UPDATE_CHARACTER = "UPDATE characters SET level=?,maxHp=?,curHp=?,maxCp=?,curCp=?,maxMp=?,curMp=?,face=?,hairStyle=?,hairColor=?,sex=?,heading=?,x=?,y=?,z=?,exp=?,expBeforeDeath=?,sp=?,karma=?,fame=?,pvpkills=?,pkkills=?,clanid=?,race=?,classid=?,deletetime=?,title=?,title_color=?,accesslevel=?,online=?,isin7sdungeon=?,clan_privs=?,wantspeace=?,base_class=?,onlinetime=?,newbie=?,nobless=?,power_grade=?,subpledge=?,lvl_joined_academy=?,apprentice=?,sponsor=?,clan_join_expiry_time=?,clan_create_expiry_time=?,char_name=?,death_penalty_level=?,bookmarkslot=?,vitality_points=?,language=? WHERE charId=?";
+    private static final String UPDATE_CHARACTER = "UPDATE characters SET level=?,maxHp=?,curHp=?,maxCp=?,curCp=?,maxMp=?,curMp=?,face=?,hairStyle=?,hairColor=?,sex=?,heading=?,x=?,y=?,z=?,exp=?,expBeforeDeath=?,sp=?,karma=?,fame=?,pvpkills=?,pkkills=?,clanid=?,race=?,classid=?,deletetime=?,title=?,title_color=?,accesslevel=?,online=?,isin7sdungeon=?,clan_privs=?,wantspeace=?,base_class=?,onlinetime=?,newbie=?,nobless=?,power_grade=?,subpledge=?,lvl_joined_academy=?,apprentice=?,sponsor=?,clan_join_expiry_time=?,clan_create_expiry_time=?,char_name=?,death_penalty_level=?,bookmarkslot=?,vitality_points=?,language=?,game_points=? WHERE charId=?";
     private static final String RESTORE_CHARACTER = "SELECT * FROM characters WHERE charId=?";
     
     // Character Teleport Bookmark:
@@ -6928,6 +6928,9 @@
                     // Language
                     player.setLang(rset.getString("language"));
                     
+                    // PrimeShop
+                    player.setGamePoints(rset.getLong("game_points"));
+                    
                     // Retrieve the name and ID of the other characters assigned to this account.
                     try (PreparedStatement stmt = con.prepareStatement("SELECT charId, char_name FROM characters WHERE account_name=? AND charId<>?"))
                     {
@@ -7365,6 +7368,7 @@
             statement.setInt(48, getVitalityPoints());
             statement.setString(49, getLang());
             statement.setInt(50, getObjectId());
+            statement.setLong(51, getGamePoints()); // PrimeShop
             
             statement.execute();
         }
@@ -14407,4 +14411,19 @@
     {
         return (getSiegeState() > 0) && isInsideZone(ZoneId.SIEGE) && (getSiegeState() == target.getSiegeState()) && (getSiegeSide() == target.getSiegeSide());
     }
+    
+    // PrimeShop
+    private long _gamePoints;
+    
+    // PrimeShop
+    public long getGamePoints()
+    {
+        return _gamePoints;
+    }
+    
+    // PrimeShop
+    public void setGamePoints(long gamePoints)
+    {
+        _gamePoints = gamePoints;
+    }
 }
diff --git a/L2J_Server/java/com/l2jserver/gameserver/network/clientpackets/RequestBrBuyProduct.java b/L2J_Server/java/com/l2jserver/gameserver/network/clientpackets/RequestBrBuyProduct.java
new file mode 100644
index 0000000..a75c6d6
--- /dev/null
+++ b/L2J_Server/java/com/l2jserver/gameserver/network/clientpackets/RequestBrBuyProduct.java
@@ -0,0 +1,38 @@
+package com.l2jserver.gameserver.network.clientpackets;
+
+import com.l2jserver.gameserver.datatables.PrimeShopTable;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+
+/**
+ * @author fissban
+ */
+public class RequestBrBuyProduct extends L2GameClientPacket
+{
+    private static final String TYPE = "[C] D0:8C RequestBrBuyProduct";
+    
+    private int _product_id;
+    private int _count;
+    
+    @Override
+    protected void readImpl()
+    {
+        _product_id = readD();
+        _count = readD();
+    }
+    
+    @Override
+    protected void runImpl()
+    {
+        L2PcInstance player = getClient().getActiveChar();
+        if (player != null)
+        {
+            PrimeShopTable.getInstance().buyItem(player, _product_id, _count);
+        }
+    }
+    
+    @Override
+    public String getType()
+    {
+        return TYPE;
+    }
+}
\ No newline at end of file
diff --git a/L2J_Server/java/com/l2jserver/gameserver/network/clientpackets/RequestBrGamePoint.java b/L2J_Server/java/com/l2jserver/gameserver/network/clientpackets/RequestBrGamePoint.java
new file mode 100644
index 0000000..7b9ce42
--- /dev/null
+++ b/L2J_Server/java/com/l2jserver/gameserver/network/clientpackets/RequestBrGamePoint.java
@@ -0,0 +1,33 @@
+package com.l2jserver.gameserver.network.clientpackets;
+
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.network.serverpackets.ExBrGamePoint;
+
+/**
+ * @author fissban
+ */
+public class RequestBrGamePoint extends L2GameClientPacket
+{
+    private static final String TYPE = "[C] D0:89 RequestBrGamePoint";
+    
+    @Override
+    protected void readImpl()
+    {
+    }
+    
+    @Override
+    protected void runImpl()
+    {
+        L2PcInstance player = getClient().getActiveChar();
+        if (player != null)
+        {
+            player.sendPacket(new ExBrGamePoint(player));
+        }
+    }
+    
+    @Override
+    public String getType()
+    {
+        return TYPE;
+    }
+}
\ No newline at end of file
diff --git a/L2J_Server/java/com/l2jserver/gameserver/network/clientpackets/RequestBrProductInfo.java b/L2J_Server/java/com/l2jserver/gameserver/network/clientpackets/RequestBrProductInfo.java
new file mode 100644
index 0000000..67b4bcf
--- /dev/null
+++ b/L2J_Server/java/com/l2jserver/gameserver/network/clientpackets/RequestBrProductInfo.java
@@ -0,0 +1,36 @@
+package com.l2jserver.gameserver.network.clientpackets;
+
+import com.l2jserver.gameserver.datatables.PrimeShopTable;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+
+/**
+ * @author fissban
+ */
+public class RequestBrProductInfo extends L2GameClientPacket
+{
+    private static final String TYPE = "[C] D0:8B RequestBrProductInfo";
+    
+    private int _brId;
+    
+    @Override
+    protected void readImpl()
+    {
+        _brId = readD();
+    }
+    
+    @Override
+    protected void runImpl()
+    {
+        L2PcInstance player = getClient().getActiveChar();
+        if (player != null)
+        {
+            PrimeShopTable.getInstance().showProductInfo(player, _brId);
+        }
+    }
+    
+    @Override
+    public String getType()
+    {
+        return TYPE;
+    }
+}
\ No newline at end of file
diff --git a/L2J_Server/java/com/l2jserver/gameserver/network/clientpackets/RequestBrProductList.java b/L2J_Server/java/com/l2jserver/gameserver/network/clientpackets/RequestBrProductList.java
new file mode 100644
index 0000000..d806c44
--- /dev/null
+++ b/L2J_Server/java/com/l2jserver/gameserver/network/clientpackets/RequestBrProductList.java
@@ -0,0 +1,33 @@
+package com.l2jserver.gameserver.network.clientpackets;
+
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.network.serverpackets.ExBrProductList;
+
+/**
+ * @author fissban
+ */
+public class RequestBrProductList extends L2GameClientPacket
+{
+    private static final String TYPE = "[C] D0:89 RequestBrProductList";
+    
+    @Override
+    protected void readImpl()
+    {
+    }
+    
+    @Override
+    protected void runImpl()
+    {
+        L2PcInstance player = getClient().getActiveChar();
+        if (player != null)
+        {
+            player.sendPacket(new ExBrProductList());
+        }
+    }
+    
+    @Override
+    public String getType()
+    {
+        return TYPE;
+    }
+}
\ No newline at end of file
diff --git a/L2J_Server/java/com/l2jserver/gameserver/network/serverpackets/ExBrBuyProduct.java b/L2J_Server/java/com/l2jserver/gameserver/network/serverpackets/ExBrBuyProduct.java
new file mode 100644
index 0000000..1b24261
--- /dev/null
+++ b/L2J_Server/java/com/l2jserver/gameserver/network/serverpackets/ExBrBuyProduct.java
@@ -0,0 +1,22 @@
+package com.l2jserver.gameserver.network.serverpackets;
+
+/**
+ * @author fissban
+ */
+public class ExBrBuyProduct extends L2GameServerPacket
+{
+    private final int _result;
+    
+    public ExBrBuyProduct(int result)
+    {
+        _result = result;
+    }
+    
+    @Override
+    protected void writeImpl()
+    {
+        writeC(0xFE);
+        writeH(0xD8);
+        writeD(_result);
+    }
+}
\ No newline at end of file
diff --git a/L2J_Server/java/com/l2jserver/gameserver/network/serverpackets/ExBrGamePoint.java b/L2J_Server/java/com/l2jserver/gameserver/network/serverpackets/ExBrGamePoint.java
new file mode 100644
index 0000000..1c87422
--- /dev/null
+++ b/L2J_Server/java/com/l2jserver/gameserver/network/serverpackets/ExBrGamePoint.java
@@ -0,0 +1,28 @@
+package com.l2jserver.gameserver.network.serverpackets;
+
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+
+/**
+ * @author fissban
+ */
+public class ExBrGamePoint extends L2GameServerPacket
+{
+    private final int _objId;
+    private final long _points;
+    
+    public ExBrGamePoint(L2PcInstance player)
+    {
+        _objId = player.getObjectId();
+        _points = player.getGamePoints();
+    }
+    
+    @Override
+    public void writeImpl()
+    {
+        writeC(0xFE);
+        writeH(0xD5);
+        writeD(_objId);
+        writeQ(_points);
+        writeD(0x00); // ??
+    }
+}
\ No newline at end of file
diff --git a/L2J_Server/java/com/l2jserver/gameserver/network/serverpackets/ExBrProductInfo.java b/L2J_Server/java/com/l2jserver/gameserver/network/serverpackets/ExBrProductInfo.java
new file mode 100644
index 0000000..df346c7
--- /dev/null
+++ b/L2J_Server/java/com/l2jserver/gameserver/network/serverpackets/ExBrProductInfo.java
@@ -0,0 +1,44 @@
+package com.l2jserver.gameserver.network.serverpackets;
+
+import com.l2jserver.gameserver.datatables.PrimeShopTable.PrimeShopItem;
+
+/**
+ * @author fissban
+ */
+public class ExBrProductInfo extends L2GameServerPacket
+{
+    private final int _brId;
+    private final int _price;
+    private final int _cat;
+    private final int _itemId;
+    private final int _count;
+    private final int _weight;
+    private final int _tradable;
+    
+    public ExBrProductInfo(int brId, PrimeShopItem item)
+    {
+        _brId = brId;
+        _price = item.getPrimeItemPrice();
+        _cat = item.getPrimeItemCat();
+        _itemId = item.getPrimeItemId();
+        _count = item.getPrimeItemCount();
+        _weight = item.getPrimeWeight();
+        _tradable = item.getPrimeTradable();
+    }
+    
+    @Override
+    protected void writeImpl()
+    {
+        
+        writeC(0xFE);
+        writeH(0xD7);
+        
+        writeD(_brId); // product id
+        writeD(_price); // points
+        writeD(_cat); // cat
+        writeD(_itemId); // item id
+        writeD(_count); // quality
+        writeD(_weight); // weight
+        writeD(_tradable); // 0 - dont drop/trade
+    }
+}
\ No newline at end of file
diff --git a/L2J_Server/java/com/l2jserver/gameserver/network/serverpackets/ExBrProductList.java b/L2J_Server/java/com/l2jserver/gameserver/network/serverpackets/ExBrProductList.java
new file mode 100644
index 0000000..9c8e6ee
--- /dev/null
+++ b/L2J_Server/java/com/l2jserver/gameserver/network/serverpackets/ExBrProductList.java
@@ -0,0 +1,53 @@
+package com.l2jserver.gameserver.network.serverpackets;
+
+import java.util.Map;
+import java.util.Map.Entry;
+
+import com.l2jserver.gameserver.datatables.PrimeShopTable;
+import com.l2jserver.gameserver.datatables.PrimeShopTable.PrimeShopItem;
+
+/**
+ * @author fissban
+ */
+public class ExBrProductList extends L2GameServerPacket
+{
+    private final Map<Integer, PrimeShopItem> primeList;
+    
+    public ExBrProductList()
+    {
+        primeList = PrimeShopTable.getInstance().getPrimeItems();
+        
+    }
+    
+    @Override
+    protected void writeImpl()
+    {
+        writeC(0xFE);
+        writeH(0xD6);
+        writeD(primeList.size());
+        
+        for (Entry<Integer, PrimeShopItem> entrySet : primeList.entrySet())
+        {
+            PrimeShopItem item = entrySet.getValue();
+            if ((System.currentTimeMillis() >= item.sale_start_date()) && (System.currentTimeMillis() <= item.sale_end_date()))
+            {
+                int brId = entrySet.getKey().intValue();
+                
+                writeD(brId); // product id
+                writeH(item.getPrimeItemCat()); // category 1 - enchant 2 - supplies 3 - decoration 4 - package 5 - other
+                writeD(item.getPrimeItemPrice()); // points
+                writeD(item.getPrimeType());// show tab 2-th group - 1 ?????????? ?????? ??? ???? 1 - event 2 - best 3 - event & best
+                writeD((int) (item.sale_start_date() / 1000)); // start sale
+                writeD((int) (item.sale_end_date() / 1000)); // end sale
+                writeC(1); // day week... necesita revisarse (0x00)
+                writeC(item.getStartHour()); // start hour
+                writeC(item.getStartMin()); // start min
+                writeC(item.getEndHour()); // end hour
+                writeC(item.getEndMin()); // end min
+                
+                writeD(PrimeShopTable.getInstance().getActualStock(brId)); // current stock
+                writeD(PrimeShopTable.getInstance().getMaxStock(brId)); // max stock
+            }
+        }
+    }
+}
\ No newline at end of file

CitarDATA:

diff --git a/L2J_DataPack/dist/game/data/PrimeShop.xml b/L2J_DataPack/dist/game/data/PrimeShop.xml
new file mode 100644
index 0000000..5306292
--- /dev/null
+++ b/L2J_DataPack/dist/game/data/PrimeShop.xml
@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--    Categories :            -->
+<!--    1 - enchant                -->
+<!--    2 - supplies            -->
+<!--    3 - decorating            -->
+<!--    4 - package                -->
+<!--    5 - others                -->
+
+<!-- brId = ProductName-e.dat -->
+<!-- itemId = ItemName.dat -->
+<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/primeShop.xsd">
+
+    <!-- OTHERS -->
+    <!-- Small fortuna box -->
+    <item brId="1080001" itemId="22000" count="1" cat="5" price="1" event="false" best="true" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Middle fortuna box -->
+    <item brId="1080002" itemId="22001" count="1" cat="5" price="1" event="false" best="true" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Large fortuna box -->
+    <item brId="1080003" itemId="22002" count="1" cat="5" price="1" event="false" best="true" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Small fortuna cube -->
+    <item brId="1080004" itemId="22003" count="1" cat="5" price="1" event="false" best="true" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Middle fortuna cube -->
+    <item brId="1080005" itemId="22004" count="1" cat="5" price="1" event="false" best="true" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Large fortuna cube -->
+    <item brId="1080006" itemId="22005" count="1" cat="5" price="1" event="false" best="true" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    
+    
+    <!-- SUPPLIES -->
+    <!-- Powerful Healing Potion -->
+    <item brId="1080007" itemId="22025" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- High-grade Healing Potion -->
+    <item brId="1080008" itemId="22026" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Secret medicine of Will - D grade -->
+    <item brId="1080009" itemId="22027" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Secret medicine of Will - C grade -->
+    <item brId="1080010" itemId="22028" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Secret medicine of Will - B grade -->
+    <item brId="1080011" itemId="22029" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Secret medicine of Will - A grade -->
+    <item brId="1080012" itemId="22030" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Secret medicine of Will - S grade -->
+    <item brId="1080013" itemId="22031" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Secret medicine of Life - D grade -->
+    <item brId="1080014" itemId="22032" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Secret medicine of Life - C grade -->
+    <item brId="1080015" itemId="22033" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Secret medicine of Life - B grade -->
+    <item brId="1080016" itemId="22034" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Secret medicine of Life - A grade -->
+    <item brId="1080017" itemId="22035" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Secret medicine of Life - S grade -->
+    <item brId="1080018" itemId="22036" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Potion of Will -->
+    <item brId="1080019" itemId="22037" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Healing medicine for Mana -->
+    <item brId="1080020" itemId="22038" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Sweet Fruit Cocktail -->
+    <item brId="1080199" itemId="20393" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Fresh Fruit Cocktail -->
+    <item brId="1080200" itemId="20394" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    
+    
+    <!-- SUPPLIES -->
+    <!-- Wind Walk Scroll -->
+    <item brId="1080021" itemId="22039" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Haste Scroll -->
+    <item brId="1080022" itemId="22040" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Might Scroll -->
+    <item brId="1080023" itemId="22041" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Shield Scroll -->
+    <item brId="1080024" itemId="22042" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Death Whisper Scroll -->
+    <item brId="1080025" itemId="22043" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Guidance Scroll -->
+    <item brId="1080026" itemId="22044" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Empower Scrol -->
+    <item brId="1080027" itemId="22045" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Grater Acumen Scroll -->
+    <item brId="1080028" itemId="22046" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Vampiric Rage Scroll     -->
+    <item brId="1080029" itemId="22047" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Bless the Body Scroll -->
+    <item brId="1080030" itemId="22048" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Berserker Spirit Scroll -->
+    <item brId="1080031" itemId="22049" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Magic Barrier Scroll -->
+    <item brId="1080032" itemId="22050" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Bless the Soul Scrol -->
+    <item brId="1080033" itemId="22051" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Clarity Scroll -->
+    <item brId="1080034" itemId="22052" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Wild Magic Scroll -->
+    <item brId="1080035" itemId="22053" count="1" cat="2" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    
+    
+    <!-- EVENT -->
+    <!-- Rune of Experience Points 24hs -->
+    <item brId="1080036" itemId="22054" count="1" cat="5" price="1" event="true" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Rune of Experience Points 168hs -->
+    <item brId="1080037" itemId="22055" count="1" cat="5" price="1" event="true" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Rune of Experience Points 336hs -->
+    <item brId="1080038" itemId="22056" count="1" cat="5" price="1" event="true" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Rune of Experience Points 720hs -->
+    <item brId="1080039" itemId="22057" count="1" cat="5" price="1" event="true" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Rune of SP 24hs -->
+    <item brId="1080040" itemId="22058" count="1" cat="5" price="1" event="true" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Rune of SP 168hs -->
+    <item brId="1080041" itemId="22059" count="1" cat="5" price="1" event="true" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Rune of SP 336hs -->
+    <item brId="1080042" itemId="22060" count="1" cat="5" price="1" event="true" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Rune of SP 720hs -->
+    <item brId="1080043" itemId="22061" count="1" cat="5" price="1" event="true" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    
+    
+    <!-- PACKAGE -->
+    <!-- Bone Bolt Container -->
+    <item brId="1080056" itemId="22149" count="1" cat="4" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Steel Bolt Container -->
+    <item brId="1080057" itemId="22150" count="1" cat="4" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Silver Bolt Container -->
+    <item brId="1080058" itemId="22151" count="1" cat="4" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Mithril Bolt Containe -->
+    <item brId="1080059" itemId="22152" count="1" cat="4" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Bolt Container of Light -->
+    <item brId="1080060" itemId="22153" count="1" cat="4" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Blessed Spiritshot Pack - D grade -->
+    <item brId="1080061" itemId="22094" count="1" cat="4" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Blessed Spiritshot Pack - C grade -->
+    <item brId="1080062" itemId="22095" count="1" cat="4" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Blessed Spiritshot Pack - B grade -->
+    <item brId="1080063" itemId="22096" count="1" cat="4" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Blessed Spiritshot Pack - A grade -->
+    <item brId="1080063" itemId="22097" count="1" cat="4" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Blessed Spiritshot Pack - S grade -->
+    <item brId="1080063" itemId="22098" count="1" cat="4" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Soulshot Pack - D grade -->
+    <item brId="1080071" itemId="22104" count="1" cat="4" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Soulshot Pack - C grade -->
+    <item brId="1080072" itemId="22105" count="1" cat="4" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Soulshot Pack - B grade -->
+    <item brId="1080073" itemId="22106" count="1" cat="4" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Soulshot Pack - A grade -->
+    <item brId="1080074" itemId="22107" count="1" cat="4" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Soulshot Pack - S grade -->
+    <item brId="1080075" itemId="22108" count="1" cat="4" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    
+    
+    <!-- ENCHANT -->
+    <!-- Weapon-type Enhance Backup Stone (D-Grade) -->
+    <item brId="1080130" itemId="12362" count="1" cat="1" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Weapon-type Enhance Backup Stone (C-Grade) -->
+    <item brId="1080131" itemId="12363" count="1" cat="1" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Weapon-type Enhance Backup Stone (B-Grade) -->
+    <item brId="1080132" itemId="12364" count="1" cat="1" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Weapon-type Enhance Backup Stone (A-Grade) -->
+    <item brId="1080133" itemId="12365" count="1" cat="1" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Weapon-type Enhance Backup Stone (S-Grade) -->
+    <item brId="1080134" itemId="12366" count="1" cat="1" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Armor-type Enhance Backup Stone (D-Grade) -->
+    <item brId="1080135" itemId="12367" count="1" cat="1" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Armor-type Enhance Backup Stone (C-Grade) -->
+    <item brId="1080136" itemId="12368" count="1" cat="1" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Armor-type Enhance Backup Stone (B-Grade) -->
+    <item brId="1080137" itemId="12369" count="1" cat="1" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Armor-type Enhance Backup Stone (A-Grade) -->
+    <item brId="1080138" itemId="12370" count="1" cat="1" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Armor-type Enhance Backup Stone (S-Grade) -->
+    <item brId="1080139" itemId="12380" count="1" cat="1" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    
+    
+    <!-- DECORATING -->
+    <!-- Color Name -->
+    <item brId="1030032" itemId="13021" count="1" cat="3" price="1" event="false" best="true" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Uniform Hat -->
+    <item brId="1030068" itemId="20020" count="1" cat="3" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Napoleon Hat -->
+    <item brId="1030069" itemId="20322" count="1" cat="3" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Popped-Out Eye -->
+    <item brId="1030070" itemId="13491" count="1" cat="3" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Halloween Hat -->
+    <item brId="1030076" itemId="13489" count="1" cat="3" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Kai the Cat Hat -->
+    <item brId="1030080" itemId="20501" count="1" cat="3" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Afro Hair Pack - Gold -->
+    <item brId="1030038" itemId="20278" count="1" cat="3" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />
+    <!-- Afro Hair Pack - Pink -->
+    <item brId="1030039" itemId="20279" count="1" cat="3" price="1" event="false" best="false" sale_start_date="2000.10.07 12:00" sale_end_date="2014.11.08 18:00" />    
+</list>
\ No newline at end of file
diff --git a/L2J_DataPack/dist/game/data/scripts/custom/prueba/Prueba.java b/L2J_DataPack/dist/game/data/scripts/custom/prueba/Prueba.java
new file mode 100644
index 0000000..3e2ac7d
--- /dev/null
+++ b/L2J_DataPack/dist/game/data/scripts/custom/prueba/Prueba.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2004-2015 L2J DataPack
+ * 
+ * This file is part of L2J DataPack.
+ * 
+ * L2J DataPack is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * L2J DataPack is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package custom.prueba;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import com.l2jserver.gameserver.ai.CtrlIntention;
+import com.l2jserver.gameserver.model.Location;
+import com.l2jserver.gameserver.model.actor.L2Attackable;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.quest.Quest;
+
+/**
+ * @author fissban
+ */
+public class Prueba extends Quest
+{
+    // mob custom
+    private static final int MOB = 22840;
+    private static final int MOB_COUNT = 5;
+    // loc A
+    private static final Location LOC_A = new Location(82852, 149346, -3467);
+    // loc B
+    private static final Location LOC_B = new Location(82782, 147808, -3470);
+    // rango de ataque
+    private static final int RANGE = 300;
+    // instance npc
+    private final List<L2Npc> _mobList = new CopyOnWriteArrayList<>();
+    
+    public Prueba()
+    {
+        super(-1, Prueba.class.getSimpleName(), "custom");
+        
+        addStartNpc(MOB);
+        addTalkId(MOB);
+        addAttackId(MOB);
+        
+        startQuestTimer("spawn_mobs", 20000, null, null, true); // 20 seg de spawn
+    }
+    
+    @Override
+    public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
+    {
+        switch (event)
+        {
+            case "spawn_mobs":
+                for (int cont = 0; cont < MOB_COUNT; cont++)
+                {
+                    L2Npc mobs = addSpawn(MOB, LOC_A);
+                    
+                    _mobList.add(mobs);
+                    
+                    mobs.setIsNoRndWalk(true);
+                    mobs.setIsRunning(false);
+                }
+                
+                startQuestTimer("mobs_ai", 100, null, null, true);
+                startQuestTimer("delete_npc", 100, null, null, true);
+                break;
+            
+            case "mobs_ai":
+                for (L2Npc mob : _mobList)
+                {
+                    // si ya tiene target...lo dejamos q termine
+                    if (mob.getTarget() != null)
+                    {
+                        continue;
+                    }
+                    
+                    for (L2PcInstance victim : mob.getKnownList().getKnownPlayersInRadius(RANGE))
+                    {
+                        // si ya tiene target...lo dejamos con el q tiene.
+                        if (mob.getTarget() != null)
+                        {
+                            continue;
+                        }
+                        
+                        npc.getAI().stopAITask();
+                        npc.setTarget(player);
+                        npc.setIsRunning(true);
+                        ((L2Attackable) npc).addDamageHate(victim, 0, 99999);
+                        npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, victim);
+                    }
+                    
+                    // si el mobs aun continua sin target lo hacemos caminar
+                    if (mob.getTarget() == null)
+                    {
+                        mob.setIsRunning(false);
+                        mob.getAI().stopAITask();
+                        mob.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, LOC_B);
+                    }
+                }
+                
+                break;
+            
+            case "delete_npc":
+                for (L2Npc mobsAttack : _mobList)
+                {
+                    if (mobsAttack.isAttackingNow())
+                    {
+                        _mobList.remove(mobsAttack);
+                        // delete npc
+                        mobsAttack.getSpawn().stopRespawn();
+                        mobsAttack.deleteMe();
+                    }
+                }
+                
+                break;
+        
+        }
+        
+        return null;
+    }
+    
+    @Override
+    public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
+    {
+        _mobList.remove(npc);
+        npc.getSpawn().stopRespawn();
+        npc.deleteMe();
+        return null;
+    }
+    
+    public static void main(String[] args)
+    {
+        new Prueba();
+    }
+}
diff --git a/L2J_DataPack/dist/game/data/xsd/primeShop.xsd b/L2J_DataPack/dist/game/data/xsd/primeShop.xsd
new file mode 100644
index 0000000..86a6f0f
--- /dev/null
+++ b/L2J_DataPack/dist/game/data/xsd/primeShop.xsd
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+    <xs:element name="list">
+        <xs:complexType>
+            <xs:sequence minOccurs="1" maxOccurs="1" >
+                <xs:element name="item" minOccurs="1" maxOccurs="unbounded">
+                    <xs:complexType>
+                        <xs:attribute name="brId" type="xs:long" use="required" />
+                        <xs:attribute name="itemId" type="xs:integer" use="required" />
+                        <xs:attribute name="count" type="xs:integer" use="required" />
+                        <xs:attribute name="cat" type="xs:integer" use="required" />
+                        <xs:attribute name="price" type="xs:integer" use="required" />
+                        <xs:attribute name="event" type="xs:boolean" use="required" />
+                        <xs:attribute name="best" type="xs:boolean" use="required" />
+                        <xs:attribute name="sale_start_date" type="xs:string" />
+                        <xs:attribute name="sale_end_date" type="xs:string" />
+                    </xs:complexType>
+                </xs:element>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+</xs:schema>
+                
\ No newline at end of file
diff --git a/L2J_DataPack/dist/sql/game/characters.sql b/L2J_DataPack/dist/sql/game/characters.sql
index 86ab28d..e341fd8 100644
--- a/L2J_DataPack/dist/sql/game/characters.sql
+++ b/L2J_DataPack/dist/sql/game/characters.sql
@@ -55,6 +55,7 @@
   `vitality_points` SMALLINT UNSIGNED NOT NULL DEFAULT 0,
   `createDate` date NOT NULL DEFAULT '0000-00-00',
   `language` VARCHAR(2) DEFAULT NULL,
+  `game_points` bigint(13) NOT NULL DEFAULT 0,
   PRIMARY KEY (`charId`),
   KEY `account_name` (`account_name`),
   KEY `char_name` (`char_name`),