提供: Minecraft Modding Wiki
(利用者:URANOSから転送)
この記事は"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