【解決済み】[1.7.10]アイテムをインベントリに追加すると、反映されない

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

【解決済み】[1.7.10]アイテムをインベントリに追加すると、反映されない

投稿記事by アカリ » 2017年8月05日(土) 13:26

こんにちわ。
「本と羽ペン」で特定のブロックを右クリックした場合、そのブロックの位置情報を書き込んだ本をインベントリに追加する。
というコードを書いたのですが、何故か本がインベントリに追加されません。どのように解決すればよろしいのでしょうか?
バージョン:forge-1.7.10-10.13.4.1558

コード: 全て選択
///import文は省略
@Mod(modid = Core.MODID, version = Core.VERSION, name=Core.MODID)
public class Core {
   @Instance("Core")
   public static final String MODID = "sample Core";
   public static final String VERSION = "0.0.1";

   public static Core instance;

   public Core()
   {
   }

   @EventHandler
   public void preInit(FMLPreInitializationEvent event) {
      MinecraftForge.EVENT_BUS.register(new Event_Listener());
   }

   @EventHandler
   public void init(FMLInitializationEvent event)
   {
   }
}

コード: 全て選択
///import文は省略
public class Event_Listener {
   @SubscribeEvent
   public void RightClickBlock(PlayerInteractEvent event) {
      if ((!event.world.isRemote) && (event.action == PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK)) {
         Block block = event.world.getBlock(event.x, event.y, event.z);
         EntityPlayer player = event.entityPlayer;
         ItemStack item = player.inventory.getCurrentItem();
         if ((block != null) && (block == Blocks.stone) && (item != null) && (item.getItem() == Items.writable_book)) {
            player.addChatMessage(new ChatComponentText("block: "+block));
            NBTTagCompound nbt = new NBTTagCompound();
            nbt.setString("author", player.getDisplayName());
            nbt.setString("title", "position");
            NBTTagList bookTag = new NBTTagList();
            bookTag.appendTag(new NBTTagString(event.x + "," + event.y + "," + event.z));
            nbt.setTag("pages", bookTag);
            ItemStack writtenBook = new ItemStack(Items.written_book, 1);
            writtenBook.setTagCompound(nbt);
            player.inventory.addItemStackToInventory(writtenBook);
            //player.inventory.setInventorySlotContents(player.inventory.getFirstEmptyStack(), writtenBook);   //これも駄目
            item.stackSize = item.stackSize - 1;
            player.inventory.markDirty();
         }
      }
   }
}
最後に編集したユーザー アカリ [ 2017年8月05日(土) 17:18 ], 累計 1 回
アカリ
ID:6c96e367
水から上がったとこ
 
記事: 5
登録日時: 2017年7月20日(木) 20:43

  • (PostNo.305832)

Re: [1.7.10]アイテムをインベントリに追加すると、反映されない

投稿記事by defeatedcrow » 2017年8月05日(土) 16:34

アカリ さんが書きました:こんにちわ。
「本と羽ペン」で特定のブロックを右クリックした場合、そのブロックの位置情報を書き込んだ本をインベントリに追加する。
というコードを書いたのですが、何故か本がインベントリに追加されません。どのように解決すればよろしいのでしょうか?
バージョン:forge-1.7.10-10.13.4.1558

コード: 全て選択
///import文は省略
@Mod(modid = Core.MODID, version = Core.VERSION, name=Core.MODID)
public class Core {
   @Instance("Core")
   public static final String MODID = "sample Core";
   public static final String VERSION = "0.0.1";

   public static Core instance;

   public Core()
   {
   }

   @EventHandler
   public void preInit(FMLPreInitializationEvent event) {
      MinecraftForge.EVENT_BUS.register(new Event_Listener());
   }

   @EventHandler
   public void init(FMLInitializationEvent event)
   {
   }
}

コード: 全て選択
///import文は省略
public class Event_Listener {
   @SubscribeEvent
   public void RightClickBlock(PlayerInteractEvent event) {
      if ((!event.world.isRemote) && (event.action == PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK)) {
         Block block = event.world.getBlock(event.x, event.y, event.z);
         EntityPlayer player = event.entityPlayer;
         ItemStack item = player.inventory.getCurrentItem();
         if ((block != null) && (block == Blocks.stone) && (item != null) && (item.getItem() == Items.writable_book)) {
            player.addChatMessage(new ChatComponentText("block: "+block));
            NBTTagCompound nbt = new NBTTagCompound();
            nbt.setString("author", player.getDisplayName());
            nbt.setString("title", "position");
            NBTTagList bookTag = new NBTTagList();
            bookTag.appendTag(new NBTTagString(event.x + "," + event.y + "," + event.z));
            nbt.setTag("pages", bookTag);
            ItemStack writtenBook = new ItemStack(Items.written_book, 1);
            writtenBook.setTagCompound(nbt);
            player.inventory.addItemStackToInventory(writtenBook);
            //player.inventory.setInventorySlotContents(player.inventory.getFirstEmptyStack(), writtenBook);   //これも駄目
            item.stackSize = item.stackSize - 1;
            player.inventory.markDirty();
         }
      }
   }
}


サーバ側でインベントリを変更したことがクライアントに通知されていないと起こります
全く入っていなかったり、あるはずの場所をクリックするとアイテムが出てきたり、リログで出現したりします
(よくAMTでも起こっていて修正に苦労しました)

私の場合の解決策ですが
直接インベントリに入れるのではなく、EntityItem(ドロップアイテムのEntity)を作ってプレイヤーと同じ座標にスポーンさせることで同期ズレを防いでいます
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:7e692061
ラピスラズリ収集家
 
記事: 933
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.305836)

Re: [1.7.10]アイテムをインベントリに追加すると、反映されない

投稿記事by アカリ » 2017年8月05日(土) 17:12

早速の返信、大変ありがとうございます。
私の場合の解決策ですが
直接インベントリに入れるのではなく、EntityItem(ドロップアイテムのEntity)を作ってプレイヤーと同じ座標にスポーンさせることで同期ズレを防いでいます


教えていただいた方法で、無事アイテムを取得することが出来ました。大変勉強になりました。重ねて、感謝申し上げます。
以下に、先述したコードに追加した部分を載せておきます。

コード: 全て選択
EntityItem eItem = new EntityItem(player.worldObj,player.posX,player.posY,player.posZ,writtenBook);
player.worldObj.spawnEntityInWorld(eItem);
アカリ
ID:6c96e367
水から上がったとこ
 
記事: 5
登録日時: 2017年7月20日(木) 20:43


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

x