Предмет

Версия Minecraft
1.7.10
199
1
17
Ребят, продолжаю делать мод на лекарства и решил сделать аптечку, если ее использовать то в инвентаре появятся определенные предметы. Но при съедании аптечки они не появляются. Вот код:
Java:
public class bigAidKit extends ItemFood {
    public bigAidKit(int i, float f, boolean b) {
              super(0, 0.0F, false);
              this.setUnlocalizedName("bigAidKit");
              this.setTextureName("excraft:bigAidKit");
              this.setMaxStackSize(1);
              this.setCreativeTab(GlClass.tabMed);
    }
    @Override
    public int getMaxItemUseDuration(ItemStack itemstack) {
          return 2;
    }
    public void onFoodEaten(ItemStack itemStack, World world, EntityPlayer player) {
        if (player instanceof EntityPlayer)
            player.inventory.addItemStackToInventory(new ItemStack(GlClass.blood, 4));
            player.inventory.addItemStackToInventory(new ItemStack(GlClass.bandage, 4));
            player.inventory.addItemStackToInventory(new ItemStack(GlClass.morphine, 4));
            player.inventory.addItemStackToInventory(new ItemStack(ExCraftItems.adrenaline, 4));   
        super.onFoodEaten(itemStack, world, player);
        }
}
 

Eifel

Модератор
1,624
79
609
Ты уверен, что onFoodEaten переопределен? Его скорее всего нету в суперклассе, посмотри в классах еды, уже не помню как там...

P.s. И еще, вот это if (player instanceof EntityPlayer) когда у тебя есть EntityPlayer player в параметрах юзлес, и работать будет только на следующую строчку. Можно вообще убрать
 
1,111
47
420
Может у тебя инвентарь заполнен:unsure:
Поробуй ка так:
Java:
@Override
    public void onFoodEaten(ItemStack itemStack, World world, EntityPlayer player) {
        giveStack(new ItemStack(GlClass.blood, 4), player);
        giveStack(new ItemStack(GlClass.bandage, 4), player);
        giveStack(new ItemStack(GlClass.morphine, 4), player);
        giveStack(new ItemStack(ExCraftItems.adrenaline, 4), player);
        super.onFoodEaten(itemStack, world, player);
    }

    private void giveStack(ItemStack stack, EntityPlayer player) {
        if (!player.inventory.addItemStackToInventory(stack)) {
            player.worldObj.spawnEntityInWorld(new EntityItem(player.worldObj, player.posX, player.posY, player.posZ, stack));
        }
    }
 
1,111
47
420
Ты уверен, что onFoodEaten переопределен? Его скорее всего нету в суперклассе, посмотри в классах еды, уже не помню как там...

P.s. И еще, вот это if (player instanceof EntityPlayer) когда у тебя есть EntityPlayer player в параметрах юзлес, и работать будет только на следующую строчку. Можно вообще убрать
Да такой метод есть. Тут все ок
 
199
1
17
Может у тебя инвентарь заполнен:unsure:
Поробуй ка так:
Java:
@Override
    public void onFoodEaten(ItemStack itemStack, World world, EntityPlayer player) {
        giveStack(new ItemStack(GlClass.blood, 4), player);
        giveStack(new ItemStack(GlClass.bandage, 4), player);
        giveStack(new ItemStack(GlClass.morphine, 4), player);
        giveStack(new ItemStack(ExCraftItems.adrenaline, 4), player);
        super.onFoodEaten(itemStack, world, player);
    }

    private void giveStack(ItemStack stack, EntityPlayer player) {
        if (!player.inventory.addItemStackToInventory(stack)) {
            player.worldObj.spawnEntityInWorld(new EntityItem(player.worldObj, player.posX, player.posY, player.posZ, stack));
        }
    }
Инвентарь то у меня пустой и твой код тоже не работает(
 
250
12
24
Ничего не обещаю, но попробуй поставить перед методом onFoodEaten - @Override
//@Override переопределяет метод. Т.е. Если у тебя есть класс, а в нем допустим метод input()
//И есть другой метод, который вызывает срабатывание метода input при каком то действии
//Но нам нужно чтобы в одном из классов наследников метод input() выполнял нечто другое
//В этом случае мы пишем заново метод input() в новом классе, но тогда у нас будет 2 метода:
//input() и super.input(), второй это метод родительского класса. Чтобы перезаписать метод в данном экземпляре
//Мы и пишем @Override.
//Писал из головы, как понимаю. Не надо в меня ничем кидаться.
 
1,111
47
420
Приготовил тапок...
//Писал из головы, как понимаю. Не надо в меня ничем кидаться.
Одел обратно. Так вот аннотация Override нужна просто чтобы облегчить чтение, без нее тоже работает)) В Scala и Kotlin есть ключевое слово override и его уже обязательно писать, но мы то на Java))
 
250
12
24

tox1cozZ

aka Agravaine
8,456
598
2,893
Оверрайд еще помогает при обновлении мода на новые версии. Сразу видно какие методы поменялись и где исправлять их сигнатуры
Жаль только, что она не остается после компиляции. Частенько у модов нет исходников, надо декомпилить.
 
1,007
36
206
Зачем ItemFood?
Java:
public class ItemMedKit extends Item {
    
    
    

   public ItemMedKit() {
      super();
      this.setUnlocalizedName("MedKit");
      
      this.setMaxStackSize(64);
      
   }
  
  
  
  
   public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer) {
          
             entityplayer.setItemInUse(itemstack, this.getMaxItemUseDuration(itemstack));
          

          return itemstack;
       }

   public ItemStack onEaten(ItemStack itemstack, World world, EntityPlayer entityplayer) {
      
         if(!entityplayer.capabilities.isCreativeMode && !world.isRemote) {
             --itemstack.stackSize;
            
             entityplayer.setHealth(entityplayer.getHealth()+20);
             entityplayer.addPotionEffect(new PotionEffect(22, 20*4, 1));
         }

        

        
            
                      
            
            
            
            
        

         world.playSoundAtEntity(entityplayer, ModInfo.MODID + ":medkit", 20.0F, (itemRand.nextFloat() - itemRand.nextFloat()) * 0.2F + 1.0F);
        return itemstack;
      }

      
  

   public int getMaxItemUseDuration(ItemStack itemstack) {
      return 80;
   }

   public EnumAction getItemUseAction(ItemStack itemstack) {
      return EnumAction.block;
   }

  

  
  
  
}
 
Сверху