Skip to content

Commit a3116dc

Browse files
authored
Merge pull request #1149 from Axionize/fix/fabric-call-user-login-event
Fire UserJoinEvent() on Fabric
2 parents 3fda55b + f7a7271 commit a3116dc

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

fabric/src/main/java/io/github/retrooper/packetevents/mixin/PlayerListMixin.java

+38
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,13 @@
1919
package io.github.retrooper.packetevents.mixin;
2020

2121
import com.github.retrooper.packetevents.PacketEvents;
22+
import com.github.retrooper.packetevents.PacketEventsAPI;
23+
import com.github.retrooper.packetevents.event.UserLoginEvent;
24+
import com.github.retrooper.packetevents.protocol.player.User;
25+
import com.github.retrooper.packetevents.util.FakeChannelUtil;
2226
import io.netty.channel.Channel;
2327
import net.minecraft.network.Connection;
28+
import net.minecraft.network.chat.Component;
2429
import net.minecraft.server.level.ServerPlayer;
2530
import net.minecraft.server.network.CommonListenerCookie;
2631
import net.minecraft.server.players.PlayerList;
@@ -47,6 +52,39 @@ private void preNewPlayerPlace(
4752
PacketEvents.getAPI().getInjector().setPlayer(connection.channel, player);
4853
}
4954

55+
/**
56+
* @reason Associate connection instance with player instance and handle login event
57+
*/
58+
@Inject(
59+
method = "placeNewPlayer",
60+
at = @At(
61+
value = "INVOKE",
62+
target = "Lnet/minecraft/server/players/PlayerList;broadcastAll(Lnet/minecraft/network/protocol/Packet;)V",
63+
shift = At.Shift.AFTER
64+
)
65+
)
66+
private void onPlayerLogin(
67+
Connection connection, ServerPlayer player,
68+
CommonListenerCookie cookie, CallbackInfo ci
69+
) {
70+
PacketEventsAPI<?> api = PacketEvents.getAPI();
71+
72+
User user = api.getPlayerManager().getUser(player);
73+
if (user == null) {
74+
Object channelObj = api.getPlayerManager().getChannel(player);
75+
76+
// Check if it's a fake connection
77+
if (!FakeChannelUtil.isFakeChannel(channelObj) &&
78+
(!api.isTerminated() || api.getSettings().isKickIfTerminated())) {
79+
// Kick the player if they're not a fake player
80+
player.connection.disconnect(Component.literal("PacketEvents 2.0 failed to inject"));
81+
}
82+
return;
83+
}
84+
85+
api.getEventManager().callEvent(new UserLoginEvent(user, player));
86+
}
87+
5088
/**
5189
* @reason Minecraft creates a new player instance on respawn
5290
*/

0 commit comments

Comments
 (0)