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

Возможно ли сделать так, чтобы при определённом условии у игрока менялся итем?

К примеру есть кирка, когда её прочность достигает n, то она меняется на другой предмет.

Если можно реализовать подобное, то как?
 
Насколько я понял, мне нужен этот кусок:
Код:
    public void onPlayerStoppedUsing(ItemStack itemstack, World world, EntityPlayer entityplayer, int i)
    {
        if(itemstack.getItemDamage() >= 7 && entityplayer.inventory.hasItem(TestMod.CopperPickaxe.itemID))
        {
            int k = getMaxItemUseDuration(itemstack) - i;
            if(k <= 10)
            {
                entityplayer.inventory.changeCurrentItem(TestMod.TinAxe.itemID);;
            }
Тут, я попробовал пошаманить с параметрами, но, мне, вроде как надо .getItemDamage и .getMaxItemUseDuration заменить(только вот на что?)

p.s. Возможно бред несу, рассуждаю, полагаясь на логические размышления из головы, в основном.
 
2,955
12
onItemUpdate + getItemDamage()
Если ты про свой итем то так. А если про ванильный.. TickHandler.
 
Не выходит. В каком виде это приблизительно должно выглядеть, а-то может я совсем чепуху творю)



Код:
    public void onPlayerStoppedUsing(ItemStack itemstack, World world, EntityPlayer entityplayer, int i)
    {
        if(itemstack.getItemDamage() >= 7)
        {
            int k = getMaxItemUseDuration(itemstack) - i;
            if(k <= 10)
            {
                entityplayer.inventory.changeCurrentItem(TestMod.TinAxe.itemID);;
            }
А такой вариант всё-таки не подходит? В смысле, если довести до нужного состояния.
 
2,955
12
.... public void onItemUpdate(ItemStack is, World w, EntityPlayer player, args....) {
  if(is.getItemDamage >= 1) {
     player.inventory.changeCurrentItem(BlaMod.BrokenBla.itemID);
     player.addChatMessage("Я не умею лазить по классам типа Block.java, Item.java.")
     }
}
 
Код:
    public void onItemUpdate(ItemStack itemstack, World world, EntityPlayer entityplayer, int i)
    {
        if(itemstack.getItemDamage() >= 1) {
             entityplayer.inventory.changeCurrentItem(TestMod.CopperIngot.itemID);
            }
    }
    }

Так, это в классе кирки, и, насколько я понимаю, когда она ломается, на её месте должен оказаться в данном случае медный слиток. Ну по крайней мере мне нужно, чтобы так было. Однако ничего не происходит
 
2,955
12
inferno_alien написал(а):
Код:
    public void onItemUpdate(ItemStack itemstack, World world, EntityPlayer entityplayer, int i)
    {
        if(itemstack.getItemDamage() >= 1) {
             entityplayer.inventory.changeCurrentItem(TestMod.CopperIngot.itemID);
            }
    }
    }

Так, это в классе кирки, и, насколько я понимаю, когда она ломается, на её месте должен оказаться в данном случае медный слиток. Ну по крайней мере мне нужно, чтобы так было. Однако ничего не происходит
А разве метод такой? Ты аргументы и название не попутал? Я пишу по памяти, я мог даже название метода неправильно написать.
 
Ну я поправил, где увидел что не так, по-мелочи, другое дело что я сам лично, по-незнанию что упустил, ошибок нет.
 
1,990
18
105
@Override перед методом допили, заругается, если у родителя нет такого.
 
1,990
18
105
Залезь в родительский класс и полностью скопируй оболочку метода (т.е. его название, возвращаемый тип, ВСЕ аргументы) и замени ей свою. Т.е. берешь метод из родительского, вставляешь в свой и пихаешь в его тело всё что надо.
 
Oldestkon написал(а):
Залезь в родительский класс и полностью скопируй оболочку метода (т.е. его название, возвращаемый тип, ВСЕ аргументы) и замени ей свою. Т.е. берешь метод из родительского, вставляешь в свой и пихаешь в его тело всё что надо.
То ли я не правильно понял, то ли просто не нашёл, ошибка выглядит так:
 "...must override or implement a supertype method"

В предложенных решениях - создать "otItemUpdate()" в item, в itemPickaxe, или в ItemTool.
 
1,990
18
105
Повторяю, в тех классах ничего менять нельзя. Тебе надо в своем классе создать абсолютно такой же метод, что в родительском, тобишь

Код:
public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) {}
В его тело уже добавляешь все нужные действия.
У тебя же потерялся пятый параметр, поэтому создается другой метод для этого класса, а обращения к нему нигде нет - и, следовательно, он никогда не вызовется. Всё максимально логично.
 
2,955
12
Опять тупые вопросы по незнанию языка. Как говорится - выучи джаву, потом что то делай на ней.
 
Oldestkon написал(а):
Повторяю, в тех классах ничего менять нельзя. Тебе надо в своем классе создать абсолютно такой же метод, что в родительском, тобишь

Код:
public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) {}
В его тело уже добавляешь все нужные действия.
У тебя же потерялся пятый параметр, поэтому создается другой метод для этого класса, а обращения к нему нигде нет - и, следовательно, он никогда не вызовется. Всё максимально логично.
Так, насколько я понимаю, нужен же EntityPlayer в аргументах, чтобы в теле приписать действие с инвентарём игрока. А при замене Entity на EntityPlayer опять ругается на тоже самое.
 
1,990
18
105
Нельзя, нельзя заменять аргументы. Это основы ООП, если ты меняешь аргументы - ты меняешь метод, а если такого метода именно с такими аргументами не было - создается новый. И твой уже никогда не вызовется.
Если ты хочешь преобразовать в игрока - делай это в теле. И не забудь добавить try-catch, или что он там потребует для проверки валидности конвертации класса.
Код:
public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) {
    EntityPlayer player = (EntityPlayer)par3Entity;
}
 
Насчёт аргументов - понял, учту, спасибо)
Кстати, ничего вроде как не потребовалось для проверки валидности, всё встало без ошибок
Однако теперь другая проблема, вот так выглядит код:
Код:
    @Override
    public void onUpdate(ItemStack itemstack, World world, Entity entity, int par4, boolean par5)
    {
        EntityPlayer entityplayer = (EntityPlayer)entity;
        
        if(itemstack.getItemDamage() >= 5)
        {
             entityplayer.inventory.changeCurrentItem(TestMod.CopperIngot.itemID);
        }
    }

При тесте в игре, произошло следующее: разрушил 1 блок киркой, после чего ползунок выбора предмета стал стремительно двигаться(т.е. предметы в руке быстро перебирались), остановить этот процесс можно только удалив, выбросив эту кирку. В чём опять проблема?)
 
1,990
18
105
Код:
 /**
     * Called each tick as long the ItemStack in on player inventory. Used to progress the pickup animation and update
     * maps.
     */
    public void updateAnimation(World par1World, Entity par2Entity, int par3, boolean par4)
    {
        if (this.animationsToGo > 0)
        {
            --this.animationsToGo;
        }

        Item.itemsList[this.itemID].onUpdate(this, par1World, par2Entity, par3, par4);
    }

Цитата из ItemStack, onUpdate вызывается КАЖДЫЙ ТИК, пока предмет данного типа в инвентаре.
Делай проверку на то, что в руке у игрока именно этот предмет.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
А еще есть евент ломания предметов...
 
1,990
18
105
Ломание предметов ему не нужно, ему надо чтобы при определенной прочности (которая > 0) предмет менялся на другой.
А onUpdate аутизм, согласен. Лучше онСтоппендЮзинг или что-то вроде того. Но вопрос задан другой - я и отвечаю другое. Какой вопрос, такой и ответ, короче.
 
Сверху