как сделать крафт что-бы предмет не тратился после крафта

29
2
4
как сделать крафт что-бы предмет не тратился после крафта
 
Последнее редактирование:
390
7
27
На 1.7.10 это выглядит так, какие будут отличия на более высоких версиях не знаю:
В конструктор setContainerItem(this), в методе getContainerItem добавляешь урон, в методе doesContainerItemLeaveCraftingGrid возвращаешь false. Чтобы в крафт добавлять используешь OreDictionary.WILDCARD_VALUE, чтобы с любым значением урона крафт шел.
 
29
2
4
а можно сделать так что-бы предмет при крафте тупо не пропадал?
 
390
7
27
Тогда без getContainerItem
 
29
2
4
блин я не понимаю как и к чему ты можешь мне в дискорде обьяснить?
 
390
7
27
Ничего сложного. Делаешь итем, добавляешь туда это:
Java:
    public ItemStack getContainerItem(ItemStack stack) // если надо, чтобы отнималась прочка, если нет только стак возвращаешь
    {
        if(stack.getItemDamage() >= 0)
            stack.setItemDamage(stack.getItemDamage() + 1);
        return stack;
    }

    public boolean doesContainerItemLeaveCraftingGrid(ItemStack stack) // чтобы итем остался в сетке крафта
    {
        return false;   
    }
В конструкторе это:
Java:
setMaxStackSize(1); // если надо
setMaxDamage(maxDamage); // если нужен ломающийся
setContainerItem(this);

Вот рецепт:
Java:
GameRegistry.addShapelessRecipe(new ItemStack(что-то на выходе, количество), что-то как материал, new ItemStack(твой итем, 1, OreDictionary.WILDCARD_VALUE));
Ну если там методы называются как-то иначе, я все равно фиг знает, я на 1.16.4 не был
 
29
2
4
Java:
  public ItemStack getContainerItem(ItemStack stack) // если надо, чтобы отнималась прочка, если нет только стак возвращаешь
    {
        if(stack.getItemDamage() >= 0)
            stack.setItemDamage(stack.getItemDamage() + 1);
        return stack;
    }

    public boolean doesContainerItemLeaveCraftingGrid(ItemStack stack) // чтобы итем остался в сетке крафта
    {
        return false;   
    }

это куда вписывать?
 
390
7
27
В класс итема, который ты хочешь, чтобы не пропадал, а ломался/сохранялся
 
390
7
27
Открой ИтемСтак и посмотри, как там называются методы получения и установки дамага, замени по аналогии
 
29
2
4
это куда именно
Java:
setMaxStackSize(1); // если надо
setMaxDamage(maxDamage); // если нужен ломающийся
setContainerItem(this);
 
390
7
27
В конструктор этого предмета
 
29
2
4
в какую именно строчку
Java:
public enum ModItem implements IItemTier {
    CUTTER(-1, 800, 0.01F, 0.00000001F, 14,  () -> {
        return Ingredient.fromItems(ItemInit.HAMMER.get());
        
    });
    

    
    private final int harvestLevel;
    private final int maxUses;
    private final float efficiency;
    private final float attackDamage;
    private final int enchantability;
       private final LazyValue<Ingredient> repairMaterial;
    
    
       private ModItem(int harvestLevel, int maxUses, float efficiency, float attackDamage, int enchantability,
                Supplier<Ingredient> repairMaterial) {
            this.harvestLevel = harvestLevel;
            this.maxUses = maxUses;
            this.efficiency = efficiency;
            this.attackDamage = attackDamage;
            this.enchantability = enchantability;
            this.repairMaterial = new LazyValue<>(repairMaterial);
            
        }

      
      


        @Override
        public int getMaxUses() {
            return this.maxUses;
        }

        @Override
        public float getEfficiency() {
            return this.efficiency;
        }

        @Override
        public float getAttackDamage() {
            return this.attackDamage;
        }

        @Override
        public int getHarvestLevel() {
            return this.harvestLevel;
        }

        @Override
        public int getEnchantability() {
            return this.enchantability;
        }

        @Override
        public Ingredient getRepairMaterial() {
            return this.repairMaterial.getValue();
        }
        public ItemStack getContainerItem(ItemStack stack) // если надо, чтобы отнималась прочка, если нет только стак возвращаешь
        {
            if(stack.getMaxDamage() >= 0)
                stack.setDamage(stack.getMaxDamage() + 1);
            return stack;
        }

        public boolean doesContainerItemLeaveCraftingGrid(ItemStack stack) // чтобы итем остался в сетке крафта
        {
            return false;   
        }
        
    }
 
Сверху