From dbdc345d4a36d354417dee68955da300e5cc42be Mon Sep 17 00:00:00 2001 From: Silver_David Date: Fri, 6 Aug 2021 13:18:12 -0400 Subject: [PATCH] Add a OnDatapackSyncEvent, useful as a notification for modders to send extra data to the client (#7912) --- .../server/players/PlayerList.java.patch | 9 +++- .../event/OnDatapackSyncEvent.java | 43 +++++++++++++++++++ .../debug/misc/OnDatapackSynctEventTest.java | 32 ++++++++++++++ src/test/resources/META-INF/mods.toml | 2 + 4 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 src/main/java/net/minecraftforge/event/OnDatapackSyncEvent.java create mode 100644 src/test/java/net/minecraftforge/debug/misc/OnDatapackSynctEventTest.java diff --git a/patches/minecraft/net/minecraft/server/players/PlayerList.java.patch b/patches/minecraft/net/minecraft/server/players/PlayerList.java.patch index 5d8f492ea8..581e8765f3 100644 --- a/patches/minecraft/net/minecraft/server/players/PlayerList.java.patch +++ b/patches/minecraft/net/minecraft/server/players/PlayerList.java.patch @@ -16,8 +16,11 @@ GameRules gamerules = serverlevel1.m_46469_(); boolean flag = gamerules.m_46207_(GameRules.f_46156_); boolean flag1 = gamerules.m_46207_(GameRules.f_46145_); -@@ -160,6 +_,7 @@ +@@ -158,8 +_,10 @@ + servergamepacketlistenerimpl.m_141995_(new ClientboundChangeDifficultyPacket(leveldata.m_5472_(), leveldata.m_5474_())); + servergamepacketlistenerimpl.m_141995_(new ClientboundPlayerAbilitiesPacket(p_11263_.m_150110_())); servergamepacketlistenerimpl.m_141995_(new ClientboundSetCarriedItemPacket(p_11263_.m_150109_().f_35977_)); ++ net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.OnDatapackSyncEvent(this, p_11263_)); servergamepacketlistenerimpl.m_141995_(new ClientboundUpdateRecipesPacket(this.f_11195_.m_129894_().m_44051_())); servergamepacketlistenerimpl.m_141995_(new ClientboundUpdateTagsPacket(this.f_11195_.m_129895_().m_144442_(this.f_11206_))); + net.minecraftforge.fmllegacy.network.NetworkHooks.syncCustomTagTypes(p_11263_, this.f_11195_.m_129895_()); @@ -110,9 +113,11 @@ } @Nullable -@@ -786,6 +_,7 @@ +@@ -785,7 +_,9 @@ + playeradvancements.m_135981_(this.f_11195_.m_129889_()); } ++ net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.OnDatapackSyncEvent(this, null)); this.m_11268_(new ClientboundUpdateTagsPacket(this.f_11195_.m_129895_().m_144442_(this.f_11206_))); + net.minecraftforge.fmllegacy.network.NetworkHooks.syncCustomTagTypes(this.f_11195_.m_129895_()); ClientboundUpdateRecipesPacket clientboundupdaterecipespacket = new ClientboundUpdateRecipesPacket(this.f_11195_.m_129894_().m_44051_()); diff --git a/src/main/java/net/minecraftforge/event/OnDatapackSyncEvent.java b/src/main/java/net/minecraftforge/event/OnDatapackSyncEvent.java new file mode 100644 index 0000000000..090a544a5c --- /dev/null +++ b/src/main/java/net/minecraftforge/event/OnDatapackSyncEvent.java @@ -0,0 +1,43 @@ +package net.minecraftforge.event; + +import javax.annotation.Nullable; + +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.players.PlayerList; +import net.minecraftforge.eventbus.api.Event; + +/** + * Fires when a player joins the server or when the reload command is ran, + * before tags and crafting recipes are sent to the client. Send datapack data + * to clients when this event fires. + */ +public class OnDatapackSyncEvent extends Event +{ + private final PlayerList playerList; + @Nullable + private final ServerPlayer player; + + public OnDatapackSyncEvent(PlayerList playerList, @Nullable ServerPlayer player) + { + this.playerList = playerList; + this.player = player; + } + + /** + * @return The server's player list to get a view of all players. + */ + public PlayerList getPlayerList() + { + return this.playerList; + } + + /** + * @return The player to sync datapacks to. Null when syncing for all players, + * such as when the reload command runs. + */ + @Nullable + public ServerPlayer getPlayer() + { + return this.player; + } +} diff --git a/src/test/java/net/minecraftforge/debug/misc/OnDatapackSynctEventTest.java b/src/test/java/net/minecraftforge/debug/misc/OnDatapackSynctEventTest.java new file mode 100644 index 0000000000..691bdf31e8 --- /dev/null +++ b/src/test/java/net/minecraftforge/debug/misc/OnDatapackSynctEventTest.java @@ -0,0 +1,32 @@ +package net.minecraftforge.debug.misc; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.event.OnDatapackSyncEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +@Mod("send_datapacks_to_client") +@Mod.EventBusSubscriber +public class OnDatapackSynctEventTest +{ + private static final Logger LOGGER = LogManager.getLogger(); + + @SubscribeEvent + protected static void onSendDataToClient(final OnDatapackSyncEvent event) + { + // Fire for a specific player on login + if (event.getPlayer() != null) + syncData(event.getPlayer()); + // Fire for all players on /reload + else + event.getPlayerList().getPlayers().forEach(OnDatapackSynctEventTest::syncData); + } + + private static void syncData(ServerPlayer player) + { + LOGGER.info("Sending modded datapack data to {}", player.getName().getString()); + } +} diff --git a/src/test/resources/META-INF/mods.toml b/src/test/resources/META-INF/mods.toml index 1de4b0f4d4..64c572f401 100644 --- a/src/test/resources/META-INF/mods.toml +++ b/src/test/resources/META-INF/mods.toml @@ -142,5 +142,7 @@ license="LGPL v2.1" modId="overlay_layers_test" [[mods]] modId="entity_renderer_events_test" +[[mods]] + modId="send_datapacks_to_client" # ADD ABOVE THIS LINE