[解決]カスタムモデルのEntityの騎乗方法がわからないので教えて頂けないでしょうか

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

[解決]カスタムモデルのEntityの騎乗方法がわからないので教えて頂けないでしょうか

投稿記事by shimaokazu » 2016年6月27日(月) 19:10

現在、mod作りに挑戦中です。
カスタムモデル(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

何か足りない部分のメソッド等があるのでしょうか?
エンティティの騎乗方法等に実は別なやり方をしなければいけなかったりするのでしょうか?


どなたか解決方法を教えてください。
よろしくお願いします。
最後に編集したユーザー shimaokazu [ 2016年6月29日(水) 12:37 ], 累計 1 回
MOD作りに挑戦中の初心者です
shimaokazu
ID:488337f4
木を殴ってる
 
記事: 11
登録日時: 2016年6月06日(月) 21:43

  • (PostNo.276252)

Re: カスタムモデルのEntityの騎乗方法がわからないので教えて頂けないでしょうか

投稿記事by MG36 » 2016年6月27日(月) 20:03

Forgeのバージョンを明記しましょう
Forgeのバージョンによってメソッド名が違う場合があります


interactFirst(EntityPlayer entityPlayer)はforge1.8以降のメソッドであり、
過去の投稿からforge1.7.10で制作しているようなので、
EntitySample
コード: 全て選択
public boolean interact(EntityPlayer player) {
      if (super.interact(player)) {
         return true;
      } else if (!this.worldObj.isRemote && (this.riddenByEntity == null || this.riddenByEntity == player)) {
         player.mountEntity(this);//プレイヤーをこのentityに乗せる
         return true;
      } else {
         return false;
      }
   }

これで問題ないはずです

余談
乗り物系のentityを開発する際はEntityBoatを参考にすることをお勧めします
だれか時間をください
MG36
ID:38bd86f4
金掘り
 
記事: 388
登録日時: 2013年8月13日(火) 19:58

  • (PostNo.276253)

Re: カスタムモデルのEntityの騎乗方法がわからないので教えて頂けないでしょうか

投稿記事by defeatedcrow » 2016年6月27日(月) 20:16

Entityはデフォルトではあたり判定がなく、プレイヤーに対しても互いに干渉できないものだったような

getCollisionBox、getBoundingBoxあたりをオーバーライドしてあたり判定を設定してやると右クリックに反応するんじゃないかな

コード: 全て選択
@Override
public AxisAlignedBB getBoundingBox() {
   return this.boundingBox;
}


たとえばこんな感じで
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:dfdd7681
ダイヤモンド掘り
 
記事: 895
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.276336)

Re: カスタムモデルのEntityの騎乗方法がわからないので教えて頂けないでしょうか

投稿記事by shimaokazu » 2016年6月29日(水) 12:37

MG36 さんが書きました:Forgeのバージョンを明記しましょう
Forgeのバージョンによってメソッド名が違う場合があります


interactFirst(EntityPlayer entityPlayer)はforge1.8以降のメソッドであり、
過去の投稿からforge1.7.10で制作しているようなので、
EntitySample
コード: 全て選択
public boolean interact(EntityPlayer player) {
      if (super.interact(player)) {
         return true;
      } else if (!this.worldObj.isRemote && (this.riddenByEntity == null || this.riddenByEntity == player)) {
         player.mountEntity(this);//プレイヤーをこのentityに乗せる
         return true;
      } else {
         return false;
      }
   }

これで問題ないはずです

余談
乗り物系のentityを開発する際はEntityBoatを参考にすることをお勧めします



defeatedcrow さんが書きました:Entityはデフォルトではあたり判定がなく、プレイヤーに対しても互いに干渉できないものだったような

getCollisionBox、getBoundingBoxあたりをオーバーライドしてあたり判定を設定してやると右クリックに反応するんじゃないかな

コード: 全て選択
@Override
public AxisAlignedBB getBoundingBox() {
   return this.boundingBox;
}


たとえばこんな感じで


返信が遅れてしまい申し訳ありませんでした。
どちらの方法も試してみた所、騎乗の方に成功しました。

わざわざ教えていただきありがとうございました。
MOD作りに挑戦中の初心者です
shimaokazu
ID:9909f606
木を殴ってる
 
記事: 11
登録日時: 2016年6月06日(月) 21:43


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

x