1717import net .minecraft .world .inventory .tooltip .TooltipComponent ;
1818import net .minecraft .world .item .ItemStack ;
1919import net .neoforged .bus .api .IEventBus ;
20- import net .neoforged .neoforge .client .event .*;
20+ import net .neoforged .neoforge .client .event .ClientTickEvent ;
21+ import net .neoforged .neoforge .client .event .ContainerScreenEvent ;
22+ import net .neoforged .neoforge .client .event .RecipesReceivedEvent ;
23+ import net .neoforged .neoforge .client .event .RegisterConditionalItemModelPropertyEvent ;
24+ import net .neoforged .neoforge .client .event .RegisterKeyMappingsEvent ;
25+ import net .neoforged .neoforge .client .event .RenderLevelStageEvent ;
26+ import net .neoforged .neoforge .client .event .ScreenEvent ;
2127import net .neoforged .neoforge .client .extensions .common .IClientFluidTypeExtensions ;
2228import net .neoforged .neoforge .client .extensions .common .RegisterClientExtensionsEvent ;
2329import net .neoforged .neoforge .client .settings .IKeyConflictContext ;
2430import net .neoforged .neoforge .client .settings .KeyModifier ;
2531import net .neoforged .neoforge .common .NeoForge ;
32+ import net .neoforged .neoforge .event .entity .player .ItemTooltipEvent ;
2633import net .p3pp3rf1y .sophisticatedcore .SophisticatedCore ;
2734import net .p3pp3rf1y .sophisticatedcore .api .IStashStorageItem ;
2835import net .p3pp3rf1y .sophisticatedcore .client .gui .StorageScreenBase ;
2936import net .p3pp3rf1y .sophisticatedcore .client .gui .utils .GuiSoundHelper ;
3037import net .p3pp3rf1y .sophisticatedcore .client .gui .utils .TranslationHelper ;
3138import net .p3pp3rf1y .sophisticatedcore .client .init .ModParticles ;
32- import net .p3pp3rf1y .sophisticatedcore .client .render .BlockHighlightRenderHelper ;
3339import net .p3pp3rf1y .sophisticatedcore .client .render .BlockHighlightRenderer ;
3440import net .p3pp3rf1y .sophisticatedcore .common .gui .StorageContainerMenuBase ;
3541import net .p3pp3rf1y .sophisticatedcore .init .ModFluids ;
@@ -59,21 +65,30 @@ private ClientEventHandler() {
5965
6066 public static void registerHandlers (IEventBus modBus ) {
6167 modBus .addListener (ModParticles ::registerFactories );
68+ modBus .addListener (ClientEventHandler ::registerConditionalItemModelProperties );
6269 modBus .addListener (ClientEventHandler ::registerFluidClientExtension );
6370 modBus .addListener (ClientEventHandler ::registerKeyMappings );
64- modBus .addListener (ClientEventHandler ::registerRenderPipelines );
6571 IEventBus eventBus = NeoForge .EVENT_BUS ;
6672 eventBus .addListener (StorageSoundHandler ::tick );
6773 eventBus .addListener (StorageSoundHandler ::onWorldUnload );
6874 eventBus .addListener (ClientEventHandler ::onDrawScreen );
6975 eventBus .addListener (ClientEventHandler ::onContainerScreenForeground );
7076 eventBus .addListener (ClientEventHandler ::recipesReceived );
77+ eventBus .addListener (ClientEventHandler ::onItemTooltip );
7178 eventBus .addListener (ClientEventHandler ::handleGuiKeyPress );
7279 eventBus .addListener (ClientEventHandler ::handleGuiMouseKeyPress );
7380 eventBus .addListener (ClientEventHandler ::renderLevelStage );
7481 eventBus .addListener (ClientEventHandler ::onTickEnd );
7582 }
7683
84+ private static void registerConditionalItemModelProperties (RegisterConditionalItemModelPropertyEvent event ) {
85+ event .register (SophisticatedCore .getRL ("ender_linker_bound" ), EnderLinkerBound .MAP_CODEC );
86+ }
87+
88+ private static void recipesReceived (RecipesReceivedEvent event ) {
89+ RecipeHelper .setRecipes (event .getRecipeMap ());
90+ }
91+
7792 private static void onTickEnd (ClientTickEvent .Post event ) {
7893 ItemStackKey .clearCache ();
7994 }
@@ -86,10 +101,6 @@ private static void renderLevelStage(RenderLevelStageEvent event) {
86101 BlockHighlightRenderer .render (event .getPoseStack (), partialTick , event .getCamera ().getPosition ());
87102 }
88103
89- private static void registerRenderPipelines (RegisterRenderPipelinesEvent event ) {
90- event .registerPipeline (BlockHighlightRenderHelper .THICK_HIGHLIGHT_PIPELINE );
91- }
92-
93104 private static void registerKeyMappings (RegisterKeyMappingsEvent event ) {
94105 event .register (SORT_KEYBIND );
95106 event .register (TRANSFER_TO_STORAGE_KEYBIND );
@@ -154,7 +165,7 @@ private static boolean tryCallSort(Screen gui) {
154165 MouseHandler mh = mc .mouseHandler ;
155166 double mouseX = mh .xpos () * mc .getWindow ().getGuiScaledWidth () / mc .getWindow ().getScreenWidth ();
156167 double mouseY = mh .ypos () * mc .getWindow ().getGuiScaledHeight () / mc .getWindow ().getScreenHeight ();
157- Slot selectedSlot = screen .getHoveredSlot (mouseX , mouseY );
168+ Slot selectedSlot = screen .findSlot (mouseX , mouseY );
158169 if (selectedSlot == null || container .isNotPlayersInventorySlot (selectedSlot .index )) {
159170 container .sort ();
160171 return true ;
@@ -163,10 +174,6 @@ private static boolean tryCallSort(Screen gui) {
163174 return false ;
164175 }
165176
166- private static void recipesReceived (RecipesReceivedEvent event ) {
167- RecipeHelper .setRecipes (event .getRecipeMap ());
168- }
169-
170177 private static void onDrawScreen (ScreenEvent .Render .Post event ) {
171178 Minecraft mc = Minecraft .getInstance ();
172179 Screen gui = mc .screen ;
@@ -188,6 +195,8 @@ private static void onContainerScreenForeground(ContainerScreenEvent.Render.Fore
188195 return ;
189196 }
190197 AbstractContainerMenu menu = containerGui .getMenu ();
198+ LinkerCraftingDiagnostics .requestIfChanged (menu );
199+ renderLinkerCraftingDiagnostics (event .getGuiGraphics (), menu );
191200 ItemStack held = menu .getCarried ();
192201 if (held .isEmpty ()) {
193202 return ;
@@ -204,6 +213,35 @@ private static void onContainerScreenForeground(ContainerScreenEvent.Render.Fore
204213 }
205214 }
206215
216+ private static void renderLinkerCraftingDiagnostics (GuiGraphics guiGraphics , AbstractContainerMenu menu ) {
217+ for (Slot slot : menu .slots ) {
218+ renderLinkerCraftingDiagnostic (guiGraphics , slot );
219+ }
220+ if (menu instanceof StorageContainerMenuBase <?> storageContainer ) {
221+ storageContainer .upgradeSlots .forEach (slot -> renderLinkerCraftingDiagnostic (guiGraphics , slot ));
222+ }
223+ }
224+
225+ private static void renderLinkerCraftingDiagnostic (GuiGraphics guiGraphics , Slot slot ) {
226+ if (LinkerCraftingDiagnostics .getStatusMessage (slot .index ) != null ) {
227+ guiGraphics .fill (slot .x , slot .y , slot .x + 16 , slot .y + 16 , 0x80FF0000 );
228+ }
229+ }
230+
231+ private static void onItemTooltip (ItemTooltipEvent event ) {
232+ if (!(Minecraft .getInstance ().screen instanceof AbstractContainerScreen <?> screen )) {
233+ return ;
234+ }
235+ Slot slot = screen .getSlotUnderMouse ();
236+ if (slot == null || slot .getItem () != event .getItemStack ()) {
237+ return ;
238+ }
239+ String statusMessage = LinkerCraftingDiagnostics .getStatusMessage (slot .index );
240+ if (statusMessage != null ) {
241+ event .getToolTip ().add (TranslationHelper .INSTANCE .translStatusMessage (statusMessage ).withStyle (ChatFormatting .RED ));
242+ }
243+ }
244+
207245 private static void renderStashSign (Minecraft mc , GuiGraphics guiGraphics , Slot s , ItemStack stack , IStashStorageItem .StashResult stashResult ) {
208246 int x = s .x ;
209247 int y = s .y ;
0 commit comments