Плагин Bukkit — сравнение аргумента со всеми возможными элементами

Я только недавно начал программировать плагины Bukkit для личного использования и в учебных целях. Я решил сделать глобальный магазин из командной строки, так как не хочу создавать магазин в игре. Вот код, который у меня есть сейчас:

package me.rougelong.globalshop;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.Material;

import java.util.logging.Logger;

public class globalshop extends JavaPlugin{
public final Logger logger = Logger.getLogger("Minecraft");
public static globalshop plugin;

@Override
public void onDisable() {
    PluginDescriptionFile pdfFile = this.getDescription();
    this.logger.info(pdfFile.getName() + "  Has Been Disabled!");
}

@Override
public void onEnable() {
    PluginDescriptionFile pdfFile = this.getDescription();
    this.logger.info(pdfFile.getName() + " Version " + pdfFile.getVersion() + "  Has Been Enabled!");
}


public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){
    String itemName = args[0];
    String amount = args[1];
    if (args.length > 4 && commandLabel.equalsIgnoreCase("shopcheck")) {
           sender.sendMessage(ChatColor.RED + "Too many arguments! /shopcheck [item_name] [quantity]");
           return false;
        } 
    if (args.length < 2 && commandLabel.equalsIgnoreCase("shopcheck")) {
           sender.sendMessage(ChatColor.RED + "Not enough arguments! /shopcheck [item_name] [quantity]");
           return false;
        }
    if (args.length > 4 && commandLabel.equalsIgnoreCase("shopbuy")) {
           sender.sendMessage(ChatColor.RED + "Too many arguments! /shopbuy [item_name] [quantity]");
           return false;
        } 
    if (args.length < 2 && commandLabel.equalsIgnoreCase("shopbuy")) {
           sender.sendMessage(ChatColor.RED + "Not enough arguments! /shopbuy [item_name] [quantity]");
           return false;
        }
    if (args.length > 4 && commandLabel.equalsIgnoreCase("shopsell")) {
           sender.sendMessage(ChatColor.RED + "Too many arguments! /shopsell [item_name] [quantity]");
           return false;
        } 
    if (args.length < 2 && commandLabel.equalsIgnoreCase("shopsell")) {
           sender.sendMessage(ChatColor.RED + "Not enough arguments! /shopsell [item_name] [quantity]");
           return false;
        }
    if (commandLabel.equalsIgnoreCase("shopcheck")){
            //I need to get it to compare HERE. :P
        return false;
    }

    return false;
}

}

Мне нужно, чтобы сравнить itemName или args[0] (будет строкой. Пример: «булыжник») со всеми возможными элементами, и я бы предпочел не записывать все элементы в этот плагин, я был интересно, как ссылаться на списки элементов в Bukkit. Я не уверен, будут ли это блоки, материалы или что-то еще.

Мой вопрос (ы): что мне нужно импортировать, чтобы правильно сравнить аргумент? Какой код я бы использовал для сравнения этого единственного аргумента со всеми элементами, чтобы он мог его идентифицировать?

Как только этот код будет понят и заработает, я перейду к тому, чтобы он определил цену, указанную либо в этой программе (надеюсь, нет), либо в отдельном файле. И затем заставить его проверить баланс отправляющего игрока, чтобы узнать, могут ли они его купить, а затем вычесть деньги и добавить предмет в свой инвентарь, не удаляя что-то еще, что у них есть в руке.


person user3111959    schedule 17.12.2013    source источник


Ответы (2)


Один из способов сделать это — использовать существующее перечисление из API Bukkit в качестве списка вещей, которые вы можете купить. Каждый класс enum поддерживает метод valueOf(String). Вызов этого метода возвращает конкретное значение перечисления или генерирует исключение (если строка не является допустимой константой перечисления).

String materialName = arg[n]..toUpperCase();
Material theMaterial = null;
try
{
  theMaterial = Material.valueOf(materialName );
}
catch (Exception e)
{
  //Not a valid material
}

Однако, если у вас есть какой-то файл или список, в котором есть все возможные материалы с указанием их цены, вы можете так же легко найти этот список.

person Darius X.    schedule 17.12.2013
comment
Это не то, что я использовал, покупка помогла мне найти то, что я хотел, спасибо. Теперь к следующему вопросу! лол спасибо. - person user3111959; 18.12.2013
comment
Используйте IllegalArgumentException в блоке catch. Исключение слишком общее. - person RoccoDev; 30.04.2017

Используйте ID/название материала, чтобы получить его. Я сделал это раньше. Это легко

person user3029101    schedule 17.12.2013