1.7.2|[Решено] Эффект зелья на предмет и перезарядка предмета

Статус
В этой теме нельзя размещать новые ответы.
20
1
Мне нужно чтобы при нажатии на правую кнопку мыши по предмету активировался определенный эффект зелья. Не могу разобраться. Заранее спасибо.  
P.S. Только недавно начал заниматься моддингом.
 
Код:
public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer player)
{
        player.addPotionEffect((new PotionEffect(Potion.digSpeed.getId(), 20, 0)));
    return itemstack;
}
это воткни в класс итема, лень описывать что там за циферки и прочие. тут сам разберись.
 
Kuroi написал(а):
Код:
public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer player)
{
        player.addPotionEffect((new PotionEffect(Potion.digSpeed.getId(), 20, 0)));
    return itemstack;
}
это воткни в класс итема, лень описывать что там за циферки и прочие. тут сам разберись.
Большое спасибо все работает!
И еще вопросик, как сделать перезарядку предмета, то если я его проюзал и потом минуту я не могу его юзать. Если не сложно напишите.
 
Сделай в классе переменную, в методе onItemRightClick устанавливай ей значение 1200 (1 минута = 60сек умножить на 20 тиков), а в методе onUpdate уменьшай ее на единицу. Также в методе onItemRightClick сделай условие, если твоя переменная равна нулю, то накладывай эффект и устанавливай значение 1200.
[merge_posts_bbcode]Добавлено: 03.11.2014 09:40:35[/merge_posts_bbcode]

Хотя я делаю так через данные в игроке:
В методе onItemRightClick проверяю, если player.getEntityData().getInteger("нбт_переменная") больше нуля, то return is, то есть завершаю метод. Если условие не выполняется и нбт_переменная равна нулю, то метод идет дальше, где выполняются остальные действия, а также player.getEntityData().setInteger("нбт_переменная ", 10) (устанавливается значение 10, что в итоге даст полсекунды задержки). В методе onUpdate я уменьшаю переменную на единицу - player.getEntityData().setInteger("нбт_переменная",player.getEntityData().getInteger("нбт_переменная")-1);
 
Kotor написал(а):
Сделай в классе переменную, в методе onItemRightClick устанавливай ей значение 1200 (1 минута = 60сек умножить на 20 тиков), а в методе onUpdate уменьшай ее на единицу. Также в методе onItemRightClick сделай условие, если твоя переменная равна нулю, то накладывай эффект и устанавливай значение 1200.
[merge_posts_bbcode]Добавлено: 03.11.2014 09:40:35[/merge_posts_bbcode]

Хотя я делаю так через данные в игроке:
В методе onItemRightClick проверяю, если player.getEntityData().getInteger("нбт_переменная") больше нуля, то return is, то есть завершаю метод. Если условие не выполняется и нбт_переменная равна нулю, то метод идет дальше, где выполняются остальные действия, а также player.getEntityData().setInteger("нбт_переменная ", 10) (устанавливается значение 10, что в итоге даст полсекунды задержки). В методе onUpdate я уменьшаю переменную на единицу - player.getEntityData().setInteger("нбт_переменная",player.getEntityData().getInteger("нбт_переменная")-1);
Не могли бы вы написать код, а то я начинающий и половину ваших слов я не понимаю.
 
Kotor написал(а):
Сделай в классе переменную, в методе onItemRightClick устанавливай ей значение 1200 (1 минута = 60сек умножить на 20 тиков), а в методе onUpdate уменьшай ее на единицу. Также в методе onItemRightClick сделай условие, если твоя переменная равна нулю, то накладывай эффект и устанавливай значение 1200.
Так делать нельзя, потому что эта переменная будет одна для всех игроков.

Проще сделать так:

Код:
    @Override
    public void onUpdate(ItemStack itemstack, World world, Entity p_77663_3_, int p_77663_4_, boolean p_77663_5_) {
        if (itemstack.hasTagCompound() && !world.isRemote) {
            NBTTagCompound nbt = itemstack.getTagCompound();
            int counter = nbt.getInteger("counter");
            if (counter > 0) {
                nbt.setInteger("counter", --counter);
                itemstack.setTagCompound(nbt);
            }
        }
    }
    
    @Override
    public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer player) {
        if (!world.isRemote) {
            int counter;
            if (itemstack.hasTagCompound())
                counter = itemstack.getTagCompound().getInteger("counter");
            else
                counter = 0;
            if (counter == 0) {
                NBTTagCompound nbt = new NBTTagCompound();
                nbt.setInteger("counter", 500);
                itemstack.setTagCompound(nbt);
                player.addPotionEffect((new PotionEffect(Potion.digSpeed.getId(), 20, 0)));
            } else {
                // Пока перезаряжается.
            }
        }
        return itemstack;
    }
Но предмет будет перезаряжаться, только когда находится в инвентаре игрока.
 
Тут не нужен НБТ, по идее. Через дамаг будет удобнее, да и индикатор будет красивый.
 
Asd73 написал(а):
Так делать нельзя, потому что эта переменная будет одна для всех игроков.
Поэтому у меня есть еще и второй вариант. Это будет для всех предметов такого типа, но для одного игрока. А если сделать, как Лаз говорит, то будет только для одного предмета.
Выбирайте, JankoZ.
 
Agravaine написал(а):
Неее, тогда он пудет дрыгаться в руках!!!
В каком смысле дрыгаться?
[merge_posts_bbcode]Добавлено: 03.11.2014 20:37:29[/merge_posts_bbcode]

Kotor написал(а):
Asd73 написал(а):
Так делать нельзя, потому что эта переменная будет одна для всех игроков.
Поэтому у меня есть еще и второй вариант. Это будет для всех предметов такого типа, но для одного игрока. А если сделать, как Лаз говорит, то будет только для одного предмета.
Выбирайте, JankoZ.
[font=Verdana, Helvetica, Arial, sans-serif]Да мне понравился ответ Лаз, но я не могу это реализовать так как я только начинающий, и что где менять я не знаю, я пытался удалять НБТ но после этого у меня выскакивало куча ошибок, скорее всего я не то удалил. Если надо я могу рассказать идею мода.[/font]
 
JankoZ написал(а):
Agravaine написал(а):
Неее, тогда он пудет дрыгаться в руках!!!
В каком смысле дрыгаться?
При виде от первого лица, предмет в руках будет дергаться при изменении дамага. Хотя это может я такой криворукий.


При использовании метадаты (урона/дамага) код будет примерно такой:
Код:
    @Override
    public void onUpdate(ItemStack itemstack, World world, Entity p_77663_3_, int p_77663_4_, boolean p_77663_5_) {
        if (itemstack.getItemDamage() > 0 && !world.isRemote) {
            itemstack.setItemDamage(itemstack.getItemDamage() - 1);
        }
    }
    
    @Override
    public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer player) {
        if (!world.isRemote && itemstack.getItemDamage() == 0) {
            itemstack.setItemDamage(200);
            player.addPotionEffect((new PotionEffect(Potion.digSpeed.getId(), 20, 0)));
        }
        return itemstack;
    }
 
Короче я вижу что без идеи мода не обойтись.
Я хочу сделать мод на артефакты из игры Stalker'а для проекта моего друга. В оригинале было что когда артефакт ложишь в определеный слот то он начинает работать. Но в моде все по другому, когда нажимаешь на артефакт то на игрока ложиться эффект зелья. И чтобы все это было честно я хочу сделать перезарядку артефакту по которому кликали. Эффект идет 30 сек. а перезарядка 1 мин. И еще артефакт это предмет.
Надеюсь идею уловили.
[merge_posts_bbcode]Добавлено: 03.11.2014 20:58:47[/merge_posts_bbcode]

И еще, объясните нубу что такое НБТ.
 
Вряд ли кто-то станет писать за тебя весь код, разве что небольшой кусочек.

Предметы хранят некоторое число - уровень урона (или метадата). Это число устанавливается через setItemDamage и читается через getItemDamage().
НБТ - это дополнительная структура в сейвах, которая может быть (а может и не быть) у предметов, блоков, энтитей.
В НБТ можно хранить разные данные (числа строки, массивы).
Таким образом оба варианта кода, которые я приводил, работают в принципе одинаково.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху