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

Плагин [CHAT/INFO/MISC] Healthy v1.4 [1.7.9-R0.2] - Смотрим на хп игрока в чате

Смотрю на картинку и создаётся впечатление что в плагине используется скедулер(scheduler). Это ведь не так?
Для таких раздумий существуют исходники, которые можно найти в джарнике плагина.
 
Смотрю на картинку и создаётся впечатление что в плагине используется скедулер(scheduler). Это ведь не так?
Я не настолько на голову двинутый, чтобы для элементарного действия писать шедулер.
Собсна, тот самый метод:
Java:
private String healthGraphical(int health) {
        //Звиняйте, мой инглиш весьма плох.
        int пол_хп = health / 2;
        int отс_хп = 10 - пол_хп;

        String out = this.conf.getString("openingBracket")
                .concat(this.conf.getString("colorExistingHP"));

        //Рисуем зелёные полоски
        for (int i = 0; i < пол_хп; i++) {
            out = out.concat(this.conf.getString("hpChar"));
        }

        //Добавляем цвет к отсутствующему хп
        out = out.concat(this.conf.getString("colorMissingHP"));

        //Рисуем красные полоски
        for (int i = 0; i < отс_хп; i++) {
            out = out.concat(this.conf.getString("hpChar"));
        }

        out = out.concat(this.conf.getString("closingBracket"));

        return ChatColor.translateAlternateColorCodes('&', out);
    }
 
Я не настолько на голову двинутый, чтобы для элементарного действия писать шедулер.
Собсна, тот самый метод:
Java:
private String healthGraphical(int health) {
        //Звиняйте, мой инглиш весьма плох.
        int пол_хп = health / 2;
        int отс_хп = 10 - пол_хп;

        String out = this.conf.getString("openingBracket")
                .concat(this.conf.getString("colorExistingHP"));

        //Рисуем зелёные полоски
        for (int i = 0; i < пол_хп; i++) {
            out = out.concat(this.conf.getString("hpChar"));
        }

        //Добавляем цвет к отсутствующему хп
        out = out.concat(this.conf.getString("colorMissingHP"));

        //Рисуем красные полоски
        for (int i = 0; i < отс_хп; i++) {
            out = out.concat(this.conf.getString("hpChar"));
        }

        out = out.concat(this.conf.getString("closingBracket"));

        return ChatColor.translateAlternateColorCodes('&', out);
    }
Не на всех серверах используется стандартное количество здоровья, на некоторых завышают, а на некоторых занижают.
Java:
private String healthGraphical(int health, int maxHealth) {
        
        int пол_хп = health / 2;
        int отс_хп = (maxHealth/2) - пол_хп;
 
Не на всех серверах используется стандартное количество здоровья, на некоторых завышают, а на некоторых занижают.
Java:
private String healthGraphical(int health, int maxHealth) {
       
        int пол_хп = health / 2;
        int отс_хп = (maxHealth/2) - пол_хп;

При написании плагина в общем. Я исходил из статичного максимального здоровья в 20 хп (разделив на два, разумеется), и делил хп игрока на 2, чтобы получились 10 штук символов.
Если поставить хп игрока выше, чем 20, то кол-во символов увеличится, что не есть хорошо.
В итоге, метод healthGraphical(int) будет переписан.
Я и не просил тыкать меня пальцем туда, где я уже глазами пробежал.
 
Выдаёт в консоли ошибку на инициализацию этой переменной - пустой инициализатор.
out = out.concat("&a" + health);
Убрал русское описание из конфига - всё отлично работает.
 
Выдаёт в консоли ошибку на инициализацию этой переменной - пустой инициализатор.
out = out.concat("&a" + health);
Убрал русское описание из конфига - всё отлично работает.
Такое гадство происходит при кодировке cp866 только .-.

Алсо, временно поправил графический вывод.
 
Я просто создал тему в "Помощь" с префиксом "Ищу плагин", а этот чувак начал разработку этого плагина :eek:
 
откуда такое число ХП было? Если 20 максимально, а хп больше 20, то можно же в методе private String healthGraphical(int health) обрезать, например:
health = ( health > 20 ) ? 20 : health ;
к тому же, если больше 20, то ловить это превышение куда-то в булеву переменную, и выводить уже не 20, а например 20+ с другим цветом, имхо
А еще, мне кажется еще лучше, если хп больше 20, то можно пропорционально выводить, т.е. если у тебя максимально должно быть 10 значков, то пропорционально и выводить 10 значков
 
откуда такое число ХП было? Если 20 максимально, а хп больше 20, то можно же в методе private String healthGraphical(int health) обрезать, например:
health = ( health > 20 ) ? 20 : health ;
к тому же, если больше 20, то ловить это превышение куда-то в булеву переменную, и выводить уже не 20, а например 20+ с другим цветом, имхо
А еще, мне кажется еще лучше, если хп больше 20, то можно пропорционально выводить, т.е. если у тебя максимально должно быть 10 значков, то пропорционально и выводить 10 значков
Ну такая задачка пока не по зубам мне. Да и к тому же, player.getMaxHealth() возвращает действительно максимальное кол-во хп, а не 20, что может помочь в пропорциональном выводе.
 
Итак, player.getMaxHealth() возвращает число макс. хп. Смотрим, если число больше 20, то считаем сколько хп должно подразумеваться под 10%. Для этого число делим на 10. Если было 120, то 10% - это 12.
Далее смотрим сколько у плэера хп, допустим 37.
Теперь смотрим сколько целых частей ( 12 ) влезет в 37, ((int)37/12) = 3, т.е. вывод будет 3 из 10, 3/10,
далее смотрим, если остаток больше половины части, то увеличиваем вывод на единицу:
остаток = 37 - ((int)37/12) = 1, остаток единица,
половина части = 12/2 = 6,
1 < 6, значит вывод будет 3/10 ХП, если бы было, например, 8 то, 8 > 6, следовательно вывод был бы не 3/10 а 4/10 ХП.
Вот так примерно можно пропорционально выводить
UPD: для численного вывода, можно ловить в булеву переменную
Код:
boolean overFlow = false ;

if( player.getMaxHealth() > 20 ) overFlow = true ;
Теперь если overFlow == true, выводим не 10 максимально, а 10+.

П.С. если тебе надо не 10 макс. а 20, просто сделай умножение на коеф. масштабирования, в данном случае на 2
------------
Надеюсь помог, алгоритм готов, только переведи в код
:creeper:
 
Итак, player.getMaxHealth() возвращает число макс. хп. Смотрим, если число больше 20, то считаем сколько хп должно подразумеваться под 10%. Для этого число делим на 10. Если было 120, то 10% - это 12.
Далее смотрим сколько у плэера хп, допустим 37.
Теперь смотрим сколько целых частей ( 12 ) влезет в 37, ((int)37/12) = 3, т.е. вывод будет 3 из 10, 3/10,
далее смотрим, если остаток больше половины части, то увеличиваем вывод на единицу:
остаток = 37 - ((int)37/12) = 1, остаток единица,
половина части = 12/2 = 6,
1 < 6, значит вывод будет 3/10 ХП, если бы было, например, 8 то, 8 > 6, следовательно вывод был бы не 3/10 а 4/10 ХП.
Вот так примерно можно пропорционально выводить
UPD: для численного вывода, можно ловить в булеву переменную
Код:
boolean overFlow = false ;

if( player.getMaxHealth() > 20 ) overFlow = true ;
Теперь если overFlow == true, выводим не 10 максимально, а 10+.

П.С. если тебе надо не 10 макс. а 20, просто сделай умножение на коеф. масштабирования, в данном случае на 2
------------
Надеюсь помог, алгоритм готов, только переведи в код
:creeper:
Теперь я понял, что я делаю херовые алгоритмы, хоть и брожу около правильного решения.
 
Теперь я понял, что я делаю херовые алгоритмы, хоть и брожу около правильного решения.

Совет: лучше составь программу на русском языке, а потом переведи на java код, так и легче алгоритм подогнать будет и сразу видно будет где потенциально могут завестить жучки.
Кстати, если у тебя и правда туго с алгоритмами, попробуй обязательно блок-схемы. Взял ручку, листок и накидал за пару минут.
Удачи с плагином :creeper:
 
а почему первые четыре на нуле? или там просто нет хп?
При наложении эффекта "сердец", они появляются пустыми, а потом регенятся до нужного уровня. А плагин просто посчитал уровень жизни в % соотношении
 

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

Назад
Верх