Вопрос Плагин на экономику

GoldenSunsetMine

Пользователь
Сообщения
91
Суть моего вопроса заключается не в том, как создать именно плагин на экономику, а в том, как создать вообще любое значение которое можно увеличивать/уменьшать. Например создать плагин на розыск для РП сервера, там по команде /wanted add player 1 - игроку добавляется 1 розыск и это видно по плейсхолдеру %wanted_lvl%. По команде /wanted remove player 1 - убавляется. Команда /wanted set player 1 - устанавливается. Помогите сделать такую вещь.
 
Решение
Ваш плагин должен выглядеть примерно вот так: (по идее всё должно работать, но я не проверял, по идее плагин уже готов, Вам нужно его лишь запихнуть в IDE и собрать, готовый не выкладывал специально чтобы Вы немного ознакомились с кодом)
Если коротко - то Вам необходим главный класс, обработчик команд, плейсхолдер и хранилище в виде конфигурации (подробнее о работе с конфигами можно почитать тут). Можно обойтись и без сущности Criminal. Спрашивайте, если что-то не понятно.
Ваш плагин должен выглядеть примерно вот так: (по идее всё должно работать, но я не проверял, по идее плагин уже готов, Вам нужно его лишь запихнуть в IDE и собрать, готовый не выкладывал специально чтобы Вы немного ознакомились с кодом)
Если коротко - то Вам необходим главный класс, обработчик команд, плейсхолдер и хранилище в виде конфигурации (подробнее о работе с конфигами можно почитать тут). Можно обойтись и без сущности Criminal. Спрашивайте, если что-то не понятно.
 
Ваш плагин должен выглядеть примерно вот так: (по идее всё должно работать, но я не проверял, по идее плагин уже готов, Вам нужно его лишь запихнуть вIDE и собрать, готовый не выкладывал специально чтобы Вы немного ознакомились с кодом)
Если коротко - то Вам необходим главный класс, обработчик команд, плейсхолдер и хранилище в виде конфигурации (подробнее о работе с конфигами можно почитать тут). Можно обойтись и без сущности Criminal. Спрашивайте, если что-то не понятно.
Здравствуйте снова! Вот тут ошибка из этого плагина. Как её можно решить?
Код:
Unhandled exception executing command 'wanted' in plugin RPWanted v1.0-SNAPSHOT
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:47) ~[spigot-1.16.5.jar:3096a-Spigot-9fb885e-af1a232]
        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:149) ~[spigot-1.16.5.jar:3096a-Spigot-9fb885e-af1a232]
        at org.bukkit.craftbukkit.v1_16_R3.CraftServer.dispatchCommand(CraftServer.java:761) ~[spigot-1.16.5.jar:3096a-Spigot-9fb885e-af1a232]
        at net.minecraft.server.v1_16_R3.PlayerConnection.handleCommand(PlayerConnection.java:1936) ~[spigot-1.16.5.jar:3096a-Spigot-9fb885e-af1a232]
        at net.minecraft.server.v1_16_R3.PlayerConnection.c(PlayerConnection.java:1779) ~[spigot-1.16.5.jar:3096a-Spigot-9fb885e-af1a232]
        at net.minecraft.server.v1_16_R3.PlayerConnection.a(PlayerConnection.java:1732) ~[spigot-1.16.5.jar:3096a-Spigot-9fb885e-af1a232]
        at net.minecraft.server.v1_16_R3.PacketPlayInChat.a(PacketPlayInChat.java:49) ~[spigot-1.16.5.jar:3096a-Spigot-9fb885e-af1a232]
        at net.minecraft.server.v1_16_R3.PacketPlayInChat.a(PacketPlayInChat.java:1) ~[spigot-1.16.5.jar:3096a-Spigot-9fb885e-af1a232]
        at net.minecraft.server.v1_16_R3.PlayerConnectionUtils.lambda$0(PlayerConnectionUtils.java:28) ~[spigot-1.16.5.jar:3096a-Spigot-9fb885e-af1a232]
        at net.minecraft.server.v1_16_R3.TickTask.run(SourceFile:18) ~[spigot-1.16.5.jar:3096a-Spigot-9fb885e-af1a232]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeTask(SourceFile:144) ~[spigot-1.16.5.jar:3096a-Spigot-9fb885e-af1a232]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23) ~[spigot-1.16.5.jar:3096a-Spigot-9fb885e-af1a232]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeNext(SourceFile:118) ~[spigot-1.16.5.jar:3096a-Spigot-9fb885e-af1a232]
        at net.minecraft.server.v1_16_R3.MinecraftServer.bb(MinecraftServer.java:1061) ~[spigot-1.16.5.jar:3096a-Spigot-9fb885e-af1a232]
        at net.minecraft.server.v1_16_R3.MinecraftServer.executeNext(MinecraftServer.java:1054) ~[spigot-1.16.5.jar:3096a-Spigot-9fb885e-af1a232]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeAll(SourceFile:103) ~[spigot-1.16.5.jar:3096a-Spigot-9fb885e-af1a232]
        at net.minecraft.server.v1_16_R3.MinecraftServer.sleepForTick(MinecraftServer.java:1037) ~[spigot-1.16.5.jar:3096a-Spigot-9fb885e-af1a232]
        at net.minecraft.server.v1_16_R3.MinecraftServer.w(MinecraftServer.java:970) ~[spigot-1.16.5.jar:3096a-Spigot-9fb885e-af1a232]
        at net.minecraft.server.v1_16_R3.MinecraftServer.lambda$0(MinecraftServer.java:273) ~[spigot-1.16.5.jar:3096a-Spigot-9fb885e-af1a232]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_351]
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0
        at com.bodya.rpwanted.commands.WantedCommand.onCommand(WantedCommand.java:31) ~[?:?]
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45) ~[spigot-1.16.5.jar:3096a-Spigot-9fb885e-af1a232]
 
Здравствуйте снова! Вот тут ошибка из этого плагина. Как её можно решить?
Добрый день!
В коде произошла ошибка, потому что алгоритм вышел за пределы обрабатываемого массива. В данном случае - список аргументов. Команда должна содержать в себе ровно 3 аргумента:

/wanted [set/add/take] [игрок] [розыск]

Если будет меньше или больше, то будет выдавать ошибку. Какую команду Вы пытаетесь выполнить, и выполняется ли она должным образом, или ошибка не даёт использовать плагин?

Ошибка возникла при обработке 31-ой строчки Criminal criminal = new Criminal(args[1]), где плагин получает сущность преступника по нику. args[1] - должен быть ником.

Какую команду Вы пытались выполнить?
 
Какую команду Вы пытались выполнить?
Я заметил, что если выполнить команду правильно, то все нормально, начисляется розыск и тд, а вот если например просто прописать команду /wanted, без аргументов, либо с неправильной растановкой аргументов, то выводится эта ошиюка в консоли. Я в принципе знаю как это исправить и сейчас буду этим заниматься.
Авто объединение сообщений:

Я заметил, что если выполнить команду правильно, то все нормально, начисляется розыск и тд, а вот если например просто прописать команду /wanted, без аргументов, либо с неправильной растановкой аргументов, то выводится эта ошиюка в консоли. Я в принципе знаю как это исправить и сейчас буду этим заниматься.
Только есть ещё проблема, TabCompleter неправильно расставляет аргументы. После команды /wanted, первым аргументом выводится не set/add/take, а ники игроков на сервере, после ников игроков показывается 0/1/2/3/4/5, а после 0/1/2/3/4/5 снова ники и на этом всё.
 

Вложения

  • 1676558278329.png
    1676558278329.png
    25.5 KB · Просмотры: 14
Только есть ещё проблема, TabCompleter неправильно расставляет аргументы. После команды /wanted, первым аргументом выводится не set/add/take, а ники игроков на сервере, после ников игроков показывается 0/1/2/3/4/5, а после 0/1/2/3/4/5 снова ники и на этом всё.

Необходимо изменить проверку args.length в табкомплитере, который находится в конце файла класса WantedCommand, а точнее поставить другие числа, отвечающие за длину массива аргументов. Опять же - плагин я не проверял - набросал примерный скелет.
 
Я заметил, что если выполнить команду правильно, то все нормально, начисляется розыск и тд, а вот если например просто прописать команду /wanted, без аргументов, либо с неправильной растановкой аргументов, то выводится эта ошиюка в консоли. Я в принципе знаю как это исправить и сейчас буду этим заниматься.
Нет, всё таки я не знаю как это сделать, можете помочь пожалуйста?
Код:
package com.bodya.rpwanted.commands;

import com.bodya.rpwanted.Criminal;
import com.bodya.rpwanted.Main;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

public class WantedCommand implements TabExecutor {
    private final Main plugin;
    List<String> subcommands = Arrays.asList("set", "add", "take");
    List<String> wantedLevels = Arrays.asList("0","1","2","3","4","5");

    public WantedCommand(Main plugin){
        this.plugin = plugin;
    }

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (!sender.hasPermission("wanted") && !sender.isOp()) {
            sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cУ Вас недостаточно прав!"));
            return true;
        }
        String subcommand = args[0];
        if (args[0] == null) {
            sender.sendMessage("Не указана подкоманда (set/add/take).");
            return true;
        }
        if (args[1] == null) {
            sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cВведите имя подозреваемого!"));
            return true;
        }
        Criminal criminal = new Criminal(args[1]);
        int level = Integer.parseInt(args[2]);
        if (args[2] == null) {
            sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cВведите число розыска!"));
            return true;
        }
        switch (subcommand) {
            case "set":
                if (level > 5 || level < 0) {
                    sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cНеверное число розыска."));
                    return true;
                } else {
                    sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&fВы установили игроку &a" + args[1] + "&fуровень розыска - &a" + level + "&f."));
                    criminal.setWantedLevel(level);
                    return true;
                }
            case "add":
                int lvladd = criminal.getWantedLevel() + level;
                if (level > 5 || level < 0) {
                    sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cНеверное число розыска."));
                    return true;
                } else if (criminal.getWantedLevel() + level > 5) {
                    sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cУровень розыска у игрока будет больше возможного."));
                    return true;
                } else {
                    sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&fВы увеличили игроку &a" + args[1] + " &fуровень розыска на &a" + level + "&f."));
                    sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&fТекущий уровень розыска &a" + args[1] + "&f: &a" + lvladd + "&f."));
                    criminal.setWantedLevel(criminal.getWantedLevel() + level);
                    return true;
                }
            case "take":
                int lvltake = criminal.getWantedLevel() - level;
                if (level > 5 || level < 0) {
                    sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cНеверное число розыска."));
                    return true;
                } else if (criminal.getWantedLevel() - level < 0) {
                    sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cУровень розыска у игрока будет меньше возможного."));
                    return true;
                } else {
                    sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&fВы уменьшили игроку &a" + args[1] + " &fуровень розыска на &a" + level + "&f."));
                    sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&fТекущий уровень розыска &a" + args[1] + "&f: &a" + lvltake + "&f."));
                    criminal.setWantedLevel(criminal.getWantedLevel() - level);
                    return true;
                }
        }
        return false;
    }

    @Override
    public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
        if (!sender.hasPermission("wanted") && !sender.isOp()) {
            return null;
        }
        if (!command.getName().equalsIgnoreCase("wanted")) {
            return null;
        }
        if (args.length == 1) {
            return Arrays.asList("set", "take", "add");
        }
        if (args.length == 2) {
            return null;
        }
        if (args.length == 3) {
            return Arrays.asList("0", "1", "2", "3", "4", "5");
        }
        return new ArrayList<>();
    }
}
 
Последнее редактирование:
Нет, всё таки я не знаю как это сделать, можете помочь пожалуйста?

Необходимо добавить в плагин отлавливание ошибок (по-модному - Exceptions). В данном случае - прямо в тело команды с помощью конструкции try { ... } catch { ... }

ArrayIndexOutOfBoundsException - позволит отловить неправильное количество аргументов и сообщить игроку об этом.
NullPointerException - позволит отловить ошибки, связанные с отсутствием игрока в принципе, или отсутствием его на сервере в данный момент.
Базовый класс Exception как камень преткновения любым ошибкам, сразу говорю, что в нормальных проектах не стоит использовать такой супер-класс всех ошибок, это хоть и универсальная заплатка, но вместо получения информации о ошибках ваши игроки будут получать излюбленное всеми современными корпорациями эти ваши "Опаньки!" и "Упс!" которые [sarcasm] крайне информативны при возникновении ошибок [/sarcasm]. Если во время выполнения команды возникли хоть какие-то ошибки, то плагин просто попросит игрока убедиться в правильности выполнения команды и попросит его перепроверить аргументы.

Все указанные Вами ошибки исправил и залил на гитхаб, репозиторий - выше, на этот раз плагин протестировал, у меня всё работает.

Вам необходимо зарегистрироваться для просмотра изображений-вложений
 
Последнее редактирование:
Сразу предупреждаю, что Вам ещё предстоит добавить условие, которое будет запрещать менту установить розыск ниже 0 или выше 5.
Я это сделал, это видно в коде моего сообщения выше.
Авто объединение сообщений:

Необходимо добавить в плагин отлавливание ошибок (по-модному - Exceptions). В данном случае - прямо в тело команды с помощью конструкции try { ... } catch { ... }

ArrayIndexOutOfBoundsException - позволит отловить неправильное количество аргументов и сообщить игроку об этом.
NullPointerException - позволит отловить ошибки, связанные с отсутствием игрока в принципе, или отсутствием его на сервере в данный момент.
Базовый класс Exception как камень преткновения любым ошибкам, сразу говорю, что в нормальных проектах не стоит использовать такой супер-класс всех ошибок, это хоть и универсальная заплатка, но вместо получения информации о ошибках ваши игроки будут получать излюбленное всеми современными корпорациями эти ваши "Опаньки!" и "Упс!" которые [sarcasm] крайне информативны при возникновении ошибок [/sarcasm]. Если во время выполнения команды возникли хоть какие-то ошибки, то плагин просто попросит игрока убедиться в правильности выполнения команды и попросит его перепроверить аргументы.

Все указанные Вами ошибки исправил и залил на гитхаб, репозиторий - выше, на этот раз плагин протестировал, у меня всё работает. Сразу предупреждаю, что Вам ещё предстоит добавить условие, которое будет запрещать менту установить розыск ниже 0 или выше 5. В остальном - TabCompleter исправлен, добавлены обработчики ошибок.
Спасибо вам большое! Все проблемы решены. Тема закрыта!
 
Последнее редактирование:
Назад
Сверху Снизу