Блок, принимающий текстуру блока, на котором стоит

Версия Minecraft
1.12.2
198
1
24
Здравствуйте!
Недавно я начал писать свой первый мод, который добавляет различные блоки-ловушки. Суть в том, что наступая на этот блок, игрок или моб дохнет от setHealth(0.0f), или взлетает как ракета и падает, или встает как вкопаный, или получает урон как от кактусов, или эффект иссушения на максимально возможный срок... У блоков есть текстуры, они исправно работают, но хотелось бы иметь возможность маскировки, предпочтительно простым способом - установкой на блок который ловушка должна имитировать.
Пожалуйста, подскажите, как можно реализовать такие превращения, и можно ли это сделать вообще, не создавая множества вариантов одного и того же блока но с разными текстурами. Признаюсь честно - я даже и ен пытался это реализовать, хотя гуглил на эту тему много.
Мод пишу для 1.12.2, в Eclipse, и использую библиотеку LazyModder от Z-Doctor'а. Пробовал без библиотеки, по туториалам с этого сайта, но были проблемы с текстурами, которые не решались проверкой и перепроверкой кода :( Исходники и библиотека прилагается.
 

Вложения

  • Evilblocks-1.zip
    414.9 KB · Просмотры: 2
7,099
324
1,509
Отличная таска! Чтобы блоку поменять модель в зависимости от блока под ним нужно в стэйте блока зкодировать блок на котрый он был установлен. Т.к. блоков много, то нужно использовать getActualState(такое состояние не будет сохраняться при сохранении в мире, поэтому может быть неограниченное кол-во вариантов).
Кастомная модель будет брать из стэйта блок, модель которого должна использоваться и возвращать ее квады
 
198
1
24
А поподробнее можно? Просто я в этом деле ну совсем начинающий. И откуда только берутся великие мастера этого дела, при такой нехватке документации?

Вот, к примеру, код блока который заставляет наступившего застыть на месте:
Java:
public class StopperBlock extends EasyBlock {

    public StopperBlock(String name, Material materialIn) {
        super(name, materialIn);
    }   
    
    public void onEntityWalk(World world, BlockPos pos, Entity entityIn){
        ((EntityLivingBase)entityIn).addPotionEffect(new PotionEffect(Potion.getPotionById(2),2147483647, 256));
        super.onEntityWalk(world, pos, entityIn);
    }   

}
И что нужно сделать, чтобы он выглядел как то на чем стоит?
 
7,099
324
1,509
И откуда только берутся великие мастера этого дела, при такой нехватке документации?
Понятия не имею, но мне кажется, что ими становятся те, кто очень хочет реализовать то, что им нравится

И что нужно сделать, чтобы он выглядел как то на чем стоит?
На этот вопрос уже дан ответ во втоом сообщении.
Напишу подробнее, если не понятно
Исходя из этих двух туторов нетрудно понять, что baked модели можно делать не только через json
Создание моделей при помощи кода
Добавление моделей блокам и предметам
Далее, если посмотреть на тип функции getQuads, можно увидеть, что ее результат может зависеть от стэйта блока.
При этом во время выполнения мы можем хранить че угодно в стэйте, при этом не сможем сохранить это в мир(а нам и не нужно). Для этого используется переопределение getActualState в своем блоке.
Поэтому мы можем хранить в стэйте нашего блока блок над которым он стоит, в getQuads доставать модель этого блока и возвращать ее квады.
Достать модель можно как-то так: Minecraft#getRenderItem#getItemModelWithOverrides
 
Сверху