Добавить предмет в инвентарь

Статус
В этой теме нельзя размещать новые ответы.
Версия Minecraft
1.7.10
90
1
Здравствуйте. Подскажите пожалуйста, как правильно добавлять предмет в инвентарь. Сейчас использую метод addItemStackToInventory(), но он как то странно себя ведет иногда. Например, после добавления предмета таким методом сам предмет в инвентаре невидим, пока не нажмешь на тот слот, где он лежит. И сам предмет добавляется только в самый левый нижний слот. А мне нужно чтоб он в другой слот добавлялся. Но первая проблема -невидимость-конечно гораздо хуже. Подскажите пожалуйста, как исправить.
 
Код, как делаешь?


И вроде он добавляет в первый возможный слот.
Что бы использовать конкретный - используй другой метод.


p.inventory.setInventorySlotContents(IDSLOT, is)
 
Doc написал(а):
Код, как делаешь?


И вроде он добавляет в первый возможный слот.
Что бы использовать конкретный - используй другой метод.


p.inventory.setInventorySlotContents(IDSLOT, is)




Вот код. Он правда кривой немного и некрасивый, но он для теста только, так что не пугайся:

@SideOnly(Side.CLIENT)
@SubscribeEvent
public void useItem(PlayerInteractEvent event) {
   int x=0;
   int y=0;
   int z=0;
   System.out.println(event.world.getBlock(101,60,254));
   try{
       if(!event.world.isRemote){
           if(event.action== PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK){
           System.out.println(event.entityPlayer.getCurrentEquippedItem());

           // if (event.entityPlayer.getCurrentEquippedItem().getItem() != null) {
               if(event.world.getBlock(event.x,event.y,event.z).equals(BuildCraftFactory.tankBlock)){
                   //  ((BlockTank)event.world.getBlock(event.x,event.y,event.z)).
                   System.out.println("tank use");
               }else{
           if (event.entityPlayer.getCurrentEquippedItem().getItem().equals(ItemLoader.freshWaterBucket)) {
               System.out.println(event.world.getBlock(event.x, event.y, event.z));
               if (event.face != -1) {
                   switch (event.face) {
                       case 0: {
                           x = event.x;
                           y = event.y - 1;
                           z = event.z;
                           break;
                       }
                       case 1: {
                           x = event.x;
                           y = event.y + 1;
                           z = event.z;
                           break;
                       }
                       case 2: {
                           x = event.x;
                           y = event.y;
                           z = event.z - 1;
                           break;
                       }
                       case 3: {
                           x = event.x;
                           y = event.y;
                           z = event.z + 1;
                           break;
                       }
                       case 4: {
                           x = event.x - 1;
                           y = event.y;
                           z = event.z;
                           break;
                       }
                       case 5: {
                           x = event.x + 1;
                           y = event.y;
                           z = event.z;
                           break;
                       }
                   }
                   int meta = event.world.getBlockMetadata(x, y, z);
                   if (event.world.getBlock(x, y, z).equals(Blocks.air)||(event.world.getBlock(x, y, z).equals(TestMod.fluidBlock)&&meta!=0)) {
                     if(tryPlaceTestFluid(event.world,x,y,z)){
                             event.entityPlayer.inventory.consumeInventoryItem(event.entityPlayer.getCurrentEquippedItem().getItem());
                             event.entityPlayer.inventory.setInventorySlotContents(1,new ItemStack(Items.bucket,1));
                     }
                   }

               }
           }

           }

           }
       }
   }catch (NullPointerException e){

   }
}

Вот в последних строчках проблема как раз

И еще заметил. Что если в инвентаре есть уже такие предметы, то этот предмет(у меня ведро) добавляется к ним, но количество этих предметов визуально (циферка) не изменяется, пока опять же не нажмешь на данный слот
 
AlexSocol написал(а):
Ну есть ещё  player.dropPlayerItemWithRandomChoice, который дропнет предмет и ты его тут же поднимешь. Точно так же работает команда give, насколько я знаю.

Предмет дропается, да. Но это еще нужно его поднять. а он не сразу поднимается. Я собственно эту тему завел потому что когда ведром с жидкостью из мода, к которому делаю аддон, нажимаю на землю, должен образоваться блок жидкости и в инвентарь вернуться пустое ведро. Может есть какое то готовое решение на эту тему?
 
Putnik написал(а):
Doc написал(а):
А нечего, что у тебя @SideOnly(Side.CLIENT) ?

Я немного нуб просто в этом. Объясни пожалуйста для чего эта строка нужна и что она конкретно делает

SideOnly Что-ли типо "работать только" и указываешь сторону.
В данный момент ее не нужно указывать.
Т.К. Ты работаешь на 2х сторонах.
 
Thunder написал(а):
После добавления напиши player.inventoryContainer.detectAndSendChanges();
Не помню точно где есть inventoryContainer, если не заработает то player.inventory.inventoryContainer. ...

Спасибо! Пол проблемы решилось. Теперь предмет виден сразу. Только игра похоже то ли не успевает реагировать, то ли это как то надо прописать. Но если попытаться добавить этот предмет в тот слот, откуда только что  должен удалиться другой(ведро с водой при попытке вылить воду), то это ведро не сработает и соответственно слот не очистится и новый предмет в этот слот не добавится. может какой то метод нужно прописать и после удаления предмета из инвентаря?
 
Thunder написал(а):
ну так удали вручную из слота, а потом положи то, что нужно

Вручную это мышкой что ли перенести? Если да, то не пройдет. В этом слоте ведро с жидкостью и при нажатии должно вылиться, а на его месте появиться пустое ведро. Вот если ведро появляется в любом другом слоте кроме того, где до нажатия находится полное ведро, то все работает идеально, а если в том же слоте, то ничего из ведра не выливается.
 
Посмотри в ItemBucket метод onItemRightClick.
Там все ооочень хорошо расписано.
 
Putnik написал(а):
Thunder написал(а):
ну так удали вручную из слота, а потом положи то, что нужно

Вручную это мышкой что ли перенести? Если да, то не пройдет. В этом слоте ведро с жидкостью и при нажатии должно вылиться, а на его месте появиться пустое ведро. Вот если ведро появляется в любом другом слоте кроме того, где до нажатия находится полное ведро, то все работает идеально, а если в том же слоте, то ничего из ведра не выливается.

Перед удалением предмета, лови слот и выдавай туда предмет
 
junkil335 написал(а):
Putnik написал(а):
Thunder написал(а):
ну так удали вручную из слота, а потом положи то, что нужно

Вручную это мышкой что ли перенести? Если да, то не пройдет. В этом слоте ведро с жидкостью и при нажатии должно вылиться, а на его месте появиться пустое ведро. Вот если ведро появляется в любом другом слоте кроме того, где до нажатия находится полное ведро, то все работает идеально, а если в том же слоте, то ничего из ведра не выливается.

Перед удалением предмета, лови слот и выдавай туда предмет

Подскажи пожалуйста, как это сделать. у меня еще опыта и знаний мало..
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху