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);
}
}