1.7.10でメタデータで変わるカスタムレンダーを作りたい

Modding・サーバPlugin制作・ツール制作など、開発関連の質問があればこちらにお願い致します。
フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999
  • (PostNo.319974)

1.7.10でメタデータで変わるカスタムレンダーを作りたい

投稿記事by 1.7.10modder » 2018年9月08日(土) 21:31

Minecraft1.7.10、Forge10.13.4.1558です。
カスタムレンダーを使ったブロックを作ったのですが、金床のようにプレイヤーの設置方向によって見た目が変わるようにしたいと思いました。
メタデータを使ってやろうと思ったのですが、メタデータによってレンダーを変える方法がわかりません。

どこに手を入れればいいですか?
Block
[quote]
package com.sampleMod.blocks;

import java.util.List;

import com.sampleMod.sampleMod;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;

public class BlockLadderwood extends Block{

public IIcon texture;

public BlockLadderwood() {
super(Material.wood);
this.setCreativeTab(CreativeTabs.tabDecorations);
this.setHardness(1.0f);
this.setResistance(15.0F);
this.setBlockBounds(0.0F, 0.0F, 0.4F, 1.0F, 1.0F, 0.6F);
this.setLightLevel(0.0F);
this.setBlockName("blockladder");

}

@Override
public void registerBlockIcons(IIconRegister register){
this.texture=register.registerIcon("planks_oak");
}
@Override
public IIcon getIcon(int side, int meta) {
return this.texture;
}

//レンダーIDを返す
@Override
public int getRenderType()
{
return sampleMod.ladderblockRenderId;
}

//梯子のように登れるかどうかを返す
@Override
public boolean isLadder(IBlockAccess world, int x, int y, int z, EntityLivingBase entity)
{
return true;
}

@Override
public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB p_149743_5_, List p_149743_6_, Entity p_149743_7_)
{
this.setBlockBounds(0.0F, 0.0F, 0.0F, 0.1F, 1.0F, 1.0F);
super.addCollisionBoxesToList(world, x, y, z, p_149743_5_, p_149743_6_, p_149743_7_);
this.setBlockBounds(0.9F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
super.addCollisionBoxesToList(world, x, y, z, p_149743_5_, p_149743_6_, p_149743_7_);
this.setBlockBounds(0.0F, 0.0F, 0.4F, 1.0F, 1.0F, 0.6F);
super.addCollisionBoxesToList(world, x, y, z, p_149743_5_, p_149743_6_, p_149743_7_);

}


//ブロックが透けるか否かを返す。

@SideOnly(Side.CLIENT)
public boolean shouldSideBeRendered(IBlockAccess p_149646_1_, int p_149646_2_, int p_149646_3_, int p_149646_4_, int p_149646_5_)
{
return true;
}

//通常のブロックでないかを返す。
@Override
public boolean renderAsNormalBlock()
{
return false;
}

//ブロックが透明か否かを返す。
@Override
public boolean isOpaqueCube()
{
return false;
}

@Override
public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) {
if(player.getCurrentEquippedItem() != null) {

while(world.getBlock(x, y, z) == this) {
++y;
}

if(this.canPlaceBlockAt(world, x, y, z) && y < 256) {

world.setBlock(x, y, z, this, 0, 7);
this.onPostBlockPlaced(world, x, y, z, 0);

if(!player.capabilities.isCreativeMode) {
--player.getCurrentEquippedItem().stackSize;

if(player.getCurrentEquippedItem().stackSize <= 0) {
player.inventory.mainInventory[player.inventory.currentItem] =null;
}
}
}
}

}

@Override
public void onNeighborBlockChange(World world,int x,int y,int z,Block neighber) {
Block block=world.getBlock(x, y-1, z);
if(block==Blocks.air) {
this.dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0);
world.setBlockToAir(x, y, z);
}
}
}
[/quote]
Render
[quote]
package com.sampleMod.Client;

import org.lwjgl.opengl.GL11;

import com.sampleMod.sampleMod;

import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.world.IBlockAccess;

public class RenderLadderBlock implements ISimpleBlockRenderingHandler
{
//インベントリ内でブロックをレンダリングするメソッド。もしshouldRender3DInInventoryがfalseなら空でもいいかも。
@Override
public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer)
{
if (modelId == this.getRenderId())
{
this.renderBlockLadder(block, renderer, metadata, 0.0D, 0.0D, 0.4D, 0.2D, 1.0D, 0.6D);
this.renderBlockLadder(block, renderer, metadata, 0.2D, 0.08D, 0.45D, 0.8D, 0.24D, 0.55D);
this.renderBlockLadder(block, renderer, metadata, 0.2D, 0.40D, 0.45D, 0.8D, 0.56D, 0.55D);
this.renderBlockLadder(block, renderer, metadata, 0.2D, 0.72D, 0.45D, 0.8D, 0.88D, 0.55D);
this.renderBlockLadder(block, renderer, metadata, 0.8D, 0.0D, 0.4D, 1.0D, 1.0D, 0.6D);
}
}

/**ワールド内でブロックをレンダリングするメソッド**/
@Override
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer)
{
if (modelId == this.getRenderId()){
/*レンダリングする立方体のサイズを決めるメソッド。
* setRenderBounds(始点X, 始点Y, 始点Z, 終点X, 終点Y, 終点Z)*/
renderer.setRenderBounds(0.0D, 0.0D, 0.4D, 0.2D, 1.0D, 0.6D);
/*レンダリングするメソッド。
* renderStandardBlock(block, x, y, z);*/
renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(0.2D, 0.08D, 0.45D, 0.8D, 0.24D, 0.55D);
renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(0.2D, 0.40D, 0.45D, 0.8D, 0.56D, 0.55D);
renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(0.2D, 0.72D, 0.45D, 0.8D, 0.88D, 0.55D);
renderer.renderStandardBlock(block, x, y, z);
renderer.setRenderBounds(0.8D, 0.0D, 0.4D, 1.0D, 1.0D, 0.6D);
renderer.renderStandardBlock(block, x, y, z);

return true;

}
return false;
}

@Override
/**インベントリ内で3Dレンダリングするか否かを返すメソッド**/
public boolean shouldRender3DInInventory(int modelId) {
return true;
}

/**自身のレンダーIDを返すメソッド**/
@Override
public int getRenderId() {

return sampleMod.ladderblockRenderId;
}



protected void renderBlockLadder(Block block , RenderBlocks renderer , int metadata , double x1 , double y1 , double z1 ,double x2,double y2,double z2 )
{
/**詳しい説明はカット。ここは難しいため、基本的にはshouldRender3DInInventoryをfalseにすることをお勧めする。**/

renderer.setRenderBounds(x1, y1, z1, x2, y2, z2);
//これより下は、ブロックを各面ごとにレンダリングしている。
Tessellator tessellator = Tessellator.instance;
//描画位置の調整
GL11.glTranslatef(-0.5F, -0.5F, -0.5F);

tessellator.startDrawingQuads();
tessellator.setNormal(0.0F, -1.0F, 0.0F);
renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 0, metadata));
tessellator.draw();
tessellator.startDrawingQuads();
tessellator.setNormal(0.0F, 1.0F, 0.0F);
renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 1, metadata));
tessellator.draw();
tessellator.startDrawingQuads();
tessellator.setNormal(0.0F, 0.0F, -1.0F);
renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 2, metadata));
tessellator.draw();
tessellator.startDrawingQuads();
tessellator.setNormal(0.0F, 0.0F, 1.0F);
renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 3, metadata));
tessellator.draw();
tessellator.startDrawingQuads();
tessellator.setNormal(-1.0F, 0.0F, 0.0F);
renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 4, metadata));
tessellator.draw();
tessellator.startDrawingQuads();
tessellator.setNormal(1.0F, 0.0F, 0.0F);
renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 5, metadata));
tessellator.draw();
GL11.glTranslatef(0.5F, 0.5F, 0.5F);
renderer.setRenderBounds(0.0D, 0.0D, 0.0D, 1.0D, 1.0D, 1.0D);
}
}
[/quote]
1.7.10modder
ID:6b9a3681
 

Return to 質問:開発・制作関連

x