[1.6.4]Не совсем обычные блоки.

68
0
Доброго времени суток, форумчане, и вновь я с очередной серией глупых  вопросов...
   Существует один популярный мод, который известен каждому игроку Minecraft- ThaumCraft, который добавляет в саму игру чародейство: будь то блоки или различные предметы. И так, собственно сама суть этой тем... в самом моде меня заинтересовали следующие блоки:
1.Руда шардов. Думаю многих знают, что эта руда светится в темноте... Но меня 
заинтересовало именно то, что светится не вся руда целиком, а лишь её "прожилки".
И собственно вопрос- каким образом это реализовано?
На ум приходит только:
this.setLightValue(1.0F); который заставляет светится весь блок целиком.
2.Кристаллические скопления. Ну тут, собственно, все понятно. Меня интересует сам вид кристалла,а точнее как это реализовано?
Заранее благодарю за дельные ответы в теме
 
Brain написал(а):
Доброго времени суток, форумчане, и вновь я с очередной серией глупых  вопросов...
   Существует один популярный мод, который известен каждому игроку Minecraft- ThaumCraft, который добавляет в саму игру чародейство: будь то блоки или различные предметы. И так, собственно сама суть этой тем... в самом моде меня заинтересовали следующие блоки:
1.Руда шардов. Думаю многих знают, что эта руда светится в темноте... Но меня 
заинтересовало именно то, что светится не вся руда целиком, а лишь её "прожилки".
И собственно вопрос- каким образом это реализовано?
На ум приходит только:
this.setLightValue(1.0F); который заставляет светится весь блок целиком.
2.Кристаллические скопления. Ну тут, собственно, все понятно. Меня интересует сам вид кристалла,а точнее как это реализовано?
Заранее благодарю за дельные ответы в теме
сделай анимированную текстуру с яркими частями которые должны как бы светиться
пример текстуры у компаса возьми и рядом с текстурой положи файл
имя_текстуры.png.mcmeta
Код:
{ "animation": {
"frametime":5
}}
и поиграйся с освещением например поставь
Код:
this.setLightValue(0.1F);
не обещаю в верном решении поставленной цели, но это первое и самое простое что мне в голову пришло.
 
Agravaine написал(а):
Нет, там свой рендер, полюбому.
но так тоже будет не плохо смотреться я думаю. на первое время отлично подойдет если мод нужно выпустить срочно, а там уже со временем искать решение и изменять рендер света.
 
Лол.
Там две текстуры.
И у одной вырублен гл_лайтинг.
Такие дела.
 
Эм. Так же, как и вырубать лайтинг. Через TESR/BSR.
 
а можно по-подробнее? первый раз такое вижу.
 
Может взять таумкрафт , декомпилировать и посмотреть как там сделано с рудой?
 
а как этот класс называется? я не могу найти в пакете blocks
 
спс)
 
Ой я еще не искал)
[merge_posts_bbcode]Добавлено: 06.04.2015 21:56:40[/merge_posts_bbcode]

эх, не могу я найти(
 
Подниму тему.Я недавно разбирался как,там действительно свой рендер и 2 текстуры. 1-я текстура оболочка камня, 2-я сами прожилки.Рендер сделан через Special -что то там (уже забыл).Перенес код рендера и класс с OpenGL но у меня так не заработало.Либо заработало но я не заметил или что то пропустил.Если кому надо могу прям сюда кинуть код рендера.
 
Сначала рендеришь блок,потом берёшь 2 текстуры и клеишь(желательно один раз).Потом вешаешь её
 
Я так и делал))0)
Говорю же,что то пропустил,мне это щас не надо;
 
Блок
package thaumcraft.common.blocks;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.particle.EffectRenderer;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import thaumcraft.client.lib.UtilsFX;
import thaumcraft.common.Thaumcraft;
import thaumcraft.common.config.ConfigBlocks;
import thaumcraft.common.config.ConfigItems;

public class BlockCustomOre
  extends Block
{
  public BlockCustomOre()
  {
    super(Material.field_151576_e);
    func_149752_b(5.0F);
    func_149711_c(1.5F);
    func_149672_a(Block.field_149769_e);
    func_149647_a(Thaumcraft.tabTC);
    func_149675_a(true);
  }
  
  public IIcon[] icon = new IIcon[5];
  
  @SideOnly(Side.CLIENT)
  public void func_149651_a(IIconRegister ir)
  {
    this.icon[0] = ir.func_94245_a("thaumcraft:cinnibar");
    this.icon[1] = ir.func_94245_a("thaumcraft:infusedorestone");
    this.icon[2] = ir.func_94245_a("thaumcraft:infusedore");
    this.icon[3] = ir.func_94245_a("thaumcraft:amberore");
    this.icon[4] = ir.func_94245_a("thaumcraft:frostshard");
  }
  
  @SideOnly(Side.CLIENT)
  public IIcon func_149691_a(int par1, int par2)
  {
    if (par2 == 0) {
      return this.icon[0];
    }
    if (par2 == 7) {
      return this.icon[3];
    }
    if (par2 == 15) {
      return this.icon[4];
    }
    return this.icon[1];
  }
  
  public boolean canSilkHarvest(World world, EntityPlayer player, int x, int y, int z, int metadata)
  {
    return true;
  }
  
  public int func_149692_a(int par1)
  {
    return par1;
  }
  
  @SideOnly(Side.CLIENT)
  public void func_149666_a(Item par1, CreativeTabs par2CreativeTabs, List par3List)
  {
    par3List.add(new ItemStack(par1, 1, 0));
    par3List.add(new ItemStack(par1, 1, 1));
    par3List.add(new ItemStack(par1, 1, 2));
    par3List.add(new ItemStack(par1, 1, 3));
    par3List.add(new ItemStack(par1, 1, 4));
    par3List.add(new ItemStack(par1, 1, 5));
    par3List.add(new ItemStack(par1, 1, 6));
    par3List.add(new ItemStack(par1, 1, 7));
  }
  
  @SideOnly(Side.CLIENT)
  public boolean addHitEffects(World worldObj, MovingObjectPosition target, EffectRenderer effectRenderer)
  {
    int md = worldObj.func_72805_g(target.field_72311_b, target.field_72312_c, target.field_72309_d);
    if ((md != 0) && (md < 6)) {
      UtilsFX.infusedStoneSparkle(worldObj, target.field_72311_b, target.field_72312_c, target.field_72309_d, md);
    }
    return super.addHitEffects(worldObj, target, effectRenderer);
  }
  
  public boolean addDestroyEffects(World world, int x, int y, int z, int meta, EffectRenderer effectRenderer)
  {
    return super.addDestroyEffects(world, x, y, z, meta, effectRenderer);
  }
  
  public void func_149719_a(IBlockAccess par1iBlockAccess, int par2, int par3, int par4)
  {
    func_149676_a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
    super.func_149719_a(par1iBlockAccess, par2, par3, par4);
  }
  
  public void func_149743_a(World world, int i, int j, int k, AxisAlignedBB axisalignedbb, List arraylist, Entity par7Entity)
  {
    func_149676_a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
    super.func_149743_a(world, i, j, k, axisalignedbb, arraylist, par7Entity);
  }
  
  public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int md, int fortune)
  {
    ArrayList<ItemStack> ret = new ArrayList();
    if (md == 0)
    {
      ret.add(new ItemStack(ConfigBlocks.blockCustomOre, 1, 0));
    }
    else if (md == 7)
    {
      ret.add(new ItemStack(ConfigItems.itemResource, 1 + world.field_73012_v.nextInt(fortune + 1), 6));
    }
    else
    {
      int q = 1 + world.field_73012_v.nextInt(2 + fortune);
      for (int a = 0; a < q; a++) {
        ret.add(new ItemStack(ConfigItems.itemShard, 1, md - 1));
      }
    }
    return ret;
  }
  
  private Random rand = new Random();
  
  public int getExpDrop(IBlockAccess world, int md, int fortune)
  {
    if ((md != 0) && (md != 7)) {
      return MathHelper.func_76136_a(this.rand, 0, 3);
    }
    if (md == 7) {
      return MathHelper.func_76136_a(this.rand, 1, 4);
    }
    return super.getExpDrop(world, md, fortune);
  }
  
  public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side)
  {
    return true;
  }
  
  public boolean func_149686_d()
  {
    return false;
  }
  
  public int func_149645_b()
  {
    return ConfigBlocks.blockCustomOreRI;
  }
}
 

Регистрация в клиент прокси

ConfigBlocks.blockCustomOreRI = RenderingRegistry.getNextAvailableRenderId();
    registerBlockRenderer(new BlockCustomOreRenderer());

BlockCustomOreRenderer
package thaumcraft.client.renderers.block;

import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import java.awt.Color;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.settings.GameSettings;
import net.minecraft.init.Blocks;
import net.minecraft.world.IBlockAccess;
import org.lwjgl.opengl.GL11;
import thaumcraft.common.config.ConfigBlocks;

public class BlockCustomOreRenderer
  extends BlockRenderer
  implements ISimpleBlockRenderingHandler
{
  public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer)
  {
    block.func_149676_a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
    renderer.func_147775_a(block);
    if (metadata == 0)
    {
      drawFaces(renderer, block, ((thaumcraft.common.blocks.BlockCustomOre)block).icon[0], false);
    }
    else if (metadata == 7)
    {
      drawFaces(renderer, block, ((thaumcraft.common.blocks.BlockCustomOre)block).icon[3], false);
    }
    else if (metadata < 7)
    {
      drawFaces(renderer, block, ((thaumcraft.common.blocks.BlockCustomOre)block).icon[1], false);
      Color c = new Color(thaumcraft.common.blocks.BlockCustomOreItem.colors[metadata]);
      float r = c.getRed() / 255.0F;
      float g = c.getGreen() / 255.0F;
      float b = c.getBlue() / 255.0F;
      GL11.glColor3f(r, g, b);
      block.func_149676_a(0.005F, 0.005F, 0.005F, 0.995F, 0.995F, 0.995F);
      renderer.func_147775_a(block);
      drawFaces(renderer, block, ((thaumcraft.common.blocks.BlockCustomOre)block).icon[2], false);
      GL11.glColor3f(1.0F, 1.0F, 1.0F);
    }
  }
  
  public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer)
  {
    int bb = setBrightness(world, x, y, z, block);
    int metadata = world.func_72805_g(x, y, z);
    block.func_149676_a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
    renderer.func_147775_a(block);
    renderer.func_147784_q(block, x, y, z);
    if ((metadata != 0) && (metadata != 7) && (metadata < 7))
    {
      Tessellator t = Tessellator.field_78398_a;
      t.func_78378_d(thaumcraft.common.blocks.BlockCustomOreItem.colors[metadata]);
      t.func_78380_c(Math.max(bb, 160));
      renderAllSides(world, x, y, z, block, renderer, ((thaumcraft.common.blocks.BlockCustomOre)block).icon[2], false);
      if (Minecraft.func_71410_x().field_71474_y.field_151443_J > 1)
      {
        block.func_149676_a(0.005F, 0.005F, 0.005F, 0.995F, 0.995F, 0.995F);
        renderer.func_147775_a(block);
        t.func_78380_c(bb);
        renderAllSides(world, x, y, z, block, renderer, Blocks.field_150348_b.func_149691_a(0, 0), false);
      }
    }
    renderer.func_147771_a();
    block.func_149676_a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
    renderer.func_147775_a(block);
    return true;
  }
  
  public boolean shouldRender3DInInventory(int modelId)
  {
    return true;
  }
  
  public int getRenderId()
  {
    return ConfigBlocks.blockCustomOreRI;
  }
}
 

BlockRender
package thaumcraft.client.renderers.block;

import net.minecraft.block.Block;
import net.minecraft.client.renderer.EntityRenderer;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;
import org.lwjgl.opengl.GL11;

public class BlockRenderer
{
  public static float W1 = 0.0625F;
  public static float W2 = 0.125F;
  public static float W3 = 0.1875F;
  public static float W4 = 0.25F;
  public static float W5 = 0.3125F;
  public static float W6 = 0.375F;
  public static float W7 = 0.4375F;
  public static float W8 = 0.5F;
  public static float W9 = 0.5625F;
  public static float W10 = 0.625F;
  public static float W11 = 0.6875F;
  public static float W12 = 0.75F;
  public static float W13 = 0.8125F;
  public static float W14 = 0.875F;
  public static float W15 = 0.9375F;
  
  public static void drawFaces(RenderBlocks renderblocks, Block block, IIcon icon, boolean st)
  {
    drawFaces(renderblocks, block, icon, icon, icon, icon, icon, icon, st);
  }
  
  public static void drawFaces(RenderBlocks renderblocks, Block block, IIcon i1, IIcon i2, IIcon i3, IIcon i4, IIcon i5, IIcon i6, boolean solidtop)
  {
    Tessellator tessellator = Tessellator.field_78398_a;
    GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
    tessellator.func_78382_b();
    tessellator.func_78375_b(0.0F, -1.0F, 0.0F);
    renderblocks.func_147768_a(block, 0.0D, 0.0D, 0.0D, i1);
    tessellator.func_78381_a();
    if (solidtop) {
      GL11.glDisable(3008);
    }
    tessellator.func_78382_b();
    tessellator.func_78375_b(0.0F, 1.0F, 0.0F);
    renderblocks.func_147806_b(block, 0.0D, 0.0D, 0.0D, i2);
    tessellator.func_78381_a();
    if (solidtop) {
      GL11.glEnable(3008);
    }
    tessellator.func_78382_b();
    tessellator.func_78375_b(0.0F, 0.0F, 1.0F);
    renderblocks.func_147798_e(block, 0.0D, 0.0D, 0.0D, i3);
    tessellator.func_78381_a();
    tessellator.func_78382_b();
    tessellator.func_78375_b(0.0F, 0.0F, -1.0F);
    renderblocks.func_147764_f(block, 0.0D, 0.0D, 0.0D, i4);
    tessellator.func_78381_a();
    tessellator.func_78382_b();
    tessellator.func_78375_b(1.0F, 0.0F, 0.0F);
    renderblocks.func_147761_c(block, 0.0D, 0.0D, 0.0D, i5);
    tessellator.func_78381_a();
    tessellator.func_78382_b();
    tessellator.func_78375_b(-1.0F, 0.0F, 0.0F);
    renderblocks.func_147734_d(block, 0.0D, 0.0D, 0.0D, i6);
    tessellator.func_78381_a();
    GL11.glTranslatef(0.5F, 0.5F, 0.5F);
  }
  
  public static int setBrightness(IBlockAccess blockAccess, int i, int j, int k, Block block)
  {
    Tessellator tessellator = Tessellator.field_78398_a;
    int mb = block.func_149677_c(blockAccess, i, j, k);
    tessellator.func_78380_c(mb);
    
    float f = 1.0F;
    
    int l = block.func_149720_d(blockAccess, i, j, k);
    float f1 = (l >> 16 & 0xFF) / 255.0F;
    float f2 = (l >> 8 & 0xFF) / 255.0F;
    float f3 = (l & 0xFF) / 255.0F;
    if (EntityRenderer.field_78517_a)
    {
      float f6 = (f1 * 30.0F + f2 * 59.0F + f3 * 11.0F) / 100.0F;
      float f4 = (f1 * 30.0F + f2 * 70.0F) / 100.0F;
      float f7 = (f1 * 30.0F + f3 * 70.0F) / 100.0F;
      f1 = f6;
      f2 = f4;
      f3 = f7;
    }
    tessellator.func_78386_a(f * f1, f * f2, f * f3);
    return mb;
  }
  
  protected static void renderAllSides(IBlockAccess world, int x, int y, int z, Block block, RenderBlocks renderer, IIcon tex)
  {
    renderAllSides(world, x, y, z, block, renderer, tex, true);
  }
  
  protected static void renderAllSides(IBlockAccess world, int x, int y, int z, Block block, RenderBlocks renderer, IIcon tex, boolean allsides)
  {
    if ((allsides) || (block.func_149646_a(world, x + 1, y, z, 6))) {
      renderer.func_147764_f(block, x, y, z, tex);
    }
    if ((allsides) || (block.func_149646_a(world, x - 1, y, z, 6))) {
      renderer.func_147798_e(block, x, y, z, tex);
    }
    if ((allsides) || (block.func_149646_a(world, x, y, z + 1, 6))) {
      renderer.func_147734_d(block, x, y, z, tex);
    }
    if ((allsides) || (block.func_149646_a(world, x, y, z - 1, 6))) {
      renderer.func_147761_c(block, x, y, z, tex);
    }
    if ((allsides) || (block.func_149646_a(world, x, y + 1, z, 6))) {
      renderer.func_147806_b(block, x, y, z, tex);
    }
    if ((allsides) || (block.func_149646_a(world, x, y - 1, z, 6))) {
      renderer.func_147768_a(block, x, y, z, tex);
    }
  }
  
  protected static void renderAllSides(IBlockAccess world, int x, int y, int z, Block block, RenderBlocks renderer, boolean allsides)
  {
    if ((allsides) || (block.func_149646_a(world, x + 1, y, z, 6))) {
      renderer.func_147764_f(block, x, y, z, block.func_149673_e(world, x, y, z, 5));
    }
    if ((allsides) || (block.func_149646_a(world, x - 1, y, z, 6))) {
      renderer.func_147798_e(block, x, y, z, block.func_149673_e(world, x, y, z, 4));
    }
    if ((allsides) || (block.func_149646_a(world, x, y, z + 1, 6))) {
      renderer.func_147734_d(block, x, y, z, block.func_149673_e(world, x, y, z, 3));
    }
    if ((allsides) || (block.func_149646_a(world, x, y, z - 1, 6))) {
      renderer.func_147761_c(block, x, y, z, block.func_149673_e(world, x, y, z, 2));
    }
    if ((allsides) || (block.func_149646_a(world, x, y + 1, z, 6))) {
      renderer.func_147806_b(block, x, y, z, block.func_149673_e(world, x, y, z, 1));
    }
    if ((allsides) || (block.func_149646_a(world, x, y - 1, z, 6))) {
      renderer.func_147768_a(block, x, y, z, block.func_149673_e(world, x, y, z, 0));
    }
  }
  
  protected static void renderAllSidesInverted(IBlockAccess world, int x, int y, int z, Block block, RenderBlocks renderer, IIcon tex, boolean allsides)
  {
    if ((allsides) || (!block.func_149646_a(world, x - 1, y, z, 6))) {
      renderer.func_147764_f(block, x - 1, y, z, tex);
    }
    if ((allsides) || (!block.func_149646_a(world, x + 1, y, z, 6))) {
      renderer.func_147798_e(block, x + 1, y, z, tex);
    }
    if ((allsides) || (!block.func_149646_a(world, x, y, z - 1, 6))) {
      renderer.func_147734_d(block, x, y, z - 1, tex);
    }
    if ((allsides) || (!block.func_149646_a(world, x, y, z + 1, 6))) {
      renderer.func_147761_c(block, x, y, z + 1, tex);
    }
    if ((allsides) || (!block.func_149646_a(world, x, y - 1, z, 6))) {
      renderer.func_147806_b(block, x, y - 1, z, tex);
    }
    if ((allsides) || (!block.func_149646_a(world, x, y + 1, z, 6))) {
      renderer.func_147768_a(block, x, y + 1, z, tex);
    }
  }
  
  protected static void renderAllSides(int x, int y, int z, Block block, RenderBlocks renderer, IIcon tex)
  {
    renderer.func_147764_f(block, x - 1, y, z, tex);
    renderer.func_147798_e(block, x + 1, y, z, tex);
    renderer.func_147734_d(block, x, y, z - 1, tex);
    renderer.func_147761_c(block, x, y, z + 1, tex);
    renderer.func_147806_b(block, x, y - 1, z, tex);
    renderer.func_147768_a(block, x, y + 1, z, tex);
  }
}
 

функции не переведены,потерял перевод.
 
Назад
Сверху