Помогите Окраска брони

  • Автор темы Автор темы Dexel
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Dexel

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
SiRiuS_OSiRiuS
Добрый день. Spigot 1.11.2
Как можно дать ItemStack'у кожаной броне цвет?
К примеру, #94CCEB
 
Java:
LeatherArmorMeta meta = (LeatherArmorMeta) item.getItemMeta();
int red = 255; //максимальное значение
int green = 0; //минимальное значение
int blue = 110;
meta.setColor(Color.fromRGB(red, green, blue));
item.setItemMeta(meta);

Принимать во входной параметр Hex коды ведерко не умеет
Откопал свой старый (не старый он) метод с хексами.
Java:
/**
*На вход подается требуемый itemStack и строка с цветовым кодом
*Строка может быть:
* 1) '#FAB' (будет интерпертироваться как '#FFAABB')
* 2) '#94CCEB'
* 3) '255,0,110' - стандартный RGB
* Остальные входные строки игнорируются
* На выходе получаем ItemMeta с колором, если входной ItemStack был кожанкой
*/
public static ItemMeta getColorMeta(String data, ItemStack item){
    item=item.clone(); //клонируем item (а то мало ли)
    if (item.getType()!=Material.LEATHER_BOOTS&&item.getType()!=Material.LEATHER_CHESTPLATE
            &&item.getType()!=Material.LEATHER_HELMET&&item.getType()!=Material.LEATHER_LEGGINGS) return item.getItemMeta(); //проверяем предмет. если не кожанка, то возвращает ту мету, которая и была
    if (data==null||data.isEmpty()) return item.getItemMeta(); //если строка пустая, то снова возвращаем старую мету
    if (data.startsWith("#")){
        data=data.substring(1).toUpperCase();
        if (data.length()!=3&&data.length()!=6) return item.getItemMeta();
        if (data.length()==3){
            LeatherArmorMeta meta = (LeatherArmorMeta) item.getItemMeta();
            //перегон хекса в RGB
            int red = fromHEXtoRGB(data.substring(0, 0)+data.substring(0, 0));
            int green = fromHEXtoRGB(data.substring(1, 1)+data.substring(1, 1));
            int blue = fromHEXtoRGB(data.substring(2, 2)+data.substring(2, 2));
            meta.setColor(Color.fromRGB(red, green, blue));
            return meta;
        }
        if (data.length()==6){
            LeatherArmorMeta meta = (LeatherArmorMeta) item.getItemMeta();
            //перегон хекса в RGB
            int red = fromHEXtoRGB(data.substring(0, 1));
            int green = fromHEXtoRGB(data.substring(2, 3));
            int blue = fromHEXtoRGB(data.substring(4, 5));
            meta.setColor(Color.fromRGB(red, green, blue));
            return meta;
        }
    }
    if (data.split(",").length==3){
        LeatherArmorMeta meta = (LeatherArmorMeta) item.getItemMeta();
        if (!isNumeric(data.split(",")[0])||!isNumeric(data.split(",")[1])||!isNumeric(data.split(",")[2])) return item.getItemMeta();
        int red = Integer.parseInt((data.split(",")[0]));
        int green = Integer.parseInt((data.split(",")[1]));
        int blue = Integer.parseInt((data.split(",")[2]));
        meta.setColor(Color.fromRGB(red, green, blue));
        return meta;
    }
   
    return item.getItemMeta();
}

//дополнительные методы, которые были использованы в данном решении
private static int fromHEXtoRGB(String hex){
    if (hex.length()!=2)return 0;
    if (!hex.matches("[0-9A-Fa-f]")) return 0;
    int color = letterToInt(hex.toUpperCase().charAt(0))*16+letterToInt(hex.toUpperCase().charAt(1));
    return color;
}
/**
 * Only Upper Case
 * @param a
 * @return
 */
private static int letterToInt(char a){
    switch (a){
    case 'A':
        return 10;
    case 'B':
        return 11;
    case 'C':
        return 12;
    case 'D':
        return 13;
    case 'E':
        return 14;
    case 'F':
        return 15;
       
    default: return -1;
    }
}
public static boolean isNumeric(String s){
    if (s==null) return false;
    if (s.startsWith("-")) s=s.substring(1);
    Pattern p = Pattern.compile("(\\d+)(\\.\\d+)?");
    Matcher m = p.matcher(s);
    return m.matches();
}
 
Java:
LeatherArmorMeta meta = (LeatherArmorMeta) item.getItemMeta();
int red = 255; //максимальное значение
int green = 0; //минимальное значение
int blue = 110;
meta.setColor(Color.fromRGB(red, green, blue));
item.setItemMeta(meta);

Принимать во входной параметр Hex коды ведерко не умеет
Откопал свой старый (не старый он) метод с хексами.
Java:
/**
*На вход подается требуемый itemStack и строка с цветовым кодом
*Строка может быть:
* 1) '#FAB' (будет интерпертироваться как '#FFAABB')
* 2) '#94CCEB'
* 3) '255,0,110' - стандартный RGB
* Остальные входные строки игнорируются
* На выходе получаем ItemMeta с колором, если входной ItemStack был кожанкой
*/
public static ItemMeta getColorMeta(String data, ItemStack item){
    item=item.clone(); //клонируем item (а то мало ли)
    if (item.getType()!=Material.LEATHER_BOOTS&&item.getType()!=Material.LEATHER_CHESTPLATE
            &&item.getType()!=Material.LEATHER_HELMET&&item.getType()!=Material.LEATHER_LEGGINGS) return item.getItemMeta(); //проверяем предмет. если не кожанка, то возвращает ту мету, которая и была
    if (data==null||data.isEmpty()) return item.getItemMeta(); //если строка пустая, то снова возвращаем старую мету
    if (data.startsWith("#")){
        data=data.substring(1).toUpperCase();
        if (data.length()!=3&&data.length()!=6) return item.getItemMeta();
        if (data.length()==3){
            LeatherArmorMeta meta = (LeatherArmorMeta) item.getItemMeta();
            //перегон хекса в RGB
            int red = fromHEXtoRGB(data.substring(0, 0)+data.substring(0, 0));
            int green = fromHEXtoRGB(data.substring(1, 1)+data.substring(1, 1));
            int blue = fromHEXtoRGB(data.substring(2, 2)+data.substring(2, 2));
            meta.setColor(Color.fromRGB(red, green, blue));
            return meta;
        }
        if (data.length()==6){
            LeatherArmorMeta meta = (LeatherArmorMeta) item.getItemMeta();
            //перегон хекса в RGB
            int red = fromHEXtoRGB(data.substring(0, 1));
            int green = fromHEXtoRGB(data.substring(2, 3));
            int blue = fromHEXtoRGB(data.substring(4, 5));
            meta.setColor(Color.fromRGB(red, green, blue));
            return meta;
        }
    }
    if (data.split(",").length==3){
        LeatherArmorMeta meta = (LeatherArmorMeta) item.getItemMeta();
        if (!isNumeric(data.split(",")[0])||!isNumeric(data.split(",")[1])||!isNumeric(data.split(",")[2])) return item.getItemMeta();
        int red = Integer.parseInt((data.split(",")[0]));
        int green = Integer.parseInt((data.split(",")[1]));
        int blue = Integer.parseInt((data.split(",")[2]));
        meta.setColor(Color.fromRGB(red, green, blue));
        return meta;
    }

    return item.getItemMeta();
}

//дополнительные методы, которые были использованы в данном решении
private static int fromHEXtoRGB(String hex){
    if (hex.length()!=2)return 0;
    if (!hex.matches("[0-9A-Fa-f]")) return 0;
    int color = letterToInt(hex.toUpperCase().charAt(0))*16+letterToInt(hex.toUpperCase().charAt(1));
    return color;
}
/**
* Only Upper Case
* @param a
* @return
*/
private static int letterToInt(char a){
    switch (a){
    case 'A':
        return 10;
    case 'B':
        return 11;
    case 'C':
        return 12;
    case 'D':
        return 13;
    case 'E':
        return 14;
    case 'F':
        return 15;
    
    default: return -1;
    }
}
public static boolean isNumeric(String s){
    if (s==null) return false;
    if (s.startsWith("-")) s=s.substring(1);
    Pattern p = Pattern.compile("(\\d+)(\\.\\d+)?");
    Matcher m = p.matcher(s);
    return m.matches();
}
А можно объединить эти две меты? Когда я устанавливаю предмету мету цвета, убирается другая мета (имя, описание, чары и т.д.)

Можно. Спасибо, тема закрыта.
 
Последнее редактирование:
Статус
Закрыто для дальнейших ответов.
Назад
Верх