[1.6.4] Вопрос: Замена итема при условии

329
13
Код:
/**
* v1.7.2
* Метод будет вызван, когда предметом разрушен блок
*
* par1ItemStack - собственно, сам предмет в инвентаре
* par2World - мир, в котором происходит это восхитительное событие
* par3Block - какой блок был разрушен
* par4int, par5int, par6int - XYZ-координаты разрушенного блока
* par7EntityLivingBase - кем был разрушен блок
*/
public boolean onBlockDestroyed(ItemStack par1ItemStack, World par2World, Block par3Block, int par4int, int par5int, int par6int, EntityLivingBase par7EntityLivingBase)
{
    // System.out.println("===> onBlockDestroyed <===");
    return true;
}

И на будущее, если надо проверить, срабатывает метод или нет поставь внутри него System.out.println("Bla-bla-bla");

И когда метод будет использован, то в консоли твоего Eclipse'а появится Bla-bla-bla . Если эта строка не появляется - значит и метод не используется (а следовательно и код внутри него). Этим же способом можно проверять значения различных параметров, например System.out.println(itemstack.getItemDamage()); покажет тебе, насколько сильно поврежден твой предмет.
 
1,990
18
105
onItemUse не подойдет, он для ПКМ.
Тебе нужен этот метод:

Код:
public boolean onBlockDestroyed(ItemStack par1ItemStack, World par2World, int par3, int par4, int par5, int par6, EntityLivingBase par7EntityLivingBase)
    {
 // Если предмет накопил 25 урона и более
        if(par1ItemStack.getItemDamage() >= 25)
        {
            // Меняем текущий предмет
            ((EntityPlayer)par7EntityLivingBase).inventory.changeCurrentItem(TestMod.CopperIngot.itemID);
        }
        else
        {
            // А если еще не накопил, то повреждаем предмет на единицу
            // Вроде есть еще метод DamageItem, но нет возможности проверить
            par1ItemStack.setItemDamage(par1ItemStack.getItemDamage() + 1);
        }

        return false;
    }

EDIT: Лол, я слепой, не увидел последние два сообщения.
 
2,955
12
TaoGunner написал(а):
Код:
/**
* v1.7.2
* Метод будет вызван, когда предметом разрушен блок
*
* par1ItemStack - собственно, сам предмет в инвентаре
* par2World - мир, в котором происходит это восхитительное событие
* par3Block - какой блок был разрушен
* par4int, par5int, par6int - XYZ-координаты разрушенного блока
* par7EntityLivingBase - кем был разрушен блок
*/
public boolean onBlockDestroyed(ItemStack par1ItemStack, World par2World, Block par3Block, int par4int, int par5int, int par6int, EntityLivingBase par7EntityLivingBase)
{
    // System.out.println("===> onBlockDestroyed <===");
    return true;
}

И на будущее, если надо проверить, срабатывает метод или нет поставь внутри него System.out.println("Bla-bla-bla");

И когда метод будет использован, то в консоли твоего Eclipse'а появится Bla-bla-bla . Если эта строка не появляется - значит и метод не используется (а следовательно и код внутри него). Этим же способом можно проверять значения различных параметров, например System.out.println(itemstack.getItemDamage()); покажет тебе, насколько сильно поврежден твой предмет.
Посмотри предыдущее сообщение от меня и объясни смысл твоего сообщения.
 
329
13
Dragon2488 написал(а):
Посмотри предыдущее сообщение от меня и объясни смысл твоего сообщения.
ТС изначально использует метод, который (в его случае) не работает. Своим сообщением я пытаюсь рассказать ТС'у о том, что существует возможность проверить, вызывается метод или нет, используя команду System.out. Также, анализируя прошлые попытки ТC'а сделать рабочий код можно сделать вывод, что он такой же новичок как и я, а для новичка важно разжевать код как можно подробнее. Так материал усвоится лучше.

И по поводу описания метода : у себя я вижу, что третий параметр имеет тип Block, а не как у вас обоих - int. Либо это одно и тоже, либо в версии 1.7.2 произошли изменения.

Надеюсь, я понятно объяснил смысл моего сообщения.
 
2,955
12
TaoGunner написал(а):
Dragon2488 написал(а):
Посмотри предыдущее сообщение от меня и объясни смысл твоего сообщения.
ТС изначально использует метод, который (в его случае) не работает. Своим сообщением я пытаюсь рассказать ТС'у о том, что существует возможность проверить, вызывается метод или нет, используя команду System.out. Также, анализируя прошлые попытки ТC'а сделать рабочий код можно сделать вывод, что он такой же новичок как и я, а для новичка важно разжевать код как можно подробнее. Так материал усвоится лучше.

И по поводу описания метода : у себя я вижу, что третий параметр имеет тип Block, а не как у вас обоих - int. Либо это одно и тоже, либо в версии 1.7.2 произошли изменения.

Надеюсь, я понятно объяснил смысл моего сообщения.

P.S. :  ТС, если ты прочтешь это сообщение, поставь Dragon2488 плюсик, потому как именно он нашел правильный ответ. Это важно для него!
1. Ну да, ты прав. 2. Я еще не переходил на 1.7, а как ты помнишь на 1.7 убрали айди. Поэтому у тебя третий параметр блок, а у нас блокАйди. 3. Да ладно, обойдусь:)
 
Так, чувствую уже вот-вот всё встанет на свои места и заработает, но, увы ещё не сейчас. Метод совершается, правда в игре это отражается не так как надо, а именно: при накоплении нужного числа в getItemDamage просто меняется слот выбора предмета, то бишь кирка убирается из руки, но она остаётся на своём месте, никуда не пропадает, так же слиток ещё не появляется.
 
329
13
Player.inventory.changeCurrentItem - меняет текущий предмет на следующий или предыдущий. Это не тот метод, что тебе нужен.

Вот, набрал для версии 1.7.2 . Изменений по сравнению с 1.6.4 немного, сам поправишь.
Код:
@Override
public boolean onBlockDestroyed(ItemStack par1ItemStack, World par2World, Block par3Block, int par4int, int par5int, int par6int, EntityLivingBase par7EntityLivingBase)
{
    // Если урон больше пяти
    if (par1ItemStack.getItemDamage() > 5)
    {
        // Получаем персонажа из par7EntityLivingBase
        EntityPlayer player = (EntityPlayer)par7EntityLivingBase;
        // Вставляем в текущий слот новый стак предметов
        player.inventory.setInventorySlotContents(player.inventory.currentItem, new ItemStack(Items.apple,60));
    }
    else
    {
        // Либо продолжаем ломать
        par1ItemStack.damageItem(1, par7EntityLivingBase);
    }
return true;
}

player.inventory.setInventorySlotContents - заменяет содержимое слота инвентаря новым стаком
player.inventory.currentItem - возвращает номер используемого слота, от 0 до 8.
 
Ну наконец-то, всё получилось. 3 страницы косяков, глупых ошибок и незнания кода, но вы таки помогли мне сделать как надо, так мало того, ещё и тонны объяснений, подробно и чётко. Спасибо всем, кто принимал участие, огромное)

Естественно всё это делалось не ради замены кирки на слиток, надеюсь, закончу с этим, обязательно поделюсь, надеюсь все эти старания приведут к тому, что задумано.
 
Не стал создавать новую тему, ибо вопрос относится конкретно к данной.

Та же ситуация, только нужен подобный метод для брони. Обращаюсь сюда, ибо не нашёл ничего подходящего, искал в Item и в ItemArmor, единственное, о чём я задумался, это onItemUse, но понял что это не то. Есть вообще подходящий метод, чтобы такая фишка работала с бронёй?
 
А onArmorTickUpdate - что-то другое, или по сути тоже самое?

Код:
 public void onArmorTickUpdate(World world, EntityPlayer player, ItemStack itemstack)
    {
        if(itemstack.getItemDamage() >= 10)
        {
        
            player.inventory.setInventorySlotContents(player.inventory.currentItem, new ItemStack(TestMod.BreakPickaxeLv3, 1));
        }
        else 
        {
            itemstack.setItemDamage(itemstack.getItemDamage() + 1);
        }
Создаёт баг, что в каждой выбранной клетке в инвентаре появляется breakPickaxeLv3.
И да, тут же void, разве нужен не boolean?
 
2,955
12
Ну ты тупишь...  не надо использовать как там setInventorySlotContent, нужно addItemToInventory и удалять бронь с игрока.
 
Dragon2488 написал(а):
Ну ты тупишь... 
Ну бывает, ещё далеко не про в этом деле))

В конечном итоге работает вот этот код:
Код:
    public void onArmorTickUpdate(World world, EntityPlayer player, ItemStack itemstack)
    {
        if(itemstack.getItemDamage() >= 10)
        {
            EntityLivingBase entitylivingbase = (EntityLivingBase)player;
            player.inventory.addItemStackToInventory(new ItemStack(TestMod.BreakPickaxeLv3, 1));
            itemstack.damageItem(itemstack.getMaxDamage(), entitylivingbase);
        }   
   
    }
Единственное что, так это на последнем ударе(MaxDamage = 10), даётся BreakPickaxeLv3, но бронь не удаляется, остаётся ещё на один удар. Менял значения >= 11, например(не, ну а вдруг), нет, в таком случае итем просто ломается, ничего не происходит, логично.
 
771
5
А на игрока проверять не надо?
А если зомби наденет броник?
 
Да, кстати, а что будет если зомби наденет броник?)
[merge_posts_bbcode]Добавлено: 15.05.2014 17:34:17[/merge_posts_bbcode]

player.inventory.consumeInventoryItem(itemstack.itemID);
ничего не изменилось
 
Так и не понял, как решить проблему с тем, что итем выдаётся, а броня всё равно остаётся(на 1 удар хватает, потом ломается).

С проверкой ещё не сталкивался, как её прописать?) Буду знать.
 
Сверху