Исправление метода shift клика

Версия Minecraft
1.7.10
90
1
Очередная проблема с гуи.
вот метод, который при шифт-клике должен перемещать вещи из инвентаря в слот моего ГУИ, и наоборот, в инвентарь - из слота. В GUI всего 1 слот. Он работает, но
@Override
public ItemStack transferStackInSlot(EntityPlayer playerIn, int fromSlot) {
   ItemStack itemstack = null;
   Slot slot = (Slot)this.inventorySlots.get(fromSlot);

   if (slot != null && slot.getHasStack())
   {
       ItemStack itemstack1 = slot.getStack();
       itemstack = itemstack1.copy();

       if (fromSlot < 1)
       {
           if (!this.mergeItemStack(itemstack1, 1, this.inventorySlots.size(), false))
           {
               return null;
           }
       }
       else if (!this.mergeItemStack(itemstack1, 0, 1, false))
       {
           return null;
       }

       if (itemstack1.stackSize == 0)
       {
           slot.putStack(null);
       }
       else
       {
           slot.onSlotChanged();
       }
   }

   return itemstack;
}
Но есть 2 бага:
1)При перемещении ИЗ инвентаря В слот блока, если кол-во перемещаемых предметов больше максимально допустимого для слота( в мой слот можно положить одновременно только 1 предмет) то все, что больше допустимого - пропадает. То есть Нажала шифт-кликом на стак из 64 предметов: 1 как и нужно переместился в слот, а 63 оставшихся пропали вообще.
2) При перемещении ИЗ слота блока В инвентарь: при шифт-клике по слота вещь перемещается в инвентарь, но в слоте остается фантомная вещь. То есть её можно забрать отдельно, но если попробовать её выкинуть, нажав на Q или сложить к другим таким же предметам в инвентаре в общий стак, то эта вещь пропадет.
 
Thunder написал(а):
1. Если размер перемещаемого стака больше чем 1, поместить обратно в слот из которого перемещается копию стака но с сайзом на 1 меньше.

А не мог бы в коде показать, а то я сделал вот так:
@Override
public ItemStack transferStackInSlot(EntityPlayer playerIn, int fromSlot) {
   ItemStack itemstack = null;
   Slot slot = (Slot)this.inventorySlots.get(fromSlot);
   ItemStack playerStack=null;

   if (slot != null && slot.getHasStack())
   {
       ItemStack itemstack1 = slot.getStack();
       itemstack = itemstack1.copy();
       playerStack=itemstack1.copy();

       if (fromSlot < 1)
       {
           if (!this.mergeItemStack(itemstack1, 1, this.inventorySlots.size(), false))
           {
               return null;
           }
       }
       else if (!this.mergeItemStack(itemstack1, 0, 1, false))
       {
           return null;
       }

       if (itemstack1.stackSize == 0)
       {
           slot.putStack(null);
       }
       else
       {
           slot.onSlotChanged();
       }
   }
   if(playerStack!=null&&playerStack.stackSize>1){
       playerStack.stackSize--;
       slot.putStack(playerStack);
   }


   return itemstack;
}
И только баги добавились
 
Код:
else if (!this.mergeItemStack(itemstack1, 0, 1, false))   {     
     return null;      
}
//т.е. перемещение прошло успешно
else if(playerStack != null && playerStack.stackSize > 1){
//ложим стак в слот на который кликали
   playerStack.stackSize--;
   slot.putStack(playerStack);
}


Вроде как-то так, не знаю
 
Thunder написал(а):
Код:
else if (!this.mergeItemStack(itemstack1, 0, 1, false))   {     
     return null;      
}
//т.е. перемещение прошло успешно
else if(playerStack != null && playerStack.stackSize > 1){
//ложим стак в слот на который кликали
   playerStack.stackSize--;
   slot.putStack(playerStack);
}


Вроде как-то так, не знаю



теперь при шифт клике этот код засовывает в слот все 64 предмета, игнорируя ограничение в 1 предмет:(
 
Thunder написал(а):
А ну скинь код как ты поменял

Ну вот весь метод
@Override
public ItemStack transferStackInSlot(EntityPlayer playerIn, int fromSlot) {
   if(!playerIn.worldObj.isRemote) {
       ItemStack itemstack = null;
       Slot slot = (Slot) this.inventorySlots.get(fromSlot);
       ItemStack playerStack = null;
       ItemStack itemstack1 = null;

       if (slot != null && slot.getHasStack()) {
           itemstack1 = slot.getStack();
           itemstack = itemstack1.copy();
           playerStack = itemstack1.copy();

           if (fromSlot < 1) {
               if (!this.mergeItemStack(itemstack1, 1, this.inventorySlots.size(), false)) {
                   return null;
               }
           } else if (!this.mergeItemStack(itemstack1, 0, 1, false)) {
               return null;
           } else if (playerStack != null && playerStack.stackSize > 1) {
           playerStack.stackSize--;
           slot.putStack(playerStack);
       }

}
       return itemstack;
   }else
       return null;
}
Теперь предметы дюпаются


Ладно, эта проблема не актуальна, так как нужный предмет все равно не стакается в кол-во больше 1. А Вот что делать с фантомными предметами? Не подскажите?
 
Dahaka написал(а):
Скопируй полностью из верстака, например, и измени индексы.

Сделал кое что похожее и оказалось что проблема, очевидно не в этом методе, так как в  столе зачарования таких проблем не наблюдается, а я оттуда скопировал. Где же тогда проблема, интересно.
 
Назад
Сверху