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

timaxa007

Модератор
5,831
409
676
Метадата блока для 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);
    }

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

 
Итем так же.Только надо getSubBlocks на getSubItems и супер класс подправить.Молодец!
 
Метадата блока для 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);
    }

}
------------------------------
Ну, как-то так.
 
В учебник?
 
Не думаю. Просто выложил код, но особо ни чего не объяснил: "Что? Да, как?".
 
annalifegame, пожалуйста. Только вроде темой ошиблась для закрытия.
 
Использовать ItemStack. Если не ошибаюсь, то примерно:
Код:
GameRegistry.addRecipe(new ItemStack(Blocks.dirt, 1, 4), new Object[] {
"DD", 
"DD",
'D', new ItemStack(Blocks.dirt, 1, 2)
});
 
Код:
new ItemStack(ModMetadata.block_metadata, 1, 0);
Где "ModMetadata.block_metadata" - переменная нашего блока.
Где "1" - это количество (оно влияет на выход, но не в рецепте).
Где "0" - это метадата блока.
Версия Minecraft ниже 1.7 скорее всего потребует ид блока "ModMetadata.block_metadata.blockID".
 
Код:
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) {
            
}
 
А если число блоков >= 17 ?При указании меты 17 мне дает самый первый блок(
Использую мету для руд,а там только блок.
 
XuPuPG, метадата для установление в мире до 16, если больше 16, то он вроде как должен обнулить значение. Если каким-то образом установилось в мире больше 16, то при сохранения мира он должен обнулить. Так как выделено для этого 0xF значение.
[merge_posts_bbcode]Добавлено: 18.10.2015 12:31:56[/merge_posts_bbcode]

Блок который находиться в инвентаре, может иметь метадату как у предмета. Так как метадата берётся из ItemStack.
 
Эмм. А что за "BlockMetadata" класс? Моя ителижка не видит такого... Помоги!
 
Это его созданный класс. Будут ошибки - давай код
 
FanKar, да - это класс нашего блока. А каком смысле он его не видит? Не можешь импортировать или ты его не создал?
 
timaxa007 написал(а):
FanKar, да - это класс нашего блока. А каком смысле он его не видит? Не можешь импортировать или ты его не создал? 
У меня другое название класса. Я не увидел, что это твой класс. Проблема решена.
 
Отличная статья, спасибо. Вот только не могу понять почему когда ломаю блок рукой он не выпадает, выпадает если киркой ломать. Как исправить чтобы при ломании рукой выпадал блок?
 
Назад
Сверху