Guest User

Untitled

a guest
Jul 5th, 2013
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 29.74 KB | None | 0 0
  1. package events.Viktorina;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.BufferedWriter;
  5. import java.io.File;
  6. import java.io.FileReader;
  7. import java.io.FileWriter;
  8. import java.sql.Connection;
  9. import java.sql.PreparedStatement;
  10. import java.sql.ResultSet;
  11. import java.sql.SQLException;
  12. import java.util.ArrayList;
  13. import java.util.Calendar;
  14. import java.util.List;
  15. import java.util.StringTokenizer;
  16. import java.util.concurrent.ScheduledFuture;
  17.  
  18. import l2r.commons.dbutils.DbUtils;
  19. import l2r.commons.util.Rnd;
  20. import l2r.gameserver.Announcements;
  21. import l2r.gameserver.Config;
  22. import l2r.gameserver.ThreadPoolManager;
  23. import l2r.gameserver.database.DatabaseFactory;
  24. import l2r.gameserver.handler.voicecommands.IVoicedCommandHandler;
  25. import l2r.gameserver.handler.voicecommands.VoicedCommandHandler;
  26. import l2r.gameserver.instancemanager.ServerVariables;
  27. import l2r.gameserver.listener.actor.player.OnPlayerEnterListener;
  28. import l2r.gameserver.model.GameObjectsStorage;
  29. import l2r.gameserver.model.Player;
  30. import l2r.gameserver.model.actor.listener.CharListenerList;
  31. import l2r.gameserver.network.serverpackets.Say2;
  32. import l2r.gameserver.network.serverpackets.SystemMessage;
  33. import l2r.gameserver.network.serverpackets.components.ChatType;
  34. import l2r.gameserver.scripts.Functions;
  35. import l2r.gameserver.scripts.ScriptFile;
  36.  
  37. import org.slf4j.Logger;
  38. import org.slf4j.LoggerFactory;
  39.  
  40. import events.EventsConfig;
  41.  
  42. public class Viktorina extends Functions implements ScriptFile, IVoicedCommandHandler, OnPlayerEnterListener
  43. {
  44.     private static final Logger _log = LoggerFactory.getLogger(Viktorina.class);
  45.     private String[] _commandList = new String[] { "o", "voff", "von", "vhelp", "vtop", "v", "vo" };
  46.     private ArrayList<String> questions = new ArrayList<String>();
  47.     private static ArrayList<Player> playerList = new ArrayList<Player>();
  48.     static ScheduledFuture<?> _taskViktorinaStart;
  49.     private static ArrayList<RewardList> _items = new ArrayList<RewardList>();
  50.     static ScheduledFuture<?> _taskStartQuestion;
  51.     static ScheduledFuture<?> _taskStopQuestion;
  52.     long _timeStopViktorina = 0;
  53.     private static boolean status = false;
  54.     private static boolean _questionStatus = false;
  55.     private static int index;
  56.     private static String question;
  57.     private static String answer;
  58.     private final static String GET_LIST_FASTERS = "SELECT `obj_id`,`value` FROM `character_variables` WHERE `name`='viktorinafirst' ORDER BY `value` DESC LIMIT 0,10";
  59.     private final static String GET_LIST_TOP = "SELECT `obj_id`,`value` FROM `character_variables` WHERE `name`='viktorinaschet' ORDER BY `value` DESC LIMIT 0,10";;
  60.     private static Viktorina instance;
  61.     private static boolean DEBUG_VIKROINA = true;
  62.  
  63.  
  64.     public static Viktorina getInstance()
  65.     {
  66.         if(instance == null)
  67.             instance = new Viktorina();
  68.         return instance;
  69.     }
  70.  
  71.     /**
  72.      * Загружаем базу вопросов.
  73.      */
  74.     public void loadQuestions()
  75.     {
  76.         File file = new File(Config.DATAPACK_ROOT + "/data/other/events/Viktorina/questions.txt");
  77.  
  78.         try
  79.         {
  80.             BufferedReader br = new BufferedReader(new FileReader(file));
  81.             String str;
  82.             while((str = br.readLine()) != null)
  83.             {
  84.                 questions.add(str);
  85.             }
  86.             br.close();
  87.             _log.info("Viktorina Event: Questions loaded");
  88.         }
  89.         catch(Exception e)
  90.         {
  91.             _log.info("Viktorina Event: Error parsing questions file. " + e);
  92.             e.printStackTrace();
  93.         }
  94.     }
  95.  
  96.     /**
  97.      * Сохраняем вопросы обратно в файл.
  98.      */
  99.     public void saveQuestions()
  100.     {
  101.         if(!Config.VIKTORINA_REMOVE_QUESTION)
  102.             return;
  103.         File file = new File(Config.DATAPACK_ROOT + "/data/other/events/Viktorina/questions.txt");
  104.  
  105.         try
  106.         {
  107.             BufferedWriter br = new BufferedWriter(new FileWriter(file));
  108.             for(String str : questions)
  109.                 br.write(str + "\r\n");
  110.             br.close();
  111.             _log.info("Viktorina Event: Questions saved");
  112.         }
  113.         catch(Exception e)
  114.         {
  115.             _log.info("Viktorina Event: Error save questions file. " + e);
  116.             e.printStackTrace();
  117.         }
  118.     }
  119.  
  120.     /**
  121.      * Готовим вопрос, вытягиваем рандомно любой вопрос с ответом.
  122.      */
  123.     public void parseQuestion()
  124.     {
  125.         index = Rnd.get(questions.size());
  126.         String str = questions.get(index);
  127.         StringTokenizer st = new StringTokenizer(str, "|");
  128.         question = st.nextToken();
  129.         answer = st.nextToken();
  130.     }
  131.  
  132.     public void checkAnswer(String chat, Player player)
  133.     {
  134.         if(chat.equalsIgnoreCase(answer) && isQuestionStatus())
  135.         {
  136.             if(!playerList.contains(player))
  137.                 playerList.add(player);
  138.                 _log.info("Viktorina: игрок - " + player.getName() + " дал правильный ответ. Был добавлен в список." );
  139.         }
  140.     }
  141.  
  142.     /**
  143.      * Анонс вопроса викторины.
  144.      * @param text
  145.      */
  146.     public void announseViktorina(String text)
  147.     {
  148.         Say2 cs = new Say2(0, ChatType.TELL, "Викторина", text);
  149.         for(Player player : GameObjectsStorage.getAllPlayersForIterate())
  150.             if(player.getVar("viktorina") == "on")
  151.                 player.sendPacket(cs);
  152.     }
  153.  
  154.     public void checkPlayers()
  155.     {
  156.         Say2 cs = new Say2(0, ChatType.TELL, "Викторина", "чтобы отказаться от участия в викторине введите .voff , для справки введите .vhelp");
  157.         for(Player player : GameObjectsStorage.getAllPlayersForIterate())
  158.             if(player.getVar("viktorina") == null)
  159.             {
  160.                 player.sendPacket(cs);
  161.                 player.setVar("viktorina", "on", -1);
  162.             }
  163.     }
  164.  
  165.     public void viktorinaSay(Player player, String text)
  166.     {
  167.         Say2 cs = new Say2(0, ChatType.TELL, "Викторина", text);
  168.         if(player.getVar("viktorina") == "on")
  169.             player.sendPacket(cs);
  170.     }
  171.  
  172.     /**
  173.      * Подсчет правильно ответивших
  174.      */
  175.     public void winners()
  176.     {
  177.         if(!isStatus())
  178.         {
  179.             _log.info("Пытался объявить победителя, но викторина оказалась выключена", "Viktorina");
  180.             return;
  181.         }
  182.         if(isQuestionStatus())
  183.         {
  184.             _log.info("Пытался объявить победителя, когда действовал вопрос.", "Viktorina");
  185.             return;
  186.         }
  187.         if(ServerVariables.getString("viktorinaq") == null)
  188.             ServerVariables.set("viktorinaq", 0);
  189.         if(ServerVariables.getString("viktorinaa") == null)
  190.             ServerVariables.set("viktorinaa", 0);
  191.         if(playerList.size() > 0)
  192.         {
  193.             announseViktorina(" правильных ответов: " + playerList.size() + ", первый ответил: " + playerList.get(0).getName() + ", правильный ответ: " + answer + "");
  194.             ServerVariables.set("viktorinaq", ServerVariables.getInt("viktorinaq") + 1);
  195.             ServerVariables.set("viktorinaa", ServerVariables.getInt("viktorinaa") + 1);
  196.             if(Config.VIKTORINA_REMOVE_QUESTION)
  197.                 questions.remove(index);
  198.             _log.info("" + playerList.get(0).getName() + "|" + playerList.size() + "|" + question + "|" + answer, "Viktorina");
  199.         }
  200.         else
  201.         {
  202.             if(Config.VIKTORINA_REMOVE_QUESTION_NO_ANSWER)
  203.                 announseViktorina(" правильного ответа не поступило, правильный ответ был:" + answer + "");
  204.             if(!Config.VIKTORINA_REMOVE_QUESTION_NO_ANSWER)
  205.                 announseViktorina(" правильного ответа не поступило");
  206.             ServerVariables.set("viktorinaq", ServerVariables.getInt("viktorinaq") + 1);
  207.             if(Config.VIKTORINA_REMOVE_QUESTION && Config.VIKTORINA_REMOVE_QUESTION_NO_ANSWER)
  208.                 questions.remove(index);
  209.         }
  210.     }
  211.  
  212.     /**
  213.      * Считам через сколько стартуем викторину, создаем пул.
  214.      */
  215.     public void Start()
  216.     {
  217.         if(_taskViktorinaStart != null)
  218.             _taskViktorinaStart.cancel(true);
  219.         Calendar _timeStartViktorina = Calendar.getInstance();
  220.         _timeStartViktorina.set(Calendar.HOUR_OF_DAY, Config.VIKTORINA_START_TIME_HOUR);
  221.         _timeStartViktorina.set(Calendar.MINUTE, Config.VIKTORINA_START_TIME_MIN);
  222.         _timeStartViktorina.set(Calendar.SECOND, 0);
  223.         _timeStartViktorina.set(Calendar.MILLISECOND, 0);
  224.         Calendar _timeStopViktorina = Calendar.getInstance();
  225.         _timeStopViktorina.setTimeInMillis(_timeStartViktorina.getTimeInMillis());
  226.         _timeStopViktorina.add(Calendar.HOUR_OF_DAY, Config.VIKTORINA_WORK_TIME);
  227.         long currentTime = System.currentTimeMillis();
  228.         // Если время виторины еще не наступило
  229.         if(_timeStartViktorina.getTimeInMillis() >= currentTime)
  230.         {
  231.             _taskViktorinaStart = ThreadPoolManager.getInstance().schedule(new ViktorinaStart(_timeStopViktorina.getTimeInMillis()), _timeStartViktorina.getTimeInMillis() - currentTime);
  232.         }
  233.         // Если как раз идет время викторины - стартуем викторину
  234.         else if(currentTime > _timeStartViktorina.getTimeInMillis() && currentTime < _timeStopViktorina.getTimeInMillis())
  235.         {
  236.             _taskViktorinaStart = ThreadPoolManager.getInstance().schedule(new ViktorinaStart(_timeStopViktorina.getTimeInMillis()), 1000);
  237.         }
  238.         // сегодня олим уже не должен запускаться, значит нада стартовать викторину
  239.         // на след день, прибавляем 24 часа
  240.         else
  241.         {
  242.             _timeStartViktorina.add(Calendar.HOUR_OF_DAY, 24);
  243.             _timeStopViktorina.add(Calendar.HOUR_OF_DAY, 24);
  244.             _taskViktorinaStart = ThreadPoolManager.getInstance().schedule(new ViktorinaStart(_timeStopViktorina.getTimeInMillis()), _timeStartViktorina.getTimeInMillis() - currentTime);
  245.         }
  246.  
  247.         if(DEBUG_VIKROINA)
  248.             _log.info("Start Viktorina: " + _timeStartViktorina.getTime());
  249.             _log.info("Stop Viktorina: " + _timeStopViktorina.getTime());
  250.  
  251.     }
  252. /**
  253.  * Функция продолжения таймера викторины, нужна при ручной остановке викторины.
  254.  * Назначает старт викторины на след день
  255.  */
  256.     public void Continue()
  257.     {
  258.         if(_taskViktorinaStart != null)
  259.             _taskViktorinaStart.cancel(true);
  260.         Calendar _timeStartViktorina = Calendar.getInstance();
  261.         _timeStartViktorina.set(Calendar.HOUR_OF_DAY, Config.VIKTORINA_START_TIME_HOUR);
  262.         _timeStartViktorina.set(Calendar.MINUTE, Config.VIKTORINA_START_TIME_MIN);
  263.         _timeStartViktorina.set(Calendar.SECOND, 0);
  264.         _timeStartViktorina.set(Calendar.MILLISECOND, 0);
  265.         Calendar _timeStopViktorina = Calendar.getInstance();
  266.         _timeStopViktorina.setTimeInMillis(_timeStartViktorina.getTimeInMillis());
  267.         _timeStopViktorina.add(Calendar.HOUR_OF_DAY, Config.VIKTORINA_WORK_TIME);
  268.         _timeStartViktorina.add(Calendar.HOUR_OF_DAY, 24);
  269.         _timeStopViktorina.add(Calendar.HOUR_OF_DAY, 24);
  270.         long currentTime = System.currentTimeMillis();
  271.         _taskViktorinaStart = ThreadPoolManager.getInstance().schedule(new ViktorinaStart(_timeStopViktorina.getTimeInMillis()), _timeStartViktorina.getTimeInMillis() - currentTime);
  272.         if(DEBUG_VIKROINA)
  273.             _log.info("Continue Viktorina: " + _timeStartViktorina.getTime() + "|Stop Viktorina: " + _timeStopViktorina.getTime());
  274.  
  275.     }
  276.     /**
  277.      * Запуск викторины в ручную!!
  278.      * запускается на время указанное в настройках.
  279.      */
  280.     public void ForseStart()
  281.     {
  282.         if(_taskViktorinaStart != null)
  283.             _taskViktorinaStart.cancel(true);
  284.         Calendar _timeStartViktorina = Calendar.getInstance();
  285.         Calendar _timeStopViktorina = Calendar.getInstance();
  286.         _timeStopViktorina.setTimeInMillis(_timeStartViktorina.getTimeInMillis());
  287.         _timeStopViktorina.add(Calendar.HOUR_OF_DAY, Config.VIKTORINA_WORK_TIME);
  288.         _log.info("Viktorina Started");
  289.         _taskViktorinaStart = ThreadPoolManager.getInstance().schedule(new ViktorinaStart(_timeStopViktorina.getTimeInMillis()), 1000);
  290.         if(DEBUG_VIKROINA)
  291.             _log.info("Start Viktorina: " + _timeStartViktorina.getTime());
  292.             _log.info("Stop Viktorina: " + _timeStopViktorina.getTime());
  293.  
  294.     }
  295.  
  296.     /**
  297.      * Стартуем викторину
  298.      * @author Sevil
  299.      *
  300.      */
  301.     public class ViktorinaStart implements Runnable
  302.     {
  303.  
  304.         public ViktorinaStart(long timeStopViktorina)
  305.         {
  306.             _timeStopViktorina = timeStopViktorina;
  307.         }
  308.  
  309.         public void run()
  310.         {
  311.             try
  312.             {
  313.                 //if(isStatus())
  314.                 //{
  315.                 //  if(DEBUG_VIKROINA)
  316.                 //      _log.info("Viktoryna is already starter, WTF ??? \n" + Util.dumpStack());
  317.                 //  return;
  318.                 //}
  319.                 if(_taskStartQuestion != null)
  320.                     _taskStartQuestion.cancel(true);
  321.                 _taskStartQuestion = ThreadPoolManager.getInstance().schedule(new startQuestion(_timeStopViktorina), 5000);
  322.                 Announcements.getInstance().announceToAll("Викторина началась!");
  323.                 Announcements.getInstance().announceToAll("Для справки введите .vhelp");
  324.                 loadQuestions();
  325.                 setStatus(true);
  326.  
  327.             }
  328.             catch(Exception e)
  329.             {
  330.                 e.printStackTrace();
  331.             }
  332.         }
  333.     }
  334.  
  335.     /**
  336.      * Задаем вопрос, ждем время, запускаем стоп вопроса.
  337.      * @author Sevil
  338.      *
  339.      */
  340.     public class startQuestion implements Runnable
  341.     {
  342.         long _timeStopViktorina = 0;
  343.  
  344.         public startQuestion(long timeStopViktorina)
  345.         {
  346.             _timeStopViktorina = timeStopViktorina;
  347.         }
  348.  
  349.         public void run()
  350.         {
  351.             long currentTime = Calendar.getInstance().getTimeInMillis();
  352.             if(currentTime > _timeStopViktorina)
  353.             {
  354.                 _log.info("Viktorina time off...", "Viktorina");
  355.                 playerList.clear();
  356.                 setStatus(false);
  357.                 setQuestionStatus(false);
  358.                 announseViktorina("Время работы викторины истекло, Всем участникам приятного времяпрепровождения!");
  359.                 Announcements.getInstance().announceToAll("Время викторины закончилось.!");
  360.                 return;
  361.             }
  362.             if(!playerList.isEmpty())
  363.             {
  364.                 _log.info("Что за чорт??? почему когда я задаю вопрос, лист правильно ответивших не пуст!?!?", "Viktorina");
  365.                 playerList.clear();
  366.                 return;
  367.             }
  368.             if(!isStatus())
  369.             {
  370.                 _log.info("Что за чорт??? Почему я должен задавать вопрос, когда викторина не запущена???", "Viktorina");
  371.                 return;
  372.             }
  373.             if(!isQuestionStatus())
  374.             {
  375.                 parseQuestion();
  376.                 checkPlayers();
  377.                 announseViktorina(question);
  378.                 if(_taskStopQuestion != null)
  379.                     _taskStopQuestion.cancel(true);
  380.                 _taskStopQuestion = ThreadPoolManager.getInstance().schedule(new stopQuestion(_timeStopViktorina), Config.VIKTORINA_TIME_ANSER * 1000);
  381.                 setQuestionStatus(true);
  382.             }
  383.             else
  384.             {
  385.                 _log.info("Что за чорт???? ПОчему статус вопроса true?? когда быть должен false!!!!", "Viktorina");
  386.             }
  387.         }
  388.     }
  389.  
  390.     /**
  391.      * Стоп вопроса: подсчитываем правильные ответы, и кто дал правильный ответ быстрее всех.
  392.      * запускаем следующий вопрос.
  393.      * @author Sevil
  394.      *
  395.      */
  396.     public class stopQuestion implements Runnable
  397.     {
  398.         long _timeStopViktorina = 0;
  399.  
  400.         public stopQuestion(long timeStopViktorina)
  401.         {
  402.             _timeStopViktorina = timeStopViktorina;
  403.         }
  404.  
  405.         public void run()
  406.         {
  407.             if(!isStatus())
  408.             {
  409.                 _log.info("Что за чорт??? Почему я должен считать победителей и выдавать награды когда викторина не запущена???", "Viktorina");
  410.                 return;
  411.             }
  412.             setQuestionStatus(false);
  413.             winners();
  414.             rewarding();
  415.             playerList.clear();
  416.             if(_taskStartQuestion != null)
  417.                 _taskStartQuestion.cancel(true);
  418.             _taskStartQuestion = ThreadPoolManager.getInstance().schedule(new startQuestion(_timeStopViktorina), Config.VIKTORINA_TIME_PAUSE * 1000);
  419.         }
  420.     }
  421.  
  422.     /**
  423.      * Останавливаем эвент.
  424.      */
  425.     public void stop()
  426.     {
  427.         playerList.clear();
  428.         if(_taskStartQuestion != null)
  429.             _taskStartQuestion.cancel(true);
  430.         if(_taskStopQuestion != null)
  431.             _taskStopQuestion.cancel(true);
  432.         setQuestionStatus(false);
  433.         _log.info("Viktorina Stoped.", "Viktorina");
  434.         if(isStatus())
  435.             Announcements.getInstance().announceToAll("Викторина остановлена!");
  436.         setStatus(false);
  437.         Continue();
  438.     }
  439.  
  440.     /**
  441.      * Формируем окно справки. вызывается если игрок не разу не учавствовал в викторине
  442.      * или командой .vhelp
  443.      * @param player
  444.      */
  445.     public void help(Player player)
  446.     {
  447.         int schet;
  448.         int first;
  449.         int vq;
  450.         int va;
  451.         String vstatus;
  452.         if(player.getVar("viktorinaschet") == null)
  453.             schet = 0;
  454.         else
  455.             schet = Integer.parseInt(player.getVar("viktorinaschet"));
  456.  
  457.         if(player.getVar("viktorinafirst") == null)
  458.             first = 0;
  459.         else
  460.             first = Integer.parseInt(player.getVar("viktorinafirst"));
  461.  
  462.         if(ServerVariables.getString("viktorinaq", "0") == "0")
  463.         {
  464.             ServerVariables.set("viktorinaq", 0);
  465.             vq = 0;
  466.         }
  467.         else
  468.             vq = Integer.parseInt(ServerVariables.getString("viktorinaq"));
  469.  
  470.         if(ServerVariables.getString("viktorinaa", "0") == "0")
  471.         {
  472.             ServerVariables.set("viktorinaa", 0);
  473.             va = 0;
  474.         }
  475.         else
  476.             va = Integer.parseInt(ServerVariables.getString("viktorinaa"));
  477.        
  478.         if(player.getVar("viktorina") == "on")
  479.             vstatus = "<font color=\"#00FF00\">Вы учавствуете в \"Викторине\"</font><br>";
  480.         else
  481.             vstatus = "<font color=\"#FF0000\">Вы не учавствуете в \"Викторине\"</font><br>";
  482.        
  483.         StringBuffer help = new StringBuffer("<html><body>");
  484.         help.append("<center>Помошь по Викторине<br></center>");
  485.         help.append(vstatus);
  486.         help.append("Время начала викторины: " + Config.VIKTORINA_START_TIME_HOUR + ":" + Config.VIKTORINA_START_TIME_MIN + "<br>");
  487.         help.append("Длительность работы викторины " + Config.VIKTORINA_WORK_TIME + " ч.<br>");
  488.         help.append("Время в течении которого можно дать ответ: " + Config.VIKTORINA_TIME_ANSER + " сек.<br>");
  489.         help.append("Время между вопросами: " + (Config.VIKTORINA_TIME_ANSER + Config.VIKTORINA_TIME_PAUSE) + " сек.<br>");
  490.         help.append("Вопросов уже было заданно: " + vq + ".<br>");
  491.         help.append("Верно ответили на : " + va + ".<br>");
  492.         help.append("Вы верно ответили на : " + schet + ", в " + first + " вы были первым.<br>");
  493.         help.append("<br>");
  494.         help.append("<center>Команды викторины:<br></center>");
  495.         help.append("<font color=\"LEVEL\">Ответ</font> - вводится в любой вид чата.<br>");
  496.         help.append("<font color=\"LEVEL\">.von</font> - команда для включения витокрины<br>");
  497.         help.append("<font color=\"LEVEL\">.voff</font> - команда для выключения витокрины<br>");
  498.         help.append("<font color=\"LEVEL\">.vtop</font> - команда для просмотра результатов.<br>");
  499.         help.append("<font color=\"LEVEL\">.vhelp</font> - команда для вызова этой страницы.<br>");
  500.         help.append("<font color=\"LEVEL\">.v</font> - показывает текущий вопрос.<br>");
  501.         help.append("</body></html>");
  502.         show(help.toString(), player);
  503.     }
  504.  
  505.     /**
  506.      * выводит топ
  507.      * @param player
  508.      */
  509.     public void top(Player player)
  510.     {
  511.         StringBuffer top = new StringBuffer("<html><body>");
  512.         top.append("<center>Топ Самых Быстрых");
  513.         top.append("<img src=\"L2UI.SquareWhite\" width=270 height=1><img src=\"L2UI.SquareBlank\" width=1 height=3>");
  514.         final List<Scores> fasters = getList(true);
  515.         if(fasters.size() != 0)
  516.         {
  517.             top.append("<table width=300 border=0 bgcolor=\"000000\">");
  518.  
  519.             int index = 1;
  520.  
  521.             for(final Scores faster : fasters)
  522.             {
  523.                 top.append("<tr>");
  524.                 top.append("<td><center>" + index + "<center></td>");
  525.                 top.append("<td><center>" + faster.getName() + "<center></td>");
  526.                 top.append("<td><center>" + faster.getScore() + "<center></td>");
  527.                 top.append("</tr>");
  528.                 index++;
  529.             }
  530.  
  531.             top.append("<tr><td><br></td><td></td></tr>");
  532.  
  533.             top.append("</table>");
  534.         }
  535.         top.append("<img src=\"L2UI.SquareWhite\" width=270 height=1> <img src=\"L2UI.SquareBlank\" width=1 height=3>");
  536.         top.append("</center>");
  537.  
  538.         top.append("<center>Общий топ");
  539.         top.append("<img src=\"L2UI.SquareWhite\" width=270 height=1><img src=\"L2UI.SquareBlank\" width=1 height=3>");
  540.         final List<Scores> top10 = getList(false);
  541.         if(top10.size() != 0)
  542.         {
  543.             top.append("<table width=300 border=0 bgcolor=\"000000\">");
  544.  
  545.             int index = 1;
  546.  
  547.             for(final Scores top1 : top10)
  548.             {
  549.                 top.append("<tr>");
  550.                 top.append("<td><center>" + index + "<center></td>");
  551.                 top.append("<td><center>" + top1.getName() + "<center></td>");
  552.                 top.append("<td><center>" + top1.getScore() + "<center></td>");
  553.                 top.append("</tr>");
  554.                 index++;
  555.             }
  556.  
  557.             top.append("<tr><td><br></td><td></td></tr>");
  558.  
  559.             top.append("</table>");
  560.         }
  561.         top.append("<img src=\"L2UI.SquareWhite\" width=270 height=1> <img src=\"L2UI.SquareBlank\" width=1 height=3>");
  562.         top.append("</center>");
  563.  
  564.         top.append("</body></html>");
  565.         show(top.toString(), player);
  566.     }
  567.  
  568.     public void setQuestionStatus(boolean b)
  569.     {
  570.         _questionStatus = b;
  571.     }
  572.  
  573.     public boolean isQuestionStatus()
  574.     {
  575.         return _questionStatus;
  576.     }
  577.  
  578.     @Override
  579.     public void onLoad()
  580.     {
  581.         CharListenerList.addGlobal(this);
  582.         executeTask("events.Viktorina.Viktorina", "preLoad", new Object[0], 20000);
  583.         VoicedCommandHandler.getInstance().registerVoicedCommandHandler(this);
  584.         _log.info("Loaded Event: Viktorina");
  585.     }
  586.  
  587.     @Override
  588.     public void onReload()
  589.     {
  590.         stop();
  591.     }
  592.  
  593.     @Override
  594.     public void onShutdown()
  595.     {
  596.         stop();
  597.  
  598.     }
  599.  
  600.     @Override
  601.     public String[] getVoicedCommandList()
  602.     {
  603.         return _commandList;
  604.     }
  605.  
  606.     @Override
  607.     public boolean useVoicedCommand(String command, Player player, String args)
  608.     {
  609.  
  610.         if(command.equals("o"))
  611.         {
  612.             if(args.equalsIgnoreCase(answer) && isQuestionStatus())
  613.             {
  614.                 if(!playerList.contains(player))
  615.                     playerList.add(player);
  616.                 //_log.info("preprepls " + playerList + "");
  617.             }
  618.             if(!isQuestionStatus())
  619.                 viktorinaSay(player, "Возможно вопрос не был задан,или же время ответа истекло");
  620.         }
  621.         if(command.equals("von"))
  622.         {
  623.             player.setVar("viktorina", "on", -1);
  624.             player.sendMessage("Вы принимаете участие в Викторине!");
  625.             player.sendMessage("Ждите поступления Вам вопроса в ПМ!");
  626.         }
  627.         if(command.equals("voff"))
  628.         {
  629.             player.setVar("viktorina", "off", -1);
  630.             player.sendMessage("Отказались от участия в Викторине!");
  631.             player.sendMessage("До новых встреч!");
  632.         }
  633.         if(command.equals("vhelp"))
  634.         {
  635.             help(player);
  636.         }
  637.         if(command.equals("vtop"))
  638.         {
  639.             top(player);
  640.         }
  641.         if(command.equals("v"))
  642.         {
  643.             viktorinaSay(player, question);
  644.         }
  645.         if(command.equals("vo") && player.isGM())
  646.         {
  647.             viktorinaSay(player, answer);
  648.         }
  649.         return true;
  650.     }
  651.  
  652.     /**
  653.      *выдача награды, начисление очков.
  654.      */
  655.     private void rewarding()
  656.     {
  657.         if(!isStatus())
  658.         {
  659.             _log.info("Пытался вручить награды, но викторина оказалась выключена");
  660.             return;
  661.         }
  662.         if(isQuestionStatus())
  663.         {
  664.             _log.info("Пытался вручить награды, когда действовал вопрос.");
  665.             return;
  666.         }
  667.        
  668.         parseReward();
  669.         int schet;
  670.         int first;
  671.         for(Player player : playerList)
  672.         {
  673.             if(player.getVar("viktorinaschet") == null)
  674.                 schet = 0;
  675.             else
  676.                 schet = Integer.parseInt(player.getVar("viktorinaschet"));
  677.             if(player.getVar("viktorinafirst") == null)
  678.                 first = 0;
  679.             else
  680.                 first = Integer.parseInt(player.getVar("viktorinafirst"));
  681.             if(player == playerList.get(0))
  682.             {
  683.                 giveItemByChance(player, true);
  684.                 player.setVar("viktorinafirst", "" + (first + 1) + "", -1);
  685.             }
  686.             else
  687.                 giveItemByChance(player, false);
  688.             player.setVar("viktorinaschet", "" + (schet + 1) + "", -1);
  689.         }
  690.     }
  691.  
  692.     /**
  693.      * парсим конфиг наград
  694.      */
  695.     private void parseReward()
  696.     {
  697.         _items.clear();
  698.         StringTokenizer st = new StringTokenizer(EventsConfig.get("Victorina_Reward_Ferst"), ";");
  699.         StringTokenizer str = new StringTokenizer(EventsConfig.get("Victorina_Reward_Other"), ";");
  700.         while(st.hasMoreTokens())
  701.         {
  702.             String str1 = st.nextToken();
  703.             StringTokenizer str2 = new StringTokenizer(str1, ",");
  704.             final int itemId = Integer.parseInt(str2.nextToken());
  705.             final int count = Integer.parseInt(str2.nextToken());
  706.             final int chance = Integer.parseInt(str2.nextToken());
  707.             final boolean first = true;
  708.             final RewardList item = new RewardList();
  709.             item.setProductId(itemId);
  710.             item.setCount(count);
  711.             item.setChance(chance);
  712.             item.setFirst(first);
  713.             _items.add(item);
  714.         }
  715.         while(str.hasMoreTokens())
  716.         {
  717.             String str1 = str.nextToken();
  718.             StringTokenizer str2 = new StringTokenizer(str1, ",");
  719.             final int itemId = Integer.parseInt(str2.nextToken());
  720.             final int count = Integer.parseInt(str2.nextToken());
  721.             final int chance = Integer.parseInt(str2.nextToken());
  722.             final boolean first = false;
  723.             final RewardList item = new RewardList();
  724.             item.setProductId(itemId);
  725.             item.setCount(count);
  726.             item.setChance(chance);
  727.             item.setFirst(first);
  728.             _items.add(item);
  729.         }
  730.     }
  731.  
  732.     /**
  733.      * Выдаем приз на каторую укажет шанс + определяем выдавать приз для первого или для остальных
  734.      * @param player
  735.      * @param first
  736.      * @return
  737.      */
  738.     private boolean giveItemByChance(Player player, boolean first)
  739.     {
  740.         int chancesumm = 0;
  741.         int productId = 0;
  742.         int chance = Rnd.get(0, 100);
  743.         int count = 0;
  744.         for(RewardList items : _items)
  745.         {
  746.             chancesumm = chancesumm + items.getChance();
  747.             if(first == items.getFirst() && chancesumm > chance)
  748.             {
  749.                 productId = items.getProductId();
  750.                 count = items.getCount();
  751.                 addItem(player, productId, count, false);
  752.                 if(count > 1)
  753.                     player.sendPacket(new SystemMessage(SystemMessage.YOU_HAVE_EARNED_S2_S1S).addItemName(productId).addNumber(count));
  754.                 else
  755.                     player.sendPacket(new SystemMessage(SystemMessage.YOU_HAVE_EARNED_S1).addItemName(productId));
  756.                 if(DEBUG_VIKROINA)
  757.                     _log.info("Игрок: " + player.getName() + " получил " + productId + ":" + count + " с шансом: " + items.getChance() + ":" + items.getFirst() + "", "Viktorina");
  758.                 return true;
  759.             }
  760.         }
  761.         return true;
  762.     }
  763.  
  764.     private class RewardList
  765.     {
  766.         public int _productId;
  767.         public int _count;
  768.         public int _chance;
  769.         public boolean _first;
  770.  
  771.         private void setProductId(int productId)
  772.         {
  773.             _productId = productId;
  774.         }
  775.  
  776.         private void setChance(int chance)
  777.         {
  778.             _chance = chance;
  779.         }
  780.  
  781.         private void setCount(int count)
  782.         {
  783.             _count = count;
  784.         }
  785.  
  786.         private void setFirst(boolean first)
  787.         {
  788.             _first = first;
  789.         }
  790.  
  791.         private int getProductId()
  792.         {
  793.             return _productId;
  794.         }
  795.  
  796.         private int getChance()
  797.         {
  798.             return _chance;
  799.         }
  800.  
  801.         private int getCount()
  802.         {
  803.             return _count;
  804.         }
  805.  
  806.         private boolean getFirst()
  807.         {
  808.             return _first;
  809.         }
  810.     }
  811.  
  812.     private boolean isStatus()
  813.     {
  814.         return status;
  815.     }
  816.  
  817.     public static boolean isRunned()
  818.     {
  819.         return status;
  820.     }
  821.  
  822.     @SuppressWarnings("static-access")
  823.     private void setStatus(boolean status)
  824.     {
  825.         this.status = status;
  826.     }
  827.  
  828.     /**
  829.      * Возвращаем имя чара по его obj_Id
  830.      * @param char_id
  831.      * @return
  832.      */
  833.     private String getName(int char_id)
  834.     {
  835.         String name = null;
  836.         Connection con = null;
  837.         PreparedStatement statement = null;
  838.         ResultSet rset = null;
  839.  
  840.         try
  841.         {
  842.             con = DatabaseFactory.getInstance().getConnection();
  843.             statement = con.prepareStatement("SELECT char_name FROM characters WHERE obj_Id=?");
  844.             statement.setInt(1, char_id);
  845.             rset = statement.executeQuery();
  846.             rset.next();
  847.             name = rset.getString("char_name");
  848.             //return name;
  849.         }
  850.         catch(final SQLException e)
  851.         {
  852.             _log.info("ААА!!! ОПАСНОСТЬ, не могу найти игрока с таким obj_Id:" + e.getMessage());
  853.         }
  854.         finally
  855.         {
  856.             DbUtils.closeQuietly(con, statement, rset);
  857.         }
  858.         return name;
  859.     }
  860.  
  861.     /**
  862.      * Возвращаем лист имен.
  863.      * @param first
  864.      * @return
  865.      */
  866.     private List<Scores> getList(final boolean first)
  867.     {
  868.         final List<Scores> names = new ArrayList<Scores>();
  869.  
  870.         Connection con = null;
  871.         PreparedStatement statement = null;
  872.         ResultSet rset = null;
  873.  
  874.         String GET_LIST = null;
  875.         if(first)
  876.             GET_LIST = GET_LIST_FASTERS;
  877.         else
  878.             GET_LIST = GET_LIST_TOP;
  879.  
  880.         try
  881.         {
  882.             con = DatabaseFactory.getInstance().getConnection();
  883.             statement = con.prepareStatement(GET_LIST);
  884.             rset = statement.executeQuery();
  885.  
  886.             while(rset.next())
  887.             {
  888.                 final String name = (getName(rset.getInt("obj_id")));
  889.                 final int score = rset.getInt("value");
  890.                 Scores scores = new Scores();
  891.                 scores.setName(name);
  892.                 scores.setScore(score);
  893.                 names.add(scores);
  894.             }
  895.             return names;
  896.         }
  897.         catch(final SQLException e)
  898.         {
  899.             e.printStackTrace();
  900.         }
  901.         finally
  902.         {
  903.             DbUtils.closeQuietly(con, statement, rset);
  904.         }
  905.  
  906.         return names;
  907.     }
  908.  
  909.     private class Scores
  910.     {
  911.         public String _name;
  912.         public int _score;
  913.  
  914.         private void setName(String name)
  915.         {
  916.             _name = name;
  917.         }
  918.  
  919.         private void setScore(int score)
  920.         {
  921.             _score = score;
  922.         }
  923.  
  924.         private String getName()
  925.         {
  926.             return _name;
  927.         }
  928.  
  929.         private int getScore()
  930.         {
  931.             return _score;
  932.         }
  933.     }
  934.  
  935.     public static void preLoad()
  936.     {
  937.  
  938.         if(Config.VIKTORINA_ENABLED)
  939.             executeTask("events.Viktorina.Viktorina", "Start", new Object[0], 5000);
  940.     }
  941.  
  942.     @Override
  943.     public void onPlayerEnter(Player player)
  944.     {
  945.         Say2 cs = new Say2(0, ChatType.CRITICAL_ANNOUNCE, "Викторина", "Активен ивент Викторина! Для участия наберите команду .von! Для справки .vhelp!");
  946.         if(isStatus())
  947.             player.sendPacket(cs);
  948.     }
  949. }
Advertisement
Add Comment
Please, Sign In to add comment