[1.6.4] Блок-блока (типа слив кода)

timaxa007

Модератор
5,831
409
676
PackFurniture
Код:
@Mod (modid=PackInfo.MODID, name=PackInfo.MODNAME, version=PackInfo.VERSION)
@NetworkMod (clientSideRequired=true, serverSideRequired=true, versionBounds=PackInfo.VERSION)

public class PackFurniture {
@Instance(PackInfo.MODID) public static PackFurniture instance;
@SidedProxy(clientSide="mods.timaxa007.Pack.Furniture.ProxyClient", serverSide="mods.timaxa007.Pack.Furniture.ProxyServer")
public static ProxyServer proxy;

@EventHandler
public void init(FMLInitializationEvent event) {
proxy.init();
}

@EventHandler
public void preInit(FMLPreInitializationEvent event) {
proxy.preInit(event);
}

}
ProxyServer
Код:
public class ProxyServer {

public static CreativeTabs tabFurniturePack = new TabFurniturePack(CreativeTabs.getNextID(), "tabFurniturePack");

public static Block blockCnstorBlock;
public static int blockCnstorBlockblockID;
public static int renderBlockCnstorBlockModelID;

public void init() {
blockCnstorBlock = new BlockCnstorBlock(blockCnstorBlockblockID);
renderBlockCnstorBlockModelID = -1;
GameRegistry.registerBlock(blockCnstorBlock, "BlockCnstorBlock");
GameRegistry.registerTileEntity(TileEntityCnstorBlock.class, "TileEntityCnstorBlock");
}

public void preInit(FMLPreInitializationEvent event){
Configuration cfg = new Configuration(event.getSuggestedConfigurationFile());
cfg.load();
blockCnstorBlockblockID = cfg.getBlock("cnstorBlock", 2200).getInt();
cfg.save();
}

}

ProxyClient
Код:
public class ProxyClient extends ProxyServer {

@Override
public void init() {
super.init();
renderBlockCnstorBlockModelID = RenderingRegistry.getNextAvailableRenderId();
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCnstorBlock.class, new RendererCnstorBlockModel());
MinecraftForgeClient.registerItemRenderer(PackFurniture.proxy.blockCnstorBlock.blockID, new ItemRendererCnstorBlockModel());
}

public void preInit(FMLPreInitializationEvent event){
super.preInit(event);
}

}

TabFurniturePack
Код:
public class TabFurniturePack extends CreativeTabs {

public TabFurniturePack(int position, String tabID) {
super(position, tabID);
}

@SideOnly(Side.CLIENT)
public int getTabIconItemIndex() {
return PackFurniture.proxy.blockCnstorBlock.blockID;
}

}

BlockCnstorBlock
Код:
public class BlockCnstorBlock extends Block implements ITileEntityProvider {

public BlockCnstorBlock(int id) {
super(id, Material.wood);
setCreativeTab(PackFurniture.proxy.tabFurniturePack);
setHardness(1.0F);
setResistance(3.5F);
setStepSound(soundWoodFootstep);
setTextureName("planks");
setUnlocalizedName("cnstorBlock");
}

@Override
public TileEntity createNewTileEntity(World world) {return new TileEntityCnstorBlock();}
public int quantityDropped(Random radom) {return 0;}
public int getRenderType() {return PackFurniture.proxy.renderBlockCnstorBlockModelID;}
public boolean isOpaqueCube() {return false;}
//public boolean renderAsNormalBlock() {return false;}
//public int idPicked(World world, int x, int y, int z) {return 0;}

public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z) {
TileEntity te = world.getBlockTileEntity(x, y, z);
if (te != null && te instanceof TileEntityCnstorBlock) {
return addTag(((TileEntityCnstorBlock)te).getType(), ((TileEntityCnstorBlock)te).getColor());
} else {
return addTag(0, 0);
}
}

@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack is){
TileEntity te = world.getBlockTileEntity(x, y, z);
NBTTagCompound nbt = is.getTagCompound();
if(te!=null && te instanceof TileEntityCnstorBlock && is.getTagCompound() != null){

if (is.getTagCompound().hasKey("Type")) {
((TileEntityCnstorBlock)te).setType(is.stackTagCompound.getInteger("Type"));
} else {
((TileEntityCnstorBlock)te).setType(0);
}

if (is.getTagCompound().hasKey("Color")) {
((TileEntityCnstorBlock)te).setColor(is.stackTagCompound.getInteger("Color"));
} else {
((TileEntityCnstorBlock)te).setColor(0);
}

} else {
((TileEntityCnstorBlock)te).setType(0);
((TileEntityCnstorBlock)te).setColor(0);
}
}

public void breakBlock(World world, int x, int y, int z, int oldID, int oldMeta) {
if (!world.isRemote) {
TileEntity te = world.getBlockTileEntity(x, y, z);
if (te != null && te instanceof TileEntityCnstorBlock) {
dropBlockAsItem_do(world, x, y, z, addTag(((TileEntityCnstorBlock)te).getType(), ((TileEntityCnstorBlock)te).getColor()));
} else {
dropBlockAsItem_do(world, x, y, z, addTag(0, 0));
}
}
super.breakBlock(world, x, y, z, oldID, oldMeta);
}

@SideOnly(Side.CLIENT)
public void getSubBlocks(int id, CreativeTabs table, List list){
for (int j = 0; j < TileTexture.texTest01.length; ++j) {
for (byte i = 0; i < 16; ++i) {
//int j = 74;
//int i = 14;
list.add(addTag(j, GetColors.getHexColors[i]));
}
}
//list.add(new ItemStack(id, 1, 0));
}

private static ItemStack addTag(int par1, int par2){
ItemStack is = new ItemStack(PackFurniture.proxy.blockCnstorBlock);
NBTTagCompound tag = new NBTTagCompound();
tag.setInteger("Type", par1);
tag.setInteger("Color", par2);
is.setTagCompound(tag);
return is;
}

}
"addTag" добавляет NBT теги для ItemStack блока, если по-проще то когда блок находиться в инветаре игрока (или как дроп).
Чтобы NBT теги сохранили свои значения, когда блок будет установлен в мире, то мы их передадим и сохраним в NBT тег для TileEntity.
Передача NBT тегов происходит через "onBlockPlacedBy".
Чтобы сломаный блок передал из TileEntity для ItemStack, то выполняеться через "breakBlock". Это пока-что единственая функция в котором TileEntity не равна нулю. И так-же из-за его есть, типа бага - это дроп предмета, даже если игрок в креативе и даже не зависемо от материала блока (т.е. ломаеть рукой и выподает дроп, если даже блок материалом rock).
"getPickBlock" добавлена Forge'ем - больше нужен, кто в кретиве находиться, так как стандартный "idPicked" возращяет, только id блока без всяких NBT тегов, которые нужны для некоторых пользователей игры.
"setTextureName("planks");" нужно чтобы при разрушении блока частицы не были раскрашены в чёрно-фиолетовые цвета.

TileEntityCnstorBlock
Код:
public class TileEntityCnstorBlock extends TileEntity {

private int type;
private int color;

public TileEntityCnstorBlock() {

}

public int getType() {return type;}
public int getColor() {return color;}

public void setType(int i) {type = i;}
public void setColor(int i) {color = i;}

@Override
public void readFromNBT(NBTTagCompound nbt){
super.readFromNBT(nbt);
if (nbt.hasKey("Type")) {type = nbt.getInteger("Type");}
if (nbt.hasKey("Color")) {color = nbt.getInteger("Color");}
}

@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setInteger("Type", type);
nbt.setInteger("Color", color);
}

public boolean canUpdate() {return false;}

public Packet getDescriptionPacket() {
NBTTagCompound nbt = new NBTTagCompound();
writeToNBT(nbt);
return new Packet132TileEntityData(xCoord, yCoord, zCoord, 0, nbt);
}

public void onDataPacket(INetworkManager net, Packet132TileEntityData Packet) {
readFromNBT(Packet.data);
}

}
"canUpdate()" forge'ское дополнение, при значении "false" наш TileEntity не update'тся.
"getDescriptionPacket" и "onDataPacket" трудно объяснить "простым языком" для чего он во-общем нужены, но я их использую.

RendererCnstorBlockModel
Код:
public class RendererCnstorBlockModel extends TileEntitySpecialRenderer {

public RendererCnstorBlockModel() {
}

public void renderTileEntityAt(TileEntity tileEntity, double d1, double d2, double d3, float f) {
renderTileEntity((TileEntityCnstorBlock)tileEntity, d1, d2, d3, f);
}

public void renderTileEntity(TileEntityCnstorBlock tileEntity, double d1, double d2, double d3, float f) {
//int meta = tileEntity.getBlockMetadata();
int tex = 0;
int clr = 0xFFFFFF;

if (tileEntity != null) {
tex = tileEntity.getType();
clr = tileEntity.getColor();
}

GL11.glPushMatrix();
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glTranslated(d1, d2, d3);
bindTexture(new ResourceLocation(TileTexture.texTest01[tex][0], TileTexture.texTest01[tex][1]));

Tessellator tessellator = Tessellator.instance;
tessellator.startDrawingQuads();
tessellator.setColorOpaque_I(clr);

//Down
tessellator.addVertexWithUV(1.0D, 0.0D, 1.0D, 1.0D, 1.0D);
tessellator.addVertexWithUV(0.0D, 0.0D, 1.0D, 0.0D, 1.0D);
tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, 0.0D, 0.0D);
tessellator.addVertexWithUV(1.0D, 0.0D, 0.0D, 1.0D, 0.0D);
//Up
tessellator.addVertexWithUV(1.0D, 1.0D, 0.0D, 1.0D, 0.0D);
tessellator.addVertexWithUV(0.0D, 1.0D, 0.0D, 0.0D, 0.0D);
tessellator.addVertexWithUV(0.0D, 1.0D, 1.0D, 0.0D, 1.0D);
tessellator.addVertexWithUV(1.0D, 1.0D, 1.0D, 1.0D, 1.0D);
//North
tessellator.addVertexWithUV(1.0D, 0.0D, 0.0D, 0.0D, 1.0D);
tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, 1.0D, 1.0D);
tessellator.addVertexWithUV(0.0D, 1.0D, 0.0D, 1.0D, 0.0D);
tessellator.addVertexWithUV(1.0D, 1.0D, 0.0D, 0.0D, 0.0D);
//South
tessellator.addVertexWithUV(1.0D, 1.0D, 1.0D, 1.0D, 0.0D);
tessellator.addVertexWithUV(0.0D, 1.0D, 1.0D, 0.0D, 0.0D);
tessellator.addVertexWithUV(0.0D, 0.0D, 1.0D, 0.0D, 1.0D);
tessellator.addVertexWithUV(1.0D, 0.0D, 1.0D, 1.0D, 1.0D);
//West
tessellator.addVertexWithUV(0.0D, 1.0D, 1.0D, 1.0D, 0.0D);
tessellator.addVertexWithUV(0.0D, 1.0D, 0.0D, 0.0D, 0.0D);
tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, 0.0D, 1.0D);
tessellator.addVertexWithUV(0.0D, 0.0D, 1.0D, 1.0D, 1.0D);
//East
tessellator.addVertexWithUV(1.0D, 0.0D, 1.0D, 0.0D, 1.0D);
tessellator.addVertexWithUV(1.0D, 0.0D, 0.0D, 1.0D, 1.0D);
tessellator.addVertexWithUV(1.0D, 1.0D, 0.0D, 1.0D, 0.0D);
tessellator.addVertexWithUV(1.0D, 1.0D, 1.0D, 0.0D, 0.0D);

tessellator.draw();

GL11.glEnable(GL11.GL_LIGHTING);
GL11.glDisable(GL11.GL_BLEND);
GL11.glPopMatrix();

}

}

ItemRendererCnstorBlockModel
Код:
public class ItemRendererCnstorBlockModel implements IItemRenderer {

public ItemRendererCnstorBlockModel() {
}

@Override
public boolean handleRenderType(ItemStack is, ItemRenderType type) {
return true;
}

@Override
public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack is, ItemRendererHelper helper) {
return true;
}

@Override
public void renderItem(ItemRenderType type, ItemStack is, Object... data) {
//int tex=is.getItemDamage();
int tex = 0;
int clr = 0xFFFFFF;

if (is.getTagCompound() != null) {
if (is.getTagCompound().hasKey("Type")) {
tex = is.getTagCompound().getInteger("Type");
}
if (is.getTagCompound().hasKey("Color")) {
clr = is.getTagCompound().getInteger("Color");
}
}

GL11.glPushMatrix();
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glDisable(GL11.GL_LIGHTING);
Minecraft.getMinecraft().renderEngine.bindTexture(new ResourceLocation(TileTexture.texTest01[tex][0], TileTexture.texTest01[tex][1]));

Tessellator tessellator = Tessellator.instance;
tessellator.startDrawingQuads();
tessellator.setColorOpaque_I(clr);

tessellator.addVertexWithUV(1.0D, 0.0D, 1.0D, 1.0D, 1.0D);
tessellator.addVertexWithUV(0.0D, 0.0D, 1.0D, 0.0D, 1.0D);
tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, 0.0D, 0.0D);
tessellator.addVertexWithUV(1.0D, 0.0D, 0.0D, 1.0D, 0.0D);

tessellator.addVertexWithUV(1.0D, 1.0D, 0.0D, 1.0D, 0.0D);
tessellator.addVertexWithUV(0.0D, 1.0D, 0.0D, 0.0D, 0.0D);
tessellator.addVertexWithUV(0.0D, 1.0D, 1.0D, 0.0D, 1.0D);
tessellator.addVertexWithUV(1.0D, 1.0D, 1.0D, 1.0D, 1.0D);

tessellator.addVertexWithUV(1.0D, 0.0D, 0.0D, 0.0D, 1.0D);
tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, 1.0D, 1.0D);
tessellator.addVertexWithUV(0.0D, 1.0D, 0.0D, 1.0D, 0.0D);
tessellator.addVertexWithUV(1.0D, 1.0D, 0.0D, 0.0D, 0.0D);

tessellator.addVertexWithUV(1.0D, 1.0D, 1.0D, 1.0D, 0.0D);
tessellator.addVertexWithUV(0.0D, 1.0D, 1.0D, 0.0D, 0.0D);
tessellator.addVertexWithUV(0.0D, 0.0D, 1.0D, 0.0D, 1.0D);
tessellator.addVertexWithUV(1.0D, 0.0D, 1.0D, 1.0D, 1.0D);

tessellator.addVertexWithUV(0.0D, 1.0D, 1.0D, 1.0D, 0.0D);
tessellator.addVertexWithUV(0.0D, 1.0D, 0.0D, 0.0D, 0.0D);
tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, 0.0D, 1.0D);
tessellator.addVertexWithUV(0.0D, 0.0D, 1.0D, 1.0D, 1.0D);

tessellator.addVertexWithUV(1.0D, 0.0D, 1.0D, 0.0D, 1.0D);
tessellator.addVertexWithUV(1.0D, 0.0D, 0.0D, 1.0D, 1.0D);
tessellator.addVertexWithUV(1.0D, 1.0D, 0.0D, 1.0D, 0.0D);
tessellator.addVertexWithUV(1.0D, 1.0D, 1.0D, 0.0D, 0.0D);

tessellator.draw();

GL11.glEnable(GL11.GL_LIGHTING);
GL11.glDisable(GL11.GL_BLEND);
GL11.glPopMatrix();
}

}
"is.getTagCompound() != null" бывает, что ItemStack может быть равен нулю, в моём случии он бывает только для иконки креативной вкладки.

TileTexture
Код:
public class TileTexture {

public static final String texTest01[][] = new String[][] {
{"timaxa007", "textures/blocks/woodFrame.png"}, 
{"minecraft", "textures/blocks/anvil_base.png"}, 
{"minecraft", "textures/blocks/bedrock.png"}, 
{"minecraft", "textures/blocks/brick.png"}, 
{"minecraft", "textures/blocks/clay.png"}, 
{"minecraft", "textures/blocks/coal_block.png"}, 
{"minecraft", "textures/blocks/coal_ore.png"}, 
{"minecraft", "textures/blocks/cobblestone.png"}, 
{"minecraft", "textures/blocks/cobblestone_mossy.png"}, 
{"minecraft", "textures/blocks/diamond_block.png"}, 
{"minecraft", "textures/blocks/diamond_ore.png"}, 
{"minecraft", "textures/blocks/dirt.png"}, 
{"minecraft", "textures/blocks/emerald_block.png"}, 
{"minecraft", "textures/blocks/emerald_ore.png"}, 
{"minecraft", "textures/blocks/end_stone.png"}, 
{"minecraft", "textures/blocks/glass.png"}, 
{"minecraft", "textures/blocks/glowstone.png"}, 
{"minecraft", "textures/blocks/gold_block.png"}, 
{"minecraft", "textures/blocks/gold_ore.png"}, 
{"minecraft", "textures/blocks/gravel.png"}, 
{"minecraft", "textures/blocks/hardened_clay.png"}, 
{"minecraft", "textures/blocks/hardened_clay_stained_white.png"}, 
{"minecraft", "textures/blocks/hay_block_side.png"}, 
{"minecraft", "textures/blocks/ice.png"}, 
{"minecraft", "textures/blocks/iron_bars.png"}, 
{"minecraft", "textures/blocks/iron_block.png"}, 
{"minecraft", "textures/blocks/iron_ore.png"}, 
{"minecraft", "textures/blocks/lapis_block.png"}, 
{"minecraft", "textures/blocks/lapis_ore.png"}, 
{"minecraft", "textures/blocks/log_birch.png"}, 
{"minecraft", "textures/blocks/log_jungle.png"}, 
{"minecraft", "textures/blocks/log_oak.png"}, 
{"minecraft", "textures/blocks/log_spruce.png"}, 
{"minecraft", "textures/blocks/melon_side.png"}, 
{"minecraft", "textures/blocks/mushroom_block_inside.png"}, 
{"minecraft", "textures/blocks/mushroom_block_skin_brown.png"}, 
{"minecraft", "textures/blocks/mushroom_block_skin_red.png"}, 
{"minecraft", "textures/blocks/mushroom_block_skin_stem.png"}, 
{"minecraft", "textures/blocks/nether_brick.png"}, 
{"minecraft", "textures/blocks/netherrack.png"}, 
{"minecraft", "textures/blocks/noteblock.png"}, 
{"minecraft", "textures/blocks/obsidian.png"}, 
{"minecraft", "textures/blocks/planks_birch.png"}, 
{"minecraft", "textures/blocks/planks_jungle.png"}, 
{"minecraft", "textures/blocks/planks_oak.png"}, 
{"minecraft", "textures/blocks/planks_spruce.png"}, 
{"minecraft", "textures/blocks/pumpkin_side.png"}, 
{"minecraft", "textures/blocks/quartz_block_bottom.png"}, 
{"minecraft", "textures/blocks/quartz_block_side.png"}, 
{"minecraft", "textures/blocks/redstone_block.png"}, 
{"minecraft", "textures/blocks/redstone_ore.png"}, 
{"minecraft", "textures/blocks/sand.png"}, 
{"minecraft", "textures/blocks/sandstone_bottom.png"}, 
{"minecraft", "textures/blocks/sandstone_top.png"}, 
{"minecraft", "textures/blocks/snow.png"}, 
{"minecraft", "textures/blocks/soul_sand.png"}, 
{"minecraft", "textures/blocks/sponge.png"}, 
{"minecraft", "textures/blocks/stone.png"}, 
{"minecraft", "textures/blocks/stone_slab_top.png"}, 
{"minecraft", "textures/blocks/stonebrick.png"}, 
{"minecraft", "textures/blocks/stonebrick_carved.png"}, 
{"minecraft", "textures/blocks/stonebrick_cracked.png"}, 
{"minecraft", "textures/blocks/stonebrick_mossy.png"}, 
{"minecraft", "textures/blocks/wool_colored_white.png"}, 
{"timaxa007", "textures/blocks/woodFrame.png"}
};

}

GetColors
Код:
public class GetColors {

public static final int[] getHexColors = new int[] {
0x111111,    // 0 Black
0x0000FF,    // 1 Blue
0x884400,    // 2 Brown
0x008888,    // 3 Cyan
0x444444,    // 4 Gray
0x008800,    // 5 Green
0x00FFFF,    // 6 Light-Blue
0xBBBBBB,    // 7 Light-Gray
0x00FF00,    // 8 Light-Green
0xFF00FF,    // 9 Magenta
0xFF8800,    //10 Orange
0xFF8888,    //11 Pink
0x8800FF,    //12 Purple
0xFF0000,    //13 Red
0xFFFFFF,    //14 White
0xFFFF00    //15 Yellow
};

}

"GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);" - нужно чтобы прозрачные текстуры были прозрачными на нашей моделе.

Если не использовать "GL11.GL_LIGHTING", то при определёном наклонении камеры блок становиться темнее.
[youtube]AvS1PHTmxj8[/youtube]

Если не использовать "isOpaqueCube()" со значением "false", то блок становиться очень тёмным и в случии использовании прозрачной текстуры, то он становится типа WH. Если использовать, то блок не имеет тени м может вырасти травенной блок (если есть все условия для этого).
[youtube]Q2L_K4b1oBM[/youtube]

Что-то ещё добавить в написании не вижу пока-что смысла, так как возможно: где-то когда об этом было сказано, либо я не знаю что ещё до писать.
[merge_posts_bbcode]Добавлено: 22.06.2014 16:16:17[/merge_posts_bbcode]

Забыл:
Код:
public class PackInfo {
public static final String MODID="03furniturepack";
public static final String MODNAME="FurniturePack";
public static final String VERSION="0.1a";
}
И типа у меня все текстуры в общей папке текстур "timaxa007".

[merge_posts_bbcode]Добавлено: 22.06.2014 16:22:55[/merge_posts_bbcode]

У вас типа так:
Код:
{PackInfo.MODID, "textures/blocks/woodFrame.png"}
... или так:
Код:
{ModInfo.MODID, "textures/blocks/woodFrame.png"}
Зависит от вас.
 
Код:
Если использовать, то блок не имеет тени м может вырасти травенной блок (если есть все условия для этого).

Запрет прорастания растений где-то был.

Код:
"getDescriptionPacket" и "onDataPacket" трудно объяснить "простым языком" для чего он во-общем нужены, но я их использую.
Для синхронизации. Не понимаю, нахрена, ну да ладно, может, работает лучше.

И мог бы запилить модель текне. Притормозит загрузку слегка, зато будет легче код читать.
 
laz2727 написал(а):
Код:
"getDescriptionPacket" и "onDataPacket" трудно объяснить "простым языком" для чего он во-общем нужены, но я их использую.
Для синхронизации. Не понимаю, нахрена, ну да ладно, может, работает лучше.
В моём случаи он типа нужно, чтобы для клиента отправились параметры для модели. Или иначе без них, после перезахода на карту (хоть на клиенте, хоть на сервере) на клиенской части у него параметры по нулям, на серверной стороне параметры те которые были сохранены в NBT тегах. (Это то как я понял. Я не специалист по пакетам игр и программ.)
laz2727 написал(а):
И мог бы запилить модель текне. Притормозит загрузку слегка, зато будет легче код читать.
Т.е. ты имел ввиду в течне (Techne)!? Если да, то проблема будет в текстурировании. Так как там создаются боксы (box), и если сделать плоским в ширине, то он для него будет нужна типа 32x16 текстура. Я помню где-то был код в Minecraft чтобы можно было 16x16 текстуры приделать так, чтобы удовлетворял текстурированию подобных моделей, но я просто не запомнил. В старой версии Блок-блока я использовал *.obj файлы, но не давно я переделал на Tessellator'ы. У меня сейчас, только треугольные блоки использую старые *.obj фалов блок-блока.
 
***UpData***
В блоке BlockCnstorBlock поменял:
Material.wood на Material.glass, потому-что автоматически у тех блоков в которых есть Материал Wood становиться топливом.
Функцию "breakBlock" сделал пустым, чтобы при разрушении TileEntity не становился для других функцией равными нулю и добавил "getBlockDropped", чтобы дропались нужные предметы (подробно в новом коде), новый код BlockCnstorBlock:
Код:
public class BlockCnstorBlock extends Block implements ITileEntityProvider {

public BlockCnstorBlock(int id) {
super(id, Material.glass);
setCreativeTab(PackFurniture.proxy.tabFurniturePack);
setHardness(1.0F);
setResistance(5.0F);
setStepSound(soundWoodFootstep);
setTextureName("planks");
setUnlocalizedName("cnstorBlock");
}

@Override
public TileEntity createNewTileEntity(World world) {return new TileEntityCnstorBlock();}
public int damageDropped(int id) {return id;}*/
public int getRenderType() {return PackFurniture.proxy.renderBlockCnstorBlockModelID;}
public boolean isOpaqueCube() {return false;}
//public boolean renderAsNormalBlock() {return false;}
//public int idPicked(World world, int x, int y, int z) {return 0;}

public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z) {
TileEntity te = world.getBlockTileEntity(x, y, z);
if (te != null && te instanceof TileEntityCnstorBlock) {
return addTag(((TileEntityCnstorBlock)te).getType(), ((TileEntityCnstorBlock)te).getColor());
} else {
return addTag(0, 0);
}
}

@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack is){
TileEntity te = world.getBlockTileEntity(x, y, z);
NBTTagCompound nbt = is.getTagCompound();
if(te!=null && te instanceof TileEntityCnstorBlock && is.getTagCompound() != null){

if (is.getTagCompound().hasKey("Type")) {
((TileEntityCnstorBlock)te).setType(is.stackTagCompound.getInteger("Type"));
} else {
((TileEntityCnstorBlock)te).setType(0);
}

if (is.getTagCompound().hasKey("Color")) {
((TileEntityCnstorBlock)te).setColor(is.stackTagCompound.getInteger("Color"));
} else {
((TileEntityCnstorBlock)te).setColor(0);
}

} else {
((TileEntityCnstorBlock)te).setType(0);
((TileEntityCnstorBlock)te).setColor(0);
}
}

public void breakBlock(World world, int x, int y, int z, int oldID, int oldMeta) {
//super.breakBlock(world, x, y, z, oldID, oldMeta);
}

@Override 
public ArrayList<ItemStack> getBlockDropped(World world, int x, int y, int z, int metadata, int fortune) {
ArrayList<ItemStack> ret = super.getBlockDropped(world, x, y, z, metadata, fortune);
TileEntity te = world.getBlockTileEntity(x, y, z);
if (te != null && te instanceof TileEntityCnstorBlock) {
ret.add(addTag(((TileEntityCnstorBlock)te).getType(), ((TileEntityCnstorBlock)te).getColor()));
world.removeBlockTileEntity(x, y, z);
}
return ret;
}

@SideOnly(Side.CLIENT)
public void getSubBlocks(int id, CreativeTabs table, List list){
for (int j = 0; j < TileTexture.texTest01.length; ++j) {
//for (byte i = 0; i < 16; ++i) {
//int j = 74;
int i = 14;
list.add(addTag(j, GetColors.getHexColors[i]));
//}
}
//list.add(new ItemStack(id, 1, 0));
}

private static ItemStack addTag(int par1, int par2){
ItemStack is = new ItemStack(PackFurniture.proxy.blockCnstorBlock);
NBTTagCompound tag = new NBTTagCompound();
tag.setInteger("Type", par1);
tag.setInteger("Color", par2);
is.setTagCompound(tag);
return is;
}

}

А так-же я создаю стабильный рецепт покраски блоков, пока-что стабильный этот:
Код:
public class RecipeCnstorBlockColors implements IRecipe {

@Override
public boolean matches(InventoryCrafting ic, World world) {

ItemStack cmj = ic.getStackInSlot(0);
ItemStack cmh = ic.getStackInSlot(1);

if (
(cmj != null && cmj.getItem() == new ItemStack(PackFurniture.proxy.blockCnstorBlock).getItem() && cmj.getTagCompound() != null) && 
(cmh != null && cmh.getItem() == new ItemStack(PackFurniture.proxy.itemColored).getItem()) &&
(cmj != cmh) && (cmh.getItemDamage() >= 0 && cmh.getItemDamage() < 16)
) {
return true;
}

if (
(cmj != null && cmj.getItem() == new ItemStack(PackFurniture.proxy.blockCnstorBlock).getItem() && cmj.getTagCompound() != null) && 
(cmh != null && cmh.getItem() == new ItemStack(Item.dyePowder).getItem()) &&
(cmj != cmh) && (cmh.getItemDamage() >= 0 && cmh.getItemDamage() < 16)
) {
return true;
}

return false;
}

@Override
public ItemStack getCraftingResult(InventoryCrafting ic) {

ItemStack cmj = ic.getStackInSlot(0);
ItemStack cmh = ic.getStackInSlot(1);

if (
(cmj != null && cmh != null && cmj != cmh) &&
(cmj.getItem() == new ItemStack(PackFurniture.proxy.blockCnstorBlock).getItem() && cmj.getTagCompound() != null) && 
(cmh.getItem() == new ItemStack(PackFurniture.proxy.itemColored).getItem())
) {
ItemStack is = new ItemStack(PackFurniture.proxy.blockCnstorBlock);
NBTTagCompound tag = new NBTTagCompound();
tag.setInteger("Type", cmj.getTagCompound().getInteger("Type"));
tag.setInteger("Color", GetColors.getHexColors[cmh.getItemDamage()]);
;
is.setTagCompound(tag);
return is;
}

if (
(cmj != null && cmh != null && cmj != cmh) &&
(cmj.getItem() == new ItemStack(PackFurniture.proxy.blockCnstorBlock).getItem() && cmj.getTagCompound() != null) && 
(cmh.getItem() == new ItemStack(Item.dyePowder).getItem())
) {
ItemStack is = new ItemStack(PackFurniture.proxy.blockCnstorBlock);
NBTTagCompound tag = new NBTTagCompound();
tag.setInteger("Type", cmj.getTagCompound().getInteger("Type"));
tag.setInteger("Color", ItemDye.dyeColors[cmh.getItemDamage()]);
;
is.setTagCompound(tag);
return is;
}

return null;
}

@Override
public int getRecipeSize() {
return 1;
}

@Override
public ItemStack getRecipeOutput() {
return null;
}

}
И добавить в init:
Код:
GameRegistry.registerCraftingHandler(new CraftFurnitureHandler());
Теперь "ProxyServer" типа выглядит так:
Код:
public class ProxyServer {

public static CreativeTabs tabFurniturePack = new TabFurniturePack(CreativeTabs.getNextID(), "tabFurniturePack");

public static Block blockCnstorBlock;
public static int blockCnstorBlockblockID;
public static int renderBlockCnstorBlockModelID;

public void init() {
blockCnstorBlock = new BlockCnstorBlock(blockCnstorBlockblockID);
renderBlockCnstorBlockModelID = -1;
GameRegistry.registerBlock(blockCnstorBlock, "BlockCnstorBlock");
GameRegistry.registerTileEntity(TileEntityCnstorBlock.class, "TileEntityCnstorBlock");
GameRegistry.registerCraftingHandler(new CraftFurnitureHandler());
}

public void preInit(FMLPreInitializationEvent event){
Configuration cfg = new Configuration(event.getSuggestedConfigurationFile());
cfg.load();
blockCnstorBlockblockID = cfg.getBlock("cnstorBlock", 2200).getInt();
cfg.save();
}

}

Пытался создать беспорядочный рецепт, получился не стабильный рецепт.
[merge_posts_bbcode]Добавлено: 28.06.2014 03:34:06[/merge_posts_bbcode]

В моде (или как-то так) NEI не будет видеть рецепт из RecipeCnstorBlockColors.

[merge_posts_bbcode]Добавлено: 28.06.2014 03:47:27[/merge_posts_bbcode]

PackFurniture.proxy.itemColored Мои красящие предметы, код могу выложить если кому-то надо, так как там ничего особенного нет.
 
getBlockDropped через eclipse сработал нормально, но вот в компилированным состоянии он работал не так как через eclipse, по-этому старый способ использовать придётся (наверное временно). Так-же есть пару изменений:
Код:
public class BlockCnstorBlock extends Block implements ITileEntityProvider {

public BlockCnstorBlock(int id) {
super(id, Material.glass);
setCreativeTab(PackFurniture.proxy.tabFurniturePack);
setHardness(1.0F);
setResistance(3.5F);
setLightOpacity(0);
setStepSound(soundWoodFootstep);
setTextureName("timaxa007:" + "woodFrame");
setUnlocalizedName("cnstor.block");
}

@Override
public TileEntity createNewTileEntity(World world) {return new TileEntityCnstorBlock();}
public int quantityDropped(Random radom) {return 0;}
public int getRenderType() {return PackFurniture.proxy.renderBlockCnstorBlockModelID;}
public boolean isOpaqueCube() {return false;}
//public boolean renderAsNormalBlock() {return false;}
public int idPicked(World wrd,int x,int y,int z){return 0;}

public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z) {
TileEntity te = world.getBlockTileEntity(x, y, z);
if (te != null && te instanceof TileEntityCnstorBlock) {
return addTag(((TileEntityCnstorBlock)te).getType(), ((TileEntityCnstorBlock)te).getColor());
} else {
return addTag(0, 0);
}
}

@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack is){
TileEntity te = world.getBlockTileEntity(x, y, z);
NBTTagCompound nbt = is.getTagCompound();
if(te!=null && te instanceof TileEntityCnstorBlock && is.getTagCompound() != null){

if (is.getTagCompound().hasKey("Type")) {
((TileEntityCnstorBlock)te).setType(is.stackTagCompound.getInteger("Type"));
} else {
((TileEntityCnstorBlock)te).setType(0);
}

if (is.getTagCompound().hasKey("Color")) {
((TileEntityCnstorBlock)te).setColor(is.stackTagCompound.getInteger("Color"));
} else {
((TileEntityCnstorBlock)te).setColor(0);
}

} else {
((TileEntityCnstorBlock)te).setType(0);
((TileEntityCnstorBlock)te).setColor(0);
}
}

public void breakBlock(World world, int x, int y, int z, int oldID, int oldMeta) {
if (!world.isRemote) {
TileEntity te = world.getBlockTileEntity(x, y, z);
if (te != null && te instanceof TileEntityCnstorBlock) {
dropBlockAsItem_do(world, x, y, z, addTag(((TileEntityCnstorBlock)te).getType(), ((TileEntityCnstorBlock)te).getColor()));
} else {
dropBlockAsItem_do(world, x, y, z, addTag(0, 0));
}
}
super.breakBlock(world, x, y, z, oldID, oldMeta);
}

@SideOnly(Side.CLIENT)
public void getSubBlocks(int id, CreativeTabs table, List list){
for (int j = 0; j < TileTexture.texTest01.length; ++j) {
//for (byte i = 0; i < 16; ++i) {
//int j = 74;
int i = 14;
list.add(addTag(j, GetColors.getHexColors[i]));
//}
}
//list.add(new ItemStack(id, 1, 0));
}

private static ItemStack addTag(int par1, int par2){
ItemStack is = new ItemStack(PackFurniture.proxy.blockCnstorBlock);
NBTTagCompound tag = new NBTTagCompound();
tag.setInteger("Type", par1);
tag.setInteger("Color", par2);
is.setTagCompound(tag);
return is;
}

}
 
dropBlockAsItem_do не нужен. dropBlockAsItem лучше.
 
laz2727 написал(а):
dropBlockAsItem_do не нужен.
В моём случаи надо, он мне сможет дропнуть ItemStack с NBT тегами (и не только в этом его суть).
laz2727 написал(а):
dropBlockAsItem лучше.
Чем он лучше!? Если можешь, приведи пример с его использовании, чтобы он мог мне дропнуть ItemStack с NBT тегам?
 
Он в креативе не срабатывает. Так же. У меня стоит.
Аааанти?
 
laz2727 написал(а):
Он в креативе не срабатывает.
И в креативе и без, dropBlockAsItem не работает как мне надо.
laz2727 написал(а):
Так же. У меня стоит.
timaxa007 написал(а):
Если можешь, приведи пример с его использовании,
Вижу слова, которым я не верю.
laz2727 написал(а):
Уточни.
 
Нашёл более менее, вместо:
Код:
public void breakBlock(World world, int x, int y, int z, int oldID, int oldMeta) {
if (!world.isRemote) {
TileEntity te = world.getBlockTileEntity(x, y, z);
if (te != null && te instanceof TileEntityCnstorBlock) {
dropBlockAsItem_do(world, x, y, z, addTag(((TileEntityCnstorBlock)te).getType(), ((TileEntityCnstorBlock)te).getColor()));
} else {
dropBlockAsItem_do(world, x, y, z, addTag(0, 0));
}
}
super.breakBlock(world, x, y, z, oldID, oldMeta);
}
Использовать:
Код:
public boolean removeBlockByPlayer(World world, EntityPlayer player, int x, int y, int z) {
if (!world.isRemote) {
TileEntity te = world.getBlockTileEntity(x, y, z);
if (te != null && te instanceof TileEntityCnstorBlock && !player.capabilities.isCreativeMode) {
dropBlockAsItem_do(world, x, y, z, addTag(((TileEntityCnstorBlock)te).getType(), ((TileEntityCnstorBlock)te).getColor()));
world.removeBlockTileEntity(x, y, z);
}
world.setBlockToAir(x, y, z);
return true;
} else {
return false;
}
}
[youtube]h164VuD2_go[/youtube]
[merge_posts_bbcode]Добавлено: 01.07.2014 00:11:19[/merge_posts_bbcode]

На видео использовал *.obj модель (если кому надо напишете).
 
> obj модель для блока
Пытался тестировать фпс при большом количестве таких раскрашенных блоков? Сгенерь шахматное поле в 3д размером 30х30х30, для примера.
 
Oldestkon написал(а):
Пытался тестировать фпс при большом количестве таких раскрашенных блоков?
Таких ещё нет, подобных да. Провисает когда первый раз загружаю подобные модели в большом количестве.
Oldestkon написал(а):
Сгенерь шахматное поле в 3д размером 30х30х30, для примера.
Сгенерировать, не знаю получиться или нет. Но создать подобное, да - могу.
 
А не проще тесселятором?
 
anti344 написал(а):
А не проще тесселятором?
Первый пост этой темы, я писал какие проблемы возникают при использовании тесселятора.
timaxa007 написал(а):
Если не использовать "GL11.GL_LIGHTING", то при определёном наклонении камеры блок становиться темнее.
[youtube]AvS1PHTmxj8[/youtube]
А при использовании obj'етах нету таких мерцание теней.
 
Конечно, вот. Кусок моего мода, вполне работает.
Код:
    @Override
    public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer entityPlayer)
        {
        if (!world.isRemote)
            {
            ItemStack itEMStack = createStackedBlock(meta);
            if (itEMStack != null)
                {
                TileIronTank tile = (TileIronTank) world.getTileEntity(x, y, z);
                
                NBTTagCompound data = new NBTTagCompound();
                
                data.setInteger("Capacity", tile.tank.getCapacity());
                
                if (tile.tank.getFluid() != null)
                    {
                    tile.tank.getFluid().writeToNBT(data);
                    }
                else
                    {
                    data.setString("Empty", "");
                    }
                
                itEMStack.setTagCompound(data);
                
                itEMStack.setItemDamage(32000 - tile.tank.getFluidAmount());
                
                entityPlayer.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1);
                entityPlayer.addExhaustion(0.025F);
                
                this.dropBlockAsItem(world, x, y, z, itCEStack);
                }
            super.onBlockHarvested(world, x, y, z, meta, entityPlayer);
            }
        }
Пришлось долго искать метод, в котором ТЕ еще жива.
 
Для прозрачности @SideOnly(Side.CLIENT) public int getRenderBlockPass(){ return 1; }
Для починки проблем с тенью в тесселяторе ставить надо параметры(типа setBrightness), ибо тесселятор у всех один и все используют разную яркость, посему и моргает.
 
laz2727 написал(а):
Конечно, вот. Кусок моего мода, вполне работает.
Код:
    @Override
    public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer entityPlayer)
        {
        if (!world.isRemote)
            {
            ItemStack itEMStack = createStackedBlock(meta);
            if (itEMStack != null)
                {
                TileIronTank tile = (TileIronTank) world.getTileEntity(x, y, z);
                
                NBTTagCompound data = new NBTTagCompound();
                
                data.setInteger("Capacity", tile.tank.getCapacity());
                
                if (tile.tank.getFluid() != null)
                    {
                    tile.tank.getFluid().writeToNBT(data);
                    }
                else
                    {
                    data.setString("Empty", "");
                    }
                
                itEMStack.setTagCompound(data);
                
                itEMStack.setItemDamage(32000 - tile.tank.getFluidAmount());
                
                entityPlayer.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1);
                entityPlayer.addExhaustion(0.025F);
                
                this.dropBlockAsItem(world, x, y, z, itCEStack);
                }
            super.onBlockHarvested(world, x, y, z, meta, entityPlayer);
            }
        }
Наверное это всё-таки другая версия, так как проблема в том, что у меня 1.6.4 и не используется ItemStack в dropBlockAsItem:
1cf88a8fea10051974181a010096d1cd.jpg

Код:
public final void dropBlockAsItem(World par1World, int par2, int par3, int par4, int par5, int par6)
-----
anti344 написал(а):
Для прозрачности @SideOnly(Side.CLIENT) public int getRenderBlockPass(){ return 1; }
Нет, не работает (как надо).
anti344 написал(а):
Для починки проблем с тенью в тесселяторе ставить надо параметры(типа setBrightness), ибо тесселятор у всех один и все используют разную яркость, посему и моргает.
Пробовал, модель остаётся светлой не зависимо от времени дня. А у меня пока-что знаний не хватает, чтобы сделать нормально, типа setBrightness зависел от времени.
 
Так достать освещение блока нет? Через клиентский мир.
 
anti344 написал(а):
Так достать освещение блока нет? Через клиентский мир.
Честно говоря не знаю. Если не трудно, то можешь.
 
Не стал для этого писать отдельную тему, так как чать кода имеет маленькую часть сходства.
На сколько помню на этом форуме были такие темы "разноцветный блок" и "блок с очень много текстур (типа больше 16 иконок)" (по заголовку темы как-то не нашёл те темы, может потом найду и отвечу ссылкой на этот пост). Так когда-то я подобной вопрос про текстуры искал ответ и сам его сделал. -_-

Надеюсь, что кому-то понадобиться этот код. Хотя я знаю об этом, но не кто не признается.Есть вещество которое может отупить или делать глупые поступки, но я его принял.

ProxyServer, но все делают через основной файл, но у меня через клиент прокси (по-идеи ошибкине должно, если знать как использовать):
Код:
//public static CreativeTabs tabFurniturePack = new TabFurniturePack(CreativeTabs.getNextID(), "tabFurniturePack");
public static Block block_rock_blocks;
public static int block_rock_blocks_blockID;

//Init
block_rock_blocks = new BlockRockBlocks(block_rock_blocks_blockID);
GameRegistry.registerBlock(block_rock_blocks, ItemBlockRockBlocks.class, "BlockRockBlocks");
GameRegistry.registerTileEntity(TEBlockRockBlocks.class, "TEBlockRockBlocks");

//PreInit
Configuration cfg = new Configuration(event.getSuggestedConfigurationFile());
cfg.load();
block_rock_blocks_blockID = cfg.getBlock("block_rock_blocks", 2222).getInt();
cfg.save();
Кто знает как пользоваться, то поймёт.

ProxyClient
Код:
MinecraftForgeClient.registerItemRenderer(PackFurniture.proxy.block_rock_blocks.blockID, new ItemRenderBlockRockBlocks());
У меня не получилось, как-либо не использовать ProxyClient, всё выходило не так как надо, либо не работало. Это нужно, чтобы текстура и цвет отображались на модели блока, так как я не нашёл метода, который-бы красил блок и изменял текстуру нашего блока в инверторе работая с ItemStack'ом.

BlockRockBlocks
Код:
public class BlockRockBlocks extends Block implements ITileEntityProvider {

@SideOnly(Side.CLIENT) private Icon[] icon_array;//Переменная наших иконок

public static String[] type_block = new String[] {//Типа переменная String, которая будет давать, сколько у нас будет типов блока и их названия для иконок и текстур.
"brick_clay_white", 
"stone_brick_white", 
"stone_carved_white",
"stone_chesh_white",
"stone_rush_white",
"stone_smooth_white",
"stone_white"
};

public BlockRockBlocks(int id) {
super(id, Material.rock);
//setCreativeTab(PackFurniture.proxy.tabFurniturePack);//В какой Креативной вкладке этот блок отобразиться
setHardness(1.5F);
setResistance(10.0F);
setStepSound(soundStoneFootstep);
setTextureName("stone");
setUnlocalizedName("block_rock_blocks");
}

@Override
public TileEntity createNewTileEntity(World world) {return new TEBlockRockBlocks();}

@SideOnly(Side.CLIENT)
public int colorMultiplier(IBlockAccess block_access, int x, int y, int z) {//Метод который отвечает за цвет в мире, но не в инверторе.
TileEntity te = block_access.getBlockTileEntity(x, y, z);//Догадался именно так сделать...
if (te != null && te instanceof TEBlockRockBlocks) {
return ((TEBlockRockBlocks)te).getColorBlock();
}
return 0xFFFFFF;//В случаи если не сработает наше условие сверху, то будет белым
}

@SideOnly(Side.CLIENT)
public Icon getBlockTexture(IBlockAccess block_access, int x, int y, int z, int meta) {//Метод который отвечает за иконки
TileEntity te = block_access.getBlockTileEntity(x, y, z);
if (te != null && te instanceof TEBlockRockBlocks) {
return icon_array[((TEBlockRockBlocks)te).getSubID()];
}
return getIcon(meta, block_access.getBlockMetadata(x, y, z));//В случаи если не сработает наше условие сверху, то будет использовать стандартную иконку (которую зарегистрировали для этого блока, т.е. [b]stone[/b]).
}

public int idPicked(World world, int x, int y, int z) {return 0;}

public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z) {//Получения блока их мира в креативе по нажатию кнопки (стандартно [b]СКМ[/b]).
TileEntity te = world.getBlockTileEntity(x, y, z);
if (te != null && te instanceof TEBlockRockBlocks) {
return addTag(world.getBlockId(x, y, z), ((TEBlockRockBlocks)te).getSubID(), ((TEBlockRockBlocks)te).getColorBlock());
} else {
return addTag(world.getBlockId(x, y, z), 0, 0xFFFFFF);
}
}

@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack is) {//Метод который будет ставить блок с особыми параметрами...
TileEntity te = world.getBlockTileEntity(x, y, z);
NBTTagCompound tag = is.getTagCompound();
if (te != null && te instanceof TEBlockRockBlocks && tag != null) {
if (tag.hasKey("SubID")) {((TEBlockRockBlocks)te).setSubID((int)tag.getByte("SubID"));} 
else {((TEBlockRockBlocks)te).setSubID(0);}
if (tag.hasKey("ColorBlock")) {((TEBlockRockBlocks)te).setColorBlock(tag.getInteger("ColorBlock"));} 
else {((TEBlockRockBlocks)te).setColorBlock(0xFFFFFF);}
}
}

@Override
public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer player) {//Метод, который позволяет добыть этот блок (но чтобы и в кеативе не выпадал), выпадает даже если у вас в руке нету ни чего ([i]т.е. не зависит от инструмента[/i], если надо будет напишите).
if (!world.isRemote) {
TileEntity te = world.getBlockTileEntity(x, y, z);
if (te != null && te instanceof TEBlockRockBlocks && !player.capabilities.isCreativeMode) {
dropBlockAsItem_do(world, x, y, z, addTag(world.getBlockId(x, y, z), ((TEBlockRockBlocks)te).getSubID(), ((TEBlockRockBlocks)te).getColorBlock()));
world.removeBlockTileEntity(x, y, z);
world.setBlockToAir(x, y, z);
}
}
}

@SideOnly(Side.CLIENT)
public void getSubBlocks(int id, CreativeTabs table, List list) {
for (int i = 0; i < type_block.length; i++) {
for (int j = 0; j < (Integer.MAX_VALUE / 1000000); j++) {//Не обязательно что-то подобное писать, это я написал, для теста ([i]оно работает[/i])...
list.add(addTag(id, i, (j * 1000000)));
}
}
//list.add(new ItemStack(id, 1, 0));
}

private static ItemStack addTag(int par1, int par2, int par3) {
ItemStack is = new ItemStack(par1, 1, 0);
NBTTagCompound tag = new NBTTagCompound();
tag.setByte("SubID", (byte)par2);
tag.setInteger("ColorBlock", par3);
is.setTagCompound(tag);
return is;
}

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

}
[merge_posts_bbcode]Добавлено: 23.10.2014 01:58:27[/merge_posts_bbcode]

-_- Часть текста оно обрезал... ...почти полчаса писал в пустую...
[merge_posts_bbcode]Добавлено: 23.10.2014 02:00:27[/merge_posts_bbcode]

TEBlockRockBlocks
Код:
public class TEBlockRockBlocks extends TileEntity {

private int sub_id;
private int color_block;

public TEBlockRockBlocks() {
sub_id = 0;
color_block = 0xFFFFFF;
}

public int getSubID() {return sub_id;}
public int getColorBlock() {return color_block;}

public void setSubID(int i) {sub_id = i;}
public void setColorBlock(int i) {color_block = i;}

@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
if (nbt.hasKey("SubID")) {sub_id = (int)nbt.getByte("SubID");}
if (nbt.hasKey("ColorBlock")) {color_block = nbt.getInteger("ColorBlock");}
}

@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setByte("SubID", (byte)sub_id);
nbt.setInteger("ColorBlock", color_block);
}

public Packet getDescriptionPacket() {
NBTTagCompound nbt = new NBTTagCompound();
writeToNBT(nbt);
return new Packet132TileEntityData(xCoord, yCoord, zCoord, 0, nbt);
}

public void onDataPacket(INetworkManager net, Packet132TileEntityData Packet) {
readFromNBT(Packet.data);
}

}
[merge_posts_bbcode]Добавлено: 23.10.2014 02:02:23[/merge_posts_bbcode]

ItemBlockRockBlocks
Код:
public class ItemBlockRockBlocks extends ItemBlock {

public ItemBlockRockBlocks(int id) {
super(id);
}

public String getUnlocalizedName(ItemStack is) {
NBTTagCompound tag = is.getTagCompound();
if (tag != null && tag.hasKey("SubID")) {
return super.getUnlocalizedName() + "." + BlockRockBlocks.type_block[tag.getByte("SubID")];
}
return super.getUnlocalizedName();
}

public void addInformation(ItemStack is, EntityPlayer player, List list, boolean flag) {
NBTTagCompound tag = is.getTagCompound();
if (tag != null) {

if (tag.hasKey("SubID")) {list.add("SubID: " + tag.getByte("SubID") + ".");}

if (tag.hasKey("ColorBlock")) {
int clr = tag.getInteger("ColorBlock");
int r = (int)(clr >> 16 & 255);int g = (int)(clr >> 8 & 255);int b = (int)(clr >> 0 & 255);
list.add(Option.getText("Color") + ": R - " + r + ", G - " + g + ", B - " + b + ".");
}

}

}

}

ItemRenderBlockRockBlocks
Код:
public class ItemRenderBlockRockBlocks implements IItemRenderer {

@Override
public boolean handleRenderType(ItemStack is, ItemRenderType type) {return true;}

@Override
public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack is, ItemRendererHelper helper) {return true;}

@Override
public void renderItem(ItemRenderType type, ItemStack is, Object... data) {
NBTTagCompound tag = is.getTagCompound();

int tex = 0;
int clr = 0xFFFFFF;

if (tag != null) {
if (tag.hasKey("SubID")) {tex = tag.getByte("SubID");}
if (tag.hasKey("ColorBlock")) {clr = tag.getInteger("ColorBlock");}
}

GL11.glPushMatrix();
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glDisable(GL11.GL_LIGHTING);
Minecraft.getMinecraft().renderEngine.bindTexture(new ResourceLocation("timaxa007", "textures/blocks/stone/" + BlockRockBlocks.type_block[tex] + ".png"));

Tessellator tessellator = Tessellator.instance;
tessellator.startDrawingQuads();
tessellator.setColorOpaque_I(clr);

tessellator.addVertexWithUV(1.0D, 0.0D, 1.0D, 1.0D, 1.0D);
tessellator.addVertexWithUV(0.0D, 0.0D, 1.0D, 0.0D, 1.0D);
tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, 0.0D, 0.0D);
tessellator.addVertexWithUV(1.0D, 0.0D, 0.0D, 1.0D, 0.0D);

tessellator.addVertexWithUV(1.0D, 1.0D, 0.0D, 1.0D, 0.0D);
tessellator.addVertexWithUV(0.0D, 1.0D, 0.0D, 0.0D, 0.0D);
tessellator.addVertexWithUV(0.0D, 1.0D, 1.0D, 0.0D, 1.0D);
tessellator.addVertexWithUV(1.0D, 1.0D, 1.0D, 1.0D, 1.0D);

tessellator.addVertexWithUV(1.0D, 0.0D, 0.0D, 0.0D, 1.0D);
tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, 1.0D, 1.0D);
tessellator.addVertexWithUV(0.0D, 1.0D, 0.0D, 1.0D, 0.0D);
tessellator.addVertexWithUV(1.0D, 1.0D, 0.0D, 0.0D, 0.0D);

tessellator.addVertexWithUV(1.0D, 1.0D, 1.0D, 1.0D, 0.0D);
tessellator.addVertexWithUV(0.0D, 1.0D, 1.0D, 0.0D, 0.0D);
tessellator.addVertexWithUV(0.0D, 0.0D, 1.0D, 0.0D, 1.0D);
tessellator.addVertexWithUV(1.0D, 0.0D, 1.0D, 1.0D, 1.0D);

tessellator.addVertexWithUV(0.0D, 1.0D, 1.0D, 1.0D, 0.0D);
tessellator.addVertexWithUV(0.0D, 1.0D, 0.0D, 0.0D, 0.0D);
tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, 0.0D, 1.0D);
tessellator.addVertexWithUV(0.0D, 0.0D, 1.0D, 1.0D, 1.0D);

tessellator.addVertexWithUV(1.0D, 0.0D, 1.0D, 0.0D, 1.0D);
tessellator.addVertexWithUV(1.0D, 0.0D, 0.0D, 1.0D, 1.0D);
tessellator.addVertexWithUV(1.0D, 1.0D, 0.0D, 1.0D, 0.0D);
tessellator.addVertexWithUV(1.0D, 1.0D, 1.0D, 0.0D, 0.0D);

tessellator.draw();

GL11.glEnable(GL11.GL_LIGHTING);
GL11.glDisable(GL11.GL_BLEND);
GL11.glPopMatrix();
}

}

[merge_posts_bbcode]Добавлено: 23.10.2014 02:05:34[/merge_posts_bbcode]

Скриншоты:
ebc1d3b7e114234d930d287956aa2c28.png

Резные блоки в разных тонах.

1b2c84f52fdd874be156ec794e84f3a2.png

16 цветов с 7 типами блоков.
 
Назад
Сверху