2016-05-25 2 views
1

Я создаю мод для Minecraft. Недавно я попытался создать настраиваемый блок, и у меня возникли две проблемы.Render glitch с пользовательскими границами блоков minecraft

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

Кроме того, моя цель для этого блока испускать «ауру», которая дает игрокам вокруг него скорость или каким-либо другим зельем эффекта. У меня есть базовый код для поиска игроков вокруг блока и предоставления им скорости, но я не могу найти способ активировать этот метод каждый галочку или каждый X-тигр, чтобы гарантировать, что игроки на скорости коробки будут надежно , В обычной игре уже есть некоторые блоки, поэтому это должно быть возможно. Как я могу это сделать?

ответ

0

Для первой проблемы вам необходимо переопределить isOpaqueCube, чтобы вернуть false. Вы также захотите переопределить isFullCube для других частей кода, но это не так важно для рендеринга. Пример:

public class YourBlock { 
    // ... existing code ... 

    /** 
    * Used to determine ambient occlusion and culling when rebuilding chunks for render 
    */ 
    @Override 
    public boolean isOpaqueCube(IBlockState state) { 
     return false; 
    } 

    @Override 
    public boolean isFullCube(IBlockState state) { 
     return false; 
    } 
} 

Here's some info on rendering that mentions this.


Что касается второй проблемы, это сложнее. Обычно это достигается с помощью элемента tile, хотя вы также можете использовать обновления блоков (что намного медленнее). Хорошими примерами этого являются BlockBeacon и TileEntityBeacon (для использования элементов стилей) и BlockFrostedIce (для обновления блоков). Вот некоторые (потенциально устаревшие) info on tile entities.

Вот (непроверенный) пример получения обновления каждого тика это с черепичными образованиями:

public class YourBlock { 
    // ... existing code ... 

    /** 
    * Returns a new instance of a block's tile entity class. Called on placing the block. 
    */ 
    @Override 
    public TileEntity createNewTileEntity(World worldIn, int meta) { 
     return new TileEntityYourBlock(); 
    } 
} 
/** 
* Tile entity for your block. 
* 
* Tile entities normally store data, but they can also receive an update each 
* tick, but to do so they must implement ITickable. So, don't forget the 
* "implements ITickable". 
*/ 
public class TileEntityYourBlock extends TileEntity implements ITickable { 
    @Override 
    public void update() { 
     // Your code to give potion effects to nearby players would go here 

     // If you only want to do it every so often, you can check like this: 
     if (this.worldObj.getTotalWorldTime() % 80 == 0) { 
      // Only runs every 80 ticks (4 seconds) 
     } 
    } 

    // The following code isn't required to make a tile entity that gets ticked, 
    // but you'll want it if you want (EG) to be able to set the effect. 

    /** 
    * Example potion effect. 
    * May be null. 
    */ 
    private Potion effect; 

    public void setEffect(Potion potionEffect) { 
     this.effect = potionEffect; 
    } 

    public Potion getEffect() { 
     return this.effect; 
    } 

    @Override 
    public void readFromNBT(NBTTagCompound compound) { 
     super.readFromNBT(compound); 
     int effectID = compound.getInteger("Effect") 
     this.effect = Potion.getPotionById(effectID); 
    } 

    public void writeToNBT(NBTTagCompound compound) { 
     super.writeToNBT(compound); 
     int effectID = Potion.getIdFromPotion(this.effect); 
     compound.setInteger("Effect", effectID); 
    } 
} 
// This line needs to go in the main registration. 
// The ID can be anything so long as it isn't used by another mod. 
GameRegistry.registerTileEntity(TileEntityYourBlock.class, "YourBlock");