Noticias:

Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectate

Menú Principal

Prime Shop (Fissban)

Iniciado por Swarlog, Ago 31, 2022, 08:40 PM

Tema anterior - Siguiente tema

Swarlog

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`),