Отмена телепортации в измерения и добавление зависимостей к ней

Версия Minecraft
1.7.10

Sainthozier

Стрелочник
623
11
369
Всем привет.

Интересует способ отмены тп игрока в ад/энд. Попробовал поискать нужный эвент, но нашёл только PlayerChangedDimensionEvent. Идея состояла в том, чтобы чекнуть dimension игрока, и если он направляется, скажем, в энд - отменить это, чтобы никуда не тп. Но на практике оказалось всё сложнее. Хочу сделать доступ в измерения только при выполнении моих собственных условий(засетить две bool переменные и проверять их при тп). А вот каким способом - пока не понимаю, мои надежды на PlayerChangedDimensionEvent рухнули ) Может будут советы какие-нибудь, идеи?
 
1,976
68
220
1. Вкинуть хук в блоки порталов и проверять свои условия.
2. Можно хуком вкинуть эвент и обрабатывать в нём - это если эстетика не позволяет так внаглую отменять какие-то ванильные фичи.
Хуклиба Глуми - зэ бэст оф зэ бэст - тебе в помощь.
 
7,099
324
1,510

Sainthozier

Стрелочник
623
11
369
1. Вкинуть хук в блоки порталов и проверять свои условия.
Не поделишься каким-нибудь наглядным примером, пожалуйста?
Нашёл в BlockEndPortal.class такой метод:
Java:
/**
     * Triggered whenever an entity collides with this block (enters into the block). Args: world, x, y, z, entity
     */
    public void onEntityCollidedWithBlock(World p_149670_1_, int p_149670_2_, int p_149670_3_, int p_149670_4_, Entity p_149670_5_)
    {
        if (p_149670_5_.ridingEntity == null && p_149670_5_.riddenByEntity == null && !p_149670_1_.isRemote)
        {
            p_149670_5_.travelToDimension(1);
        }
    }
Как именно добраться к этому методу, чтобы добавить своё условие?
 
7,099
324
1,510
Учебник читал?
Если очень коротко, то:
копируешь объявление метода в свой класс с хуками, делаешь stick public
Добавляешь аннотацию @Hook, настраиваешь ее параметры как тебе нужно.
Исходя из логики, которую хочешь добавить что-то пишешь в теле метода.
Примеры: HookLib/AnnotationHooks.java at master · GloomyFolken/HookLib · GitHub
 
476
9
39

Sainthozier

Стрелочник
623
11
369
Спасибо, конечно, но у меня так-то получилось всё сделать. Но не так, как я этого хотел. Т.е. оно работает, но очень криво.
Например, метод onEntityCollidedWithBlock вроде бы как должен работать только с BlockEndPortal, т.к. я его передал первым параметром в методе хука, но почему-то срабатывает всегда, на каком блоке я бы не находился.
Да и разобрал несколько модов с курса, которые как-нибудь ограничивают порталы и увидел, что никто не делает это так, как сделал бы я. Мне не нравится их реализация, я думал, что можно как-нибудь отменить взаимодействие игрока с блоком портала, но... сложновато что-то )
 
476
9
39
отменить взаимодействие игрока с блоком портала
Ну так есть же метод по типу воды.
Т.е при входе в блок.
В него запили проверку по player.getPortalCooldown();
И если false отменяем рендер волн от портала у игрока и вырубаем все функции блока
 
Сверху