1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

В разработке Плагин на Карму. Обсудим?

Тема в разделе "Разработка плагинов для новичков", создана пользователем xBrainRTPx, 21 фев 2017.

  1. Автор темы
    xBrainRTPx

    xBrainRTPx Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Brat987
    Здравствуйте, девелоперы! Хочу написать плагин на карму, который будет иметь несколько функций:
    - Добавление N-кармы, если ты написал слово из списка раз в N-минут/в конце мини-игры;
    - GUI статистика кармы.
    У меня возник вопрос, где хранить данные о карме каждого человека? SQL, MySQL, обычный .yml?
    Еще, я научился выдавать голову игрока при входе в игру, но вот скин что-то не хочет ставится... Хотя я передаю Owner голове.
    Еще есть шедулеры, но это, как я понял, только задержка на выполнение команды, но ни как не таймер. Допустим, я сделаю таймер, но как его сделать для каждого игрока индивидуально? Просто, может произойти такая ситуация, что я введу это слово и у всех установится таймер, а такого не должно быть. Таймер должен быть у каждого свой, так сказать...
     
  2. TheZefirrkka

    TheZefirrkka Активный участник Пользователь

    Баллы:
    76
    На твоё предпочтение

    Значит не так делаешь, покажи код

    Есть разные шедулеры, ты используешь задержку
    Вопрос недавно поднимался такой уже
    И в чём суть темы? Ты хочешь, что бы мы его за тебя сделали?
     
  3. Автор темы
    xBrainRTPx

    xBrainRTPx Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Brat987
    Нет, я не хочу что бы кто-то это за меня сделал. Я создал этот топик как обсуждение, чтобы послушать ваше мнение по этому поводу, ваши советы и прочее. Вроде как, тут хорошие девы сидят, у них опыта много
    Код:
        public ItemStack Item_Skull = new ItemStack(Material.SKULL_ITEM, 1, (short) 3);
        SkullMeta Meta_Skull = (SkullMeta) Item_Skull.getItemMeta();
        ArrayList<String> Lore_Skull = new ArrayList<>();
    
        public void Initialize_Hotbar(Player p) {
            Meta_Skull.setOwner(p.getName());
            Lore_Skull.clear();
            Lore_Skull.add(null);
            Lore_Skull.add(ChatColor.GRAY + "Right-Click to View Profile Information.");
            Meta_Skull.setLore(Lore_Skull);
            Meta_Skull.setDisplayName(ChatColor.GREEN + "My Profile" + ChatColor.WHITE + " - (" + ChatColor.GOLD + "Right Click" + ChatColor.WHITE + ")");
            Item_Skull.setItemMeta(Meta_Skull);
    

    Заработало -.-
    Столкнулся с такой проблемой:
    Есть 2 списка: Message & BlackMessage
    Если игрок напишет в чат сообщение и в нем будет присутствовать слово из BlackMessage, то должно выполняться какое-нибудь действие, напиример, '-1 карма'.
    Если игрок напишет сообщение и в нем будет присутствовать слово/сообщение из Message, то должна пройти проверка на содержание слов из BlackMessage, и выполнится действие.
    Код:
        @EventHandler
        public void onPlayerChat(PlayerChatEvent event) {
            if (event.isCancelled() || event.getPlayer() == null) {
                return;
            }
            Player player = event.getPlayer();
            for (final String message: this.getConfig().getStringList("Messages")) {
                String[] p_message = event.getMessage().split(" ");
                //player.sendMessage(p_message);
                if (message.equalsIgnoreCase(String.valueOf(p_message))) {
                    int cooldownTime = 10;
                    if(cooldowns.containsKey(player.getName())) {
                        long secondsLeft = ((cooldowns.get(player.getName())/1000)+cooldownTime) - (System.currentTimeMillis()/1000);
                        if(secondsLeft>0)
                            return;
                    }
                    cooldowns.put(player.getName(), System.currentTimeMillis());
                    getServer().getScheduler().scheduleSyncDelayedTask(this, () -> {
                        player.sendMessage("§d+5 Кармы");
                    }, 1L);
                }
            }
        }
    
    У меня начались проблемы уже тут(( Что не так?
    P.S как я только не пробовал....
     
    Последнее редактирование: 21 фев 2017
  4. Blc_Dragon

    Blc_Dragon Активный участник Пользователь

    Баллы:
    76
    Пустота в твоей черепной коробке, вот что не так.

    Ты сравниваешь список слов с одним единственным.


    Далее уже чисто совет по более быстрой организации кода.

    У тебя получится цикл в цикле, когда все исправишь.
    Так вот, допустим в словаре 10000 слов. а в сообщении 15. гораздо целесообразней запустить цикл для слов из сообщения, и дальше просто для массива слов делать this.getConfig().getStringList("Messages").contains(то самое слово).

    Массив на твоем месте вообще вынес бы в статик поле и подгружал при загрузке. в этом же моменте писал бы в массив все на lower case (ибо контаинс не будет игнорить регистр), и тогда при сравнении будет if (твой массив.contains(твое слово.toLowerCase())) //ищем смысл жизни.

    если не понял - напиши, сделаю код, а то чет спать не хочется
     
  5. Автор темы
    xBrainRTPx

    xBrainRTPx Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Brat987
    @Blc_Dragon сейчас попробую, если я тебя правильно понял...
    Код:
    package ru;
    import java.util.List;
    import java.util.logging.Logger;
    
    import org.bukkit.ChatColor;
    import org.bukkit.configuration.file.FileConfiguration;
    
    public class Msg {
        private static String Lore;
        private static String Name;
        private static List Messages;
    
        private static Logger log = GUIs.getPlugin().getLogger();
    
        public static void load() {
            GUIs.getPlugin().saveDefaultConfig();
            log.info("Loading configuration...");
            FileConfiguration cfile = GUIs.getPlugin().getConfig();
    
            Lore = cfile.getString("Lore");
            Name = cfile.getString("Name");
            Messages = cfile.getStringList("Messages");
        }
        public static String getLore1() { return ChatColor.translateAlternateColorCodes('&', Lore); }
        public static String getName() { return ChatColor.translateAlternateColorCodes('&', Name); }
        public static List getMessages() { return Messages;}
    }
    
    И его подгружаю в main классе при onEnable вот так: Msg.load();
    Все правильно?
     
  6. Blc_Dragon

    Blc_Dragon Активный участник Пользователь

    Баллы:
    76
    ну во первых List<String>
    во вторых лист надо перебрать, и загнать строки в нижний регистр, что бы потом с ним казуса не вышло
     
  7. Автор темы
    xBrainRTPx

    xBrainRTPx Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Brat987
    Код:
    public class Msg {
        private static List<String> Messages;
    
        private static Logger log = GUIs.getPlugin().getLogger();
    
        public static void load() {
            GUIs.getPlugin().saveDefaultConfig();
            log.info("Loading configuration...");
            FileConfiguration cfile = GUIs.getPlugin().getConfig();
    
            Messages = cfile.getStringList("Messages".toLowerCase());
        }
        public static List<String> getMessages() { return Messages;}
    
    }
    А вот что дальше делать, я так и не понял....
    Вообще в голову не лезит... Мне нужно сравнить введенные слова со списком слов, тобиш нужно применить такую конструкцию:
    Код:
    for (final String message: Msg.getMessages())
    И все, я в ступоре...
    
     
  8. Blc_Dragon

    Blc_Dragon Активный участник Пользователь

    Баллы:
    76
    это так не сработает
    Код:
    public List<String> toLowerCase(List<String> list){
            List<String> toreturn = new ArrayList<>();
            for (String s : list){
                toreturn.add(s.toLowerCase());
            }
       
            return toreturn;   
        }
    А дальше надо перебирать сообщение
    Код:
    @EventHandler
        public void onPlayerChat(PlayerChatEvent event) {
            if (event.isCancelled() || event.getPlayer() == null) {
                return;
            }
            Player player = event.getPlayer();
            for (String string:event.getMessage().split("[ .,?!:;\"«»]")){ //разбиваем строку с учетом знаков препинания. слеш перед двоеточием делает двоеточие просто символом, а не закрывающим знаком
                if (string==null) continue;
                if (string.isEmpty()) continue; //у нас вполне могут быть пустые строки если подряд пойдет два знака из списка выше
                if (Messages.contains(string.toLowerCase())){
                    //Ищем смысл жизни
                    //возможно выполняем еще что то
                }
            }
        }
    
     
  9. Автор темы
    xBrainRTPx

    xBrainRTPx Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Brat987
    Заработало! Ура! Спасибо, товарищ! Теперь можно спокойно уйти на боковую! Завтра продолжу...
    Ну, если можно, напоследок, такий вопросик:
    Если в предложении есть слово/фраза из BlackMessages, то нужно выполнить, к примеру, действие#2 и на этом закончить и больше ничего не делать (break; )
    У нас перебирает for, а значит, что как только он дойдет до слова Messages выполнится действие#1. Но если в сообщении после слова из Messages идет слово из BlackMessages, то мне нужно это пресечь! Значит, нужно сначала все перебрать, а потом делать какие-либо действия. Но как? Или я уже несу ересь и это реализуется на раз-два?
     
  10. Blc_Dragon

    Blc_Dragon Активный участник Пользователь

    Баллы:
    76
    в коде который я кинул, перебираются все слова из сообщения игрока. соответственно, как только программа зайдет в if(Messages.contains(string.toLowerCase())), это будет означать что в сообщении игрока есть плохое (ну или хорошее. все решает какой массив ты подключил как messages) слово. => Выполнять действие #2 надо прям в этом if'e
    если программа туда ни разу не зайдет - значит игроку повезло

    Немного повкуривал.
    Если правильно понял, то тебе хочется так:
    Код:
    @EventHandler
        public void onPlayerChat(AsyncPlayerChatEvent event) {
            if (event.isCancelled() || event.getPlayer() == null) {
                return;
            }
            Player player = event.getPlayer();
            for (String string:event.getMessage().split("[ .,?!:;]")){ //разбиваем строку с учетом знаков препинания.
                if (string==null) continue;
                if (string.isEmpty()) continue; //у нас вполне могут быть пустые строки если подяд пойдет два знака из списка выше  
                if (Messages.contains(string.toLowerCase())){
                    //слово есть в списке хороших. 
                    //Ищем смысл жизни
                    //возможно выполняем еще что то 
                }
                if (BlackMessages.contains(string.toLowerCase())){
                    //слово есть в списке плохих
                    //Ищем смысл жизни
                    //возможно выполняем еще что то 
                }
            }
        }
    Кстати присмотрись к этому ивенту. если ты кодишь не на динозавринских версиях, то этот ивент лучше
     
    Последнее редактирование: 22 фев 2017
  11. Автор темы
    xBrainRTPx

    xBrainRTPx Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Brat987
    Да, согласен, но происходит оно так:
    Есть фраз: 'Спасибо *мат*'. Ее разобрали на части получился массив: [Спасибо, *мат*]. Сначала проверится слово 'Спасибо' и оно окажется из Messages, а значит выполнится действие#1, хотя во всей фразе есть слово из BlackMessages. Вот в чем загвостка. Если мы, к примеру, поместим в if(Messages.contains(string.toLowerCase())) вот это if(BlackMessages.contains(strigng.toLowerCase())).... else...., или отдельно вынесем то так или иначе будет выполнятся действие#1, пока "хорошее" слово будет стоять спереди.
    1.8.8 еще актуальна?)
    К сожалению, нет(
    Присмотрелся, начал использовать
     
  12. Blc_Dragon

    Blc_Dragon Активный участник Пользователь

    Баллы:
    76
    тогда еще раз для меня барашка (б-е-е).

    я прост чет реально туплю.

    у тебя код как только найдет хорошее слово, сразу остановится и может пропустить плохое слово и наоборот?

    или тебе не нравится, что если есть плохое слово, но оно потом, то игрока все равно погладят по голове, а должны только а-та-та сделать?
     
  13. Автор темы
    xBrainRTPx

    xBrainRTPx Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Brat987
    Ненене, у меня код как только найдет какое-нибудь слово из списка Message/BlackMessage выполняет действие в зависимости от того, из какого списка это слово. Но он не останавливается т.к не стоит 'break;', а продолжает перебирать все слова. Но т.к он перебирает по 1-му слову, он и выполняет действия в зависимости от того, какое слово. Если в фразе последовательно слов такая: Хорошое_слово Плохое_слово, то выполнится сначала действие для "хорошего" слова, а потом для "плохого" слова.
    А мне нужно сделать так, что бы, если в сообщении было обнаружено хотяб одно "плохое" слово, то выполнилось действие для "плохого" слова (это действие#2), и для "хороших" слов действия не выполнялись!
    Приведу пример: "xBrainRTPx, спасибо, сука". Тут есть плохое слово, значит выполняем действие#2 и нам наплевать на то, что есть слово "спасибо".
    Бинго! Если употребил "плохое" слово, то получай а-та-та, никак иначе.
     
  14. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Сцук ору, почему все такие дубы.
     
  15. Автор темы
    xBrainRTPx

    xBrainRTPx Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Brat987
    Привет @alexandrage
    Снимок экрана 2017-02-22 в 5.12.07.png
     
  16. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Код:
    boolean mat = false;
    if (Messages.contains(string.toLowerCase())){
    
    }
    if (BlackMessages.contains(string.toLowerCase())){
        mat = true;
    }
    if(mat) {
       //банхамер
       return;
    }
     
  17. Blc_Dragon

    Blc_Dragon Активный участник Пользователь

    Баллы:
    76
    две булен переменные.

    Код:
             boolean hasgood = false;
             boolean hasbad = false;
            for (String string:event.getMessage().split("[ .,?!:;]")){ //разбиваем строку с учетом знаков препинания.
                if (string==null) continue;
                if (string.isEmpty()) continue; //у нас вполне могут быть пустые строки если подяд пойдет два знака из списка выше 
                if (Messages.contains(string.toLowerCase())){
                     hasgood=true;                
                }
                if (BlackMessages.contains(string.toLowerCase())){
                    hasbad=true
                }
            }
           if (hasbad){
                //наш любимый смысл жизни
                return; //дабы никаких поползновений в сторону наград
           }
           if (hasgood){
              //Todo
           }
        
     
  18. Автор темы
    xBrainRTPx

    xBrainRTPx Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Brat987
    Код:
             boolean hasgood = false;
             boolean hasbad = false;
            for (String string:event.getMessage().split("[ .,?!:;]")){ //разбиваем строку с учетом знаков препинания.
                if (string==null) continue;
                if (string.isEmpty()) continue; //у нас вполне могут быть пустые строки если подяд пойдет два знака из списка выше
                if (Messages.contains(string.toLowerCase())){
                     hasgood=true;              
                }
                if (BlackMessages.contains(string.toLowerCase())){
                    hasbad=true;
                    hasgood=false;
                    break;
                }
            }
           if (hasbad){
                //наш любимый смысл жизни
                return; //дабы никаких поползновений в сторону наград
           }
           if (hasgood){
              //Todo
           }
        
    сделал так, все работает. Канахвета, парни! :* Спасибо за помощь!
    Теперь, осталось присвоить карму к игроку, тобиш записать это куда-нибудь и будет профит) Но это уже все завтра... Спасибо за помощь, еще раз! <3 Dev RB.
     
  19. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    А теперь самое интересное. Иди терять часы своей никчемной жизни в поиске завуалиранного мата. Который шкалтники тебе будут каждый час пополнять :D.
    Так что тебе еще лет так десять не до сна будет.
     
  20. Автор темы
    xBrainRTPx

    xBrainRTPx Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Brat987
    Я же делаю не ChatGuard, а карму... Она практически никак не будет влиять на геймплей и пр. Она будет отображать твое поведение на сервере, изредка прописывая тебе +5 за "хорошие" слова (ох как я продумал, позже чуть-чуть откорректирую) и минусует за "плохие" слова. Есть профиль, где показывается твоя карма и пр. статистика. Сделать хочу это для того, чтобы игроки могли видеть, кто нормальный, а кто не совсем...
     

Поделиться этой страницей