Как програмно сдвинуть текстуру

Версия Minecraft
1.7.10
1,067
36
448
Сделал кастомный Potion
Java:
static class BreathOfCouragePotion extends Potion {

        protected BreathOfCouragePotion(int id, boolean isBadEffect, int liquidColor) {
            super(id, isBadEffect, liquidColor);
            setPotionName("potion.breathOfCourage");
            setIconIndex(0, 0);
        }

        @Override
        public boolean hasStatusIcon() {
            // Хитрый хак, перед рендером подменяем текстуру с иконками зелий на свою
            Minecraft.getMinecraft().renderEngine.bindTexture(potionIcon);
            return true;
        }
    }

Но ванильный код рендерит иконки Potion'ов с захардкоденым смещением
Код:
if (potion.hasStatusIcon())
{
    int l = potion.getStatusIconIndex();
    // Инконки берутся с высоты 198
    this.drawTexturedModalRect(i + 6, j + 7, 0 + l % 8 * 18, 198 + l / 8 * 18, 18, 18);
}
Как видим, все иконки зелий хранятся прямо в текстуре инвентаря с 198-го пикселя по вертикали


Хуковать, наследовать InventoryEffectRenderer я не хочу. Мне нужен лишь способ в пределах функции Potion#hasStatusIcon() сдвинуть текстуру на 198 пикселей вверх, чтобы устранить этот недочет. Я пробовал юзать GL11.glTranslatef(0, -10, 0);, но вместо текстуры это поднимает весь контент в бэкграунде окошка с иконкой зелья
2019-04-03_19-01-54.png

Как быть, товарищи?
 

Вложения

  • inventory.png
    inventory.png
    10.5 KB · Просмотры: 142
1,067
36
448
1,067
36
448
1,067
36
448
1,067
36
448
@ロロロ Замечательный грязный хак))) Однако меня все не покидает мысля о том, как сделать рендер кастомной иконки по человечески. Подумав немного, я пришел к выводу, что есть лишь 2 способа сделать так, чтобы ванильный рендер не рисовал стандартные текстуры позади нашей иконки (без юзания хуков, само собой):
  1. hasStatusIcon() возвращает false - тогда нарушается смысл метода и это может выйти нам боком если другой мод, рендерящий иконки зелий, пытается чекнуть наличие у зелья иконки через этот метод.
  2. hasStatusIcon() возвращает true и индекс иконки не устанавливается (-1 по умолчанию) - тогда ванильный код будет рендерить пустой квадрат, а рендер самой иконки будет делегирован методу renderInventoryEffect()(спасибо ребятам из форджа за это). Недостаток решения проявится, если мой мод будет держать несколько иконок в одном файле. К тому же логика hasStatusIcon() строится на индексе иконки и данный вариант нарушает ванильную логику.
Предчувствую что сторонние моды, рендерящие иконки зелья, в большой степени повторяют ванильный рендер. Поэтому скорее всего они сначала отрисуют иконки внутри класса кастомного gui через drawTexturedModalRect() и лишь потом вызовут renderInventoryEffect(). И даже если они сделают так, я ОЧЕНЬ надеюсь, что у автора хватит мозгов как следует изучить вопрос и догадаться, что СКОРЕЕ ВСЕГО другие моды для предотвращения ванильного рендера иконок будут возвращать false в hasStatusIcon(). А посему в сторонних модах чекать наличие иконки нужно не вызовом этого метода, а через вычисление "statusIconIndex >= 0".

Все это чисто мое размышление и я не могу гарантировать его верность. Было бы здорово, если бы форумчане кинули бы мне пару модов, содержащие кастомные gui с рендером действующих на игрока зелий.
 
2,994
191
582
Пока читал - думал ответить "так если этот вариант не работает посмотри другие моды", но прочитал крайнюю строку и ..
Как минимум в IC2 есть радиация.
Это первое, что пришло, второе - скачай любую сборку под 1.7, с кучей модов. После напиши /effect и у тебя будет показано какие вообще есть эффекты. Надеюсь, что там будет как понять, откуда этот эффект завезли, ибо на сколько я помню там id, без modid:name. Но не знаю, сложностей по гуглу названия как вариант не должно возникнуть.
 
887
25
153
Почти все моды с эффектами позволяют ставить свой ID в конфигурации, ибо ограничение 256 эффектов и все используют самые первые свободные ID.

Моды с эффектами: Witchery (~50 штук, вот с ним-то часто конфликты ID и бывают, кстати), ThaumCraft (~5 штук), Enviromine (4 штуки).
 
Сверху