Advertisement
Guest User

me.vynder.commandlottery

a guest
Mar 9th, 2016
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.99 KB | None | 0 0
  1. package me.vynder.commandlottery;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import java.util.Random;
  6. import java.util.logging.Logger;
  7. import java.io.File;
  8. import java.io.FileOutputStream;
  9. import java.io.IOException;
  10. import java.io.InputStream;
  11. import java.nio.channels.Channels;
  12. import org.bukkit.plugin.java.JavaPlugin;
  13. import org.bukkit.Bukkit;
  14. import org.bukkit.ChatColor;
  15. import org.bukkit.command.Command;
  16. import org.bukkit.command.CommandSender;
  17. import org.bukkit.configuration.InvalidConfigurationException;
  18. import org.bukkit.configuration.file.FileConfiguration;
  19. import org.bukkit.configuration.file.YamlConfiguration;
  20. import org.bukkit.entity.Player;
  21.  
  22. public final class CommandLottery extends JavaPlugin
  23. {
  24.     private final static Logger LOGGER = Bukkit.getLogger();
  25.     private final File settingsConfigFile = new File(getDataFolder(), "config.yml");
  26.     private final File languageConfigFile = new File(getDataFolder(), "language.yml");
  27.     private final FileConfiguration settingsConfig = new YamlConfiguration();
  28.     private final FileConfiguration languageConfig = new YamlConfiguration();
  29.     private String  messageLotteryStarts;
  30.     private String  messageTimeToStartLeft;
  31.     private String  messageWinToAll;
  32.     private String  messageWinToWinner;
  33.     private String  messageWinToAllMany;
  34.     private String  messagePrefix;
  35.     private boolean isRepeatable;
  36.     private int     amountOfWinners;
  37.     private int     delay;
  38.     private int     timeBeforeBegin;
  39.     private int     minimalOnline;
  40.     private int     timerTaskId;
  41.     private int     timeRepeatableTaskId;
  42.     private List<?> commands;
  43.     private int     _delayTime;
  44.     @Override
  45.     public void onLoad()
  46.     {
  47.     }
  48.     @Override
  49.     public void onEnable()
  50.     {
  51.         try
  52.         {
  53.             createConfigFiles();
  54.             settingsConfig.load(settingsConfigFile);
  55.             languageConfig.load(languageConfigFile);
  56.         } catch(IOException | InvalidConfigurationException e) {
  57.         }
  58.         // Load all settings
  59.         amountOfWinners        = settingsConfig.getInt("Global.WinnersAmount");
  60.         delay                  = settingsConfig.getInt("Global.Delay");
  61.         timeBeforeBegin        = settingsConfig.getInt("Global.TimeBeforeBegin");
  62.         minimalOnline          = settingsConfig.getInt("Global.MinimalOnline");
  63.         commands               = settingsConfig.getList("Commands");
  64.         isRepeatable           = settingsConfig.getBoolean("Global.RepeatEveryXTime");
  65.         messageLotteryStarts   = ChatColor.translateAlternateColorCodes('&', languageConfig.getString("Global.LotteryStarts"));
  66.         messageTimeToStartLeft = ChatColor.translateAlternateColorCodes('&', languageConfig.getString("Global.LeftTime"));
  67.         messageWinToAll        = ChatColor.translateAlternateColorCodes('&', languageConfig.getString("Global.WinToAll"));
  68.         messageWinToAllMany    = ChatColor.translateAlternateColorCodes('&', languageConfig.getString("Global.WinToAllMany"));
  69.         messageWinToWinner     = ChatColor.translateAlternateColorCodes('&', languageConfig.getString("Global.WinWinner"));
  70.         messagePrefix          = ChatColor.translateAlternateColorCodes('&', languageConfig.getString("Global.Prefix"));
  71.         if(isRepeatable)
  72.             scheduleLottery(0, 0, false);
  73.     }
  74.     @Override
  75.     public void onDisable()
  76.     {
  77.         Bukkit.getScheduler().cancelTasks(this);
  78.     }
  79.     private void createConfigFiles()
  80.     {
  81.         if(!settingsConfigFile.exists())
  82.         {
  83.             settingsConfigFile.getParentFile().mkdirs();
  84.             extract(getResource("config.yml"), settingsConfigFile);
  85.         }
  86.         if(!languageConfigFile.exists())
  87.         {
  88.             languageConfigFile.getParentFile().mkdirs();
  89.             extract(getResource("language.yml"), languageConfigFile);
  90.         }
  91.     }
  92.     private void extract(InputStream in, File file)
  93.     {
  94.         try(FileOutputStream fos = new FileOutputStream(file))
  95.         {
  96.             fos.getChannel().transferFrom(Channels.newChannel(in), 0, Long.MAX_VALUE);
  97.         } catch(IOException ex) {
  98.             LOGGER.warning(ex.toString());
  99.         }
  100.     }
  101.     @Override
  102.     public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
  103.     {
  104.         if(cmd.getName().equalsIgnoreCase("lotterydraw"))
  105.         {
  106.             if(args.length != 2)
  107.                 return false;
  108.             if(!args[0].isEmpty() && !args[1].isEmpty())
  109.             {
  110.                 int timerToStart;
  111.                 int winrsAmt;
  112.                 try
  113.                 {
  114.                     timerToStart = Integer.parseInt(args[0]);
  115.                     winrsAmt     = Integer.parseInt(args[1]);
  116.                 } catch(NumberFormatException e) {
  117.                     sender.sendMessage("Invalid argument!");
  118.                     return false;
  119.                 }
  120.                 if(winrsAmt < 0)
  121.                     return false;
  122.                 if(winrsAmt > Bukkit.getOnlinePlayers().size())
  123.                 {
  124.                     sender.sendMessage("Amount of winners is bigger than online players!");
  125.                     return true;
  126.                 }
  127.                 if(minimalOnline > Bukkit.getOnlinePlayers().size())
  128.                 {
  129.                     sender.sendMessage("Minimal online to draw is " + minimalOnline);
  130.                     return true;
  131.                 }
  132.                 scheduleLottery(timerToStart, winrsAmt, true);
  133.             } else
  134.                 return false;
  135.             return true;
  136.         }
  137.  
  138.         return false;
  139.     }
  140.     private void scheduleLottery(final int delayTime, final int winnersAmount, final boolean manual)
  141.     {
  142.         cancelLottery();
  143.         final Runnable runnable = new Runnable()
  144.         {
  145.             final int overrideMinimal = manual ? winnersAmount : minimalOnline;
  146.             final int overrideWinners = manual ? winnersAmount : amountOfWinners;
  147.             int       idleSteps       = manual ?             0 : timeBeforeBegin;
  148.             int       lotterySteps    = manual ?     delayTime : delay;
  149.             boolean   needToBeStarted = true;
  150.             @Override
  151.             public void run()
  152.             {
  153.                 // Ожидание до начала лотереи
  154.                 if(idleSteps > 0)
  155.                 {
  156.                     idleSteps -= 1;
  157.                     return;
  158.                 }
  159.                 // Сообщение о начале лотереи или оставшемся времени
  160.                 if(lotterySteps > 0)
  161.                 {
  162.                     lotterySteps -= 1;
  163.                     if(needToBeStarted)
  164.                     {
  165.                         Bukkit.broadcastMessage(messagePrefix + messageLotteryStarts);
  166.                         needToBeStarted = false;
  167.                     } else
  168.                         Bukkit.broadcastMessage(messagePrefix + messageTimeToStartLeft.replace("<time>", Integer.toString(_delayTime)));
  169.                     return;
  170.                 }
  171.                 // Процедура розыгрыша лотереи
  172.                 drawLotteryBody(overrideWinners);
  173.                 // Назначение следующей лотереи, если нужно
  174.                 if(isRepeatable)
  175.                     scheduleLottery(timeBeforeBegin, amountOfWinners, false);
  176.                 else
  177.                     cancelLottery();
  178.             }
  179.         };
  180.         timerTaskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(this, runnable, 20L, 20L);
  181.     }
  182.     private void cancelLottery()
  183.     {
  184.         if(timerTaskId != -1)
  185.         {
  186.             Bukkit.getScheduler().cancelTask(timerTaskId);
  187.             timerTaskId = -1;
  188.         }
  189.     }
  190.     private void drawLotteryBody(int winnersAmount)
  191.     {
  192.         // Генерация случайного списка выигравших
  193.         final ArrayList<Player> winners = new ArrayList<>();
  194.         final ArrayList<Player> players = new ArrayList<>();
  195.         players.addAll(Bukkit.getOnlinePlayers());
  196.         final Random random = new Random();
  197.         for(int i = 0; i < winnersAmount && players.size() > 0; i++)
  198.             try
  199.             {
  200.                 int randomIndex = random.nextInt(players.size());
  201.                 winners.add(players.get(randomIndex));
  202.                 players.remove(randomIndex);
  203.             } catch(IllegalArgumentException e) {
  204.                 LOGGER.info("Draw is unsuccessful, someone left the game!");
  205.             }
  206.         // Сообщение об выигравших
  207.         if(winnersAmount > 1)
  208.         {
  209.             final StringBuilder formatted = new StringBuilder();
  210.             for(Player player : winners)
  211.                 formatted.append(player.getDisplayName()).append(ChatColor.RESET).append(", ");
  212.             Bukkit.broadcastMessage(messagePrefix + messageWinToAllMany.replace("<players>", formatted.toString()));
  213.         } else
  214.             Bukkit.broadcastMessage(messagePrefix + messageWinToAll.replace("<player>", winners.get(0).getDisplayName()));
  215.         // Выдача награды победителям, если я правильно понимаю логику
  216.         final String targetCommand = (String)commands.get(random.nextInt(commands.size()));
  217.         for(Player player : winners)
  218.         {
  219.             player.sendMessage(messagePrefix + messageWinToWinner);
  220.             final String command = targetCommand.replace("<player>", player.getName());
  221.             Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command);
  222.         }
  223.     }
  224. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement