Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package me.vynder.commandlottery;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Random;
- import java.util.logging.Logger;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.nio.channels.Channels;
- import org.bukkit.plugin.java.JavaPlugin;
- import org.bukkit.Bukkit;
- import org.bukkit.ChatColor;
- import org.bukkit.command.Command;
- import org.bukkit.command.CommandSender;
- import org.bukkit.configuration.InvalidConfigurationException;
- import org.bukkit.configuration.file.FileConfiguration;
- import org.bukkit.configuration.file.YamlConfiguration;
- import org.bukkit.entity.Player;
- public final class CommandLottery extends JavaPlugin
- {
- private final static Logger LOGGER = Bukkit.getLogger();
- private final File settingsConfigFile = new File(getDataFolder(), "config.yml");
- private final File languageConfigFile = new File(getDataFolder(), "language.yml");
- private final FileConfiguration settingsConfig = new YamlConfiguration();
- private final FileConfiguration languageConfig = new YamlConfiguration();
- private String messageLotteryStarts;
- private String messageTimeToStartLeft;
- private String messageWinToAll;
- private String messageWinToWinner;
- private String messageWinToAllMany;
- private String messagePrefix;
- private boolean isRepeatable;
- private int amountOfWinners;
- private int delay;
- private int timeBeforeBegin;
- private int minimalOnline;
- private int timerTaskId;
- private int timeRepeatableTaskId;
- private List<?> commands;
- private int _delayTime;
- @Override
- public void onLoad()
- {
- }
- @Override
- public void onEnable()
- {
- try
- {
- createConfigFiles();
- settingsConfig.load(settingsConfigFile);
- languageConfig.load(languageConfigFile);
- } catch(IOException | InvalidConfigurationException e) {
- }
- // Load all settings
- amountOfWinners = settingsConfig.getInt("Global.WinnersAmount");
- delay = settingsConfig.getInt("Global.Delay");
- timeBeforeBegin = settingsConfig.getInt("Global.TimeBeforeBegin");
- minimalOnline = settingsConfig.getInt("Global.MinimalOnline");
- commands = settingsConfig.getList("Commands");
- isRepeatable = settingsConfig.getBoolean("Global.RepeatEveryXTime");
- messageLotteryStarts = ChatColor.translateAlternateColorCodes('&', languageConfig.getString("Global.LotteryStarts"));
- messageTimeToStartLeft = ChatColor.translateAlternateColorCodes('&', languageConfig.getString("Global.LeftTime"));
- messageWinToAll = ChatColor.translateAlternateColorCodes('&', languageConfig.getString("Global.WinToAll"));
- messageWinToAllMany = ChatColor.translateAlternateColorCodes('&', languageConfig.getString("Global.WinToAllMany"));
- messageWinToWinner = ChatColor.translateAlternateColorCodes('&', languageConfig.getString("Global.WinWinner"));
- messagePrefix = ChatColor.translateAlternateColorCodes('&', languageConfig.getString("Global.Prefix"));
- if(isRepeatable)
- scheduleLottery(0, 0, false);
- }
- @Override
- public void onDisable()
- {
- Bukkit.getScheduler().cancelTasks(this);
- }
- private void createConfigFiles()
- {
- if(!settingsConfigFile.exists())
- {
- settingsConfigFile.getParentFile().mkdirs();
- extract(getResource("config.yml"), settingsConfigFile);
- }
- if(!languageConfigFile.exists())
- {
- languageConfigFile.getParentFile().mkdirs();
- extract(getResource("language.yml"), languageConfigFile);
- }
- }
- private void extract(InputStream in, File file)
- {
- try(FileOutputStream fos = new FileOutputStream(file))
- {
- fos.getChannel().transferFrom(Channels.newChannel(in), 0, Long.MAX_VALUE);
- } catch(IOException ex) {
- LOGGER.warning(ex.toString());
- }
- }
- @Override
- public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
- {
- if(cmd.getName().equalsIgnoreCase("lotterydraw"))
- {
- if(args.length != 2)
- return false;
- if(!args[0].isEmpty() && !args[1].isEmpty())
- {
- int timerToStart;
- int winrsAmt;
- try
- {
- timerToStart = Integer.parseInt(args[0]);
- winrsAmt = Integer.parseInt(args[1]);
- } catch(NumberFormatException e) {
- sender.sendMessage("Invalid argument!");
- return false;
- }
- if(winrsAmt < 0)
- return false;
- if(winrsAmt > Bukkit.getOnlinePlayers().size())
- {
- sender.sendMessage("Amount of winners is bigger than online players!");
- return true;
- }
- if(minimalOnline > Bukkit.getOnlinePlayers().size())
- {
- sender.sendMessage("Minimal online to draw is " + minimalOnline);
- return true;
- }
- scheduleLottery(timerToStart, winrsAmt, true);
- } else
- return false;
- return true;
- }
- return false;
- }
- private void scheduleLottery(final int delayTime, final int winnersAmount, final boolean manual)
- {
- cancelLottery();
- final Runnable runnable = new Runnable()
- {
- final int overrideMinimal = manual ? winnersAmount : minimalOnline;
- final int overrideWinners = manual ? winnersAmount : amountOfWinners;
- int idleSteps = manual ? 0 : timeBeforeBegin;
- int lotterySteps = manual ? delayTime : delay;
- boolean needToBeStarted = true;
- @Override
- public void run()
- {
- // Ожидание до начала лотереи
- if(idleSteps > 0)
- {
- idleSteps -= 1;
- return;
- }
- // Сообщение о начале лотереи или оставшемся времени
- if(lotterySteps > 0)
- {
- lotterySteps -= 1;
- if(needToBeStarted)
- {
- Bukkit.broadcastMessage(messagePrefix + messageLotteryStarts);
- needToBeStarted = false;
- } else
- Bukkit.broadcastMessage(messagePrefix + messageTimeToStartLeft.replace("<time>", Integer.toString(_delayTime)));
- return;
- }
- // Процедура розыгрыша лотереи
- drawLotteryBody(overrideWinners);
- // Назначение следующей лотереи, если нужно
- if(isRepeatable)
- scheduleLottery(timeBeforeBegin, amountOfWinners, false);
- else
- cancelLottery();
- }
- };
- timerTaskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(this, runnable, 20L, 20L);
- }
- private void cancelLottery()
- {
- if(timerTaskId != -1)
- {
- Bukkit.getScheduler().cancelTask(timerTaskId);
- timerTaskId = -1;
- }
- }
- private void drawLotteryBody(int winnersAmount)
- {
- // Генерация случайного списка выигравших
- final ArrayList<Player> winners = new ArrayList<>();
- final ArrayList<Player> players = new ArrayList<>();
- players.addAll(Bukkit.getOnlinePlayers());
- final Random random = new Random();
- for(int i = 0; i < winnersAmount && players.size() > 0; i++)
- try
- {
- int randomIndex = random.nextInt(players.size());
- winners.add(players.get(randomIndex));
- players.remove(randomIndex);
- } catch(IllegalArgumentException e) {
- LOGGER.info("Draw is unsuccessful, someone left the game!");
- }
- // Сообщение об выигравших
- if(winnersAmount > 1)
- {
- final StringBuilder formatted = new StringBuilder();
- for(Player player : winners)
- formatted.append(player.getDisplayName()).append(ChatColor.RESET).append(", ");
- Bukkit.broadcastMessage(messagePrefix + messageWinToAllMany.replace("<players>", formatted.toString()));
- } else
- Bukkit.broadcastMessage(messagePrefix + messageWinToAll.replace("<player>", winners.get(0).getDisplayName()));
- // Выдача награды победителям, если я правильно понимаю логику
- final String targetCommand = (String)commands.get(random.nextInt(commands.size()));
- for(Player player : winners)
- {
- player.sendMessage(messagePrefix + messageWinToWinner);
- final String command = targetCommand.replace("<player>", player.getName());
- Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement