Серверные траблы

Версия Minecraft
1.12.1
API
Forge

sk9zist :l

Исправился
981
18
157
Привет и с Рождеством))
У меня к тебе несколько вопросов:
1. [РЕШЕНО] Известно что есть два эвента: LivingAttackEvent и LivingHurtEvent, но как выяснилось когда мод находиться на удаленном сервере - эти эвенты одинаковые. Если запускать в одиночке, конечно, то:
LivingAttackEvent - если его отменить то со стороны игрока ни будет вообще никакого отклика при его ударе. Он будет просто стоять
LivingHurtEvent - если его отменить то игрок только станет красным, может ещё подёргаеться но с места по прежнему не сдвинеться.
Так вот на сервере эти два эвента полностью сочетаются в один LivingHurtEvent (пробовал оба, всё равно игрок не краснеет при ударе если отменить эвент)
UPD: пробовал performHurtAnimation() (вроде должно проигрывать эту самую анимацию) но не работает также. Как использовать эвент, чтобы при отмене эвента - при ударе по игроку он покраснел и отбросился? Как при обычном ударе но без урона

2. [РЕШЕНО] В эвенте PlayerInteractEvent.LeftClickBlock c проверкой if(!e.getWorld().isRemote) создаю взрыв - итог: взрыва нету, блок сломался.
Как починить взрыв?

Эвент PlayerInteractEvent.LeftClickBlock походу был каким-то там клиентским, поэтому на сервере он не вызывался как-то. Заменил на BlockEvent.BreakEvent и отменил эвент - всё заработало.

3. [РЕШЕНО] Как на сервере отнимать здоровье у энтити? Пробовал attackEntityFrom но на сервере оно не работает

4. [РЕШЕНО] как устанавливать итему описание в зависимости от локализации? есть такой код:
Java:
if(FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT ? Minecraft.getMinecraft().getLanguageManager().getCurrentLanguage().getLanguageCode().toString() == "en_us" : true)
        {
            list.add("1");
        }
        if(FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT ? Minecraft.getMinecraft().getLanguageManager().getCurrentLanguage().getLanguageCode().toString() == "ru_ru" : false)
        {
            list.add("2");
        }
как видно из кода, даже если getEffectiveSide не равно клиенту - то всё равно должно добавляться английское описание. Но оно не добавляеться, под предметом ничего не написано. И, где вообще есть метод addInformation? Его нет ни на сервере, ни на клиенте
 
Последнее редактирование:
7,099
324
1,510
1. Сетни урон на 0 в эвенте
2. Тестируй не в креативе
3. setHealth попробуй
 

sk9zist :l

Исправился
981
18
157
1. Сетни урон на 0 в эвенте
Как? getAmount в эвенте нельзя изменять, или опять же setHealth'ом?
2. Тестируй не в креативе
Тоесть оно в креативе не будет работать? (я понимаю почему, полагаю) Я вроде тестировал и так и так, при следующем тесте учту это.
 

sk9zist :l

Исправился
981
18
157

sk9zist :l

Исправился
981
18
157
Тестируй не в креативе
К сожалению, в выживании взрыва тоже нет, и блок соответственно уже не ломается. (в креативе блок ломаеться но когда ты в него становишься то застреваешь в нём)
При этом если не проверять на сервер - то взрыв есть, но ты застреваешь в блоках.
1. Сетни урон на 0 в эвенте
Не работает. Когда я попытался проверить с LivingAttackEvent - то там действительно метода setAmount нету. Так что незнаю что теперь и делать.. (с LivingHurtEvent.setAmount() не работает)
@hohserg1
 
Последнее редактирование:
170
2
53
В Intellij IDEA всегда можно нажать Ctrl+Click на класс, чтобы посмотреть документацию, которую forge благо оставляет.
LivingDamageEventHandler:
    @SubscribeEvent
    public void on(LivingDamageEvent event) {
        if(yourCondition) {
            event.setAmount(0);
        }
    }
LivingDamageEvent - contains the final amount of damage that will be dealt to entity.
LivingHurtEvent - contains the amount of damage dealt to the Entity that was hurt.
 

sk9zist :l

Исправился
981
18
157
В Intellij IDEA всегда можно нажать Ctrl+Click на класс
В Eclipse можно просто навести.
которую forge благо оставляет.
Так это-ж простые комментарии над классом? С чего бы форджу их удалять.. (можно ещё кстати и свои сделать, на свои методы)
Не знал о таком эвенте, уже сколький раз думаю, что таблица эвентов в учебнике не дополнена... Может свою сделать...

Но оно всё равно не работает:
У сущности не должны отниматься хп. Сразу кину код, вот:
Java:
    public void on(LivingDamageEvent ev)
    {
        if(ev.getSource().getImmediateSource() instanceof EntityPlayer)
        {
            EntityPlayer src = (EntityPlayer) ev.getSource().getImmediateSource();
            if(src.getHeldItemMainHand().getItem() == MY_ITEM)
            {
                ev.setAmount(0);
            }
        }
    }
Но через 5-6 ударов по корове - она падает замертво. Видно, что не работает. Возможно решением станет установка Amount урона в 0.1 или меньше, т.к возможно там идёт умножение но мне нужно чтобы урона не было вообще.
И сразу можете сказать пожалуйста, чем можно заменить instanceof в начале эвента? Он же как бы очень тяжелый, можно ли использовать что-то другое вместо него или поставить до него какую-нибудь легкую проверку?
 
7,099
324
1,510
С чего бы форджу их удалять.. (можно ещё кстати и свои сделать, на свои методы)
Имелось ввиду, что форж после себя их оставляет. А ты думал, что эти комменты от моджангов?)

Да дад) Аннотация @SubscribeEvent имеется. Просто в окне вставки кода она обрезалась.
А как же EventBusSubscriber?
 

sk9zist :l

Исправился
981
18
157
Да фигня каето, я считаю. Она же не сэкономит мне пару строчки кода... А вот простая регистрация одного класса - думаю сэкономит так что пока плюсов не нахожу. Давай ближе к основной проблеме


Сейчас понял, эвент походу и не работает, кстати. При этом LivingHurtEvent (тоесть и LivingAttackEvent) работают
 

sk9zist :l

Исправился
981
18
157
Эвенты всё работают, всё нормально...

P.S. Просто я незнаю, как на сервере выводить лог:
screenshot.149.jpg

Но можно видеть, что эвент работает и пытаеться выводить лог. А LivingDamageEvent - не работает, так как я пока не нашёл лог на него. (это я тестировал с кодом только с дебагом, я не устанавливал на 0 amount и не отменял их)
А ещё мне почему-то приходиться пересоздавать мир чтобы мои изменения в коде эвентов применились..

Возвращаюсь к первоначальному вопросу: Как сделать так, чтобы при ударе по мобу "специальным" предметом - ему не наносился никакой урон? Может в классе предмета надо какой-нибудь метод переопределить?
 

will0376

Токсичная личность
2,072
55
584
Как сделать так, чтобы при ударе по мобу "специальным" предметом
LivingHurtEvent. получаешь того, КТО нанес дамаг(event.getSource().getTrueSource()) - проверяешь на игрока(инстанс) - проверяешь предмет в главной руке
 

sk9zist :l

Исправился
981
18
157
Хорошо. Сейчас сделаю и протестирую. Результат допишу к этому сообщению.

@will0376 А можно другим путём? Не работает :(
Java:
@SubscribeEvent
    public void onLivingHurtt(LivingHurtEvent e)
    {
        if(e.getSource().getTrueSource() instanceof EntityPlayer)
        {
            if(((EntityPlayer)e.getSource().getTrueSource()).getHeldItemMainhand().getItem() == MYITEM)
            {
                e.setAmount(0);
            }
        }
    }
Моб не бьётся.
 
Последнее редактирование:

sk9zist :l

Исправился
981
18
157
Я немного затупок, надо было вот так:
Java:
@SubscribeEvent
public void onLivingHurtt(LivingAttackEvent e)
{
    if(e.getSource().getTrueSource() instanceof EntityPlayer)
    {
        if(((EntityPlayer)e.getSource().getTrueSource()).getHeldItemMainhand().getItem() == ITEM)
        {
            e.setCanceled(true);
            if(e.getEntity().world.isRemote) e.getEntityLiving().performHurtAnimation();
        }
    }
}
и эвент LivingAttackEvent.

И @will0376 , спасибо за наводку. Везде использовал (не так уж и много где, но было) getImmediateSource, хотя надо было getTrueSource()

1 и 3 вопросы решены. Остались 2 и 4 вопросы, есть идеи?
 

sk9zist :l

Исправился
981
18
157

sk9zist :l

Исправился
981
18
157
Мне нужно добавлять описание без файлов локализации (только на одном предмете, он особенный) с проверкой на текущий установленный язык. Получение текущего языка у меня работает нормально, дело только в том, что..
где вообще есть метод addInformation? Его нет ни на сервере, ни на клиенте
А вот таким образом не работает (полный код):
Java:
@Override
    public void addInformation(ItemStack itemstack, World world, List<String> list, ITooltipFlag flag)
    {
        if(world.isRemote)
        {
            if(FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT ? Minecraft.getMinecraft().getLanguageManager().getCurrentLanguage().getLanguageCode().toString() == "en_us" : true)
            {
                list.add("1");
            }
            if(FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT ? Minecraft.getMinecraft().getLanguageManager().getCurrentLanguage().getLanguageCode().toString() == "ru_ru" : false)
            {
                list.add("2");
            }
        }
    }
на проверке на мир выдавало ошибку. В данный момент этой строчки уже нет, но и описание не устанавливаеться никакое. Как решить?
 
Сверху