События дублируются

Версия Minecraft
1.12.2
API
Forge
12
0
Привет, я начинающий в разработке модов на фордже, столкнулся с проблемой: события (ивенты) дублируются. И так со всеми событиями.
К примеру, код ниже должен вывести в чат "Hello, denowl" 1 раз, но пишет 2 раза.
1673342197906.png

Код EventHandler.java:
Java:
package com.den107.testmod;

import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.text.TextComponentString;
import net.minecraftforge.client.event.GuiOpenEvent;
import net.minecraftforge.event.entity.EntityJoinWorldEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
import org.lwjgl.input.Keyboard;

public class EventHandler {
    @SubscribeEvent
    public void onEntityJoinWorld(EntityJoinWorldEvent e) {
        if(e.getEntity() instanceof EntityPlayer) {
            EntityPlayer player = (EntityPlayer) e.getEntity();
            player.sendMessage(new TextComponentString("Hello, %p!".replace("%p", player.getName())));
        }
    }
}

Код для регистрации ивентов в CommonProxy:
Java:
package com.den107.testmod.proxy;

import com.den107.testmod.EventHandler;
import net.minecraft.item.Item;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;

public class CommonProxy {

    public static void preInit(FMLPreInitializationEvent event) {
        MinecraftForge.EVENT_BUS.register(new EventHandler());
    }

Версия 1.12.2.
 
Лучше уж на FMLCommonIntance#getSide...
Плохой совет. Метод проверяет "физический" клиент/сервер, возвращая всегда одинаковое значение.

Надёжнее и проще всегда ориентироваться на World, практически в любом месте к нему есть доступ.
 
getWorld(), конечно, не ко всем ивентам относится, но как использовать FMLCommonHandler.instance().getSide()?
isClient() ничего не меняет, события так-же дублируются, isServer() вообще ничего не делает
Для этого есть FMLcommonhandler#getEffectiveSide(). Он как раз и является альтернативой world.isRemote().

А вообще, более об этом подробно говорится тут: Sides - Forge Documentation
 
Для этого есть FMLcommonhandler#getEffectiveSide()
Сами разрабы Forge говорят, чтобы люди использовали это в самом крайнем случае. Пояснение об этом там же - он возвращает предполагаемую сторону, а не та, которая точно будет использоваться. World#isRemote возвращает же сторону, которую он использует, т.е. он наиболее точный.
 
Для этого есть FMLcommonhandler#getEffectiveSide(). Он как раз и является альтернативой world.isRemote().

А вообще, более об этом подробно говорится тут: Sides - Forge Documentation
Здесь это никак не поможет, как и FMLCommonHandler.instance().getSide().
Некоторые события работают без проблем, к примеру BlockPlace или LivingHurtEvent.
Однако такие ивенты, как GuiOpenEvent и TickEvent.ClientTickEvent срабатывают два раза
Java:
public class EventHandler {
    @SubscribeEvent
    public void onClientTick(TickEvent.ClientTickEvent e) {
        if(Keyboard.isKeyDown(Keyboard.KEY_J)) {
            System.out.println("Pressed");
        }
    @SubscribeEvent
    public void onGuiOpen(GuiOpenEvent e) {
        System.out.println("Открыт инвентарь");
    }
}

1673354641070.png
 
Для этого есть FMLcommonhandler#getEffectiveSide(). Он как раз и является альтернативой world.isRemote().
Ужасный совет, этот метод получает текущий поток и из его названия возвращает Side, он медленный, даже в Javadoc написано, что его использовать очень плохая идея.
 
Назад
Сверху