Jump to content

Events only fired for own player on server


Renato

Recommended Posts

I try to get some information about other players when joining a server. For example, I want to listen to the `AttackEntityEvent` to observe if one player hits another. However, this event works only if my own player hits other entities. 

Also, I want to read the information in the chat on a server with `ClientChatReceivedEvent` but that only works in Singleplayer. I know these problems are kind of separate ones but maybe they are linked because I register my Event listeners in a wrong way. I don't know. 

I have the same problem with many other events like `ArrowNockEvent`, `LivingHurtEvent`. The only event that works correctly is my `TickEvent.PlayerTickEvent`.

Could you help me please. Are these events wrong? If so, are they other events that I can consider? If not, how can I gather information about other players on the server? Thanks for your help!

@Mod(Main.MODID)
public class Main {

    // Define mod id in a common place for everything to reference
    public static final String MODID = "tttdatacollector";
    // Directly reference a slf4j logger
    private static final Logger LOGGER = LogUtils.getLogger();

    public Main(FMLJavaModLoadingContext context) {
        IEventBus modEventBus = context.getModEventBus();

        // Register the commonSetup method for modloading
        modEventBus.addListener(this::commonSetup);

        // Register ourselves for server and other game events we are interested in
        MinecraftForge.EVENT_BUS.register(this);

        MinecraftForge.EVENT_BUS.register(new PlayerTickEventHandler());
        MinecraftForge.EVENT_BUS.register(new PlayerHurtEventHandler());
        MinecraftForge.EVENT_BUS.register(new PlayerAttackEntityEventHandler());
        MinecraftForge.EVENT_BUS.register(new ChatMessageEventHandler());
        MinecraftForge.EVENT_BUS.register(new KillEventHandler());
    }
}

public class ChatMessageEventHandler {

    private static final Logger log = LogUtils.getLogger();
    @SubscribeEvent
    public void onChatMessageServer(ClientChatReceivedEvent event) {
        log.info("ClientChatReceivedEvent");
        log.info(event.getMessage().getString());

    }
}

public class BowShotEventHandler {

    private static final Logger log = LogUtils.getLogger();

    @SubscribeEvent
    public void onArrowNock(ArrowNockEvent event) {
        log.info("onArrowNock");
        if (event.getEntity() instanceof ServerPlayer player) {
            log.info("Player nocked an arrow: {}", player.getName().getString());
        }
    }
}

public class PlayerAttackEntityEventHandler {

    private static final Logger log = LogUtils.getLogger();

    @SubscribeEvent
    public void onPlayerAttack(AttackEntityEvent event) {
        log.info("Player Attack by {} to {}", event.getEntity().getName().getString(), event.getTarget().getName().getString());
    }
}

public class PlayerTickEventHandler {

    private static final Logger log = LogUtils.getLogger();

    private final AggregatedPlayerDataCache aggregatedPlayerDataCache = AggregatedPlayerDataCache.getInstance();
    private final PlayerPositionCache playerPositionCache = PlayerPositionCache.getInstance();
    private final PlayerDistanceScoreCalculator playerDistanceScoreCalculator = PlayerDistanceScoreCalculator.getInstance();

    @SubscribeEvent
    public void onPlayerTick(TickEvent.PlayerTickEvent event) {
        var player = event.player;
        String playerName = player.getName().getString();

        var playerData = aggregatedPlayerDataCache.getPlayerData(playerName);
        playerData.setPlayerName(playerName);

        var oldPos = playerPositionCache.getPlayerPosition(playerName);

        this.calculateAndSetDistanceAndScore(oldPos, playerData, player);
    }
}

 

Link to comment
Share on other sites

  • 4 weeks later...

I think the events you're looking at are based on client-side information. Depending on where the mod is being run (client-side or server-side) the events may produce different results. You could use networking to communicate server events to the client.

What Forge version are you using?

By the way, try asking on the Discord in future, it's more active for dev support than the forums these days.

Edited by Paint_Ninja
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.