OBJ блок (2 вопроса)

Версия Minecraft
1.7.10
459
13
35
Всем привет.
У меня имеется два небольших вопроса.

1)
Делаю на данный момент блок с нестандратной моделькой.
Решил сделать непроходимость с помощью фантом-блоков.
Разобрался каким образом можно ломать фантом-блоки, когда ломается основной, но никак не могу понять, как ломать основной, если ломается фантом.
Прошу помочь чуть с кодом, ибо понимаю, как всё это можно реализовать, но с кодом вообще никак не идёт.

2)
Как сделать так, что бы данный блок можно было ставить только лишь в определённом радиусе друг от друга, то бишь 3+ блока и что бы нельзя было ставить, допустим на траве.

Заранее всем спасибо за любую помощь, благодарю.
 

timaxa007

Модератор
5,831
409
672
Прошу помочь чуть с кодом
Код:
public class BlockMultiBlock extends Block implements ITileEntityProvider {

    public BlockMultiBlock() {
        super(Material.iron);
        setStepSound(soundTypeAnvil);
        setHardness(5F);
        setResistance(2000F);
        setBlockTextureName(MultiBlockMod.MODID + ":multi_block");
        setBlockName(MultiBlockMod.MODID + ".multi_block");
        setCreativeTab(CreativeTabs.tabBlock);
    }

    @Override
    public TileEntity createNewTileEntity(World world, int metadata) {
        return metadata == 15 ? new TileEntityMultiBlock() : null;
    }
    /*
    @Override
    public boolean isOpaqueCube() {
        return false;
    }

    @Override
    public boolean renderAsNormalBlock() {
        return false;
    }

    @Override
    public int getRenderType() {
        return -1;
    }
     */
    /*
    @Override
    public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB aabb, List list, Entity entity) {
        setBlockBounds(0.4375F, 0.0F, 0.4375F, 0.5625F, 0.875F, 0.5625F);
        super.addCollisionBoxesToList(world, x, y, z, aabb, list, entity);
        setBlockBoundsForItemRender();
        super.addCollisionBoxesToList(world, x, y, z, aabb, list, entity);
    }
     */
    /*
    @Override
    public void setBlockBoundsForItemRender() {
        setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F);
    }
     */
    @Override
    public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
        if (world.isRemote) return true;
        else {
            System.out.println(world.getBlockMetadata(x, y, z));
            if (world.getBlockMetadata(x, y, z) == 15) {
                player.openGui(MultiBlockMod.instance, 0, world, x, y, z);
            } else {
                for (int osX = -1; osX < 2; ++osX) {
                    for (int osZ = -1; osZ < 2; ++osZ) {
                        for (int osY = -4; osY < 1; ++osY) {
                            if (world.getBlock(x + osX, y + osY, z + osZ) == this && world.getBlockMetadata(x + osX, y + osY, z + osZ) == 15) {
                                player.openGui(MultiBlockMod.instance, 0, world, x + osX, y + osY, z + osZ);
                                return true;
                            }
                        }
                    }
                }
            }
            return true;
        }
    }

    @Override
    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack itemStack) {
        if (world.getBlockMetadata(x, y, z) == 15) {

            if (itemStack.hasDisplayName())
                ((TileEntityMultiBlock)world.getTileEntity(x, y, z)).setInventoryName(itemStack.getDisplayName());

        } else {

            for (int osX = -1; osX < 2; ++osX) {
                for (int osZ = -1; osZ < 2; ++osZ) {
                    for (int osY = 0; osY < 5; ++osY) {
                        if (osX == 0 && osY == 0 && osZ == 0) continue;
                        else
                            if (!world.isAirBlock(x + osX, y + osY, z + osZ)) {
                                world.func_147480_a(x, y, z, true);
                                return;
                            }
                    }
                }
            }

            for (int osX = -1; osX < 2; ++osX) {
                for (int osZ = -1; osZ < 2; ++osZ) {
                    for (int osY = 0; osY < 5; ++osY) {
                        if (osX == 0 && osY == 0 && osZ == 0)
                            world.setBlockMetadataWithNotify(x + osX, y + osY, z + osZ, 15, 3);
                        else
                            world.setBlock(x + osX, y + osY, z + osZ, this);
                    }
                }
            }

        }
    }

    @Override
    public void breakBlock(World world, int x, int y, int z, Block block, int metadata) {
        boolean breakAll = false;
        if (metadata == 15) breakAll = true;
        else {
            for (int osX = -1; osX < 2; ++osX) {
                for (int osZ = -1; osZ < 2; ++osZ) {
                    for (int osY = -4; osY < 1; ++osY) {
                        if (world.getBlock(x + osX, y + osY, z + osZ) == this && world.getBlockMetadata(x + osX, y + osY, z + osZ) == 15) {
                            x += osX;
                            y += osY;
                            z += osZ;
                            breakAll = true;
                            break;
                        }
                        if (breakAll) break;
                    }
                    if (breakAll) break;
                }
                if (breakAll) break;
            }


        }

        TileEntity tileentity = world.getTileEntity(x, y, z);

        if (tileentity instanceof TileEntityMultiBlock) {
            TileEntityMultiBlock te = (TileEntityMultiBlock)tileentity;

            for (int i1 = 0; i1 < te.getSizeInventory(); ++i1) {
                ItemStack itemstack = te.getStackInSlot(i1);

                if (itemstack != null) {
                    float f = world.rand.nextFloat() * 0.8F + 0.1F;
                    float f1 = world.rand.nextFloat() * 0.8F + 0.1F;
                    float f2 = world.rand.nextFloat() * 0.8F + 0.1F;

                    while (itemstack.stackSize > 0) {
                        int j1 = world.rand.nextInt(21) + 10;

                        if (j1 > itemstack.stackSize) {
                            j1 = itemstack.stackSize;
                        }

                        itemstack.stackSize -= j1;
                        EntityItem entityitem = new EntityItem(world, (double)((float)x + f), (double)((float)y + f1), (double)((float)z + f2), new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage()));
                        float f3 = 0.05F;
                        entityitem.motionX = (double)((float)world.rand.nextGaussian() * f3);
                        entityitem.motionY = (double)((float)world.rand.nextGaussian() * f3 + 0.2F);
                        entityitem.motionZ = (double)((float)world.rand.nextGaussian() * f3);
                        world.spawnEntityInWorld(entityitem);
                    }
                }
            }
        }

        if (breakAll) {
            for (int osX = x - 1; osX < x + 2; ++osX) {
                for (int osZ = z - 1; osZ < z + 2; ++osZ) {
                    for (int osY = y; osY < y + 5; ++osY) {
                        if (world.getBlock(osX, osY, osZ) == this) {
                            if (osX == x && osY == y && osZ == z) {
                                world.setBlockMetadataWithNotify(osX, osY, osZ, 0, 3);
                                world.func_147480_a(osX, osY, osZ, true);
                                world.removeTileEntity(osX, osY, osZ);
                            } else
                                world.setBlockToAir(osX, osY, osZ);
                        }
                    }
                }
            }
        }

        //super.breakBlock(world, x, y, z, block, metadata);
    }

    @Override
    public boolean hasComparatorInputOverride() {
        return true;
    }

    @Override
    public int getComparatorInputOverride(World world, int x, int y, int z, int p_149736_5_) {
        return Container.calcRedstoneFromInventory((IInventory)world.getTileEntity(x, y, z));
    }

    @SideOnly(Side.CLIENT)
    @Override
    public void randomDisplayTick(World world, int x, int y, int z, Random random) {
        TileEntity tileentity = world.getTileEntity(x, y, z);

        if (tileentity instanceof TileEntityMultiBlock) {
            TileEntityMultiBlock te = (TileEntityMultiBlock)tileentity;
            if (te.getMakingTime() > 0) {
                double d0 = (double)((float)x + 0.4F + random.nextFloat() * 0.2F);
                double d1 = (double)((float)y + 0.7F + random.nextFloat() * 0.3F);
                double d2 = (double)((float)z + 0.4F + random.nextFloat() * 0.2F);
                world.spawnParticle("smoke", d0, d1, d2, 0.0D, 0.0D, 0.0D);
            }
        }
    }

}
 

timaxa007

Модератор
5,831
409
672
Я этот класс последний раз редактировал "7 ‎сентября ‎2018 ‎г., ‏‎12:05:04" и он является лишь примером.
Метод breakBlock, вызывается когда мы ломаем блок. С помощью цикла мы ломаем нужную область, но сперва должны найти основной блок у которого метадата равняться 15.
Если сломанный блок равняться 15, то переменная breakAll будет true, если не ровняется метадата 15, то будет с помощью цикла искать его, если найдёт, то то переменная breakAll будет true, и x, y и z будут равняться координатам где находиться этот блок.
Из него сначала дропаються предметы из инвентаря его TileEntity.
Затем с помощью циклов: основной блок сломается, а все остальные блоки просто превратятся в воздух, если breakAll будет true.
 
459
13
35
У меня она ставиться в методе onBlockPlacedBy world.setBlockMetadataWithNotify(x + osX, y + osY, z + osZ, 15, 3);, когда возможно постройка этой структуры.
а что, если попробовать что-то типо такого?
Java:
        if (!world.isAirBlock(x, y + 1, z)) {
            world.func_147480_a(x, y, z, true);
 
459
13
35
@timaxa007, решил юзать такой код:
Java:
    @Override
    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack itemStack) {
        if (world.getBlockMetadata(x, y, z) == 15) {
        } else {

            for (int osX = -1; osX < 2; ++osX) {
                for (int osZ = -1; osZ < 2; ++osZ) {
                    for (int osY = 0; osY < 5; ++osY) {
                        if (osX == 0 && osY == 0 && osZ == 0) continue;
                        else
                            if (!world.isAirBlock(x + osX, y + osY, z + osZ)) {
                                world.func_147480_a(x, y, z, true);
                                return;
                            }
                    }
                }
            }

            for (int osX = -1; osX < 2; ++osX) {
                for (int osZ = -1; osZ < 2; ++osZ) {
                    for (int osY = 0; osY < 5; ++osY) {
                        if (osX == 0 && osY == 0 && osZ == 0)
                            world.setBlockMetadataWithNotify(x + osX, y + osY, z + osZ, 15, 3);
                        else
                            world.setBlock(x + osX, y + osY, z + osZ, this);
                    }
                }
            }

        }
    }

    @Override
    public void breakBlock(World world, int x, int y, int z, Block block, int metadata) {
        boolean breakAll = false;
        if (metadata == 15) breakAll = true;
        else {
            for (int osX = -1; osX < 2; ++osX) {
                for (int osZ = -1; osZ < 2; ++osZ) {
                    for (int osY = -4; osY < 1; ++osY) {
                        if (world.getBlock(x + osX, y + osY, z + osZ) == this && world.getBlockMetadata(x + osX, y + osY, z + osZ) == 15) {
                            x += osX;
                            y += osY;
                            z += osZ;
                            breakAll = true;
                            break;
                        }
                        if (breakAll) break;
                    }
                    if (breakAll) break;
                }
                if (breakAll) break;
            }


        }

        if (breakAll) {
            for (int osX = x - 1; osX < x + 2; ++osX) {
                for (int osZ = z - 1; osZ < z + 2; ++osZ) {
                    for (int osY = y; osY < y + 5; ++osY) {
                        if (world.getBlock(osX, osY, osZ) == this) {
                            if (osX == x && osY == y && osZ == z) {
                                world.setBlockMetadataWithNotify(osX, osY, osZ, 0, 3);
                                world.func_147480_a(osX, osY, osZ, true);
                                world.removeTileEntity(osX, osY, osZ);
                            } else
                                world.setBlockToAir(osX, osY, osZ);
                        }
                    }
                }
            }
        }

        //super.breakBlock(world, x, y, z, block, metadata);
    }

Теперь не могу понять прикола в том, почему ставятся основной блок.
Как указать фантомов?
Просто вообще не могу пока никак разобраться в этом коде..
 

timaxa007

Модератор
5,831
409
672
Может быть "ставиться"?
Потому-что этот метод вызывается когда блок установлен. У меня в коде, лишь блок изменяться метадата, а не установка основого блока.
Как указать фантомов?
Я так-же типа думал сделал проще, проверкой на метадату. Метадата 15 это основной блок, остальные метадаты этого блока являются как-бы фатом-блоками.
Просто вообще не могу пока никак разобраться в этом коде..
Бывает. Я методом проб и ошибок, пользовался этими тремя циклами.
 
459
13
35
@timaxa007, ну смотри, я клоню к тому, что у меня OBJ блок с большой моделькой и вообщем, вместо фантомов идут ставиться эти OBJ блоки и в итоге полнейший бред + 2 фпс. Я думаю ты понял меня.
Я не могу всё таки понять, как сделать так, что бы ставились фантомы.
 

timaxa007

Модератор
5,831
409
672
+ 2 фпс. Я думаю ты понял меня.
Нет, не понял, но предполагаю. У тебя может быть, что ты дал каждому блоку, но не сделал проверку типа, чтобы он рендериться только для основного блока. У меня основной блок это блок с метадатой 15 и я бы сделал проверку, чтобы рендерися, если у блока стоит метадата 15.
Я не могу всё таки понять, как сделать так, что бы ставились фантомы.
Плохо.
 
459
13
35
У меня основной блок это блок с метадатой 15
я это понял.
но у тебя то стандартный блок, а у меня блок с obj моделькой и выходит что-то похожее как на скринах.
1545251501175.png
1545251510105.png
На скринах я изобразил макет того, как всё выходит. (зелёные кубики - фантомы, красные - основной блок)
я клоню к тому, что должны ставится ПРОЗРАЧНЫЕ фантомы вокруг основного блока, дабы просто изображать непроходимость данного блока в определённом радиусе и что бы всё между собой могло взаимодействовать. Думаю доступно в этот раз изьяснился.
 
459
13
35
И что? У меня как-бы "как должно выглядеть", просто без рендера.
боже, точно.
туплю нереально.
теперь у меня другая проблема.
установил фантомы, вместо основного.
но теперь не ломаются все фантомы при поломке одного. (нет взаемодействия)
Java:
    @Override
    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack itemStack) {
        if (world.getBlockMetadata(x, y, z) == 15) {
        } else {

            for (int osX = -1; osX < 2; ++osX) {
                for (int osZ = -1; osZ < 2; ++osZ) {
                    for (int osY = 0; osY < 5; ++osY) {
                        if (osX == 0 && osY == 0 && osZ == 0) continue;
                        else
                            if (!world.isAirBlock(x + osX, y + osY, z + osZ)) {
                                world.func_147480_a(x, y, z, true);
                                return;
                            }
                    }
                }
            }
            for (int osX = -1; osX < 2; ++osX) {
                for (int osZ = -1; osZ < 2; ++osZ) {
                    for (int osY = 0; osY < 5; ++osY) {
                        if (osX == 0 && osY == 0 && osZ == 0)
                            world.setBlockMetadataWithNotify(x + osX, y + osY, z + osZ, 15, 3);
                        else
                            world.setBlock(x + osX, y + osY, z + osZ, MainPalatka.fantom);
                    }
                }
            }

        }
    }

    @Override
    public void breakBlock(World world, int x, int y, int z, Block block, int metadata) {
        boolean breakAll = false;
        if (metadata == 15) breakAll = true;
        else {
            for (int osX = -1; osX < 2; ++osX) {
                for (int osZ = -1; osZ < 2; ++osZ) {
                    for (int osY = -4; osY < 1; ++osY) {
                        if (world.getBlock(x + osX, y + osY, z + osZ) == this && world.getBlockMetadata(x + osX, y + osY, z + osZ) == 15) {
                            x += osX;
                            y += osY;
                            z += osZ;
                            breakAll = true;
                            break;
                        }
                        if (breakAll) break;
                    }
                    if (breakAll) break;
                }
                if (breakAll) break;
            }


        }

        if (breakAll) {
            for (int osX = x - 1; osX < x + 2; ++osX) {
                for (int osZ = z - 1; osZ < z + 2; ++osZ) {
                    for (int osY = y; osY < y + 5; ++osY) {
                        if (world.getBlock(osX, osY, osZ) == this) {
                            if (osX == x && osY == y && osZ == z) {
                                world.setBlockMetadataWithNotify(osX, osY, osZ, 0, 3);
                                world.func_147480_a(osX, osY, osZ, true);
                                world.removeTileEntity(osX, osY, osZ);
                            } else
                                world.setBlockToAir(osX, osY, osZ);
                        }
                    }
                }
            }
        }

        //super.breakBlock(world, x, y, z, block, metadata);
    }
 
Сверху