diff --git a/src/main/java/igorlink/DonationAlerts/DonationAlerts.java b/src/main/java/igorlink/DonationAlerts/DonationAlerts.java index c4ca073..554679b 100644 --- a/src/main/java/igorlink/DonationAlerts/DonationAlerts.java +++ b/src/main/java/igorlink/DonationAlerts/DonationAlerts.java @@ -29,56 +29,35 @@ public DonationAlerts(String server) throws URISyntaxException { url = new URI(server); socket = IO.socket(url); - connectListener = new Listener() { - @Override - public void call(Object... arg0) { - logToConsole("Произведено успешное подключение!"); - } - }; - - disconectListener = new Listener() { - @Override - public void call(Object... arg0) { - logToConsole("Соединение разорвано!"); - } - }; - - donationListener = new Listener() { - @Override - public void call(Object... arg0) { + connectListener = arg0 -> logToConsole("Произведено успешное подключение!"); - JSONObject json = new JSONObject((String) arg0[0]); - json.toString(); - new BukkitRunnable() { - @Override - public void run() { + disconectListener = arg0 -> logToConsole("Соединение разорвано!"); - if ( (json.isNull("username")) || (json.isNull("amount_formatted"))) { - return; - } + donationListener = arg0 -> { + JSONObject json = new JSONObject((String) arg0[0]); + new BukkitRunnable() { + @Override + public void run() { + if ( (json.isNull("username")) || (json.isNull("amount_formatted"))) { + return; + } - if ((json.getString("amount_formatted")).length() <= 1) { - return; - } + if ((json.getString("amount_formatted")).length() <= 1) { + return; + } - DonationExecutor.getInstance().listOfStreamerPlayers - .addToDonationsQueue(new Donation(Bukkit.getConsoleSender(), - json.getString("username"), - json.getString("amount_formatted"), - json.getString("message"))); + DonationExecutor.getInstance().listOfStreamerPlayers + .addToDonationsQueue(new Donation(Bukkit.getConsoleSender(), + json.getString("username"), + json.getString("amount_formatted"), + json.getString("message"))); - } - }.runTask(Bukkit.getPluginManager().getPlugin("DonationExecutor")); + } + }.runTask(Bukkit.getPluginManager().getPlugin("DonationExecutor")); - } }; - errorListener = new Listener() { - @Override - public void call(Object... arg0) { - logToConsole("Произошла ошибка подключения к Donation Alerts!"); - } - }; + errorListener = arg0 -> logToConsole("Произошла ошибка подключения к Donation Alerts!"); socket.on(Socket.EVENT_CONNECT, connectListener) .on(Socket.EVENT_DISCONNECT, disconectListener) diff --git a/src/main/java/igorlink/command/AbstractCommand.java b/src/main/java/igorlink/command/AbstractCommand.java index d62bf86..2f36129 100644 --- a/src/main/java/igorlink/command/AbstractCommand.java +++ b/src/main/java/igorlink/command/AbstractCommand.java @@ -18,13 +18,8 @@ public AbstractCommand(String command) { public abstract Boolean execute(CommandSender sender, String label, String[] args); - @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - if (execute(sender, label, args)) { - return true; - } else { - return false; - } + return execute(sender, label, args); } } diff --git a/src/main/java/igorlink/command/DonateSubCommand.java b/src/main/java/igorlink/command/DonateSubCommand.java index 3e4c1b3..76d25f7 100644 --- a/src/main/java/igorlink/command/DonateSubCommand.java +++ b/src/main/java/igorlink/command/DonateSubCommand.java @@ -9,12 +9,9 @@ public static void onDonateCommand(CommandSender sender, String[] args) { int i; //Getting donation's amount - String donationAmount = new String(); - String donationUsername = new String(); - String donationMessage = new String(); - - //Getting donation's amount - donationAmount = args[0]; + String donationAmount = args[0]; + StringBuilder donationUsername = new StringBuilder(); + StringBuilder donationMessage = new StringBuilder(); //Получаем имя донатера for (i = 1; i <= args.length - 1; i++) { @@ -23,10 +20,10 @@ public static void onDonateCommand(CommandSender sender, String[] args) { } else { if (i==1) { - donationUsername = donationUsername + args[i]; + donationUsername.append(args[i]); } else { - donationUsername = ' ' + donationUsername + args[i]; + donationUsername.append(' ').append(donationUsername).append(args[i]); } } } @@ -34,10 +31,10 @@ public static void onDonateCommand(CommandSender sender, String[] args) { //Все, что после символов ## - это сообщение for (i = i+1; i <= args.length - 1; i++) { - donationMessage = donationMessage + args[i] + ' '; + donationMessage.append(donationMessage).append(args[i]).append(' '); } //Отправляем донат на исполнение - DonationExecutor.getInstance().listOfStreamerPlayers.addToDonationsQueue(new Donation(sender, donationUsername, donationAmount+".00", donationMessage)); + DonationExecutor.getInstance().listOfStreamerPlayers.addToDonationsQueue(new Donation(sender, donationUsername.toString(), donationAmount+".00", donationMessage.toString())); } } diff --git a/src/main/java/igorlink/command/DonationExecutorCommand.java b/src/main/java/igorlink/command/DonationExecutorCommand.java index fae90d7..2728769 100644 --- a/src/main/java/igorlink/command/DonationExecutorCommand.java +++ b/src/main/java/igorlink/command/DonationExecutorCommand.java @@ -21,35 +21,39 @@ public Boolean execute(CommandSender sender, String label, String[] args) { try { //Если команда - это reload, где не должно быть доп аргументов, то вызываем функцию релоуда конфига - if (args[0].equals("reload")) { - if (args.length == 1) { - ReloadSubCommand.onReloadCommand(sender); - return true; - } - } else if (args[0].equals("donate")) { - //Инициализируем список аргментов для новой сабфункции - //Если команда - donate, где нужен минимум 1 доп аргумент, создаем новый массив аргументов со смещением 1, и вызываем функцию обработки доната - if (args.length >= 2) { - //Инициализируем список новых аргументов для субкоманды - newArgs = new String[args.length - 1]; - //Создаем новый список аргументов, копируя старый со смещением 1 - System.arraycopy(args, 1, newArgs, 0, args.length - 1); - //Вызываем обработку доната - DonateSubCommand.onDonateCommand(sender, newArgs); - //Возвращаем true, к все прошло успешно - return true; - } - } else if (args[0].equals("filter")) { - if ((args.length == 2) && (args[1].equals("on")) || (args[1].equals("off"))) { - //Инициализируем список новых аргументов для субкоманды - newArgs = new String[args.length - 1]; - //Создаем новый список аргументов, копируя старый со смещением 1 - System.arraycopy(args, 1, newArgs, 0, args.length - 1); - //Вызываем обработку доната - FilterSubCommand.onFilterCommand(sender, newArgs); - //Возвращаем true, к все прошло успешно - return true; - } + switch (args[0].toLowerCase()) { + case "reload": + if (args.length == 1) { + ReloadSubCommand.onReloadCommand(sender); + return true; + } + break; + case "donate": + //Инициализируем список аргментов для новой сабфункции + //Если команда - donate, где нужен минимум 1 доп аргумент, создаем новый массив аргументов со смещением 1, и вызываем функцию обработки доната + if (args.length >= 2) { + //Инициализируем список новых аргументов для субкоманды + newArgs = new String[args.length - 1]; + //Создаем новый список аргументов, копируя старый со смещением 1 + System.arraycopy(args, 1, newArgs, 0, args.length - 1); + //Вызываем обработку доната + DonateSubCommand.onDonateCommand(sender, newArgs); + //Возвращаем true, к все прошло успешно + return true; + } + break; + case "filter": + if ((args.length == 2) && (args[1].equals("on")) || (args[1].equals("off"))) { + //Инициализируем список новых аргументов для субкоманды + newArgs = new String[args.length - 1]; + //Создаем новый список аргументов, копируя старый со смещением 1 + System.arraycopy(args, 1, newArgs, 0, args.length - 1); + //Вызываем обработку доната + FilterSubCommand.onFilterCommand(sender, newArgs); + //Возвращаем true, к все прошло успешно + return true; + } + break; } } catch (Exception e) { diff --git a/src/main/java/igorlink/command/FilterSubCommand.java b/src/main/java/igorlink/command/FilterSubCommand.java index b6c8402..e108272 100644 --- a/src/main/java/igorlink/command/FilterSubCommand.java +++ b/src/main/java/igorlink/command/FilterSubCommand.java @@ -8,7 +8,7 @@ public class FilterSubCommand { public static void onFilterCommand(CommandSender sender, String[] args) { - if (args[0].toLowerCase().equals("on")) { + if (args[0].equalsIgnoreCase("on")) { MainConfig.turnFilterOn(); Utils.logToConsole("Фильтр никнеймов донатеров §bВКЛЮЧЕН"); if (sender instanceof Player) { diff --git a/src/main/java/igorlink/donationexecutor/DonationExecutor.java b/src/main/java/igorlink/donationexecutor/DonationExecutor.java index ddca55b..efcb8b5 100644 --- a/src/main/java/igorlink/donationexecutor/DonationExecutor.java +++ b/src/main/java/igorlink/donationexecutor/DonationExecutor.java @@ -3,8 +3,10 @@ import igorlink.command.DonationExecutorCommand; import igorlink.donationexecutor.executionsstaff.GiantMobManager; import igorlink.donationexecutor.executionsstaff.ListOfStreamerPlayers; +import igorlink.donationexecutor.executionsstaff.StreamerPlayer; import igorlink.service.MainConfig; import org.bukkit.Bukkit; +import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; import igorlink.DonationAlerts.*; import java.net.URISyntaxException; @@ -60,5 +62,11 @@ public static DonationExecutor getInstance() { return instance; } + public StreamerPlayer getStreamerPlayer(String name) { + return listOfStreamerPlayers.getStreamerPlayer(name); + } + public StreamerPlayer getStreamerPlayer(Player player) { + return listOfStreamerPlayers.getStreamerPlayer(player.getName()); + } } diff --git a/src/main/java/igorlink/donationexecutor/EventListener.java b/src/main/java/igorlink/donationexecutor/EventListener.java index cf0748c..4299ecd 100644 --- a/src/main/java/igorlink/donationexecutor/EventListener.java +++ b/src/main/java/igorlink/donationexecutor/EventListener.java @@ -1,19 +1,23 @@ package igorlink.donationexecutor; +import igorlink.donationexecutor.executionsstaff.StreamerPlayer; import igorlink.service.Utils; +import org.bukkit.entity.Item; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.*; import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitTask; + +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import static igorlink.service.Utils.*; public class EventListener implements Listener { - private Map projectiles = new HashMap(); - //Отмена горения НКВДшников @EventHandler public void onComburst(EntityCombustEvent e){ @@ -27,8 +31,21 @@ public void onComburst(EntityCombustEvent e){ public void onJoin(PlayerJoinEvent e) { e.getPlayer().setResourcePack("https://download.mc-packs.net/pack/4923efe27212858f64c3ba65ff4bd35a42dadfb0.zip", Utils.decodeUsingBigInteger("4923efe27212858f64c3ba65ff4bd35a42dadfb0")); if (!isPluginActive) { - sendSysMsgToPlayer(e.getPlayer(), " плагин не активен. Укажите токен и свой никнейм в файле конфигурации плагина и перезапустите сервер."); + sendSysMsgToPlayer(e.getPlayer(), " Плагин не активен. Укажите токен и свой никнейм в файле конфигурации плагина и перезапустите сервер."); + } + } + + @EventHandler + private void onPlayerDeath(PlayerDeathEvent event) { + StreamerPlayer thisStreamerPlayer = DonationExecutor.getInstance().getStreamerPlayer(event.getPlayer().getName()); + List deathDrop = new ArrayList<>(); + if (event.getPlayer().getName().equals(thisStreamerPlayer.getName())) { + for (ItemStack i : event.getDrops()) { + deathDrop.add(event.getPlayer().getWorld().dropItemNaturally(event.getPlayer().getLocation(), i)); + } } + event.getDrops().clear(); + thisStreamerPlayer.setDeathDrop(deathDrop); } diff --git a/src/main/java/igorlink/donationexecutor/Executor.java b/src/main/java/igorlink/donationexecutor/Executor.java index 4ff2e9c..bba0976 100644 --- a/src/main/java/igorlink/donationexecutor/Executor.java +++ b/src/main/java/igorlink/donationexecutor/Executor.java @@ -1,21 +1,26 @@ package igorlink.donationexecutor; + +import igorlink.donationexecutor.executionsstaff.StreamerPlayer; +import igorlink.service.ItemStackUtils; import igorlink.service.MainConfig; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.chat.TextComponent; -import org.bukkit.*; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.World; import org.bukkit.attribute.Attribute; import org.bukkit.command.CommandSender; import org.bukkit.entity.*; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.Vector; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import static igorlink.service.Utils.*; -import static java.lang.Math.*; +import static java.lang.Math.random; +import static java.lang.Math.round; import static org.bukkit.Bukkit.getPlayer; public class Executor { @@ -27,35 +32,13 @@ public class Executor { public static void DoExecute(CommandSender sender, String streamerName, String donationUsername, String fullDonationAmount, String donationMessage, String executionName) { - - //Если имя донатера не указано - устанавливаем в качестве имени "Кто-то" - String _donationUsername; - if (donationUsername.equals("")) { - _donationUsername = "Кто-то"; - } else { - _donationUsername = donationUsername; - } - - Boolean canContinue = true; //Определяем игрока (если он оффлайн - не выполняем донат и пишем об этом в консоль), а также определяем мир, местоположение и направление игрока Player streamerPlayer = getPlayer(streamerName); - if (streamerPlayer == null) { - canContinue = false; - } else if (streamerPlayer.isDead()) { - canContinue = false; - } - - if (!canContinue) { + if (streamerPlayer == null || streamerPlayer.isDead()) { logToConsole("Донат от §b" + donationUsername + " §f в размере §b" + fullDonationAmount + "§f выполнен из-за того, что целевой стример был недоступен."); return; } - Location streamerPlayerLocation = streamerPlayer.getLocation(); - World world = streamerPlayer.getWorld(); - Vector direction = streamerPlayerLocation.getDirection(); - - //streamerPlayer.sendActionBar(donationMessage); - switch (executionName) { case "ShitToInventory": shitToInventory(streamerPlayer, donationUsername); @@ -106,73 +89,78 @@ public static void DoExecute(CommandSender sender, String streamerName, String d } + /*** + * TODO: Переделать челленджи на методы для экономии кода (ItemStackUtils), а также, рефакторинг. + * + * В целом, было бы круто написать абстрактный класс, а потом уже его унаследовать для каждого челленджа. + * Похожее ты сделал в классах на команды (DonateSubCommand) + * + * Иначе, тут всё выльется в: https://github.com/AceLewis/my_first_calculator.py/blob/master/my_first_calculator.py + */ - - - public static void shitToInventory (Player player, String donationUsername) { + public static void shitToInventory(Player player, String donationUsername) { announce(donationUsername, "насрал тебе в инвентарь", "насрал в инвентарь", player, true); - Material itemType = Material.DIRT; - ItemStack itemStack = new ItemStack(itemType, 64); - ItemMeta meta = itemStack.getItemMeta(); - meta.setDisplayName("§cГОВНО ОТ §f" + donationUsername.toUpperCase()); - meta.setLore(Arrays.asList("§7Это говно ужасно вонюче и занимает много места")); - itemStack.setItemMeta(meta); + ItemStack itemStack = ItemStackUtils.buildItem(Material.DIRT, 1, "§cГОВНО ОТ §f" + donationUsername.toUpperCase(), new String[]{"§7Это говно ужасно вонюче и занимает много места"}); for (int i = 0; i < MainConfig.dirtAmount; i++) { player.getInventory().addItem(itemStack); } } - public static void dropActiveItem (Player player, String donationUsername) { + public static void dropActiveItem(Player player, String donationUsername) { if (player.getEquipment().getItemInMainHand().getType() == Material.AIR) { announce(donationUsername, "безуспешно пытался выбить у тебя предмет из рук", "безуспешно пытался выбить предмет из рук", player, true); } else { announce(donationUsername, "выбил у тебя предмет из рук", "выбил предмет из рук", player, true); - ((HumanEntity) player).dropItem(true); + player.dropItem(true); player.updateInventory(); } } - public static void lesch (Player player, String donationUsername) { + public static void lesch(Player player, String donationUsername) { announce(donationUsername, "дал тебе леща", "дал леща", player, true); Vector direction = player.getLocation().getDirection(); direction.setY(0); direction.normalize(); direction.setY(0.3); player.setVelocity(direction.multiply(0.8)); - if (player.getHealth()>2.0D) { - player.setHealth(player.getHealth()-2); + if (player.getHealth() > 2.0D) { + player.setHealth(player.getHealth() - 2); } else { player.setHealth(0); } - ((org.bukkit.entity.Player) player).playSound(player.getLocation(), Sound.ENTITY_PLAYER_HURT, 1, 1); + player.playSound(player.getLocation(), Sound.ENTITY_PLAYER_HURT, 1, 1); } - public static void powerKick (Player player, String donationUsername) { + public static void powerKick(Player player, String donationUsername) { announce(donationUsername, "дал тебе смачного пинка под зад", "дал смачного пинка под зад", player, true); Vector direction = player.getLocation().getDirection(); direction.setY(0); direction.normalize(); direction.setY(0.5); player.setVelocity(direction.multiply(1.66)); - if (player.getHealth()>3.0D) { - player.setHealth(player.getHealth()-3); + if (player.getHealth() > 3.0D) { + player.setHealth(player.getHealth() - 3); } else { player.setHealth(0); } - ((org.bukkit.entity.Player) player).playSound(player.getLocation(), Sound.ENTITY_PLAYER_HURT, 1, 1); + player.playSound(player.getLocation(), Sound.ENTITY_PLAYER_HURT, 1, 1); } - public static void clearLastDeathDrop (Player player, String donationUsername) { + public static void clearLastDeathDrop(Player player, String donationUsername) { + StreamerPlayer streamerPlayer = DonationExecutor.getInstance().listOfStreamerPlayers.getStreamerPlayer(player.getName()); + if (streamerPlayer == null) + return; + //Remove Last Death Dropped Items - if (DonationExecutor.getInstance().listOfStreamerPlayers.getStreamerPlayer(player.getName()).removeDeathDrop()) { + if (streamerPlayer.removeDeathDrop()) { announce(donationUsername, "уничтожил твой посмертный дроп...", "уничтожил посмертный дроп", player, true); } else { announce(donationUsername, "безуспешно пытался уничтожить твой посмертный дроп...", "безуспешно пытался уничтожить посмертный дроп", player, true); } } - public static void spawnCreeper (Player player, String donationUsername) { + public static void spawnCreeper(Player player, String donationUsername) { //Spawn Creepers Vector direction = player.getLocation().getDirection(); announce(donationUsername, "прислал тебе в подарок крипера...", "прислал крипера в подарок", player, true); @@ -182,41 +170,26 @@ public static void spawnCreeper (Player player, String donationUsername) { } - public static void giveDiamonds (Player player, String donationUsername) { + public static void giveDiamonds(Player player, String donationUsername) { //Give some diamonds to the player announce(donationUsername, "насыпал тебе алмазов!", "насыпал алмазов", player, true); - Material itemType = Material.DIAMOND; - ItemStack itemStack = new ItemStack(itemType, MainConfig.diamondsAmount); - ItemMeta meta = itemStack.getItemMeta(); - meta.setDisplayName("§bАлмаз"); - meta.setLore(Arrays.asList("§7Эти алмазы подарил §f" + donationUsername)); - itemStack.setItemMeta(meta); - Item diamonds = player.getWorld().dropItemNaturally(player.getLocation(), itemStack); + ItemStack itemStack = ItemStackUtils.buildItem(Material.DIAMOND, Math.min(MainConfig.diamondsAmount, 64), "§bАлмаз", new String[]{"§7Эти алмазы подарил §f" + donationUsername}); + player.getWorld().dropItemNaturally(player.getLocation(), itemStack); } - public static void giveStackOfDiamonds (Player player, String donationUsername) { + public static void giveStackOfDiamonds(Player player, String donationUsername) { announce(donationUsername, "насыпал тебе алмазов!", "насыпал алмазов", player, true); - Material itemType = Material.DIAMOND; - ItemStack itemStack = new ItemStack(itemType, 64); - ItemMeta meta = itemStack.getItemMeta(); - meta.setDisplayName("§bАлмаз"); - meta.setLore(Arrays.asList("§7Эти алмазы подарил §f" + donationUsername)); - itemStack.setItemMeta(meta); - Item diamonds = player.getWorld().dropItemNaturally(player.getLocation(), itemStack); + ItemStack itemStack = ItemStackUtils.buildItem(Material.DIAMOND, 64, "§bАлмаз", new String[]{"§7Эти алмазы подарил §f" + donationUsername}); + player.getWorld().dropItemNaturally(player.getLocation(), itemStack); } - public static void giveBread (Player player, String donationUsername) { + public static void giveBread(Player player, String donationUsername) { announce(donationUsername, "дал тебе хлеба!", "дал хлеба", player, true); - Material itemType = Material.BREAD; - ItemStack itemStack = new ItemStack(itemType, 4); - ItemMeta meta = itemStack.getItemMeta(); - meta.setDisplayName("§bХлеб"); - meta.setLore(Arrays.asList("§7Этот хлеб подарил §f" + donationUsername)); - itemStack.setItemMeta(meta); - Item bread = player.getWorld().dropItemNaturally(player.getLocation(), itemStack); + ItemStack itemStack = ItemStackUtils.buildItem(Material.BREAD, 4, "§bХлеб", new String[]{"§7Этот хлеб подарил §f" + donationUsername}); + player.getWorld().dropItemNaturally(player.getLocation(), itemStack); } - public static void callNKVD (Player player, String donationUsername) { + public static void callNKVD(Player player, String donationUsername) { Vector direction = player.getLocation().getDirection(); LivingEntity nkvdMob; announce(donationUsername, "хочет отправить тебя в ГУЛАГ!", "хочет отправить в ГУЛАГ", player, true); @@ -235,18 +208,18 @@ public static void callNKVD (Player player, String donationUsername) { } - public static void callStalin (Player player, String donationUsername) { + public static void callStalin(Player player, String donationUsername) { announce(donationUsername, "призвал Сталина разобраться с тобой!", "призвал Сталина разобраться с", player, true); DonationExecutor.giantMobManager.addMob(player.getLocation(), "§cИосиф Сталин"); } - public static void randomChange (Player player, String donationUsername) { + public static void randomChange(Player player, String donationUsername) { announce(donationUsername, "подменил тебе кое-что на камни...", "призвал Сталина разобраться с", player, true); int[] randoms = new int[5]; for (int i = 0; i <= 4; i++) { int temp = 0; - Boolean isUnique = false; + boolean isUnique = false; while (!isUnique) { temp = (int) (round(random() * 35)); isUnique = true; @@ -262,35 +235,40 @@ public static void randomChange (Player player, String donationUsername) { } - String replacedItems = new String(""); + StringBuilder replacedItems = new StringBuilder(); int replacedCounter = 0; for (int i = 0; i <= 4; i++) { if (!(player.getInventory().getItem(randoms[i]) == null)) { replacedCounter++; if (replacedCounter > 1) { - replacedItems = replacedItems + "§f, "; + replacedItems.append("§f, "); } - replacedItems = replacedItems + "§b" + player.getInventory().getItem(randoms[i]).getAmount() + " §f" + player.getInventory().getItem(randoms[i]).getI18NDisplayName().toString(); + replacedItems.append("§b").append(player.getInventory().getItem(randoms[i]).getAmount()).append(" §f").append(player.getInventory().getItem(randoms[i]).getI18NDisplayName()); } player.getInventory().setItem(randoms[i], new ItemStack(Material.STONE, 1)); } if (replacedCounter == 0) { - sendSysMsgToPlayer(player,"§cТебе повезло: все камни попали в пустые слоты!"); + sendSysMsgToPlayer(player, "§cТебе повезло: все камни попали в пустые слоты!"); } else { - sendSysMsgToPlayer(player,"§cБыли заменены следующие предметусы: §f" + replacedItems); + sendSysMsgToPlayer(player, "§cБыли заменены следующие предметусы: §f" + replacedItems); } } - public static void halfHeart (Player player, String donationUsername) { + public static void halfHeart(Player player, String donationUsername) { player.setHealth(1); announce(donationUsername, "оставил тебе лишь полсердечка...", "оставил лишь полсердечка", player, true); } - public static void tamedBecomesEnemies (Player player, String donationUsername) { + public static void tamedBecomesEnemies(Player player, String donationUsername) { announce(donationUsername, "настроил твоих питомцев против тебя!", "настроил прирученных питомцев против", player, true); for (Entity e : player.getWorld().getEntitiesByClasses(Wolf.class, Cat.class)) { - if (((Tameable) e).isTamed() && ((Tameable) e).getOwner().getName().equals(player.getName())) { + if (!(e instanceof Tameable) || e.isDead()) + continue; + + Tameable tameable = (Tameable) e; + if (tameable.isTamed() && tameable.getOwner() != null && + tameable.getOwner().getName().equals(player.getName())) { if (e instanceof Cat) { ((Tameable) e).setOwner(null); ((Cat) e).setSitting(false); @@ -305,7 +283,7 @@ public static void tamedBecomesEnemies (Player player, String donationUsername) } } - public static void bigBoom (Player player, String donationUsername) { + public static void bigBoom(Player player, String donationUsername) { announce(donationUsername, "сейчас тебя РАЗНЕСЕТ В КЛОЧЬЯ!!!", "сейчас РАЗНЕСЕТ В КЛОЧЬЯ", player, true); player.getWorld().createExplosion(player.getLocation(), MainConfig.bigBoomRadius, true); diff --git a/src/main/java/igorlink/donationexecutor/executionsstaff/Donation.java b/src/main/java/igorlink/donationexecutor/executionsstaff/Donation.java index 6a33bda..fc310d0 100644 --- a/src/main/java/igorlink/donationexecutor/executionsstaff/Donation.java +++ b/src/main/java/igorlink/donationexecutor/executionsstaff/Donation.java @@ -16,7 +16,7 @@ public Donation(String _username, String _amount, String _message) { public Donation(CommandSender _sender, String _username, String _amount, String _message) { sender = _sender; - if (_username.equals("")) { + if (_username == null || _username.equals("")) { username = "Аноним"; } else { username = _username; @@ -41,11 +41,11 @@ public String getMessage() { return message; } - public String getexecutionName() { + public String getExecutionName() { return executionName; } - public void setexecutionName(String _executionName) { + public void setExecutionName(String _executionName) { executionName = _executionName; } diff --git a/src/main/java/igorlink/donationexecutor/executionsstaff/GiantMobManager.java b/src/main/java/igorlink/donationexecutor/executionsstaff/GiantMobManager.java index 082ee21..d6d42e6 100644 --- a/src/main/java/igorlink/donationexecutor/executionsstaff/GiantMobManager.java +++ b/src/main/java/igorlink/donationexecutor/executionsstaff/GiantMobManager.java @@ -1,29 +1,30 @@ package igorlink.donationexecutor.executionsstaff; + import com.destroystokyo.paper.event.entity.EntityAddToWorldEvent; import com.destroystokyo.paper.event.entity.EntityRemoveFromWorldEvent; import igorlink.donationexecutor.DonationExecutor; +import igorlink.service.ItemStackUtils; import io.papermc.paper.event.entity.EntityMoveEvent; import org.bukkit.*; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.plugin.Plugin; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.RayTraceResult; import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; + import java.util.*; -import static igorlink.service.Utils.*; +import static igorlink.service.Utils.genVec; import static java.lang.Math.sqrt; import static org.bukkit.Bukkit.getPlayer; -import org.bukkit.event.Listener; - public class GiantMobManager { private HashMap listOfMobLists = new HashMap(); private HashMap listOfGiantMob = new HashMap(); @@ -33,14 +34,14 @@ public class GiantMobManager { //Конструктор класса. Регистрируем в нем слушателя событий GiantEventListener public GiantMobManager(Plugin thisPlugin) { - Bukkit.getPluginManager().registerEvents(new GiantMobEventListener(this), thisPlugin); - for (Player p : Bukkit.getOnlinePlayers()) { - for (Entity ent : p.getWorld().getEntities()) { - if (ent instanceof Giant) { - this.addMob((LivingEntity) ent); - } + Bukkit.getPluginManager().registerEvents(new GiantMobEventListener(this), thisPlugin); + for (Player p : Bukkit.getOnlinePlayers()) { + for (Entity ent : p.getWorld().getEntities()) { + if (ent instanceof Giant) { + this.addMob((LivingEntity) ent); } } + } } @@ -68,12 +69,10 @@ public void removeMob(@NotNull LivingEntity giantMob) { //Добавляем моба в оответствующий его типу список private void addMobToList(@NotNull GiantMob newGiantMob) { - if (listOfMobLists.containsKey(newGiantMob.getName())) { - listOfMobLists.get(newGiantMob.getName()).put(newGiantMob.getUUID(), newGiantMob); - } else { + if (!listOfMobLists.containsKey(newGiantMob.getName())) { listOfMobLists.put(newGiantMob.getName(), new HashMap()); - listOfMobLists.get(newGiantMob.getName()).put(newGiantMob.getUUID(), newGiantMob); } + listOfMobLists.get(newGiantMob.getName()).put(newGiantMob.getUUID(), newGiantMob); } @@ -91,7 +90,7 @@ private class GiantMob { private int timesThisGiantMobIsOnOnePlace = 0; private String thisGiantMobPlayerCurrentTargetName = null; private int stepsAfterHiding = 0; - private LivingEntity giantMobLivingEntity = null; + private LivingEntity giantMobLivingEntity; private UUID thisGiantMobUUID = null; final private int howManySnowballsMobLaunches = 4; @@ -112,8 +111,9 @@ public GiantMob(@NotNull Location playerLocation, String mobName) { playerDirection.setY(0); playerDirection.normalize(); this.giantMobLivingEntity = (LivingEntity) playerLocation.getWorld().spawnEntity(playerLocation.clone().add(playerDirection.clone().multiply(5)).setDirection(playerDirection.multiply(-1)), EntityType.GIANT); - if (!(mobName == null)) { + if ((mobName != null)) { this.giantMobLivingEntity.setCustomName(mobName); + this.giantMobLivingEntity.setCustomNameVisible(true); } this.giantMobLivingEntity.setGravity(true); this.giantMobLivingEntity.setRemoveWhenFarAway(false); @@ -153,42 +153,30 @@ public UUID getUUID() { //Поиск ближайшей цели private LivingEntity findGiantMobTarget() { //получаем список ближайших врагов dв радиусе sralinShootingRadius - Double sralinShootingRadius = (double) giantMobTrackingRange; + double sralinShootingRadius = giantMobTrackingRange; List listOfNearbyEntities = giantMobLivingEntity.getNearbyEntities(sralinShootingRadius, sralinShootingRadius, sralinShootingRadius); List listOfNearbyPlayers = new ArrayList<>(); List listOfNearbyLivingEntities = new ArrayList<>(); //Пробегаемся и ищем игроков for (Entity e : listOfNearbyEntities) { - RayTraceResult rtRes1 = null; - RayTraceResult rtRes2 = null; - RayTraceResult rtRes3 = null; - RayTraceResult rtRes4 = null; - RayTraceResult rtRes5 = null; - RayTraceResult rtRes6 = null; - RayTraceResult rtRes7 = null; - RayTraceResult rtRes8 = null; + List rtRes = new ArrayList<>(); if (e instanceof LivingEntity) { //Позиции псевдоглаз вокруг головы с каждой стороны - Location rtGiantMobPseudoEyesPos1 = giantMobLivingEntity.getLocation().clone().add(2, 11, 0); - Location rtGiantMobPseudoEyesPos2 = giantMobLivingEntity.getLocation().clone().add(-2, 11, 0); - Location rtGiantMobPseudoEyesPos3 = giantMobLivingEntity.getLocation().clone().add(0, 11, 2); - Location rtGiantMobPseudoEyesPos4 = giantMobLivingEntity.getLocation().clone().add(0, 11, -2); - - //Пускаем лучи из каждой точки псевдоглаз до верха и низа каждой сущности - rtRes1 = giantMobLivingEntity.getWorld().rayTraceBlocks(rtGiantMobPseudoEyesPos1, genVec(rtGiantMobPseudoEyesPos1, ((LivingEntity) e).getEyeLocation()), rtGiantMobPseudoEyesPos1.distance(((LivingEntity) e).getEyeLocation()), FluidCollisionMode.NEVER, true); - rtRes2 = giantMobLivingEntity.getWorld().rayTraceBlocks(rtGiantMobPseudoEyesPos2, genVec(rtGiantMobPseudoEyesPos2, ((LivingEntity) e).getEyeLocation()), rtGiantMobPseudoEyesPos2.distance(((LivingEntity) e).getEyeLocation()), FluidCollisionMode.NEVER, true); - rtRes3 = giantMobLivingEntity.getWorld().rayTraceBlocks(rtGiantMobPseudoEyesPos3, genVec(rtGiantMobPseudoEyesPos3, ((LivingEntity) e).getEyeLocation()), rtGiantMobPseudoEyesPos3.distance(((LivingEntity) e).getEyeLocation()), FluidCollisionMode.NEVER, true); - rtRes4 = giantMobLivingEntity.getWorld().rayTraceBlocks(rtGiantMobPseudoEyesPos4, genVec(rtGiantMobPseudoEyesPos4, ((LivingEntity) e).getEyeLocation()), rtGiantMobPseudoEyesPos4.distance(((LivingEntity) e).getEyeLocation()), FluidCollisionMode.NEVER, true); - rtRes5 = giantMobLivingEntity.getWorld().rayTraceBlocks(rtGiantMobPseudoEyesPos1, genVec(rtGiantMobPseudoEyesPos1, ((LivingEntity) e).getLocation()), rtGiantMobPseudoEyesPos1.distance(((LivingEntity) e).getLocation()), FluidCollisionMode.NEVER, true); - rtRes6 = giantMobLivingEntity.getWorld().rayTraceBlocks(rtGiantMobPseudoEyesPos2, genVec(rtGiantMobPseudoEyesPos2, ((LivingEntity) e).getLocation()), rtGiantMobPseudoEyesPos2.distance(((LivingEntity) e).getLocation()), FluidCollisionMode.NEVER, true); - rtRes7 = giantMobLivingEntity.getWorld().rayTraceBlocks(rtGiantMobPseudoEyesPos3, genVec(rtGiantMobPseudoEyesPos3, ((LivingEntity) e).getLocation()), rtGiantMobPseudoEyesPos3.distance(((LivingEntity) e).getLocation()), FluidCollisionMode.NEVER, true); - rtRes8 = giantMobLivingEntity.getWorld().rayTraceBlocks(rtGiantMobPseudoEyesPos4, genVec(rtGiantMobPseudoEyesPos4, ((LivingEntity) e).getLocation()), rtGiantMobPseudoEyesPos4.distance(((LivingEntity) e).getLocation()), FluidCollisionMode.NEVER, true); + List rtGiantMobPseudoEyesPos = Arrays.asList( + giantMobLivingEntity.getLocation().clone().add(2, 11, 0), + giantMobLivingEntity.getLocation().clone().add(-2, 11, 0), + giantMobLivingEntity.getLocation().clone().add(0, 11, 2), + giantMobLivingEntity.getLocation().clone().add(0, 11, -2)); + + for (int i = 0; i <= 7; i++) { + rtRes.add(giantMobLivingEntity.getWorld().rayTraceBlocks(rtGiantMobPseudoEyesPos.get(i % 4), genVec(rtGiantMobPseudoEyesPos.get(i % 4), ((LivingEntity) e).getEyeLocation()), rtGiantMobPseudoEyesPos.get(i % 4).distance(((LivingEntity) e).getEyeLocation()), FluidCollisionMode.NEVER, true)); + } //Если Сталин может из любой позиции поврота голвоы увидеть верх или низ цели, то эта цель вносится в список кандидатов - if ((rtRes1 == null) || (rtRes2 == null) || (rtRes3 == null) || (rtRes4 == null) || (rtRes5 == null) || (rtRes6 == null) || (rtRes7 == null) || (rtRes8 == null)) { - if ((e instanceof Player) && (!(((Player) e).getGameMode() == GameMode.SPECTATOR)) && (!(((Player) e).getGameMode() == GameMode.CREATIVE))) { + if (rtRes.stream().anyMatch(Objects::isNull)) { + if ((e instanceof Player) && ((Player) e).getGameMode() != GameMode.SPECTATOR && ((Player) e).getGameMode() != GameMode.CREATIVE) { listOfNearbyPlayers.add((LivingEntity) e); } else if (!(e instanceof Player)) { listOfNearbyLivingEntities.add((LivingEntity) e); @@ -206,10 +194,7 @@ private LivingEntity findGiantMobTarget() { //Если есть игроки - ищем среди них ближайшего for (LivingEntity e : listOfNearbyPlayers) { - if (target == null) { - target = e; - minDistance = giantMobLivingEntity.getLocation().distance(e.getLocation()); - } else if (minDistance > giantMobLivingEntity.getLocation().distance(e.getLocation())) { + if (target == null || minDistance > giantMobLivingEntity.getLocation().distance(e.getLocation())) { target = e; minDistance = giantMobLivingEntity.getLocation().distance(e.getLocation()); } @@ -221,32 +206,31 @@ private LivingEntity findGiantMobTarget() { thisGiantMobPlayerCurrentTargetName = target.getName(); } - } else if (!(listOfNearbyLivingEntities.isEmpty())) { - //Если игроков рядом не было, проверяем все живые сущности - for (LivingEntity e : listOfNearbyLivingEntities) { - if (target == null) { - target = e; - minDistance = this.giantMobLivingEntity.getLocation().distance(e.getLocation()); - } else if (minDistance > this.giantMobLivingEntity.getLocation().distance(e.getLocation())) { - target = e; - minDistance = this.giantMobLivingEntity.getLocation().distance(e.getLocation()); - } + } else if (!(listOfNearbyLivingEntities.isEmpty())) { + //Если игроков рядом не было, проверяем все живые сущности + for (LivingEntity e : listOfNearbyLivingEntities) { + if (target == null || minDistance > this.giantMobLivingEntity.getLocation().distance(e.getLocation())) { + target = e; + minDistance = this.giantMobLivingEntity.getLocation().distance(e.getLocation()); } + } } - if ( (!(target instanceof Player)) && (!(thisGiantMobPlayerCurrentTargetName == null)) ) { + if ((!(target instanceof Player)) && ((thisGiantMobPlayerCurrentTargetName != null))) { //Если прошлая цель-игрок существует, и он не мертв и находится в том же мире, что и наш моб - if ( (!(getPlayer(thisGiantMobPlayerCurrentTargetName).isDead())) && (getPlayer(thisGiantMobPlayerCurrentTargetName).getWorld() == giantMobLivingEntity.getWorld()) ) { + Player p = getPlayer(thisGiantMobPlayerCurrentTargetName); + if (p != null && (!p.isDead()) && (p.getWorld().equals(giantMobLivingEntity.getWorld()))) { //Если не подошло время забыть о нем и он не стал спектэйтором, фокусим моба на него - if ((stepsAfterHiding <= timeBeforeThisGiantMobForgetHisTarget * 2) && (!(getPlayer(thisGiantMobPlayerCurrentTargetName).getGameMode()==GameMode.SPECTATOR)) && (!(getPlayer(thisGiantMobPlayerCurrentTargetName).getGameMode()==GameMode.CREATIVE))){ - target = getPlayer(thisGiantMobPlayerCurrentTargetName); + if ((stepsAfterHiding <= timeBeforeThisGiantMobForgetHisTarget * 2) && (!(p.getGameMode() == GameMode.SPECTATOR)) && (!(p.getGameMode() == GameMode.CREATIVE))) { stepsAfterHiding++; } else { //если подошло время забыть про него - забываем stepsAfterHiding = 0; thisGiantMobPlayerCurrentTargetName = null; + + return p; } } @@ -272,10 +256,9 @@ private void forceGiantMobToMove() { public void run() { LivingEntity thisGiantMobLivingEntity = thisGiantMob.giantMobLivingEntity; - if ( (thisGiantMobLivingEntity.isDead()) || (!(DonationExecutor.isRunning)) ) { + if ((thisGiantMobLivingEntity.isDead()) || (!(DonationExecutor.isRunning))) { //Если Сталин уже помер, отрубаем задание this.cancel(); - return; } else { //Если не помер, находим ближайшую цель (игроки в приоритете) LivingEntity target; @@ -284,7 +267,7 @@ public void run() { //Если цели нет... if (target == null) { //Если моб не в воде, то прижимаем его к Земле, чтобы не улетел в небо на прыжке - if (!(thisGiantMobLivingEntity.getEyeLocation().clone().add(0,2,0).getBlock().getType()==Material.WATER)) { + if (!(thisGiantMobLivingEntity.getEyeLocation().clone().add(0, 2, 0).getBlock().getType() == Material.WATER)) { thisGiantMobLivingEntity.setVelocity(thisGiantMobLivingEntity.getLocation().getDirection().clone().normalize().setY(-4.5)); } else { //сли над мобом вода - всплываем @@ -335,7 +318,7 @@ public void run() { double oldZ = thisGiantMobLoc.getZ(); //sendSysMsgToPlayer(Bukkit.getPlayer("Evropejets"), "ДВИЖЕНИЕ! До цели " + (int) (Math.round(thisGiantMobLoc.distance(target.getLocation()))) + "\nЦЕЛЬ: " + target.getName()); //Стандартное движение к цели, если она за радиусом досягаемости - if (!(thisGiantMobLivingEntity.getEyeLocation().clone().add(0,1,0).getBlock().getType()==Material.WATER)) { + if (!(thisGiantMobLivingEntity.getEyeLocation().clone().add(0, 1, 0).getBlock().getType() == Material.WATER)) { thisGiantMobLivingEntity.setRemainingAir(thisGiantMobLivingEntity.getMaximumAir()); thisGiantMobLivingEntity.setVelocity(thisGiantMobLoc.getDirection().clone().normalize().setY(-4.5)); } else { @@ -347,7 +330,7 @@ public void run() { @Override public void run() { - if ( (thisGiantMobLivingEntity.isDead()) || (!(DonationExecutor.isRunning)) ) { + if ((thisGiantMobLivingEntity.isDead()) || (!(DonationExecutor.isRunning))) { this.cancel(); return; } @@ -401,7 +384,7 @@ public void run() { LivingEntity thisGiantMobLivingEntity = thisGiantMob.giantMobLivingEntity; //Если моб уже не существует, отменяем стрельбу - if ((thisGiantMobLivingEntity.isDead()) || (!(DonationExecutor.isRunning)) ) { + if ((thisGiantMobLivingEntity.isDead()) || (!(DonationExecutor.isRunning))) { this.cancel(); return; } @@ -434,7 +417,7 @@ public void run() { LivingEntity thisGiantMobLivingEntity = thisGiantMob.giantMobLivingEntity; //Если моб уже не существует, отменяем стрельбу - if ( (thisGiantMobLivingEntity.isDead()) || (!(DonationExecutor.isRunning)) ) { + if ((thisGiantMobLivingEntity.isDead()) || (!(DonationExecutor.isRunning))) { this.cancel(); return; } @@ -453,7 +436,7 @@ public void run() { new BukkitRunnable() { @Override public void run() { - if ( (thisGiantMob.giantMobLivingEntity.isDead()) || (!(DonationExecutor.isRunning)) ) { + if ((thisGiantMob.giantMobLivingEntity.isDead()) || (!(DonationExecutor.isRunning))) { this.cancel(); return; } @@ -463,10 +446,7 @@ public void run() { snowball = (Snowball) thisGiantMobLivingEntity.getWorld().spawnEntity(handHeightPoint.clone() .add(handHeightPoint.getDirection().rotateAroundY(0.7).multiply(3.5)), EntityType.SNOWBALL); - ItemStack itemStack = new ItemStack(Material.SNOWBALL, 1); - ItemMeta meta = snowball.getItem().getItemMeta(); - meta.setLore(Arrays.asList("Stalinball")); - itemStack.setItemMeta(meta); + ItemStack itemStack = ItemStackUtils.buildItem(Material.SNOWBALL, 1, "&b&lStalinball", new String[0]); snowball.setItem(itemStack); snowball.setVelocity(genVec(snowball.getLocation(), finalTarget.getEyeLocation()).multiply(2.2)); snowball.getWorld().playSound(snowball.getLocation(), Sound.ENTITY_DRAGON_FIREBALL_EXPLODE, 3, 2); @@ -476,9 +456,8 @@ public void run() { new BukkitRunnable() { @Override public void run() { - if ( (snowball.isDead()) || finalTarget.isDead() || (!(finalTarget.getWorld() == snowball.getWorld())) || (!(DonationExecutor.isRunning)) ) { + if ((snowball.isDead()) || finalTarget.isDead() || (!(finalTarget.getWorld() == snowball.getWorld())) || (!(DonationExecutor.isRunning))) { this.cancel(); - return; } else { snowball.setVelocity(genVec(snowball.getLocation(), finalTarget.getEyeLocation())); } @@ -500,9 +479,10 @@ public void run() { //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //Проверка всех добавлений и удалений из мира, чтобы ловить и упаковывать подходящих гигантов или удалять их из списка - private class GiantMobEventListener implements Listener{ + private class GiantMobEventListener implements Listener { GiantMobManager thisInstanceOfGiantMobManager; + private GiantMobEventListener(GiantMobManager _thisInstanceOfGiantMobManager) { thisInstanceOfGiantMobManager = _thisInstanceOfGiantMobManager; } @@ -522,14 +502,13 @@ private void onGiantMobRemoveFromWorld(EntityRemoveFromWorldEvent e) { } @EventHandler - public void onGiantMobDamage(EntityDamageEvent e){ + public void onGiantMobDamage(EntityDamageEvent e) { //Нашему мобу отменяем дамаг от падения - if ( (e.getEntity() instanceof Giant) && ((e.getCause() == EntityDamageEvent.DamageCause.FALL) || (e.getCause() == EntityDamageEvent.DamageCause.BLOCK_EXPLOSION) || (e.getCause() == EntityDamageEvent.DamageCause.FIRE) || (e.getCause() == EntityDamageEvent.DamageCause.FIRE_TICK))) { + if ((e.getEntity() instanceof Giant) && ((e.getCause() == EntityDamageEvent.DamageCause.FALL) || (e.getCause() == EntityDamageEvent.DamageCause.BLOCK_EXPLOSION) || (e.getCause() == EntityDamageEvent.DamageCause.FIRE) || (e.getCause() == EntityDamageEvent.DamageCause.FIRE_TICK))) { e.setCancelled(true); - // sendSysMsgToPlayer(getPlayer(Executor.nameOfStreamerPlayer), "Cancelled DMG from: " + e.getCause().toString()); - } else if (e.getEntity() instanceof Giant) { - // sendSysMsgToPlayer(getPlayer(Executor.nameOfStreamerPlayer), "Passed DMG from: " + e.getCause().toString()); + // sendSysMsgToPlayer(getPlayer(Executor.nameOfStreamerPlayer), "Cancelled DMG from: " + e.getCause().toString()); } + // sendSysMsgToPlayer(getPlayer(Executor.nameOfStreamerPlayer), "Passed DMG from: " + e.getCause().toString()); } @EventHandler @@ -538,8 +517,8 @@ public void onProjectileHit(ProjectileHitEvent e) { if ((e.getHitEntity()) instanceof LivingEntity) { - if (((LivingEntity) e.getHitEntity()).getHealth()>1) { - ((LivingEntity) e.getHitEntity()).setHealth(((LivingEntity) e.getHitEntity()).getHealth()-1); + if (((LivingEntity) e.getHitEntity()).getHealth() > 1) { + ((LivingEntity) e.getHitEntity()).setHealth(((LivingEntity) e.getHitEntity()).getHealth() - 1); } else { ((LivingEntity) e.getHitEntity()).setHealth(0); } @@ -558,7 +537,7 @@ public void onProjectileHit(ProjectileHitEvent e) { @EventHandler - public void onComeTooClose(EntityMoveEvent e){ + public void onComeTooClose(EntityMoveEvent e) { //дать пинка, если слишком близок к Сталину if (e.getEntity() instanceof Giant) { for (Entity ent : e.getEntity().getNearbyEntities(1.9, 4, 1.9)) { diff --git a/src/main/java/igorlink/donationexecutor/executionsstaff/ListOfStreamerPlayers.java b/src/main/java/igorlink/donationexecutor/executionsstaff/ListOfStreamerPlayers.java index f6d44aa..71dc1c2 100644 --- a/src/main/java/igorlink/donationexecutor/executionsstaff/ListOfStreamerPlayers.java +++ b/src/main/java/igorlink/donationexecutor/executionsstaff/ListOfStreamerPlayers.java @@ -4,8 +4,10 @@ import igorlink.donationexecutor.Executor; import igorlink.service.Utils; import org.bukkit.Bukkit; +import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import org.jetbrains.annotations.NotNull; + import java.util.ArrayList; import java.util.List; @@ -23,20 +25,18 @@ public void run() { } for (StreamerPlayer sp : listOfStreamerPlayers) { - if ( !(Bukkit.getPlayer(sp.getName()) == null) ) { - if (!(Bukkit.getPlayer(sp.getName()).isDead())) { - Donation donation = sp.takeDonationFromQueue(); - if (donation==null) { - continue; - } - Utils.logToConsole("Отправлен на выполнение донат §b" + donation.getexecutionName() + "§f для стримера §b" + sp.getName() + "§f от донатера §b" + donation.getName()); - Executor.DoExecute(donation.getSender(), sp.getName(), donation.getName(), donation.getAmount(), donation.getMessage(), donation.getexecutionName()); + Player p = Bukkit.getPlayer(sp.getName()); + if (p != null && !p.isDead()) { + Donation donation = sp.takeDonationFromQueue(); + if (donation == null) { + continue; } + Utils.logToConsole("Отправлен на выполнение донат §b" + donation.getExecutionName() + "§f для стримера §b" + sp.getName() + "§f от донатера §b" + donation.getName()); + Executor.DoExecute(donation.getSender(), sp.getName(), donation.getName(), donation.getAmount(), donation.getMessage(), donation.getExecutionName()); } - } } - }.runTaskTimer(DonationExecutor.getInstance(), 0, 40); + }.runTaskTimer(DonationExecutor.getInstance(), 0, 40L); } public int getNumberOfStreamers() { @@ -67,8 +67,8 @@ public void addToDonationsQueue(Donation donation) { String execution; for (StreamerPlayer sp : listOfStreamerPlayers) { execution = sp.checkExecution(Utils.cutOffKopeykis(donation.getAmount())); - if (!(execution == null)) { - donation.setexecutionName(execution); + if ((execution != null)) { + donation.setExecutionName(execution); sp.putDonationToQueue(donation); Utils.logToConsole("Донат от §b" + donation.getName() + "§f в размере §b" + donation.getAmount() + " руб.§f был обработан и отправлен в очередь на выполнение."); return; diff --git a/src/main/java/igorlink/donationexecutor/executionsstaff/StreamerPlayer.java b/src/main/java/igorlink/donationexecutor/executionsstaff/StreamerPlayer.java index 2d89de3..6d7e5a0 100644 --- a/src/main/java/igorlink/donationexecutor/executionsstaff/StreamerPlayer.java +++ b/src/main/java/igorlink/donationexecutor/executionsstaff/StreamerPlayer.java @@ -19,21 +19,18 @@ public class StreamerPlayer { private String streamerPlayerName; private List listOfDeathDropItems = new ArrayList(); private Queue listOfQueuedDonations = new LinkedList(); - private HashMap listOfAmounts = new HashMap(); + private HashMap listOfAmounts = new HashMap(); //Инициализация нового объекта стримера-игрока public StreamerPlayer(@NotNull String _streamerPlayerName) { FileConfiguration config = MainConfig.getConfig(); streamerPlayerName = _streamerPlayerName; - Bukkit.getPluginManager().registerEvents(new PlayerDeathListener(this), DonationExecutor.getInstance()); - //Заполняем список сумм для донатов - String amount; for (String execName : Executor.executionsList) { - amount = config.getString("DonationAmounts." + streamerPlayerName + "." + execName); - if (!(amount==null)) { + int amount = config.getInt("DonationAmounts." + streamerPlayerName + "." + execName); + if (amount != 0) { listOfAmounts.put(amount, execName); } else { Utils.logToConsole("Сумма доната, необходимая для " + execName + " для стримера " + streamerPlayerName + " не найдена. Проверьте правильность заполнения файла конфигурации DonationExecutor.yml в папке с именем плагина."); @@ -42,10 +39,16 @@ public StreamerPlayer(@NotNull String _streamerPlayerName) { } public String checkExecution(@NotNull String amount) { - return listOfAmounts.get(amount); + int a; + try { + a = Integer.parseInt(amount); + } catch (NumberFormatException e) { + a = 0; + } + return listOfAmounts.get(a); } - public String getName(){ + public String getName() { return streamerPlayerName; } @@ -69,8 +72,8 @@ public Donation takeDonationFromQueue() { //Удалить дроп игрока после смерти - public Boolean removeDeathDrop() { - Boolean wasAnythingDeleted = false; + public boolean removeDeathDrop() { + boolean wasAnythingDeleted = false; for (Item i : listOfDeathDropItems) { if (i.isDead()) { continue; @@ -82,28 +85,10 @@ public Boolean removeDeathDrop() { } //Замена дездропа при смерти игрока (через Listener) - private class PlayerDeathListener implements Listener{ - StreamerPlayer thisStreamerPlayer; - - //Передача родительского объекта в слушателя - private PlayerDeathListener(StreamerPlayer _thisStreamerPlayer) { - thisStreamerPlayer = _thisStreamerPlayer; - } - - //Если данный игрок умер - запоминаем его посмертный дроп - @EventHandler - private void onPlayerDeath(PlayerDeathEvent event) { - List deathDrop = new ArrayList<>(); - if (event.getPlayer().getName().equals(thisStreamerPlayer.getName())) { - for (ItemStack i : event.getDrops()) { - deathDrop.add(event.getPlayer().getWorld().dropItemNaturally(event.getPlayer().getLocation(), i)); - } - } - event.getDrops().clear(); - thisStreamerPlayer.setDeathDrop(deathDrop); - } - } - + /*** + * PlayerDeathListener переехал в EventListener >_< + * Регистрировать целый слушатель на каждого пользователя в данном контексте не обязательно. + */ } diff --git a/src/main/java/igorlink/service/ItemStackUtils.java b/src/main/java/igorlink/service/ItemStackUtils.java new file mode 100644 index 0000000..c712f9f --- /dev/null +++ b/src/main/java/igorlink/service/ItemStackUtils.java @@ -0,0 +1,101 @@ +package igorlink.service; + +import org.bukkit.ChatColor; +import org.bukkit.Color; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.LeatherArmorMeta; + +import java.util.ArrayList; +import java.util.List; + +public class ItemStackUtils { + public static ItemStack buildItem(ItemStack stack, String name, String[] lore) { + ItemMeta meta = stack.getItemMeta(); + meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', name)); + if (lore != null) { + ArrayList list = new ArrayList(); + for (String str : lore) { + list.add(ChatColor.translateAlternateColorCodes('&', str)); + } + meta.setLore(list); + } + stack.setItemMeta(meta); + return stack; + } + + public static ItemStack buildItem(Material leatherPiece, String displayName, String[] lore, Color color) { + ItemStack item = new ItemStack(leatherPiece); + LeatherArmorMeta meta = (LeatherArmorMeta) item.getItemMeta(); + if (lore != null) { + ArrayList list = new ArrayList(); + for (String str : lore) { + list.add(ChatColor.translateAlternateColorCodes('&', str)); + } + meta.setLore(list); + } + meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', displayName)); + meta.setColor(color); + item.setItemMeta(meta); + return item; + } + + public static ItemStack buildItem(Material material, int amount, String name, String[] lore) { + ItemStack stack = new ItemStack(material, amount); + ItemMeta meta = stack.getItemMeta(); + meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', name)); + if (lore != null) { + ArrayList list = new ArrayList(); + for (String str : lore) { + list.add(ChatColor.translateAlternateColorCodes('&', str)); + } + meta.setLore(list); + } + stack.setItemMeta(meta); + return stack; + } + + public static ItemStack addLore(ItemStack stack, String[] lore) { + ItemMeta meta = stack.getItemMeta(); + List list; + if (meta.getLore() != null) { + list = meta.getLore(); + } else { + list = new ArrayList<>(); + } + for (String str : lore) { + list.add(ChatColor.translateAlternateColorCodes('&', str)); + } + meta.setLore(list); + stack.setItemMeta(meta); + return stack; + } + + public static ItemStack setLore(ItemStack stack, String[] lore) { + ItemMeta meta = stack.getItemMeta(); + List list = new ArrayList<>(); + if (lore != null) { + for (String str : lore) { + list.add(ChatColor.translateAlternateColorCodes('&', str)); + } + } + meta.setLore(list); + stack.setItemMeta(meta); + return stack; + } + + public static ItemStack setLore(ItemStack stack, int i, String lore) { + ItemMeta meta = stack.getItemMeta(); + List list; + if (meta.getLore() != null) { + list = meta.getLore(); + } else { + list = new ArrayList<>(); + } + list.set(i, lore); + meta.setLore(list); + stack.setItemMeta(meta); + return stack; + } +} \ No newline at end of file diff --git a/src/main/java/igorlink/service/MainConfig.java b/src/main/java/igorlink/service/MainConfig.java index cc81967..8b46471 100644 --- a/src/main/java/igorlink/service/MainConfig.java +++ b/src/main/java/igorlink/service/MainConfig.java @@ -12,14 +12,12 @@ public class MainConfig { private static HashMap> donationAmountsHashMap = new HashMap>(); private static FileConfiguration config = DonationExecutor.getInstance().getConfig(); - public static int dirtAmount = 0; - public static int diamondsAmount = 0; - public static int breadAmount = 0; - public static int bigBoomRadius = 0; + + // TODO: Статические постоянные значения принято писать большими буквами. + public static int dirtAmount, diamondsAmount, breadAmount, bigBoomRadius; public static String token; - public static List listOfBlackListedSubstrings = new ArrayList<>(); - public static List listOfWhiteListedSubstrings = new ArrayList<>(); - private static Boolean twitchFilter; + public static List listOfBlackListedSubstrings = new ArrayList<>(), listOfWhiteListedSubstrings = new ArrayList<>(); + private static boolean twitchFilter; public MainConfig() { @@ -30,16 +28,38 @@ public static FileConfiguration getConfig(){ return config; } - //Обновить данные из конфига - public static void reloadMainConfig() { - loadMainConfig(true); - } - //Загрузить данные из конфига без указания параметра перезагрузки public static void loadMainConfig() { loadMainConfig(false); } + // Метод для конвертаций значений конфига + public static void convert() { + int v = config.getInt("_version"); + + switch (v) { + case 0: { + if(config.getString("StreamersNamesList") != null) { + for (String playerName : config.getString("StreamersNamesList").split(",")) { + config.set("DonationAmounts." + playerName + ".Active", true); + } + } + + config.set("StreamersNamesList", null); + + List listOfBlackListedSubstrings = Arrays.asList(config.getString("BlacklistedSubstrings").split(",")), + listOfWhiteListedSubstrings = Arrays.asList(config.getString("WhitelistedSubstrings").split(",")); + + config.set("BlacklistedSubstrings", listOfBlackListedSubstrings); + config.set("WhitelistedSubstrings", listOfWhiteListedSubstrings); + + config.set("_version", config.getInt("_version") + 1); + DonationExecutor.getInstance().saveConfig(); + break; + } + } + } + //Загрузка данных из конфигфайла с указанным параметром перезагрузки public static void loadMainConfig(Boolean isReload) { DonationExecutor.getInstance().saveDefaultConfig(); @@ -51,59 +71,62 @@ public static void loadMainConfig(Boolean isReload) { } config = DonationExecutor.getInstance().getConfig(); + convert(); + + /* + Игорь, посмотри методы в MemorySection и ConfigurationSection. + В IDEA ты можешь это сделать при помощи: лев. CTRL + ПКМ по методу. + + Тебе не нужно каждый раз получать значение в виде строки. + Есть готовые методы, как для листов, так и для integer, double и т.д. + + WhitelistedSubstrings: + - книг + - нигерия + */ + + for (String playerName : config.getConfigurationSection("DonationAmounts").getKeys(false)) { + if(!config.getBoolean("DonationAmounts." + playerName + ".Active")) + continue; - String stringWithPlayersNames = config.getString("StreamersNamesList"); - List streamerPlayersNamesList = new ArrayList(Arrays.asList(stringWithPlayersNames.split(","))); - for (String playerName : streamerPlayersNamesList) { DonationExecutor.getInstance().listOfStreamerPlayers.addStreamerPlayer(playerName); } logToConsole("При чтении файла конфигурации было добавлено §b" + DonationExecutor.getInstance().listOfStreamerPlayers.getNumberOfStreamers() + "§f стримеров."); - dirtAmount = Integer.valueOf(config.getString("DirtAmount")); - diamondsAmount = Integer.valueOf(config.getString("DiamondsAmount")); - breadAmount = Integer.valueOf(config.getString("BreadAmount")); - bigBoomRadius = Integer.valueOf(config.getString("BigBoomRadius")); + dirtAmount = config.getInt("DirtAmount"); + diamondsAmount = config.getInt("DiamondsAmount"); + breadAmount = config.getInt("BreadAmount"); + bigBoomRadius = config.getInt("BigBoomRadius"); token = config.getString("DonationAlertsToken"); - listOfBlackListedSubstrings = Arrays.asList(config.getString("BlacklistedSubstrings").split(",")); - listOfWhiteListedSubstrings = Arrays.asList(config.getString("WhitelistedSubstrings").split(",")); - - if (config.getString("TwitchFilter") == "true") { - twitchFilter = true; - } else if (config.getString("TwitchFilter") == "false") { - twitchFilter = false; - } - else { - logToConsole("Ошибка при чтении значение TwitchFilter"); - } + listOfBlackListedSubstrings = config.getStringList("BlacklistedSubstrings"); + listOfWhiteListedSubstrings = config.getStringList("WhitelistedSubstrings"); + twitchFilter = config.getBoolean("TwitchFilter"); } - - public static void turnFilterOn() { - twitchFilter = true; - config.set("TwitchFilter", "true"); + config.set("TwitchFilter", (twitchFilter = true)); + DonationExecutor.getInstance().saveConfig(); + } public static void turnFilterOff() { - twitchFilter = false; - config.set("TwitchFilter", "false"); + config.set("TwitchFilter", (twitchFilter = false)); + DonationExecutor.getInstance().saveConfig(); } - public static Boolean getFilterStatus() { + public static boolean getFilterStatus() { return twitchFilter; } public static HashMap getNameAndExecution (@NotNull String donationAmount) { - String thisDonateForStreamerName = null; - String nameOfExecution = null; + String nameOfExecution; for (String p : donationAmountsHashMap.keySet()) { if (donationAmountsHashMap.get(p).containsKey(donationAmount)) { HashMap temp = new HashMap(); - thisDonateForStreamerName = p; nameOfExecution = donationAmountsHashMap.get(p).get(donationAmount); temp.put("name", p); temp.put("execution", nameOfExecution); diff --git a/src/main/java/igorlink/service/Utils.java b/src/main/java/igorlink/service/Utils.java index debc62b..20d9d8c 100644 --- a/src/main/java/igorlink/service/Utils.java +++ b/src/main/java/igorlink/service/Utils.java @@ -6,6 +6,7 @@ import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.util.Vector; + import java.math.BigInteger; import java.util.Arrays; import java.util.HashMap; @@ -17,12 +18,12 @@ public class Utils { public static Boolean isPluginActive; //Вывод сообщения в консоль - public static void logToConsole(String text){ + public static void logToConsole(String text) { Bukkit.getConsoleSender().sendMessage("§c[DonationExecutor] §f" + text); } //Отправка сообщения игроку со стороны плагина - public static void sendSysMsgToPlayer(Player player, String text){ + public static void sendSysMsgToPlayer(Player player, String text) { player.sendMessage("§c[DE] §f" + text); } @@ -30,7 +31,7 @@ public static byte[] decodeUsingBigInteger(String hexString) { byte[] byteArray = new BigInteger(hexString, 16).toByteArray(); if (byteArray[0] == 0) { byte[] output = new byte[byteArray.length - 1]; - System.arraycopy(byteArray, 1, output,0, output.length); + System.arraycopy(byteArray, 1, output, 0, output.length); return output; } return byteArray; @@ -38,34 +39,28 @@ public static byte[] decodeUsingBigInteger(String hexString) { public static Boolean CheckNameAndToken() { isPluginActive = true; - if ((DonationExecutor.getInstance().getConfig().getString("DonationAlertsToken") == "") || (DonationExecutor.getInstance().getConfig().getString("DonationAlertsToken") == null)) { + if ((MainConfig.token == null) || (MainConfig.token.isEmpty())) { logToConsole("Вы не указали свой токен DonationAlerts в файле конфигурации плагина, поэтому сейчас плагин не работает."); isPluginActive = false; - } else if ((DonationExecutor.getInstance().getConfig().getString("Nickname") == "") || (DonationExecutor.getInstance().getConfig().getString("Nickname") == "")) { - logToConsole("Вы не указали свой игровой никнейм в файле конфигурации плагина, поэтому сейчас плагин не работает."); - isPluginActive = false; } + return isPluginActive; } public static void announce(String donaterName, String subText, String alterSubtext, Player player, Boolean bigAnnounce) { - String _donaterName = donaterName; + if (donaterName == null || donaterName.isEmpty()) { + donaterName = "Кто-то"; + } - if (bigAnnounce) { - if (donaterName.equals("")) { - _donaterName = "Кто-то"; - } - Title title = new Title("§c" + _donaterName, "§f" + subText); + if (bigAnnounce) { + Title title = new Title("§c" + donaterName, "§f" + subText); player.sendTitle(title); - player.sendMessage("§c[DE] §fДонатер §c" + _donaterName, "§f" + subText); + player.sendMessage("§c[DE] §fДонатер §c" + donaterName + " §f" + subText); } - if (_donaterName == "") { - _donaterName = "Кто-то"; - } for (Player p : Bukkit.getOnlinePlayers()) { - if (!(p.getName() == player.getName())) { - p.sendMessage("§c[DE] §fДонатер §c" + _donaterName + " §f" + alterSubtext + " §b" + player.getName()); + if (!(p.getName().equals(player.getName()))) { + p.sendMessage("§c[DE] §fДонатер §c" + donaterName + " §f" + alterSubtext + " §b" + player.getName()); } } @@ -73,41 +68,34 @@ public static void announce(String donaterName, String subText, String alterSubt } public static Vector genVec(Location a, Location b, Boolean isNormalized) { - Vector vec = locToVec(b).clone().subtract(locToVec(a)); - if (isNormalized) { - return vec.normalize(); - } else { - return vec; - } + Vector vec = b.toVector().clone().subtract(a.toVector()); + return isNormalized ? vec.normalize() : vec; } public static Vector genVec(Location a, Location b) { - Vector vec = locToVec(b).clone().subtract(locToVec(a)); - return vec.normalize(); - } - - public static Vector locToVec(Location loc) { - Vector vec = new Vector(loc.getX(), loc.getY(), loc.getZ()); - return vec; + Vector vec = b.toVector().clone().subtract(a.toVector()); + return vec.normalize(); } public static String cutOffKopeykis(String donationAmountWithKopeykis) { - String amountWithoutKopeykis = ""; + StringBuilder amountWithoutKopeykis = new StringBuilder(); for (int i = 0; i <= donationAmountWithKopeykis.length() - 1; i++) { if (donationAmountWithKopeykis.charAt(i) == '.') { break; - } else if (donationAmountWithKopeykis.charAt(i) == ' ') { - continue; - } else { - amountWithoutKopeykis = amountWithoutKopeykis + donationAmountWithKopeykis.charAt(i); + } else if (donationAmountWithKopeykis.charAt(i) != ' ') { + amountWithoutKopeykis.append(donationAmountWithKopeykis.charAt(i)); } } - return amountWithoutKopeykis; + return amountWithoutKopeykis.toString(); } + /*** + * TODO: Переделать, думаю, можно сделать покороче. + */ + public static Boolean isBlackListed(String text) { - HashMap> mapOfSynonimousChars = new HashMap>(); + HashMap> mapOfSynonimousChars = new HashMap<>(); mapOfSynonimousChars.put('h', (Arrays.asList('x', 'х', 'н', 'n'))); //eng mapOfSynonimousChars.put('n', (Arrays.asList('н', 'й', 'и'))); //eng @@ -131,7 +119,7 @@ public static Boolean isBlackListed(String text) { mapOfSynonimousChars.put('c', (Arrays.asList('s', 'с', '$', '5'))); //eng mapOfSynonimousChars.put('л', (Arrays.asList('l', '1', '|'))); //rus mapOfSynonimousChars.put('l', (Arrays.asList('л', '1', '|', '!'))); //eng - mapOfSynonimousChars.put('1', (Arrays.asList('л', 'i', 'l', '|'))); //eng + mapOfSynonimousChars.put('1', (Arrays.asList('л', 'i', 'l', '|', 'i', 'l'))); //eng mapOfSynonimousChars.put('d', (Arrays.asList('д', 'л'))); //eng mapOfSynonimousChars.put('д', (Arrays.asList('d', 'л', '9'))); //rus mapOfSynonimousChars.put('y', (Arrays.asList('у', 'u', 'ы'))); //eng @@ -139,13 +127,11 @@ public static Boolean isBlackListed(String text) { mapOfSynonimousChars.put('x', (Arrays.asList('х', 'h'))); //eng mapOfSynonimousChars.put('х', (Arrays.asList('x', 'h'))); //rus mapOfSynonimousChars.put('ы', (Arrays.asList('у', 'u', 'y'))); //rus - mapOfSynonimousChars.put('ы', (Arrays.asList('у', 'u', 'y'))); //rus mapOfSynonimousChars.put('ч', (Arrays.asList('4')));//rus mapOfSynonimousChars.put('k', (Arrays.asList('к')));//eng mapOfSynonimousChars.put('к', (Arrays.asList('k')));//rus mapOfSynonimousChars.put('0', (Arrays.asList('o', 'о'))); //num - mapOfSynonimousChars.put('1', (Arrays.asList('i', 'l'))); //num - mapOfSynonimousChars.put('3', (Arrays.asList('e', 'е','з'))); + mapOfSynonimousChars.put('3', (Arrays.asList('e', 'е', 'з'))); mapOfSynonimousChars.put('4', (Arrays.asList('ч'))); mapOfSynonimousChars.put('5', (Arrays.asList('с', 'c', 's'))); mapOfSynonimousChars.put('9', (Arrays.asList('r', 'я'))); @@ -155,8 +141,8 @@ public static Boolean isBlackListed(String text) { Pattern pattern = Pattern.compile("[l1i]*[\\-]*[l1i]*"); Matcher matcher = pattern.matcher(validationText); - if ( (matcher.find()) && (matcher.group().length()>0) ) { - validationText = validationText.replace(matcher.group(), "н"); + if ((matcher.find()) && (matcher.group().length() > 0)) { + validationText = validationText.replace(matcher.group(), "н"); } validationText = validationText.replace(" ", ""); @@ -202,22 +188,20 @@ public static Boolean isBlackListed(String text) { Boolean repeated = true; Boolean finishCycle = false; - while ((repeated) && (!finishCycle)) { - if (j==0) { + while (repeated) { + if (j == 0) { break; } if (!(validationText.charAt(tempi + j) == validationText.charAt(tempi + j - 1))) { if (!(mapOfSynonimousChars.containsKey(validationText.charAt(tempi + j)))) { - repeated = false; break; } else if (!(mapOfSynonimousChars.get(validationText.charAt(tempi + j)).contains(validationText.charAt(tempi + j - 1)))) { - repeated = false; break; } } tempi++; - if ((validationText.length()-tempi-j) < (ss.length()-j)) { - finishCycle=true; + if ((validationText.length() - tempi - j) < (ss.length() - j)) { + finishCycle = true; break; } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index f24a9d8..fff4cea 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,15 +1,20 @@ + +# ██████╗░░█████╗░███╗░░██╗░█████╗░████████╗██╗░█████╗░███╗░░██╗███████╗██╗░░██╗███████╗░█████╗░██╗░░░██╗████████╗░█████╗░██████╗░ +# ██╔══██╗██╔══██╗████╗░██║██╔══██╗╚══██╔══╝██║██╔══██╗████╗░██║██╔════╝╚██╗██╔╝██╔════╝██╔══██╗██║░░░██║╚══██╔══╝██╔══██╗██╔══██╗ +# ██║░░██║██║░░██║██╔██╗██║███████║░░░██║░░░██║██║░░██║██╔██╗██║█████╗░░░╚███╔╝░█████╗░░██║░░╚═╝██║░░░██║░░░██║░░░██║░░██║██████╔╝ +# ██║░░██║██║░░██║██║╚████║██╔══██║░░░██║░░░██║██║░░██║██║╚████║██╔══╝░░░██╔██╗░██╔══╝░░██║░░██╗██║░░░██║░░░██║░░░██║░░██║██╔══██╗ +# ██████╔╝╚█████╔╝██║░╚███║██║░░██║░░░██║░░░██║╚█████╔╝██║░╚███║███████╗██╔╝╚██╗███████╗╚█████╔╝╚██████╔╝░░░██║░░░╚█████╔╝██║░░██║ +# ╚═════╝░░╚════╝░╚═╝░░╚══╝╚═╝░░╚═╝░░░╚═╝░░░╚═╝░╚════╝░╚═╝░░╚══╝╚══════╝╚═╝░░╚═╝╚══════╝░╚════╝░░╚═════╝░░░░╚═╝░░░░╚════╝░╚═╝░░╚═╝ + # Секретный токен Donation Alerts. # Находится на Donation Alerts на странице "Настройки" -> "Основные настройки". DonationAlertsToken: -# Никнеймы стримеров в игре ЧЕРЕЗ ЗАПЯТУЮ БЕЗ ПРОБЕЛОВ! -# Не забудьте про цветовые коды, если используете их -StreamersNamesList: Evropejets,mdenz3 - -# Точные суммы донатов для событий +# Точные суммы донатов и никнеймы для событий DonationAmounts: # Имя первого стримера (ДОЛЖЕН СОВПАДАТЬ С ПЕРВЫМ ЗНАЧЕНИЕМ, УКАЗАННЫМ В StreamersNamesList) Evropejets: + Active: true # Насрать стримеру в инвентарь подписанными стаками говна ShitToInventory: 62 # Выбить предмет из рук @@ -45,6 +50,7 @@ DonationAmounts: GiveStackOfDiamonds: 2012 # Имя второго стримера (ДОЛЖЕН СОВПАДАТЬ СО ВТОРЫМ ЗНАЧЕНИЕМ, УКАЗАННЫМ В StreamersNamesList) mdenz3: + Active: true # Насрать стримеру в инвентарь подписанными стаками говна ShitToInventory: 61 # Выбить предмет из рук @@ -89,8 +95,39 @@ BreadAmount: 4 BigBoomRadius: 20 TwitchFilter: true -BlacklistedSubstrings: негр,пидо,пида,niga,нигр,ниге,додик,петух,петуч,куколд,симп,kukold,cuckold,fag,хуе,хуй,даун,кады,кадь,kadb,4e4e,4e4n,cheche,chechn,4echn,che4n,4eche,4eche -WhitelistedSubstrings: книг,нигерия - +BlacklistedSubstrings: + - негр + - пидо + - пида + - niga + - нигр + - ниге + - додик + - петух + - петуч + - куколд + - симп + - kukold + - cuckold + - fag + - хуе + - хуй + - даун + - кады + - кадь + - kadb + - 4e4e + - 4e4n + - cheche + - chechn + - 4echn + - che4n + - 4eche + - 4eche +WhitelistedSubstrings: + - книг + - нигерия +# НЕ МЕНЯТЬ! +_version: 1