32 messages dans ce sujet

Tout sur les blocs !


88x31.png
Cette uvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 3.0 non transposé . Tout partage implique que vous citiez l'auteur original.


-[iNTRODUCTION]-

Bonjour à tous !

Dans ce tutoriel, nous allons explorer les méandres des objets les plus importants dans Minecraft : les blocs !


-[sOMMAIRE]-

1] Mais au fait, c'est quoi un bloc ?
2] Bases du système

3] Créer un bloc

A] Un bloc simple

B] Les textures et les noms

C] Les méta-données

D] Quelques méthodes utiles

E] Ajouter un bloc avec un rendu complexe

4] Astuces pratiques

A] Créer un minerai

B] Créer un bloc orientable

C] Créer une plante

D] Créer un onglet dans le menu créatif

E] La génération

5] Entités de blocs (TileEntities)

6]Astuces pratique 2

A]Créer une nouvelle table de craft

B]Créer un four

C]Créer un coffre



1] Mais au fait, c'est quoi un bloc ?


C'est une bonne question. Pour un joueur lambda de Minecraft, c'est un cube à 6 faces, qu'il peut casser, poser.
Mais lorsque l'on commence à s'intéresser au modding Minecraft, il faut dépasser cette vision d'utilisateur et regarder à l'intérieur du code source.

Ouvrons la classe Block !

zTLFfQQ.png

Mais où sont partits tous les blocs ? La réponse se trouve quelques lignes plus bas :

public static void registerBlocks()
{
    blockRegistry.addObject(0, "air", (new BlockAir()).setBlockName("air"));
    blockRegistry.addObject(1, "stone", (new BlockStone()).setHardness(1.5F).setResistance(10.0F).setStepSound(soundTypePiston).setBlockName("stone").setBlockTextureName("stone"));
    blockRegistry.addObject(2, "grass", (new BlockGrass()).setHardness(0.6F).setStepSound(soundTypeGrass).setBlockName("grass").setBlockTextureName("grass"));
    blockRegistry.addObject(3, "dirt", (new BlockDirt()).setHardness(0.5F).setStepSound(soundTypeGravel).setBlockName("dirt").setBlockTextureName("dirt"));
    Block var0 = (new Block(Material.rock)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundTypePiston).setBlockName("stonebrick").setCreativeTab(CreativeTabs.tabBlock).setBlockTextureName("cobblestone");
    blockRegistry.addObject(4, "cobblestone", var0);
    Block var1 = (new BlockWood()).setHardness(2.0F).setResistance(5.0F).setStepSound(soundTypeWood).setBlockName("wood").setBlockTextureName("planks");
    blockRegistry.addObject(5, "planks", var1);
    blockRegistry.addObject(6, "sapling", (new BlockSapling()).setHardness(0.0F).setStepSound(soundTypeGrass).setBlockName("sapling").setBlockTextureName("sapling"));
    blockRegistry.addObject(7, "bedrock", (new Block(Material.rock)).setBlockUnbreakable().setResistance(6000000.0F).setStepSound(soundTypePiston).setBlockName("bedrock").disableStats().setCreativeTab(CreativeTabs.tabBlock).setBlockTextureName("bedrock"));
    blockRegistry.addObject(8, "flowing_water", (new BlockDynamicLiquid(Material.water)).setHardness(100.0F).setLightOpacity(3).setBlockName("water").disableStats().setBlockTextureName("water_flow"));
    blockRegistry.addObject(9, "water", (new BlockStaticLiquid(Material.water)).setHardness(100.0F).setLightOpacity(3).setBlockName("water").disableStats().setBlockTextureName("water_still"));
    blockRegistry.addObject(10, "flowing_lava", (new BlockDynamicLiquid(Material.lava)).setHardness(100.0F).setLightLevel(1.0F).setBlockName("lava").disableStats().setBlockTextureName("lava_flow"));
    blockRegistry.addObject(11, "lava", (new BlockStaticLiquid(Material.lava)).setHardness(100.0F).setLightLevel(1.0F).setBlockName("lava").disableStats().setBlockTextureName("lava_still"));
    blockRegistry.addObject(12, "sand", (new BlockSand()).setHardness(0.5F).setStepSound(field_149776_m).setBlockName("sand").setBlockTextureName("sand"));
    blockRegistry.addObject(13, "gravel", (new BlockGravel()).setHardness(0.6F).setStepSound(soundTypeGravel).setBlockName("gravel").setBlockTextureName("gravel"));
    blockRegistry.addObject(14, "gold_ore", (new BlockOre()).setHardness(3.0F).setResistance(5.0F).setStepSound(soundTypePiston).setBlockName("oreGold").setBlockTextureName("gold_ore"));
    blockRegistry.addObject(15, "iron_ore", (new BlockOre()).setHardness(3.0F).setResistance(5.0F).setStepSound(soundTypePiston).setBlockName("oreIron").setBlockTextureName("iron_ore"));
    blockRegistry.addObject(16, "coal_ore", (new BlockOre()).setHardness(3.0F).setResistance(5.0F).setStepSound(soundTypePiston).setBlockName("oreCoal").setBlockTextureName("coal_ore"));
    blockRegistry.addObject(17, "log", (new BlockOldLog()).setBlockName("log").setBlockTextureName("log"));
    blockRegistry.addObject(18, "leaves", (new BlockOldLeaf()).setBlockName("leaves").setBlockTextureName("leaves"));
    blockRegistry.addObject(19, "sponge", (new BlockSponge()).setHardness(0.6F).setStepSound(soundTypeGrass).setBlockName("sponge").setBlockTextureName("sponge"));
    blockRegistry.addObject(20, "glass", (new BlockGlass(Material.glass, false)).setHardness(0.3F).setStepSound(soundTypeGlass).setBlockName("glass").setBlockTextureName("glass"));
    blockRegistry.addObject(21, "lapis_ore", (new BlockOre()).setHardness(3.0F).setResistance(5.0F).setStepSound(soundTypePiston).setBlockName("oreLapis").setBlockTextureName("lapis_ore"));
    blockRegistry.addObject(22, "lapis_block", (new BlockCompressed(MapColor.field_151652_H)).setHardness(3.0F).setResistance(5.0F).setStepSound(soundTypePiston).setBlockName("blockLapis").setCreativeTab(CreativeTabs.tabBlock).setBlockTextureName("lapis_block"));
    blockRegistry.addObject(23, "dispenser", (new BlockDispenser()).setHardness(3.5F).setStepSound(soundTypePiston).setBlockName("dispenser").setBlockTextureName("dispenser"));
    Block var2 = (new BlockSandStone()).setStepSound(soundTypePiston).setHardness(0.8F).setBlockName("sandStone").setBlockTextureName("sandstone");
    blockRegistry.addObject(24, "sandstone", var2);
    blockRegistry.addObject(25, "noteblock", (new BlockNote()).setHardness(0.8F).setBlockName("musicBlock").setBlockTextureName("noteblock"));
    blockRegistry.addObject(26, "bed", (new BlockBed()).setHardness(0.2F).setBlockName("bed").disableStats().setBlockTextureName("bed"));
    blockRegistry.addObject(27, "golden_rail", (new BlockRailPowered()).setHardness(0.7F).setStepSound(soundTypeMetal).setBlockName("goldenRail").setBlockTextureName("rail_golden"));
    blockRegistry.addObject(28, "detector_rail", (new BlockRailDetector()).setHardness(0.7F).setStepSound(soundTypeMetal).setBlockName("detectorRail").setBlockTextureName("rail_detector"));
    blockRegistry.addObject(29, "sticky_piston", (new BlockPistonBase(true)).setBlockName("pistonStickyBase"));
    blockRegistry.addObject(30, "web", (new BlockWeb()).setLightOpacity(1).setHardness(4.0F).setBlockName("web").setBlockTextureName("web"));
    blockRegistry.addObject(31, "tallgrass", (new BlockTallGrass()).setHardness(0.0F).setStepSound(soundTypeGrass).setBlockName("tallgrass"));
    blockRegistry.addObject(32, "deadbush", (new BlockDeadBush()).setHardness(0.0F).setStepSound(soundTypeGrass).setBlockName("deadbush").setBlockTextureName("deadbush"));
    blockRegistry.addObject(33, "piston", (new BlockPistonBase(false)).setBlockName("pistonBase"));
    blockRegistry.addObject(34, "piston_head", new BlockPistonExtension());
    blockRegistry.addObject(35, "wool", (new BlockColored(Material.cloth)).setHardness(0.8F).setStepSound(soundTypeCloth).setBlockName("cloth").setBlockTextureName("wool_colored"));
    blockRegistry.addObject(36, "piston_extension", new BlockPistonMoving());
    blockRegistry.addObject(37, "yellow_flower", (new BlockFlower(0)).setHardness(0.0F).setStepSound(soundTypeGrass).setBlockName("flower1").setBlockTextureName("flower_dandelion"));
    blockRegistry.addObject(38, "red_flower", (new BlockFlower(1)).setHardness(0.0F).setStepSound(soundTypeGrass).setBlockName("flower2").setBlockTextureName("flower_rose"));
    blockRegistry.addObject(39, "brown_mushroom", (new BlockMushroom()).setHardness(0.0F).setStepSound(soundTypeGrass).setLightLevel(0.125F).setBlockName("mushroom").setBlockTextureName("mushroom_brown"));
    blockRegistry.addObject(40, "red_mushroom", (new BlockMushroom()).setHardness(0.0F).setStepSound(soundTypeGrass).setBlockName("mushroom").setBlockTextureName("mushroom_red"));
    blockRegistry.addObject(41, "gold_block", (new BlockCompressed(MapColor.field_151647_F)).setHardness(3.0F).setResistance(10.0F).setStepSound(soundTypeMetal).setBlockName("blockGold").setBlockTextureName("gold_block"));
    blockRegistry.addObject(42, "iron_block", (new BlockCompressed(MapColor.field_151668_h)).setHardness(5.0F).setResistance(10.0F).setStepSound(soundTypeMetal).setBlockName("blockIron").setBlockTextureName("iron_block"));
    blockRegistry.addObject(43, "double_stone_slab", (new BlockStoneSlab(true)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundTypePiston).setBlockName("stoneSlab"));
    blockRegistry.addObject(44, "stone_slab", (new BlockStoneSlab(false)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundTypePiston).setBlockName("stoneSlab"));
    Block var3 = (new Block(Material.rock)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundTypePiston).setBlockName("brick").setCreativeTab(CreativeTabs.tabBlock).setBlockTextureName("brick");
    blockRegistry.addObject(45, "brick_block", var3);
    blockRegistry.addObject(46, "tnt", (new BlockTNT()).setHardness(0.0F).setStepSound(soundTypeGrass).setBlockName("tnt").setBlockTextureName("tnt"));
    blockRegistry.addObject(47, "bookshelf", (new BlockBookshelf()).setHardness(1.5F).setStepSound(soundTypeWood).setBlockName("bookshelf").setBlockTextureName("bookshelf"));
    blockRegistry.addObject(48, "mossy_cobblestone", (new Block(Material.rock)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundTypePiston).setBlockName("stoneMoss").setCreativeTab(CreativeTabs.tabBlock).setBlockTextureName("cobblestone_mossy"));
    blockRegistry.addObject(49, "obsidian", (new BlockObsidian()).setHardness(50.0F).setResistance(2000.0F).setStepSound(soundTypePiston).setBlockName("obsidian").setBlockTextureName("obsidian"));
    blockRegistry.addObject(50, "torch", (new BlockTorch()).setHardness(0.0F).setLightLevel(0.9375F).setStepSound(soundTypeWood).setBlockName("torch").setBlockTextureName("torch_on"));
    blockRegistry.addObject(51, "fire", (new BlockFire()).setHardness(0.0F).setLightLevel(1.0F).setStepSound(soundTypeWood).setBlockName("fire").disableStats().setBlockTextureName("fire"));
    blockRegistry.addObject(52, "mob_spawner", (new BlockMobSpawner()).setHardness(5.0F).setStepSound(soundTypeMetal).setBlockName("mobSpawner").disableStats().setBlockTextureName("mob_spawner"));
    blockRegistry.addObject(53, "oak_stairs", (new BlockStairs(var1, 0)).setBlockName("stairsWood"));
    blockRegistry.addObject(54, "chest", (new BlockChest(0)).setHardness(2.5F).setStepSound(soundTypeWood).setBlockName("chest"));
    blockRegistry.addObject(55, "redstone_wire", (new BlockRedstoneWire()).setHardness(0.0F).setStepSound(soundTypeStone).setBlockName("redstoneDust").disableStats().setBlockTextureName("redstone_dust"));
    blockRegistry.addObject(56, "diamond_ore", (new BlockOre()).setHardness(3.0F).setResistance(5.0F).setStepSound(soundTypePiston).setBlockName("oreDiamond").setBlockTextureName("diamond_ore"));
    blockRegistry.addObject(57, "diamond_block", (new BlockCompressed(MapColor.field_151648_G)).setHardness(5.0F).setResistance(10.0F).setStepSound(soundTypeMetal).setBlockName("blockDiamond").setBlockTextureName("diamond_block"));
    blockRegistry.addObject(58, "crafting_table", (new BlockWorkbench()).setHardness(2.5F).setStepSound(soundTypeWood).setBlockName("workbench").setBlockTextureName("crafting_table"));
    blockRegistry.addObject(59, "wheat", (new BlockCrops()).setBlockName("crops").setBlockTextureName("wheat"));
    Block var4 = (new BlockFarmland()).setHardness(0.6F).setStepSound(soundTypeGravel).setBlockName("farmland").setBlockTextureName("farmland");
    blockRegistry.addObject(60, "farmland", var4);
    blockRegistry.addObject(61, "furnace", (new BlockFurnace(false)).setHardness(3.5F).setStepSound(soundTypePiston).setBlockName("furnace").setCreativeTab(CreativeTabs.tabDecorations));
    blockRegistry.addObject(62, "lit_furnace", (new BlockFurnace(true)).setHardness(3.5F).setStepSound(soundTypePiston).setLightLevel(0.875F).setBlockName("furnace"));
    blockRegistry.addObject(63, "standing_sign", (new BlockSign(TileEntitySign.class, true)).setHardness(1.0F).setStepSound(soundTypeWood).setBlockName("sign").disableStats());
    blockRegistry.addObject(64, "wooden_door", (new BlockDoor(Material.wood)).setHardness(3.0F).setStepSound(soundTypeWood).setBlockName("doorWood").disableStats().setBlockTextureName("door_wood"));
    blockRegistry.addObject(65, "ladder", (new BlockLadder()).setHardness(0.4F).setStepSound(soundTypeLadder).setBlockName("ladder").setBlockTextureName("ladder"));
    blockRegistry.addObject(66, "rail", (new BlockRail()).setHardness(0.7F).setStepSound(soundTypeMetal).setBlockName("rail").setBlockTextureName("rail_normal"));
    blockRegistry.addObject(67, "stone_stairs", (new BlockStairs(var0, 0)).setBlockName("stairsStone"));
    blockRegistry.addObject(68, "wall_sign", (new BlockSign(TileEntitySign.class, false)).setHardness(1.0F).setStepSound(soundTypeWood).setBlockName("sign").disableStats());
    blockRegistry.addObject(69, "lever", (new BlockLever()).setHardness(0.5F).setStepSound(soundTypeWood).setBlockName("lever").setBlockTextureName("lever"));
    blockRegistry.addObject(70, "stone_pressure_plate", (new BlockPressurePlate("stone", Material.rock, BlockPressurePlate.Sensitivity.mobs)).setHardness(0.5F).setStepSound(soundTypePiston).setBlockName("pressurePlate"));
    blockRegistry.addObject(71, "iron_door", (new BlockDoor(Material.iron)).setHardness(5.0F).setStepSound(soundTypeMetal).setBlockName("doorIron").disableStats().setBlockTextureName("door_iron"));
    blockRegistry.addObject(72, "wooden_pressure_plate", (new BlockPressurePlate("planks_oak", Material.wood, BlockPressurePlate.Sensitivity.everything)).setHardness(0.5F).setStepSound(soundTypeWood).setBlockName("pressurePlate"));
    blockRegistry.addObject(73, "redstone_ore", (new BlockRedstoneOre(false)).setHardness(3.0F).setResistance(5.0F).setStepSound(soundTypePiston).setBlockName("oreRedstone").setCreativeTab(CreativeTabs.tabBlock).setBlockTextureName("redstone_ore"));
    blockRegistry.addObject(74, "lit_redstone_ore", (new BlockRedstoneOre(true)).setLightLevel(0.625F).setHardness(3.0F).setResistance(5.0F).setStepSound(soundTypePiston).setBlockName("oreRedstone").setBlockTextureName("redstone_ore"));
    blockRegistry.addObject(75, "unlit_redstone_torch", (new BlockRedstoneTorch(false)).setHardness(0.0F).setStepSound(soundTypeWood).setBlockName("notGate").setBlockTextureName("redstone_torch_off"));
    blockRegistry.addObject(76, "redstone_torch", (new BlockRedstoneTorch(true)).setHardness(0.0F).setLightLevel(0.5F).setStepSound(soundTypeWood).setBlockName("notGate").setCreativeTab(CreativeTabs.tabRedstone).setBlockTextureName("redstone_torch_on"));
    blockRegistry.addObject(77, "stone_button", (new BlockButtonStone()).setHardness(0.5F).setStepSound(soundTypePiston).setBlockName("button"));
    blockRegistry.addObject(78, "snow_layer", (new BlockSnow()).setHardness(0.1F).setStepSound(soundTypeSnow).setBlockName("snow").setLightOpacity(0).setBlockTextureName("snow"));
    blockRegistry.addObject(79, "ice", (new BlockIce()).setHardness(0.5F).setLightOpacity(3).setStepSound(soundTypeGlass).setBlockName("ice").setBlockTextureName("ice"));
    blockRegistry.addObject(80, "snow", (new BlockSnowBlock()).setHardness(0.2F).setStepSound(soundTypeSnow).setBlockName("snow").setBlockTextureName("snow"));
    blockRegistry.addObject(81, "cactus", (new BlockCactus()).setHardness(0.4F).setStepSound(soundTypeCloth).setBlockName("cactus").setBlockTextureName("cactus"));
    blockRegistry.addObject(82, "clay", (new BlockClay()).setHardness(0.6F).setStepSound(soundTypeGravel).setBlockName("clay").setBlockTextureName("clay"));
    blockRegistry.addObject(83, "reeds", (new BlockReed()).setHardness(0.0F).setStepSound(soundTypeGrass).setBlockName("reeds").disableStats().setBlockTextureName("reeds"));
    blockRegistry.addObject(84, "jukebox", (new BlockJukebox()).setHardness(2.0F).setResistance(10.0F).setStepSound(soundTypePiston).setBlockName("jukebox").setBlockTextureName("jukebox"));
    blockRegistry.addObject(85, "fence", (new BlockFence("planks_oak", Material.wood)).setHardness(2.0F).setResistance(5.0F).setStepSound(soundTypeWood).setBlockName("fence"));
    Block var5 = (new BlockPumpkin(false)).setHardness(1.0F).setStepSound(soundTypeWood).setBlockName("pumpkin").setBlockTextureName("pumpkin");
    blockRegistry.addObject(86, "pumpkin", var5);
    blockRegistry.addObject(87, "netherrack", (new BlockNetherrack()).setHardness(0.4F).setStepSound(soundTypePiston).setBlockName("hellrock").setBlockTextureName("netherrack"));
    blockRegistry.addObject(88, "soul_sand", (new BlockSoulSand()).setHardness(0.5F).setStepSound(field_149776_m).setBlockName("hellsand").setBlockTextureName("soul_sand"));
    blockRegistry.addObject(89, "glowstone", (new BlockGlowstone(Material.glass)).setHardness(0.3F).setStepSound(soundTypeGlass).setLightLevel(1.0F).setBlockName("lightgem").setBlockTextureName("glowstone"));
    blockRegistry.addObject(90, "portal", (new BlockPortal()).setHardness(-1.0F).setStepSound(soundTypeGlass).setLightLevel(0.75F).setBlockName("portal").setBlockTextureName("portal"));
    blockRegistry.addObject(91, "lit_pumpkin", (new BlockPumpkin(true)).setHardness(1.0F).setStepSound(soundTypeWood).setLightLevel(1.0F).setBlockName("litpumpkin").setBlockTextureName("pumpkin"));
    blockRegistry.addObject(92, "cake", (new BlockCake()).setHardness(0.5F).setStepSound(soundTypeCloth).setBlockName("cake").disableStats().setBlockTextureName("cake"));
    blockRegistry.addObject(93, "unpowered_repeater", (new BlockRedstoneRepeater(false)).setHardness(0.0F).setStepSound(soundTypeWood).setBlockName("diode").disableStats().setBlockTextureName("repeater_off"));
    blockRegistry.addObject(94, "powered_repeater", (new BlockRedstoneRepeater(true)).setHardness(0.0F).setLightLevel(0.625F).setStepSound(soundTypeWood).setBlockName("diode").disableStats().setBlockTextureName("repeater_on"));
    blockRegistry.addObject(95, "stained_glass", (new BlockStainedGlass(Material.glass)).setHardness(0.3F).setStepSound(soundTypeGlass).setBlockName("stainedGlass").setBlockTextureName("glass"));
    blockRegistry.addObject(96, "trapdoor", (new BlockTrapDoor(Material.wood)).setHardness(3.0F).setStepSound(soundTypeWood).setBlockName("trapdoor").disableStats().setBlockTextureName("trapdoor"));
    blockRegistry.addObject(97, "monster_egg", (new BlockSilverfish()).setHardness(0.75F).setBlockName("monsterStoneEgg"));
    Block var6 = (new BlockStoneBrick()).setHardness(1.5F).setResistance(10.0F).setStepSound(soundTypePiston).setBlockName("stonebricksmooth").setBlockTextureName("stonebrick");
    blockRegistry.addObject(98, "stonebrick", var6);
    blockRegistry.addObject(99, "brown_mushroom_block", (new BlockHugeMushroom(Material.wood, 0)).setHardness(0.2F).setStepSound(soundTypeWood).setBlockName("mushroom").setBlockTextureName("mushroom_block"));
    blockRegistry.addObject(100, "red_mushroom_block", (new BlockHugeMushroom(Material.wood, 1)).setHardness(0.2F).setStepSound(soundTypeWood).setBlockName("mushroom").setBlockTextureName("mushroom_block"));
    blockRegistry.addObject(101, "iron_bars", (new BlockPane("iron_bars", "iron_bars", Material.iron, true)).setHardness(5.0F).setResistance(10.0F).setStepSound(soundTypeMetal).setBlockName("fenceIron"));
    blockRegistry.addObject(102, "glass_pane", (new BlockPane("glass", "glass_pane_top", Material.glass, false)).setHardness(0.3F).setStepSound(soundTypeGlass).setBlockName("thinGlass"));
    Block var7 = (new BlockMelon()).setHardness(1.0F).setStepSound(soundTypeWood).setBlockName("melon").setBlockTextureName("melon");
    blockRegistry.addObject(103, "melon_block", var7);
    blockRegistry.addObject(104, "pumpkin_stem", (new BlockStem(var5)).setHardness(0.0F).setStepSound(soundTypeWood).setBlockName("pumpkinStem").setBlockTextureName("pumpkin_stem"));
    blockRegistry.addObject(105, "melon_stem", (new BlockStem(var7)).setHardness(0.0F).setStepSound(soundTypeWood).setBlockName("pumpkinStem").setBlockTextureName("melon_stem"));
    blockRegistry.addObject(106, "vine", (new BlockVine()).setHardness(0.2F).setStepSound(soundTypeGrass).setBlockName("vine").setBlockTextureName("vine"));
    blockRegistry.addObject(107, "fence_gate", (new BlockFenceGate()).setHardness(2.0F).setResistance(5.0F).setStepSound(soundTypeWood).setBlockName("fenceGate"));
    blockRegistry.addObject(108, "brick_stairs", (new BlockStairs(var3, 0)).setBlockName("stairsBrick"));
    blockRegistry.addObject(109, "stone_brick_stairs", (new BlockStairs(var6, 0)).setBlockName("stairsStoneBrickSmooth"));
    blockRegistry.addObject(110, "mycelium", (new BlockMycelium()).setHardness(0.6F).setStepSound(soundTypeGrass).setBlockName("mycel").setBlockTextureName("mycelium"));
    blockRegistry.addObject(111, "waterlily", (new BlockLilyPad()).setHardness(0.0F).setStepSound(soundTypeGrass).setBlockName("waterlily").setBlockTextureName("waterlily"));
    Block var8 = (new Block(Material.rock)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundTypePiston).setBlockName("netherBrick").setCreativeTab(CreativeTabs.tabBlock).setBlockTextureName("nether_brick");
    blockRegistry.addObject(112, "nether_brick", var8);
    blockRegistry.addObject(113, "nether_brick_fence", (new BlockFence("nether_brick", Material.rock)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundTypePiston).setBlockName("netherFence"));
    blockRegistry.addObject(114, "nether_brick_stairs", (new BlockStairs(var8, 0)).setBlockName("stairsNetherBrick"));
    blockRegistry.addObject(115, "nether_wart", (new BlockNetherWart()).setBlockName("netherStalk").setBlockTextureName("nether_wart"));
    blockRegistry.addObject(116, "enchanting_table", (new BlockEnchantmentTable()).setHardness(5.0F).setResistance(2000.0F).setBlockName("enchantmentTable").setBlockTextureName("enchanting_table"));
    blockRegistry.addObject(117, "brewing_stand", (new BlockBrewingStand()).setHardness(0.5F).setLightLevel(0.125F).setBlockName("brewingStand").setBlockTextureName("brewing_stand"));
    blockRegistry.addObject(118, "cauldron", (new BlockCauldron()).setHardness(2.0F).setBlockName("cauldron").setBlockTextureName("cauldron"));
    blockRegistry.addObject(119, "end_portal", (new BlockEndPortal(Material.Portal)).setHardness(-1.0F).setResistance(6000000.0F));
    blockRegistry.addObject(120, "end_portal_frame", (new BlockEndPortalFrame()).setStepSound(soundTypeGlass).setLightLevel(0.125F).setHardness(-1.0F).setBlockName("endPortalFrame").setResistance(6000000.0F).setCreativeTab(CreativeTabs.tabDecorations).setBlockTextureName("endframe"));
    blockRegistry.addObject(121, "end_stone", (new Block(Material.rock)).setHardness(3.0F).setResistance(15.0F).setStepSound(soundTypePiston).setBlockName("whiteStone").setCreativeTab(CreativeTabs.tabBlock).setBlockTextureName("end_stone"));
    blockRegistry.addObject(122, "dragon_egg", (new BlockDragonEgg()).setHardness(3.0F).setResistance(15.0F).setStepSound(soundTypePiston).setLightLevel(0.125F).setBlockName("dragonEgg").setBlockTextureName("dragon_egg"));
    blockRegistry.addObject(123, "redstone_lamp", (new BlockRedstoneLight(false)).setHardness(0.3F).setStepSound(soundTypeGlass).setBlockName("redstoneLight").setCreativeTab(CreativeTabs.tabRedstone).setBlockTextureName("redstone_lamp_off"));
    blockRegistry.addObject(124, "lit_redstone_lamp", (new BlockRedstoneLight(true)).setHardness(0.3F).setStepSound(soundTypeGlass).setBlockName("redstoneLight").setBlockTextureName("redstone_lamp_on"));
    blockRegistry.addObject(125, "double_wooden_slab", (new BlockWoodSlab(true)).setHardness(2.0F).setResistance(5.0F).setStepSound(soundTypeWood).setBlockName("woodSlab"));
    blockRegistry.addObject(126, "wooden_slab", (new BlockWoodSlab(false)).setHardness(2.0F).setResistance(5.0F).setStepSound(soundTypeWood).setBlockName("woodSlab"));
    blockRegistry.addObject(127, "cocoa", (new BlockCocoa()).setHardness(0.2F).setResistance(5.0F).setStepSound(soundTypeWood).setBlockName("cocoa").setBlockTextureName("cocoa"));
    blockRegistry.addObject(128, "sandstone_stairs", (new BlockStairs(var2, 0)).setBlockName("stairsSandStone"));
    blockRegistry.addObject(129, "emerald_ore", (new BlockOre()).setHardness(3.0F).setResistance(5.0F).setStepSound(soundTypePiston).setBlockName("oreEmerald").setBlockTextureName("emerald_ore"));
    blockRegistry.addObject(130, "ender_chest", (new BlockEnderChest()).setHardness(22.5F).setResistance(1000.0F).setStepSound(soundTypePiston).setBlockName("enderChest").setLightLevel(0.5F));
    blockRegistry.addObject(131, "tripwire_hook", (new BlockTripWireHook()).setBlockName("tripWireSource").setBlockTextureName("trip_wire_source"));
    blockRegistry.addObject(132, "tripwire", (new BlockTripWire()).setBlockName("tripWire").setBlockTextureName("trip_wire"));
    blockRegistry.addObject(133, "emerald_block", (new BlockCompressed(MapColor.field_151653_I)).setHardness(5.0F).setResistance(10.0F).setStepSound(soundTypeMetal).setBlockName("blockEmerald").setBlockTextureName("emerald_block"));
    blockRegistry.addObject(134, "spruce_stairs", (new BlockStairs(var1, 1)).setBlockName("stairsWoodSpruce"));
    blockRegistry.addObject(135, "birch_stairs", (new BlockStairs(var1, 2)).setBlockName("stairsWoodBirch"));
    blockRegistry.addObject(136, "jungle_stairs", (new BlockStairs(var1, 3)).setBlockName("stairsWoodJungle"));
    blockRegistry.addObject(137, "command_block", (new BlockCommandBlock()).setBlockUnbreakable().setResistance(6000000.0F).setBlockName("commandBlock").setBlockTextureName("command_block"));
    blockRegistry.addObject(138, "beacon", (new BlockBeacon()).setBlockName("beacon").setLightLevel(1.0F).setBlockTextureName("beacon"));
    blockRegistry.addObject(139, "cobblestone_wall", (new BlockWall(var0)).setBlockName("cobbleWall"));
    blockRegistry.addObject(140, "flower_pot", (new BlockFlowerPot()).setHardness(0.0F).setStepSound(soundTypeStone).setBlockName("flowerPot").setBlockTextureName("flower_pot"));
    blockRegistry.addObject(141, "carrots", (new BlockCarrot()).setBlockName("carrots").setBlockTextureName("carrots"));
    blockRegistry.addObject(142, "potatoes", (new BlockPotato()).setBlockName("potatoes").setBlockTextureName("potatoes"));
    blockRegistry.addObject(143, "wooden_button", (new BlockButtonWood()).setHardness(0.5F).setStepSound(soundTypeWood).setBlockName("button"));
    blockRegistry.addObject(144, "skull", (new BlockSkull()).setHardness(1.0F).setStepSound(soundTypePiston).setBlockName("skull").setBlockTextureName("skull"));
    blockRegistry.addObject(145, "anvil", (new BlockAnvil()).setHardness(5.0F).setStepSound(soundTypeAnvil).setResistance(2000.0F).setBlockName("anvil"));
    blockRegistry.addObject(146, "trapped_chest", (new BlockChest(1)).setHardness(2.5F).setStepSound(soundTypeWood).setBlockName("chestTrap"));
    blockRegistry.addObject(147, "light_weighted_pressure_plate", (new BlockPressurePlateWeighted("gold_block", Material.iron, 15)).setHardness(0.5F).setStepSound(soundTypeWood).setBlockName("weightedPlate_light"));
    blockRegistry.addObject(148, "heavy_weighted_pressure_plate", (new BlockPressurePlateWeighted("iron_block", Material.iron, 150)).setHardness(0.5F).setStepSound(soundTypeWood).setBlockName("weightedPlate_heavy"));
    blockRegistry.addObject(149, "unpowered_comparator", (new BlockRedstoneComparator(false)).setHardness(0.0F).setStepSound(soundTypeWood).setBlockName("comparator").disableStats().setBlockTextureName("comparator_off"));
    blockRegistry.addObject(150, "powered_comparator", (new BlockRedstoneComparator(true)).setHardness(0.0F).setLightLevel(0.625F).setStepSound(soundTypeWood).setBlockName("comparator").disableStats().setBlockTextureName("comparator_on"));
    blockRegistry.addObject(151, "daylight_detector", (new BlockDaylightDetector()).setHardness(0.2F).setStepSound(soundTypeWood).setBlockName("daylightDetector").setBlockTextureName("daylight_detector"));
    blockRegistry.addObject(152, "redstone_block", (new BlockCompressedPowered(MapColor.field_151656_f)).setHardness(5.0F).setResistance(10.0F).setStepSound(soundTypeMetal).setBlockName("blockRedstone").setBlockTextureName("redstone_block"));
    blockRegistry.addObject(153, "quartz_ore", (new BlockOre()).setHardness(3.0F).setResistance(5.0F).setStepSound(soundTypePiston).setBlockName("netherquartz").setBlockTextureName("quartz_ore"));
    blockRegistry.addObject(154, "hopper", (new BlockHopper()).setHardness(3.0F).setResistance(8.0F).setStepSound(soundTypeWood).setBlockName("hopper").setBlockTextureName("hopper"));
    Block var9 = (new BlockQuartz()).setStepSound(soundTypePiston).setHardness(0.8F).setBlockName("quartzBlock").setBlockTextureName("quartz_block");
    blockRegistry.addObject(155, "quartz_block", var9);
    blockRegistry.addObject(156, "quartz_stairs", (new BlockStairs(var9, 0)).setBlockName("stairsQuartz"));
    blockRegistry.addObject(157, "activator_rail", (new BlockRailPowered()).setHardness(0.7F).setStepSound(soundTypeMetal).setBlockName("activatorRail").setBlockTextureName("rail_activator"));
    blockRegistry.addObject(158, "dropper", (new BlockDropper()).setHardness(3.5F).setStepSound(soundTypePiston).setBlockName("dropper").setBlockTextureName("dropper"));
    blockRegistry.addObject(159, "stained_hardened_clay", (new BlockColored(Material.rock)).setHardness(1.25F).setResistance(7.0F).setStepSound(soundTypePiston).setBlockName("clayHardenedStained").setBlockTextureName("hardened_clay_stained"));
    blockRegistry.addObject(160, "stained_glass_pane", (new BlockStainedGlassPane()).setHardness(0.3F).setStepSound(soundTypeGlass).setBlockName("thinStainedGlass").setBlockTextureName("glass"));
    blockRegistry.addObject(161, "leaves2", (new BlockNewLeaf()).setBlockName("leaves").setBlockTextureName("leaves"));
    blockRegistry.addObject(162, "log2", (new BlockNewLog()).setBlockName("log").setBlockTextureName("log"));
    blockRegistry.addObject(163, "acacia_stairs", (new BlockStairs(var1, 4)).setBlockName("stairsWoodAcacia"));
    blockRegistry.addObject(164, "dark_oak_stairs", (new BlockStairs(var1, 5)).setBlockName("stairsWoodDarkOak"));
    blockRegistry.addObject(170, "hay_block", (new BlockHay()).setHardness(0.5F).setStepSound(soundTypeGrass).setBlockName("hayBlock").setCreativeTab(CreativeTabs.tabBlock).setBlockTextureName("hay_block"));
    blockRegistry.addObject(171, "carpet", (new BlockCarpet()).setHardness(0.1F).setStepSound(soundTypeCloth).setBlockName("woolCarpet").setLightOpacity(0));
    blockRegistry.addObject(172, "hardened_clay", (new BlockHardenedClay()).setHardness(1.25F).setResistance(7.0F).setStepSound(soundTypePiston).setBlockName("clayHardened").setBlockTextureName("hardened_clay"));
    blockRegistry.addObject(173, "coal_block", (new Block(Material.rock)).setHardness(5.0F).setResistance(10.0F).setStepSound(soundTypePiston).setBlockName("blockCoal").setCreativeTab(CreativeTabs.tabBlock).setBlockTextureName("coal_block"));
    blockRegistry.addObject(174, "packed_ice", (new BlockPackedIce()).setHardness(0.5F).setStepSound(soundTypeGlass).setBlockName("icePacked").setBlockTextureName("ice_packed"));
    blockRegistry.addObject(175, "double_plant", new BlockDoublePlant());
 
    Iterator var10 = blockRegistry.iterator();
 
    while (var10.hasNext())
    {
        Block var11 = (Block) var10.next();
        if (var11.blockMaterial == Material.air)
        {
            var11.field_149783_u = false;
        }
        else
        {
            boolean var12 = false;
            boolean var13 = var11.getRenderType() == 10;
            boolean var14 = var11 instanceof BlockSlab;
            boolean var15 = var11 == var4;
            boolean var16 = var11.canBlockGrass;
            boolean var17 = var11.lightOpacity == 0;
            if (var13 || var14 || var15 || var16 || var17)
            {
                var12 = true;
            }
 
            var11.field_149783_u = var12;
        }
    }
}



Cette méthode statique est appelé lors du lancement du client Minecraft (depuis le constructeur Minecraft() Bootstrap.func_151354_b()).
C'est ici que sont instanciés tous les blocs. Et pour répondre à notre question de départ, on pourra dire simplement qu'un bloc est une instance de la classe Block (captain obvious).

2] Bases du système


Mais, puisque les blocks sont enregistrés dans un bloc (ahaha) statique invisible depuis l'extérieur, comment fait-on pour les récupérer ?
C'est simple. Il existe également une classe Blocks. La voici !

public class Blocks
{
    public static final Block air = (Block) Block.blockRegistry.getObject("air");
    public static final Block stone = (Block) Block.blockRegistry.getObject("stone");
    public static final BlockGrass grass = (BlockGrass) Block.blockRegistry.getObject("grass");
    public static final Block dirt = (Block) Block.blockRegistry.getObject("dirt");
    public static final Block cobblestone = (Block) Block.blockRegistry.getObject("cobblestone");
    public static final Block planks = (Block) Block.blockRegistry.getObject("planks");
    public static final Block sapling = (Block) Block.blockRegistry.getObject("sapling");
    public static final Block bedrock = (Block) Block.blockRegistry.getObject("bedrock");
    public static final BlockLiquid flowing_water = (BlockLiquid) Block.blockRegistry.getObject("flowing_water");
    public static final Block water = (Block) Block.blockRegistry.getObject("water");
    public static final BlockLiquid flowing_lava = (BlockLiquid) Block.blockRegistry.getObject("flowing_lava");
    public static final Block lava = (Block) Block.blockRegistry.getObject("lava");
    public static final BlockSand sand = (BlockSand) Block.blockRegistry.getObject("sand");
    public static final Block gravel = (Block) Block.blockRegistry.getObject("gravel");
    public static final Block gold_ore = (Block) Block.blockRegistry.getObject("gold_ore");
    public static final Block iron_ore = (Block) Block.blockRegistry.getObject("iron_ore");
    public static final Block coal_ore = (Block) Block.blockRegistry.getObject("coal_ore");
    public static final Block log = (Block) Block.blockRegistry.getObject("log");
    public static final Block log2 = (Block) Block.blockRegistry.getObject("log2");
    public static final BlockLeaves leaves = (BlockLeaves) Block.blockRegistry.getObject("leaves");
    public static final BlockLeaves leaves2 = (BlockLeaves) Block.blockRegistry.getObject("leaves2");
    public static final Block sponge = (Block) Block.blockRegistry.getObject("sponge");
    public static final Block glass = (Block) Block.blockRegistry.getObject("glass");
    public static final Block lapis_ore = (Block) Block.blockRegistry.getObject("lapis_ore");
    public static final Block lapis_block = (Block) Block.blockRegistry.getObject("lapis_block");
    public static final Block dispenser = (Block) Block.blockRegistry.getObject("dispenser");
    public static final Block sandstone = (Block) Block.blockRegistry.getObject("sandstone");
    public static final Block noteblock = (Block) Block.blockRegistry.getObject("noteblock");
    public static final Block bed = (Block) Block.blockRegistry.getObject("bed");
    public static final Block golden_rail = (Block) Block.blockRegistry.getObject("golden_rail");
    public static final Block detector_rail = (Block) Block.blockRegistry.getObject("detector_rail");
    public static final BlockPistonBase sticky_piston = (BlockPistonBase) Block.blockRegistry.getObject("sticky_piston");
    public static final Block web = (Block) Block.blockRegistry.getObject("web");
    public static final BlockTallGrass tallgrass = (BlockTallGrass) Block.blockRegistry.getObject("tallgrass");
    public static final BlockDeadBush deadbush = (BlockDeadBush) Block.blockRegistry.getObject("deadbush");
    public static final BlockPistonBase piston = (BlockPistonBase) Block.blockRegistry.getObject("piston");
    public static final BlockPistonExtension piston_head = (BlockPistonExtension) Block.blockRegistry.getObject("piston_head");
    public static final Block wool = (Block) Block.blockRegistry.getObject("wool");
    public static final BlockPistonMoving piston_extension = (BlockPistonMoving) Block.blockRegistry.getObject("piston_extension");
    public static final BlockFlower yellow_flower = (BlockFlower) Block.blockRegistry.getObject("yellow_flower");
    public static final BlockFlower red_flower = (BlockFlower) Block.blockRegistry.getObject("red_flower");
    public static final BlockBush brown_mushroom = (BlockBush) Block.blockRegistry.getObject("brown_mushroom");
    public static final BlockBush red_mushroom = (BlockBush) Block.blockRegistry.getObject("red_mushroom");
    public static final Block gold_block = (Block) Block.blockRegistry.getObject("gold_block");
    public static final Block iron_block = (Block) Block.blockRegistry.getObject("iron_block");
    public static final BlockSlab double_stone_slab = (BlockSlab) Block.blockRegistry.getObject("double_stone_slab");
    public static final BlockSlab stone_slab = (BlockSlab) Block.blockRegistry.getObject("stone_slab");
    public static final Block brick_block = (Block) Block.blockRegistry.getObject("brick_block");
    public static final Block tnt = (Block) Block.blockRegistry.getObject("tnt");
    public static final Block bookshelf = (Block) Block.blockRegistry.getObject("bookshelf");
    public static final Block mossy_cobblestone = (Block) Block.blockRegistry.getObject("mossy_cobblestone");
    public static final Block obsidian = (Block) Block.blockRegistry.getObject("obsidian");
    public static final Block torch = (Block) Block.blockRegistry.getObject("torch");
    public static final BlockFire fire = (BlockFire) Block.blockRegistry.getObject("fire");
    public static final Block mob_spawner = (Block) Block.blockRegistry.getObject("mob_spawner");
    public static final Block oak_stairs = (Block) Block.blockRegistry.getObject("oak_stairs");
    public static final BlockChest chest = (BlockChest) Block.blockRegistry.getObject("chest");
    public static final BlockRedstoneWire redstone_wire = (BlockRedstoneWire) Block.blockRegistry.getObject("redstone_wire");
    public static final Block diamond_ore = (Block) Block.blockRegistry.getObject("diamond_ore");
    public static final Block diamond_block = (Block) Block.blockRegistry.getObject("diamond_block");
    public static final Block crafting_table = (Block) Block.blockRegistry.getObject("crafting_table");
    public static final Block wheat = (Block) Block.blockRegistry.getObject("wheat");
    public static final Block farmland = (Block) Block.blockRegistry.getObject("farmland");
    public static final Block furnace = (Block) Block.blockRegistry.getObject("furnace");
    public static final Block lit_furnace = (Block) Block.blockRegistry.getObject("lit_furnace");
    public static final Block standing_sign = (Block) Block.blockRegistry.getObject("standing_sign");
    public static final Block wooden_door = (Block) Block.blockRegistry.getObject("wooden_door");
    public static final Block ladder = (Block) Block.blockRegistry.getObject("ladder");
    public static final Block rail = (Block) Block.blockRegistry.getObject("rail");
    public static final Block stone_stairs = (Block) Block.blockRegistry.getObject("stone_stairs");
    public static final Block wall_sign = (Block) Block.blockRegistry.getObject("wall_sign");
    public static final Block lever = (Block) Block.blockRegistry.getObject("lever");
    public static final Block stone_pressure_plate = (Block) Block.blockRegistry.getObject("stone_pressure_plate");
    public static final Block iron_door = (Block) Block.blockRegistry.getObject("iron_door");
    public static final Block wooden_pressure_plate = (Block) Block.blockRegistry.getObject("wooden_pressure_plate");
    public static final Block redstone_ore = (Block) Block.blockRegistry.getObject("redstone_ore");
    public static final Block lit_redstone_ore = (Block) Block.blockRegistry.getObject("lit_redstone_ore");
    public static final Block unlit_redstone_torch = (Block) Block.blockRegistry.getObject("unlit_redstone_torch");
    public static final Block redstone_torch = (Block) Block.blockRegistry.getObject("redstone_torch");
    public static final Block stone_button = (Block) Block.blockRegistry.getObject("stone_button");
    public static final Block snow_layer = (Block) Block.blockRegistry.getObject("snow_layer");
    public static final Block ice = (Block) Block.blockRegistry.getObject("ice");
    public static final Block snow = (Block) Block.blockRegistry.getObject("snow");
    public static final Block cactus = (Block) Block.blockRegistry.getObject("cactus");
    public static final Block clay = (Block) Block.blockRegistry.getObject("clay");
    public static final Block reeds = (Block) Block.blockRegistry.getObject("reeds");
    public static final Block jukebox = (Block) Block.blockRegistry.getObject("jukebox");
    public static final Block fence = (Block) Block.blockRegistry.getObject("fence");
    public static final Block pumpkin = (Block) Block.blockRegistry.getObject("pumpkin");
    public static final Block netherrack = (Block) Block.blockRegistry.getObject("netherrack");
    public static final Block soul_sand = (Block) Block.blockRegistry.getObject("soul_sand");
    public static final Block glowstone = (Block) Block.blockRegistry.getObject("glowstone");
    public static final BlockPortal portal = (BlockPortal) Block.blockRegistry.getObject("portal");
    public static final Block lit_pumpkin = (Block) Block.blockRegistry.getObject("lit_pumpkin");
    public static final Block cake = (Block) Block.blockRegistry.getObject("cake");
    public static final BlockRedstoneRepeater unpowered_repeater = (BlockRedstoneRepeater) Block.blockRegistry.getObject("unpowered_repeater");
    public static final BlockRedstoneRepeater powered_repeater = (BlockRedstoneRepeater) Block.blockRegistry.getObject("powered_repeater");
    public static final Block trapdoor = (Block) Block.blockRegistry.getObject("trapdoor");
    public static final Block monster_egg = (Block) Block.blockRegistry.getObject("monster_egg");
    public static final Block stonebrick = (Block) Block.blockRegistry.getObject("stonebrick");
    public static final Block brown_mushroom_block = (Block) Block.blockRegistry.getObject("brown_mushroom_block");
    public static final Block red_mushroom_block = (Block) Block.blockRegistry.getObject("red_mushroom_block");
    public static final Block iron_bars = (Block) Block.blockRegistry.getObject("iron_bars");
    public static final Block glass_pane = (Block) Block.blockRegistry.getObject("glass_pane");
    public static final Block melon_block = (Block) Block.blockRegistry.getObject("melon_block");
    public static final Block pumpkin_stem = (Block) Block.blockRegistry.getObject("pumpkin_stem");
    public static final Block melon_stem = (Block) Block.blockRegistry.getObject("melon_stem");
    public static final Block vine = (Block) Block.blockRegistry.getObject("vine");
    public static final Block fence_gate = (Block) Block.blockRegistry.getObject("fence_gate");
    public static final Block brick_stairs = (Block) Block.blockRegistry.getObject("brick_stairs");
    public static final Block stone_brick_stairs = (Block) Block.blockRegistry.getObject("stone_brick_stairs");
    public static final BlockMycelium mycelium = (BlockMycelium) Block.blockRegistry.getObject("mycelium");
    public static final Block waterlily = (Block) Block.blockRegistry.getObject("waterlily");
    public static final Block nether_brick = (Block) Block.blockRegistry.getObject("nether_brick");
    public static final Block nether_brick_fence = (Block) Block.blockRegistry.getObject("nether_brick_fence");
    public static final Block nether_brick_stairs = (Block) Block.blockRegistry.getObject("nether_brick_stairs");
    public static final Block nether_wart = (Block) Block.blockRegistry.getObject("nether_wart");
    public static final Block enchanting_table = (Block) Block.blockRegistry.getObject("enchanting_table");
    public static final Block brewing_stand = (Block) Block.blockRegistry.getObject("brewing_stand");
    public static final BlockCauldron cauldron = (BlockCauldron) Block.blockRegistry.getObject("cauldron");
    public static final Block end_portal = (Block) Block.blockRegistry.getObject("end_portal");
    public static final Block end_portal_frame = (Block) Block.blockRegistry.getObject("end_portal_frame");
    public static final Block end_stone = (Block) Block.blockRegistry.getObject("end_stone");
    public static final Block dragon_egg = (Block) Block.blockRegistry.getObject("dragon_egg");
    public static final Block redstone_lamp = (Block) Block.blockRegistry.getObject("redstone_lamp");
    public static final Block lit_redstone_lamp = (Block) Block.blockRegistry.getObject("lit_redstone_lamp");
    public static final BlockSlab double_wooden_slab = (BlockSlab) Block.blockRegistry.getObject("double_wooden_slab");
    public static final BlockSlab wooden_slab = (BlockSlab) Block.blockRegistry.getObject("wooden_slab");
    public static final Block cocoa = (Block) Block.blockRegistry.getObject("cocoa");
    public static final Block sandstone_stairs = (Block) Block.blockRegistry.getObject("sandstone_stairs");
    public static final Block emerald_ore = (Block) Block.blockRegistry.getObject("emerald_ore");
    public static final Block ender_chest = (Block) Block.blockRegistry.getObject("ender_chest");
    public static final BlockTripWireHook tripwire_hook = (BlockTripWireHook) Block.blockRegistry.getObject("tripwire_hook");
    public static final Block tripwire = (Block) Block.blockRegistry.getObject("tripwire");
    public static final Block emerald_block = (Block) Block.blockRegistry.getObject("emerald_block");
    public static final Block spruce_stairs = (Block) Block.blockRegistry.getObject("spruce_stairs");
    public static final Block birch_stairs = (Block) Block.blockRegistry.getObject("birch_stairs");
    public static final Block jungle_stairs = (Block) Block.blockRegistry.getObject("jungle_stairs");
    public static final Block command_block = (Block) Block.blockRegistry.getObject("command_block");
    public static final BlockBeacon beacon = (BlockBeacon) Block.blockRegistry.getObject("beacon");
    public static final Block cobblestone_wall = (Block) Block.blockRegistry.getObject("cobblestone_wall");
    public static final Block flower_pot = (Block) Block.blockRegistry.getObject("flower_pot");
    public static final Block carrots = (Block) Block.blockRegistry.getObject("carrots");
    public static final Block potatoes = (Block) Block.blockRegistry.getObject("potatoes");
    public static final Block wooden_button = (Block) Block.blockRegistry.getObject("wooden_button");
    public static final Block skull = (Block) Block.blockRegistry.getObject("skull");
    public static final Block anvil = (Block) Block.blockRegistry.getObject("anvil");
    public static final Block trapped_chest = (Block) Block.blockRegistry.getObject("trapped_chest");
    public static final Block light_weighted_pressure_plate = (Block) Block.blockRegistry.getObject("light_weighted_pressure_plate");
    public static final Block heavy_weighted_pressure_plate = (Block) Block.blockRegistry.getObject("heavy_weighted_pressure_plate");
    public static final BlockRedstoneComparator unpowered_comparator = (BlockRedstoneComparator) Block.blockRegistry.getObject("unpowered_comparator");
    public static final BlockRedstoneComparator powered_comparator = (BlockRedstoneComparator) Block.blockRegistry.getObject("powered_comparator");
    public static final BlockDaylightDetector daylight_detector = (BlockDaylightDetector) Block.blockRegistry.getObject("daylight_detector");
    public static final Block redstone_block = (Block) Block.blockRegistry.getObject("redstone_block");
    public static final Block quartz_ore = (Block) Block.blockRegistry.getObject("quartz_ore");
    public static final BlockHopper hopper = (BlockHopper) Block.blockRegistry.getObject("hopper");
    public static final Block quartz_block = (Block) Block.blockRegistry.getObject("quartz_block");
    public static final Block quartz_stairs = (Block) Block.blockRegistry.getObject("quartz_stairs");
    public static final Block activator_rail = (Block) Block.blockRegistry.getObject("activator_rail");
    public static final Block dropper = (Block) Block.blockRegistry.getObject("dropper");
    public static final Block stained_hardened_clay = (Block) Block.blockRegistry.getObject("stained_hardened_clay");
    public static final Block hay_block = (Block) Block.blockRegistry.getObject("hay_block");
    public static final Block carpet = (Block) Block.blockRegistry.getObject("carpet");
    public static final Block hardened_clay = (Block) Block.blockRegistry.getObject("hardened_clay");
    public static final Block coal_block = (Block) Block.blockRegistry.getObject("coal_block");
    public static final Block packed_ice = (Block) Block.blockRegistry.getObject("packed_ice");
    public static final Block acacia_stairs = (Block) Block.blockRegistry.getObject("acacia_stairs");
    public static final Block dark_oak_stairs = (Block) Block.blockRegistry.getObject("dark_oak_stairs");
    public static final BlockDoublePlant double_plant = (BlockDoublePlant) Block.blockRegistry.getObject("double_plant");
    public static final BlockStainedGlass stained_glass = (BlockStainedGlass) Block.blockRegistry.getObject("stained_glass");
    public static final BlockStainedGlassPane stained_glass_pane = (BlockStainedGlassPane) Block.blockRegistry.getObject("stained_glass_pane");
}




C'est donc depuis cette classe (grâce au modifieur public), que nous pourrons récupérer les instances de nos blocs précédemment déclarés dans Block.

Comme nous l'avons dit précédemment, un bloc est une instance d'une classe fille de Block. Si vous vous rendez dans cette dernière, vous y verrez beaucoup de méthodes, pour la plupart vide. La majorité d'entre elles correpond à des évenements qui surviennent en jeu (quand un joueur casse un, qu'il marche dessus, qu'il clique dessus, etc.). Nous reviendrons plus en détails sur ces méthodes dans la partie 3C.

Chaque bloc a donc sa propre classe, et ce pour permettre un paramétrage fin.
En résumé, les redéfinitions de méthodes (overrides) sont le nerf de la guerre pour créer des blocs !

3] Créer un bloc

A] Un bloc simple


Comme (presque) toujours en modding, il faut s'inspirer du code déjà existant !
Et pour notre inspiration, nous allons nous intéresser au bloc de stone !
Retournons dans Block. Dans la méthode statique registerBlocks(), nous voyons la ligne :
blockRegistry.addObject(1, "stone", (new BlockStone()).setHardness(1.5F).setResistance(10.0F).setStepSound(soundTypePiston).setBlockName("stone").setBlockTextureName("stone"));

Que d'informations ! Qui aurait cru qu'un simple cube demandait tellement d'instructions pour être créé ?

Décomposons le code :

  • blockRegistry.addObject() : Utilisé pour, comme nous l'avons déjà noté, pour récupérer notre bloc depuis n'importe quel endroit du programme.
  • (new BlockStone()) : Ceci appelle simplement le constructeur BlockStone (voir plus bas) pour en créer une instance.
  • setHardness(1.5F) : Cette méthode sert à définir la dureté du block, c'est à dire combien de temps (ou « d'énergie ») il faudra à un joueur pour le casser à la main.
  • setResistance(10.0F) : Cette méthode définit la résistance du block aux explosions.
  • setStepSound(soundTypePiston) : Celle là définit le « son marché », ou quel bruit ça fait quand un joueur marche dessus.
  • setBlockName(stone) : Cet appel sert à donner un nom au bloc. C'est un nom absolu, il ne dépend donc pas de la langue que vous avez définie dans les paramètres. Il servira à récupérer la traduction adéquate.
  • setBlockTextureName(stone) : Comme les plus anglophiles l'auront deviné, cette méthode définit le nom de la texture du block (nous y reviendrons).

Allons voir le fameux constructeur de BlockStone.

public class BlockStone extends Block
{
 
    /**
     * Constructeur principal de BlockStone. Il appelle le constructeur parent
     * (super) en lui fournissant comme argument le Material.rock.
     */
    public BlockStone()
    {
        // Appel du super
        super(Material.rock);
 
        // Définition de l'onglet dans lequel le bloc va apparaître dans l'interface créative
        this.setCreativeTab(CreativeTabs.tabBlock);
    }
 
    /**
     * Renvoie l'item qu'il faudra faire apparaître dans le monde quand on
     * cassera le block en mode survival ou hardcore.
     *
     * On redéfinit (override) cette méthode car on souhaite changer l'Item
     * droppé par défaut (stone) en cobbleStone.
     */
        // Oui je sais, les arguments ont des noms pourris. Libre à vous des les renommer.
    public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_)
    {
        // Celui de la cobbleStone, qui n'est pas celui par défaut (stone).
        return Item.getItemFromBlock(Blocks.cobblestone);
    }
}

Nous allons donc, à l'image de la stone, créer un bloc pour notre tutoriel ! Et, comme celui-ci a été écrit le 25 décembre, nous allons prendre comme exemple un cadeau !

Tout d'abord, créons une classe.

public class BlockPresent extends Block
{
 /**
  * Constructeur principal du bloc cadeau.
  * Appelle son super avec {@link Material#ice}.
  */
 protected BlockPresent()
 {
  // Appel de la classe mère
  super(Material.ice);
  
  // On place le bloc dans l'onglet des décorations
  this.setCreativeTab(CreativeTabs.tabDecorations);
 }
}

Ensuite, il nous faut l'ajouter dans la liste du blockRegistry, via Block.registerBlocks(). Pour cela, il nous faut donc l'instancier.
Après l'ajout du BlockDoublePlant, à la fin de la méthode, nous plaçons cette ligne :

blockRegistry.addObject(176, "present", (new BlockPresent()).setBlockName("present").setStepSound(soundTypeGlass).setBlockTextureName("ice_packed").setHardness(0.0f));

On lui a glissé la texture de la glace -- voir plus bas pour d'autres explications à propos des textures.

Ensuite, comme on souhaite pouvoir accéder au bloc depuis n'importe quel endroit du code du jeu, on le déclare aussi dans Blocks.

public static final BlockPresent present = (BlockPresent) Block.blockRegistry.getObject("present");

Et en lançant le jeu, nous voyons un nouveau bloc apparaître dans l'onglet des décorations !

qe7DwLM.png

Nous avons désormais créé la base de notre bloc. Mais il lui manque quelque chose... une texture ! Et auss un nom !

B] Les textures et les noms


Il nous faut d'abord aborder les très grandes lignes des textures dans Minecraft.
Pour créer des blocs simple, vous n'aurez besoin de savoir que 2 choses : une texture (appelée icône pour un bloc) dérive de l'interface IIcon, et on peut récupérer une texture via la méthode registerIcon d'un IIconRegister.

Par défaut, le système de bloc de Minecraft prévoit une texture identique pour les 6 faces. Pour cela, nous ne nous servons que de la méthode setBlockTextureName. Celle-ci définit le nom de la texture du bloc (mais je suis sûr que vous aviez deviné :D).
Cette icône est stockée dans une variable de la classe Block, appelée blockIcon, par la méthode registerBlockIcons de la même classe Block.
Afin d'être dessinée dans le monde, la texture est récupérée par le moteur de rendu via la méthode getIcon, toujours dans Block.

Les textures des blocs se trouvent dans un sous dossier, à l'intérieur du fichier « <version>.jar ». Dans le cas de l'exemple, ce fichier s'appelle « 1.7.10.jar », et il se trouve dans le dossier « ModCoderPack/jars/versions/1.7.10/1.7.10.jar ».

Pour ajouter ou éditer des textures, il vous faut un logiciel d'ouvertude d'archives. Sous linux, je vous conseille Xarchiver, ou Winrar sous windows. Il nous servira à ouvrir le fameux 1.7.10.jar, comme suit :

Ei8zPVn.png

En descendant dans les sous-dossiers, on trouve « assets/minecraft/textures/blocks ». Et on tombe sur les textures de tous les blocs de Minecraft ! C'estici qu'il faudra glisser la texture de notre cadeau.

Revenons au code, et modifions le paramètre qu'on fournit à la méthode setBlockTextureName dans registerBlocks.
blockRegistry.addObject(176, "present", (new BlockPresent()).setBlockName("present").setStepSound(soundTypeGlass).setBlockTextureName("present_texture").setHardness(0.0f));

Dans le dossier des textures, le nom du fichier de la texture d'un bloc sera « <leNomDeCetteTexture>.png ».
Il nous faut maintenant y ajouter le fichier « present_texture.png » (vous pouvez le télécharger depuis ).

5vQ9WQ8.png

Et notre bloc change de mine !

OUV2gzS.png

Mais ne trouvez vous pas que notre cadeau a toujours un air particulier ?
C'est normal ! C'est parce que toutes ses faces sont les mêmes !

Alors changeons ça ! :)
Je vous ai parlé tout à l'heure des méthodes registerBlockIcons et getIcon. Et je vous ai aussi dit que le nerf des blocs était la redéfinition des méthodes. Vous devinez la prochaine étape ? :)

Commençons par créer 2 variables dans la classe BlockPresent :

/**
 * La texture du haut du cadeau.
 */
private IIcon iconBottom;
	
/**
 * La texture du bas du cadeau.
 */
private IIcon iconTop;

Puis, il nous faut redéfinir la méthode registerBlockIcons :

/**
 * Sert à récupérer les icônes du bloc.
 */
public void registerBlockIcons(IIconRegister par1IIconRegister)
{
	// Important ! On appelle le super pour continuer d'enregistrer la texture des côtés du cadeau.
	super.registerBlockIcons(par1IIconRegister);

	// On récupère la texture du bas
	this.iconBottom = par1IIconRegister.registerIcon("present_bot");

	// On récupère la texture du haut
	this.iconTop = par1IIconRegister.registerIcon("present_top");
}

Ensuite, nous devons modifier également la méthode getIcon.
Elle prend 2 paramètres, qui sont chacun des nombres. Le premier c'est la face pour laquelle on demande la texture, et le deuxième la meta-donnée du bloc (voir plus bas, section sur les méta-données).

/**
* Renvoie l'icône à afficher dans le monde.
*
* @param side La face du bloc. Si side vaut...
* <ul>
* <li>0 : alors la texture retournée sera dessinée sur la face de dessous du bloc ;</li>
* <li>1 : alors la texture retournée sera dessinée sur la face de dessus de bloc ;</li>
* <li>2 : alors la texture retournée sera dessinée sur la face qui est en face de nous quand on pose ;</li>
* <li>3 : alors la texture retournée sera dessinée sur la face qui est de l'autre coté par rapport à nous quand on pose ;</li>
* <li>4 : alors la texture retournée sera dessinée sur la face qui est à droite par rapport à nous quand on pose ;</li>
* <li>5 : alors la texture retournée sera dessinée sur la face qui est à gauche par rapport à nous quand on pose.</li>
* </ul>
* @param meta La metadata du bloc.
*/
public IIcon getIcon(int side, int meta)
{
 // Si c'est l'icône du bas...
 if (side == 0)
 {
  return this.iconBottom;
 }
 // Si c'est l'icône du haut...
 else if (side == 1)
 {
  return this.iconTop;
 }
 // Sinon...
 else
 {
  return this.blockIcon;
 }
}

Et enfin, il nous reste à glisser les texture dans le même dossier qu'avant !

2vROzVE.png


Nous avions aussi parlé du nom du bloc. Car pour l'instant, il s'appelle « tile.present.name » ce qui n'est franchement pas mélodieux.

Cela est en lien avec le système de traduction de Minecraft, qui s'occupe de traduire des clefs (par exemple « gui.done », ou « tile.present.name ») en des phrases lisibles (comme « Terminé » ou « Cadeau »). L'ensemble de ces correspondances clef <-> traduction est stocké dans un fichier d'extension .lang. Ces fichiers sont téléchargés en même temps que les ressources par le Launcher (voir le tutoriel à venir sur la création et la gestion des launchers).

Pour ajouter un nom à notre bloc, il faudra ajouter la ligne, dans le fichier fr_FR.lang :

tile.blockPresent.name=Cadeau !

Vous pouvez faire cette manipulation dans chaque fichier lang, et ainsi ajouter des traductions du nom du bloc dans d'autres langages.

C] Les méta-données


C'est un nom un peu pompeux qu'on donne à un nombre entre 0 et 15 (stocké sur 4 bits), qu'on attribue à chaque bloc. Rien de bien méchant.
Mais il est quand même utile de souligner les deux sens que peut prendre le mot « bloc », qui sont trop souvent sous entendus :
  • Soit on parle du bloc générique, par exemple le bloc de stone, celui qu'on définit dans la classe Block. Celui là est unique. On devrait l'appeler le « type de bloc », mais on ne le fait jamais parce que c'est trop long.
  • Soit on parle du bloc objet, du bloc de monde. Il est bien sûr multiple (vous conviendrez qu'il y a plus d'un bloc dans un monde Minecraft).

Une méta-donnée s'attribue à un bloc de monde.
Exemple : vous êtes en jeu, vous posez devant vous 2 blocs de laine, un rouge et un vert. Ils sont tous les deux du même type de bloc. Ils on les mêmes proriétés : ils sont faciles à casser, brûlent aisément, droppent de la laine quand on les casse... Et pourtant, ce ne sont pas les mêmes blocs, puisqu'il y en a un rouge et un vert.

Dans le code, ils sont représentés par la même classe. Rien ne les diférencie... sauf leurs méta-données. Celle du rouge vaut 1 alors que celle du vert vaut 2.
Les méta-données ont été mises en place dans ce but : pouvoir créer des blocs identiques par leurs propriétés mais différents d'apparence et de nom sans devoir créer une nouvelle classe (pour éviter de charger les packages qui le sont assez comme ça).

Les blocs les utilisant sont très nombreux (pistons, dalles, laines, argiles, etc.).

Voilà, vous savez tout des metadatas (oui, on peut les appeler par leur petit nom maintenant).

Dans la pratique, ça se traduit par environ 5 méthodes, encore et toujours dans la classe Block : getSubBlocks, damageDropped, registerBlockIcons, getIcon et getUnlocalizedName ; et aussi certains affiliées sur lesquelles nous reviendront.

La première et la plus nouvelle de ces 5 est getSubBlocks, mais son rôle est facile à comprendre.
Elle sert à ajouter à la liste passée en argument (donc par référence) les différents blocs de monde qui sera sélectionnable dans l'onglet créatif. Par exemple, il pourrait très bien me prendre de vouloir mettre beaucoup de cadeaux :

/**
 * Ajoute les blocs de monde sélectionnables à la liste passée par référence.
 */
public void getSubBlocks(Item par1Item, CreativeTabs par2CreativeTabs, List par3List)
{
	for (int i = 0; i < 16; ++i)
	{
		// On ajoute un cadeau de plus.
		par3List.add(new ItemStack(par1Item, 1, 0));
	}
}

Auquel cas, je les retrouverai tous dans l'onglet créatif :
XiAYtGA.png

Mais c'est inutile dans le cas du cadeau.
Là où ça devient intéressant, c'est justement avec les méta-données.

Comme on veut pouvoir poser les laines de différentes couleurs, il faut qu'elles apparaîssent dans l'onglet créatif. Autrement dit, on veut faire apparaître plusieurs blocs de monde pour un même type de bloc.
Donc on les ajoute à la liste (en modifiant le 3e paramètre que l'on fournit à ItemStack -- voir le tutoriel sur les items à venir).

Quand à damageDropped, son utilité est propre au mode survie.
Si l'on casse un bloc, un item est droppé dans le monde. Et si l'on casse un bloc qui a une méta-donnée, on veut que l'item droppé ait aussi cette méta-donnée.
Le premier paramètre de damageDropped est la metadata dubloc que le joueur à cassé, et la méthode renvoie la metadata de l'item qui sera droppé. Dans le cas où notre bloc est à méta-donnée multiple, on renvoie donc cette même métadonnée.

public int damageDropped(int meta)
{
	return meta;
}

Les méthodes de textures sont utilisées de la même manière, il vous faudra déclarer un tableau d'icônes plutôt que des variables séparées.

Une méthode très utile pour la création de blocs à méta-données multiples, est onBlockPlaced. Elle renvoie la méta-donné d'un bloc lorsqu'il est placé. L'intérêt que l'on y porte est surtout dû à ses arguments, qui sont nombreux et détaillent la façon dont le joueur pose le bloc. Nous y reviendrons dans un exemple.

Ensuite, après avoir créé vos méta-données sur le bloc, vous pourrez les attribuer dans le monde, via les méthodes World.setBlockMetadata(x, y, z, meta) et les récupérer via World.getBlokMetadata(x, y, z).

Pour pouvoir profiter d'un bloc avec metadatas, il faut enregistrer l'ItemBlock correspondant comme pouvant accueiller différents types. Pour cela, il faut se rendre à la fin de la méthode Item.registerItems() :

HashSet var1 = Sets.newHashSet(new Block[] {Blocks.air, Blocks.brewing_stand, Blocks.bed, Blocks.nether_wart, Blocks.cauldron, Blocks.flower_pot, Blocks.wheat, Blocks.reeds, Blocks.cake, Blocks.skull, Blocks.piston_head, Blocks.piston_extension, Blocks.lit_redstone_ore, Blocks.powered_repeater, Blocks.pumpkin_stem, Blocks.standing_sign, Blocks.powered_comparator, Blocks.tripwire, Blocks.lit_redstone_lamp, Blocks.melon_stem, Blocks.unlit_redstone_torch, Blocks.unpowered_comparator, Blocks.redstone_wire, Blocks.wall_sign, Blocks.unpowered_repeater, Blocks.iron_door, Blocks.wooden_door});
Iterator var2 = Block.blockRegistry.getKeys().iterator();

while (var2.hasNext())
{
	String var3 = (String)var2.next();
	Block var4 = (Block)Block.blockRegistry.getObject(var3);
	Object var5;

	if (var4 == Blocks.wool)
	{
		var5 = (new ItemCloth(Blocks.wool)).setUnlocalizedName("cloth");
	}
	else if (var4 == Blocks.stained_hardened_clay)
	{
		var5 = (new ItemCloth(Blocks.stained_hardened_clay)).setUnlocalizedName("clayHardenedStained");
	}
	else if (var4 == Blocks.stained_glass)
	{
		var5 = (new ItemCloth(Blocks.stained_glass)).setUnlocalizedName("stainedGlass");
	}
	else if (var4 == Blocks.stained_glass_pane)
	{
		var5 = (new ItemCloth(Blocks.stained_glass_pane)).setUnlocalizedName("stainedGlassPane");
	}
	else if (var4 == Blocks.carpet)
	{
		var5 = (new ItemCloth(Blocks.carpet)).setUnlocalizedName("woolCarpet");
	}
	else if (var4 == Blocks.anvil)
	{
		var5 = (new ItemAnvilBlock(Blocks.anvil)).setUnlocalizedName("anvil");
	}
	else if (var4 == Blocks.double_plant)
	{
		var5 = (new ItemDoublePlant(Blocks.double_plant, Blocks.double_plant, BlockDoublePlant.field_149892_a)).setUnlocalizedName("doublePlant");
	}
	else
	{
		if (var1.contains(var4))
		{
			continue;
		}

		var5 = new ItemBlock(var4);
	}

	itemRegistry.addObject(Block.getIdFromBlock(var4), var3, var5);
}

Et d'y ajouter une clause pour notre bloc, dans l'exemple avec le cadeau :

else if (var4 == Blocks.present)
{
	var5 = new ItemBlockWithMetadata(Blocks.present, Block.prensent).setUnlocalizedName("present");
}

D] Quelques méthodes utiles


Cette partie sera sans doute la plus monotone, mais elle est nécessaire pour la suite. Nous allons lister et expliquer quelques méthodes de la classe Block. Nous le répertorierons pas toutes, et si une d'entre elles vous interpelle, n'hésitez pas à nous le signaler pour que nous l'ajoutions à la liste ! ;)
  • boolean func_149730_j() : renvoie true si le bloc est opaque.
  • int getLightOpacity() : renvoie l'opacité à la lumière du bloc. Voir ici pour plus d'infos.
  • boolean getCanBlockGrass() : renvoie true si de l'herbe peut pousser sur le bloc.
  • int getLightValue() : renvoie la quantité de lumière émise par le bloc.
  • Material getMaterial() : renvoie le matériau du bloc.
  • MapColor getMapColor(int meta) : renvoie la couleur du bloc quand la map est dessinée sur l'item du même nom.
  • void registerBlocks() : enregistre tous les blocks dans le blockRegistry, cf. ci dessus.
  • Block setStepSound(Block.StepSound sound) : définit le son quand on marche sur le bloc. Renvoie this pour le chaînage.
  • Block setLightOpacity(int lightOpacity) : définit l'opacity à la lumière du bloc. Renvoie this pour le chaînage.
  • Block setLightLevel(float lightLevel) : définit le niveau de lumière du bloc (entre 0 et 1). Renvoie this pour le chaînage.
  • Block setResistance(float resistance) : définit la résistance du bloc. Renvoie this pour le chaînage.
  • boolean isNormalCube() :renvoie true si le bloc est bien un cube à 6 faces.
  • boolean renderAsNormalBlock() :renvoie true si le bloc est dessiné un cube à 6 faces.
  • int getRenderType() : renvoie le numéro de rendu du bloc (voir plus bas).
  • Block setHardness(float hardness) : définit la dureté du bloc. Si vaut -1, le bloc ne pourra pas être déplacé par un piston. Renvoie this pour le chaînage.
  • boolean hasTileEntity() :renvoie true si le bloc est destinée a accueillir une TileEntity (voir plus bas).
  • void setBlockBounds(float minX, float minY, float minZ, float maxX, float maxY, float maxZ) : définit les bordures du bloc. c'est utilisé dans le cas de blocs qui sont cubiques mais qui sont plus petit que le permet leur emplacement dans le monde, par exemple les crânes.
  • boolean shouldSideBeRendered(IBlockAccess blockAccess, int x, int y, int z, int side) : renvoie true si la face du bloc indiquée doit être dessinée. La position (x, y, z) donnée est celle du block accolé à la face à propos de la quelle on se pose la question (par exemple le bloc au dessus si la face est celle du dessus), pas celle du bloc qui détient la face.

E] Ajouter un bloc avec un rendu complexe


N'est-ce pas quelque chose d'utile, de pouvoir ajouter des blocs qui n'apparaissent pas comme cubiques !
C'est ce que nous allons voir dans cette partie !

Pour l'exemple, nous allons créer un nénuphar oblique. Oui, oui, vous avez bien lu. Comme vous savez désomais créer des blocs, nous n'allons pas nous attarder sur sa classe ni sur la manière de lui attribuer la texture que nous voulons, mais seulement préciser qu'il faudra y ajouter cette méthode :
/**
 * Cette méthode renseigne sur le type de rendu du bloc. Elle n'est utilisée que côté client.
 * Elle est appelée par @link{RenderBlocks#renderBlockByRenderType(Block, int, int, int)}, 
 * qui délèguera ensuite le dessin du blocs dans le monde à une autre méthode.
 */
public int getRenderType()
{
	return 100; // Assurez vous bien que l'ID que vous renvoyez ne soit pas déjà utilisée, en regardant RenderBlocks.renderBlockByRenderType();
}

Ensuite, pour créer la méthode de rendu de notre bloc, il nous faudra aller dans RenderBlocks, et ajouter une clause dans la-terrible-ligne-de-la-mort-qui-tue (qui compte quand même 4000 caractères).
Tout au bout de la ligne, on remplace « false » par :

(var5 == 100 ? this.renderBlockTuto(p_147805_1_, p_147805_2_, p_147805_3_, p_147805_4_) : false)

Ce qui, dans le cas de notre bloc (100 est le numéro unique de sa méthode de rendu), appelle renderBlockTuto.

/**
* Dessine le block passé en argument à la position donnée.
*
* @param block Objet Block à dessiner.
* @param x Coordonnée X du dessin.
* @param y Coordonnée Y du dessin.
* @param z Coordonnée Z du dessin.
* @return <code>true</code> si le rendu s'est bien passé, <code>false</code> sinon.
*/
private boolean renderBlockTuto(Block block, int x, int y, int z)
{
 /**
  * Objet Tessellator, principal outil de desin dans Minecraft.
  */
 Tessellator tessellator = Tessellator.instance;
 
 // On récupère l'icône de notre bloc
 IIcon blockIcon = block.getIcon(0, 0);
 
 // On récupère, depuis l'icône, ses coordonnées
 
 float uMin = blockIcon.getMinU();
 float uMax = blockIcon.getMaxU();
 float vMin = blockIcon.getMinV();
 float vMax = blockIcon.getMaxV();

 // Puis on dessine les points et leur texture
 tessellator.addVertexWithUV(x + 1.0D, y, z, uMax, vMax);
 tessellator.addVertexWithUV(x, y + 1.0D, z, uMax, vMin);
 tessellator.addVertexWithUV(x, y + 1.0D, z + 1.0D, uMin, vMin);
 tessellator.addVertexWithUV(x + 1.0D, y, z + 1.0D, uMin, vMax);

 // On renvoie true pour dire que le rendu s'est bien passé
 return true;
}

Et on obtiendra notre nénuphar !

vvdoMSZ.png

4] Astuces pratiques

Nous voilà maintenant arrivés à la partie que je pense que vous attendiez le plus !

Avant de rentrer dans le vif du sujet, je voudrais quand même préciser quelque chose : libre à vous de copier « brutalement » les codes présentés ici sans aucunement chercher la compréhension, mais je vous conseille d'abord de lire ce qui a été dit au dessus. ;)

A] Créer un minerai

La création d'un minerai comprend 3 choses : la création du bloc « cassable », tel qu'il sera généré dans le monde (le minerai en lui-même, qui s'appelle BlockOre dans le code), la création du bloc « compact » (que l'on obtient en combinant 9 lingots dans la table de craft, qui s'appelle BlockCompressed dans le code), et de son item. Dans l'exemple, on fera avec un zoli truc qui brille :wub: .

Nous n'allons pas passer du temps là dessus, mais il nous faut quand même créer en premier lieu l'Item du bloc.

Pour cela, il nous faudra ajouter dans la méthode Item.registerItems() la ligne suivante :

itemRegistry.addObject(423, "shiny_stone", (new Item()).setUnlocalizedName("shiny_stone").setCreativeTab(CreativeTabs.tabMaterials).setTextureName("shiny_stone_item"));

Puis dans la classe Items :

public static final Item shinyStone = (Item)Item.itemRegistry.getObject("shiny_stone");

Ceci étant fait, nous pouvons maintenant ajouter notre bloc dans Block.registerBlocks() :

blockRegistry.addObject(177, "shiny_stone_ore", (new BlockOre()).setHardness(3.0F).setResistance(5.0F).setStepSound(soundTypePiston).setBlockName("oreShinyStone").setBlockTextureName("shiny_stone_ore")); // Vous pouvez librement modifier les valeurs des méthodes set

Et bien sûr, dans Blocks :

public static final BlockOre shinyStoneOre = (BlockOre) Block.blockRegistry.getObject("shiny_stone_ore");

Ensuite, il nous faut aller modifier la méthode BlockOre.getItemDropped(), pour définir l'Item qui sera droppé quand un joueur cassera le bloc :

public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_)
{
    // On ajoute notre clause
    return this == Blocks.coal_ore ? Items.coal : (this == Blocks.diamond_ore ? Items.diamond : (this == Blocks.lapis_ore ? Items.dye : (this == Blocks.emerald_ore ? Items.emerald : (this == Blocks.quartz_ore ? Items.quartz : (this == Blocks.shinyStoneOre ? Items.shinyStone : Item.getItemFromBlock(this))))));
}

Et nous obtenons les blocs !

gvZvuAU.png

Ensuite, il nous reste à créer le bloc « compressé ». La méthode est la même, mais on utilisera la classe BlockOreStorage :

// Le field MapColor correspont à las couleur la plus représentative de notre block
blockRegistry.addObject(178, "shiny_stone_block", (new BlockCompressed(MapColor.field_151658_d)).setHardness(3.0F).setResistance(5.0F).setStepSound(soundTypePiston).setBlockName("blockShinyStone").setBlockTextureName("shiny_stone_block"));

Puis dans Blocks :

public static final BlockCompressed shinyStoneBlock = (BlockCompressed) Block.blockRegistry.getObject("shiny_stone_block");

Et voilà, notre minerai est créé !

Bonus :

Pour ajouter une recette de craft qui donne le bloc compressé, rendez vous dans RecipesIngots, et modifiez le constructeur pour ajouter ce tableau à la liste recipeItems :

{Blocks.shinyStoneBlock, new ItemStack(Items.shinyStone, 9)}

Ce qui donnera donc :

public RecipesIngots()
{
	this.recipeItems = new Object[][] { {Blocks.gold_block, new ItemStack(Items.gold_ingot, 9)}, {Blocks.iron_block, new ItemStack(Items.iron_ingot, 9)}, {Blocks.diamond_block, new ItemStack(Items.diamond, 9)}, {Blocks.emerald_block, new ItemStack(Items.emerald, 9)}, {Blocks.lapis_block, new ItemStack(Items.dye, 9, 4)}, {Blocks.redstone_block, new ItemStack(Items.redstone, 9)}, {Blocks.coal_block, new ItemStack(Items.coal, 9, 0)}, {Blocks.hay_block, new ItemStack(Items.wheat, 9)}, {Blocks.shinyStoneBlock, new ItemStack(Items.shinyStone, 9)}};
}

;)

B] Créer un bloc orientable

Cette partie combine 2 des techniques présentées ci dessus : le rendu complexe d'un bloc est les méta-données, en utilisant certaines des méthodes de Block.

Le fonctionnement général de notre bloc sera le suivant :

C] Créer une plante

Bientôt...

E] La génération

Le système de génération de Minecraft fonctionne par « chunks ». Pour rappel, un chunk est un morceau d'un monde, qui fait 16x16 blocs sur 126 de haut. Par exemple, ceci est un chunk !

NtJAp.png

Le système de génération va générer des « groupes » de minerai d'un nombre aléatoire à une hauteur aléatoire dans le chunk.

C'est celà qui fait qu'on trouve parfois 2, 3, 4, voire 5 minerais de diamant les uns à côté des autres ! Ce sont des groupes de minerais.

Pour paramétrer la génération, nous allons donc avoir besoin de définir :

  • Le minerai à générer (logique)
  • Combien de « groupes » de minerai voulons nous générer par chunk
  • Combien de minerais par groupe
  • La hauteur maximale des groupes dans le chunk

La classe qui est étendue par tous les générateurs est WorldGenerator. Elle est utilisée tant pour générer des nénuphars que des donjons ou des minerais !

Dans notre cas, nous allons nous intéresser à sa classe fille WorldGenMinable.

Un autre système des mondes de Minecraft est celui des Biomes. En voici quelques aperçus :

sshot50632744ae6bc.jpg

Au fil des version en sont apparus d'autres, plus surprenants les uns que les autres.

Mais, ce qui nous intéresse, c'est leur génération. Elle se fait à partir de la classe BiomeGenBase, qui est étendue pour chaque type de biome. On retrouvera ainsi les classes BiomeGenBeach, BiomeGenForest, BiomeGenJungle, etc.

Lors du processus de génération que nous n'allons pas détailler ici, la classe BiomeGenBase fait appel au BiomeDecorator, qui est commun pour tous les types de biomes confondus.

On se rapproche de nos minerais !

En effet, c'est dans BiomeDecorator qu'on retrouve des instances de WorldGenMinable. Et nous allons ajouter la notre !

Dans la déclaration des fields de BiomeDecorator, nous ajoutons :

protected WorldGenerator shinyStoneGen;

Ensuite, dans le constructeur, nous instancions :

this.shinyStoneGen = new WorldGenMinable(Blocks.shinyStoneOre, nbrOfBlocks);

Ici, nbrOfBlocks est le nombre maximal de minerai par groupe généré. Pour le tutoriel, nous allons prendre :

this.shinyStoneGen = new WorldGenMinable(Blocks.shinyStoneOre, 7);

Dans la fonction generateOres (appelée depuis BiomeDecorator.func_150513_a, elle même appelée depuis le BiomeGenBase), on ajoute à la liste notre générateur :

protected void generateOres()
{
	this.genStandardOre1(20, this.dirtGen, 0, 256);
	this.genStandardOre1(10, this.gravelGen, 0, 256);
	this.genStandardOre1(20, this.coalGen, 0, 128);
	this.genStandardOre1(20, this.ironGen, 0, 64);
	this.genStandardOre1(2, this.goldGen, 0, 32);
	this.genStandardOre1(8, this.redstoneGen, 0, 16);
	this.genStandardOre1(1, this.diamondGen, 0, 16);
	this.genStandardOre2(1, this.lapisGen, 16, 16);
        
        // Shiny Stone
        this.genStandardOre1(2, this.shinyStoneGen, 0, 32);
}

Les paramètres sont :

  • Le nombre de groupes de minerais par Chunk
  • Le générateur des groupes (précédemment créé)
  • La hauteur minimale des groupes (0 est la hauteur de la bedrock)
  • La hauteur maximale des groupes (on met 32, il faut quand même chercher un peu profond pour trouver un zoli truc qui brille :wub: )

Et, au détour d'une galerie, on tombe sur notre minerai !

ox1O2w5.png

5] Entités de blocs (TileEntities)

Par défaut, un bloc de monde n'est pas une entité, en ce sens qu'il ne dispose pas des fonctionnalités utiles de celles, comme par exemple la sauvegarde d'informations spécifiques via NBT.

Mais certains blocs aux fonctionnalités particulières on besoin de ces fonctionnalités, comme par exemple les coffres ou les dispensers. Alors, quand on les pose dans un monde, il ne sont plus « seulement » des cubes, mais aussi des entités qui intéragissent avec leur environnement.

Voyons comment créer ça ! :D

A] Créer une TileEntity

Tous les blocs disposant de TileEntities disposent aussi d'une classe spéciale.

Celle ci doit être étendue de BlockContainer et n'est pas très complexe :

public class BlockExempleTE extends BlockContainer 
{
    // Le constructeur n'a rien de nouveau, ne nous attardons pas dessus
    public BlockExempleTE(int par1, Material material) 
    {
        super(par1, material);
    }
}

De part l'extension de la classe abstraite BlockContainer (et surtout de par l'implémentation implicite de ITileEntityProvider), nous somme obligés d'ajouter la méthode createNewTileEntity. Toutes les méthodes de la classe Block restent bien sûr applicables.

/*
 * Appelé lorsque le bloc est posé dans le monde passé en argument.
 */
@Override
public TileEntity createNewTileEntity(World world, int meta) 
{
    // On renvoie notre une nouvelle TileEntity
    return new TileEntityExemple();
}

La classe TileEntityExemple n'est pas trouvée ? Alors créons la !

public class TileEntityExemple extends TileEntity 
{
    public TileEntityExemple()
    {
        super();
    }
    // Ici seront overridées les méthodes de la classe mère, les plus intéressantes étant readFromNBT et writeToNBT
}

/!\ Attention : il est impératif de laisser un constructeur qui ne prend pas d'arguments !

Pour faciliter leur « sérialisation » lors de leur enregistrement/lecture depuis les fichiers du monde, tous les types de TileEntities sont déclarés dans TileEntity elle-même.

Dans le bloc static, en bas, nous ajoutons :

static
{
    addMapping(TileEntityFurnace.class, "Furnace");
    // [...]
    addMapping(TileEntityComparator.class, "Comparator");

    // On ajoute notre nouvelle TileEntity et son nom
    addMapping(TileEntityExemple.class, "Exemple");
}

B] Les méthodes disponibles

Puisqu'il n'y en a pas énormément, nous allons en faire la liste et les expliquer !

  • getWorld() : renvoie une référence à l'objet World, le monde dans lequel est la TileEntity.
  • setWorldObj(World) : définit le monde dans lequel est la TileEntity, normalement on n'a pas besoin de l'appeler manuellement.
  • hasWorldObj() : utilisé par le système de Minecraft pour savoir s'il faut faire rafraîchir la TileEntity ou non.
  • readFromNBT(NBTTagCompound) : lit les informations de la TileEntity depuis les fichiers du monde (utilisé pour charger une sauvegarde). N'oubliez pas d'invoquer le super.readFromNBT lorsque vous la redéfinissez !
  • writeToNBT(NBTTagCompound) : écrit les informations de la TileEntity qui doivent être sauvegardées. N'oubliez pas d'invoquer le super.writeToNBT lorsque vous la redéfinissez !
  • static createAndLoadEntity(NBTTagCompound) : à partir du NBTTagCompound contenant toutes les informations nécessaires, renvoie une nouvelle instance TileEntity (vous remarquez en lisant le code l'intérêt de laisser un constructeur sans arguments).
  • getBlockMetadata() : revoie la metadata du bloc qui abrite la TileEntity. Si elle n'est pas valide, la calcule.
  • getDistanceSq(double, double, double) : renvoie la distance au carré entre la TileEntity et la position donnée.
  • getMaxRenderDistanceSquared() : renvoie la distance maximum au carré au joueur jusqu'à laquelle la TileEntity doit être dessinée par le moteur de rendu.
  • getPos() : renvoie la position de la TileEntity dans le monde.
  • getBlockType() : renvoie le type de bloc qui abrite la TileEntity. S'il n'est pas initialisé, le calcule.
  • getDescriptionPacket() : renvoie le Packet qui doit être envoyé au joueurs pour les informers que la TileEntity a changé de propriétés (modification d'un panneau, d'un bloc de commande, etc.)
  • isInvalid() : renvoie true si la TileEntity est invalide, et donc doit être supprimée du monde.
  • invalidate() : rend la TileEntity invalide.
  • validate() : rend la TileEntity valide.
  • receiveClientEvent(int, int) : appelé lorsque la position de l TileEntity reçoit un évènement.
  • updateContainingBlockInfo() : réinitialise (rend null) les informations sur le block abritant la TileEntity. Appelé quand le bloc change de metadata par exemple, et qu'il faut en informer la TileEntity.
  • addInfoToCrashReport(CrashReportCategory) : ajoute les informations de la TileEntity au CrashReportCategory. Mieux vaut ne pas y avoir affaire...
  • setPos(BlockPos) : définit la position de la TileEntity.

C] Lui attribuer un rendu spécial

Comme nous l'avons dit dans l'introduction, les TileEntities peuvent être utilisées pour afficher des modèles (ou tout autre rendu complexe).

Leur principal avantage étant de d'être rafraîchies tous les ticks.

Tout d'abord, il nous faut créer une classe dérivée de TileEntitySpecialRenderer. Nous devrons implémenter la méthode renderTileEntityAt :

package net.minecraft.client.renderer.tileentity;

import net.minecraft.tileentity.TileEntity;

public class TileEntityExempleRenderer extends TileEntitySpecialRenderer
{

    @Override
    /**
     * Dessine la TileEntity donnée à la position donnée.
     * Pour les paramètres delta*, voir TileEntityRendererDispatcher#func_180546_a(TileEntity, float, int).
     *
     * @param tileEntity L'instance de notre TileEntity qui doit être dessinée.
     * @param deltaX La différence entre la position X de la TileEntity et la position X du joueur.
     * @param deltaY La différence entre la position Y de la TileEntity et la position Y du joueur.
     * @param deltaZ La différence entre la position Z de la TileEntity et la position Z du joueur.
     * @param partialTickTime Temps écoulé depuis le dernier tick, en proportion jusqu'au suivant.
     * @param blockDamage Le stade de destruction du bloc qui abrite la TileEntity. Vaut -1 si le bloc n'est pas endommagé.
     */
    public void renderTileEntityAt(TileEntity tileEntity, double deltaX, double deltaY, double deltaZ, float partialTickTime, int blockDamage)
    {
        
    }
}

Note : on peut aussi voir les paramètres deltaX, deltaY et deltaZ comme les coordonnées du vecteur joueur --> tileentity.

Ensuite, pour que Minecraft soit au courant que notre TileEntity dispose d'une classe de rendu spéciale, il faut la déclarer dans TileEntityRendererDispatcher, dans le constructeur :

private TileEntityRendererDispatcher()
{
    this.mapSpecialRenderers.put(TileEntitySign.class, new TileEntitySignRenderer());
    this.mapSpecialRenderers.put(TileEntityMobSpawner.class, new TileEntityMobSpawnerRenderer());
// ...

// On ajoute notre classe de rendu spéciale
    this.mapSpecialRenderers.put(TileEntityExemple.class, new TileEntityExempleRenderer());


    Iterator var1 = this.mapSpecialRenderers.values().iterator();

    while (var1.hasNext())
    {
        TileEntitySpecialRenderer var2 = (TileEntitySpecialRenderer) var1.next();
        var2.setRendererDispatcher(this);
    }
}

1

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut, super tuto , cepandant j'ai un problème lorsque j'utilisetile.[block].name=[nom] voila l'érreur:

Une idée ? :x

Tout fonctionne quand je n'utilise pas le fichier de traduction mais quand je le fais le jeu ne se lance plus, Il y a t'il une sorte de sécurité a bypass ?

Merci d'avance! :)

[18:37:16] [main/INFO]: Setting user: Player796
[18:37:16] [main/INFO]: (Session ID is token:0:Player796)
Exception in thread "main" java.lang.ExceptionInInitializerError
	at net.minecraft.util.StatCollector.<clinit>(StatCollector.java:5)
	at net.minecraft.item.Item.getUnlocalizedNameInefficiently(Item.java:595)
	at net.minecraft.item.Item.getItemStackDisplayName(Item.java:722)
	at net.minecraft.item.ItemStack.getDisplayName(ItemStack.java:529)
	at net.minecraft.item.ItemStack.func_151000_E(ItemStack.java:884)
	at net.minecraft.stats.StatList.func_151181_c(StatList.java:168)
	at net.minecraft.stats.StatList.func_151178_a(StatList.java:103)
	at net.minecraft.init.Bootstrap.func_151354_b(Bootstrap.java:400)
	at net.minecraft.client.Minecraft.<init>(Minecraft.java:354)
	at net.minecraft.client.main.Main.main(Main.java:138)
	at Start.main(Start.java:11)
Caused by: java.lang.SecurityException: SHA-256 digest error for assets/minecraft/lang/en_US.lang
	at sun.security.util.ManifestEntryVerifier.verify(Unknown Source)
	at java.util.jar.JarVerifier.processEntry(Unknown Source)
	at java.util.jar.JarVerifier.update(Unknown Source)
	at java.util.jar.JarVerifier$VerifierStream.read(Unknown Source)
	at java.io.FilterInputStream.read(Unknown Source)
	at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
	at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
	at sun.nio.cs.StreamDecoder.read(Unknown Source)
	at java.io.InputStreamReader.read(Unknown Source)
	at java.io.BufferedReader.fill(Unknown Source)
	at java.io.BufferedReader.readLine(Unknown Source)
	at java.io.BufferedReader.readLine(Unknown Source)
	at org.apache.commons.io.IOUtils.readLines(IOUtils.java:1033)
	at org.apache.commons.io.IOUtils.readLines(IOUtils.java:987)
	at net.minecraft.util.StringTranslate.<init>(StringTranslate.java:42)
	at net.minecraft.util.StringTranslate.<clinit>(StringTranslate.java:28)
	... 11 more
Java HotSpot(TM) 64-Bit Server VM warning: Using incremental CMS is deprecated and will likely be removed in a future release

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Caused by: java.lang.SecurityException: SHA-256 digest error for assets/minecraft/lang/en_US.lang

supprime ton dossier meta-inf, sa ira mieux ;)

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut , quand j'essaie de créer un craft d'item du genre 9 Items Manganese me donnent 1 Block de manganese , j'ai l'erreur ci dessous :


Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 26874
at net.minecraft.stats.StatList.func_151181_c(StatList.java:168)
at net.minecraft.stats.StatList.func_151178_a(StatList.java:103)
at net.minecraft.init.Bootstrap.func_151354_b(Bootstrap.java:400)
at net.minecraft.client.Minecraft.<init>(Minecraft.java:354)
at net.minecraft.client.main.Main.main(Main.java:138)
at Start.main(Start.java:11)
Java HotSpot 64-Bit Server VM warning: Using incremental CMS is deprecated and will likely be removed in a future release

Screens :http://prntscr.com/5ztttn

0

Partager ce message


Lien à poster
Partager sur d’autres sites

L'ID 26874 est trop grande pour le tableau des stats. Il faut diminuer l'ID de ta manganèse pour qu'elle soit inférieure à 4096. ;)

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci beaucoup je m'en suis rendu compte avant ^^. Ca rend plutôt pas mal , a quand le tuto sur la génération :) ? :P

Un aperçu :

ZunJjhE.png

Maintenant j'essaye de faire mes armures mais .. j'ai cette erreur :

[22:37:21] [main/INFO]: Setting user: Player594
[22:37:21] [main/INFO]: (Session ID is token:0:Player594)
Exception in thread "main" java.lang.ExceptionInInitializerError
	at net.minecraft.stats.StatList.initCraftableStats(StatList.java:118)
	at net.minecraft.stats.StatList.func_151178_a(StatList.java:106)
	at net.minecraft.init.Bootstrap.func_151354_b(Bootstrap.java:400)
	at net.minecraft.client.Minecraft.<init>(Minecraft.java:354)
	at net.minecraft.client.main.Main.main(Main.java:138)
	at Start.main(Start.java:11)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 5
	at net.minecraft.item.crafting.RecipesArmor.addRecipes(RecipesArmor.java:30)
	at net.minecraft.item.crafting.CraftingManager.<init>(CraftingManager.java:40)
	at net.minecraft.item.crafting.CraftingManager.<clinit>(CraftingManager.java:19)
	... 6 more

0

Partager ce message


Lien à poster
Partager sur d’autres sites

La génération, excellente idée ! J'ajoute une partie au plan (pour ne pas oublier, je la rédigerai sous peu j'espère).

Maintenant j'essaye de faire mes armures mais .. j'ai cette erreur :

Ici c'est un peu hors sujet, tu peux créer une topic dans la section support. ;)

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Et bien en fait je n'ai plus aucune erreur depuis que j'ai compris ^^. J'ai fais mes armures etc.. , la seule chose qui me manque => La génération , en espérant voir ton tuto prochainement :D

EroiiKZz

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Hello !

a y est, la partie sur la génération est rédigée ! :)

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Hello !

a y est, la partie sur la génération est rédigée ! :)

Merci , maintenant j'ai fini le client moddé :D

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci , maintenant j'ai fini le launcher moddé :D

arrêtez de confondre launcher et client ...

ce sont 2 programmes bien distincts.

le launcher lance le client.

quand tu modifie un élément du jeu, c'est le client que tu modde, pas le launcher

0

Partager ce message


Lien à poster
Partager sur d’autres sites

arrêtez de confondre launcher et client ...

ce sont 2 programmes bien distincts.

le launcher lance le client.

quand tu modifie un élément du jeu, c'est le client que tu modde, pas le launcher

Je vois pas ou je dis Launcher O_O ? x-)

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Coucou, j'ai un petit soucis, je n'ai aucune réelles meta sur mes blocks x). Ils sont bien dans mon creativeTab, bien avec une texture et un nom différent, mais lorsqu'ils sont posé ils prennent la texture du premier bloc.

package net.minecraft.block;

import java.util.List;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;

public class BlockBark extends Block
{
    public static final String[] barkName = new String[] {"oak_bark", "spruce_bark", "birch_bark", "jungle_bark", "acacia_bark", "dark_oak_bark"};
    private IIcon[] barkTexture;
    private static final String __OBFID = "CL_00000335";

    public BlockBark()
    {
        super(Material.wood);
        this.setCreativeTab(CreativeTabs.tabBlock);
        
    }

    /**
     * Gets the block's texture. Args: side, meta
     */
    public IIcon getIcon(int barkSide, int metaBark)
    {
        if (metaBark < 0 || metaBark >= this.barkTexture.length)
        {
            metaBark = 0;
        }

        return this.barkTexture[metaBark];
    }

    /**
     * Determines the damage on the item the block drops. Used in cloth and wood.
     */
    public int damageDropped(int barkDamage)
    {
        return barkDamage;
    }

    public void getSubBlocks(Item full_bark, CreativeTabs barkCreative, List barkList)
    {
        barkList.add(new ItemStack(full_bark, 1, 0));
        barkList.add(new ItemStack(full_bark, 1, 1));
        barkList.add(new ItemStack(full_bark, 1, 2));
        barkList.add(new ItemStack(full_bark, 1, 3));
        barkList.add(new ItemStack(full_bark, 1, 4));
        barkList.add(new ItemStack(full_bark, 1, 5));
    }

    public void registerBlockIcons(IIconRegister namingBark)
    {
        this.barkTexture = new IIcon[barkName.length];
        

        for (int var2 = 0; var2 < this.barkTexture.length; ++var2)
        {
            this.barkTexture[var2] = namingBark.registerIcon("full_" + barkName[var2]);
            setBlockName("full_" + barkName[var2]);
            
        }
    }
    
}

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Oups, en effet j'ai oublié de mettre ça dans le tuto. Il faut enregistrer l'ItemBlock comme instance de ItemWithMetadata (ou quelque chose du genre), voir à la fin de Item.registerItems().

Je màj le tuto dès que je suis sur un pc viable ^^

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Ok merci. Je me suis tapé la tête sur les mur en pensant avoir ecrit le code comme un pied x)

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Voilà, j'ai mis à jour la fin de la partie sur les metadatas. ;)

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Thanks c'est corrigé. Petite question, j'ai fait un bloc totalement incassable (simili de la Bedrock mais transparent). Mon problème, c'est que je ne vois pas le top du bloc en dessous mais un espèce de vide.

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Le jeu ne considère pas ton bloc comme transparent. Regarde du côté du verre, par exemple.

0

Partager ce message


Lien à poster
Partager sur d’autres sites

b7aa17c860.png

Voila pour être précis ce que ça donne (j'ai le bloc dans les mains)

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Vérifie que tu as bien ajouté :

public boolean isOpaqueCube()
{
	return false;
}

Dans la classe de ton bloc.

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu me tape si je dis que j'avais mis true ? x) C'est résolu maintenant. J'ai gratté tout, mais genre absolument tout.. sauf ça x). Merci pour la solution et désolé d'être un peu c**

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !


Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.


Connectez-vous maintenant