diff --git a/src/main/java/emu/grasscutter/game/player/Player.java b/src/main/java/emu/grasscutter/game/player/Player.java index 46205d01d..68035a39f 100644 --- a/src/main/java/emu/grasscutter/game/player/Player.java +++ b/src/main/java/emu/grasscutter/game/player/Player.java @@ -37,6 +37,7 @@ import emu.grasscutter.net.proto.PlayerWorldLocationInfoOuterClass; import emu.grasscutter.net.proto.ProfilePictureOuterClass.ProfilePicture; import emu.grasscutter.net.proto.SocialDetailOuterClass.SocialDetail; import emu.grasscutter.net.proto.SocialShowAvatarInfoOuterClass; +import emu.grasscutter.server.event.game.PlayerJoinEvent; import emu.grasscutter.server.event.game.PlayerQuitEvent; import emu.grasscutter.server.event.player.PlayerReceiveMailEvent; import emu.grasscutter.server.game.GameServer; @@ -1014,6 +1015,11 @@ public class Player { // First notify packets sent this.setHasSentAvatarDataNotify(true); + + // Call join event. + PlayerJoinEvent event = new PlayerJoinEvent(this); event.call(); + if(event.isCanceled()) // If event is not cancelled, continue. + session.close(); } public void onLogout() { diff --git a/src/main/java/emu/grasscutter/server/event/game/PlayerCreationEvent.java b/src/main/java/emu/grasscutter/server/event/game/PlayerCreationEvent.java new file mode 100644 index 000000000..2049f4661 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/event/game/PlayerCreationEvent.java @@ -0,0 +1,27 @@ +package emu.grasscutter.server.event.game; + +import emu.grasscutter.game.player.Player; +import emu.grasscutter.server.event.types.GameEvent; +import emu.grasscutter.server.game.GameSession; + +public final class PlayerCreationEvent extends GameEvent { + private final GameSession session; + private Class playerClass; + + public PlayerCreationEvent(GameSession session, Class playerClass) { + this.session = session; + this.playerClass = playerClass; + } + + public GameSession getSession() { + return this.session; + } + + public void setPlayerClass(Class playerClass) { + this.playerClass = playerClass; + } + + public Class getPlayerClass() { + return this.playerClass; + } +} diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerSetPlayerBornDataReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerSetPlayerBornDataReq.java index 77dc5988b..25e6157ae 100644 --- a/src/main/java/emu/grasscutter/server/packet/recv/HandlerSetPlayerBornDataReq.java +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerSetPlayerBornDataReq.java @@ -13,7 +13,7 @@ import emu.grasscutter.net.packet.Opcodes; import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.proto.SetPlayerBornDataReqOuterClass.SetPlayerBornDataReq; import emu.grasscutter.net.packet.PacketHandler; -import emu.grasscutter.server.event.game.PlayerJoinEvent; +import emu.grasscutter.server.event.game.PlayerCreationEvent; import emu.grasscutter.server.game.GameSession; import emu.grasscutter.server.game.GameSession.SessionState; @@ -40,8 +40,10 @@ public class HandlerSetPlayerBornDataReq extends PacketHandler { nickname = "Traveler"; } - // Create character - Player player = new Player(session); + // Call creation event. + PlayerCreationEvent event = new PlayerCreationEvent(session, Player.class); event.call(); + // Create player instance from event. + Player player = event.getPlayerClass().getDeclaredConstructor(GameSession.class).newInstance(session); player.setNickname(nickname); try { @@ -92,10 +94,5 @@ public class HandlerSetPlayerBornDataReq extends PacketHandler { Grasscutter.getLogger().error("Error creating player object: ", e); session.close(); } - - // Call join event. - PlayerJoinEvent event = new PlayerJoinEvent(player); event.call(); - if(event.isCanceled()) // If event is not cancelled, continue. - session.close(); } }