Что такое события и как их ловить. Короткая и простая тема.

necauqua

когда-то был anti344
Администратор
1,216
27
172
Итак. Сабж понятен и нужен. Сюда прошу отсылать тех, кто "не в теме".

В: Что такое событие? 
О: Это, собственно говоря, событие, которое может "произойти" по такой-то причине, а именно если его вызвали где-либо.

В: Откуда мне знать. какие события вообще существуют?
О: Зайдя в такие пакеты, как net.minecraftforge.event и net.minecraftforge.client.event, а также в их субпакеты(net.minecraftforge.event.player) можно найти много чего интересного, очень поможет вам тупо перевод названия того или иного класса.

В: Ну и как "отловить" какое-либо событие?
О: В любом классе создаете метод с любым названием, но только с одним аргументом, а именно - с необходимым событием(ну и название ему). После этого, над методом пропишите аннотацию @ForgeSubscribe(кто не знает, что это, пример ниже). А потом его нужно зарегистрировать в главном классе мода(желательно в preInit), для этого нужно прописать MinecraftForge.EVENT_BUS.register(new Тут_название_вашего_класса()).

Например, я хочу отследить событие рендера игрока, и если у него в инвентаре есть звезда Ада, то отменить его рендер(сделать невидимым без эффекта и частиц от него). Вот пример моего метода:
Код:
@ForgeSubscribe
public void onRenderPlayer(RenderPlayerEvent.Pre e){
    if(e.entityPlayer.inventory.hasItem(Item.netherStar.itemID)){
        e.setCanceled(true);
    }
}

Наверняка в заметили странный метод e.setCanseled(true); Он-то как-раз таки не странный, просто я хочу сказать, что такое прокатит не со всеми событиями(только с теми, у которых есть аннотация @Cancelable). Так-же, вы могли заметить, что я использую не чисто RenderPlayerEvent, я еще добавляю приставку .Pre.
В этом нет ничего сложного, просто в классе RenderPlayerEvent если 2 класса - Pre и Post(а еще отдельные, для рендера брони и плащей, но они сложные и дурацкие, помоему). Так-вот Post нельзя отменить, так как он вызывается после рендера игрока, а Pre, соответсвенно, до.

Методы, которые отслеживают события можно распихать по разным классам, а можно засунуть и в один, так выгоднее, так как для каждого класса нужно писать еще раз MinecraftForge.EVENT_BUS.register(...

B: А как "исполнить" какое-либо событие?
О: Да легко! MinecraftForge.EVENT_BUS.post(new Событие(параметры...)). В событии вы можете использовать какую-либо информацию, которая в нем есть. Так вот, тут ему нужно дать эту информацию(параметры...)

В: Как создать свое событие?
О: Создаете класс, наследующий класс Event(class BlaBlaBla extends Event), делаете ему конструктор с необходимыми параметрами(если они вам(или не вам) нужны), и вызываете его, как описано выше. Очень полезно для создания API своему моду, что-бы другие могли отследить/изменить что-либо в вашем моде.

Так-же, подглядев в какое-либо событие, мы можем поставить нашему аннотацию @Cancelable, это значит, что вызов события сможет вернуть нам булев того, было ли оно отменено. Допустим у меня если событие клика по моему блоку(не надо делать такое событие, оно уже есть, и в нем есть параметр ид блока, то-бишь отловить можно клик по ЛЮБОМУ блоку, это просто пример), с аннотацией @Cancelable. В методе клика по блоку, чтобы "правильно" его вызвать, нужно сделать так:

Код:
public void типаКликПоБлоку(){
    if(MinecraftForge.EVENT_BUS.post(new Событие(параметры...))){
        //Действие
    }
}

Это значит. что мы можем отменить "действие". Точно не помню, в каком случае он возвращает true - если его не отменили, или наоборот, проверьте сами.
Внимание, вспомните, это работает, только если у вас над событием, в его классе, стоит аннотация @Cancelable xD

Ну что-же, я считаю. что для тех. кто хоть ЧУТЬ-ЧУТЬ разбирается, если не в Java, то в любой языке ООП, или в целом понимает/изучал его концепцию, то он все понял.


Спасибо Dimansel-у за нахождение этой темы черт его знает откуда.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Лишь бы написать чего и где еще.
 
Спасибо!! Наконец-то я сделаю анимацию, когда игрок держит автомат
 
Подскажите..
Eclipse ругается на onRenderPlayer(). В чем может быть дело? Версия: 1.5.2

c9977b3022264909fc23199c9d29bafe.jpg
 
С помощью события можно сделать спавн энтити на месте смерти игрока? Хочу сделать регдолл но я новичек в мододелании сама кукла готова но как применить на игроке я незнаю, мб через собития?
 
Сверху