[1.6.4] Падение блока с кастомной моделью

16
0
Доброго времени суток.
Решил добавить своему блоку механизм падения как у песка и гравия. Скопипастил в класс своего блока методы из класса BlockSand обеспечивающие падение:

Код:
//Методы из класса BlockSand для падения блока
    
    /** Падают ли блоки мгновенно туда, где они останавливаются или они падают с течением времени */
    public static boolean fallInstantly;
    
    /**
     * Вызывается всякий раз, когда блок добавляется в мир
     */
    public void onBlockAdded(World par1World, int par2, int par3, int par4)
    {
        par1World.scheduleBlockUpdate(par2, par3, par4, this.blockID, this.tickRate(par1World));
    }
    
    /**
     * Позволяет знать, когда один из соседних блоков меняется. Не известно, какой сосед изменился (координаты, передаваемые являются их собственные) Args: х, у, г, сосед блок ID
     */
    public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5)
    {
        par1World.scheduleBlockUpdate(par2, par3, par4, this.blockID, this.tickRate(par1World));
    }
    
    /**
     * Обновляет тики блока если это заплпнировано
     */
    public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random)
    {
        if (!par1World.isRemote)
        {
            this.tryToFall(par1World, par2, par3, par4);
        }
    }
    
    /**
     * Если есть место для падения, то блок начинает падать
     */
    private void tryToFall(World par1World, int par2, int par3, int par4)
    {
        if (canFallBelow(par1World, par2, par3 - 1, par4) && par3 >= 0)
        {
            byte b0 = 32;

            if (!fallInstantly && par1World.checkChunksExist(par2 - b0, par3 - b0, par4 - b0, par2 + b0, par3 + b0, par4 + b0))
            {
                if (!par1World.isRemote)
                {
                    EntityFallingSand entityfallingsand = new EntityFallingSand(par1World, (double)((float)par2 + 0.5F), (double)((float)par3 + 0.5F), (double)((float)par4 + 0.5F), this.blockID, par1World.getBlockMetadata(par2, par3, par4));
                    this.onStartFalling(entityfallingsand);
                    par1World.spawnEntityInWorld(entityfallingsand);
                }
            }
            else
            {
                par1World.setBlockToAir(par2, par3, par4);

                while (canFallBelow(par1World, par2, par3 - 1, par4) && par3 > 0)
                {
                    --par3;
                }

                if (par3 > 0)
                {
                    par1World.setBlock(par2, par3, par4, this.blockID);
                }
            }
        }
    }
    
    /**
     * Вызывается при создании падающей сущности блока
     */
    protected void onStartFalling(EntityFallingSand par1EntityFallingSand) {}
    
    /**
     * Возвращает сколько тиков проходит перед падением блока
     */
    public int tickRate(World par1World)
    {
        return 1;
    }
    
    /**
     * Проверяет, может ли блок упасть вниз
     */
    public static boolean canFallBelow(World par0World, int par1, int par2, int par3)
    {
        int l = par0World.getBlockId(par1, par2, par3);

        if (par0World.isAirBlock(par1, par2, par3))
        {
            return true;
        }
        else if (l == Block.fire.blockID)
        {
            return true;
        }
        else
        {
            Material material = Block.blocksList[l].blockMaterial;
            return material == Material.water ? true : material == Material.lava;
        }
    }
    
    
    /**
     * Вызывается, когда сущность падающего блока попадает на землю и превращается обратно в блок
     */
    public void onFinishFalling(World par1World, int par2, int par3, int par4, int par5) {}

Теперь блок ведёт себя как песок и гравий, но есть один не красивый момент. Дело в том что мой блок это деревянное ведро из этой темы и не является кубом, а имеет 3d-модель в формате obj. Когда же начинается процесс падения, то блок с 3d-моделью заменяется кубом на который в качестве текстуры натягивается иконка item'а из инвентаря. Когда падение заканчивается. то куб снова становится ведром.
Как правильно отрисовать падение такого блока с 3d-моделью?
 
Возможно, нужно будет создать свой подающий Entity и со своим рендером, в котором и будет рендериться своя модель.
 
Заглянул в класс EntityFallingSand Пришёл к выводу, что этот класс не только для песка но и для всех блоков обладающих механизмом падения. Увидел проверки типо  if (this.isAnvil) и вспомнил что наковальня тоже падает. Посмотрел код класса наковальни нашёл только два метода относящихся к этому механизму:

protected void onStartFalling(EntityFallingSand par1EntityFallingSand){...}
public void onFinishFalling(World par1World, int par2, int par3, int par4, int par5){...}

в отличие от песка у которого методов больше они приведены в первом посте. Посмотрел падение наковальни - да это то что нужно. Поэтому решил исследовать класс EntityFallingSand путём вмешательства и чтобы его не испортить создал в своём пакете класс EntityFalling перекинул в него код из EntityFallingSand и изменил в классе своего блока использование EntityFallingSand на EntityFalling из своего пакета.
Разумно было ожидать что механика падения моего блока не изменится так как EntityFalling полная копия EntityFallingSand, однако при тестировании обнаружил что падение изменилось - мой блок просто пропадает а затем появляется уже внизу на земле. Может EntityFalling из моего пакета как-то и где то нужно зарегистрировать? хотя ведь факт падения происходит с использованием EntityFalling, но процесс падения не отображается. Помогите понять почему так происходит?
 
Потому что надо регистрировать энтитям рендер, алло. Ванильная энтитя падающего блока не рендерит TESR-ообразые блоки. Берешь и прикручиваешь к своей энтите кустомный рендер.
 
Назад
Сверху