カスタムモデル(3D)のレンダリングには成功したのですが、そのモデルのエンティティに騎乗させたいのですが、間違っているのか方法がわからず困っています。
以下が書いたサンプルコードです。
Item
- コード: 全て選択
package mod.sample.common;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
public class ItemSample extends Item{
public ItemSample(){
this.setMaxStackSize(1);
this.setMaxDamage(4);
this.setNoRepair();
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister iconRegister){
this.itemIcon = iconRegister.registerIcon("sample:sample");
}
@Override
@SideOnly(Side.CLIENT)
public boolean isFull3D(){
return true;
}
@Override
public ItemStack onItemRightClick(ItemStack itemStack, World world,EntityPlayer entityPlayer){
boolean creative = entityPlayer.capabilities.isCreativeMode;
double x = entityPlayer.posX;
double y = entityPlayer.posY;
double z = entityPlayer.posZ;
System.out.println("call onItemRightClick");
EntitySample entity = new EntitySample(world,(double)(x+0.5d),(double)(y+0.5d),(double)(z+1d));
if(!world.isRemote){
System.out.println("!world.isRemote::"+world.isRemote);
world.spawnEntityInWorld(entity);
}
return itemStack;
}
}
Model
- コード: 全て選択
package mod.sample.client;
import org.lwjgl.opengl.GL11;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.model.ModelBase;
import net.minecraft.client.model.ModelRenderer;
import net.minecraft.entity.Entity;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.AdvancedModelLoader;
import net.minecraftforge.client.model.IModelCustom;
@SideOnly(Side.CLIENT)
public class ModelSample extends ModelBase{
private IModelCustom modelCustom;
ResourceLocation res = new ResourceLocation("sample","textures/models/untitled.obj");
public ModelSamaple(){
modelCustom = AdvancedModelLoader.loadModel(res);
}
@Override
public void render(Entity entity,double x,double y,double z){
System.out.println("render(Entity,double,double,double)");
modelCustom.renderAll();
}
}
Render
- コード: 全て選択
package mod.sample.client;
import org.lwjgl.opengl.GL11;
import net.minecraft.client.model.ModelBase;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.entity.Entity;
import net.minecraft.util.ResourceLocation;
public class RenderSample extends Render{
private ModelSample modesample;
public RenderSample() {
super();
this.shadowSize = 0.0f;
this.modelsample = new ModelSample();
System.out.println("CALL RenderSample");
System.out.println("this.modelsample = "+this.modelsample);
}
@Override
protected ResourceLocation getEntityTexture(Entity p_110775_1_) {
return null;
}
//doRender
public void doRender(EntitySample entitysample, double x, double y, double z, float f4,float f5){
System.out.println("RenderSample doRender(2)");
GL11.glPushMatrix();
GL11.glTranslatef((float)x,(float)y,(float)z);
GL11.glScalef(0.75f,0.75f,0.75f);
this.modelsample.render(entitySample,0.0f,0.0f,-0.1f,0.0f,0.0f,0.0625f);
GL11.glPopMatrix();
}
@Override
public void doRender(Entity entity, double f1, double f2, double f3, float f4,float f5) {
System.out.println("RenderSample doRender");
this.doRender((EntitySample)entity, f1, f2, f3,f4,f5);
}
}
Entity
- コード: 全て選択
package mod.sample.common;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
public class EntitySample extends Entity{
public EntitySample(World world,double posx,double posy,double posz){
super(world);
this.posX = posx;
this.posY = posy;
this.posZ = posz;
setPosition(this.posX,this.posY,this.posZ);
}
public EntitySample(World world,EntityPlayer entityPlayer){
super(world);
this.setSize(0.5f,0.5f);
//初期状態での向き
this.setLocationAndAngles(entityPlayer.posX,entityPlayer.posY+(double)entityPlayer.getEyeHeight(),entityPlayer.posZ,entityPlayer.rotationYaw,entityPlayer.rotationPitch);
//位置の調整
this.posX = (double)entityPlayer.posX+2f;
this.posY = (double)entityPlayer.posY;
this.posZ = (double)entityPlayer.posZ+2f;
setPosition(this.posX,this.posY,this.posZ);
}
@Override
protected void entityInit() {
}
@Override
protected void readEntityFromNBT(NBTTagCompound p_70037_1_) {
}
@Override
protected void writeEntityToNBT(NBTTagCompound p_70014_1_) {
}
@Override
public boolean interactFirst(EntityPlayer entityPlayer){
if(this.riddenByEntity != null && this.riddenByEntity instanceof EntityPlayer && this.riddenByEntity != entityPlayer){
System.out.println("this.riddenByEntity = "+this.riddenByEntity);
return true;
}else{
if(!this.worldObj.isRemote){
System.out.println("this.riddenByEntity = "+this.riddenByEntity);
entityPlayer.mountEntity(this);
}
}
}
@Override
public void onUpdate(){
super.onUpdate();
setPosition(this.posX,this.posY,this.posZ);
System.out.println("EntitySample onUpdate!");
}
}
こちらのURLによれば、interactFirst(EntityPlayer playerIn)メソッドが「プレイヤーに右クリックされたときに呼び出され、フラグを返す」と書いてあったので、URLのメソッド一覧や他のMODを参考にEntityにinteractFirstを追加してみたものの、エンティティに何回も右クリックしてもinteractFirstメソッドが呼び出されません。
http://talestail-gamediary.hatenablog.c ... /07/130010
何か足りない部分のメソッド等があるのでしょうか?
エンティティの騎乗方法等に実は別なやり方をしなければいけなかったりするのでしょうか?
どなたか解決方法を教えてください。
よろしくお願いします。