提供: Minecraft Modding Wiki
移動先: 案内検索
(ページの作成:「{{前提MOD|reqmod="Minecraft Forge Universal 9.10.0.xxx~"}} == カスタムレンダーのブロックの追加 == <p>独自に作成したレンダーを持つブ...」)
 
144行目: 144行目:
 
return AxisAlignedBB.getAABBPool().getAABB((double)par2, (double)par3, (double)par4, (double)(par2 + 1), (double)par3 + 0.75D, (double)(par4 + 1));
 
return AxisAlignedBB.getAABBPool().getAABB((double)par2, (double)par3, (double)par4, (double)(par2 + 1), (double)par3 + 0.75D, (double)(par4 + 1));
 
}
 
}
 +
}
 +
</source>
 +
 +
*RenderBenchBlock.java
 +
<source lang = "java">
 +
package mods.sample.bench.client;
 +
 +
import org.lwjgl.opengl.GL11;
 +
 +
import mods.sample.bench.BenchCore;
 +
import net.minecraft.block.Block;
 +
import net.minecraft.client.renderer.RenderBlocks;
 +
import net.minecraft.client.renderer.Tessellator;
 +
import net.minecraft.world.IBlockAccess;
 +
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
 +
 +
public class RenderBenchBlock implements ISimpleBlockRenderingHandler
 +
{
 +
//インベントリ向け
 +
@Override
 +
public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer)
 +
{
 +
if (modelId == this.getRenderId())
 +
{
 +
Tessellator tessellator = Tessellator.instance;
 +
//ココをいじるとブロックの大きさが変わる
 +
renderer.setRenderBounds(0.0D, 0.0D, 0.0D, 1.0D, 0.75D, 1.0D);
 +
 +
//描画位置の調整。ココをいじると、中心にレンダー持ってきたり、遊べる
 +
GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
 +
//くコ:彡 、コピペ☆ RenderBlocksみてね
 +
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);
 +
GL11.glTranslatef(0.5F, 0.5F, 0.5F);
 +
}
 +
}
 +
 +
//ワールドでのレンダー
 +
@Override
 +
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer)
 +
{
 +
if (modelId == this.getRenderId())
 +
{
 +
//ココをいじればブロックの大きさが変わる。
 +
renderer.setRenderBounds(0.0D, 0.0D, 0.0D, 1.0D, 0.75D, 1.0D);
 +
renderer.renderStandardBlock(block, x, y, z);
 +
//上2つのコードを複数回実行することで、階段やドラゴンエッグのようなレンダーができる
 +
return true;
 +
}
 +
return false;
 +
}
 +
 +
//インベントリのレンダーが面倒くさいなら、ココをfalseに。テクスチャだけ表示されるようになる
 +
@Override
 +
public boolean shouldRender3DInInventory()
 +
{
 +
return true;
 +
}
 +
 +
//レンダーIDを返す
 +
@Override
 +
public int getRenderId()
 +
{
 +
return BenchCore.blockRenderId;
 +
}
 +
}
 +
</source>
 +
 +
*IBenchProxy.java
 +
<source lang = "java">
 +
package mods.sample.bench;
 +
 +
public interface IBenchProxy
 +
{
 +
public int getNewRenderType();
 +
 +
public void registerRenderers();
 +
}
 +
</source>
 +
 +
*ServerProxy.java
 +
<source lang = "java">
 +
package mods.sample.bench;
 +
 +
public class ServerProxy implements IBenchProxy
 +
{
 +
@Override
 +
public int getNewRenderType()
 +
{
 +
return -1;
 +
}
 +
 +
@Override
 +
public void registerRenderers(){}
 +
 +
}
 +
</source>
 +
 +
*ServerProxy.java
 +
<source lang = "java">
 +
package mods.sample.bench;
 +
 +
public class ServerProxy implements IBenchProxy
 +
{
 +
@Override
 +
public int getNewRenderType()
 +
{
 +
return -1;
 +
}
 +
 +
@Override
 +
public void registerRenderers(){}
 +
 
}
 
}
 
</source>
 
</source>

2013年9月13日 (金) 18:39時点における版

この記事は"Minecraft Forge Universal 9.10.0.xxx~"を前提MODとしています。


カスタムレンダーのブロックの追加

独自に作成したレンダーを持つブロックの追加方法
ブロックの追加などは他のチュートリアルを参照vしてください

ソースコード

  • BenchCore.java
package mods.sample.bench;

import java.util.logging.Level;

import net.minecraft.block.Block;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.Configuration;
import net.minecraftforge.common.Property;
import cpw.mods.fml.common.FMLLog;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;

@Mod( modid = "samplebench", name = "Sample Bench", version = "1.0.0")
@NetworkMod( clientSideRequired = true, serverSideRequired = false)
public class BenchCore
{
	//Block関係の変数。コンフィグなどは各自で
	public static Block blockBench;
	public static int benchBlockId = 3000;
	
	//レンダー関係。Proxyを使い、クライアント側でレンダーの登録などを行う
	@SidedProxy(clientSide = "mods.sample.bench.client.ClientProxy", serverSide = "mods.sample.bench.ServerProxy")
	public static IBenchProxy proxy;
	//ブロックのメソッドgetRenderType()で返す独自レンダーの値
	public static int blockRenderId;
	
	@EventHandler
	public void preInit(FMLPreInitializationEvent event)
	{
		blockBench = new BlockBench(benchBlockId);
		GameRegistry.registerBlock(blockBench, "blockBench");
	}
	
	@EventHandler
	public void init(FMLInitializationEvent event)
	{
		//Proxyの実行
		blockRenderId = proxy.getNewRenderType();
		proxy.registerRenderers();
		
		LanguageRegistry.addName(blockBench, "Sample Bench");

	}
}
  • BlockBench.java
package mods.sample.bench;

import java.util.Iterator;
import java.util.List;

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.IconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.Icon;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;

public class BlockBench extends Block
{
	public BlockBench(int par1)
	{
		super(par1, Material.rock);
		this.setHardness(5.0F);
		this.setResistance(2000.0F);
		this.setLightOpacity(0);
		this.setUnlocalizedName("bench");
		this.setCreativeTab(CreativeTabs.tabDecorations);
	}
	
	//テクスチャはめんどいのでパス
	@SideOnly(Side.CLIENT)
	public Icon getIcon(int par1, int par2)
	{
		return Block.enchantmentTable.getIcon(par1, par2);
	}
	
	@SideOnly(Side.CLIENT)
	public void registerIcons(IconRegister par1IconRegister){}
	
	//重要。ココでBenchCoreに入っているレンダーのIDを返す
	@Override
	public int getRenderType()
	{
		return BenchCore.blockRenderId;
	}
	
	//下の2つはとりあえず両方falseに
	public boolean isOpaqueCube()
	{
		return false;
	}
	
	public boolean renderAsNormalBlock() 
	{
		return false;
	}
	
	//レンダーで使ったり使わなかったり
	public void setBlockBoundsForItemRender()
	{
		this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.75F, 1.0F);
	}
	
	//階段やハーフブロックみるといいかも
	public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
	{
		this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.75F, 1.0F);
	}
	
	//当たり判定。サボテンやソウルサンドを参考にすると良い。ココの設定をすると、onEntityCollidedWithBlockが呼ばれるようになる
	public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
	{
		double d = 0.0625D;
		return AxisAlignedBB.getAABBPool().getAABB((double)par2 + d, (double)par3, (double)par4 + d, (double)(par2 + 1) - d, (double)par3 + 0.75D - d, (double)(par4 + 1) - d);
	}
	
	//ブロックに視点を合わせた時に出てくる黒い線のアレ
	@SideOnly(Side.CLIENT)
	public AxisAlignedBB getSelectedBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
	{
		return AxisAlignedBB.getAABBPool().getAABB((double)par2, (double)par3, (double)par4, (double)(par2 + 1), (double)par3 + 0.75D, (double)(par4 + 1));
	}
}
  • RenderBenchBlock.java
package mods.sample.bench.client;

import org.lwjgl.opengl.GL11;

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

public class RenderBenchBlock implements ISimpleBlockRenderingHandler
{
	//インベントリ向け
	@Override
	public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer)
	{
		if (modelId == this.getRenderId())
		{
			Tessellator tessellator = Tessellator.instance;
			//ココをいじるとブロックの大きさが変わる
			renderer.setRenderBounds(0.0D, 0.0D, 0.0D, 1.0D, 0.75D, 1.0D);
			
			//描画位置の調整。ココをいじると、中心にレンダー持ってきたり、遊べる
			GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
			//くコ:彡 、コピペ☆ RenderBlocksみてね
			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);
			GL11.glTranslatef(0.5F, 0.5F, 0.5F);
		}
	}
	
	//ワールドでのレンダー
	@Override
	public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer)
	{
		if (modelId == this.getRenderId())
		{
			//ココをいじればブロックの大きさが変わる。
			renderer.setRenderBounds(0.0D, 0.0D, 0.0D, 1.0D, 0.75D, 1.0D);
			renderer.renderStandardBlock(block, x, y, z);
			//上2つのコードを複数回実行することで、階段やドラゴンエッグのようなレンダーができる
			return true;
		}
		return false;
	}

	//インベントリのレンダーが面倒くさいなら、ココをfalseに。テクスチャだけ表示されるようになる
	@Override
	public boolean shouldRender3DInInventory()
	{
		return true;
	}

	//レンダーIDを返す
	@Override
	public int getRenderId()
	{
		return BenchCore.blockRenderId;
	}
}
  • IBenchProxy.java
package mods.sample.bench;

public interface IBenchProxy
{
	public int getNewRenderType();
	
	public void registerRenderers();
}
  • ServerProxy.java
package mods.sample.bench;

public class ServerProxy implements IBenchProxy
{
	@Override
	public int getNewRenderType()
	{
		return -1;
	}
	
	@Override
	public void registerRenderers(){}
	
}
  • ServerProxy.java
package mods.sample.bench;

public class ServerProxy implements IBenchProxy
{
	@Override
	public int getNewRenderType()
	{
		return -1;
	}
	
	@Override
	public void registerRenderers(){}
	
}