1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Эффект с кастомным названием

Тема в разделе "Разработка плагинов для новичков", создана пользователем kris13, 10 мар 2014.

Статус темы:
Закрыта.
  1. Автор темы
    kris13

    kris13 Активный участник Пользователь

    Баллы:
    78
    Нужно наложить на игрока эффект с мною заданным названием. Сейчас имею
    MyEffect effect = new MyEffect(id, modifier, name, instant);
    PotionEffect potionEffect = new PotionEffect(effect, time, amplifier);
    player.addPotionEffect(potionEffect);
    Код:
    public class MyEffect extends PotionEffectType {
        private String name;
        private double mod;
        private boolean inst;
        protected MyEffect(int id, double modifier, String name, boolean instant) {
            super(id);
            this.mod = modifier;
            this.name = name;
            this.inst = instant;
        }
        @Override
        public String getName() {
            return name;
        }
     // isInstant() и getDurationModifier() так же реализованы
    }
    Теперь о проблеме. Перегрузка getName() ни чего не дала т.к. смотрим в код оберток(PotionEffectTypeWrapper) и видим
    Код:
    @Override
    public String getName() {
        return getType().getName();
    }
    public PotionEffectType getType() {
        return PotionEffectType.getById(getId());
    }
    Т.е. имя он берет то которое прописано по нашему id в дефолтных эффектах.
    Метод registerPotionEffectType(PotionEffectType type) так же не спасает, т.к. перезаписывает дефолтные эффекты, и в силу модификаторов private и final у массива эффектов мы не можем его расширить для ухода от перезаписи.
    Как быть?
     
  2. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    С каких пор final и private мешает что- то сделать в переменной?
     
  3. Sirse

    Sirse Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    Sirse
    Самое топорное и простое решение - рефлексия.
     
    Den_Abr и ql_Nik_lp нравится это.
  4. Автор темы
    kris13

    kris13 Активный участник Пользователь

    Баллы:
    78
    Ну просто очень не хочется использовать reflection, да и не будет ли проблем в передачи этого модифицированного добра. Т.е. очевидный вариант - увеличить массив стандартных эффектов и тут тот самый вопрос "а не полагается ли майн где-то что размерность этого массива ровно 24?", хоть и странно, но вдруг. А этот косяк в обертке, насколько я знаю java, не изменить.
     
  5. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    А вообще ты не сможешь дать потионэффекту кастомное имя потому что оно гвозядми прибито в клиенте, имя изменится только на сервере.
     
    Den_Abr нравится это.
  6. Автор темы
    kris13

    kris13 Активный участник Пользователь

    Баллы:
    78
    Меня не пугают модификации клиента. Кстати это заявление побудило меня посмотреть код майна, вот что забавно в клиенте(1.5.2) массив эффектов имеет размерность 32. Ну и да, названия пришиты. На этом думается надо закрыть тему.
     
Статус темы:
Закрыта.

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