射出物エンティティのレンダーが動作しない【解決済み】

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

射出物エンティティのレンダーが動作しない【解決済み】

投稿記事by 奔颯 結城 » 2017年10月22日(日) 21:08

はじめまして、自分で銃modを作成したくなりmoddingの勉強をはじめました。
defeatedcrow氏の火炎放射器のチュートリアルをベースにmoddingWikiなども参考にしつつ銃のmodの制作をしているのですが、defeatedcrow氏の火炎エンティティのレンダークラスをmoddingWikiの射出物レンダークラスを参考に書き換えてモデルが表示されるように変更してテストプレイしたところ、銃を撃とうとした瞬間にクラッシュしてしまいました。
クラッシュレポートを見たところ銃が弾エンティティを出すときにレンダークラスでエラーが起こっているようです。
しかし私にはどのように問題になっていてどう直すべきなのかわからなかったため、どなたか問題点と修正方法を教えていただけませんでしょうか?
開発環境は
jdk1.8.0_144
及び
forge-1.7.10-10.13.4.1614
です

メインクラス
コード: 全て選択
package com.hnst.hnstguns;

import java.io.IOException;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.config.Configuration;
import net.minecraftforge.common.config.Property;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.EntityRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import hnst.hnstguns.common.CommonProxyF;
import hnst.hnstguns.entity.EntityBullet;
import hnst.hnstguns.item.Itemgun;

@Mod(modid = "hnstguns",name = "HNST's gunmod", version = "0.1")
public class HNSTgunsCore
{
    //public static final String MODID = "hnstguns";
    //public static final String VERSION = "0.1";
   
   // プロキシ登録
   @SidedProxy(clientSide = "hnst.hnstguns.client.ClientProxyF",
         serverSide = "hnst.hnstguns.common.CommonProxyF")
   public static CommonProxyF proxy;
   
   // インスタンス
   @Instance("hnstguns")
   public static HNSTgunsCore instance;
   
   public static Logger logger = LogManager.getLogger("HNST's gunmod");
   
   public static Item gunbase;

    @EventHandler
    public void preInit(FMLPreInitializationEvent event)
    {
       /*
        * FMLPreInitializationEventです。
        * このメソッドをはじめとしたローディングイベントは、マインクラフトの起動時、Forgeによって所定のタイミングで呼ばれます。
        * 実際どんなことが起きているかはコンソールログにでてくるので、
        * 興味があればVersions/logsフォルダにあるfml-client-latest.logを眺めてみると良いです。
        *
        * アイテムやブロックの登録などは、基本的にはここで行われます。
        */
       
      Configuration cfg = new Configuration(event.getSuggestedConfigurationFile());
      try {
         cfg.load();
         /*
          * Configの項目の生成と読み込み。
          * この段階では、まだ項目はありません。
          */
      } catch (Exception e) {
         e.printStackTrace();
      } finally {
         cfg.save();
      }

      // itemの登録。
      this.gunbase = new Itemgun().setCreativeTab(CreativeTabs.tabCombat).setUnlocalizedName(
            "hnstguns.gun");
      GameRegistry.registerItem(gunbase, "hnstguns.gun");
    }
   
    @EventHandler
    public void init(FMLInitializationEvent event)
    {
      // entity
      int idFlame = 1;
      EntityRegistry.registerModEntity(EntityBullet.class, "hnstguns.entity_bullet", idFlame, this, 128, 5, true);

      // render
      proxy.registerRenderers();
    }
   
   @EventHandler
   public void postInit(FMLPostInitializationEvent event) {
   /*
    * FMLPostInitializationEventです。全てのMODのInitとIMCEventの後、順に呼ばれます。
    * アイテムやブロックなど色々なMODの追加物が揃っていることが多いため、MOD間の連携要素の読み込みによく利用されます。
    */
   }
}


コモンプロキシ
コード: 全て選択
package hnst.hnstguns.common;

import net.minecraft.world.World;

/*
 * CommonProxyはサーバ側で呼ばれるクラスです。
 * Renderまわりの登録処理など、クライアント側で読み込まれて欲しくないものは、
 * このプロキシを利用し、Common側のメソッドを空にしておくことでクライアント側に限定できます。
 *
 */
public class CommonProxyF {

   public void registerRenderers()
   {
 
   }
 
   public World getClientWorld() {
 
      return null;
   }

}



クライアントプロキシ
コード: 全て選択
package hnst.hnstguns.client;

import cpw.mods.fml.client.FMLClientHandler;
import cpw.mods.fml.client.registry.RenderingRegistry;
import hnst.hnstguns.client.model.RenderBullet;
import hnst.hnstguns.common.CommonProxyF;
import hnst.hnstguns.entity.EntityBullet;
import net.minecraft.world.World;

/*
 * Client側のプロキシです。
 * CommonProxyF.classを継承させ、CommonProxyにあるメソッドをオーバーライドして内容を変えることで、
 * クライアント限定の処理部分を作ります。
 */
public class ClientProxyF extends CommonProxyF {

   @Override
   public World getClientWorld()
   {
      return FMLClientHandler.instance().getClient().theWorld;
   }
 
   @Override
   public void registerRenderers() {
      RenderingRegistry.registerEntityRenderingHandler(EntityBullet.class, new RenderBullet(null));
      
   }

}


弾エンティティ
コード: 全て選択
package hnst.hnstguns.entity;

import java.util.ArrayList;
import java.util.List;

import net.minecraft.block.Block;
import net.minecraft.block.BlockBush;
import net.minecraft.block.BlockLeavesBase;
import net.minecraft.block.material.Material;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.IProjectile;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.passive.EntityHorse;
import net.minecraft.entity.passive.EntityTameable;
import net.minecraft.entity.passive.EntityVillager;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.play.server.S2BPacketChangeGameState;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.DamageSource;
import net.minecraft.util.MathHelper;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.oredict.OreDictionary;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import com.hnst.hnstguns.HNSTgunsCore;

public class EntityBullet extends Entity implements IProjectile {

   /* 地中判定に使うもの */
   protected int xTile = -1;
   protected int yTile = -1;
   protected int zTile = -1;
   protected Block inTile;
   protected int inData;
   protected boolean inGround;

   /* この弾を撃ったエンティティ */
   public Entity shootingEntity;

   /* 地中・空中にいる時間 */
   protected int ticksInGround;
   protected int ticksInAir;
   protected int livingTimeCount = 0;

   /* ダメージの大きさ */
   protected final double damage;

   /* 前進速度 */
   protected double speed = 1.0D;

   /* 幅 */
   protected final double range;

   /* ノックバックの大きさ */
   protected final int coolTime;
   
   protected boolean isCorrosion = false;
   
   // コンストラクタ
   public EntityBullet(World par1World) {
      super(par1World);
      this.renderDistanceWeight = 10.0D;
      this.setSize(0.5F, 0.5F);
      this.damage = 10.0D;
      this.range = 2.0D;
      this.coolTime = 2;
   }
   
    /** 発射する弾を生成・初期パラメータの定義をする。
     * @param par1World :このワールド
     * @param par2EntityLivingBase :弾源となるエンティティ。このModの場合、弾を撃ったプレイヤーがここに入る
     * @param speed :弾の速度計算に使われる値
     * @param speed2 :弾の速度計算に使われる値2
     * @param adjustX :プレイヤーから見て水平方向に、発射する弾をずらす(複数発射するときなどに使用する)
     * @param adjustZ :プレイヤーから見て前後方向に弾をずらす
     * @param adjustY :プレイヤーから見て上下方向に弾をずらす*/
    public EntityBullet(World par1World, EntityLivingBase par2EntityLivingBase, float speed, float speed2,double damage,
            float adjustX, float adjustZ,float adjustY, int cooltime)
       {
          super(par1World);
             this.damage = damage;
             this.renderDistanceWeight = 10.0D;
             this.shootingEntity = par2EntityLivingBase;
             this.yOffset = 0.0F;
             this.setSize(0.5F, 0.5F);
          this.range = 2.0D;
             this.coolTime = cooltime;
   
           //初期状態での向きの決定
           this.setLocationAndAngles(par2EntityLivingBase.posX, par2EntityLivingBase.posY +
               (double)par2EntityLivingBase.getEyeHeight(), par2EntityLivingBase.posZ,
               par2EntityLivingBase.rotationYaw, par2EntityLivingBase.rotationPitch);
   
           //位置の調整
           this.posX += -(double)(MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * (1.0F + adjustZ))
                 - (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * adjustX);
           this.posY += 0.05000000149011612D + adjustY;
           this.posZ += (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * (1.0F + adjustZ))
                 - (double)(MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * adjustX);
           this.setPosition(this.posX, this.posY, this.posZ);
   
           //初速度
           this.motionX = (double)(-MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) *
                              MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI));
           this.motionZ = (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) *
                              MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI));
           this.motionY = (double)(-MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI));
           this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, speed * 1.5F, speed2);
       }

   @Override
   public void setThrowableHeading(double par1, double par3, double par5, float par7, float par8) {
      // IProjectileから実装を求められるメソッド
      float f2 = MathHelper.sqrt_double(par1 * par1 + par3 * par3 + par5 * par5);
      par1 /= f2;
      par3 /= f2;
      par5 /= f2;
      par1 += this.rand.nextGaussian() * (this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * par8;
      par3 += this.rand.nextGaussian() * (this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * par8;
      par5 += this.rand.nextGaussian() * (this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * par8;
      par1 *= par7;
      par3 *= par7;
      par5 *= par7;
      this.motionX = par1;
      this.motionY = par3;
      this.motionZ = par5;
      float f3 = MathHelper.sqrt_double(par1 * par1 + par5 * par5);
      this.prevRotationYaw = this.rotationYaw = (float) (Math.atan2(par1, par5) * 180.0D / Math.PI);
      this.prevRotationPitch = this.rotationPitch = (float) (Math.atan2(par3, f3) * 180.0D / Math.PI);
      this.ticksInGround = 0;
   }

   @Override
   protected void entityInit() {
      // Entityから実装を求められるメソッド(空でもいい)
      
   }

   @Override
   protected void readEntityFromNBT(NBTTagCompound p_70037_1_) {
      // Entityから実装を求められるメソッド(空でもいい)
      
   }

   @Override
   protected void writeEntityToNBT(NBTTagCompound p_70014_1_) {
      // Entityから実装を求められるメソッド(空でもいい)
      
   }

   // レンダー用に使われる、位置や向き情報などのメソッド
   @Override
   @SideOnly(Side.CLIENT)
   public void setPositionAndRotation2(double par1, double par3, double par5, float par7, float par8, int par9) {
      this.setPosition(par1, par3, par5);
      this.setRotation(par7, par8);
   }

   @Override
   @SideOnly(Side.CLIENT)
   public void setVelocity(double par1, double par3, double par5) {
      this.motionX = par1;
      this.motionY = par3;
      this.motionZ = par5;

      if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) {
         float f = MathHelper.sqrt_double(par1 * par1 + par5 * par5);
         this.prevRotationYaw = this.rotationYaw = (float) (Math.atan2(par1, par5) * 180.0D / Math.PI);
         this.prevRotationPitch = this.rotationPitch = (float) (Math.atan2(par3, f) * 180.0D / Math.PI);
         this.prevRotationPitch = this.rotationPitch;
         this.prevRotationYaw = this.rotationYaw;
         this.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch);
         this.ticksInGround = 0;
      }
   }
   
   // 接地したとき、ブロックが「Entityに踏み荒らされた」判定にするかどうか
   @Override
   protected boolean canTriggerWalking() {
      return false;
   }

   // 影の描画サイズ これは影を無しにする
   @Override
   @SideOnly(Side.CLIENT)
   public float getShadowSize() {
      return 0.0F;
   }

   // Itemを使ってこのEntityを攻撃できるか
   @Override
   public boolean canAttackWithItem() {
      return false;
   }
   
    // Tick処理部分
   @Override
   public void onUpdate() {
      super.onUpdate();
      
        // 60tick(3sec)経過すると自然消滅する
      livingTimeCount++;
      if (livingTimeCount > 60)
         this.setDead();
      
      // 空気じゃないブロックに当たった
      if (this.inGround) {
         this.setDead();//壁に当たれば消える。
      } else {
         // 埋まってない時。速度の更新。

         ++this.ticksInAir;
         // ブロックとの衝突判定
         Vec3 vec3 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ);
         Vec3 vec31 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ
               + this.motionZ);
         MovingObjectPosition movingobjectposition = this.worldObj.func_147447_a(vec3, vec31, false, true, false);
         vec3 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ);
         vec31 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ
               + this.motionZ);

         // ブロックに当たった
         if (movingobjectposition != null) {
            vec31 = Vec3.createVectorHelper(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord,
                  movingobjectposition.hitVec.zCoord);
         }

         // Entityとの衝突判定。
         // コンストラクタで入れたrangeの分だけ当たり判定を拡大し、接触しているEntityのリストを得ます。
         List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this,
               this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(range, range, range));
         double d0 = 0.0D;
         int l;
         float f1;
         boolean isVillager = false;
         ArrayList<MovingObjectPosition> entityList = new ArrayList<MovingObjectPosition>();

         // 1ブロック分の範囲内にいるエンティティ全てに対して繰り返す
         // ここは、EntityArrowでは一体だけに対象を絞っているが、このMODでは全てを対象に取る
            for (l = 0; l < list.size(); ++l)
            {
                Entity entity1 = (Entity)list.get(l);

            // 自傷防止のため、発射物自身or発射後5tick以外だとすりぬける
            if (entity1.canBeCollidedWith() && entity1 != this.shootingEntity) {
               f1 = 0.3F;
               // 上下方向は広めに見る
               AxisAlignedBB axisalignedbb1 = entity1.boundingBox.expand(f1, 1.0F, f1);
               MovingObjectPosition movingobjectposition1 = axisalignedbb1.calculateIntercept(vec3, vec31);

               if (movingobjectposition1 != null) {
                  double d1 = vec3.distanceTo(movingobjectposition1.hitVec);

                  if (d1 < d0 || d0 == 0.0D) {
                     // arrowと異なり、あたったEntityすべてをリストに入れる
                     entityList.add(new MovingObjectPosition(entity1));
                     d0 = d1;
                  }
               }
            }
         }
            /* 当たったエンティティそれそれについての判定部分。
             * ここでmovingobjectposition = nullにすることで特定の種類のエンティティに当たらないようにできる。*/
            if (movingobjectposition != null && movingobjectposition.entityHit != null)
            {
                if (movingobjectposition.entityHit instanceof EntityPlayer)
                {
                   //プレイヤーに当たった時
                   EntityPlayer entityplayer = (EntityPlayer)movingobjectposition.entityHit;
 
                    if (entityplayer.capabilities.disableDamage || this.shootingEntity instanceof EntityPlayer &&
                           !((EntityPlayer)this.shootingEntity).canAttackPlayer(entityplayer))
                    {
                       //PvPが許可されていないと当たらない
                        movingobjectposition = null;
                    }
                    else if (entityplayer == this.shootingEntity)
                    {
                       //対象が撃った本人の場合も当たらない
                       movingobjectposition = null;
                    }
                }
                else if (movingobjectposition.entityHit instanceof EntityTameable ||
                             movingobjectposition.entityHit instanceof EntityHorse)
                {
                   //事故防止の為、EntityTameable(犬や猫などのペット)、馬にも当たらないようにする
                   movingobjectposition = null;
                }
                else if (movingobjectposition.entityHit instanceof EntityVillager)
                {
                   //村人に当たった場合にフラグがtrueになる
                   isVillager = true;
                }
            }
         
         float f3;
         
         // 当たったあとの処理
         // まずはリストから
         if (entityList != null && !entityList.isEmpty()) {
            for (MovingObjectPosition target : entityList) {
               if (target != null && target.entityHit != null) {
                  // ダメージは固定
                  int i1 = MathHelper.ceiling_double_int(this.damage);
                  // 0~2程度の乱数値を上乗せ
                  i1 += this.rand.nextInt(3);
                  // 別メソッドでダメージソースを確認(一番下) …ここでは、仮としてLavaに固定にしている
                  DamageSource damagesource = this.thisDamageSource(this.shootingEntity);

                  if (target.entityHit instanceof IProjectile && !(target.entityHit instanceof EntityBullet)) {
                     // 対象が矢などの飛翔Entityの場合、打ち消すことが出来る
                     target.entityHit.setDead();
                  } else {

                     // ダメージを与える
                     if (target.entityHit.attackEntityFrom(damagesource, i1)) {
                        // ダメージを与えることに成功したら以下の処理を行う
                        if (target.entityHit instanceof EntityLivingBase) {
                           EntityLivingBase living = (EntityLivingBase) target.entityHit;

                           // 無敵時間
                           if (this.coolTime > 0) {
                              target.entityHit.hurtResistantTime = coolTime;
                           } else {
                              target.entityHit.hurtResistantTime = 0;
                           }

                           // マルチプレイ時に、両者がプレイヤーだった時のパケット送信処理
                           if (this.shootingEntity != null && target.entityHit != this.shootingEntity
                                 && target.entityHit instanceof EntityPlayer
                                 && this.shootingEntity instanceof EntityPlayerMP) {
                              ((EntityPlayerMP) this.shootingEntity).playerNetServerHandler
                                    .sendPacket(new S2BPacketChangeGameState(6, 0.0F));
                           }
                        }
                     }
                  }
               }
            }
         }
         
      }
   
   
      // ポジションに速度を加算してEntityを移動させる処理。向きも更新。
      this.posX += this.motionX;
      this.posY += this.motionY;
      this.posZ += this.motionZ;
      float f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
      this.rotationYaw = (float) (Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI);
      this.rotationPitch = (float) (Math.atan2(this.motionY, f2) * 180.0D / Math.PI);

      while (this.rotationPitch - this.prevRotationPitch < -180.0F) {
         this.prevRotationPitch -= 360.0F;
      }

      while (this.rotationPitch - this.prevRotationPitch >= 180.0F) {
         this.prevRotationPitch += 360.0F;
      }

      while (this.rotationYaw - this.prevRotationYaw < -180.0F) {
         this.prevRotationYaw -= 360.0F;
      }

      while (this.rotationYaw - this.prevRotationYaw >= 180.0F) {
         this.prevRotationYaw += 360.0F;
      }

      this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F;
      this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F;
   }
   
   public void setCorrosion(boolean b) {
      this.isCorrosion = b;
   }

   public boolean getCorrosion() {
      return this.isCorrosion;
   }
   
   /* ダメージソースのタイプ */
   public DamageSource thisDamageSource(Entity entity) {
      return isCorrosion ? DamageSource.generic : DamageSource.generic;
   }
}
   


弾のレンダー
コード: 全て選択
package hnst.hnstguns.client.model;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import hnst.hnstguns.entity.EntityBullet;
import net.minecraft.client.model.ModelBase;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.entity.Entity;
import net.minecraft.util.MathHelper;
import net.minecraft.util.ResourceLocation;
 
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
 
@SideOnly(Side.CLIENT)
public class RenderBullet extends Render
{
    private static final ResourceLocation bulletTextures = new ResourceLocation("textures/items/Bullet.png");
 
    protected ModelBase modelBullet;
 
    public RenderBullet(ModelBase par1ModelBase) {
      super();
      this.modelBullet = par1ModelBase;
      this.shadowSize = 0.0F;
   }
 
   public void renderArrow(EntityBullet par1Entity, double par2, double par4, double par6, float par8, float par9)
    {
        ModelBullet model = (ModelBullet) this.modelBullet;
 
      this.bindEntityTexture(par1Entity);
        GL11.glPushMatrix();
        GL11.glDisable(GL11.GL_LIGHTING);
        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
        GL11.glColor4f(2.0F, 2.0F, 2.0F, 1.0F);
        GL11.glTranslatef((float)par2, (float)par4 + 1.0F, (float)par6);
        GL11.glRotatef(par1Entity.prevRotationYaw + (par1Entity.rotationYaw - par1Entity.prevRotationYaw) * par9, 0.0F, 1.0F, 0.0F);
        GL11.glRotatef(par1Entity.prevRotationPitch + (par1Entity.rotationPitch - par1Entity.prevRotationPitch) * par9, 0.0F, 0.0F, 1.0F);
        GL11.glScalef(1.0F, -1.0F, -1.0F);
        model.render(par1Entity, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F);
        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
        GL11.glEnable(GL11.GL_LIGHTING);
        GL11.glPopMatrix();
    }
 
    protected ResourceLocation getArrowTextures(EntityBullet par1EntityArrow)
    {
        return bulletTextures;
    }
 
    protected ResourceLocation getEntityTexture(Entity par1Entity)
    {
        return this.getArrowTextures((EntityBullet)par1Entity);
    }
 
    public void doRender(Entity par1Entity, double par2, double par4, double par6, float par8, float par9)
    {
        this.renderArrow((EntityBullet)par1Entity, par2, par4, par6, par8, par9);
    }
}


弾のモデル
コード: 全て選択
package hnst.hnstguns.client.model;

import net.minecraft.client.model.ModelBase;
import net.minecraft.client.model.ModelRenderer;
import net.minecraft.entity.Entity;

public class ModelBullet extends ModelBase
{
     //fields
       ModelRenderer Shape1;
    
     public ModelBullet()
     {
       textureWidth = 32;
       textureHeight = 32;
      
         Shape1 = new ModelRenderer(this, 0, 0);
         Shape1.addBox(-0.5333334F, 0F, -1.5F, 1, 1, 3);
         Shape1.setRotationPoint(0F, 16F, 0F);
         Shape1.setTextureSize(64, 32);
         Shape1.mirror = true;
         setRotation(Shape1, 0F, 0F, 0F);
     }
    
     public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5)
     {
       super.render(entity, f, f1, f2, f3, f4, f5);
       setRotationAngles(f, f1, f2, f3, f4, f5, entity);
       Shape1.render(f5);
     }
    
     private void setRotation(ModelRenderer model, float x, float y, float z)
     {
       model.rotateAngleX = x;
       model.rotateAngleY = y;
       model.rotateAngleZ = z;
     }
    
     public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity)
     {
       super.setRotationAngles(f, f1, f2, f3, f4, f5, entity);
     }

   }



銃クラス
コード: 全て選択
package hnst.hnstguns.item;

import java.util.List;

import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Items;
import net.minecraft.item.ItemBow;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import hnst.hnstguns.entity.EntityBullet;
import org.lwjgl.input.Mouse;

public class Itemgun extends ItemBow {
   
   protected int magazine = 60;
   protected int magazineMAX = 60;
   protected boolean leftClickFire;

   public void ItemgunsClone() {
      // スタックサイズ上限。スタック出来ないようにするので1にする。
      this.setMaxStackSize(1);
      // 耐久値がないとエンチャントできないと判明したので、気持ちだけ付けた
      this.setMaxDamage(10);
      // クラフトでの修理を不可に。
      this.setNoRepair();
   }
   
   // Icon用テクスチャファイルの指定はここで行う。
   // ItemBowクラスでも、このメソッドでテクスチャパスを指定しているため、
   // オーバーライドして上書きしなければならない。(コンストラクタでのテクスチャパス指定は推奨しない。)
   @Override
   @SideOnly(Side.CLIENT)
   public void registerIcons(IIconRegister par1IconRegister) {
      this.itemIcon = par1IconRegister.registerIcon("hnstguns:MA5");
   }

    // 手に持ったときの見た目が変わります。IItemRenderer調整時にも影響します。
    @Override
   @SideOnly(Side.CLIENT)
   public boolean isFull3D() {
      return true;
   }
   
   // 耐久値を減らそうとする処理が呼ばれた場合に握りつぶす。アイテムロストなどの事故防止。
   @Override
   public void setDamage(ItemStack stack, int damage) {
      return;
   }
   

   // このメソッドは、プレイヤーがブロックをターゲットしていないときに呼ばれる方のRightClickメソッド。
      @Override
      public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) {
            
         // クリエイティブモードか
         boolean creative = par3EntityPlayer.capabilities.isCreativeMode;

         // マガジンが空でないかどうか
         boolean hasCharge = false;
         if (par1ItemStack.getItem() == this) {
            // 弾薬減少処理。第三引数のbooleanをfalseにすると、実際には減らさないシミュレーション処理になる
            int c2 = this.discharge(par1ItemStack, 1, false);
            if (c2 > 0) {
               hasCharge = true;
               this.discharge(par1ItemStack, 1, true);
            }
         }
         // 消費できる弾があったら実行
         if (creative || hasCharge) {
            // ダメージ量
            float dam = 2.0F;
            int cooltime = 0; // 一旦凍結。常に0を入れる
            // 弾速
            float speed = 1.0F;

            // ランダムに速度を変えながら、同時に[del]4[/del]1発ずつ発射する。
            for (int i = 0; i < 1; i++) {
               float f = speed * (i * 0.35F) ;
               // 生成
               EntityBullet bullet = new EntityBullet(par2World, par3EntityPlayer, f, 0.0F, dam, 0.0F, 0.1F, 0.0F, cooltime);
                 // ↓プログラムがここに来ているかの確認用の音再生
               // par2World.playSoundAtEntity(par3EntityPlayer, "mob.villager.idle", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + f * 0.5F);
               // Entityのスポーン処理はisRemote判定を利用してサーバー側のみで行うこと!
               if (!par2World.isRemote) {
                  par2World.spawnEntityInWorld(bullet);
               }
            }
         } else {
            // この処理に飛んでいるということは弾切れなので、弾薬を補充する処理をする
            // 今はまだ弾薬アイテムを追加前なので、仮のアイテムを消費させておく
            if (par3EntityPlayer.inventory.hasItem(Items.gunpowder)) {
               
               
               // 弾薬補充処理。マガジンはNBTタグに入っている
               NBTTagCompound nbt = par1ItemStack.getTagCompound();
               if (nbt == null) {
                  nbt = new NBTTagCompound();
               }
               nbt.setInteger("magazine", magazineMAX);
               par1ItemStack.setTagCompound(nbt);
               // playerのインベントリの弾薬アイテムを減らす。この処理はInventoryPlayerの既存処理を利用している。
               par3EntityPlayer.inventory.consumeInventoryItem(Items.gunpowder);

               // バニラのドアガチャSEのピッチを弄って、それっぽくしている
               par2World.playSoundAtEntity(par3EntityPlayer, "random.door_close", 1.0F,
                     1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + 1.3F);
            }
         }
         return par1ItemStack;
      }
      
      // onEatenのほうの右クリック処理ではそのままItemStackを返す(つまりなにもしない)
      @Override
      public ItemStack onEaten(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) {
         return par1ItemStack;
      }
      
      // onItemRightClickで呼んでいる弾の消費処理
      // 今は使っていないが、弾薬を2以上減らす場合にも応用できるようにしている
      public int discharge(ItemStack item, int amount, boolean flag) {

         if (item == null)
            return 0;

         // NBTに入れている弾の数が足りているかの判定と、第三引数がtrueなら減少させている
         NBTTagCompound nbt = item.getTagCompound();
         int charge = 0;
         int reduce = 0;
         if (nbt != null && nbt.hasKey("magazine")) {
            charge = nbt.getInteger("magazine");
         }

         reduce = Math.min(amount, charge);

         if (flag) {
            if (nbt != null) {
               nbt.setInteger("magazine", (charge - reduce));
               item.setTagCompound(nbt);
            } else {
               NBTTagCompound nbt2 = new NBTTagCompound();
               nbt2.setInteger("magazine", (charge - reduce));
               item.setTagCompound(nbt2);
            }
         }

         return reduce;
      }
      // マウスオーバー時の表示情報。マガジンの残量/MAXを表示している。
      @Override
      @SideOnly(Side.CLIENT)
      public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) {
         super.addInformation(par1ItemStack, par2EntityPlayer, par3List, par4);
         NBTTagCompound nbt = par1ItemStack.getTagCompound();
         int charge = 0;
         int max = magazineMAX;
         if (nbt != null && nbt.hasKey("magazine")) {
            charge = nbt.getInteger("magazine");
         }

         String s = new String("magazine : " + charge + "/" + max);
         par3List.add(s);
      }

      // 耐久値ゲージを表示するかどうかのフラグ
      @Override
      public boolean showDurabilityBar(ItemStack stack) {
         return true;
      }

      // このメソッドで耐久値の代わりに弾の残量をゲージ表示できるようにしている。
      // 0.0Dを返したときがMAXで、1.0Dを返すとゲージがなくなったように見える。よって、MAX - 残量 を計算して返している。
      @Override
      public double getDurabilityForDisplay(ItemStack stack) {
         NBTTagCompound nbt = stack.getTagCompound();
         int charge = 0;
         int max = magazineMAX;
         if (nbt != null && nbt.hasKey("magazine")) {
            charge = nbt.getInteger("magazine");
            charge = MathHelper.clamp_int(charge, 0, max);
         }

         int i = max - charge;
         return (double) i / (double) max;
      }
}


クラッシュレポート
---- Minecraft Crash Report ----
// My bad.

Time: 17/10/22 14:55
Description: Rendering entity in world

java.lang.NullPointerException: Rendering entity in world
at hnst.hnstguns.client.model.RenderBullet.renderArrow(RenderBullet.java:42)
at hnst.hnstguns.client.model.RenderBullet.doRender(RenderBullet.java:60)
at net.minecraft.client.renderer.entity.RenderManager.func_147939_a(RenderManager.java:300)
at net.minecraft.client.renderer.entity.RenderManager.renderEntityStatic(RenderManager.java:278)
at net.minecraft.client.renderer.entity.RenderManager.renderEntitySimple(RenderManager.java:251)
at net.minecraft.client.renderer.RenderGlobal.renderEntities(RenderGlobal.java:527)
at net.minecraft.client.renderer.EntityRenderer.renderWorld(EntityRenderer.java:1300)
at net.minecraft.client.renderer.EntityRenderer.updateCameraAndRender(EntityRenderer.java:1087)
at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1067)
at net.minecraft.client.Minecraft.run(Minecraft.java:962)
at net.minecraft.client.main.Main.main(Main.java:164)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
at net.minecraftforge.gradle.GradleStartCommon.launch(Unknown Source)
at GradleStart.main(Unknown Source)


A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------

-- Head --
Stacktrace:
at hnst.hnstguns.client.model.RenderBullet.renderArrow(RenderBullet.java:42)
at hnst.hnstguns.client.model.RenderBullet.doRender(RenderBullet.java:60)

-- Entity being rendered --
Details:
Entity Type: hnstguns.hnstguns.entity_bullet (hnst.hnstguns.entity.EntityBullet)
Entity ID: 3084
Entity Name: entity.hnstguns.hnstguns.entity_bullet.name
Entity's Exact location: 193.66, 71.66, 211.78
Entity's Block location: World: (193,71,211), Chunk: (at 1,4,3 in 12,13; contains blocks 192,0,208 to 207,255,223), Region: (0,0; contains chunks 0,0 to 31,31, blocks 0,0,0 to 511,255,511)
Entity's Momentum: 0.00, 0.00, 0.00

-- Renderer details --
Details:
Assigned renderer: hnst.hnstguns.client.model.RenderBullet@6106138a
Location: -0.84,0.04,-0.72 - World: (-1,0,-1), Chunk: (at 15,0,15 in -1,-1; contains blocks -16,0,-16 to -1,255,-1), Region: (-1,-1; contains chunks -32,-32 to -1,-1, blocks -512,0,-512 to -1,255,-1)
Rotation: 0.0
Delta: 0.17198801
Stacktrace:
at net.minecraft.client.renderer.entity.RenderManager.func_147939_a(RenderManager.java:300)
at net.minecraft.client.renderer.entity.RenderManager.renderEntityStatic(RenderManager.java:278)
at net.minecraft.client.renderer.entity.RenderManager.renderEntitySimple(RenderManager.java:251)
at net.minecraft.client.renderer.RenderGlobal.renderEntities(RenderGlobal.java:527)
at net.minecraft.client.renderer.EntityRenderer.renderWorld(EntityRenderer.java:1300)

-- Affected level --
Details:
Level name: MpServer
All players: 1 total; [EntityClientPlayerMP['Player666'/207, l='MpServer', x=194.50, y=71.62, z=212.50]]
Chunk stats: MultiplayerChunkCache: 497, 497
Level seed: 0
Level generator: ID 00 - default, ver 1. Features enabled: false
Level generator options:
Level spawn location: World: (196,64,220), Chunk: (at 4,4,12 in 12,13; contains blocks 192,0,208 to 207,255,223), Region: (0,0; contains chunks 0,0 to 31,31, blocks 0,0,0 to 511,255,511)
Level time: 142 game time, 142 day time
Level dimension: 0
Level storage version: 0x00000 - Unknown?
Level weather: Rain time: 0 (now: false), thunder time: 0 (now: false)
Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: false
Forced entities: 214 total; [EntityZombie['ゾンビ'/518, l='MpServer', x=226.50, y=18.00, z=258.50], EntityBullet['entity.hnstguns.hnstguns.entity_bullet.name'/3084, l='MpServer', x=193.66, y=71.66, z=211.78], EntityCreeper['クリーパー'/553, l='MpServer', x=135.50, y=21.00, z=194.50], EntityCreeper['クリーパー'/555, l='MpServer', x=220.50, y=58.00, z=189.50], EntityWolf['オオカミ'/43, l='MpServer', x=132.50, y=67.00, z=133.50], EntityCreeper['クリーパー'/556, l='MpServer', x=222.50, y=58.00, z=188.50], EntityWolf['オオカミ'/44, l='MpServer', x=133.50, y=68.00, z=153.50], EntityCreeper['クリーパー'/557, l='MpServer', x=220.50, y=58.00, z=190.50], EntityWolf['オオカミ'/45, l='MpServer', x=132.50, y=68.00, z=155.50], EntitySkeleton['スケルトン'/558, l='MpServer', x=217.50, y=58.00, z=187.50], EntityWolf['オオカミ'/46, l='MpServer', x=131.50, y=68.00, z=153.50], EntityCreeper['クリーパー'/559, l='MpServer', x=217.50, y=58.00, z=189.50], EntityWolf['オオカミ'/47, l='MpServer', x=127.50, y=69.00, z=153.50], EntityWolf['オオカミ'/48, l='MpServer', x=139.88, y=73.00, z=179.50], EntityWolf['オオカミ'/49, l='MpServer', x=140.63, y=72.00, z=175.31], EntityWolf['オオカミ'/50, l='MpServer', x=139.50, y=72.00, z=173.50], EntityWolf['オオカミ'/51, l='MpServer', x=139.50, y=72.00, z=176.50], EntityPig['ブタ'/52, l='MpServer', x=149.50, y=79.00, z=222.50], EntityPig['ブタ'/53, l='MpServer', x=146.50, y=78.00, z=224.50], EntityPig['ブタ'/54, l='MpServer', x=146.50, y=78.00, z=222.50], EntityPig['ブタ'/55, l='MpServer', x=146.50, y=78.00, z=224.50], EntitySheep['ヒツジ'/56, l='MpServer', x=144.22, y=66.00, z=272.50], EntitySheep['ヒツジ'/57, l='MpServer', x=145.53, y=67.00, z=272.50], EntitySheep['ヒツジ'/58, l='MpServer', x=144.50, y=70.00, z=275.50], EntitySheep['ヒツジ'/59, l='MpServer', x=143.50, y=70.00, z=277.50], EntitySheep['ヒツジ'/68, l='MpServer', x=154.50, y=68.00, z=288.50], EntitySheep['ヒツジ'/69, l='MpServer', x=153.50, y=65.00, z=289.50], EntityWolf['オオカミ'/70, l='MpServer', x=170.50, y=76.00, z=150.50], EntityWolf['オオカミ'/71, l='MpServer', x=168.50, y=76.00, z=150.50], EntityWolf['オオカミ'/72, l='MpServer', x=169.50, y=76.00, z=150.50], EntityWolf['オオカミ'/73, l='MpServer', x=169.50, y=79.00, z=148.50], EntitySheep['ヒツジ'/78, l='MpServer', x=199.50, y=83.00, z=275.50], EntitySheep['ヒツジ'/79, l='MpServer', x=199.50, y=83.00, z=275.50], EntitySheep['ヒツジ'/80, l='MpServer', x=197.78, y=83.00, z=275.22], EntitySheep['ヒツジ'/81, l='MpServer', x=196.19, y=83.00, z=276.81], EntitySheep['ヒツジ'/84, l='MpServer', x=213.78, y=72.00, z=181.22], EntitySheep['ヒツジ'/85, l='MpServer', x=214.50, y=83.00, z=188.50], EntitySheep['ヒツジ'/86, l='MpServer', x=214.50, y=83.00, z=188.50], EntitySheep['ヒツジ'/87, l='MpServer', x=212.50, y=82.00, z=188.50], EntityCreeper['クリーパー'/615, l='MpServer', x=145.50, y=28.00, z=172.50], EntityWolf['オオカミ'/111, l='MpServer', x=261.50, y=63.00, z=146.50], EntityWolf['オオカミ'/112, l='MpServer', x=262.50, y=63.00, z=148.50], EntityWolf['オオカミ'/113, l='MpServer', x=262.50, y=63.00, z=146.50], EntityWolf['オオカミ'/114, l='MpServer', x=258.50, y=63.00, z=148.50], EntityCow['ウシ'/115, l='MpServer', x=253.50, y=63.00, z=148.50], EntityCow['ウシ'/116, l='MpServer', x=254.78, y=65.00, z=149.91], EntityCreeper['クリーパー'/1140, l='MpServer', x=179.50, y=15.00, z=139.50], EntityCow['ウシ'/117, l='MpServer', x=253.47, y=66.00, z=151.53], EntityCreeper['クリーパー'/1141, l='MpServer', x=173.76, y=17.04, z=134.33], EntityCow['ウシ'/118, l='MpServer', x=254.66, y=66.00, z=151.53], EntityWolf['オオカミ'/119, l='MpServer', x=267.50, y=64.00, z=148.50], EntityWolf['オオカミ'/122, l='MpServer', x=272.50, y=66.00, z=151.50], EntityFallingBlock['落下中のブロック'/2685, l='MpServer', x=308.50, y=19.99, z=103.50], EntityFallingBlock['落下中のブロック'/2686, l='MpServer', x=309.50, y=19.99, z=103.50], EntityFallingBlock['落下中のブロック'/2687, l='MpServer', x=310.50, y=20.99, z=103.50], EntityCreeper['クリーパー'/1164, l='MpServer', x=239.50, y=69.00, z=268.50], EntitySkeleton['スケルトン'/1167, l='MpServer', x=140.50, y=19.00, z=199.50], EntityFallingBlock['落下中のブロック'/2707, l='MpServer', x=308.50, y=48.64, z=222.50], EntityFallingBlock['落下中のブロック'/2708, l='MpServer', x=308.50, y=48.64, z=223.50], EntityFallingBlock['落下中のブロック'/2709, l='MpServer', x=309.50, y=48.64, z=222.50], EntityFallingBlock['落下中のブロック'/2710, l='MpServer', x=309.50, y=48.64, z=223.50], EntitySkeleton['スケルトン'/663, l='MpServer', x=221.50, y=28.00, z=282.50], EntitySkeleton['スケルトン'/1175, l='MpServer', x=241.50, y=37.00, z=211.50], EntityFallingBlock['落下中のブロック'/2711, l='MpServer', x=306.50, y=48.64, z=221.50], EntitySkeleton['スケルトン'/664, l='MpServer', x=222.50, y=28.00, z=279.50], EntityFallingBlock['落下中のブロック'/2712, l='MpServer', x=306.50, y=48.64, z=222.50], EntityZombie['ゾンビ'/665, l='MpServer', x=220.50, y=28.00, z=283.50], EntityFallingBlock['落下中のブロック'/2713, l='MpServer', x=306.50, y=48.64, z=223.50], EntityFallingBlock['落下中のブロック'/2714, l='MpServer', x=307.50, y=48.64, z=221.50], EntityFallingBlock['落下中のブロック'/2715, l='MpServer', x=307.50, y=48.64, z=222.50], EntityFallingBlock['落下中のブロック'/2716, l='MpServer', x=307.50, y=48.64, z=223.50], EntityFallingBlock['落下中のブロック'/2717, l='MpServer', x=305.50, y=48.64, z=221.50], EntityFallingBlock['落下中のブロック'/2718, l='MpServer', x=305.50, y=48.64, z=222.50], EntityFallingBlock['落下中のブロック'/2719, l='MpServer', x=304.50, y=48.64, z=222.50], EntityFallingBlock['落下中のブロック'/2733, l='MpServer', x=297.50, y=81.68, z=235.50], EntityFallingBlock['落下中のブロック'/2735, l='MpServer', x=294.50, y=80.68, z=236.50], EntityFallingBlock['落下中のブロック'/2736, l='MpServer', x=295.50, y=82.68, z=236.50], EntityFallingBlock['落下中のブロック'/2738, l='MpServer', x=294.50, y=82.68, z=237.50], EntityZombie['ゾンビ'/715, l='MpServer', x=217.63, y=30.35, z=268.27], EntityChicken['ニワトリ'/716, l='MpServer', x=217.53, y=30.00, z=268.28], EntityZombie['ゾンビ'/717, l='MpServer', x=220.50, y=27.00, z=273.50], EntityFallingBlock['落下中のブロック'/2776, l='MpServer', x=325.50, y=37.03, z=118.50], EntityFallingBlock['落下中のブロック'/2777, l='MpServer', x=324.50, y=37.03, z=118.50], EntityFallingBlock['落下中のブロック'/2778, l='MpServer', x=325.50, y=36.03, z=119.50], EntityFallingBlock['落下中のブロック'/2779, l='MpServer', x=326.50, y=37.03, z=118.50], EntityFallingBlock['落下中のブロック'/2780, l='MpServer', x=325.50, y=37.03, z=117.50], EntityFallingBlock['落下中のブロック'/2781, l='MpServer', x=324.50, y=37.03, z=117.50], EntityFallingBlock['落下中のブロック'/2782, l='MpServer', x=326.50, y=36.03, z=119.50], EntityFallingBlock['落下中のブロック'/2783, l='MpServer', x=326.50, y=38.03, z=117.50], EntityFallingBlock['落下中のブロック'/2784, l='MpServer', x=323.50, y=37.03, z=117.50], EntityFallingBlock['落下中のブロック'/2785, l='MpServer', x=324.50, y=37.03, z=116.50], EntityFallingBlock['落下中のブロック'/2786, l='MpServer', x=325.50, y=38.03, z=116.50], EntityFallingBlock['落下中のブロック'/2787, l='MpServer', x=326.50, y=38.03, z=116.50], EntityFallingBlock['落下中のブロック'/2788, l='MpServer', x=323.50, y=37.03, z=115.50], EntitySkeleton['スケルトン'/229, l='MpServer', x=245.50, y=23.00, z=284.50], EntityFallingBlock['落下中のブロック'/2789, l='MpServer', x=323.50, y=37.03, z=116.50], EntitySkeleton['スケルトン'/230, l='MpServer', x=248.50, y=23.00, z=283.50], EntityFallingBlock['落下中のブロック'/2790, l='MpServer', x=324.50, y=38.03, z=115.50], EntitySpider['クモ'/231, l='MpServer', x=244.88, y=23.00, z=282.01], EntityFallingBlock['落下中のブロック'/2791, l='MpServer', x=325.50, y=38.03, z=115.50], EntityFallingBlock['落下中のブロック'/2792, l='MpServer', x=326.50, y=38.03, z=115.50], EntityFallingBlock['落下中のブロック'/2793, l='MpServer', x=324.50, y=37.03, z=114.50], EntityFallingBlock['落下中のブロック'/2794, l='MpServer', x=325.50, y=37.03, z=114.50], EntityFallingBlock['落下中のブロック'/2795, l='MpServer', x=322.50, y=37.03, z=115.50], EntityFallingBlock['落下中のブロック'/2796, l='MpServer', x=323.50, y=37.03, z=114.50], EntityFallingBlock['落下中のブロック'/2797, l='MpServer', x=324.50, y=37.03, z=113.50], EntityFallingBlock['落下中のブロック'/2798, l='MpServer', x=325.50, y=37.03, z=113.50], EntityFallingBlock['落下中のブロック'/2799, l='MpServer', x=326.50, y=37.03, z=114.50], EntityFallingBlock['落下中のブロック'/2800, l='MpServer', x=323.50, y=37.03, z=113.50], EntityFallingBlock['落下中のブロック'/2801, l='MpServer', x=323.50, y=37.03, z=112.50], EntityFallingBlock['落下中のブロック'/2802, l='MpServer', x=324.50, y=37.03, z=112.50], EntityFallingBlock['落下中のブロック'/2807, l='MpServer', x=316.50, y=35.03, z=108.50], EntityFallingBlock['落下中のブロック'/2809, l='MpServer', x=317.50, y=36.03, z=107.50], EntityFallingBlock['落下中のブロック'/2810, l='MpServer', x=317.50, y=36.03, z=108.50], EntityFallingBlock['落下中のブロック'/2812, l='MpServer', x=318.50, y=36.03, z=107.50], EntityFallingBlock['落下中のブロック'/2813, l='MpServer', x=315.50, y=35.03, z=108.50], EntityFallingBlock['落下中のブロック'/2814, l='MpServer', x=316.50, y=36.03, z=109.50], EntityFallingBlock['落下中のブロック'/2815, l='MpServer', x=317.50, y=36.03, z=109.50], EntityFallingBlock['落下中のブロック'/2816, l='MpServer', x=315.50, y=36.03, z=109.50], EntitySkeleton['スケルトン'/1286, l='MpServer', x=218.50, y=13.00, z=251.50], EntitySkeleton['スケルトン'/1287, l='MpServer', x=218.10, y=13.00, z=252.44], EntityBat['コウモリ'/264, l='MpServer', x=205.47, y=21.77, z=275.84], EntitySkeleton['スケルトン'/1288, l='MpServer', x=211.50, y=13.00, z=251.50], EntityBat['コウモリ'/265, l='MpServer', x=205.00, y=18.92, z=268.42], EntitySkeleton['スケルトン'/1289, l='MpServer', x=211.50, y=13.00, z=252.50], EntityCreeper['クリーパー'/778, l='MpServer', x=182.50, y=19.00, z=242.50], EntityZombie['ゾンビ'/1290, l='MpServer', x=228.50, y=13.00, z=242.50], EntityBat['コウモリ'/267, l='MpServer', x=206.60, y=19.66, z=272.42], EntityCreeper['クリーパー'/1291, l='MpServer', x=219.50, y=13.00, z=248.50], EntityClientPlayerMP['Player666'/207, l='MpServer', x=194.50, y=71.62, z=212.50], EntityFallingBlock['落下中のブロック'/2862, l='MpServer', x=320.50, y=15.43, z=112.50], EntityFallingBlock['落下中のブロック'/2863, l='MpServer', x=320.50, y=15.43, z=111.50], EntityFallingBlock['落下中のブロック'/2864, l='MpServer', x=320.50, y=15.43, z=110.50], EntityFallingBlock['落下中のブロック'/2865, l='MpServer', x=319.50, y=15.43, z=110.50], EntityFallingBlock['落下中のブロック'/2866, l='MpServer', x=320.50, y=15.43, z=109.50], EntityFallingBlock['落下中のブロック'/2867, l='MpServer', x=319.50, y=15.43, z=109.50], EntityFallingBlock['落下中のブロック'/2868, l='MpServer', x=318.50, y=15.43, z=109.50], EntityFallingBlock['落下中のブロック'/2869, l='MpServer', x=318.50, y=15.43, z=110.50], EntityFallingBlock['落下中のブロック'/2870, l='MpServer', x=319.50, y=15.43, z=108.50], EntityFallingBlock['落下中のブロック'/2871, l='MpServer', x=320.50, y=14.43, z=108.50], EntitySkeleton['スケルトン'/824, l='MpServer', x=126.50, y=25.00, z=235.50], EntityFallingBlock['落下中のブロック'/2872, l='MpServer', x=318.50, y=15.43, z=108.50], EntitySkeleton['スケルトン'/825, l='MpServer', x=128.50, y=25.00, z=236.50], EntityFallingBlock['落下中のブロック'/2873, l='MpServer', x=315.50, y=36.43, z=193.50], EntityCreeper['クリーパー'/840, l='MpServer', x=136.50, y=22.00, z=257.50], EntityFallingBlock['落下中のブロック'/2891, l='MpServer', x=325.50, y=13.79, z=206.50], EntityFallingBlock['落下中のブロック'/2892, l='MpServer', x=326.50, y=13.79, z=205.50], EntityFallingBlock['落下中のブロック'/2893, l='MpServer', x=326.50, y=13.79, z=206.50], EntityFallingBlock['落下中のブロック'/2894, l='MpServer', x=324.50, y=12.79, z=207.50], EntityFallingBlock['落下中のブロック'/2895, l='MpServer', x=324.50, y=13.79, z=206.50], EntityFallingBlock['落下中のブロック'/2896, l='MpServer', x=325.50, y=13.79, z=205.50], EntityFallingBlock['落下中のブロック'/2897, l='MpServer', x=323.50, y=12.79, z=206.50], EntityFallingBlock['落下中のブロック'/2898, l='MpServer', x=323.50, y=12.79, z=207.50], EntityFallingBlock['落下中のブロック'/2899, l='MpServer', x=324.50, y=13.79, z=205.50], EntityFallingBlock['落下中のブロック'/2900, l='MpServer', x=322.50, y=12.79, z=206.50], EntityFallingBlock['落下中のブロック'/2901, l='MpServer', x=323.50, y=12.79, z=205.50], EntityFallingBlock['落下中のブロック'/2902, l='MpServer', x=322.50, y=11.70, z=207.50], EntityFallingBlock['落下中のブロック'/2903, l='MpServer', x=321.50, y=11.70, z=206.50], EntityFallingBlock['落下中のブロック'/2904, l='MpServer', x=321.50, y=11.70, z=207.50], EntityFallingBlock['落下中のブロック'/2905, l='MpServer', x=322.50, y=11.70, z=205.50], EntityFallingBlock['落下中のブロック'/2907, l='MpServer', x=316.50, y=19.79, z=213.50], EntityFallingBlock['落下中のブロック'/2930, l='MpServer', x=323.50, y=103.13, z=292.50], EntityFallingBlock['落下中のブロック'/2935, l='MpServer', x=334.50, y=15.92, z=96.50], EntityFallingBlock['落下中のブロック'/2936, l='MpServer', x=335.50, y=15.92, z=97.50], EntitySkeleton['スケルトン'/377, l='MpServer', x=212.50, y=12.00, z=159.50], EntityFallingBlock['落下中のブロック'/2937, l='MpServer', x=333.50, y=15.92, z=95.50], EntityZombie['ゾンビ'/1410, l='MpServer', x=221.50, y=43.00, z=168.50], EntitySkeleton['スケルトン'/1411, l='MpServer', x=120.50, y=63.00, z=249.50], EntityWitch['ウィッチ'/1412, l='MpServer', x=114.92, y=62.00, z=251.83], EntityFallingBlock['落下中のブロック'/2957, l='MpServer', x=336.50, y=89.11, z=209.50], EntityFallingBlock['落下中のブロック'/2958, l='MpServer', x=337.50, y=90.11, z=208.50], EntityFallingBlock['落下中のブロック'/2959, l='MpServer', x=335.50, y=92.11, z=208.50], EntityZombie['ゾンビ'/1448, l='MpServer', x=171.50, y=30.00, z=279.50], EntityZombie['ゾンビ'/1449, l='MpServer', x=172.50, y=30.00, z=281.50], EntitySkeleton['スケルトン'/1450, l='MpServer', x=171.50, y=30.00, z=287.50], EntitySkeleton['スケルトン'/1451, l='MpServer', x=172.50, y=30.00, z=288.50], EntityZombie['ゾンビ'/444, l='MpServer', x=137.50, y=22.00, z=204.50], EntityCreeper['クリーパー'/461, l='MpServer', x=196.50, y=58.00, z=183.50], EntityBat['コウモリ'/464, l='MpServer', x=123.00, y=23.37, z=224.54], EntityBat['コウモリ'/466, l='MpServer', x=116.57, y=13.03, z=229.24], EntityFallingBlock['落下中のブロック'/3027, l='MpServer', x=335.50, y=25.26, z=204.50], EntityZombie['ゾンビ'/980, l='MpServer', x=140.50, y=18.00, z=186.50], EntityFallingBlock['落下中のブロック'/3028, l='MpServer', x=334.50, y=24.26, z=207.50], EntityFallingBlock['落下中のブロック'/3029, l='MpServer', x=334.50, y=25.26, z=206.50], EntityFallingBlock['落下中のブロック'/3030, l='MpServer', x=335.50, y=24.26, z=207.50], EntityCreeper['クリーパー'/983, l='MpServer', x=115.50, y=23.00, z=196.84], EntityFallingBlock['落下中のブロック'/3031, l='MpServer', x=335.50, y=25.26, z=206.50], EntityZombie['ゾンビ'/984, l='MpServer', x=246.50, y=21.00, z=264.50], EntityFallingBlock['落下中のブロック'/3032, l='MpServer', x=336.50, y=23.26, z=207.50], EntityZombie['ゾンビ'/985, l='MpServer', x=250.50, y=21.00, z=267.50], EntityFallingBlock['落下中のブロック'/3033, l='MpServer', x=334.50, y=23.26, z=208.50], EntityFallingBlock['落下中のブロック'/3034, l='MpServer', x=333.50, y=24.26, z=208.50], EntityFallingBlock['落下中のブロック'/3035, l='MpServer', x=335.50, y=22.26, z=208.50], EntityFallingBlock['落下中のブロック'/3036, l='MpServer', x=336.50, y=23.26, z=208.50], EntityFallingBlock['落下中のブロック'/3037, l='MpServer', x=333.50, y=23.26, z=209.50], EntityFallingBlock['落下中のブロック'/3038, l='MpServer', x=333.50, y=22.26, z=210.50], EntityFallingBlock['落下中のブロック'/3039, l='MpServer', x=338.50, y=10.23, z=245.50], EntityFallingBlock['落下中のブロック'/3040, l='MpServer', x=337.50, y=10.23, z=244.50], EntityFallingBlock['落下中のブロック'/3041, l='MpServer', x=338.50, y=9.23, z=243.50], EntityFallingBlock['落下中のブロック'/3042, l='MpServer', x=336.50, y=10.23, z=244.50], EntityFallingBlock['落下中のブロック'/3043, l='MpServer', x=335.50, y=9.23, z=243.50], EntityFallingBlock['落下中のブロック'/3044, l='MpServer', x=336.50, y=10.23, z=243.50], EntityFallingBlock['落下中のブロック'/3045, l='MpServer', x=337.50, y=10.23, z=243.50], EntitySkeleton['スケルトン'/1510, l='MpServer', x=167.50, y=30.00, z=275.50], EntityFallingBlock['落下中のブロック'/3046, l='MpServer', x=336.50, y=10.23, z=242.50], EntitySkeleton['スケルトン'/1511, l='MpServer', x=169.50, y=30.00, z=277.50], EntityFallingBlock['落下中のブロック'/3047, l='MpServer', x=337.50, y=10.23, z=242.50], EntityFallingBlock['落下中のブロック'/3048, l='MpServer', x=335.50, y=10.23, z=242.50], EntityFallingBlock['落下中のブロック'/3049, l='MpServer', x=336.50, y=10.23, z=241.50], EntityFallingBlock['落下中のブロック'/3050, l='MpServer', x=338.50, y=9.23, z=242.50], EntityFallingBlock['落下中のブロック'/3051, l='MpServer', x=334.50, y=8.23, z=242.50], EntityFallingBlock['落下中のブロック'/3052, l='MpServer', x=335.50, y=9.23, z=240.50], EntityFallingBlock['落下中のブロック'/3053, l='MpServer', x=335.50, y=10.23, z=241.50], EntityFallingBlock['落下中のブロック'/3054, l='MpServer', x=327.50, y=39.26, z=234.50]]
Retry entities: 0 total; []
Server brand: fml,forge
Server type: Integrated singleplayer server
Stacktrace:
at net.minecraft.client.multiplayer.WorldClient.addWorldInfoToCrashReport(WorldClient.java:415)
at net.minecraft.client.Minecraft.addGraphicsAndWorldToCrashReport(Minecraft.java:2566)
at net.minecraft.client.Minecraft.run(Minecraft.java:984)
at net.minecraft.client.main.Main.main(Main.java:164)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
at net.minecraftforge.gradle.GradleStartCommon.launch(Unknown Source)
at GradleStart.main(Unknown Source)

-- System Details --
Details:
Minecraft Version: 1.7.10
Operating System: Windows 10 (amd64) version 10.0
Java Version: 1.8.0_144, Oracle Corporation
Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
Memory: 673805088 bytes (642 MB) / 1037959168 bytes (989 MB) up to 1037959168 bytes (989 MB)
JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M
AABB Pool Size: 0 (0 bytes; 0 MB) allocated, 0 (0 bytes; 0 MB) used
IntCache: cache: 0, tcache: 0, allocated: 13, tallocated: 95
FML: MCP v9.05 FML v7.10.99.99 Minecraft Forge 10.13.4.1614 4 mods loaded, 4 mods active
States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored
UCHIJAAAA mcp{9.05} [Minecraft Coder Pack] (minecraft.jar)
UCHIJAAAA FML{7.10.99.99} [Forge Mod Loader] (forgeSrc-1.7.10-10.13.4.1614-1.7.10.jar)
UCHIJAAAA Forge{10.13.4.1614} [Minecraft Forge] (forgeSrc-1.7.10-10.13.4.1614-1.7.10.jar)
UCHIJAAAA hnstguns{0.1} [HNST's gunmod] (bin)
GL info: ' Vendor: 'NVIDIA Corporation' Version: '4.5.0 NVIDIA 382.05' Renderer: 'GeForce GTX 980 Ti/PCIe/SSE2'
Launched Version: 1.7.10
LWJGL: 2.9.1
OpenGL: GeForce GTX 980 Ti/PCIe/SSE2 GL version 4.5.0 NVIDIA 382.05, NVIDIA Corporation
GL Caps: Using GL 1.3 multitexturing.
Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
Anisotropic filtering is supported and maximum anisotropy is 16.
Shaders are available because OpenGL 2.1 is supported.

Is Modded: Definitely; Client brand changed to 'fml,forge'
Type: Client (map_client.txt)
Resource Packs: []
Current Language: 日本語 (日本)
Profiler Position: N/A (disabled)
Vec3 Pool Size: 0 (0 bytes; 0 MB) allocated, 0 (0 bytes; 0 MB) used
Anisotropic Filtering: Off (1)
最後に編集したユーザー 奔颯 結城 [ 2017年10月23日(月) 10:45 ], 累計 1 回
SFで工業的な銃modの開発を試みてる人
奔颯 結城
ID:24428385
水から上がったとこ
 
記事: 2
登録日時: 2017年10月22日(日) 19:48

  • (PostNo.309465)

Re: 射出物エンティティのレンダーが動作しない

投稿記事by elise_blacklab » 2017年10月22日(日) 21:33

RenderingRegistry.registerEntityRenderingHandler(EntityBullet.class, new RenderBullet(null));

モデルを引数にとるコンストラクタからmodelBulletを設定するなら,ここで何かしらモデルを渡さないといけないのですが,nullを渡しちゃってますよ
結果的にmodelフィールドがnullのため,42行目でnullオブジェクトに対する操作を起こしています
メイドつくってたりします.http://6docvc.net/
アバター
elise_blacklab
ID:0f87040f
掘り廃人
 
記事: 2436
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.309478)

Re: 射出物エンティティのレンダーが動作しない

投稿記事by 奔颯 結城 » 2017年10月23日(月) 00:55

nullをモデルの記述に直したところ、クラッシュしなくなりました。ありがとうございます!
SFで工業的な銃modの開発を試みてる人
奔颯 結城
ID:24428385
水から上がったとこ
 
記事: 2
登録日時: 2017年10月22日(日) 19:48


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

x