【forge1.7.10】描画のみのEntityItemを作りたい

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

【forge1.7.10】描画のみのEntityItemを作りたい

投稿記事by KAISEEEEI217 » 2016年12月30日(金) 19:17

forge1.7.10-10.13.4.1558-1.7.10で、アイテムを一つだけのせれる、というTileEntityを作っているのですが、
アイテムを置いたときに、TileEntityの上にアイテムを描画したいので、EntityItemを継承した拾えないEntityDrawingItemを作ったのですが、
描画のみのアイテムをスポーンさせたあとに、通常のアイテムをスポーンさせると、
通常のアイテムも拾えなくなってしまいます。(EntityDrawingItemのレンダーはバニラのRenderItemを使用)
どうしたらいいでしょうか。よろしくお願いします。

以下コード(インポートとパッケージは省略)
BlockCrystalFoundation
コード: 全て選択
public class BlockCrystalFoundation extends BlockContainer {
   public BlockCrystalFoundation() {
      super(Material.rock);

      this.setHardness(2.0f);
      this.setResistance(2.0f);
      this.setCreativeTab(Main.tabKaiseismod);
      this.setBlockName("BlockCrystalFoundation");
      this.setBlockBounds(0.1875F, 0.0F, 0.1875F, 0.8125F, 0.75F, 0.8125F);
   }

   @Override
   public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer entityPlayer, int side,
         float posX, float posY, float posZ) {
      ItemStack current = entityPlayer.inventory.getCurrentItem();
      TileEntityCrystalFoundation tile = (TileEntityCrystalFoundation) world.getTileEntity(x, y, z);
      int tileItemId = tile.getFoundationItemId();
      int tileItemMeta = tile.getFoundationItemMeta();

      if (current != null && current.getItem() == Main.ItemCrystal) {

         if (current.getItemDamage() == 0) {

            world.setBlock(x, y, z, Main.BlockRedCrystalFoundation);

         } else if (current.getItemDamage() == 1) {

            world.setBlock(x, y, z, Main.BlockGreenCrystalFoundation);

         } else if (current.getItemDamage() == 2) {

            world.setBlock(x, y, z, Main.BlockBlueCrystalFoundation);
         }
      } else if (current != null && tileItemId == 0 && !current.hasTagCompound()) {//アイテムを持っていたら&すでにアイテムが置かれていなかったら&NBTをもっていなかったら
         //ここで描画だけするアイテムをスポーン

         if (world.isRemote) {

            tile.setFoundationItemId(Item.getIdFromItem(current.getItem()));
            tile.setFoundationItemMeta(current.getItemDamage());

            //Item item = new ItemDummy(Item.getItemById(Item.getIdFromItem(current.getItem())).get, x, y, z);

            EntityItem drawingItem = new EntityDrawingItem(world, x + 0.5d, y + 1, z + 0.5d, new ItemStack(
                  current.getItem(), 1, current.getItemDamage()), x, y, z);

            world.spawnEntityInWorld(drawingItem);

            //tile.setItemDrawing(true);

            Main.kaiseiDebugSysOut("current!=null && tileItem == null, Drawing");//デバック用
         }
      } else if (tileItemId != 0) {//アイテムが置かえれていたら
         //ここで普通のアイテムをスポーン

         if (world.isRemote) {

             EntityItem entityitem = new EntityItem(world, x + 0.5d, y + 1, z + 0.5d, new ItemStack(Item.getItemById(tileItemId), 1, tileItemMeta));

             //entityitem.delayBeforeCanPickup = 10;

             world.spawnEntityInWorld(entityitem);

             tile.setFoundationItemId(0);
             tile.setFoundationItemMeta(0);

             Main.kaiseiDebugSysOut("tileItem != null");//デバッグ用
          }
      } else if (current != null && current.getTagCompound() == null) {
         entityPlayer.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("[" + Main.MOD_ID + "]" + "mes.FoundationNoNbt.name")));

          Main.kaiseiDebugSysOut("mes.FoundationNoNbt.name");
      }
      return true;
   }

   @Override
    public void onBlockDestroyedByPlayer(World world, int x, int y, int z, int meta) {//エラーでるけどあとで直す

      TileEntityCrystalFoundation tile = (TileEntityCrystalFoundation) world.getTileEntity(x, y, z);
      int tileItemId = tile.getFoundationItemId();
      int tileItemMeta = tile.getFoundationItemMeta();

       if (!world.isRemote && tileItemId != 0) {

          EntityItem entityitem = new EntityItem(world, x + 0.5d, y + 1, z + 0.5d, new ItemStack(Item.getItemById(tileItemId), 1, tileItemMeta));

          world.spawnEntityInWorld(entityitem);
       }

    }

   /**レンダーIDを返す。**/
   @Override
   public int getRenderType() {
      return Main.RenderID;
   }

   /**ブロックが透けるか否かを返す。**/
   @SideOnly(Side.CLIENT)
   public boolean shouldSideBeRendered(IBlockAccess p_149646_1_, int p_149646_2_, int p_149646_3_, int p_149646_4_, int p_149646_5_) {
      return true;
   }

   /**通常のブロックでないかを返す。*/
   public boolean renderAsNormalBlock() {
      return false;
   }

   /**ブロックが透明か否かを返す。*/
   public boolean isOpaqueCube() {
      return false;
   }

   @Override
   public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) {
      return new TileEntityCrystalFoundation();
   }

   @SideOnly(Side.CLIENT)
   @Override
   public void registerBlockIcons(IIconRegister p_149651_1_) {
      this.blockIcon = p_149651_1_.registerIcon(Main.MOD_ID + ":" + "manacobblestone");
   }
}

TileEntityCrystalFoundation
コード: 全て選択
public class TileEntityCrystalFoundation extends TileEntity {

   private int itemId = 0;
   private int itemMeta = 0;
   private boolean isItemDrawing = false;

   public void readFromNBT(NBTTagCompound nbt) {
        super.readFromNBT(nbt);
        this.itemId = nbt.getInteger("itemId");
        this.itemMeta = nbt.getInteger("itemMeta");
        this.isItemDrawing = nbt.getBoolean("isItemDrawing");
    }

   public void writeToNBT(NBTTagCompound nbt) {
      super.writeToNBT(nbt);
      nbt.setInteger("itemId", this.itemId);
      nbt.setInteger("itemMeta", this.itemMeta);
      nbt.setBoolean("isItemDrawing", this.isItemDrawing);
    }

   @Override
   public Packet getDescriptionPacket() {
        NBTTagCompound nbt = new NBTTagCompound();
        this.writeToNBT(nbt);
        return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 1, nbt);
   }

   @Override
    public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
        this.readFromNBT(pkt.func_148857_g());
    }

   public void setFoundationItemId(int itemId) {
      this.itemId = itemId;
   }

   public int getFoundationItemId() {
      return this.itemId;
   }

   public void setFoundationItemMeta(int itemMeta) {
      this.itemMeta = itemMeta;
   }

   public int getFoundationItemMeta() {
      return this.itemMeta;
   }

   public void setItemDrawing(boolean b) {
      this.isItemDrawing = b;
   }

   public boolean getItemDrawing() {
      return this.isItemDrawing;
   }
}

EntityDrawingItem
コード: 全て選択
public class EntityDrawingItem extends EntityItem {

   int tileX;
   int tileY;
   int tileZ;

   public TileEntityCrystalFoundation tile;

   /**
    * 描画だけの取れない、動かない、EntityItemを継承したクラス。
    * @param world
    * @param x
    * @param y
    * @param z
    * @param itemStack
    */
   public EntityDrawingItem(World world, double x, double y, double z, ItemStack itemStack, int tileX, int tileY, int tileZ) {
      super(world, x, y, z, itemStack);
      this.delayBeforeCanPickup = 20;

      this.tileX = tileX;
      this.tileY = tileY;
      this.tileZ = tileZ;
      this.motionX = 0.0d;//最初動かないように
      this.motionY = 0.0d;
      this.motionZ = 0.0d;

      tile = (TileEntityCrystalFoundation) world.getTileEntity(tileX, tileY, tileZ);
   }

   @Override
   public void onCollideWithPlayer(EntityPlayer p_70100_1_) {
      if (!p_70100_1_.worldObj.isRemote) {
         this.delayBeforeCanPickup = 20;
      }
      super.onCollideWithPlayer(p_70100_1_);
   }

   @Override
   public void onEntityUpdate() {
      super.onEntityUpdate();
      if (tile.getFoundationItemId() == 0) {
         this.setDead();
      }
   Main.kaiseiDebugSysOut("Drawing");//デバッグ用
   }
}
KAISEEEEI217
ID:8fcc1e20
木を殴ってる
 
記事: 27
登録日時: 2014年6月22日(日) 13:27

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

x