提供: Minecraft Modding Wiki
(ページの作成:「{{前提MOD|reqmod="Minecraft Forge Universal 9.10.0.xxx~"}} == カスタムレンダーのブロックの追加 == <p>独自に作成したレンダーを持つブ...」) |
|||
(同じ利用者による、間の6版が非表示) | |||
2行目: | 2行目: | ||
− | == | + | == カスタムレンダーを使用するブロックの追加 == |
<p>独自に作成したレンダーを持つブロックの追加方法<br> | <p>独自に作成したレンダーを持つブロックの追加方法<br> | ||
− | + | ブロックの追加などは他のチュートリアルを参照してください</p> | |
===ソースコード=== | ===ソースコード=== | ||
146行目: | 146行目: | ||
} | } | ||
</source> | </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> | ||
+ | |||
+ | *ClientProxy.java | ||
+ | <source lang = "java"> | ||
+ | package mods.sample.bench.client; | ||
+ | |||
+ | import cpw.mods.fml.client.registry.RenderingRegistry; | ||
+ | import mods.sample.bench.IBenchProxy; | ||
+ | |||
+ | public class ClientProxy implements IBenchProxy | ||
+ | { | ||
+ | //レンダーIDの取得 | ||
+ | @Override | ||
+ | public int getNewRenderType() | ||
+ | { | ||
+ | return RenderingRegistry.getNextAvailableRenderId(); | ||
+ | } | ||
+ | |||
+ | //カスタムレンダーの登録 | ||
+ | @Override | ||
+ | public void registerRenderers() | ||
+ | { | ||
+ | RenderingRegistry.registerBlockHandler(new RenderBenchBlock()); | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | ==解説== | ||
+ | ===BenchCore.java=== | ||
+ | <source lang = "java"> | ||
+ | blockRenderId = proxy.getNewRenderType(); | ||
+ | proxy.registerRenderers(); | ||
+ | </source> | ||
+ | プロキシを使用して、カスタムレンダーのIDの取得や、カスタムレンダーの登録を行う。<br> | ||
+ | プロキシ以外にも、クライアント側でしか行われないようにすれば、Core部分での登録も可能 | ||
+ | |||
+ | ===BlockBench.java=== | ||
+ | <source lang = "java"> | ||
+ | public int getRenderType() | ||
+ | { | ||
+ | return BenchCore.blockRenderId; | ||
+ | } | ||
+ | |||
+ | public boolean isOpaqueCube() | ||
+ | { | ||
+ | return false; | ||
+ | } | ||
+ | |||
+ | public boolean renderAsNormalBlock() | ||
+ | { | ||
+ | return false; | ||
+ | } | ||
+ | </source> | ||
+ | 当たり判定などを気にしないなら、この3つを設定すればOK | ||
+ | |||
+ | ===RenderBenchBlock.java=== | ||
+ | コピペ祭りで大体OK(オイ)<br> | ||
+ | 詳しい事や、もっと複雑なことを知りたいなら、RenderBlocksの闇に進むのじゃ! | ||
+ | |||
+ | ===ClientProxy.java=== | ||
+ | <source lang = "java"> | ||
+ | RenderingRegistry.getNextAvailableRenderId(); | ||
+ | RenderingRegistry.registerBlockHandler(new RenderBenchBlock()); | ||
+ | </source> | ||
+ | この2つを行えばOK |
2013年9月13日 (金) 21:01時点における最新版
この記事は"Minecraft Forge Universal 9.10.0.xxx~"を前提MODとしています。 |
目次
カスタムレンダーを使用するブロックの追加[編集]
独自に作成したレンダーを持つブロックの追加方法
ブロックの追加などは他のチュートリアルを参照してください
ソースコード[編集]
- 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(){} }
- ClientProxy.java
package mods.sample.bench.client; import cpw.mods.fml.client.registry.RenderingRegistry; import mods.sample.bench.IBenchProxy; public class ClientProxy implements IBenchProxy { //レンダーIDの取得 @Override public int getNewRenderType() { return RenderingRegistry.getNextAvailableRenderId(); } //カスタムレンダーの登録 @Override public void registerRenderers() { RenderingRegistry.registerBlockHandler(new RenderBenchBlock()); } }
解説[編集]
BenchCore.java[編集]
blockRenderId = proxy.getNewRenderType(); proxy.registerRenderers();
プロキシを使用して、カスタムレンダーのIDの取得や、カスタムレンダーの登録を行う。
プロキシ以外にも、クライアント側でしか行われないようにすれば、Core部分での登録も可能
BlockBench.java[編集]
public int getRenderType() { return BenchCore.blockRenderId; } public boolean isOpaqueCube() { return false; } public boolean renderAsNormalBlock() { return false; }
当たり判定などを気にしないなら、この3つを設定すればOK
RenderBenchBlock.java[編集]
コピペ祭りで大体OK(オイ)
詳しい事や、もっと複雑なことを知りたいなら、RenderBlocksの闇に進むのじゃ!
ClientProxy.java[編集]
RenderingRegistry.getNextAvailableRenderId(); RenderingRegistry.registerBlockHandler(new RenderBenchBlock());
この2つを行えばOK