Advertisement
Guest User

Untitled

a guest
Feb 11th, 2018
388
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 147.27 KB | None | 0 0
  1. package net.sf.l2j.gameserver.model.actor.instance;
  2.  
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6. import java.text.SimpleDateFormat;
  7. import java.util.Calendar;
  8. import java.util.Date;
  9. import java.util.concurrent.TimeUnit;
  10. import java.util.logging.Logger;
  11.  
  12. import javolution.text.TextBuilder;
  13. import javolution.util.FastMap;
  14. import javolution.util.FastTable;
  15.  
  16. import net.sf.l2j.Config;
  17. import net.sf.l2j.L2DatabaseFactory;
  18. import net.sf.l2j.gameserver.cache.Static;
  19. import net.sf.l2j.gameserver.datatables.AugmentationData;
  20. import net.sf.l2j.gameserver.datatables.CustomServerData;
  21. import net.sf.l2j.gameserver.datatables.CustomServerData.ChinaItem;
  22. import net.sf.l2j.gameserver.datatables.CustomServerData.DonateItem;
  23. import net.sf.l2j.gameserver.datatables.CustomServerData.DonateSkill;
  24. import net.sf.l2j.gameserver.datatables.CustomServerData.StatCastle;
  25. import net.sf.l2j.gameserver.datatables.CustomServerData.StatClan;
  26. import net.sf.l2j.gameserver.datatables.CustomServerData.StatPlayer;
  27. import net.sf.l2j.gameserver.datatables.ItemTable;
  28. import net.sf.l2j.gameserver.datatables.SkillTable;
  29. import net.sf.l2j.gameserver.model.L2Augmentation;
  30. import net.sf.l2j.gameserver.model.L2Clan;
  31. import net.sf.l2j.gameserver.model.L2ItemInstance;
  32. import net.sf.l2j.gameserver.model.L2Skill;
  33. import net.sf.l2j.gameserver.model.L2World;
  34. import net.sf.l2j.gameserver.model.base.ClassId;
  35. import net.sf.l2j.gameserver.network.SystemMessageId;
  36. //import net.sf.l2j.gameserver.network.serverpackets.InventoryUpdate;
  37. import net.sf.l2j.gameserver.network.serverpackets.ExMailArrived;
  38. import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
  39. import net.sf.l2j.gameserver.network.serverpackets.PlaySound;
  40. import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
  41. import net.sf.l2j.gameserver.templates.L2Item;
  42. import net.sf.l2j.gameserver.templates.L2NpcTemplate;
  43. import net.sf.l2j.mysql.Close;
  44. import net.sf.l2j.mysql.Connect;
  45. import net.sf.l2j.util.Log;
  46. import net.sf.l2j.util.log.AbstractLogger;
  47. import net.sf.l2j.util.Rnd;
  48.  
  49. public class L2DonateInstance extends L2NpcInstance {
  50.  
  51.     public static final Logger _log = AbstractLogger.getLogger(L2DonateInstance.class.getName());
  52.     private static final int STOCK_SERTIFY = Config.STOCK_SERTIFY; // ID итема - сертификат, позволяющий барыжить на бирже
  53.     private static final int SERTIFY_PRICE = Config.SERTIFY_PRICE; // стоимость сертификата
  54.     private static final int FIRST_BALANCE = Config.FIRST_BALANCE; // счет на бирже; при покупке сертификата и создании аккаунта
  55.     private static final int DONATE_COIN = Config.DONATE_COIN; // ID итема - донат монетки, пополняющие счет биржи
  56.     private static final String DONATE_COIN_NEMA = Config.DONATE_COIN_NEMA; // Название донат монетки
  57.     private static final int DONATE_RATE = Config.DONATE_RATE; // 1 DONATE_COIN = (X) DONATE_RATE на баланс биржи
  58.     private static final int NALOG_NPS = (100 - Config.NALOG_NPS); // налог с продажи шмотки
  59.     private static final String VAL_NAME = Config.VAL_NAME;
  60.     private static final int PAGE_LIMIT = Config.PAGE_LIMIT; // показ шмоток с биржи, лимит на страницу, ?Html file too long
  61.     // перенос заточки и аугментации
  62.     private static final int AUGMENT_COIN = Config.AUGMENT_COIN; // ID итема, за перенос аугментации
  63.     private static final int ENCHANT_COIN = Config.ENCHANT_COIN; // ID итема, за перенос заточки  
  64.     private static final String AUGMENT_COIN_NAME = Config.AUGMENT_COIN_NAME; // название итема, за перенос аугментации
  65.     private static final String ENCHANT_COIN_NAME = Config.ENCHANT_COIN_NAME; // название итема, за перенос заточки
  66.     private static final int AUGMENT_PRICE = Config.AUGMENT_PRICE; // плата за перенос аугментации
  67.     private static final int ENCHANT_PRICE = Config.ENCHANT_PRICE;//  плата за перенос заточки
  68.     //клан
  69.     private static final int CLAN_COIN = Config.CLAN_COIN;
  70.     private static final String CLAN_COIN_NAME = Config.CLAN_COIN_NAME; // название итема, за перенос аугментации
  71.     private static final int CLAN_LVL6 = Config.CLAN_LVL6;
  72.     private static final int CLAN_LVL7 = Config.CLAN_LVL7;
  73.     private static final int CLAN_LVL8 = Config.CLAN_LVL8;
  74.     private static final int CLAN_POINTS = Config.CLAN_POINTS;
  75.     private static final int CLAN_POINTS_PRICE = Config.CLAN_POINTS_PRICE;
  76.     //аугментация
  77.     private static final int AUGSALE_COIN = Config.AUGSALE_COIN; // ID итема
  78.     private static final int AUGSALE_PRICE = Config.AUGSALE_PRICE; // стоимость
  79.     private static final String AUGSALE_COIN_NAME = Config.AUGSALE_COIN_NAME; // название итема
  80.     private static final FastMap<Integer, Integer> AUGSALE_TABLE = Config.AUGSALE_TABLE;
  81.     private static final FastMap<Integer, Integer> PREMIUM_DAY_PRICES = Config.PREMIUM_DAY_PRICES;
  82.     //skill of balance
  83.     private static final int SOB_COIN = Config.SOB_COIN; // ID итема
  84.     private static final int SOB_PRICE_ONE = Config.SOB_PRICE_ONE; // стоимость
  85.     private static final int SOB_PRICE_TWO = Config.SOB_PRICE_TWO; // стоимость
  86.     private static final String SOB_COIN_NAME = Config.SOB_COIN_NAME; // название итема
  87.     // донат шоп
  88.     //private static final int DSHOP_COIN = Config.DSHOP_COIN; // ID итема - донат монетки
  89.     //private static final String DSHOP_COIN_NEMA = Config.DSHOP_COIN_NEMA; // Название донат монетки
  90.     //private static final FastTable<DonateItem> DONATE_ITEMS = CustomServerData.DONATE_ITEMS;
  91.     //кеш донат скиллов
  92.     public static FastMap<Integer, FastTable<DonateSkill>> _donateSkills = CustomServerData._donateSkills;
  93.  
  94.     public L2DonateInstance(int objectId, L2NpcTemplate template) {
  95.         super(objectId, template);
  96.     }
  97.  
  98.     @Override
  99.     public void onBypassFeedback(L2PcInstance player, String command) {
  100.         //System.out.println("String: " + command);
  101.  
  102.         if (command.startsWith("StockExchange")) {
  103.             int val = Integer.parseInt(command.substring(13).trim());
  104.  
  105.             switch (val) {
  106.                 case 1: // приветствие
  107.                     L2ItemInstance setify = player.getInventory().getItemByItemId(STOCK_SERTIFY);
  108.                     if (setify != null && setify.getCount() >= 1) {
  109.                         showWelcome(player, 1);
  110.                     } else {
  111.                         showWelcome(player, 0);
  112.                     }
  113.                     break;
  114.                 case 2: // список товаров на бирже
  115.                     showStockSellList(player, 1, 0);
  116.                     break;
  117.                 case 3: // выставление на биржу своих шмоток
  118.                     showInventoryItems(player);
  119.                     break;
  120.                 case 4: // личный кабинет
  121.                     showPrivateInfo(player);
  122.                     break;
  123.                 case 5: // покупка сертификата
  124.                     showSertifyInfo(player);
  125.                     break;
  126.                 default:
  127.                     showError(player, "Ошибка запроса.");
  128.                     break;
  129.             }
  130.         } else if (command.startsWith("StockShowItem")) // покупка на бирже, подробная инфа о шмотке на бирже
  131.         {
  132.             int sellId = Integer.parseInt(command.substring(13).trim());
  133.             if (sellId == 0) {
  134.                 showError(player, "Ошибка запроса.");
  135.                 return;
  136.             }
  137.  
  138.             showStockItem(player, sellId);
  139.         } else if (command.startsWith("StockInventoryItem")) // выставление на биржу, подробная инфа о шмотке в инвентаре
  140.         {
  141.             int objectId = Integer.parseInt(command.substring(18).trim());
  142.             if (objectId == 0) {
  143.                 showError(player, "Ошибка запроса.");
  144.                 return;
  145.             }
  146.  
  147.             showInventoryItem(player, objectId);
  148.         } else if (command.startsWith("StockBuyItem")) // finish покупка с биржи
  149.         {
  150.             int sellId = Integer.parseInt(command.substring(12).trim());
  151.             if (sellId == 0) {
  152.                 showError(player, "Ошибка запроса.");
  153.                 return;
  154.             }
  155.             buyStockItem(player, sellId);
  156.         } else if (command.startsWith("StockAddItem")) // finish добавление шмотки на биржу
  157.         {
  158.             try {
  159.                 String[] opaopa = command.split(" ");
  160.                 int objectId = Integer.parseInt(opaopa[1]);
  161.                 int price = Integer.parseInt(opaopa[2]);
  162.                 if (objectId == 0 || price == 0) {
  163.                     showError(player, "Ошибка запроса.");
  164.                     return;
  165.                 }
  166.                 addStockItem(player, objectId, price);
  167.             } catch (Exception e) //catch (ArrayIndexOutOfBoundsException e)
  168.             {
  169.                 showError(player, "Ошибка запроса.");
  170.                 return;
  171.             }
  172.         } else if (command.startsWith("showPrivateInfo")) // обработчик личного кабинета
  173.         {
  174.             int val = Integer.parseInt(command.substring(15).trim());
  175.  
  176.             switch (val) {
  177.                 case 1: // Обменять донат монеты в валюту биржи
  178.                     incBalance(player);
  179.                     break;
  180.                 case 2: // список своих шмоток на бирже, с возможностью забрать
  181.                     showStockSellList(player, 1, 1);
  182.                     break;
  183.                 case 14:
  184.                     //showLogs(player);
  185.                     break;
  186.                 default:
  187.                     showError(player, "Ошибка запроса.");
  188.                     break;
  189.             }
  190.         } else if (command.startsWith("StockAddBalance")) // обмен монет в валюту биржи
  191.         {
  192.             try {
  193.                 int val = Integer.parseInt(command.substring(15).trim());
  194.                 StockAddBalance(player, val);
  195.             } catch (Exception e) //catch (NumberFormatException e)
  196.             {
  197.                 showError(player, "Ошибка запроса.");
  198.                 return;
  199.             }
  200.         } else if (command.startsWith("StockShowPage")) // постраничность
  201.         {
  202.             try {
  203.                 String[] opaopa = command.split(" ");
  204.                 int page = Integer.parseInt(opaopa[1]);
  205.                 int self = Integer.parseInt(opaopa[2]);
  206.                 if (page == 0) {
  207.                     showError(player, "Ошибка запроса.");
  208.                     return;
  209.                 }
  210.                 showStockSellList(player, page, self);
  211.             } catch (Exception e) //catch (ArrayIndexOutOfBoundsException e)
  212.             {
  213.                 showError(player, "Ошибка запроса.");
  214.                 return;
  215.             }
  216.         } else if (command.equalsIgnoreCase("StockSertifyBuy")) {
  217.             StockSertifyBuy(player);
  218.         } else if (command.equalsIgnoreCase("voteHome")) {
  219.             showChatWindow(player, "data/html/default/80007.htm");
  220.         } else if (command.startsWith("voteService")) {
  221.             String[] opaopa = command.split(" ");
  222.             int service = Integer.parseInt(opaopa[1]);
  223.             int page = Integer.parseInt(opaopa[2]);
  224.             if (service > 2) {
  225.                 return;
  226.             }
  227.  
  228.             showVoteServiceWindow(player, service, page);
  229.         } else if (command.startsWith("voteItemShow_")) {
  230.             String[] opaopa = command.split("_");
  231.             int service = Integer.parseInt(opaopa[1]);
  232.             int objectId = Integer.parseInt(opaopa[2]);
  233.  
  234.             if (service > 2) {
  235.                 return;
  236.             }
  237.  
  238.             showVote1Item(player, service, objectId);
  239.         } else if (command.startsWith("voteItem2Show_")) {
  240.             String[] opaopa = command.split("_");
  241.             int service = Integer.parseInt(opaopa[1]);
  242.             int objectId = Integer.parseInt(opaopa[2]);
  243.  
  244.             if (service > 2) {
  245.                 return;
  246.             }
  247.  
  248.             showVote2Item(player, service, objectId);
  249.         } else if (command.startsWith("voteStep2")) {
  250.             String[] opaopa = command.split(" ");
  251.             int service = Integer.parseInt(opaopa[1]);
  252.             int page = Integer.parseInt(opaopa[2]);
  253.             if (service > 2) {
  254.                 return;
  255.             }
  256.  
  257.             showVoteNextItems(player, service, page);
  258.         } else if (command.startsWith("voteStep3_")) {
  259.             int service = Integer.parseInt(command.substring(10).trim());
  260.  
  261.             if (service > 2) {
  262.                 return;
  263.             }
  264.  
  265.             showVoteAgree(player, service);
  266.         } else if (command.startsWith("voteComplete_")) {
  267.             int service = Integer.parseInt(command.substring(13).trim());
  268.  
  269.             if (service > 2) {
  270.                 return;
  271.             }
  272.  
  273.             showDoVoteFinish(player, service);
  274.         } else if (command.startsWith("clanService_")) {
  275.             int service = Integer.parseInt(command.substring(12).trim());
  276.  
  277.             if (service > 2) {
  278.                 return;
  279.             }
  280.  
  281.             if (!player.isClanLeader()) {
  282.                 player.sendPacket(Static.WAR_NOT_LEADER);
  283.                 return;
  284.             }
  285.  
  286.             if (player.getClan().getLevel() < 5) {
  287.                 player.sendPacket(Static.CLAN_5LVL_HIGHER);
  288.                 return;
  289.             }
  290.  
  291.             clanWelcome(player);
  292.         } else if (command.startsWith("clanLevel_")) {
  293.             int level = Integer.parseInt(command.substring(10).trim());
  294.  
  295.             clanSetLevel(player, level);
  296.         } else if (command.equalsIgnoreCase("clanPoints")) {
  297.             clanPoints(player);
  298.         } else if (command.equalsIgnoreCase("clanSkills")) {
  299.             clanSkills(player);
  300.         } else if (command.equalsIgnoreCase("Augsale")) {
  301.             AugSaleWelcome(player);
  302.         } else if (command.equalsIgnoreCase("augSaleItems")) {
  303.             AugSaleItems(player);
  304.         } else if (command.equalsIgnoreCase("AugsaleFinish")) {
  305.             AugsaleFinish(player);
  306.         } else if (command.startsWith("augsaleShow")) {
  307.             int augId = Integer.parseInt(command.substring(11).trim());
  308.  
  309.             augSaleShow(player, augId);
  310.         } else if (command.startsWith("augsItem")) {
  311.             int objectId = Integer.parseInt(command.substring(8).trim());
  312.             if (objectId == 0) {
  313.                 showError(player, "Ошибка запроса.");
  314.                 return;
  315.             }
  316.  
  317.             AugsItem(player, objectId);
  318.         } else if (command.equalsIgnoreCase("chinaItems")) {
  319.             itemsChina(player);
  320.         } else if (command.startsWith("chinaShow")) {
  321.             int itId = Integer.parseInt(command.substring(9).trim());
  322.             if (itId == 0) {
  323.                 showError(player, "Ошибка запроса.");
  324.                 return;
  325.             }
  326.  
  327.             chinaShow(player, itId);
  328.         } else if (command.startsWith("bueChina")) {
  329.             int itId = Integer.parseInt(command.substring(8).trim());
  330.             if (itId == 0) {
  331.                 showError(player, "Ошибка запроса.");
  332.                 return;
  333.             }
  334.  
  335.             bueChina(player, itId);
  336.         } else if (command.startsWith("bueSOB")) {
  337.             if (Config.SOB_ID == 0) {
  338.                 showError(player, "Ошибка запроса.");
  339.                 return;
  340.             }
  341.             int itId = Integer.parseInt(command.substring(6).trim());
  342.             if (itId == 0) {
  343.                 showError(player, "Ошибка запроса.");
  344.                 return;
  345.             }
  346.  
  347.             bueSOB(player, itId);
  348.         } else if (command.equalsIgnoreCase("donateShop")) {
  349.             if (!Config.ALLOW_DSHOP) {
  350.                 showError(player, "Магазин отключен.");
  351.                 return;
  352.             }
  353.  
  354.             donateShop(player);
  355.         } else if (command.startsWith("dShopShow")) {
  356.             if (!Config.ALLOW_DSHOP) {
  357.                 showError(player, "Магазин отключен.");
  358.                 return;
  359.             }
  360.  
  361.             donateShopShow(player, Integer.parseInt(command.substring(9).trim()));
  362.         } else if (command.startsWith("dShopBue")) {
  363.             if (!Config.ALLOW_DSHOP) {
  364.                 showError(player, "Магазин отключен.");
  365.                 return;
  366.             }
  367.  
  368.             donateShopBue(player, Integer.parseInt(command.substring(8).trim()));
  369.         } else if (command.startsWith("addPremium")) {
  370.             if (!Config.PREMIUM_ENABLE) {
  371.                 showError(player, "Премиум отключен.");
  372.                 return;
  373.             }
  374.  
  375.             addPremium(player, Integer.parseInt(command.substring(10).trim()));
  376.         } else if (command.equalsIgnoreCase("addNoble")) {
  377.             if (!Config.NOBLES_ENABLE) {
  378.                 showError(player, "Сервис выдачи ноблесса отключен.");
  379.                 return;
  380.             }
  381.  
  382.             addNoble(player);
  383.         } else if (command.equalsIgnoreCase("donateSkillsShop")) {
  384.             if (!Config.ALLOW_DSKILLS) {
  385.                 showError(player, "Магазин отключен.");
  386.                 return;
  387.             }
  388.             donateSkillShop(player);
  389.         } else if (command.startsWith("dsShopShow")) {
  390.             if (!Config.ALLOW_DSKILLS) {
  391.                 showError(player, "Магазин отключен.");
  392.                 return;
  393.             }
  394.  
  395.             donateSkillShopShow(player, Integer.parseInt(command.substring(10).trim()));
  396.         } else if (command.startsWith("dsShopBue")) {
  397.             if (!Config.ALLOW_DSKILLS) {
  398.                 showError(player, "Магазин отключен.");
  399.                 return;
  400.             }
  401.  
  402.             donateSkillShopBue(player, Integer.parseInt(command.substring(9).trim()));
  403.         } else if (command.equalsIgnoreCase("statHome")) {
  404.             if (!Config.CACHED_SERVER_STAT) {
  405.                 showError(player, "Статистика отключена.");
  406.                 return;
  407.             }
  408.  
  409.             statHome(player);
  410.         } else if (command.startsWith("bueUniqSkill")) {
  411.             if (!Config.ALLOW_UNIQ_SKILLS) {
  412.                 showError(player, "Магазин отключен.");
  413.                 return;
  414.             }
  415.  
  416.             uniqSkillShopBue(player, Integer.parseInt(command.substring(12).trim()));
  417.         } else if (command.startsWith("statPvp")) {
  418.             statShowPvp(player, Integer.parseInt(command.substring(7).trim()));
  419.         } else if (command.startsWith("statPk")) {
  420.             statShowPk(player, Integer.parseInt(command.substring(6).trim()));
  421.         } else if (command.startsWith("statClans")) {
  422.             statClans(player, Integer.parseInt(command.substring(9).trim()));
  423.         } else if (command.equalsIgnoreCase("statCastles")) {
  424.             statCastles(player);
  425.         } else if (command.equalsIgnoreCase("changeSex")) {
  426.             if (!Config.CHGSEX_ENABLE) {
  427.                 showError(player, "Магазин отключен.");
  428.                 return;
  429.             }
  430.             changeSex(player);
  431.         } else if (command.startsWith("changeClass")) {
  432.             if (!Config.CHGCLASS_ENABLE) {
  433.                 showError(player, "Магазин отключен.");
  434.                 return;
  435.             }
  436.             changeClass(player, Integer.parseInt(command.substring(11).trim()));
  437.         } else {
  438.             super.onBypassFeedback(player, command);
  439.         }
  440.     }
  441.  
  442.     // окно приветствия
  443.     private void showWelcome(L2PcInstance player, int hasSertify) {
  444.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  445.         TextBuilder replyMSG = new TextBuilder("<html><body>");
  446.         replyMSG.append("<table width=280><tr><td>" + player.getName() + "</td><td align=right><font color=336699>Баланс:</font> <font color=33CCFF>" + getStockBalance(player) + " " + VAL_NAME + "</font></td></tr>");
  447.         replyMSG.append("<tr><td> </td><td align=right> <a action=\"bypass -h npc_" + getObjectId() + "_StockExchange 4\">Личный кабинет</a></td></tr></table><br><br>");
  448.         replyMSG.append("<a action=\"bypass -h npc_" + getObjectId() + "_StockExchange 2\">Просмотр биржи</a><br>");
  449.         if (hasSertify == 1) {
  450.             replyMSG.append("<a action=\"bypass -h npc_" + getObjectId() + "_StockExchange 3\">Выставить предмет</a><br>");
  451.         } else {
  452.             replyMSG.append("<a action=\"bypass -h npc_" + getObjectId() + "_StockExchange 5\">?Получить сертификат</a><br>");
  453.         }
  454.         replyMSG.append("</body></html>");
  455.  
  456.         player.setStockItem(-1, 0, 0, 0, 0);
  457.         player.setStockInventoryItem(0, 0);
  458.         player.setStockSelf(0);
  459.  
  460.         reply.setHtml(replyMSG.toString());
  461.         player.sendPacket(reply);
  462.     }
  463.  
  464.     // окно личного кабинета
  465.     private void showPrivateInfo(L2PcInstance player) {
  466.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  467.         TextBuilder replyMSG = new TextBuilder("<html><body> Личный кабинет:");
  468.         replyMSG.append("<table width=280><tr><td>" + player.getName() + "</td><td align=right><font color=336699>Баланс:</font> <font color=33CCFF>" + getStockBalance(player) + " " + VAL_NAME + "</font></td></tr>");
  469.         replyMSG.append("<tr><td> </td><td align=right> <a action=\"bypass -h npc_" + getObjectId() + "_showPrivateInfo 1\">Пополнить счет</a></td></tr></table><br><br>");
  470.         replyMSG.append("<a action=\"bypass -h npc_" + getObjectId() + "_showPrivateInfo 2\">Мои товары</a><br>");
  471.         //replyMSG.append("<a action=\"bypass -h npc_" + getObjectId() + "_showPrivateInfo 3\">Просмотреть последние действия</a> //еще не делал<br>");
  472.         replyMSG.append("<br><a action=\"bypass -h npc_" + getObjectId() + "_StockExchange 1\">Вернуться</a><br>");
  473.         replyMSG.append("</body></html>");
  474.         reply.setHtml(replyMSG.toString());
  475.         player.sendPacket(reply);
  476.     }
  477.  
  478.     // окно информации о сертификате
  479.     private void showSertifyInfo(L2PcInstance player) {
  480.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  481.         TextBuilder replyMSG = new TextBuilder("<html><body> <font color=99CC66>Торговый сертификат.<br>");
  482.         replyMSG.append("Сертификат позволяет торговать вещами на бирже:<br>");
  483.         replyMSG.append("Заточенным и аугментированным оружием;<br1>");
  484.         replyMSG.append("Заточенной броней;<br1>");
  485.         replyMSG.append("Эпик бижутерией;<br>");
  486.         replyMSG.append("Стоимость сертификата составляет:</font><br1>");
  487.         replyMSG.append("<table border=1 width=290><tr><td>" + SERTIFY_PRICE + " " + DONATE_COIN_NEMA + "</td></tr></table><br>");
  488.         L2ItemInstance coins = player.getInventory().getItemByItemId(DONATE_COIN);
  489.         if (coins != null && coins.getCount() >= SERTIFY_PRICE) {
  490.             replyMSG.append("<button value=\"Купить\" action=\"bypass -h npc_" + getObjectId() + "_StockSertifyBuy\" width=60 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"><br>");
  491.         } else {
  492.             replyMSG.append("<font color=999999>[Приобрести сертификат]</font><br>");
  493.         }
  494.         replyMSG.append("<br><a action=\"bypass -h npc_" + getObjectId() + "_StockExchange 1\">Вернуться</a><br>");
  495.         replyMSG.append("</body></html>");
  496.         reply.setHtml(replyMSG.toString());
  497.         player.sendPacket(reply);
  498.     }
  499.  
  500.     // запрос баланса на бирже
  501.     private int getStockBalance(L2PcInstance player) {
  502.         Connect con = null;
  503.         PreparedStatement statement = null;
  504.         ResultSet result = null;
  505.         try {
  506.             con = L2DatabaseFactory.get();
  507.             con.setTransactionIsolation(1);
  508.             statement = con.prepareStatement("SELECT balance FROM `z_stock_accounts` WHERE `charId`=? LIMIT 1");
  509.             statement.setInt(1, player.getObjectId());
  510.             result = statement.executeQuery();
  511.  
  512.             if (result.next()) {
  513.                 return result.getInt("balance");
  514.             }
  515.             Close.SR(statement, result);
  516.         } catch (Exception e) {
  517.             _log.warning("StockExchange: getStockBalance() error: " + e);
  518.         } finally {
  519.             Close.CSR(con, statement, result);
  520.         }
  521.  
  522.         return 0;
  523.     }
  524.  
  525.     // показ шмоток на бирже
  526.     private void showStockSellList(L2PcInstance player, int page, int self) {
  527.         if (System.currentTimeMillis() - player.getStockLastAction() < 2000) {
  528.             showError(player, "Раз в 2 секунды!"); //lacosta
  529.             //showError(player, "Раз в 2 секунды.");
  530.             return;
  531.         }
  532.  
  533.         player.setStockLastAction(System.currentTimeMillis());
  534.  
  535.         int limit1 = 0;
  536.  
  537.         if (page == 1) {
  538.             limit1 = 0;
  539.         } else if (page == 2) {
  540.             limit1 = PAGE_LIMIT;
  541.         } else {
  542.             limit1 = page * PAGE_LIMIT;
  543.         }
  544.  
  545.         int limit2 = limit1 + PAGE_LIMIT;
  546.  
  547.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  548.         TextBuilder replyMSG = new TextBuilder("<html><body>");
  549.         replyMSG.append("<table width=300><tr><td width=36></td><td width=264>Страница " + page + ":</td></tr>");
  550.  
  551.         Connect con = null;
  552.         PreparedStatement statement = null;
  553.         ResultSet rs = null;
  554.         try {
  555.             con = L2DatabaseFactory.get();
  556.             con.setTransactionIsolation(1);
  557.             if (self == 0) {
  558.                 statement = con.prepareStatement("SELECT id, itemId, enchant, augment, augLvl, price, ownerId, shadow FROM `z_stock_items` WHERE `id` > '0' ORDER BY `id` DESC LIMIT ?, ?");
  559.                 statement.setInt(1, limit1);
  560.                 statement.setInt(2, limit2);
  561.             } else {
  562.                 statement = con.prepareStatement("SELECT id, itemId, enchant, augment, augLvl, price, ownerId, shadow FROM `z_stock_items` WHERE `ownerId` = ? ORDER BY `id` DESC LIMIT ?, ?");
  563.                 statement.setInt(1, player.getObjectId());
  564.                 statement.setInt(2, limit1);
  565.                 statement.setInt(3, limit2);
  566.                 player.setStockSelf(self);
  567.             }
  568.             rs = statement.executeQuery();
  569.             while (rs.next()) {
  570.                 L2Item brokeItem = ItemTable.getInstance().getTemplate(rs.getInt("itemId"));
  571.                 if (brokeItem != null) {
  572.                     replyMSG.append("<tr><td><img src=\"Icon." + brokeItem.getIcon() + "\" width=32 height=32></td><td><a action=\"bypass -h npc_" + getObjectId() + "_StockShowItem " + rs.getInt("id") + "\"> " + brokeItem.getName() + "</a>+" + rs.getInt("enchant") + " <br1><font color=336699>Цена: " + rs.getInt("price") + " " + VAL_NAME + "; Продавец: " + getSellerName(rs.getInt("ownerId")) + "</font><br1>" + getAugmentSkill(rs.getInt("augment"), rs.getInt("augLvl")) + "</td></tr>");
  573.                 }
  574.             }
  575.             Close.SR(statement, rs);
  576.         } catch (SQLException e) {
  577.             _log.warning("StockExchange: showStockSellList() error: " + e);
  578.         } finally {
  579.             Close.CSR(con, statement, rs);
  580.         }
  581.         replyMSG.append("</table><br>");
  582.         // постраничность
  583.         int pages = getPageCount();
  584.         if (pages >= 2) {
  585.             replyMSG.append("Страницы:<br1><table width=300><tr>");
  586.             int step = 0;
  587.             for (int i = 1; i <= pages; i++) {
  588.                 if (i == page) {
  589.                     replyMSG.append("<td>" + i + "</td>");
  590.                 } else {
  591.                     replyMSG.append("<td><a action=\"bypass -h npc_" + getObjectId() + "_StockShowPage " + i + " " + self + "\">" + i + "</a></td>");
  592.                 }
  593.                 if (step == 10) {
  594.                     replyMSG.append("</tr><tr>");
  595.                     step = 0;
  596.                 }
  597.                 step++;
  598.             }
  599.             replyMSG.append("</tr></table><br>");
  600.         }
  601.         //
  602.         replyMSG.append("<br><br><a action=\"bypass -h npc_" + getObjectId() + "_StockExchange 1\">Вернуться</a><br>");
  603.         replyMSG.append("</body></html>");
  604.         reply.setHtml(replyMSG.toString());
  605.         player.sendPacket(reply);
  606.     }
  607.  
  608.     private int getPageCount() {
  609.         int rowCount = 0;
  610.         int pages = 0;
  611.  
  612.         Connect con = null;
  613.         PreparedStatement statement = null;
  614.         ResultSet result = null;
  615.         try {
  616.             con = L2DatabaseFactory.get();
  617.             con.setTransactionIsolation(1);
  618.             statement = con.prepareStatement("SELECT COUNT(id) FROM z_stock_items WHERE id > ?");
  619.             statement.setInt(1, 0);
  620.             result = statement.executeQuery();
  621.  
  622.             result.next();
  623.             rowCount = result.getInt(1);
  624.             Close.SR(statement, result);
  625.         } catch (Exception e) {
  626.             _log.warning("StockExchange: getPageCount() error: " + e);
  627.         } finally {
  628.             Close.CSR(con, statement, result);
  629.         }
  630.  
  631.         if (rowCount == 0) {
  632.             return 0;
  633.         }
  634.  
  635.         pages = (rowCount / PAGE_LIMIT) + 1;
  636.  
  637.         return pages;
  638.     }
  639.  
  640.     // выставление на биржу, показ шмоток в инвентаре
  641.     private void showInventoryItems(L2PcInstance player) {
  642.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  643.         TextBuilder replyMSG = new TextBuilder("<html><body>");
  644.         replyMSG.append("Выбор шмотки:<br>Что выставляем на биржу?<br><br><table width=300>");
  645.  
  646.         int objectId = 0;
  647.         String itemName = "";
  648.         int enchantLevel = 0;
  649.         String itemIcon = "";
  650.         int itemType = 0;
  651.         for (L2ItemInstance item : player.getInventory().getItems()) {
  652.             if (item == null) {
  653.                 continue;
  654.             }
  655.  
  656.             objectId = item.getObjectId();
  657.             itemName = item.getItem().getName();
  658.             enchantLevel = item.getEnchantLevel();
  659.             itemIcon = item.getItem().getIcon();
  660.             itemType = item.getItem().getType2();
  661.  
  662.             if (item.canBeEnchanted() && !item.isEquipped() && item.isDestroyable() && (itemType == L2Item.TYPE2_WEAPON || itemType == L2Item.TYPE2_SHIELD_ARMOR || itemType == L2Item.TYPE2_ACCESSORY || item.isAugmented())) {
  663.                 replyMSG.append("<tr><td><img src=\"" + itemIcon + "\" width=32 height=32></td><td><a action=\"bypass -h npc_" + getObjectId() + "_StockInventoryItem " + objectId + "\">" + itemName + " (+" + enchantLevel + ")</a></td></tr>");
  664.             }
  665.         }
  666.  
  667.         replyMSG.append("</table><br><br><a action=\"bypass -h npc_" + getObjectId() + "_StockExchange 1\">Вернуться</a><br>");
  668.         replyMSG.append("</body></html>");
  669.         reply.setHtml(replyMSG.toString());
  670.         player.sendPacket(reply);
  671.     }
  672.  
  673.     // выставление на биржу, подробная инфа о шмотке
  674.     private void showInventoryItem(L2PcInstance player, int objectId) {
  675.         L2ItemInstance item = player.getInventory().getItemByObjectId(objectId);
  676.         if (item != null) {
  677.             NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  678.             TextBuilder replyMSG = new TextBuilder("<html><body>");
  679.  
  680.             String itemName = item.getItem().getName();
  681.             int enchantLevel = item.getEnchantLevel();
  682.             String itemIcon = item.getItem().getIcon();
  683.  
  684.             replyMSG.append("Выставление на биржу:<br>Подтверждаете шмотку?<br>");
  685.  
  686.             replyMSG.append("<table width=300><tr><td><img src=\"" + itemIcon + "\" width=32 height=32></td><td><font color=LEVEL>" + itemName + " (+" + enchantLevel + ")</font>g<br></td></tr></table><br><br>");
  687.             replyMSG.append("<br>Заточка: <font color=bef574>+" + enchantLevel + "</font><br>");
  688.  
  689.             if (item.isAugmented() && item.getAugmentation().getAugmentSkill() != null) {
  690.                 L2Skill augment = item.getAugmentation().getAugmentSkill();
  691.                 String augName = augment.getName();
  692.                 String type = "";
  693.                 if (augment.isActive()) {
  694.                     type = "Актив";
  695.                 } else if (augment.isPassive()) {
  696.                     type = "Пассив";
  697.                 } else {
  698.                     type = "Шанс";
  699.                 }
  700.  
  701.                 replyMSG.append("<br>Аугмент: <font color=bef574>" + augName + " (" + type + ")</font><br>");
  702.             }
  703.  
  704.             replyMSG.append("Введите желаемую цену:<br><edit var=\"price\" width=200 length=\"16\">");
  705.             replyMSG.append("<button value=\"Выставить\" action=\"bypass -h npc_" + getObjectId() + "_StockAddItem " + objectId + " $price\" width=60 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"><br>");
  706.             player.setStockInventoryItem(objectId, enchantLevel);
  707.  
  708.             replyMSG.append("<br><br><a action=\"bypass -h npc_" + getObjectId() + "_StockExchange 1\">Вернуться</a><br>");
  709.             replyMSG.append("</body></html>");
  710.             reply.setHtml(replyMSG.toString());
  711.             player.sendPacket(reply);
  712.         } else {
  713.             showError(player, "Ошибка запроса.");
  714.             return;
  715.         }
  716.     }
  717.  
  718.     // подробная инфа о шмотке на бирже
  719.     private void showStockItem(L2PcInstance player, int sellId) {
  720.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  721.         TextBuilder replyMSG = new TextBuilder("<html><body>");
  722.  
  723.         Connect con = null;
  724.         PreparedStatement statement = null;
  725.         ResultSet result = null;
  726.         try {
  727.             con = L2DatabaseFactory.get();
  728.             con.setTransactionIsolation(1);
  729.  
  730.             statement = con.prepareStatement("SELECT itemId, enchant, augment, augLvl, price, ownerId, shadow FROM `z_stock_items` WHERE `id` = ? LIMIT 1");
  731.             statement.setInt(1, sellId);
  732.             result = statement.executeQuery();
  733.  
  734.             if (result.next()) {
  735.                 int itemId = result.getInt("itemId");
  736.                 L2Item brokeItem = ItemTable.getInstance().getTemplate(itemId);
  737.                 if (brokeItem == null) {
  738.                     showError(player, "Ошибка запроса.");
  739.                     return;
  740.                 }
  741.                 int price = result.getInt("price");
  742.                 int augment = result.getInt("augment");
  743.                 int auhLevel = result.getInt("augLvl");
  744.                 int enchant = result.getInt("enchant");
  745.                 int self = player.getStockSelf();
  746.                 int charId = result.getInt("ownerId");
  747.  
  748.                 replyMSG.append("<table width=300><tr><td><img src=\"" + brokeItem.getIcon() + "\" width=32 height=32></td><td><font color=LEVEL>" + brokeItem.getName() + " +" + enchant + "</font><br></td></tr></table><br><br>");
  749.                 replyMSG.append("Продавец: " + getSellerName(charId) + "<br><br>");
  750.                 replyMSG.append(getAugmentSkill(augment, auhLevel) + "<br>");
  751.  
  752.                 if (self == 1) {
  753.                     if (player.getObjectId() != charId) {
  754.                         showError(player, "Ошибка запроса.");
  755.                         return;
  756.                     }
  757.                     replyMSG.append("<font color=6699CC>Стоимость: " + price + " P.</font><br>");
  758.                     replyMSG.append("<button value=\"Забрать\" action=\"bypass -h npc_" + getObjectId() + "_StockBuyItem " + sellId + "\" width=60 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"><br>");
  759.                     player.setStockItem(sellId, itemId, enchant, augment, auhLevel);
  760.                 } else {
  761.                     if (getStockBalance(player) >= price) {
  762.                         replyMSG.append("<font color=33CC00>Стоимость: " + price + " P.</font><br>");
  763.                         replyMSG.append("<button value=\"Купить\" action=\"bypass -h npc_" + getObjectId() + "_StockBuyItem " + sellId + "\" width=60 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"><br>");
  764.                         player.setStockItem(sellId, itemId, enchant, augment, auhLevel);
  765.                     } else {
  766.                         replyMSG.append("<font color=FF6666>Стоимость: " + price + " P.</font><br>");
  767.                         replyMSG.append("<font color=999999>[Купить]</font>");
  768.                     }
  769.                 }
  770.             } else {
  771.                 replyMSG.append("Не найдена или уже купили.");
  772.             }
  773.             Close.SR(statement, result);
  774.         } catch (Exception e) {
  775.             _log.warning("StockExchange: showStockItem() error: " + e);
  776.         } finally {
  777.             Close.CSR(con, statement, result);
  778.         }
  779.  
  780.         replyMSG.append("<br><br><a action=\"bypass -h npc_" + getObjectId() + "_StockExchange 1\">Вернуться</a><br>");
  781.         replyMSG.append("</body></html>");
  782.         reply.setHtml(replyMSG.toString());
  783.         player.sendPacket(reply);
  784.     }
  785.  
  786.     // finish выставление на биржу
  787.     private void addStockItem(L2PcInstance player, int objectId, int price) {
  788.         if (player.getObjectIdStockI() != objectId) {
  789.             showError(player, "Ошибка запроса.");
  790.             return;
  791.         }
  792.  
  793.         L2ItemInstance item = player.getInventory().getItemByObjectId(objectId);
  794.         if (item != null) {
  795.             int enchantLevel = item.getEnchantLevel();
  796.             if (player.getEnchantStockI() != enchantLevel) {
  797.                 showError(player, "Ошибка запроса.");
  798.                 return;
  799.             }
  800.  
  801.             NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  802.             TextBuilder replyMSG = new TextBuilder("<html><body>");
  803.  
  804.             int itemId = item.getItemId();
  805.             int augmentId = 0;
  806.             int augAttr = 0;
  807.             int augLvl = 0;
  808.             int shadow = 0;
  809.             String itemName = item.getItem().getName();
  810.             String itemIcon = item.getItem().getIcon();
  811.  
  812.             replyMSG.append("Выставление на биржу:<br>Выставлена шмотка<br>");
  813.             replyMSG.append("<table width=300><tr><td><img src=\"" + itemIcon + "\" width=32 height=32></td><td><font color=LEVEL>" + itemName + " (+" + enchantLevel + ")</font>g<br></td></tr></table><br><br>");
  814.             replyMSG.append("<br>Заточка: <font color=bef574>+" + enchantLevel + "</font><br>");
  815.  
  816.             if (item.isAugmented() && item.getAugmentation().getAugmentSkill() != null) {
  817.                 L2Skill augment = item.getAugmentation().getAugmentSkill();
  818.                 String augName = augment.getName();
  819.                 String type = "";
  820.                 if (augment.isActive()) {
  821.                     type = "Актив";
  822.                 } else if (augment.isPassive()) {
  823.                     type = "Пассив";
  824.                 } else {
  825.                     type = "Шанс";
  826.                 }
  827.  
  828.                 augmentId = augment.getId();
  829.                 augAttr = item.getAugmentation().getAugmentationId();
  830.                 augLvl = augment.getLevel();
  831.  
  832.                 replyMSG.append("<br>Аугмент: <font color=bef574>" + augName + " (" + type + ")</font><br>");
  833.             }
  834.  
  835.             if (!player.destroyItemByItemId("DS addStockItem", itemId, 1, player, true)) {
  836.                 showError(player, "Ошибка запроса.");
  837.                 return;
  838.             }
  839.  
  840.             if (addToStockList(itemId, enchantLevel, augmentId, augAttr, augLvl, price, player.getObjectId(), shadow)) {
  841.                 //player.getInventory().destroyItem(item, 1, true);    
  842.  
  843.                 replyMSG.append("Выставлена!<br><br>");
  844.             } else {
  845.                 replyMSG.append("Произошла ошибка!<br><br>");
  846.             }
  847.  
  848.             player.setStockInventoryItem(0, 0);
  849.  
  850.             replyMSG.append("<br><a action=\"bypass -h npc_" + getObjectId() + "_StockExchange 1\">Вернуться.</a>");
  851.             replyMSG.append("</body></html>");
  852.             reply.setHtml(replyMSG.toString());
  853.             player.sendPacket(reply);
  854.         } else {
  855.             showError(player, "Ошибка запроса.");
  856.             return;
  857.         }
  858.     }
  859.  
  860.     // покупка с биржи, задержка 1-2 секунд
  861.     private void buyStockItem(L2PcInstance player, int sellId) {
  862.         if (player.getSellIdStock() != sellId) {
  863.             showError(player, "Ошибка запроса.");
  864.             return;
  865.         }
  866.  
  867.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  868.         TextBuilder replyMSG = new TextBuilder("<html><body>Подождите...</body></html>");
  869.         reply.setHtml(replyMSG.toString());
  870.         player.sendPacket(reply);
  871.  
  872.         try {
  873.             Thread.sleep(Rnd.get(1000, 2000));
  874.         } catch (InterruptedException e) {
  875.         }
  876.  
  877.         buyStockItemFinish(player, sellId);
  878.     }
  879.  
  880.     // finish покупка с биржи
  881.     private void buyStockItemFinish(L2PcInstance player, int sellId) {
  882.         if (player.getSellIdStock() != sellId) {
  883.             showError(player, "Ошибка запроса.");
  884.             return;
  885.         }
  886.  
  887.         Connect con = null;
  888.         PreparedStatement statement = null;
  889.         ResultSet result = null;
  890.         try {
  891.             con = L2DatabaseFactory.get();
  892.             con.setTransactionIsolation(1);
  893.  
  894.             statement = con.prepareStatement("SELECT itemId, enchant, augment, augAttr, augLvl, price, ownerId, shadow FROM `z_stock_items` WHERE `id` = ? LIMIT 1");
  895.             statement.setInt(1, sellId);
  896.             result = statement.executeQuery();
  897.  
  898.             if (result.next()) {
  899.                 int itemId = result.getInt("itemId");
  900.                 if (player.getItemIdStock() != itemId) {
  901.                     showError(player, "Ошибка запроса.");
  902.                     return;
  903.                 }
  904.                 L2Item brokeItem = ItemTable.getInstance().getTemplate(itemId);
  905.                 if (brokeItem == null) {
  906.                     showError(player, "Ошибка запроса.");
  907.                     return;
  908.                 }
  909.                 int price = result.getInt("price");
  910.                 int augment = result.getInt("augment");
  911.                 int auhLevel = result.getInt("augLvl");
  912.                 int enchant = result.getInt("enchant");
  913.                 int augAttr = result.getInt("augAttr");
  914.                 int ownerId = result.getInt("ownerId");
  915.                 int self = player.getStockSelf();
  916.  
  917.                 if (self == 1 && player.getObjectId() != ownerId) {
  918.                     showError(player, "Ошибка запроса.");
  919.                     return;
  920.                 }
  921.  
  922.                 if (player.getEnchantStock() != enchant || player.getAugmentStock() != augment || player.getAuhLeveStock() != auhLevel) {
  923.                     showError(player, "Ошибка запроса.");
  924.                     return;
  925.                 }
  926.  
  927.                 if (self == 0) {
  928.                     if (!updateBalance(player, ownerId, price)) {
  929.                         showError(player, "Ошибка баланса.");
  930.                         return;
  931.                     }
  932.                 }
  933.  
  934.                 if (!deleteFromList(player, sellId, itemId, enchant, augment, auhLevel, price, ownerId, self)) {
  935.                     showError(player, "Ошибка запроса.");
  936.                     return;
  937.                 }
  938.  
  939.                 player.setStockItem(-1, 0, 0, 0, 0);
  940.                 player.setStockSelf(0);
  941.  
  942.                 /*L2ItemInstance buyItem = ItemTable.getInstance().createItem(itemId)createItem(itemId);
  943.                  L2ItemInstance buyItem = ItemTable.getInstance().createItem("DS buyStockItemFinish", itemId, 1, player);
  944.                  if (enchant > 0)
  945.                  buyItem.setEnchantLevel(enchant);
  946.                  if (augment > 0)
  947.                  buyItem.setAugmentation(new L2Augmentation(buyItem, augAttr, augment, auhLevel, true));
  948.                  */
  949.                 L2ItemInstance buyItem = player.getInventory().addItem("DS buyStockItemFinish", itemId, 1, player, player.getTarget());
  950.                 if (buyItem == null) {
  951.                     showError(player, "Ошибка запроса.");
  952.                     return;
  953.                 }
  954.  
  955.                 if (enchant > 0) {
  956.                     buyItem.setEnchantLevel(enchant);
  957.                 }
  958.                 if (augment > 0) {
  959.                     buyItem.setAugmentation(new L2Augmentation(buyItem, augAttr, augment, auhLevel, true));
  960.                 }
  961.  
  962.                 NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  963.                 TextBuilder replyMSG = new TextBuilder("<html><body>");
  964.                 if (self == 0) {
  965.                     L2PcInstance owner = L2World.getInstance().getPlayer(ownerId);
  966.                     if (owner != null) {
  967.                         owner.sendMessage("Уведомление с биржи: проверь почту");
  968.                         owner.sendPacket(new ExMailArrived());
  969.                         sendLetter(getSellerName(ownerId), itemId, enchant, augment, auhLevel, price);
  970.                     }
  971.                     replyMSG.append("Сделка проведена, с вашего счета списано: " + price + " " + VAL_NAME + "");
  972.                 } else {
  973.                     replyMSG.append("<br>Предмет успешно снят с биржи");
  974.                 }
  975.                 replyMSG.append("<br><a action=\"bypass -h npc_" + getObjectId() + "_StockExchange 1\">Вернуться.</a></body></html>");
  976.                 reply.setHtml(replyMSG.toString());
  977.                 player.sendPacket(reply);
  978.  
  979.                 player.sendPacket(SystemMessage.id(SystemMessageId.EARNED_ITEM).addItemName(itemId));
  980.                 //player.getInventory().addItem(buyItem);
  981.                 //player.getInventory().addItem("DS buyStockItemFinish", buyItem, player, player.getTarget());
  982.  
  983.                 player.sendItems(false);
  984.                 player.sendChanges();
  985.             } else {
  986.                 showError(player, "Ошибка запроса.");
  987.                 return;
  988.             }
  989.             Close.SR(statement, result);
  990.         } catch (Exception e) {
  991.             _log.warning("StockExchange: buyStockItemFinish() error: " + e);
  992.         } finally {
  993.             Close.CSR(con, statement, result);
  994.         }
  995.     }
  996.  
  997.     private void sendLetter(String sName, int itemId, int enchant, int augment, int auhLevel, int price) {
  998.         L2Item brokeItem = ItemTable.getInstance().getTemplate(itemId);
  999.         if (brokeItem == null) {
  1000.             return;
  1001.         }
  1002.  
  1003.         Date date = new Date();
  1004.         SimpleDateFormat datef = new SimpleDateFormat("yyyy-MM-dd");
  1005.         SimpleDateFormat timef = new SimpleDateFormat("HH:mm:ss");
  1006.  
  1007.         int plus = (price / 100) * NALOG_NPS;
  1008.  
  1009.         StringBuilder text = new StringBuilder();
  1010.         text.append("Итем: <font color=FF3399>" + brokeItem.getName() + " +" + enchant + " " + getAugmentSkill(augment, auhLevel) + "</font><br1> был успешно продан.<br1>");
  1011.         text.append("За вычетом налога " + NALOG_NPS + "%, ваш баланс пополнен на " + plus + " P.<br1>");
  1012.         text.append("Благодарим за сотрудничество.");
  1013.  
  1014.         Connect con = null;
  1015.         PreparedStatement statement = null;
  1016.         try {
  1017.             con = L2DatabaseFactory.get();
  1018.             //statement = con.prepareStatement("INSERT INTO `z_stock_accounts` (`charId`,`balance`,`ban`) VALUES (?,?,?)");
  1019.             statement = con.prepareStatement("INSERT INTO `z_post_in` (`id`,`tema`,`text`,`from`,`to`,`type`,`date`,`time`) VALUES (NULL,?,?,?,?,?,?,?)");
  1020.             statement.setString(1, "Шмотка продана");
  1021.             statement.setString(2, text.toString());
  1022.             statement.setString(3, "~Биржа.");
  1023.             statement.setString(4, sName);
  1024.             statement.setInt(5, 0);
  1025.             statement.setString(6, datef.format(date).toString());
  1026.             statement.setString(7, timef.format(date).toString());
  1027.  
  1028.             statement.execute();
  1029.             Close.S(statement);
  1030.         } catch (final Exception e) {
  1031.             _log.warning("StockExchange: sendLetter() error: " + e);
  1032.         } finally {
  1033.             Close.CS(con, statement);
  1034.         }
  1035.     }
  1036.  
  1037.     // покупка сертификата
  1038.     private void StockSertifyBuy(L2PcInstance player) {
  1039.         L2ItemInstance coins = player.getInventory().getItemByItemId(DONATE_COIN);
  1040.         if (coins == null || coins.getCount() < SERTIFY_PRICE) {
  1041.             showError(player, "Ошибка запроса.");
  1042.             return;
  1043.         }
  1044.  
  1045.         //player.getInventory().destroyItem(coins, 10, true);
  1046.         player.destroyItemByItemId("DS StockSertifyBuy", DONATE_COIN, SERTIFY_PRICE, player, true);
  1047.  
  1048.         //L2ItemInstance buyItem = ItemTable.getInstance().createItem(STOCK_SERTIFY);
  1049.         //L2ItemInstance buyItem = ItemTable.getInstance().createItem("DS buyStockItemFinish", STOCK_SERTIFY, 1, player);
  1050.         L2ItemInstance buyItem = player.getInventory().addItem("DS buyStockItemFinish", STOCK_SERTIFY, 1, player, player.getTarget());
  1051.         if (buyItem == null) {
  1052.             showError(player, "Ошибка запроса.");
  1053.             return;
  1054.         }
  1055.  
  1056.         player.sendPacket(SystemMessage.id(SystemMessageId.EARNED_ITEM).addItemName(buyItem.getItemId()));
  1057.         player.sendItems(false);
  1058.         player.sendChanges();
  1059.  
  1060.         Connect con = null;
  1061.         PreparedStatement statement = null;
  1062.         try {
  1063.             con = L2DatabaseFactory.get();
  1064.             statement = con.prepareStatement("INSERT INTO `z_stock_accounts` (`charId`,`balance`,`ban`) VALUES (?,?,?)");
  1065.             statement.setInt(1, player.getObjectId());
  1066.             statement.setInt(2, FIRST_BALANCE);
  1067.             statement.setInt(3, 0);
  1068.             statement.execute();
  1069.             Close.S(statement);
  1070.         } catch (final Exception e) {
  1071.             _log.warning("StockExchange: StockSertifyBuy() error: " + e);
  1072.         } finally {
  1073.             Close.CS(con, statement);
  1074.         }
  1075.  
  1076.         showWelcome(player, 1);
  1077.     }
  1078.  
  1079.     // при покупке с биржи, удаляем шмотку с базы
  1080.     private boolean deleteFromList(L2PcInstance player, int sellId, int itemId, int enchant, int augment, int auhLevel, int price, int ownerId, int self) {
  1081.         Connect con = null;
  1082.         PreparedStatement statement = null;
  1083.         try {
  1084.             con = L2DatabaseFactory.get();
  1085.             statement = con.prepareStatement("DELETE FROM z_stock_items WHERE id = ? LIMIT 1");
  1086.             statement.setInt(1, sellId);
  1087.             statement.execute();
  1088.             Close.S(statement);
  1089.  
  1090.             if (self == 0) {
  1091.                 Date date = new Date();
  1092.                 SimpleDateFormat sdf = new SimpleDateFormat("dd mm (HH:mm:ss)");
  1093.  
  1094.                 statement = con.prepareStatement("INSERT INTO z_stock_logs (date, charId, itemId, enchant, augment, augLvl, price, ownerId) VALUES (?,?,?,?,?,?,?,?)");
  1095.                 statement.setString(1, sdf.format(date) + ":");
  1096.                 statement.setInt(2, player.getObjectId());
  1097.                 statement.setInt(3, itemId);
  1098.                 statement.setInt(4, enchant);
  1099.                 statement.setInt(5, augment);
  1100.                 statement.setInt(6, auhLevel);
  1101.                 statement.setInt(7, price);
  1102.                 statement.setInt(8, ownerId);
  1103.                 statement.execute();
  1104.                 Close.S(statement);
  1105.             }
  1106.             return true;
  1107.         } catch (final Exception e) {
  1108.             _log.warning("StockExchange: deleteFromList() error: " + e);
  1109.         } finally {
  1110.             Close.CS(con, statement);
  1111.         }
  1112.         return false;
  1113.     }
  1114.  
  1115.     // выставление шмотки на биржу ,пишем в базу
  1116.     private boolean addToStockList(int itemId, int enchantLevel, int augmentId, int augAttr, int augLvl, int price, int ownerId, int shadow) {
  1117.         Connect con = null;
  1118.         PreparedStatement statement = null;
  1119.         try {
  1120.             con = L2DatabaseFactory.get();
  1121.             statement = con.prepareStatement("INSERT INTO z_stock_items (id,itemId, enchant, augment, augAttr, augLvl, price, ownerId, shadow) VALUES (NULL,?,?,?,?,?,?,?,?)");
  1122.             statement.setInt(1, itemId);
  1123.             statement.setInt(2, enchantLevel);
  1124.             statement.setInt(3, augmentId);
  1125.             statement.setInt(4, augAttr);
  1126.             statement.setInt(5, augLvl);
  1127.             statement.setInt(6, price);
  1128.             statement.setInt(7, ownerId);
  1129.             statement.setInt(8, shadow);
  1130.             statement.execute();
  1131.             Close.S(statement);
  1132.             return true;
  1133.         } catch (final SQLException e) {
  1134.             _log.warning("StockExchange: addToStockList() error: " + e);
  1135.             e.printStackTrace();
  1136.         } finally {
  1137.             Close.CS(con, statement);
  1138.         }
  1139.         return false;
  1140.     }
  1141.  
  1142.     // обновление баланса, снятие денег и пополнение счета продавца за вычетом налога NALOG_NPS
  1143.     private boolean updateBalance(L2PcInstance player, int ownerId, int price) {
  1144.         Connect con = null;
  1145.         PreparedStatement statement = null;
  1146.         try {
  1147.             con = L2DatabaseFactory.get();
  1148.             statement = con.prepareStatement("UPDATE z_stock_accounts SET `balance` = `balance`-? WHERE charId=? LIMIT 1");
  1149.             statement.setInt(1, price);
  1150.             statement.setInt(2, player.getObjectId());
  1151.             statement.executeUpdate();
  1152.             Close.S(statement);
  1153.  
  1154.             int plus = (price / 100) * NALOG_NPS;
  1155.  
  1156.             statement = con.prepareStatement("UPDATE z_stock_accounts SET `balance` = `balance`+? WHERE charId=? LIMIT 1");
  1157.             statement.setInt(1, plus);
  1158.             statement.setInt(2, ownerId);
  1159.             statement.executeUpdate();
  1160.             Close.S(statement);
  1161.             return true;
  1162.         } catch (Exception e) {
  1163.             e.printStackTrace();
  1164.         } finally {
  1165.             Close.CS(con, statement);
  1166.         }
  1167.         return false;
  1168.     }
  1169.  
  1170.     // информации об аугментации
  1171.     private String getAugmentSkill(int skillId, int skillLvl) {
  1172.         L2Skill augment = SkillTable.getInstance().getInfo(skillId, 1);
  1173.         if (augment == null) {
  1174.             return "";
  1175.         }
  1176.  
  1177.         String augName = augment.getName();
  1178.         String type = "";
  1179.         if (augment.isActive()) {
  1180.             type = "Актив";
  1181.         } else if (augment.isPassive()) {
  1182.             type = "Пассив";
  1183.         } else {
  1184.             type = "Шанс";
  1185.         }
  1186.  
  1187.         augName = augName.replace("Item Skill: ", "");
  1188.  
  1189.         return "<font color=336699>Аугмент:</font> <font color=bef574>" + augName + " (" + type + ":" + skillLvl + "lvl)</font>";
  1190.     }
  1191.  
  1192.     // информация о продавце
  1193.     private String getSellerName(int charId) {
  1194.         Connect con = null;
  1195.         PreparedStatement statement = null;
  1196.         ResultSet result = null;
  1197.         try {
  1198.             con = L2DatabaseFactory.get();
  1199.             /*statement = con.createStatement();
  1200.              result = statement.executeQuery("SELECT char_name FROM `characters` WHERE `Obj_Id`='" + charId + "' LIMIT 1");*/
  1201.  
  1202.             statement = con.prepareStatement("SELECT char_name FROM `characters` WHERE `Obj_Id`=? LIMIT 1");
  1203.             statement.setInt(1, charId);
  1204.             result = statement.executeQuery();
  1205.  
  1206.             if (result.next()) {
  1207.                 return result.getString("char_name");
  1208.             }
  1209.             Close.SR(statement, result);
  1210.         } catch (Exception e) {
  1211.             _log.warning("StockExchange: getSellerName() error: " + e);
  1212.         } finally {
  1213.             Close.CSR(con, statement, result);
  1214.         }
  1215.  
  1216.         return "";
  1217.     }
  1218.  
  1219.     // личный кабинет - окно пополнения баланса
  1220.     private void incBalance(L2PcInstance player) {
  1221.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  1222.         TextBuilder replyMSG = new TextBuilder("<html><body>Перевод " + DONATE_COIN_NEMA + " в валюту биржи:<br>");
  1223.  
  1224.         L2ItemInstance coin = player.getInventory().getItemByItemId(DONATE_COIN);
  1225.         if (coin != null && coin.getCount() >= 1) {
  1226.             long dnCount = coin.getCount();
  1227.             long stCount = dnCount * DONATE_RATE;
  1228.             replyMSG.append("<table border=1 width=290><tr><td>Курс: 1" + DONATE_COIN_NEMA + " за " + DONATE_RATE + " P.</td></tr></table><br>");
  1229.             replyMSG.append("<font color=99CC99>У вас есть " + dnCount + " " + DONATE_COIN_NEMA + ";</font><br>");
  1230.             replyMSG.append("Вы можете пополнить счет биржи на " + stCount + " P. <button value=\"На все!\" action=\"bypass -h npc_" + getObjectId() + "_StockAddBalance 0\" width=60 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\">");
  1231.             replyMSG.append("Или введите свое число..<br>");
  1232.             replyMSG.append("Так сколько?<br><edit var=\"coins\" width=200 length=\"16\">");
  1233.             replyMSG.append("<button value=\"Пополнить\" action=\"bypass -h npc_" + getObjectId() + "_StockAddBalance $coins\" width=60 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"><br>");
  1234.         } else {
  1235.             replyMSG.append("<font color=CC0000>К обмену принимаются только " + DONATE_COIN_NEMA + "</font>");
  1236.         }
  1237.  
  1238.         replyMSG.append("<br><a action=\"bypass -h npc_" + getObjectId() + "_StockExchange 4\">Вернуться.</a></body></html>");
  1239.         reply.setHtml(replyMSG.toString());
  1240.         player.sendPacket(reply);
  1241.     }
  1242.  
  1243.     // личный кабинет - finish перегон монет
  1244.     private void StockAddBalance(L2PcInstance player, int coins) {
  1245.         int plus = 0;
  1246.         int cnCount = 0;
  1247.         L2ItemInstance coin = player.getInventory().getItemByItemId(DONATE_COIN);
  1248.         if (coin != null) {
  1249.             cnCount = coin.getCount();
  1250.             if (coins == 0 && cnCount >= 1) {
  1251.                 plus = cnCount * DONATE_RATE;
  1252.             } else if (cnCount >= coins) {
  1253.                 plus = coins * DONATE_RATE;
  1254.             } else {
  1255.                 showError(player, "Ошибка запроса.");
  1256.                 return;
  1257.             }
  1258.         }
  1259.  
  1260.         if (coins == 0) {
  1261.             coins = cnCount;
  1262.         }
  1263.  
  1264.         if (!player.destroyItemByItemId("DS StockAddBalance", DONATE_COIN, coins, player, true)) {
  1265.             showError(player, "Ошибка запроса.");
  1266.             return;
  1267.         }
  1268.  
  1269.         Connect con = null;
  1270.         PreparedStatement statement = null;
  1271.         try {
  1272.             //player.getInventory().destroyItemByItemId(DONATE_COIN, coins, true);
  1273.             con = L2DatabaseFactory.get();
  1274.             statement = con.prepareStatement("UPDATE z_stock_accounts SET `balance` = `balance`+? WHERE charId=? LIMIT 1");
  1275.             statement.setInt(1, (int) plus);
  1276.             statement.setInt(2, player.getObjectId());
  1277.             statement.executeUpdate();
  1278.             Close.S(statement);
  1279.  
  1280.             NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  1281.             TextBuilder replyMSG = new TextBuilder("<html><body>Перевод " + DONATE_COIN_NEMA + " в валюту биржи:<br>");
  1282.             replyMSG.append("<font color=99CC99>Баланс пополнен на " + plus + " " + VAL_NAME + "</font>");
  1283.             replyMSG.append("<br><a action=\"bypass -h npc_" + getObjectId() + "_StockExchange 4\">Вернуться.</a></body></html>");
  1284.             reply.setHtml(replyMSG.toString());
  1285.             player.sendPacket(reply);
  1286.         } catch (Exception e) {
  1287.             e.printStackTrace();
  1288.         } finally {
  1289.             Close.CS(con, statement);
  1290.         }
  1291.     }
  1292.  
  1293.     /**
  1294.      * Далее перенос заточки и аугментации
  1295.      *
  1296.      */
  1297.     private void showVoteServiceWindow(L2PcInstance player, int service, int page) {
  1298.         FastTable<L2ItemInstance> items = null;
  1299.         if (service == 1) {
  1300.             items = player.getInventory().getAllItemsAug();
  1301.         } else {
  1302.             items = player.getInventory().getAllItemsEnch();
  1303.         }
  1304.  
  1305.         if (items == null || items.isEmpty()) {
  1306.             player.sendHtmlMessage("Голосование", "Ваш инвентарь пуст.");
  1307.             return;
  1308.         }
  1309.  
  1310.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  1311.         TextBuilder replyMSG = new TextBuilder("<html><body>");
  1312.         if (service == 1) {
  1313.             replyMSG.append("Перенос ЛС:<br>Откуда переносим?<br><br><table width=300>");
  1314.         } else {
  1315.             replyMSG.append("Перенос заточки:<br>Откуда переносим?<br><br><table width=300>");
  1316.         }
  1317.  
  1318.         int objectId = 0;
  1319.         String itemName = "";
  1320.         int enchantLevel = 0;
  1321.         String itemIcon = "";
  1322.         int itemType = 0;
  1323.         //for(L2ItemInstance item : player.getInventory().getItems())
  1324.         int begin = page == 1 ? 0 : page == 2 ? PAGE_LIMIT : page * PAGE_LIMIT;
  1325.         int end = begin + PAGE_LIMIT;
  1326.         if (end > items.size()) {
  1327.             end = items.size();
  1328.         }
  1329.         L2ItemInstance item = null;
  1330.         for (int i = begin, n = end; i < n; i++) {
  1331.             item = items.get(i);
  1332.             if (item == null) {
  1333.                 continue;
  1334.             }
  1335.  
  1336.             objectId = item.getObjectId();
  1337.             itemName = item.getItem().getName();
  1338.             enchantLevel = item.getEnchantLevel();
  1339.             itemIcon = item.getItem().getIcon();
  1340.             itemType = item.getItem().getType2();
  1341.  
  1342.             if (service == 1) {
  1343.                 if (item.isAugmented() && item.getAugmentation().getAugmentSkill() != null) {
  1344.                     L2Skill aug = item.getAugmentation().getAugmentSkill();
  1345.                     replyMSG.append("<tr><td><img src=\"" + itemIcon + "\" width=32 height=32></td><td><a action=\"bypass -h npc_" + getObjectId() + "_voteItemShow_1_" + objectId + "\">" + itemName + " (+" + enchantLevel + ")</a><br1> " + getAugmentSkill(aug.getId(), aug.getLevel()) + " </td></tr>");
  1346.                 }
  1347.             } else if (service == 2) {
  1348.                 if (itemType == L2Item.TYPE2_WEAPON || itemType == L2Item.TYPE2_SHIELD_ARMOR || itemType == L2Item.TYPE2_ACCESSORY) {
  1349.                     replyMSG.append("<tr><td><img src=\"" + itemIcon + "\" width=32 height=32></td><td><a action=\"bypass -h npc_" + getObjectId() + "_voteItemShow_2_" + objectId + "\">" + itemName + " (+" + enchantLevel + ")</a></td></tr>");
  1350.                 }
  1351.             }
  1352.         }
  1353.  
  1354.         player.setVote1Item(0);
  1355.         player.setVote2Item(0);
  1356.         player.setVoteEnchant(0);
  1357.         player.setVoteAugment(null);
  1358.  
  1359.         replyMSG.append("</table><br><br>");
  1360.         if (items.size() > PAGE_LIMIT) {
  1361.             replyMSG.append("Страницы: <br1>");
  1362.             int pages = (items.size() / PAGE_LIMIT) + 1;
  1363.             for (int i = 0; i < pages; i++) {
  1364.                 int cur = i + 1;
  1365.                 if (page == cur) {
  1366.                     replyMSG.append("&nbsp;&nbsp;" + cur + "&nbsp;&nbsp;");
  1367.                 } else {
  1368.                     replyMSG.append("&nbsp;&nbsp;<a action=\"bypass -h npc_" + getObjectId() + "_voteService " + service + " " + cur + "\">" + cur + "</a>&nbsp;&nbsp;");
  1369.                 }
  1370.             }
  1371.         }
  1372.         replyMSG.append("<br><a action=\"bypass -h npc_" + getObjectId() + "_voteHome\">Вернуться.</a></body></html>");
  1373.         reply.setHtml(replyMSG.toString());
  1374.         player.sendPacket(reply);
  1375.         items.clear();
  1376.         items = null;
  1377.     }
  1378.  
  1379.     private void showVoteNextItems(L2PcInstance player, int service, int page) {
  1380.         FastTable<L2ItemInstance> items = player.getInventory().getAllItemsNext(player.getVote1Item(), service);
  1381.         if (items == null || items.isEmpty()) {
  1382.             player.sendHtmlMessage("Голосование", "Ваш инвентарь пуст.");
  1383.             return;
  1384.         }
  1385.  
  1386.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  1387.         TextBuilder replyMSG = new TextBuilder("<html><body>");
  1388.         if (service == 1) {
  1389.             replyMSG.append("Перенос ЛС:<br>Куда переносим?<br><br><table width=300>");
  1390.         } else {
  1391.             replyMSG.append("Перенос заточки:<br>Куда переносим?<br><br><table width=300>");
  1392.         }
  1393.  
  1394.         //
  1395.         int begin = page == 1 ? 0 : page == 2 ? PAGE_LIMIT : page * PAGE_LIMIT;
  1396.         int end = begin + PAGE_LIMIT;
  1397.         if (end > items.size()) {
  1398.             end = items.size();
  1399.         }
  1400.         L2ItemInstance item = null;
  1401.         for (int i = begin, n = end; i < n; i++) {
  1402.             item = items.get(i);
  1403.             if (item == null) {
  1404.                 continue;
  1405.             }
  1406.  
  1407.             if (service == 1) {
  1408.                 replyMSG.append("<tr><td><img src=\"" + item.getItem().getIcon() + "\" width=32 height=32></td><td><a action=\"bypass -h npc_" + getObjectId() + "_voteItem2Show_1_" + item.getObjectId() + "\">" + item.getItem().getName() + " (+" + item.getEnchantLevel() + ")</a></td></tr>");
  1409.             } else {
  1410.                 replyMSG.append("<tr><td><img src=\"" + item.getItem().getIcon() + "\" width=32 height=32></td><td><a action=\"bypass -h npc_" + getObjectId() + "_voteItem2Show_2_" + item.getObjectId() + "\">" + item.getItem().getName() + " (+" + item.getEnchantLevel() + ")</a></td></tr>");
  1411.             }
  1412.         }
  1413.  
  1414.         replyMSG.append("</table><br><br>");
  1415.         if (items.size() > PAGE_LIMIT) {
  1416.             replyMSG.append("Страницы: <br1>");
  1417.             int pages = (items.size() / PAGE_LIMIT) + 1;
  1418.             for (int i = 0; i < pages; i++) {
  1419.                 int cur = i + 1;
  1420.                 if (page == cur) {
  1421.                     replyMSG.append("&nbsp;&nbsp;" + cur + "&nbsp;&nbsp;");
  1422.                 } else {
  1423.                     replyMSG.append("&nbsp;&nbsp;<a action=\"bypass -h npc_" + getObjectId() + "_voteStep2 " + service + " " + cur + "\">" + cur + "</a>&nbsp;&nbsp;");
  1424.                 }
  1425.             }
  1426.         }
  1427.         replyMSG.append("<br><a action=\"bypass -h npc_" + getObjectId() + "_voteHome\">Вернуться.</a></body></html>");
  1428.         reply.setHtml(replyMSG.toString());
  1429.         player.sendPacket(reply);
  1430.     }
  1431.  
  1432.     private void showVote1Item(L2PcInstance player, int service, int objectId) {
  1433.         L2ItemInstance item = player.getInventory().getItemByObjectId(objectId);
  1434.         if (item != null) {
  1435.             if (!item.canBeEnchanted()) {
  1436.                 showVoteErr0r(player, service, 1);
  1437.                 return;
  1438.             }
  1439.  
  1440.             if (service == 1 && !item.isAugmented()) {
  1441.                 showVoteErr0r(player, service, 1);
  1442.                 return;
  1443.             }
  1444.  
  1445.             NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  1446.             TextBuilder replyMSG = new TextBuilder("<html><body>");
  1447.  
  1448.             int coinId = 0;
  1449.             String itemName = item.getItem().getName();
  1450.             int enchantLevel = item.getEnchantLevel();
  1451.             String itemIcon = item.getItem().getIcon();
  1452.  
  1453.             if (service == 1) {
  1454.                 replyMSG.append("Перенос ЛС:<br>Из этой шмотки переносим?<br>");
  1455.                 coinId = AUGMENT_COIN;
  1456.             } else {
  1457.                 replyMSG.append("Перенос заточки:<br>Из этой шмотки переносим?<br>");
  1458.                 coinId = ENCHANT_COIN;
  1459.             }
  1460.  
  1461.             L2ItemInstance coin = player.getInventory().getItemByItemId(coinId);
  1462.  
  1463.             if (service == 1) {
  1464.                 replyMSG.append("<table width=300><tr><td><img src=\"" + itemIcon + "\" width=32 height=32></td><td><font color=LEVEL>" + itemName + " (+" + enchantLevel + ")</font><br></td></tr></table><br><br>");
  1465.                 L2Skill augment = item.getAugmentation().getAugmentSkill();
  1466.                 if (augment == null) {
  1467.                     showVoteErr0r(player, service, 1);
  1468.                     return;
  1469.                 }
  1470.  
  1471.                 String augName = augment.getName();
  1472.                 String type = "";
  1473.                 if (augment.isActive()) {
  1474.                     type = "(Активный)";
  1475.                 } else if (augment.isPassive()) {
  1476.                     type = "(Пассивный)";
  1477.                 } else {
  1478.                     type = "(Шансовый)";
  1479.                 }
  1480.  
  1481.                 replyMSG.append("<br>Аугмент: <font color=bef574>" + augName + "" + type + "</font><br>");
  1482.                 if (coin != null && coin.getCount() >= AUGMENT_PRICE) {
  1483.                     replyMSG.append("<font color=33CC00>Стоимость: " + AUGMENT_PRICE + " " + AUGMENT_COIN_NAME + "</font><br>");
  1484.                     replyMSG.append("<button value=\"Продолжить\" action=\"bypass -h npc_" + getObjectId() + "_voteStep2 1 1\" width=60 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"><br>");
  1485.                     player.setVote1Item(objectId);
  1486.                     player.setVoteAugment(augment);
  1487.                 } else {
  1488.                     replyMSG.append("<font color=FF6666>Стоимость: " + AUGMENT_PRICE + " " + AUGMENT_COIN_NAME + "</font><br>");
  1489.                     replyMSG.append("<font color=999999>[Продолжить]</font>");
  1490.                 }
  1491.             } else {
  1492.                 int vePrice = ENCHANT_PRICE * enchantLevel;
  1493.                 replyMSG.append("<table width=300><tr><td><img src=\"" + itemIcon + "\" width=32 height=32></td><td><font color=LEVEL>" + itemName + " (+" + enchantLevel + ")</font><br></td></tr></table><br><br>");
  1494.                 replyMSG.append("<br>Заточка: <font color=bef574>+" + enchantLevel + "</font><br>");
  1495.                 if (coin != null && coin.getCount() >= vePrice) {
  1496.                     replyMSG.append("<font color=33CC00>Стоимость: " + vePrice + " " + ENCHANT_COIN_NAME + "</font><br>");
  1497.                     replyMSG.append("<button value=\"Продолжить\" action=\"bypass -h npc_" + getObjectId() + "_voteStep2 2 1\" width=60 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"><br>");
  1498.                     player.setVote1Item(objectId);
  1499.                     player.setVoteEnchant(enchantLevel);
  1500.                 } else {
  1501.                     replyMSG.append("<font color=FF6666>Стоимость: " + vePrice + " " + ENCHANT_COIN_NAME + "</font><br>");
  1502.                     replyMSG.append("<font color=999999>[Продолжить]</font>");
  1503.                 }
  1504.             }
  1505.             replyMSG.append("<br><a action=\"bypass -h npc_" + getObjectId() + "_voteHome\">Вернуться.</a>");
  1506.             replyMSG.append("</body></html>");
  1507.             reply.setHtml(replyMSG.toString());
  1508.             player.sendPacket(reply);
  1509.         } else {
  1510.             showVoteErr0r(player, service, 2);
  1511.             return;
  1512.         }
  1513.     }
  1514.  
  1515.     private void showVote2Item(L2PcInstance player, int service, int objectId) {
  1516.         L2ItemInstance item = player.getInventory().getItemByObjectId(objectId);
  1517.         if (item != null) {
  1518.             if (!item.canBeEnchanted()) {
  1519.                 showVoteErr0r(player, service, 1);
  1520.                 return;
  1521.             }
  1522.  
  1523.             if (service == 1 && item.isAugmented()) {
  1524.                 showVoteErr0r(player, service, 1);
  1525.                 return;
  1526.             }
  1527.  
  1528.             NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  1529.             TextBuilder replyMSG = new TextBuilder("<html><body>");
  1530.  
  1531.             int coinId = 0;
  1532.             String itemName = item.getItem().getName();
  1533.             int enchantLevel = item.getEnchantLevel();
  1534.             String itemIcon = item.getItem().getIcon();
  1535.  
  1536.             if (service == 1) {
  1537.                 replyMSG.append("Перенос ЛС:<br>В эту шмотку переносим?<br>");
  1538.                 coinId = AUGMENT_COIN;
  1539.             } else {
  1540.                 replyMSG.append("Перенос заточки:<br>В эту шмотку переносим?<br>");
  1541.                 coinId = ENCHANT_COIN;
  1542.             }
  1543.  
  1544.             L2ItemInstance coin = player.getInventory().getItemByItemId(coinId);
  1545.  
  1546.             if (service == 1) {
  1547.                 replyMSG.append("<table width=300><tr><td><img src=\"" + itemIcon + "\" width=32 height=32></td><td><font color=LEVEL>" + itemName + " (+" + enchantLevel + ")</font><br></td></tr></table><br><br>");
  1548.                 if (coin != null && coin.getCount() >= AUGMENT_PRICE) {
  1549.                     replyMSG.append("<font color=33CC00>Стоимость: " + AUGMENT_PRICE + " " + AUGMENT_COIN_NAME + "</font><br>");
  1550.                     replyMSG.append("<button value=\"Продолжить\" action=\"bypass -h npc_" + getObjectId() + "_voteStep3_1\" width=60 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"><br>");
  1551.                     player.setVote2Item(objectId);
  1552.                 } else {
  1553.                     replyMSG.append("<font color=FF6666>Стоимость: " + AUGMENT_PRICE + " Ble Eva</font><br>");
  1554.                     replyMSG.append("<font color=999999>[Продолжить]</font>");
  1555.                 }
  1556.             } else {
  1557.                 int enchPrice = ENCHANT_PRICE * player.getVoteEnchant();
  1558.                 replyMSG.append("<table width=300><tr><td><img src=\"" + itemIcon + "\" width=32 height=32></td><td><font color=LEVEL>" + itemName + " (+" + enchantLevel + ")</font><br></td></tr></table><br><br>");
  1559.                 replyMSG.append("<br>Заточка: <font color=bef574>+" + enchantLevel + "</font><br>");
  1560.                 if (coin != null && coin.getCount() >= enchPrice) {
  1561.                     if (enchantLevel > 0) {
  1562.                         replyMSG.append("<font color=CC6633>Аккуратно! Пушка уже заточена и при переносе точка на ней пропадет!</font><br><br>");
  1563.                     }
  1564.                     replyMSG.append("<font color=33CC00>Стоимость: " + enchPrice + " " + ENCHANT_COIN_NAME + "</font><br>");
  1565.                     replyMSG.append("<button value=\"Продолжить\" action=\"bypass -h npc_" + getObjectId() + "_voteStep3_2\" width=60 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"><br>");
  1566.                     player.setVote2Item(objectId);
  1567.                 } else {
  1568.                     replyMSG.append("<font color=FF6666>Стоимость: " + enchPrice + " " + ENCHANT_COIN_NAME + "</font><br>");
  1569.                     replyMSG.append("<font color=999999>[Продолжить]</font>");
  1570.                 }
  1571.             }
  1572.             replyMSG.append("<br><a action=\"bypass -h npc_" + getObjectId() + "_voteHome\">Вернуться.</a>");
  1573.             replyMSG.append("</body></html>");
  1574.             reply.setHtml(replyMSG.toString());
  1575.             player.sendPacket(reply);
  1576.         } else {
  1577.             showVoteErr0r(player, service, 2);
  1578.             return;
  1579.         }
  1580.     }
  1581.  
  1582.     private void showVoteAgree(L2PcInstance player, int service) {
  1583.         L2ItemInstance item1 = player.getInventory().getItemByObjectId(player.getVote1Item());
  1584.         L2ItemInstance item2 = player.getInventory().getItemByObjectId(player.getVote2Item());
  1585.         if (item1 != null && item2 != null) {
  1586.             if (!item1.canBeEnchanted() || !item2.canBeEnchanted()) {
  1587.                 showVoteErr0r(player, service, 1);
  1588.                 return;
  1589.             }
  1590.  
  1591.             if (service == 1 && !item1.isAugmented()) {
  1592.                 showVoteErr0r(player, service, 1);
  1593.                 return;
  1594.             }
  1595.  
  1596.             if (service == 1 && item2.isAugmented()) {
  1597.                 showVoteErr0r(player, service, 1);
  1598.                 return;
  1599.             }
  1600.  
  1601.             NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  1602.             TextBuilder replyMSG = new TextBuilder("<html><body>");
  1603.  
  1604.             int coinId = 0;
  1605.             String itemName1 = item1.getItem().getName();
  1606.             int enchantLevel1 = item1.getEnchantLevel();
  1607.             String itemName2 = item2.getItem().getName();
  1608.             int enchantLevel2 = item2.getEnchantLevel();
  1609.             String itemIcon1 = item1.getItem().getIcon();
  1610.             String itemIcon2 = item2.getItem().getIcon();
  1611.  
  1612.             if (service == 1) {
  1613.                 replyMSG.append("Перенос ЛС:<br>Подтверждаете?<br>");
  1614.                 coinId = AUGMENT_COIN;
  1615.             } else {
  1616.                 replyMSG.append("Перенос заточки:<br>Подтверждаете?<br>");
  1617.                 coinId = ENCHANT_COIN;
  1618.             }
  1619.  
  1620.             L2ItemInstance coin = player.getInventory().getItemByItemId(coinId);
  1621.  
  1622.             if (service == 1) {
  1623.                 L2Skill augment = item1.getAugmentation().getAugmentSkill();
  1624.  
  1625.                 if (augment == null || player.getVoteAugment() != augment) {
  1626.                     showVoteErr0r(player, service, 1);
  1627.                     return;
  1628.                 }
  1629.  
  1630.                 String augName = augment.getName();
  1631.                 String type = "";
  1632.                 if (augment.isActive()) {
  1633.                     type = "(Активный)";
  1634.                 } else if (augment.isPassive()) {
  1635.                     type = "(Пассивный)";
  1636.                 } else {
  1637.                     type = "(Шансовый)";
  1638.                 }
  1639.  
  1640.                 replyMSG.append("<br>Аугмент: <font color=bef574>" + augName + "" + type + "</font><br>");
  1641.                 replyMSG.append("<table width=300><tr><td><img src=\"" + itemIcon1 + "\" width=32 height=32></td><td> >>>>>> </td><td><img src=\"" + itemIcon2 + "\" width=32 height=32></td></tr></table><br><br>");
  1642.                 replyMSG.append("Из: <font color=LEVEL>" + itemName1 + " (+" + enchantLevel1 + ")</font><br>");
  1643.                 replyMSG.append("В: <font color=LEVEL>" + itemName2 + " (+" + enchantLevel2 + ")</font><br>");
  1644.  
  1645.                 if (coin != null && coin.getCount() >= AUGMENT_PRICE) {
  1646.                     replyMSG.append("<font color=33CC00>Стоимость: " + AUGMENT_PRICE + " " + AUGMENT_COIN_NAME + "</font><br>");
  1647.                     replyMSG.append("<button value=\"Перенести\" action=\"bypass -h npc_" + getObjectId() + "_voteComplete_1\" width=60 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"><br>");
  1648.                 } else {
  1649.                     replyMSG.append("<font color=FF6666>Стоимость: " + AUGMENT_PRICE + " Ble Eva</font><br>");
  1650.                     replyMSG.append("<font color=999999>[Продолжить]</font>");
  1651.                 }
  1652.             } else {
  1653.                 if (player.getVoteEnchant() != enchantLevel1 || enchantLevel1 == 0) {
  1654.                     showVoteErr0r(player, service, 1);
  1655.                     return;
  1656.                 }
  1657.  
  1658.                 int enchPrice = ENCHANT_PRICE * enchantLevel1;
  1659.  
  1660.                 replyMSG.append("<br>Заточка: <font color=bef574>+" + enchantLevel1 + "</font><br>");
  1661.                 replyMSG.append("<table width=220><tr><td><img src=\"" + itemIcon1 + "\" width=32 height=32></td><td> >>>>>> </td><td><img src=\"" + itemIcon2 + "\" width=32 height=32></td></tr></table><br><br>");
  1662.                 replyMSG.append("Из: <font color=LEVEL>" + itemName1 + " (+" + enchantLevel1 + ")</font><br>");
  1663.                 replyMSG.append("В: <font color=LEVEL>" + itemName2 + " (+" + enchantLevel2 + ")</font><br>");
  1664.  
  1665.                 if (coin != null && coin.getCount() >= enchPrice) {
  1666.                     replyMSG.append("<font color=33CC00>Стоимость: " + enchPrice + " " + ENCHANT_COIN_NAME + "</font><br>");
  1667.                     replyMSG.append("<button value=\"Перенести\" action=\"bypass -h npc_" + getObjectId() + "_voteComplete_2\" width=60 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"><br>");
  1668.                 } else {
  1669.                     replyMSG.append("<font color=FF6666>Стоимость: " + enchPrice + " " + ENCHANT_COIN_NAME + "</font><br>");
  1670.                     replyMSG.append("<font color=999999>[Продолжить]</font>");
  1671.                 }
  1672.             }
  1673.             replyMSG.append("<br><a action=\"bypass -h npc_" + getObjectId() + "_voteHome\">Вернуться.</a>");
  1674.             replyMSG.append("</body></html>");
  1675.             reply.setHtml(replyMSG.toString());
  1676.             player.sendPacket(reply);
  1677.         } else {
  1678.             showVoteErr0r(player, service, 2);
  1679.             return;
  1680.         }
  1681.     }
  1682.  
  1683.     private void showDoVoteFinish(L2PcInstance player, int service) {
  1684.         L2ItemInstance item1 = player.getInventory().getItemByObjectId(player.getVote1Item());
  1685.         L2ItemInstance item2 = player.getInventory().getItemByObjectId(player.getVote2Item());
  1686.         if (item1 != null && item2 != null) {
  1687.             if (!item1.canBeEnchanted() || !item2.canBeEnchanted()) {
  1688.                 showVoteErr0r(player, service, 1);
  1689.                 return;
  1690.             }
  1691.  
  1692.             if (service == 1 && !item1.isAugmented()) {
  1693.                 showVoteErr0r(player, service, 1);
  1694.                 return;
  1695.             }
  1696.  
  1697.             if (service == 1 && item2.isAugmented()) {
  1698.                 showVoteErr0r(player, service, 1);
  1699.                 return;
  1700.             }
  1701.  
  1702.             NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  1703.             TextBuilder replyMSG = new TextBuilder("<html><body>");
  1704.  
  1705.             int coinId = 5962;
  1706.             int price = 99999;
  1707.             int enchantLevel1 = item1.getEnchantLevel();
  1708.  
  1709.             if (service == 1) {
  1710.                 coinId = AUGMENT_COIN;
  1711.                 price = AUGMENT_PRICE;
  1712.             } else {
  1713.                 coinId = ENCHANT_COIN;
  1714.                 price = ENCHANT_PRICE * enchantLevel1;
  1715.             }
  1716.  
  1717.             L2ItemInstance coin = player.getInventory().getItemByItemId(coinId);
  1718.  
  1719.             if (coin == null || coin.getCount() < price) {
  1720.                 showVoteErr0r(player, service, 3);
  1721.                 return;
  1722.             }
  1723.  
  1724.             //player.getInventory().destroyItemByItemId(coinId, price, true);              
  1725.             if (!player.destroyItemByItemId("DS showDoVoteFinish", coinId, price, player, true)) {
  1726.                 showVoteErr0r(player, service, 3);
  1727.                 return;
  1728.             }
  1729.  
  1730.             if (service == 1) {
  1731.                 L2Skill augment = item1.getAugmentation().getAugmentSkill();
  1732.  
  1733.                 if (augment == null || player.getVoteAugment() != augment) {
  1734.                     showVoteErr0r(player, service, 1);
  1735.                     return;
  1736.                 }
  1737.  
  1738.                 int augId = augment.getId();
  1739.                 int augLevel = augment.getLevel();
  1740.                 int augEffId = item1.getAugmentation().getAugmentationId();
  1741.  
  1742.                 String augName = augment.getName();
  1743.                 String type = "";
  1744.                 if (augment.isActive()) {
  1745.                     type = "(Активный)";
  1746.                 } else if (augment.isPassive()) {
  1747.                     type = "(Пассивный)";
  1748.                 } else {
  1749.                     type = "(Шансовый)";
  1750.                 }
  1751.  
  1752.                 item1.getAugmentation().removeBoni(player);
  1753.                 item1.removeAugmentation();
  1754.  
  1755.                 //item2.setAugmentation(new L2Augmentation(augEffId, augId, augLevel));
  1756.                 item2.setAugmentation(new L2Augmentation(item2, augEffId, augId, augLevel, true));
  1757.  
  1758.                 replyMSG.append("<br>Аугмент: <font color=bef574>" + augName + "" + type + "</font>...<br>");
  1759.                 replyMSG.append("<font color=33CC00>...перенесен!<br>");
  1760.             } else {
  1761.                 if (player.getVoteEnchant() != enchantLevel1) {
  1762.                     showVoteErr0r(player, service, 1);
  1763.                     return;
  1764.                 }
  1765.  
  1766.                 item1.setEnchantLevel(0);
  1767.                 item1.updateDatabase();
  1768.  
  1769.                 item2.setEnchantLevel(enchantLevel1);
  1770.                 item2.updateDatabase();
  1771.  
  1772.                 replyMSG.append("<br>Заточка: <font color=bef574>+" + enchantLevel1 + "</font><br>");
  1773.                 replyMSG.append("<font color=33CC00>...перенесена!<br>");
  1774.             }
  1775.  
  1776.             //player.sendPacket(new InventoryUpdate().addModifiedItem(item1));
  1777.             //player.sendPacket(new InventoryUpdate().addModifiedItem(item2));
  1778.             player.sendItems(false);
  1779.             player.broadcastUserInfo();
  1780.  
  1781.             player.setVote1Item(0);
  1782.             player.setVote2Item(0);
  1783.             player.setVoteEnchant(0);
  1784.             player.setVoteAugment(null);
  1785.  
  1786.             //player.sendChanges();
  1787.             replyMSG.append("<br><a action=\"bypass -h npc_" + getObjectId() + "_voteHome\">Вернуться.</a>");
  1788.             replyMSG.append("</body></html>");
  1789.             reply.setHtml(replyMSG.toString());
  1790.             player.sendPacket(reply);
  1791.         } else {
  1792.             showVoteErr0r(player, service, 0);
  1793.             return;
  1794.         }
  1795.     }
  1796.  
  1797.     private void showVoteErr0r(L2PcInstance player, int serviceId, int errorId) {
  1798.         String Service;
  1799.         if (serviceId == 1) {
  1800.             Service = "Перенос аугментации:";
  1801.         } else {
  1802.             Service = "Перенос заточки:";
  1803.         }
  1804.  
  1805.         String Error = "Ошибка!";
  1806.  
  1807.         switch (errorId) {
  1808.             case 0:
  1809.                 Error = "пушки не найдены";
  1810.                 break;
  1811.             case 1:
  1812.                 Error = "пушка не соответствует параметрам";
  1813.                 break;
  1814.             case 2:
  1815.                 Error = "пушка не найдена";
  1816.                 break;
  1817.             case 3:
  1818.                 Error = "проверьте стоимость";
  1819.                 break;
  1820.         }
  1821.  
  1822.         player.setVote1Item(0);
  1823.         player.setVote2Item(0);
  1824.         player.setVoteEnchant(0);
  1825.         player.setVoteAugment(null);
  1826.  
  1827.         //player.sendMessage(Service + " " + Error);
  1828.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  1829.         TextBuilder replyMSG = new TextBuilder("<html><body> " + Service + " " + Error + "</body></html>");
  1830.         reply.setHtml(replyMSG.toString());
  1831.         player.sendPacket(reply);
  1832.         player.sendActionFailed();
  1833.     }
  1834.  
  1835.     /*
  1836.      * Сервис для кланов
  1837.      */
  1838.     private void clanWelcome(L2PcInstance player) {
  1839.         L2Clan clan = player.getClan();
  1840.         int level = clan.getLevel();
  1841.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  1842.         TextBuilder replyMSG = new TextBuilder("<html><body>");
  1843.         replyMSG.append("<table width=280><tr><td><font color=336699>Клан:</font> <font color=33CCFF>" + clan.getName() + " (" + level + " ур.)</font></td><td align=right><font color=336699>Лидер:</font> <font color=33CCFF>" + player.getName() + "</font></td></tr></table><br><br>");
  1844.         replyMSG.append("Повышение уровня клана:<br1>");
  1845.         if (level < 8) {
  1846.             replyMSG.append("<a action=\"bypass -h npc_" + getObjectId() + "_clanLevel_8\" msg=\"Покупка 8 уровень кланa. Уверены?\">8 уровень.</a> (" + CLAN_LVL8 + " " + CLAN_COIN_NAME + ")<br>");
  1847.             /*switch (level)
  1848.              {
  1849.              case 5:
  1850.              replyMSG.append("<a action=\"bypass -h npc_" + getObjectId() + "_clanLevel_6\">6 уровень</a> (" + CLAN_LVL6 + " " + CLAN_COIN_NAME + ")<br>");
  1851.              replyMSG.append("<font color=999999>[7 уровень]</font> (" + CLAN_LVL7 + " " + CLAN_COIN_NAME + ")<br>");
  1852.              replyMSG.append("<font color=999999>[8 уровень]</font> (" + CLAN_LVL8 + " " + CLAN_COIN_NAME + ")<br>");
  1853.              break;
  1854.              case 6:
  1855.              replyMSG.append("<a action=\"bypass -h npc_" + getObjectId() + "_clanLevel_7\">7 уровень.</a> (" + CLAN_LVL7 + " " + CLAN_COIN_NAME + ")<br>");
  1856.              replyMSG.append("<font color=999999>[8 уровень]</font> (" + CLAN_LVL8 + " " + CLAN_COIN_NAME + ")<br>");
  1857.              break;
  1858.              case 7:
  1859.              replyMSG.append("<a action=\"bypass -h npc_" + getObjectId() + "_clanLevel_8\">8 уровень.</a> (" + CLAN_LVL8 + " " + CLAN_COIN_NAME + ")<br>");
  1860.              break;
  1861.              }*/
  1862.         } else {
  1863.             replyMSG.append("<font color=66CC00>Уже максимальный!</font><br>");
  1864.         }
  1865.  
  1866.         replyMSG.append("Дополнительно:<br1>");
  1867.         if (level >= 5) {
  1868.             replyMSG.append("<a action=\"bypass -h npc_" + getObjectId() + "_clanPoints\" msg=\"Покупка " + CLAN_POINTS + " клан очков. Уверены?\">" + CLAN_POINTS + " клан очков. </a> (" + CLAN_POINTS_PRICE + " " + CLAN_COIN_NAME + ")<br>");
  1869.             replyMSG.append("<a action=\"bypass -h npc_" + getObjectId() + "_clanSkills\" msg=\"Покупка фулл клан скиллов. Уверены?\">Фулл клан скиллы. </a> (" + Config.CLAN_SKILLS_PRICE + " " + CLAN_COIN_NAME + ")<br>");
  1870.         } else {
  1871.             replyMSG.append("<font color=999999>[" + CLAN_POINTS + " клан очков]</font> (" + CLAN_POINTS_PRICE + " " + CLAN_COIN_NAME + ") Для кланов выше 5 ур.<br>");
  1872.             replyMSG.append("<font color=999999>[Фулл клан скиллы]</font> (" + Config.CLAN_SKILLS_PRICE + " " + CLAN_COIN_NAME + ") Для кланов выше 5 ур.<br>");
  1873.         }
  1874.  
  1875.         replyMSG.append("</body></html>");
  1876.         reply.setHtml(replyMSG.toString());
  1877.         player.sendPacket(reply);
  1878.     }
  1879.  
  1880.     private void clanSetLevel(L2PcInstance player, int level) {
  1881.         int price = 99999;
  1882.         switch (level) {
  1883.             case 6:
  1884.                 price = CLAN_LVL6;
  1885.                 break;
  1886.             case 7:
  1887.                 price = CLAN_LVL7;
  1888.                 break;
  1889.             case 8:
  1890.                 price = CLAN_LVL8;
  1891.                 break;
  1892.         }
  1893.  
  1894.         L2ItemInstance coin = player.getInventory().getItemByItemId(CLAN_COIN);
  1895.         if (coin == null || coin.getCount() < price) {
  1896.             player.sendMessage("Проверьте стоимость");
  1897.             return;
  1898.         }
  1899.  
  1900.         if (!player.destroyItemByItemId("DS clanSetLevel", CLAN_COIN, price, player, true)) {
  1901.             player.sendMessage("Проверьте стоимость");
  1902.             return;
  1903.         }
  1904.  
  1905.         player.getClan().changeLevel(level);
  1906.         player.sendMessage("Уровень клана увеличен до " + level);
  1907.         Log.addDonate(player, "Clan Level: " + level, CLAN_POINTS_PRICE);
  1908.     }
  1909.  
  1910.     private void clanPoints(L2PcInstance player) {
  1911.         L2Clan clan = player.getClan();
  1912.         if (clan == null || clan.getLevel() < 5) {
  1913.             player.sendMessage("Только для кланов выше 5 уровня");
  1914.             return;
  1915.         }
  1916.  
  1917.         L2ItemInstance coin = player.getInventory().getItemByItemId(CLAN_COIN);
  1918.         if (coin == null || coin.getCount() < CLAN_POINTS_PRICE) {
  1919.             player.sendMessage("Проверьте стоимость.");
  1920.             return;
  1921.         }
  1922.  
  1923.         if (!player.destroyItemByItemId("DS clanSetLevel", CLAN_COIN, CLAN_POINTS_PRICE, player, true)) {
  1924.             player.sendMessage("Проверьте стоимость");
  1925.             return;
  1926.         }
  1927.  
  1928.         clan.addPoints(CLAN_POINTS);
  1929.         //clan.setReputationScore(clan.getReputationScore() + CLAN_POINTS, true);
  1930.         player.sendMessage("Добавлено " + CLAN_POINTS + " очков, перезайдите, что-бы увидеть изменения.");
  1931.         Log.addDonate(player, CLAN_POINTS + " Clan Points", CLAN_POINTS_PRICE);
  1932.     }
  1933.  
  1934.     private void clanSkills(L2PcInstance player) {
  1935.         L2Clan clan = player.getClan();
  1936.         if (clan == null || clan.getLevel() < 5) {
  1937.             player.sendMessage("Только для кланов выше 5 уровня");
  1938.             return;
  1939.         }
  1940.  
  1941.         if (clan.getSkills().size() == 22) { //license
  1942.             //player.sendMessage("Все скиллы куплены!"); // CeT
  1943.             //player.sendMessage("Все скиллы куплены!!"); //  joe`jo
  1944.             //player.sendMessage("Все скиллы куплены!!!"); //  mat
  1945.             //player.sendMessage("Все скиллы куплены!!!!"); //  djimbo
  1946.             //player.sendMessage("Все скиллы уже куплены!"); //  CruSade
  1947.             //player.sendMessage("Все скиллы уже куплены!!"); //  BooGiMaN
  1948.             //player.sendMessage("Все скиллы уже куплены!!!"); //  Gektor
  1949.             //player.sendMessage("Все скиллы уже куплены!!!!"); //  b13
  1950.             //player.sendMessage("Нет доступных скиллов!"); //  mcwa
  1951.             //player.sendMessage("Нет доступных скиллов!!"); //  f1recat
  1952.             player.sendMessage("Нет доступных скиллов!!!"); //  DOty
  1953.             return;
  1954.         }
  1955.  
  1956.         L2ItemInstance coin = player.getInventory().getItemByItemId(CLAN_COIN);
  1957.         if (coin == null || coin.getCount() < Config.CLAN_SKILLS_PRICE) {
  1958.             player.sendMessage("Проверьте стоимость.");
  1959.             return;
  1960.         }
  1961.  
  1962.         if (!player.destroyItemByItemId("DS clanSetLevel", CLAN_COIN, Config.CLAN_SKILLS_PRICE, player, true)) {
  1963.             player.sendMessage("Проверьте стоимость");
  1964.             return;
  1965.         }
  1966.  
  1967.         CustomServerData.getInstance().addClanSkills(player, clan);
  1968.  
  1969.         player.sendMessage("Добавлены фулл клан скиллы, перезайдите, что-бы увидеть изменения.");
  1970.         Log.addDonate(player, "Clan " + clan.getName() + ": Full Skills", Config.CLAN_SKILLS_PRICE);
  1971.     }
  1972.  
  1973.     /**
  1974.      * Продажа аугментации
  1975.      *
  1976.      */
  1977.     // окно приветствия
  1978.     private void AugSaleWelcome(L2PcInstance player) {
  1979.         if (AUGSALE_TABLE.isEmpty()) {
  1980.             player.sendMessage("Сервис не активен");
  1981.             return;
  1982.         }
  1983.  
  1984.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  1985.         TextBuilder replyMSG = new TextBuilder("<html><body>");
  1986.         replyMSG.append(player.getName() + ", выбери аугментацию:<br>");
  1987.         replyMSG.append("<table width=280><tr><td>Аугмент<br></td></tr>");
  1988.  
  1989.         for (FastMap.Entry<Integer, Integer> e = AUGSALE_TABLE.head(), end = AUGSALE_TABLE.tail(); (e = e.getNext()) != end;) {
  1990.             Integer id = e.getKey(); // No typecast necessary.
  1991.             Integer lvl = e.getValue(); // No typecast necessary.
  1992.             if (id == null || lvl == null) {
  1993.                 continue;
  1994.             }
  1995.  
  1996.             L2Skill augment = SkillTable.getInstance().getInfo(id, 1);
  1997.             if (augment == null) {
  1998.                 continue;
  1999.             }
  2000.  
  2001.             String augName = augment.getName();
  2002.             String type = "";
  2003.             if (augment.isActive()) {
  2004.                 type = "Актив";
  2005.             } else if (augment.isPassive()) {
  2006.                 type = "Пассив";
  2007.             } else {
  2008.                 type = "Шанс";
  2009.             }
  2010.             augName = augName.replace("Item Skill: ", "");
  2011.  
  2012.             replyMSG.append("<tr><td><a action=\"bypass -h npc_" + getObjectId() + "_augsaleShow " + id + "\"><font color=bef574>" + augName + " (" + type + ":" + lvl + "lvl)</font></a><br></td></tr>");
  2013.         }
  2014.  
  2015.         replyMSG.append("</table><br>* стоимость любого аугмента:<br1>" + AUGSALE_PRICE + " " + AUGSALE_COIN_NAME + "</body></html>");
  2016.  
  2017.         player.setAugSale(0, 0);
  2018.         player.setAugSaleItem(0);
  2019.  
  2020.         reply.setHtml(replyMSG.toString());
  2021.         player.sendPacket(reply);
  2022.     }
  2023.  
  2024.     //показ аугмента
  2025.     private void augSaleShow(L2PcInstance player, int augId) {
  2026.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  2027.         TextBuilder replyMSG = new TextBuilder("<html><body>");
  2028.         replyMSG.append(player.getName() + ", подтверждаешь?:<br>");
  2029.  
  2030.         int lvl = AUGSALE_TABLE.get(augId);
  2031.         replyMSG.append("<table width=280><tr><td><img src=\"Icon.skill0375\" width=32 height=32></td><td>" + getAugmentSkill(augId, lvl) + "</td></tr></table><br>");
  2032.  
  2033.         L2ItemInstance coin = player.getInventory().getItemByItemId(AUGSALE_COIN);
  2034.         if (coin != null && coin.getCount() >= AUGSALE_PRICE) {
  2035.             player.setAugSale(augId, lvl);
  2036.             replyMSG.append("<font color=33CC00>Стоимость: " + AUGSALE_PRICE + " " + AUGSALE_COIN_NAME + "</font><br>");
  2037.             replyMSG.append("<button value=\"Продолжить\" action=\"bypass -h npc_" + getObjectId() + "_augSaleItems\" width=60 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\">");
  2038.         } else {
  2039.             replyMSG.append("<font color=FF6666>Стоимость: " + AUGSALE_PRICE + " " + AUGSALE_COIN_NAME + "</font><br>");
  2040.             replyMSG.append("<font color=999999>[Продолжить]</font>");
  2041.         }
  2042.         replyMSG.append("<br><br><a action=\"bypass -h npc_" + getObjectId() + "_Augsale\">Вернуться</a><br></body></html>");
  2043.  
  2044.         reply.setHtml(replyMSG.toString());
  2045.         player.sendPacket(reply);
  2046.     }
  2047.  
  2048.     // шмотки в инвентаре
  2049.     private void AugSaleItems(L2PcInstance player) {
  2050.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  2051.         TextBuilder replyMSG = new TextBuilder("<html><body>" + getAugmentSkill(player.getAugSaleId(), player.getAugSaleLvl()) + "<br>");
  2052.         replyMSG.append("Выбор шмотки:<br>Куда втыкаем?<br><br><table width=300>");
  2053.  
  2054.         int objectId = 0;
  2055.         String itemName = "";
  2056.         int enchantLevel = 0;
  2057.         String itemIcon = "";
  2058.         int itemType = 0;
  2059.         for (L2ItemInstance item : player.getInventory().getItems()) {
  2060.             if (item == null) {
  2061.                 continue;
  2062.             }
  2063.  
  2064.             if (!item.canBeEnchanted()) {
  2065.                 continue;
  2066.             }
  2067.  
  2068.             objectId = item.getObjectId();
  2069.             itemName = item.getItem().getName();
  2070.             enchantLevel = item.getEnchantLevel();
  2071.             itemIcon = item.getItem().getIcon();
  2072.             itemType = item.getItem().getType2();
  2073.  
  2074.             if (item.canBeAugmented() && !item.isAugmented() && !item.isWear()) {
  2075.                 replyMSG.append("<tr><td><img src=\"" + itemIcon + "\" width=32 height=32></td><td><a action=\"bypass -h npc_" + getObjectId() + "_augsItem " + objectId + "\">" + itemName + " (+" + enchantLevel + ")</a></td></tr>");
  2076.             }
  2077.         }
  2078.  
  2079.         replyMSG.append("</table>");
  2080.         replyMSG.append("<br><br><a action=\"bypass -h npc_" + getObjectId() + "_Augsale\">Вернуться</a><br></body></html>");
  2081.         reply.setHtml(replyMSG.toString());
  2082.         player.sendPacket(reply);
  2083.     }
  2084.  
  2085.     // подробная инфа о шмотке
  2086.     private void AugsItem(L2PcInstance player, int objectId) {
  2087.         L2ItemInstance item = player.getInventory().getItemByObjectId(objectId);
  2088.         if (item != null) {
  2089.             if (!item.canBeEnchanted()) {
  2090.                 showError(player, "Ошибка запроса.");
  2091.                 return;
  2092.             }
  2093.  
  2094.             NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  2095.             TextBuilder replyMSG = new TextBuilder("<html><body>" + getAugmentSkill(player.getAugSaleId(), player.getAugSaleLvl()) + "<br>");
  2096.  
  2097.             String itemName = item.getItem().getName();
  2098.             int enchantLevel = item.getEnchantLevel();
  2099.             String itemIcon = item.getItem().getIcon();
  2100.  
  2101.             replyMSG.append("Покупка аугментации:<br>Подтверждаете шмотку?<br>");
  2102.  
  2103.             replyMSG.append("<table width=300><tr><td><img src=\"" + itemIcon + "\" width=32 height=32></td><td><font color=LEVEL>" + itemName + " (+" + enchantLevel + ")</font>g<br></td></tr></table><br><br>");
  2104.             replyMSG.append("<br>Заточка: <font color=bef574>+" + enchantLevel + "</font><br>");
  2105.  
  2106.             replyMSG.append("<button value=\"Продолжить\" action=\"bypass -h npc_" + getObjectId() + "_AugsaleFinish\" width=60 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"><br>");
  2107.             player.setAugSaleItem(objectId);
  2108.  
  2109.             replyMSG.append("<br><br><a action=\"bypass -h npc_" + getObjectId() + "_Augsale\">Вернуться</a><br></body></html>");
  2110.             reply.setHtml(replyMSG.toString());
  2111.             player.sendPacket(reply);
  2112.         } else {
  2113.             showError(player, "Ошибка запроса.");
  2114.             return;
  2115.         }
  2116.     }
  2117.  
  2118.     // финишь. забираем мани и втыкаем лс
  2119.     private void AugsaleFinish(L2PcInstance player) {
  2120.         L2ItemInstance targetItem = player.getInventory().getItemByObjectId(player.getAugSaleItem());
  2121.         if (targetItem != null) {
  2122.             if (targetItem.isAugmented()) {
  2123.                 showVoteErr0r(player, 1, 1);
  2124.                 return;
  2125.             }
  2126.  
  2127.             NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  2128.             TextBuilder replyMSG = new TextBuilder("<html><body>");
  2129.  
  2130.             L2ItemInstance coin = player.getInventory().getItemByItemId(AUGSALE_COIN);
  2131.             if (coin == null || coin.getCount() < AUGSALE_PRICE) {
  2132.                 showVoteErr0r(player, 1, 3);
  2133.                 return;
  2134.             }
  2135.  
  2136.             //player.getInventory().destroyItemByItemId(coinId, price, true);              
  2137.             if (!player.destroyItemByItemId("Ls bue", AUGSALE_COIN, AUGSALE_PRICE, player, true)) {
  2138.                 showVoteErr0r(player, 1, 3);
  2139.                 return;
  2140.             }
  2141.             int augId = player.getAugSaleId();
  2142.             int augLevel = player.getAugSaleLvl();
  2143.  
  2144.             L2Skill augment = SkillTable.getInstance().getInfo(augId, 1);
  2145.             if (augment == null) {
  2146.                 showVoteErr0r(player, 1, 0);
  2147.                 return;
  2148.             }
  2149.  
  2150.             int type = 0;
  2151.             if (augment.isActive()) {
  2152.                 type = 2;
  2153.             } else if (augment.isPassive()) {
  2154.                 type = 3;
  2155.             } else {
  2156.                 type = 1;
  2157.             }
  2158.  
  2159.             //item2.setAugmentation(new L2Augmentation(item2, augEffId, augId, augLevel, true));
  2160.             targetItem.setAugmentation(AugmentationData.getInstance().generateAugmentation(targetItem, augId, augLevel, type));
  2161.  
  2162.             replyMSG.append("" + getAugmentSkill(augId, augLevel) + "<br>");
  2163.             replyMSG.append("<font color=33CC00>...куплен!<br>");
  2164.  
  2165.             //player.sendPacket(new InventoryUpdate().addModifiedItem(item1));
  2166.             //player.sendPacket(new InventoryUpdate().addModifiedItem(item2));
  2167.             player.sendItems(false);
  2168.             player.broadcastUserInfo();
  2169.  
  2170.             player.setAugSale(0, 0);
  2171.             player.setAugSaleItem(0);
  2172.  
  2173.             //player.sendChanges();
  2174.             replyMSG.append("</body></html>");
  2175.             reply.setHtml(replyMSG.toString());
  2176.             player.sendPacket(reply);
  2177.  
  2178.             Log.addDonate(player, "LS " + augId + ":" + augLevel, AUGSALE_PRICE);
  2179.         } else {
  2180.             showVoteErr0r(player, 1, 0);
  2181.             return;
  2182.         }
  2183.     }
  2184.  
  2185.     /**
  2186.      * Шадоу шмотки
  2187.      */
  2188.     private void itemsChina(L2PcInstance player) {
  2189.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  2190.         TextBuilder replyMSG = new TextBuilder("<html><body>Китайский магазин<br>");
  2191.         replyMSG.append("Товары:<br>");
  2192.         replyMSG.append("<table width=260><tr><td></td><td></td></tr>");
  2193.  
  2194.         ChinaItem ds = null;
  2195.         FastMap<Integer, ChinaItem> chinaShop = CustomServerData.getInstance().getChinaShop();
  2196.         for (FastMap.Entry<Integer, ChinaItem> e = chinaShop.head(), end = chinaShop.tail(); (e = e.getNext()) != end;) {
  2197.             Integer id = e.getKey(); // No typecast necessary.
  2198.             ds = e.getValue(); // No typecast necessary.
  2199.  
  2200.             if (ds == null) {
  2201.                 continue;
  2202.             }
  2203.  
  2204.             L2Item china = ItemTable.getInstance().getTemplate(id);
  2205.             if (china == null) {
  2206.                 continue;
  2207.             }
  2208.  
  2209.             replyMSG.append("<tr><td><img src=\"" + china.getIcon() + "\" width=32 height=32></td><td><a action=\"bypass -h npc_" + getObjectId() + "_chinaShow " + id + "\"><font color=99FF66>" + ds.name + "</font></a><br1><font color=336633>Стоимость: " + ds.price + " CoL</font><br></td></tr>");
  2210.         }
  2211.         //
  2212.         //
  2213.         replyMSG.append("</table><br><br>");
  2214.  
  2215.         replyMSG.append("<br><br></body></html>");
  2216.         reply.setHtml(replyMSG.toString());
  2217.         player.sendPacket(reply);
  2218.     }
  2219.  
  2220.     private void chinaShow(L2PcInstance player, int itemId) {
  2221.         L2Item china = ItemTable.getInstance().getTemplate(itemId);
  2222.         if (china == null) {
  2223.             showError(player, "Ошибка запроса.");
  2224.             return;
  2225.         }
  2226.  
  2227.         ChinaItem ds = CustomServerData.getInstance().getChinaItem(itemId);
  2228.         if (ds == null) {
  2229.             showError(player, "Ошибка запроса.");
  2230.             return;
  2231.         }
  2232.  
  2233.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  2234.         TextBuilder replyMSG = new TextBuilder("<html><body>KuTаuсkuu Mаrа3uH*<br>");
  2235.  
  2236.         replyMSG.append("<table width=250><tr><td align=right><img src=\"" + china.getIcon() + "\" width=32 height=32></td><td><font color=33FFFF>" + ds.name + "</font></td></tr></table><br><br>");
  2237.         replyMSG.append("<font color=336699>Инфо: </font><font color=3399CC> " + ds.info + "</font><br>");
  2238.         replyMSG.append("<font color=336699>Длительность: </font><font color=3399CC> " + ds.days + " часов</font><br>");
  2239.         L2ItemInstance coin = player.getInventory().getItemByItemId(ds.coin);
  2240.         if (coin != null && coin.getCount() >= ds.price) {
  2241.             replyMSG.append("<font color=33CC00>Стоимость:<br1> " + ds.price + " Coin Of Luck</font><br>");
  2242.             replyMSG.append("<button value=\"Купить\" action=\"bypass -h npc_" + getObjectId() + "_bueChina " + itemId + "\" width=60 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\">");
  2243.         } else {
  2244.             replyMSG.append("<font color=FF6666>Стоимость:<br1> " + ds.price + " Coin Of Luck</font><br>");
  2245.             replyMSG.append("<font color=999999>[Купить]</font>");
  2246.         }
  2247.         replyMSG.append("<br><font color=CC33CC>*Через " + ds.days + " часов шмотка сломается!<br1>Отсчет начинается при надевании шмотки.<br1>Просто так валяясь в инвентаре ничего не сломается.<br1>Made in China.</font><br></body></html>");
  2248.         reply.setHtml(replyMSG.toString());
  2249.         player.sendPacket(reply);
  2250.     }
  2251.  
  2252.     private void bueChina(L2PcInstance player, int itemId) {
  2253.         L2Item china = ItemTable.getInstance().getTemplate(itemId);
  2254.         if (china == null) {
  2255.             showError(player, "Ошибка запроса.");
  2256.             return;
  2257.         }
  2258.  
  2259.         ChinaItem ds = CustomServerData.getInstance().getChinaItem(itemId);
  2260.         if (ds == null) {
  2261.             showError(player, "Ошибка запроса.");
  2262.             return;
  2263.         }
  2264.  
  2265.         L2ItemInstance coins = player.getInventory().getItemByItemId(ds.coin);
  2266.         if (coins == null || coins.getCount() < ds.price) {
  2267.             showError(player, "Ошибка запроса.");
  2268.             return;
  2269.         }
  2270.         player.destroyItemByItemId("China", ds.coin, ds.price, player, true);
  2271.  
  2272.         L2ItemInstance item = ItemTable.getInstance().createItem("China", itemId, 1, player, null);
  2273.         item.setMana((int) TimeUnit.HOURS.toMinutes(ds.days));
  2274.         player.getInventory().addItem("Enchantt", item, player, null);
  2275.  
  2276.         player.sendPacket(SystemMessage.id(SystemMessageId.EARNED_ITEM).addItemName(item.getItemId()));
  2277.         player.sendItems(true);
  2278.         player.sendChanges();
  2279.         player.broadcastUserInfo();
  2280.     }
  2281.  
  2282.     /**
  2283.      * SOB
  2284.      *
  2285.      */
  2286.     private void bueSOB(L2PcInstance player, int period) {
  2287.         int price = 99999;
  2288.         switch (period) {
  2289.             case 1:
  2290.                 price = SOB_PRICE_ONE;
  2291.                 break;
  2292.             case 2:
  2293.                 price = SOB_PRICE_TWO;
  2294.                 break;
  2295.         }
  2296.  
  2297.         L2ItemInstance coins = player.getInventory().getItemByItemId(SOB_COIN);
  2298.         if (coins == null || coins.getCount() < price) {
  2299.             showError(player, "Не достаточно " + SOB_COIN_NAME + ".");
  2300.             return;
  2301.         }
  2302.  
  2303.         int skillId = Config.SOB_ID;
  2304.         if (skillId == 0 || player.getClassId().getId() < 88) {
  2305.             showError(player, "Только для 3й профы.");
  2306.             return;
  2307.         }
  2308.  
  2309.         if (skillId == 1) {
  2310.             switch (player.getClassId().getId()) {
  2311.                 case 88:
  2312.                 case 89:
  2313.                 case 92:
  2314.                 case 93:
  2315.                 case 101:
  2316.                 case 102:
  2317.                 case 113:
  2318.                 case 114:
  2319.                 case 108:
  2320.                 case 109:
  2321.                     skillId = 7077; // файтер
  2322.                     break;
  2323.                 case 94:
  2324.                 case 95:
  2325.                 case 103:
  2326.                 case 110:
  2327.                     skillId = 7078; // маг
  2328.                     break;
  2329.                 case 96:
  2330.                 case 97:
  2331.                 case 98:
  2332.                 case 104:
  2333.                 case 105:
  2334.                 case 100:
  2335.                 case 107:
  2336.                 case 111:
  2337.                 case 112:
  2338.                 case 115:
  2339.                 case 116:
  2340.                     skillId = 7079; // суппорт
  2341.                     break;
  2342.                 case 90:
  2343.                 case 91:
  2344.                 case 99:
  2345.                 case 106:
  2346.                 case 117:
  2347.                 case 118:
  2348.                     skillId = 7080; // танк
  2349.                     break;
  2350.             }
  2351.         }
  2352.  
  2353.         if (player.getKnownSkill(skillId) != null) {
  2354.             showError(player, "У вас уже есть Skill OF Balance.");
  2355.             return;
  2356.         }
  2357.  
  2358.         player.destroyItemByItemId("SOB", SOB_COIN, price, player, true);
  2359.  
  2360.         /*player.addSkill(SkillTable.getInstance().getInfo(Config.SOB_ID, period), false);
  2361.          if (period == 2 && Config.SOB_NPC > 0)
  2362.          player.addCubic(Config.SOB_NPC, 80);
  2363.        
  2364.          player.sendSkillList();
  2365.          player.sendChanges();
  2366.          player.broadcastUserInfo();*/
  2367.         Log.addDonate(player, "SoB [" + period + "]", price);
  2368.  
  2369.         long expire = TimeUnit.DAYS.toMillis(15); //(14 * 24 * 60 * 60000);//TimeUnit.DAYS.toMillis(14);
  2370.         if (period == 2) {
  2371.             expire *= 2;
  2372.         }
  2373.  
  2374.         player.addDonateSkill(player.getClassId().getId(), skillId, period, (System.currentTimeMillis() + expire));
  2375.         /*Connect con = null;
  2376.          PreparedStatement statement = null;
  2377.          try
  2378.          {
  2379.          con = L2DatabaseFactory.get();
  2380.          statement = con.prepareStatement("REPLACE INTO `z_balance_skill` (`char_id`,`class_id`,`skill_id`,`lvl`,`expire`) VALUES (?,?,?,?,?)");
  2381.          statement.setInt(1, player.getObjectId());
  2382.          statement.setInt(2, player.getClassId().getId());
  2383.          statement.setInt(3, skillId);
  2384.          statement.setInt(4, period);
  2385.          statement.setLong(5, System.currentTimeMillis() + expire);
  2386.          statement.execute();
  2387.          }
  2388.          catch(final Exception e)
  2389.          {
  2390.          _log.warning("Donate: Log.addDonate() error: " + e);
  2391.          }
  2392.          finally
  2393.          {
  2394.          Close.CS(con, statement);
  2395.          }*/
  2396.         player.sendMessage("Куплен Skill Of Balance, перезайдите!");
  2397.     }
  2398.  
  2399.     /**
  2400.      * Донейт шоп
  2401.      *
  2402.      */
  2403.     private void donateShop(L2PcInstance player) {
  2404.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  2405.         TextBuilder htm = new TextBuilder();
  2406.         htm.append("<html><body><table width=260><tr><td><font color=LEVEL>Уникальный магазин:</font></td></tr></table><br>");
  2407.         htm.append("<table width=260><tr><td></td><td></td></tr>");
  2408.  
  2409.         L2Item item = null;
  2410.         String count = "";
  2411.         DonateItem di = null;
  2412.         ItemTable it = ItemTable.getInstance();
  2413.         FastTable<DonateItem> donShop = CustomServerData.getInstance().getDonateShop();
  2414.         for (int i = 0, n = donShop.size(); i < n; i++) {
  2415.             di = donShop.get(i);
  2416.             if (di == null) {
  2417.                 continue;
  2418.             }
  2419.  
  2420.             item = it.getTemplate(di.itemId);
  2421.             if (item == null) {
  2422.                 continue;
  2423.             }
  2424.  
  2425.             if (di.itemCount > 1) {
  2426.                 count = "(" + di.itemCount + ")";
  2427.             }
  2428.  
  2429.             htm.append("<tr><td><img src=" + item.getIcon() + " width=32 height=32></td><td><a action=\"bypass -h npc_" + getObjectId() + "_dShopShow " + i + "\"><font color=99FF66>" + item.getName() + "" + count + "</font></a><br1><font color=336633>Стоимость: " + di.priceCount + " " + di.priceName + "</font></td></tr>");
  2430.             htm.append("<tr><td><br></td><td></td></tr>");
  2431.             count = "";
  2432.         }
  2433.         htm.append("</table><br><br>");
  2434.         htm.append("<img src=\"L2UI_CH3.herotower_deco\" width=256 height=32></body></html>");
  2435.         reply.setHtml(htm.toString());
  2436.         player.sendPacket(reply);
  2437.     }
  2438.  
  2439.     private void donateShopShow(L2PcInstance player, int saleId) {
  2440.         DonateItem di = CustomServerData.getInstance().getDonateItem(saleId);
  2441.         if (di == null) {
  2442.             showError(player, "Ошибка запроса.");
  2443.             return;
  2444.         }
  2445.  
  2446.         L2Item item = ItemTable.getInstance().getTemplate(di.itemId);
  2447.         if (item == null) {
  2448.             showError(player, "Ошибка запроса.");
  2449.             return;
  2450.         }
  2451.  
  2452.         String count = "";
  2453.         if (di.itemCount > 1) {
  2454.             count = "(" + di.itemCount + ")";
  2455.         }
  2456.  
  2457.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  2458.         TextBuilder htm = new TextBuilder();
  2459.  
  2460.         htm.append("<html><body><font color=LEVEL>Уникальный магазин:<br>Просмотр товара:</font><br1>");
  2461.         htm.append("<table width=250><tr><td align=right><img src=" + item.getIcon() + " width=32 height=32></td><td><font color=33FFFF>" + item.getName() + "" + count + "</font></td></tr></table><br><br>");
  2462.         htm.append("<font color=336699>Дополнительная информация:</font><br1><font color=3399CC>" + di.itemInfoRu + "</font><br>");
  2463.         htm.append("<font color=336699>Описание:</font><br1>");
  2464.         htm.append("<font color=3399CC>" + di.itemInfoDesc + "</font><br>");
  2465.         htm.append("<font color=336699>Стоимость:</font><br1>");
  2466.         htm.append("<font color=3399CC>" + di.priceCount + " " + di.priceName + "</font><br><br>");
  2467.  
  2468.         L2ItemInstance coins = player.getInventory().getItemByItemId(di.priceId);
  2469.         if (coins == null || coins.getCount() < di.priceCount) {
  2470.             htm.append("<font color=666699>[Купить]</font><br><br>");
  2471.         } else {
  2472.             htm.append("<button value=\"Купить\" action=\"bypass -h npc_" + getObjectId() + "_dShopBue " + saleId + "\" width=45 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\" msg=\"Покупаем " + item.getName() + "" + count + " за " + di.priceCount + " " + di.priceName + "?\"><br><br>");
  2473.         }
  2474.  
  2475.         htm.append("<a action=\"bypass -h npc_" + getObjectId() + "_donateShop\">Вернуться.</a></body></html>");
  2476.         reply.setHtml(htm.toString());
  2477.         player.sendPacket(reply);
  2478.     }
  2479.  
  2480.     private void donateShopBue(L2PcInstance player, int saleId) {
  2481.         DonateItem di = CustomServerData.getInstance().getDonateItem(saleId);
  2482.         if (di == null) {
  2483.             showError(player, "Ошибка запроса.");
  2484.             return;
  2485.         }
  2486.  
  2487.         L2Item item = ItemTable.getInstance().getTemplate(di.itemId);
  2488.         if (item == null) {
  2489.             showError(player, "Ошибка запроса.");
  2490.             return;
  2491.         }
  2492.  
  2493.         L2ItemInstance coins = player.getInventory().getItemByItemId(di.priceId);
  2494.         if (coins == null || coins.getCount() < di.priceCount) {
  2495.             showError(player, "Ошибка запроса.");
  2496.             return;
  2497.         }
  2498.         player.destroyItemByItemId("Donate Shop", di.priceId, di.priceCount, player, true);
  2499.         String count = "";
  2500.         if (di.itemCount > 1) {
  2501.             count = "(" + di.itemCount + ")";
  2502.         }
  2503.         Log.addDonate(player, "Donate Shop: " + item.getName() + "" + count + "", di.priceCount);
  2504.  
  2505.         player.addItem("DonateShop", di.itemId, di.itemCount, player, true);
  2506.         /*L2ItemInstance newItem = ItemTable.getInstance().createItem("Donate Shop", di.itemId, di.itemCount, player, null);
  2507.          player.getInventory().addItem("Donate Shop", newItem, player, null);
  2508.        
  2509.          SystemMessage smsg = SystemMessage.id(SystemMessageId.EARNED_ITEM);
  2510.          smsg.addItemName(newItem.getItemId());
  2511.          player.sendPacket(smsg);*/
  2512.  
  2513.         //player.sendItems(true);
  2514.         //player.sendChanges();
  2515.         //player.broadcastUserInfo();
  2516.     }
  2517.  
  2518.     /**
  2519.      * *
  2520.      * Продажа скиллов data/donate_skills.xml
  2521.      *
  2522.      */
  2523.     private void donateSkillShop(L2PcInstance player) {
  2524.         int store = -1;
  2525.         if (Config.DS_ALL_SUBS) {
  2526.             store = 0;
  2527.         } else {
  2528.             store = player.getClassId().getId();
  2529.         }
  2530.  
  2531.         if (_donateSkills.get(store) == null) {
  2532.             showError(player, "Для вашего класса нет доступных скиллов.");
  2533.             return;
  2534.         }
  2535.  
  2536.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  2537.         TextBuilder htm = new TextBuilder();
  2538.         htm.append("<html><body><table width=260><tr><td><font color=LEVEL>Уникальный магазин скиллов:</font></td></tr></table><br>");
  2539.         htm.append("<table width=260><tr><td></td><td></td></tr>");
  2540.  
  2541.         DonateSkill di = null;
  2542.         SkillTable st = SkillTable.getInstance();
  2543.         for (FastMap.Entry<Integer, FastTable<DonateSkill>> e = _donateSkills.head(), end = _donateSkills.tail(); (e = e.getNext()) != end;) {
  2544.             Integer classId = e.getKey(); // No typecast necessary.
  2545.             FastTable<DonateSkill> skills = e.getValue(); // No typecast necessary.
  2546.             if (classId == null || skills == null) {
  2547.                 continue;
  2548.             }
  2549.  
  2550.             if (skills.isEmpty()) {
  2551.                 continue;
  2552.             }
  2553.  
  2554.             for (int i = 0, n = skills.size(); i < n; i++) {
  2555.                 di = skills.get(i);
  2556.                 if (di == null) {
  2557.                     continue;
  2558.                 }
  2559.  
  2560.                 L2Skill skill = st.getInfo(di.id, di.lvl);
  2561.                 if (skill == null) {
  2562.                     continue;
  2563.                 }
  2564.  
  2565.                 if (player.getKnownSkill(di.id) != null
  2566.                         && player.getKnownSkill(di.id).getLevel() >= di.lvl) {
  2567.                     continue;
  2568.                 }
  2569.  
  2570.                 htm.append("<tr><td><img src=" + di.icon + " width=32 height=32></td><td><a action=\"bypass -h npc_" + getObjectId() + "_dsShopShow " + i + "\"><font color=99FF66>" + skill.getName() + " (" + di.lvl + " ур.)</font></a><br1><font color=336633>Стоимость: " + di.priceCount + " " + di.priceName + "</font></td></tr>");
  2571.                 htm.append("<tr><td><br></td><td></td></tr>");
  2572.             }
  2573.         }
  2574.  
  2575.         htm.append("</table><br><br>");
  2576.         htm.append("<img src=\"L2UI_CH3.herotower_deco\" width=256 height=32></body></html>");
  2577.         reply.setHtml(htm.toString());
  2578.         player.sendPacket(reply);
  2579.     }
  2580.  
  2581.     private void donateSkillShopShow(L2PcInstance player, int saleId) {
  2582.         int store = -1;
  2583.         if (Config.DS_ALL_SUBS) {
  2584.             store = 0;
  2585.         } else {
  2586.             store = player.getClassId().getId();
  2587.         }
  2588.  
  2589.         if (_donateSkills.get(store) == null) {
  2590.             showError(player, "Для вашего класса нет доступных скиллов.");
  2591.             return;
  2592.         }
  2593.  
  2594.         DonateSkill di = _donateSkills.get(store).get(saleId);
  2595.         if (di == null) {
  2596.             showError(player, "Ошибка запроса.");
  2597.             return;
  2598.         }
  2599.  
  2600.         L2Skill skill = SkillTable.getInstance().getInfo(di.id, di.lvl);
  2601.         if (skill == null) {
  2602.             showError(player, "Ошибка запроса.");
  2603.             return;
  2604.         }
  2605.  
  2606.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  2607.         TextBuilder htm = new TextBuilder();
  2608.  
  2609.         htm.append("<html><body><font color=LEVEL>Уникальный магазин скиллов:<br>Просмотр скилла:</font><br1>");
  2610.         htm.append("<table width=250><tr><td align=right><img src=" + di.icon + " width=32 height=32></td><td><font color=33FFFF>" + skill.getName() + " (" + di.lvl + " ур.)</font></td></tr></table><br><br>");
  2611.         htm.append("<font color=336699>Описание:</font><br1>");
  2612.         htm.append("<font color=3399CC>" + di.info + "</font><br>");
  2613.  
  2614.         htm.append("<font color=336699>Длительность:</font><br1>");
  2615.         if (di.expire < 0) {
  2616.             htm.append("<font color=3399CC>Бесконечный.</font><br>");
  2617.         } else if (di.expire == 0) {
  2618.             htm.append("<font color=3399CC>До конца месяца.</font><br>");
  2619.         } else {
  2620.             htm.append("<font color=3399CC>" + di.expire + " дней.</font><br>");
  2621.         }
  2622.  
  2623.         htm.append("<font color=336699>Стоимость:</font><br1>");
  2624.         htm.append("<font color=3399CC>" + di.priceCount + " " + di.priceName + "</font><br><br>");
  2625.  
  2626.         L2ItemInstance coins = player.getInventory().getItemByItemId(di.priceId);
  2627.         if (coins == null || coins.getCount() < di.priceCount) {
  2628.             htm.append("<font color=666699>[Купить]</font><br><br>");
  2629.         } else {
  2630.             htm.append("<button value=\"Купить\" action=\"bypass -h npc_" + getObjectId() + "_dsShopBue " + saleId + "\" width=45 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\" msg=\"Покупаем " + skill.getName() + " (" + di.lvl + " ур.) за " + di.priceCount + " " + di.priceName + "?\"><br><br>");
  2631.         }
  2632.  
  2633.         htm.append("<a action=\"bypass -h npc_" + getObjectId() + "_donateSkillsShop\">Вернуться.</a></body></html>");
  2634.         reply.setHtml(htm.toString());
  2635.         player.sendPacket(reply);
  2636.     }
  2637.  
  2638.     private void donateSkillShopBue(L2PcInstance player, int saleId) {
  2639.         int store = -1;
  2640.         if (Config.DS_ALL_SUBS) {
  2641.             store = 0;
  2642.         } else {
  2643.             store = player.getClassId().getId();
  2644.         }
  2645.         if (_donateSkills.get(store) == null) {
  2646.             showError(player, "Для вашего класса нет доступных скиллов.");
  2647.             return;
  2648.         }
  2649.  
  2650.         DonateSkill di = _donateSkills.get(store).get(saleId);
  2651.         if (di == null) {
  2652.             showError(player, "Ошибка запроса.");
  2653.             return;
  2654.         }
  2655.  
  2656.         L2Skill skill = SkillTable.getInstance().getInfo(di.id, di.lvl);
  2657.         if (skill == null) {
  2658.             showError(player, "Ошибка запроса.");
  2659.             return;
  2660.         }
  2661.  
  2662.         L2ItemInstance coins = player.getInventory().getItemByItemId(di.priceId);
  2663.         if (coins == null || coins.getCount() < di.priceCount) {
  2664.             showError(player, "Ошибка запроса.");
  2665.             return;
  2666.         }
  2667.         player.destroyItemByItemId("Donate Skill Shop", di.priceId, di.priceCount, player, true);
  2668.         Log.addDonate(player, "Donate Skill Shop: " + skill.getName() + "(" + di.lvl + " lvl)", di.priceCount);
  2669.  
  2670.         long expire = 0;
  2671.         if (di.expire < 0) {
  2672.             expire = -1;
  2673.         } else if (di.expire == 0) {
  2674.             Calendar calendar = Calendar.getInstance();
  2675.             int lastDate = calendar.getActualMaximum(Calendar.DATE);
  2676.             calendar.set(Calendar.DATE, lastDate);
  2677.             //int lastDay = calendar.get(Calendar.DAY_OF_WEEK);
  2678.             expire = calendar.getTimeInMillis();
  2679.         } else {
  2680.             expire = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(di.expire); //(14 * 24 * 60 * 60000);//TimeUnit.DAYS.toMillis(14);
  2681.         }
  2682.         player.addSkill(skill, false);
  2683.         player.addDonateSkill(store, di.id, di.lvl, expire);
  2684.         player.sendHtmlMessage("Уникальный магазин скиллов:", "Вы приобрели скилл: <br> <font color=33FFFF>" + skill.getName() + " (" + di.lvl + " ур.)</font>");
  2685.     }
  2686.  
  2687.     /*
  2688.      Премиум
  2689.      */
  2690.     private void addPremium(L2PcInstance player, int days) {
  2691.         if (player.isPremium()) { //license
  2692.             //showError(player, "Вы уже премиум."); // CeT
  2693.             //showError(player, "Вы уже премиум!"); //  joe`jo
  2694.             //showError(player, "Вы уже премиум!!"); //  mat
  2695.             //showError(player, "Вы уже премиум!!!"); //  djimbo
  2696.             //showError(player, "Вы и так премиум!"); //  CruSade
  2697.             //showError(player, "Вы и так премиум!!"); //  BooGiMaN
  2698.             //showError(player, "Вы и так премиум!!!"); //  Gektor
  2699.             //showError(player, "Вы и так премиум!!!!"); //  b13
  2700.             //showError(player, "Премиум уже куплен!"); //  mcwa
  2701.             //showError(player, "Премиум уже куплен!!"); //  f1recat
  2702.             //showError(player, "Премиум уже куплен!!!"); //  TruOverLike
  2703.             showError(player, "Премиум уже куплен!!!!"); //  DOty
  2704.             return;
  2705.         }
  2706.  
  2707.         if (days <= 0) {
  2708.             return;
  2709.         }
  2710.         Integer price = PREMIUM_DAY_PRICES.get(days);
  2711.         if (price == null) {
  2712.             price = Config.PREMIUM_PRICE * days;
  2713.         }
  2714.  
  2715.         L2ItemInstance coins = player.getInventory().getItemByItemId(Config.PREMIUM_COIN);
  2716.         if (coins == null || coins.getCount() < price) {
  2717.             showError(player, "Стоимость премиум " + price + " " + Config.PREMIUM_COINNAME + ".");
  2718.             return;
  2719.         }
  2720.         player.destroyItemByItemId("Donate Shop", Config.PREMIUM_COIN, price, player, true);
  2721.  
  2722.         player.storePremium(days);
  2723.         Log.addDonate(player, "Premium, " + days + " days.", Config.PREMIUM_PRICE);
  2724.     }
  2725.  
  2726.     private void addNoble(L2PcInstance player) {
  2727.         if (player.isNoble()) { //license
  2728.             //showError(player, "Вы уже ноблесс."); // CeT
  2729.             //showError(player, "Вы уже ноблесс!"); //  joe`jo
  2730.             //showError(player, "Вы уже ноблесс!!"); //  mat
  2731.             //showError(player, "Вы уже ноблесс!!!"); //  djimbo
  2732.             //showError(player, "Вы и так ноблесс!"); //  CruSade
  2733.             //showError(player, "Вы и так ноблесс!!"); //  BooGiMaN
  2734.             //showError(player, "Вы и так ноблесс!!!"); //  Gektor
  2735.             //showError(player, "Вы и так ноблесс!!!!"); //  b13
  2736.             //showError(player, "Ноблесс уже куплен!"); //  mcwa
  2737.             //showError(player, "Ноблесс уже куплен!!"); //  f1recat
  2738.             //showError(player, "Ноблесс уже куплен!!!"); //  TruOverLike
  2739.             showError(player, "Ноблесс уже куплен!!!!"); //  DOty
  2740.             return;
  2741.         }
  2742.  
  2743.         L2ItemInstance coins = player.getInventory().getItemByItemId(Config.SNOBLE_COIN);
  2744.         if (coins == null || coins.getCount() < Config.SNOBLE_PRICE) {
  2745.             showError(player, "Стоимость ноблесса " + Config.SNOBLE_PRICE + " " + Config.SNOBLE_COIN_NAME + ".");
  2746.             return;
  2747.         }
  2748.         player.destroyItemByItemId("Donate Shop", Config.SNOBLE_COIN, Config.SNOBLE_PRICE, player, true);
  2749.  
  2750.         player.setNoble(true);
  2751.         player.addItem("rewardNoble", 7694, 1, this, true);
  2752.         player.sendUserPacket(new PlaySound("ItemSound.quest_finish"));
  2753.  
  2754.         if (!Config.ACADEMY_CLASSIC) {
  2755.             player.rewardAcademy(0);
  2756.         }
  2757.         Log.addDonate(player, "Noblesse.", Config.SNOBLE_PRICE);
  2758.     }
  2759.  
  2760.     private void uniqSkillShopBue(L2PcInstance player, int id) {
  2761.         Integer level = Config.UNIQ_SKILLS.get(id);
  2762.         if (level == null) {
  2763.             showError(player, "Данный скилл нельзя получить.");
  2764.             return;
  2765.         }
  2766.  
  2767.         if (player.getLevel() < level) {
  2768.             showError(player, "Данный скилл доступен на " + level + " уровне.");
  2769.             return;
  2770.         }
  2771.  
  2772.         for (int lid : Config.UNIQ_SKILLS.keySet()) {
  2773.             if (player.getKnownSkill(lid) != null) {
  2774.                 showError(player, "Вы уже выучили уникальный скилл; попробуйте на саб-класс.");
  2775.                 return;
  2776.             }
  2777.         }
  2778.  
  2779.         L2Skill skill = SkillTable.getInstance().getInfo(id, 1);
  2780.         if (skill == null) {
  2781.             showError(player, "Данный скилл отсутствует.");
  2782.             return;
  2783.         }
  2784.  
  2785.         player.addSkill(skill, true);
  2786.         player.sendHtmlMessage("Опа", "Вы изучили скилл: <br> <font color=33FFFF>" + skill.getName() + "</font>");
  2787.     }
  2788.  
  2789.     /**
  2790.      * *
  2791.      ** Статистика *
  2792.      */
  2793.     private void statHome(L2PcInstance player) {
  2794.         TextBuilder htm = new TextBuilder();
  2795.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  2796.  
  2797.         htm.append("<html><body><center><br><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br1>");
  2798.         htm.append("<table width=290> <tr><td><font color=0099CC>Лидеры сервера</font></td>");
  2799.         htm.append("<td><font color=993366><a action=\"bypass -h npc_" + getObjectId() + "_statPvp 1\">Top PvP</a></font></td>");
  2800.         htm.append("<td><font color=993366><a action=\"bypass -h npc_" + getObjectId() + "_statPk 1\">Top Pk</a></font></td>");
  2801.         htm.append("<td><font color=993366><a action=\"bypass -h npc_" + getObjectId() + "_statClans 1\">Кланы</a></font></td>");
  2802.         htm.append("<td><font color=993366><a action=\"bypass -h npc_" + getObjectId() + "_statCastles\">Замки</a></font></td>");
  2803.         htm.append("</tr></table><br><img src=\"sek.cbui175\" width=150 height=3><br><table width=310><tr>");
  2804.         htm.append("<td align=center><font color=0099CC>Top 10 PvP</font></td><td align=center><font color=0099CC>Top 10 Pk</font></td>");
  2805.         htm.append("</tr><tr><td valign=top>");
  2806.         htm.append(CustomServerData.getInstance().getStatHome());
  2807.         htm.append("</td></tr></table><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32></center><a action=\"bypass -h npc_%objectId%_Chat 0\"><font color=666633>Назад</font></a></body></html>");
  2808.  
  2809.         reply.setHtml(htm.toString());
  2810.         player.sendPacket(reply);
  2811.  
  2812.         htm.clear();
  2813.         htm = null;
  2814.     }
  2815.  
  2816.     private void statShowPvp(L2PcInstance player, int page) {
  2817.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  2818.         TextBuilder htm = new TextBuilder();
  2819.  
  2820.         htm.append("<html><body><center><br><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br1>");
  2821.         htm.append("<table width=290> <tr><td><font color=993366><a action=\"bypass -h npc_" + getObjectId() + "_statHome\">Лидеры сервера</a></font></td>");
  2822.         htm.append("<td><font color=0099CC>Top Pvp</font></td>");
  2823.         htm.append("<td><font color=993366><a action=\"bypass -h npc_" + getObjectId() + "_statPk 1\">Top Pk</a></font></td>");
  2824.         htm.append("<td><font color=993366><a action=\"bypass -h npc_" + getObjectId() + "_statClans 1\">Кланы</a></font></td>");
  2825.         htm.append("<td><font color=993366><a action=\"bypass -h npc_" + getObjectId() + "_statCastles\">Замки</a></font></td>");
  2826.         htm.append("</tr></table><br><img src=\"sek.cbui175\" width=150 height=3><br>");
  2827.         htm.append("<font color=999966><table width=310><tr><td>#</td><td>Ник</td><td>Клан</td><td>Онлайн</td><td>Pvp</td></tr>");
  2828.  
  2829.         FastTable<StatPlayer> pvp = CustomServerData.getInstance().getStatPvp();
  2830.         L2World world = L2World.getInstance();
  2831.  
  2832.         int count = 0;
  2833.         String online = "<font color=006600>Online</font>";
  2834.         int start = (page - 1) * _statLimit;
  2835.         int stop = start + _statLimit;
  2836.         if (stop > pvp.size()) {
  2837.             stop = pvp.size() - 1;
  2838.         }
  2839.         int pages = (pvp.size() / _statLimit) + 1;
  2840.         for (int i = start, n = stop; i < n; i++) {
  2841.             StatPlayer pc = pvp.get(i);;
  2842.             if (pc == null) {
  2843.                 continue;
  2844.             }
  2845.  
  2846.             if (world.getPlayer(pc.id) == null) {
  2847.                 online = "<font color=330033>Offline</font>";
  2848.             }
  2849.  
  2850.             htm.append("<tr><td>" + (i + 1) + "</td><td><font color=CCCC33>" + pc.name + "</td><td>" + pc.clan + "</font></td><td><font color=006600>" + online + "</font></td><td><font color=CCCC33>" + pc.kills + "</font></td></tr>");
  2851.             count++;
  2852.         }
  2853.  
  2854.         htm.append("</table></font>");
  2855.         if (pages > 2) {
  2856.             htm.append(sortPvp(page, pages));
  2857.         }
  2858.  
  2859.         htm.append("</center></body></html>");
  2860.  
  2861.         reply.setHtml(htm.toString());
  2862.         player.sendPacket(reply);
  2863.         htm.clear();
  2864.         htm = null;
  2865.     }
  2866.  
  2867.     private String sortPvp(int page, int pages) {
  2868.         TextBuilder text = new TextBuilder("<br>Страницы:<br1><table width=300><tr>");
  2869.         int step = 1;
  2870.         int s = page - 3;
  2871.         int f = page + 3;
  2872.         if (page < _statSortLimit && s < _statSortLimit) {
  2873.             s = 1;
  2874.         }
  2875.         if (page >= _statSortLimit) {
  2876.             text.append("<td><a action=\"bypass -h npc_" + getObjectId() + "_statPvp " + s + "\"> ... </a></td>");
  2877.         }
  2878.  
  2879.         for (int i = s; i < (pages + 1); i++) {
  2880.             int al = i + 1;
  2881.             if (i == page) {
  2882.                 text.append("<td>" + i + "</td>");
  2883.             } else {
  2884.                 if (al <= pages) {
  2885.                     text.append("<td><a action=\"bypass -h npc_" + getObjectId() + "_statPvp " + i + "\">" + i + "</a></td>");
  2886.                 }
  2887.             }
  2888.             if (step == _statSortLimit && f < pages) {
  2889.                 if (al < pages) {
  2890.                     text.append("<td><a action=\"bypass -h npc_" + getObjectId() + "_statPvp " + al + "\"> ... </a></td>");
  2891.                 }
  2892.                 break;
  2893.             }
  2894.             step++;
  2895.         }
  2896.         text.append("</tr></table><br>");
  2897.         String htmltext = text.toString();
  2898.         text.clear();
  2899.         text = null;
  2900.         return htmltext;
  2901.     }
  2902.     private static int _statLimit = 11;
  2903.     private static int _statSortLimit = 9;
  2904.  
  2905.     private void statShowPk(L2PcInstance player, int page) {
  2906.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  2907.         TextBuilder htm = new TextBuilder();
  2908.  
  2909.         htm.append("<html><body><center><br><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br1>");
  2910.         htm.append("<table width=290> <tr><td><font color=993366><a action=\"bypass -h npc_" + getObjectId() + "_statHome\">Лидеры сервера</a></font></td>");
  2911.         htm.append("<td><font color=993366><a action=\"bypass -h npc_" + getObjectId() + "_statPvp 1\">Top Pvp</a></font></td>");
  2912.         htm.append("<td><font color=0099CC>Top Pk</font></td>");
  2913.         htm.append("<td><font color=993366><a action=\"bypass -h npc_" + getObjectId() + "_statClans 1\">Кланы</a></font></td>");
  2914.         htm.append("<td><font color=993366><a action=\"bypass -h npc_" + getObjectId() + "_statCastles\">Замки</a></font></td>");
  2915.         htm.append("</tr></table><br><img src=\"sek.cbui175\" width=150 height=3><br>");
  2916.         htm.append("<font color=999966><table width=310><tr><td>#</td><td>Ник</td><td>Клан</td><td>Онлайн</td><td>Pvp</td></tr>");
  2917.  
  2918.         FastTable<StatPlayer> pk = CustomServerData.getInstance().getStatPk();
  2919.         L2World world = L2World.getInstance();
  2920.  
  2921.         int count = 0;
  2922.         String online = "<font color=006600>Online</font>";
  2923.         int start = (page - 1) * _statLimit;
  2924.         int stop = start + _statLimit;
  2925.         if (stop > pk.size()) {
  2926.             stop = pk.size() - 1;
  2927.         }
  2928.         int pages = (pk.size() / _statLimit) + 1;
  2929.         for (int i = start, n = stop; i < n; i++) {
  2930.             StatPlayer pc = pk.get(i);
  2931.             if (pc == null) {
  2932.                 continue;
  2933.             }
  2934.  
  2935.             if (world.getPlayer(pc.id) == null) {
  2936.                 online = "<font color=330033>Offline</font>";
  2937.             }
  2938.  
  2939.             htm.append("<tr><td>" + (i + 1) + "</td><td><font color=CCCC33>" + pc.name + "</td><td>" + pc.clan + "</font></td><td><font color=006600>" + online + "</font></td><td><font color=CCCC33>" + pc.kills + "</font></td></tr>");
  2940.             count++;
  2941.         }
  2942.  
  2943.         htm.append("</table></font>");
  2944.         if (pages > 2) {
  2945.             htm.append(sortPk(page, pages));
  2946.         }
  2947.  
  2948.         htm.append("</body></html>");
  2949.  
  2950.         reply.setHtml(htm.toString());
  2951.         player.sendPacket(reply);
  2952.         htm.clear();
  2953.         htm = null;
  2954.     }
  2955.  
  2956.     private String sortPk(int page, int pages) {
  2957.         TextBuilder text = new TextBuilder("<br>Страницы:<br1><table width=300><tr>");
  2958.         int step = 1;
  2959.         int s = page - 3;
  2960.         int f = page + 3;
  2961.         if (page < _statSortLimit && s < _statSortLimit) {
  2962.             s = 1;
  2963.         }
  2964.         if (page >= _statSortLimit) {
  2965.             text.append("<td><a action=\"bypass -h npc_" + getObjectId() + "_statPk " + s + "\"> ... </a></td>");
  2966.         }
  2967.  
  2968.         for (int i = s; i < (pages + 1); i++) {
  2969.             int al = i + 1;
  2970.             if (i == page) {
  2971.                 text.append("<td>" + i + "</td>");
  2972.             } else {
  2973.                 if (al <= pages) {
  2974.                     text.append("<td><a action=\"bypass -h npc_" + getObjectId() + "_statPk " + i + "\">" + i + "</a></td>");
  2975.                 }
  2976.             }
  2977.             if (step == _statSortLimit && f < pages) {
  2978.                 if (al < pages) {
  2979.                     text.append("<td><a action=\"bypass -h npc_" + getObjectId() + "_statPk " + al + "\"> ... </a></td>");
  2980.                 }
  2981.                 break;
  2982.             }
  2983.             step++;
  2984.         }
  2985.         text.append("</tr></table><br>");
  2986.         String htmltext = text.toString();
  2987.         text.clear();
  2988.         text = null;
  2989.         return htmltext;
  2990.     }
  2991.  
  2992.     private void statClans(L2PcInstance player, int page) {
  2993.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  2994.         TextBuilder htm = new TextBuilder();
  2995.  
  2996.         htm.append("<html><body><center><br><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br1>");
  2997.         htm.append("<table width=290> <tr><td><font color=993366><a action=\"bypass -h npc_" + getObjectId() + "_statHome\">Лидеры сервера</a></font></td>");
  2998.         htm.append("<td><font color=993366><a action=\"bypass -h npc_" + getObjectId() + "_statPvp 1\">Top Pvp</a></font></td>");
  2999.         htm.append("<td><font color=993366><a action=\"bypass -h npc_" + getObjectId() + "_statPk 1\">Top Pk</a></font></td>");
  3000.         htm.append("<td><font color=0099CC>Кланы</font></td>");
  3001.         htm.append("<td><font color=993366><a action=\"bypass -h npc_" + getObjectId() + "_statCastles\">Замки</a></font></td>");
  3002.         htm.append("</tr></table><br><img src=\"sek.cbui175\" width=150 height=3><br>");
  3003.         htm.append("<font color=999966><table width=310><tr><td>#</td><td>Название</td><td>Ур.</td><td>Лидер</td><td>Очки</td><td>Людей</td></tr>");
  3004.  
  3005.         FastTable<StatClan> clans = CustomServerData.getInstance().getStatClans();
  3006.  
  3007.         int count = 0;
  3008.         int start = (page - 1) * _statLimit;
  3009.         int stop = start + _statLimit;
  3010.         if (stop > clans.size()) {
  3011.             stop = clans.size() - 1;
  3012.         }
  3013.         int pages = (clans.size() / _statLimit) + 1;
  3014.         for (int i = start, n = stop; i < n; i++) {
  3015.             StatClan clan = clans.get(i);
  3016.             if (clan == null) {
  3017.                 continue;
  3018.             }
  3019.  
  3020.             htm.append("<tr><td>" + (i + 1) + "</td><td><font color=CCCC33>" + clan.name + "</td><td>" + clan.level + "</td><td>" + clan.owner + "</td><td>" + clan.rep + "</td><td>" + clan.count + "</td></tr>");
  3021.             count++;
  3022.         }
  3023.  
  3024.         htm.append("</table></font>");
  3025.         if (pages > 2) {
  3026.             htm.append(sortClans(page, pages));
  3027.         }
  3028.  
  3029.         htm.append("<img src=\"L2UI_CH3.herotower_deco\" width=256 height=32></center><a action=\"bypass -h npc_" + getObjectId() + "_Chat 0\"><font color=666633>Назад</font></a></body></html>");
  3030.  
  3031.         reply.setHtml(htm.toString());
  3032.         player.sendPacket(reply);
  3033.         htm.clear();
  3034.         htm = null;
  3035.     }
  3036.  
  3037.     private String sortClans(int page, int pages) {
  3038.         TextBuilder text = new TextBuilder("<br>Страницы:<br1><table width=300><tr>");
  3039.         int step = 1;
  3040.         int s = page - 3;
  3041.         int f = page + 3;
  3042.         if (page < _statSortLimit && s < _statSortLimit) {
  3043.             s = 1;
  3044.         }
  3045.         if (page >= _statSortLimit) {
  3046.             text.append("<td><a action=\"bypass -h npc_" + getObjectId() + "_statClans " + s + "\"> ... </a></td>");
  3047.         }
  3048.  
  3049.         for (int i = s; i < (pages + 1); i++) {
  3050.             int al = i + 1;
  3051.             if (i == page) {
  3052.                 text.append("<td>" + i + "</td>");
  3053.             } else {
  3054.                 if (al <= pages) {
  3055.                     text.append("<td><a action=\"bypass -h npc_" + getObjectId() + "_statClans " + i + "\">" + i + "</a></td>");
  3056.                 }
  3057.             }
  3058.             if (step == _statSortLimit && f < pages) {
  3059.                 if (al < pages) {
  3060.                     text.append("<td><a action=\"bypass -h npc_" + getObjectId() + "_statClans " + al + "\"> ... </a></td>");
  3061.                 }
  3062.                 break;
  3063.             }
  3064.             step++;
  3065.         }
  3066.         text.append("</tr></table><br>");
  3067.         String htmltext = text.toString();
  3068.         text.clear();
  3069.         text = null;
  3070.         return htmltext;
  3071.     }
  3072.  
  3073.     private void statCastles(L2PcInstance player) {
  3074.         NpcHtmlMessage reply = NpcHtmlMessage.id(getObjectId());
  3075.         TextBuilder htm = new TextBuilder();
  3076.  
  3077.         htm.append("<html><body><center><br><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br1>");
  3078.         htm.append("<table width=290> <tr><td><font color=993366><a action=\"bypass -h npc_" + getObjectId() + "_statHome\">Лидеры сервера</a></font></td>");
  3079.         htm.append("<td><font color=993366><a action=\"bypass -h npc_" + getObjectId() + "_statPvp 1\">Top Pvp</a></font></td>");
  3080.         htm.append("<td><font color=993366><a action=\"bypass -h npc_" + getObjectId() + "_statPk 1\">Top Pk</a></font></td>");
  3081.         htm.append("<td><font color=993366><a action=\"bypass -h npc_" + getObjectId() + "_statClans 1\">Кланы</a></font></td>");
  3082.         htm.append("<td><font color=0099CC>Замки</font></td>");
  3083.         htm.append("</tr></table><br><img src=\"sek.cbui175\" width=150 height=3><br>");
  3084.         htm.append("<font color=999966><table width=310><tr><td>Замок</td><td>Владелец</td><td>Дата осады</td></tr>");
  3085.  
  3086.         for (StatCastle castle : CustomServerData.getInstance().getStatCastles()) {
  3087.             if (castle == null) {
  3088.                 continue;
  3089.             }
  3090.  
  3091.             htm.append("<tr><td><font color=CCCC33>" + castle.name + "</td><td>" + castle.owner + "</td><td>" + castle.siege + "</td></tr>");
  3092.         }
  3093.  
  3094.         htm.append("</table></font>");
  3095.  
  3096.         htm.append("<img src=\"L2UI_CH3.herotower_deco\" width=256 height=32></center><a action=\"bypass -h npc_" + getObjectId() + "_Chat 0\"><font color=666633>Назад</font></a></body></html>");
  3097.  
  3098.         reply.setHtml(htm.toString());
  3099.         player.sendPacket(reply);
  3100.         htm.clear();
  3101.         htm = null;
  3102.     }
  3103.  
  3104.     /*
  3105.      * Дампы таблиц и хтмл, чтоб не потерять
  3106.      *
  3107.      CREATE TABLE `z_stock_items` (
  3108.      `id` bigint(9) NOT NULL auto_increment,
  3109.      `itemId` smallint(5) unsigned NOT NULL default '0',
  3110.      `enchant` smallint(5) unsigned NOT NULL default '0',
  3111.      `augment` int(11) default '0',
  3112.      `augAttr` int(11) default '0',
  3113.      `augLvl` int(11) default '0',
  3114.      `price` int(11) default '0',
  3115.      `ownerId` int(10) unsigned NOT NULL default '0',
  3116.      `shadow` tinyint(1) default 0,
  3117.      PRIMARY KEY  (`id`)
  3118.      ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  3119.    
  3120.      CREATE TABLE `z_stock_accounts` (
  3121.      `charId` int(10) NOT NULL default '0',
  3122.      `balance` bigint(20) unsigned NOT NULL default '0',
  3123.      `ban` tinyint(1) default 0,
  3124.      PRIMARY KEY  (`charId`)
  3125.      ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  3126.    
  3127.      CREATE TABLE `z_stock_logs` (
  3128.      `date` varchar(50) default '1970',
  3129.      `charId` int(10) unsigned NOT NULL default '0',
  3130.      `itemId` smallint(5) unsigned NOT NULL default '0',
  3131.      `enchant` smallint(5) unsigned NOT NULL default '0',
  3132.      `augment` int(11) default '0',
  3133.      `augLvl` int(11) default '0',
  3134.      `price` int(11) default '0',
  3135.      `ownerId` int(10) unsigned NOT NULL default '0',
  3136.      `shadow` tinyint(1) default 0
  3137.      ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  3138.    
  3139.      CREATE TABLE `z_post_in` (
  3140.      `id` bigint(9) NOT NULL auto_increment,
  3141.      `tema` varchar(255) NOT NULL default 'No theme',
  3142.      `text` varchar(11255) NOT NULL default '',
  3143.      `from` varchar(255) NOT NULL default '',
  3144.      `to` varchar(255) NOT NULL default '',
  3145.      `type` varchar(255) NOT NULL default '',
  3146.      `date` date NOT NULL,
  3147.      `time` time NOT NULL,
  3148.      PRIMARY KEY  (`id`)
  3149.      ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  3150.    
  3151.      CREATE TABLE `z_post_out` (
  3152.      `id` bigint(9) NOT NULL auto_increment,
  3153.      `tema` varchar(255) NOT NULL default 'No theme',
  3154.      `text` varchar(11255) NOT NULL default '',
  3155.      `from` varchar(255) NOT NULL default '',
  3156.      `to` varchar(255) NOT NULL default '',
  3157.      `type` varchar(255) NOT NULL default '',
  3158.      `date` date NOT NULL,
  3159.      `time` time NOT NULL,
  3160.      PRIMARY KEY  (`id`)
  3161.      ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  3162.    
  3163.      UPDATE `npc` SET `type`='L2Donate' WHERE (`id`='80007');
  3164.      UPDATE `npc` SET `type`='L2Donate' WHERE (`id`='99999');
  3165.    
  3166.    
  3167.      <html><title>Донат.</title>
  3168.      <body>
  3169.      <a action="bypass -h npc_" + getObjectId() + "_StockExchange 1">Биржа предметов</a><br>
  3170.      </body>
  3171.      </html>
  3172.      */
  3173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement