Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

xBrainRTPx

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

Хотя я передаю Owner голове.
Значит не так делаешь, покажи код

Еще есть шедулеры, но это, как я понял, только задержка на выполнение команды, но ни как не таймер.
Есть разные шедулеры, ты используешь задержку
как его сделать для каждого игрока индивидуально?
Вопрос недавно поднимался такой уже
И в чём суть темы? Ты хочешь, что бы мы его за тебя сделали?
 
И в чём суть темы? Ты хочешь, что бы мы его за тебя сделали?
Нет, я не хочу что бы кто-то это за меня сделал. Я создал этот топик как обсуждение, чтобы послушать ваше мнение по этому поводу, ваши советы и прочее. Вроде как, тут хорошие девы сидят, у них опыта много
Значит не так делаешь, покажи код
Java:
    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, и выполнится действие.
Java:
    @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 как я только не пробовал....
 
Последнее редактирование:
Пустота в твоей черепной коробке, вот что не так.

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


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

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

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

если не понял - напиши, сделаю код, а то чет спать не хочется
 
@Blc_Dragon сейчас попробую, если я тебя правильно понял...
Java:
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();
Все правильно?
 
ну во первых List<String>
во вторых лист надо перебрать, и загнать строки в нижний регистр, что бы потом с ним казуса не вышло
 
Java:
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;}

}
А вот что дальше делать, я так и не понял....
Вообще в голову не лезит... Мне нужно сравнить введенные слова со списком слов, тобиш нужно применить такую конструкцию:
Java:
for (final String message: Msg.getMessages())
И все, я в ступоре...
 
Messages = cfile.getStringList("Messages".toLowerCase());
это так не сработает
Java:
public List<String> toLowerCase(List<String> list){
        List<String> toreturn = new ArrayList<>();
        for (String s : list){
            toreturn.add(s.toLowerCase());
        }
   
        return toreturn;   
    }

А дальше надо перебирать сообщение
Java:
@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())){
                //Ищем смысл жизни
                //возможно выполняем еще что то
            }
        }
    }
 
Заработало! Ура! Спасибо, товарищ! Теперь можно спокойно уйти на боковую! Завтра продолжу...
Ну, если можно, напоследок, такий вопросик:
Если в предложении есть слово/фраза из BlackMessages, то нужно выполнить, к примеру, действие#2 и на этом закончить и больше ничего не делать (break; )
У нас перебирает for, а значит, что как только он дойдет до слова Messages выполнится действие#1. Но если в сообщении после слова из Messages идет слово из BlackMessages, то мне нужно это пресечь! Значит, нужно сначала все перебрать, а потом делать какие-либо действия. Но как? Или я уже несу ересь и это реализуется на раз-два?
 
Заработало! Ура! Спасибо, товарищ! Теперь можно спокойно уйти на боковую! Завтра продолжу...
Ну, если можно, напоследок, такий вопросик:
Если в предложении есть слово/фраза из BlackMessages, то нужно выполнить, к примеру, действие#2 и на этом закончить и больше ничего не делать (break; )
У нас перебирает for, а значит, что как только он дойдет до слова Messages выполнится действие#1. Но если в сообщении после слова из Messages идет слово из BlackMessages, то мне нужно это пресечь! Значит, нужно сначала все перебрать, а потом делать какие-либо действия. Но как? Или я уже несу ересь и это реализуется на раз-два?
в коде который я кинул, перебираются все слова из сообщения игрока. соответственно, как только программа зайдет в if(Messages.contains(string.toLowerCase())), это будет означать что в сообщении игрока есть плохое (ну или хорошее. все решает какой массив ты подключил как messages) слово. => Выполнять действие #2 надо прям в этом if'e
если программа туда ни разу не зайдет - значит игроку повезло

Немного повкуривал.
Если правильно понял, то тебе хочется так:
Java:
@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())){
                //слово есть в списке плохих
                //Ищем смысл жизни
                //возможно выполняем еще что то 
            }
        }
    }
Кстати присмотрись к этому ивенту. если ты кодишь не на динозавринских версиях, то этот ивент лучше
 
Последнее редактирование:
в коде который я кинул, перебираются все слова из сообщения игрока. соответственно, как только программа зайдет в if(Messages.contains(string.toLowerCase())), это будет означать что в сообщении игрока есть плохое (ну или хорошее. все решает какой массив ты подключил как messages) слово. => Выполнять действие #2 надо прям в этом if'e
если программа туда ни разу не зайдет - значит игроку повезло
Да, согласен, но происходит оно так:
Есть фраз: 'Спасибо *мат*'. Ее разобрали на части получился массив: [Спасибо, *мат*]. Сначала проверится слово 'Спасибо' и оно окажется из Messages, а значит выполнится действие#1, хотя во всей фразе есть слово из BlackMessages. Вот в чем загвостка. Если мы, к примеру, поместим в if(Messages.contains(string.toLowerCase())) вот это if(BlackMessages.contains(strigng.toLowerCase())).... else...., или отдельно вынесем то так или иначе будет выполнятся действие#1, пока "хорошее" слово будет стоять спереди.
1.8.8 еще актуальна?)
Немного повкуривал.
Если правильно понял, то тебе хочется так: <типа тут код>
К сожалению, нет(
Кстати присмотрись к этому ивенту. если ты кодишь не на динозавринских версиях, то этот ивент лучше
Присмотрелся, начал использовать
 
К сожалению, нет(
тогда еще раз для меня барашка (б-е-е).

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

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

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

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

Бинго! Если употребил "плохое" слово, то получай а-та-та, никак иначе.
две булен переменные.

Java:
         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
       }
 
Java:
         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.
 
А теперь самое интересное. Иди терять часы своей никчемной жизни в поиске завуалиранного мата. Который шкалтники тебе будут каждый час пополнять :D.
Так что тебе еще лет так десять не до сна будет.
 
А теперь самое интересное. Иди терять часы своей никчемной жизни в поиске завуалиранного мата. Который шкалтники тебе будут каждый час пополнять :D.
Я же делаю не ChatGuard, а карму... Она практически никак не будет влиять на геймплей и пр. Она будет отображать твое поведение на сервере, изредка прописывая тебе +5 за "хорошие" слова (ох как я продумал, позже чуть-чуть откорректирую) и минусует за "плохие" слова. Есть профиль, где показывается твоя карма и пр. статистика. Сделать хочу это для того, чтобы игроки могли видеть, кто нормальный, а кто не совсем...
 

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

Назад
Верх