[1.7.10/1.6.4] Метадата блока

timaxa007

Модератор
5,831
409
672
Метадата блока для 1.7.10.

https://github.com/timaxa007/Metadata_1.7.10

У блока стандартно есть метадата, просто ей надо как-то пользоваться, вот один из простых примеров:

ModMetadata (Главный класс мода)
Код:
@Mod (modid = ModMetadata.MODID, name = ModMetadata.MODNAME, version = ModMetadata.VERSION)

public class ModMetadata {

    public static final String MODID = "metadata";
    public static final String MODNAME = "Metadata";
    public static final String VERSION = "0.2a";

    @Instance(ModMetadata.MODID)
    public static ModMetadata instance;

    public static Block block_metadata;

    @EventHandler
    public void preInit(FMLPreInitializationEvent event) {

        block_metadata = new BlockMetadata();
        GameRegistry.registerBlock(block_metadata, ItemBlockMetadata.class, "block_metadata");

    }

}
ItemBlock в данном случаи нужно, чтобы можно было блок с разной метадатой можно было переименовать на нужное имя (для локализации).
----------------------
BlockMetadata (Блок)
Код:
public class BlockMetadata extends Block {

    public static final String[] metadata = new String[] {
        "meta_1", 
        "meta_2", 
        "meta_3", 
        "meta_4", 
        "meta_5", 
        "meta_6", 
        "meta_7", 
        "meta_8", 
        "meta_9", 
        "meta_10", 
        "meta_11", 
        "meta_12", 
        "meta_13", 
        "meta_14", 
        "meta_15", 
        "meta_16"
    };

    @SideOnly(Side.CLIENT)
    private IIcon[] icon_array;

    public BlockMetadata() {
        super(Material.circuits);
        setCreativeTab(CreativeTabs.tabBlock);
        setHardness(0.3F);
        setResistance(1.0F);
        setBlockTextureName(ModMetadata.MODID + ":block_metadata");
        setBlockName("block_metadata");
    }
    
    @Override
    public int damageDropped(int metadata) {
        return metadata;
    }
    
    @SideOnly(Side.CLIENT)
    public IIcon getIcon(int side, int metadata) {
        if (metadata >= 0 && metadata < BlockMetadata.metadata.length) {
            return icon_array[metadata];
        }
        return super.getIcon(side, metadata);
    }

    @SideOnly(Side.CLIENT)
    public void getSubBlocks(Item id, CreativeTabs table, List list) {
        for (int j = 0; j < metadata.length; ++j) {
            list.add(new ItemStack(id, 1, j));
        }
    }

    @SideOnly(Side.CLIENT)
    public void registerBlockIcons(IIconRegister ir) {
        super.registerBlockIcons(ir);
        icon_array = new IIcon[metadata.length];
        for (int i = 0; i < metadata.length; ++i) {
            icon_array[i] = ir.registerIcon(getTextureName() + "/" + metadata[i]);
        }
    }

}
---------------------
ItemBlockMetadata (ИтемБлок)
Код:
public class ItemBlockMetadata extends ItemMultiTexture {

    public ItemBlockMetadata(Block block) {
        super(block, block, BlockMetadata.metadata);
    }

}
Ну как-так.
-----------------------------

 
1,683
1
Итем так же.Только надо getSubBlocks на getSubItems и супер класс подправить.Молодец!
 

timaxa007

Модератор
5,831
409
672
Метадата блока для 1.6.4.

https://github.com/timaxa007/Metadata_1.6.4

ModMetadata (Главный файл мода)
Код:
@Mod (modid = ModMetadata.MODID, name = ModMetadata.MODNAME, version = ModMetadata.VERSION)

public class ModMetadata {

    public static final String MODID = "metadata";
    public static final String MODNAME = "Metadata";
    public static final String VERSION = "0.2a";

    @Instance(ModMetadata.MODID)
    public static ModMetadata instance;

    public static Block block_metadata;
    public static int block_metadata_id;

    @EventHandler
    public void init(FMLInitializationEvent event) {

        block_metadata = new BlockMetadata(block_metadata_id);
        GameRegistry.registerBlock(block_metadata, ItemBlockMetadata.class, "block_metadata");

    }

    @EventHandler
    public void preInit(FMLPreInitializationEvent event) {
        Configuration config = new Configuration(event.getSuggestedConfigurationFile());
        config.load();

        int idblock = 2600;

        block_metadata_id = config.getBlock("block_metadata", idblock++).getInt();

        config.save();

    }

}
--------------------------------------
BlockMetadata (Блок)
Код:
public class BlockMetadata extends Block {

    public static final String[] metadata = new String[] {
        "meta_1", 
        "meta_2", 
        "meta_3", 
        "meta_4", 
        "meta_5", 
        "meta_6", 
        "meta_7", 
        "meta_8", 
        "meta_9", 
        "meta_10", 
        "meta_11", 
        "meta_12", 
        "meta_13", 
        "meta_14", 
        "meta_15", 
        "meta_16"
    };

    @SideOnly(Side.CLIENT)
    private Icon[] icon_array;

    public BlockMetadata(int id) {
        super(id, Material.circuits);
        setCreativeTab(CreativeTabs.tabBlock);
        setHardness(0.3F);
        setResistance(1.0F);
        setTextureName(ModMetadata.MODID + ":block_metadata");
        setUnlocalizedName("block_metadata");
    }

    @Override
    public int damageDropped(int metadata) {
        return metadata;
    }

    @SideOnly(Side.CLIENT)
    public Icon getIcon(int side, int metadata) {
        if (metadata >= 0 && metadata < BlockMetadata.metadata.length) {
            return icon_array[metadata];
        }
        return super.getIcon(side, metadata);
    }

    @SideOnly(Side.CLIENT)
    public void getSubBlocks(int id, CreativeTabs table, List list) {
        for (int j = 0; j < metadata.length; ++j) {
            list.add(new ItemStack(id, 1, j));
        }
    }

    @SideOnly(Side.CLIENT)
    public void registerIcons(IconRegister ir) {
        super.registerIcons(ir);
        icon_array = new Icon[metadata.length];
        for (int i = 0; i < metadata.length; ++i) {
            icon_array[i] = ir.registerIcon(getTextureName() + "/" + metadata[i]);
        }
    }

}
--------------------------
ItemBlockMetadata (ИтемБлок)
Код:
public class ItemBlockMetadata extends ItemMultiTextureTile {

    public ItemBlockMetadata(int id) {
        super(id, ModMetadata.block_metadata, BlockMetadata.metadata);
    }

}
------------------------------
Ну, как-то так.
 
509
2
В учебник?
 

timaxa007

Модератор
5,831
409
672
Не думаю. Просто выложил код, но особо ни чего не объяснил: "Что? Да, как?".
 

timaxa007

Модератор
5,831
409
672
annalifegame, пожалуйста. Только вроде темой ошиблась для закрытия.
 

timaxa007

Модератор
5,831
409
672
Использовать ItemStack. Если не ошибаюсь, то примерно:
Код:
GameRegistry.addRecipe(new ItemStack(Blocks.dirt, 1, 4), new Object[] {
"DD", 
"DD",
'D', new ItemStack(Blocks.dirt, 1, 2)
});
 

timaxa007

Модератор
5,831
409
672
Код:
new ItemStack(ModMetadata.block_metadata, 1, 0);
Где "ModMetadata.block_metadata" - переменная нашего блока.
Где "1" - это количество (оно влияет на выход, но не в рецепте).
Где "0" - это метадата блока.
Версия Minecraft ниже 1.7 скорее всего потребует ид блока "ModMetadata.block_metadata.blockID".
 

timaxa007

Модератор
5,831
409
672
Код:
ItemStack is = new ItemStack(ModMetadata.block_metadata, 1, 0);
Block block = null;
int metadata = -1;
if (is != null) {
    metadata = is.getItemDamage();
    if (is.getItem() instanceof ItemBlock && Block.getBlockFromItem(is.getItem()) != Blocks.air) {
        block = Block.getBlockFromItem(is.getItem());
    }
}
        
if (block != null && metadata != -1) {
            
}
 
1,239
2
24
А если число блоков >= 17 ?При указании меты 17 мне дает самый первый блок(
Использую мету для руд,а там только блок.
 

timaxa007

Модератор
5,831
409
672
XuPuPG, метадата для установление в мире до 16, если больше 16, то он вроде как должен обнулить значение. Если каким-то образом установилось в мире больше 16, то при сохранения мира он должен обнулить. Так как выделено для этого 0xF значение.
[merge_posts_bbcode]Добавлено: 18.10.2015 12:31:56[/merge_posts_bbcode]

Блок который находиться в инвентаре, может иметь метадату как у предмета. Так как метадата берётся из ItemStack.
 
1,087
2
Эмм. А что за "BlockMetadata" класс? Моя ителижка не видит такого... Помоги!
 

CumingSoon

Местный стендапер
1,634
12
269
Это его созданный класс. Будут ошибки - давай код
 

timaxa007

Модератор
5,831
409
672
FanKar, да - это класс нашего блока. А каком смысле он его не видит? Не можешь импортировать или ты его не создал?
 
1,087
2
timaxa007 написал(а):
FanKar, да - это класс нашего блока. А каком смысле он его не видит? Не можешь импортировать или ты его не создал? 
У меня другое название класса. Я не увидел, что это твой класс. Проблема решена.
 
127
0
Отличная статья, спасибо. Вот только не могу понять почему когда ломаю блок рукой он не выпадает, выпадает если киркой ломать. Как исправить чтобы при ломании рукой выпадал блок?
 
Сверху