Два баундбокса

Maxik001

Золотая лига
Сообщения
4,419
Лучшие ответы
41
Симпатии
479
#1
Версия Minecraft
1.12.2
Подтверждение
Я максимально подробно описал проблему, включая исходный код файлов, краш лог, изображения и другую информацию, которая может помочь пользователям форума решить мой вопрос!
Драсте. Есть такая тема - необходимо сделать провода, чтобы они вписывались во внутренний угол. Но в тоже время нужно чтобы сломать их можно было и там, и там. Делать непонятный куб как у забора - очень некрасиво.

Можно ли сделать как то два параллелепипеда, а потом "суммировать" их как один?

1562866787248.png
 

Doc

Золотая лига
Сообщения
2,432
Лучшие ответы
136
Симпатии
326
#2
Посмотри как сделаны редстоун провода в project red. (вроде в нем)
 

Maxik001

Золотая лига
Сообщения
4,419
Лучшие ответы
41
Симпатии
479
#3
А попроще есть что нибудь? Я не умею в скалу
 

timaxa007

Команда форума
Сообщения
5,567
Лучшие ответы
370
Симпатии
531
#4
Я не особо понял, но то что понял. Проверяй на какую сторону блока ты взаимодействуешь (или по сложнее координаты куда падает взгляд игрока).
 

Maxik001

Золотая лига
Сообщения
4,419
Лучшие ответы
41
Симпатии
479
#5

Maxik001

Золотая лига
Сообщения
4,419
Лучшие ответы
41
Симпатии
479
#6
Какой аналог у setBlockBounds в 1.12.2?
 

Doc

Золотая лига
Сообщения
2,432
Лучшие ответы
136
Симпатии
326
#7
Тебе нужно скорее всего просто свой AABB хранить и в getter'е возвращать его.
 

Maxik001

Золотая лига
Сообщения
4,419
Лучшие ответы
41
Симпатии
479
#8
Нет, коллизию я уже сделал. В него упираюсь, на ней можно стоять. Физически норм, а вот визуально пока нет. Я щас пытаюсь сделать чтобы при наведении на блок мой второй баундбокс тоже отрисовывался, и пока не знаю как это сделать. Ну и наоборот, чтобы при наведении на этот отрисовывался изначальный
Java:
    @SubscribeEvent
    public void drawSelectionBox(DrawBlockHighlightEvent e)
    {
      
        if(e.getTarget().typeOfHit == RayTraceResult.Type.BLOCK)
        {
            BlockPos blockpos = e.getTarget().getBlockPos();
            World world = e.getPlayer().getEntityWorld();
          
//            WiresBlock wb = (WiresBlock)world.getBlockState(blockpos).getBlock();
//            if(world.getBlockState(blockpos).getBlock() == wb)
            e.getContext().drawSelectionBox(e.getPlayer(), e.getTarget(), 0, e.getPartialTicks());
        }
    //    e.setCanceled(true);
    }
}
 

Maxik001

Золотая лига
Сообщения
4,419
Лучшие ответы
41
Симпатии
479
#9
хыхы че то такое получилось с помощью
e.getContext().drawBoundingBox(0.5F, 0.0F, 0.0F, 1.0F, 0.5F, 0.5F, 0, 0, 0, 1);
но оно почему то ездит вместе со мной, а не стоит около блока.
1562871505633.png
 

Doc

Золотая лига
Сообщения
2,432
Лучшие ответы
136
Симпатии
326
#10
Скорее всего позицию из ивента надо брать?
 

Maxik001

Золотая лига
Сообщения
4,419
Лучшие ответы
41
Симпатии
479
#11
а как вертексы из блокпоза достать?:oops:
я не нашел аналогов, а этот рисует для игрока, а не для блока, в принципе логично

тут явно надо через drawSelectionBox только я не понимаю почему он не работает
 

Maxik001

Золотая лига
Сообщения
4,419
Лучшие ответы
41
Симпатии
479
#12
Короче стыбзил код рендера из RenderGlobal, все рендерится,но криво. Одна вершина куба как и положено, находится в нижнем углу. Но вторая почему то ездит вслед за позицией игрока. Я уже весь измучался, все потыркал, но так и не понял как сделать чтобы вторая вершина имела фиксированные координаты.
Java:
public class DrawCollisionBox {



    @SubscribeEvent
    public void drawSelectionBox(DrawBlockHighlightEvent e)
    {

        if(e.getTarget().typeOfHit == RayTraceResult.Type.BLOCK)
        {
            int execute = 0;


            if (execute == 0 && e.getTarget().typeOfHit == RayTraceResult.Type.BLOCK)
            {
                GlStateManager.enableBlend();
                GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
                GlStateManager.glLineWidth(2.0F);
                GlStateManager.disableTexture2D();
                GlStateManager.depthMask(false);
                BlockPos blockpos = e.getTarget().getBlockPos();
                IBlockState iblockstate = e.getPlayer().getEntityWorld().getBlockState(blockpos);
                if(iblockstate.getBlock() == RegBlocks.wires) {
                    if (iblockstate.getMaterial() != Material.AIR && e.getPlayer().getEntityWorld().getWorldBorder().contains(blockpos))
                    {
                        double d3 = e.getPlayer().lastTickPosX + (e.getPlayer().posX - e.getPlayer().lastTickPosX) * (double)e.getPartialTicks();
                        double d4 = e.getPlayer().lastTickPosY + (e.getPlayer().posY - e.getPlayer().lastTickPosY) * (double)e.getPartialTicks();
                        double d5 = e.getPlayer().lastTickPosZ + (e.getPlayer().posZ - e.getPlayer().lastTickPosZ) * (double)e.getPartialTicks();
                        
                        
                        RenderGlobal.drawSelectionBoundingBox(iblockstate.getSelectedBoundingBox(e.getPlayer().getEntityWorld(), blockpos).grow(0.0020000000949949026D).offset(-d3, -d4, -d5), 0F, 0.0F, 0.0F, 0.4F);
                    
                        AxisAlignedBB box = new AxisAlignedBB(0, 0, 0,   d3, d4 , d5 );
                        RenderGlobal.drawSelectionBoundingBox(iblockstate.getSelectedBoundingBox(e.getPlayer().getEntityWorld(), blockpos).intersect(box).offset(-d3, -d4, -d5), 0F, 0, 0, 1);                    }
                } else
                    if (iblockstate.getMaterial() != Material.AIR && e.getPlayer().getEntityWorld().getWorldBorder().contains(blockpos))
                    {
                        double d3 = e.getPlayer().lastTickPosX + (e.getPlayer().posX - e.getPlayer().lastTickPosX) * (double)e.getPartialTicks();
                        double d4 = e.getPlayer().lastTickPosY + (e.getPlayer().posY - e.getPlayer().lastTickPosY) * (double)e.getPartialTicks();
                        double d5 = e.getPlayer().lastTickPosZ + (e.getPlayer().posZ - e.getPlayer().lastTickPosZ) * (double)e.getPartialTicks();

                        RenderGlobal.drawSelectionBoundingBox(iblockstate.getSelectedBoundingBox(e.getPlayer().getEntityWorld(), blockpos).grow(0.0020000000949949026D).offset(-d3, -d4, -d5), 0F, 0.0F, 0.0F, 0.4F);
                    }
                GlStateManager.depthMask(true);
                GlStateManager.enableTexture2D();
                GlStateManager.disableBlend();
            }

        }
        e.setCanceled(true);

    }
}
bandicam 2019-07-11 23-49-13-954.jpg
 

jopi

Каменная лига
Сообщения
551
Лучшие ответы
7
Симпатии
23
#13
Вместо projectred есть redlogic :D,
но вообще я не уверенн но попробуй ковырнуть ForgeMicroBlocks или както-так либа называется. уже не вспомню ;(
 

hohserg1

Алмазная лига
Сообщения
3,869
Лучшие ответы
100
Симпатии
461
#14
@Maxik001 ты хочешь два+ баунд-бокса у одного блока? Или хочешь, чтобы баунд-бокс блок менялся при смене точки, куда игрок смотрит?
Оба можно посмотреть в automagy, там кристаллы редстоуна по дефолту имеют один бокс, когда на них смотришь в жезлом в руке - 5 боксов
 

Maxik001

Золотая лига
Сообщения
4,419
Лучшие ответы
41
Симпатии
479
#15
Два баундбокса у одного блока, да
 

Maxik001

Золотая лига
Сообщения
4,419
Лучшие ответы
41
Симпатии
479
#16
В общем то у меня получилось, я понял как это дело настраивать, за исключением того, что я не пойму откуда беруться эти диагонали и как их скрыть...
1563111608680.png
 

Maxik001

Золотая лига
Сообщения
4,419
Лучшие ответы
41
Симпатии
479
#17
Также смущает то, что у этого куба 18 вершин вместо нормальных 8...
Зачем это?
 

hohserg1

Алмазная лига
Сообщения
3,869
Лучшие ответы
100
Симпатии
461
#18
А че за диагональные линии?
 

Maxik001

Золотая лига
Сообщения
4,419
Лучшие ответы
41
Симпатии
479
#19
На скриншот посмотри
 

Maxik001

Золотая лига
Сообщения
4,419
Лучшие ответы
41
Симпатии
479
#20
Все понял, это тесселятор так работает, проводит линию между предыдущей точкой и новой
 
Сверху