Не работает ItemTooltipEvent.

Версия Minecraft
1.7.10
API
Forge
30
1
0
Всем привет. У меня по приколу перестал срабатывать эвент описания предметов.
EventHandler.java:
@SubscribeEvent
public void onItemTooltip(ItemTooltipEvent event) {
   //code
}
Proxy.java:
public void preInit(FMLPreInitializationEvent event) {
    FMLCommonHandler.instance().bus().register(new EventHandler());
    MinecraftForge.EVENT_BUS.register(new EventHandler());
}
Core.java:
@Mod(modid = Core.MODID, version = Core.VERSION, dependencies = "required-after:weightapi@[0.5.0]")
public class Core
{
    public static final String MODID = "ferrumweightsystem";
    public static final String VERSION = "0.7.2";
    public static final ExecutorService EXECUTOR_SERVICE = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
    @SidedProxy(
            clientSide = "ru.ferrumworld.ferrumweightsystem.core.ProxyClient",
            serverSide = "ru.ferrumworld.ferrumweightsystem.core.Proxy"
    )
    public static ru.ferrumworld.ferrumweightsystem.core.Proxy proxy;

    @Mod.EventHandler
    public void preInit(FMLPreInitializationEvent event) {
        proxy.preInit(event);
    }

    @Mod.EventHandler
    public void init(FMLInitializationEvent event) {
        proxy.init(event);
    }

    @Mod.EventHandler
    public void postInit(FMLPostInitializationEvent event) {
        proxy.postInit(event);
    }
}
Стоит отметить, что помимо этого отвалились все серверные эвенты. А клиентские (связанные с рендером) стабильно работают.
Вот что я пробовал сделать:
  • Потыкать регистрацию эвентхандлера по разным инитам в Proxy и коренном классе
  • Удалить все анн-ции @SideOnly
  • Пересобрать воркспейс
Как исправить эту дичь?
 
Решение
Я нашел в чем причина сей аномалии :ROFLMAO:
FWSEarlyPlugin.java:
@Override
public List<String> getMixinConfigs() {
    Core.getWeightProvider().loadWeight(); //тут
    return Collections.singletonList("mixin.minecraft.json");
}
Я хз каким образом, но во всём было виновато содержимое третьей строки. Мне просто нужно было как можно раньше загрузить весовую таблицу (Core#getWeightProvider#loadWeight), и я решил запихнуть загрузку в самый запуск игры. Перенес её в преинит, и все заработало!!
1738002743687.png1738002773113.png
upd Вообще в последнее время я часто сталкиваюсь с подобными аномалиями. В частности в серверном коде. Это всё (тестирование мода) происходит в IDEA. Иногда бывает такое, что логика выполняется, но дебаг (sout, apache logging) не выводится в консоль, будто бы на логике повешен @SideOnly(Side.SERVER). Иногда логика вообще не выполняется.
 
Его надо регистрировать в ClientProxy.
Угу. Я уже пробовал вынести его в отдельный эвентхандлер и зарегать в ProxyClient. Не помогло. В изначальном эвент хандлере клиентские события нормально работают, единственный (из клиентских) ItemTooltipEvent решил отвалится
 
Покажи класс EventHandler
EventHandler.java:
package ru.ferrumworld.ferrumweightsystem.handler;

import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import net.minecraft.util.StatCollector;
import net.minecraftforge.event.entity.player.ItemTooltipEvent;
import ru.ferrumworld.ferrumweightsystem.core.Core;
import ru.ferrumworld.ferrumweightsystem.util.Debugger;
import ru.ferrumworld.ferrumweightsystem.weightsystem.StorageManager;

import java.text.DecimalFormat;

public class EventHandler {
    DecimalFormat df = new DecimalFormat("0.00");
    @SubscribeEvent
    public void onTooltip(ItemTooltipEvent event) {
        Debugger.info("onTooltipEvent"); // дебаг, уведомляющий о событии
        GameRegistry.UniqueIdentifier uniqueIdentifier = GameRegistry.findUniqueIdentifierFor(event.itemStack.getItem());
        if (event.showAdvancedItemTooltips) event.toolTip.add(uniqueIdentifier.toString());
        //if (WeightRegistry.getActiveWeightProvider() == null) return;
        long weight = Core.getWeightProvider().getWeight(event.itemStack, event.entityPlayer.inventory, event.entityPlayer);
        if (weight >= 1000000) {
            event.toolTip.add(StatCollector.translateToLocalFormatted("gui.itemstack_weight_t", df.format(weight * 0.000001)));
        } else if (weight >= 1000) {
            event.toolTip.add(StatCollector.translateToLocalFormatted("gui.itemstack_weight_kg", df.format(weight * 0.001)));
        } else {
            event.toolTip.add(StatCollector.translateToLocalFormatted("gui.itemstack_weight_g", weight));
        }
        if (StorageManager.modWeightReducers.containsKey(event.itemStack.getItem())) {
            int weightReduction = StorageManager.modWeightReducers.get(event.itemStack.getItem());
            event.toolTip.add(StatCollector.translateToLocalFormatted("gui.itemstack_weight_reduction")+" §e"+weightReduction+"§6%");
        }
    }
}
И место, где ты регаешь его.
Proxy.java:
package ru.ferrumworld.ferrumweightsystem.core;

import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.common.MinecraftForge;
import ru.ferrumworld.ferrumweightsystem.handler.EventHandler;
import ru.ferrumworld.ferrumweightsystem.util.WeightUtils;

public class Proxy {
    public void preInit(FMLPreInitializationEvent event) {
        FMLCommonHandler.instance().bus().register(new EventHandler());
        MinecraftForge.EVENT_BUS.register(new EventHandler());
    }
    public void init (FMLInitializationEvent event) {
        WeightUtils.init();
    }
    public void postInit(FMLPostInitializationEvent event) {
    }
}
 
EventHandler.java:
@SubscribeEvent
public void onRenderOverlay(RenderGameOverlayEvent.Post event) {
    if (event.type == RenderGameOverlayEvent.ElementType.HOTBAR) {
        WeightHudRenderer.renderHud(event);
    }
}
Вот этот эвент из той же шины, что и ItemTooltipEvent. Он отлично работает. EventHandler зареган как в MinecraftForge.EVENT_BUS, так и в FMLCommonHandler.instance().bus().
И еще, разве нельзя использовать класс как универсальный хандлер для обеих шин? Раньше эта схема работала без проблем, и у меня есть еще пару модов с универсальными хандлерами. Проблемы с эвентами внутри них не наблюдаются.
 
Про клиентский прокси тебе уже сказали.
Угу. Я уже пробовал вынести его в отдельный эвентхандлер и зарегать в ProxyClient. Не помогло. В изначальном эвент хандлере клиентские события нормально работают, единственный (из клиентских) ItemTooltipEvent решил отвалится
 
Правда два объекта создает для регистрации класса, хз, правильно ли это
Нет: можно случайно запутать самого себя. Попытаешься обратиться к полю через this, а поведение может оказаться отличным потому что это другой экземпляр объекта.

Показывай ProxyClient. Похоже, вызовы super прошляпил.
 
Пустой класс с бесполезным кодом. Не нужно писать методы, если в них нет никакой логики - вызов сразу уйдёт в родительский класс.

Флаг отладчик вам в руки. Проверяйте какой код отрабатывает, какой - нет, всё тогда станет понятно.
 
Итак. Проведя небольшое исследование, я выяснил, что ItemTooltipEvent отвалился не только у моего мода, но и у некоторых остальных. В моде hbm's nuclear tech у некоторых предметов должна быть подсказка о радиоактивности, характеристиках как заряда для кастомной бомбы, а у брони должно быть описание, которое либо частично, либо полностью отсутствует (первый скрин - как должно быть, второй - что происходит у меня)
1737924749408.png1737924782945.png
 
И еще, разве нельзя использовать класс как универсальный хандлер для обеих шин?
Нет. Желательно делать по 2 класса для каждой шины: клиент/сервер для FML шины и клиент/сервер для модовой шины.
Банально чтобы не путаться (1) и избежать проблем с вызовами эвентов (2) как у тебя.

я выяснил, что ItemTooltipEvent отвалился не только у моего мода, но и у некоторых остальных.
Могу посоветовать только сменить версию forge (со старой на более новую, с новой на более старую). Хотя не уверен, как ты будешь это делать, учитывая, что поддержка 1.7.10 закончилась ещё пару лет тому назад.
 
Нет. Желательно делать по 2 класса для каждой шины: клиент/сервер для FML шины и клиент/сервер для модовой шины.
Банально чтобы не путаться (1) и избежать проблем с вызовами эвентов (2) как у тебя.
Делить на клиент/сервер достаточно, не более. Регистрировать один и тот же объект можно в обеих шинах, никаких вообще проблем с этим нет. cpw - всего лишь наследие ModLoader. К 1.12.2 его полностью упразднили.
 
Я нашел в чем причина сей аномалии :ROFLMAO:
FWSEarlyPlugin.java:
@Override
public List<String> getMixinConfigs() {
    Core.getWeightProvider().loadWeight(); //тут
    return Collections.singletonList("mixin.minecraft.json");
}
Я хз каким образом, но во всём было виновато содержимое третьей строки. Мне просто нужно было как можно раньше загрузить весовую таблицу (Core#getWeightProvider#loadWeight), и я решил запихнуть загрузку в самый запуск игры. Перенес её в преинит, и все заработало!!
1738002743687.png1738002773113.png
 
Назад
Сверху