Guest User

Untitled

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