[1.7.2]Баундсы и коллизия блока больше чем 1

771
5
Собственно, у меня модель больше одного блока и я хочу сделать коллизию высотой в 2 блока и так же баундсы.
Можно ли так сделать?
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
771
5
А как их делать?
И это, у меня тайл, и если я буду кликать по блоку призраку, то откроется новый инвентарь...
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
-_-
Так давай ему какой-нибудь центральный тайл.
А его определять при поставке. Ну короче вот сурсы того видео. А ну да, их уже нету.

Короче есть тайлы-призраки и есть тайл-центр. В центре вся инфа, гуи и так далее, призраки держат коорды центра(давая их для гуи при клике) и ломаются если ломается центр.
 
771
5
Можешь код быстренько написать, чтобы я хоть суть понял?
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Боже мой, я даже не уверен. Вот реально, последние две строки мне одному кажутся элементарно простыми и понятными? Безо всякого сарказма, просто действительно. Не, ну равен бы не понял, это понятно, но реально.

При поставке блока ставятся(а при поломке любого их них ломается всё) блоки-призраки(хранящие коорды того первого, ставить их при поставке). При клике на них они открывают гуи давая те самые коорды центра(из которого в гуи берешь всю инфу, ибо он её всю и хранит). Ну и их самих уже делаешь какой формы хочешь. А для рендера своей выделялки есть DrawBlockHighlightEvent.
 
1,990
18
105
Пилил такую же фигню без форджа.
Примерный код кину постановки:   
Код:
    public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4, EntityPlayer player)
    {
        int i = 0;
        byte k = 0;
        byte j = 0;
        byte flag = 0;
            
        for (k = 0; k < 3; k++)
            for (j = 0; j < 3; j++) {
                i = par1World.getBlockId(par2 + k - 1, par3, par4 + j - 1);
                if (i == 0 || blocksList[i].blockMaterial.isGroundCover())
                    flag++;
                }
        
        return flag == 9;
    }

    public void onBlockPlacedBy(World world, int i, int j, int k, EntityLiving entityliving)
    {
        int l = MathHelper.floor_double((double)((entityliving.rotationYaw * 4F) / 360F) + 0.5D) & 3;
        world.setBlockMetadataWithNotify(i, j, k, l);
        
        world.setBlockAndMetadataWithNotify(i + 1 , j, k, Block.smelteryCollision.blockID, 0);
        world.setBlockAndMetadataWithNotify(i - 1, j, k, Block.smelteryCollision.blockID, 1);
        world.setBlockAndMetadataWithNotify(i , j, k + 1, Block.smelteryCollision.blockID, 2);
        world.setBlockAndMetadataWithNotify(i , j, k - 1, Block.smelteryCollision.blockID, 3);
        world.setBlockAndMetadataWithNotify(i + 1, j, k + 1, Block.smelteryCollision.blockID, 4);
        world.setBlockAndMetadataWithNotify(i - 1, j, k + 1, Block.smelteryCollision.blockID, 5);
        world.setBlockAndMetadataWithNotify(i + 1, j, k - 1, Block.smelteryCollision.blockID, 6);
        world.setBlockAndMetadataWithNotify(i - 1 , j, k - 1, Block.smelteryCollision.blockID, 7);
            
        if (l == 0) // north
            world.setBlockMetadata(i, j, k - 1, 8);
            
        else if (l == 1) // east
            world.setBlockMetadata(i + 1, j, k, 9);
            
        else if (l == 2) // south
            world.setBlockMetadata(i, j, k + 1, 10);
            
        else if (l == 3) // west
            world.setBlockMetadata(i - 1, j, k, 11);
    }
   
Последние 4 ифа для блока, где должен открываться гуи. У меня гуи открывается тольк при клике на нем (он передний) и на центральном, остальные блочат.
Тайл у меня был всего один, таким образом. Блоки хранили координаты (точнее направление) главного в метадате. При разрушении убивали его, а он убивал все вокруг него.
С такими конструкциями довольно легко выходит все это. А есть гораздо тяжелее, когда выходит из плоскости (в прямом смысле, ага).
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Насколько-же мой Scala-код был короче.

Но куда проще хранить коорды контрольного тайла, чем так париться, как это делаешь ты.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Oldestkon написал(а):
При разрушении убивали его, а он убивал все вокруг него.
А это точно также было.
 
1,990
18
105
anti344 написал(а):
Но куда проще хранить коорды контрольного тайла, чем так париться, как это делаешь ты.
Скажи это моему мозгу, который жалеет лишние такты ЦПУ на обработку ненужных тайл ентити и несколько десятков\сотен байт памяти. Хорошо что тут ещё ГПУ не трогается. У меня с оптимизацией вообще маразм.
Сейчас вместо того чтобы пилить функционал редактора я занимаюсь тем, чтобы у меня отрисовка нескольких тысяч тайлов не трогала процессор, оставляя его загруженным на 0% и не занимала больше пары десятков МБ ОЗУ.
А так, конечно проще.
 
771
5
Так а что мне для каждой такой своей структуры прийдется делать новый блок-призрак?
 
1,990
18
105
Можно сделать единый для всех TileEntity-призрак с блоком. Он будет хранить ID центрального блока и его координаты.
Да даже координат достаточно, чтобы узнать чему он принадлежит.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Вот именно. А еще есть метод canUpdate для твоего маразма.
 
771
5
Сделал тайл:

Код:
public class TileEntityGhost extends TileEntity{

    public int parentXCoord;
    public int parentYCoord;
    public int parentZCoord;
    
    public boolean canUpdate(){
        return false;
    }
    
    public void writeToNBT(NBTTagCompound nbt){
        super.writeToNBT(nbt);
        nbt.setInteger("parentXCoord", parentXCoord);
        nbt.setInteger("parentYCoord", parentYCoord);
        nbt.setInteger("parentZCoord", parentZCoord);
    }
    
    public void readFromNBT(NBTTagCompound nbt){
        super.readFromNBT(nbt);
        parentXCoord = nbt.getInteger("parentXCoord");
        parentYCoord = nbt.getInteger("parentYCoord");
        parentZCoord = nbt.getInteger("parentZCoord");
    }
}

Сделал блок:
Код:
public class BlockGhost extends BlockContainerBase{

    public BlockGhost(String unlocalizedName, Material material){
        super(unlocalizedName, material);
    }

    public TileEntity createNewTileEntity(World world, int metadata){
        return new TileEntityGhost();
    }
    
    public boolean renderAsNormalBlock(){
        return false;
    }

    public int getRenderType(){
        return -1;
    }

    public boolean isOpaqueCube(){
        return false;
    }
}
Что дальше?
 
771
5
Материал какой мне указывать блока-призрака?
А то когда бью по нему, то он издает не те звуки, которые мне нужно.
 
771
5
laz2727 написал(а):
Тот же, что и у оригинала же.
Мне нужен универсальный блок...
Если поставлю такой же при инициализации, то не смогу сделать другой...
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
А можно свой материал, который из призрака берет ядро и использует звуки ядра.
Ну как-то так.
 
Сверху