Skip to content

Commit 3a34008

Browse files
committed
Seperate out client and server side code for the Addon Manager
1 parent 2f7f582 commit 3a34008

File tree

5 files changed

+143
-147
lines changed

5 files changed

+143
-147
lines changed

src/main/java/net/roboxgamer/modernutils/client/screen/MechanicalCrafterScreen.java

Lines changed: 16 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import net.roboxgamer.modernutils.network.RedstoneModePayload;
2424
import net.roboxgamer.modernutils.network.RemainItemTogglePayload;
2525
import net.roboxgamer.modernutils.network.SlotStatePayload;
26+
import net.roboxgamer.modernutils.util.AddonClientManager;
2627
import net.roboxgamer.modernutils.util.AddonManager;
2728
import net.roboxgamer.modernutils.util.Constants;
2829
import net.roboxgamer.modernutils.util.RedstoneManager;
@@ -74,6 +75,7 @@ public class MechanicalCrafterScreen extends AbstractContainerScreen<MechanicalC
7475
private float lastProgress = 0f;
7576
private float visualProgress = 0f;
7677
private AddonManager addonManager;
78+
private AddonClientManager addonClientManager;
7779

7880
public MechanicalCrafterScreen(MechanicalCrafterMenu menu, Inventory playerInv, Component title) {
7981
super(menu, playerInv, title);
@@ -101,6 +103,7 @@ protected void init() {
101103
this.blockEntity = mcbe;
102104
this.redstoneManager = this.blockEntity.getRedstoneManager();
103105
this.addonManager = this.blockEntity.getAddonManager();
106+
this.addonClientManager = new AddonClientManager(this.addonManager);
104107

105108
} else {
106109
ModernUtilsMod.LOGGER.error("Mechanical Crafter Screen: BlockEntity is not a MechanicalCrafterBlockEntity!");
@@ -142,9 +145,10 @@ public void renderWidget(@NotNull GuiGraphics guiGraphics, int mouseX, int mouse
142145
92, 92, Component.empty(), ExtendedButton.WidgetPosition.BOTTOM_LEFT);
143146
addRenderableWidget(SideConfigTab);
144147

145-
this.addonManager.createAddonTab(this.player, this);
146-
addRenderableWidget(this.addonManager.getAddonTab());
147-
addRenderableWidget(this.addonManager.getAddonConfigButton());
148+
// Create addon tab and button using the client manager
149+
this.addonClientManager.createAddonTab(this.player, this);
150+
addRenderableWidget(this.addonClientManager.getAddonTab());
151+
addRenderableWidget(this.addonClientManager.getAddonConfigButton());
148152

149153
this.sideConfigBtn = new ExtendedButton(
150154
"Config_Btn",
@@ -309,13 +313,6 @@ private void renderScreen(GuiGraphics guiGraphics, int mouseX, int mouseY, float
309313
guiGraphics.blit(TEXTURE, this.leftPos, this.topPos, 0, 0, this.imageWidth, this.imageHeight);
310314
}
311315

312-
// private void renderWidgets(GuiGraphics guiGraphics, int mouseX, int mouseY,
313-
// float partialTick) {
314-
// for (Renderable renderable : this.renderables) {
315-
// renderable.render(guiGraphics, mouseX, mouseY, partialTick);
316-
// }
317-
// }
318-
319316
private void renderMyLabels(GuiGraphics guiGraphics, int mouseX, int mouseY) {
320317
guiGraphics.drawString(this.font, Component.literal("Input"), this.leftPos + 8, this.topPos + 80, 0x404040, false);
321318
guiGraphics.drawString(this.font, Component.literal("Output"), this.leftPos + 8, this.topPos + 112, 0x404040,
@@ -329,40 +326,23 @@ protected void renderBg(@NotNull GuiGraphics guiGraphics, float partialTick, int
329326

330327
public void render(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) {
331328
super.render(guiGraphics, mouseX, mouseY, partialTick);
332-
// renderTransparentBackground(guiGraphics);
333-
// this.renderScreen(guiGraphics, mouseX, mouseY, partialTick);
334-
// this.renderWidgets(guiGraphics, mouseX, mouseY, partialTick);
335329

336330
this.renderProgressBar(guiGraphics, partialTick); // Render the progress bar with partialTick
337331
this.renderMyLabels(guiGraphics, mouseX, mouseY);
338332
this.renderTooltip(guiGraphics, mouseX, mouseY);
339-
340-
// ModernUtils.LOGGER.debug("Mouse X: {}, Mouse Y: {}", mouseX, mouseY);
341-
342-
if (this.hoveredSlot instanceof OutputSlotItemHandler
343-
&& !this.menu.isSlotDisabled(this.hoveredSlot.getSlotIndex())
344-
&& this.menu.getCarried().isEmpty()
345-
&& !this.hoveredSlot.hasItem()
346-
&& !this.player.isSpectator()) {
347-
guiGraphics.renderTooltip(this.font, DISABLED_SLOT_TOOLTIP, mouseX, mouseY);
348-
}
349333
}
350334

351335
@Override
352336
public void renderSlot(@NotNull GuiGraphics guiGraphics, @NotNull Slot slot) {
353337
// Define the range of slot indices for addon slots
354-
int addonStartIndex = MechanicalCrafterMenu.INPUT_SLOTS_COUNT + MechanicalCrafterMenu.OUTPUT_SLOTS_COUNT + 10; // 10
355-
// is
356-
// for
357-
// crafting
358-
// slots
338+
int addonStartIndex = MechanicalCrafterMenu.INPUT_SLOTS_COUNT + MechanicalCrafterMenu.OUTPUT_SLOTS_COUNT + 10; // 10 is for crafting slots
359339
int addonEndIndex = addonStartIndex + this.addonManager.ADDON_SLOTS_COUNT;
360340

361341
// Check if this slot is an addon slot
362342
if (slot.index >= addonStartIndex && slot.index < addonEndIndex) {
363343
// Only render addon slots when both the tab is open and the slot is active
364-
if (this.addonManager.getAddonTab().isOpen() && slot.isActive()) {
365-
this.addonManager.renderAddonSlot(guiGraphics, slot);
344+
if (this.addonClientManager.getAddonTab().isOpen() && slot.isActive()) {
345+
this.addonClientManager.renderAddonSlot(guiGraphics, slot);
366346
super.renderSlot(guiGraphics, slot);
367347
}
368348
}
@@ -468,12 +448,15 @@ private void renderProgressBar(GuiGraphics guiGraphics, float partialTick) {
468448
this.leftPos + this.imageWidth - BORDER_THICKNESS, BAR_Y_POS + BAR_HEIGHT - BORDER_THICKNESS,
469449
0xFF000000); // Black background
470450

471-
// Only draw the progress fill if there is any progress
451+
// Draw progress (blue progress bar)
472452
if (progressWidth > 0) {
473-
// Draw progress fill (white fill) with the interpolated width
474453
guiGraphics.fill(this.leftPos + BORDER_THICKNESS, BAR_Y_POS + BORDER_THICKNESS,
475454
this.leftPos + BORDER_THICKNESS + progressWidth, BAR_Y_POS + BAR_HEIGHT - BORDER_THICKNESS,
476-
0xFFFFFFFF); // White fill
455+
0xFF0088FF); // Blue progress
477456
}
478457
}
458+
459+
public AddonClientManager getAddonManager() {
460+
return this.addonClientManager;
461+
}
479462
}

src/main/java/net/roboxgamer/modernutils/client/screen/MechanicalFurnaceScreen.java

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import net.roboxgamer.modernutils.client.screen.widgets.SlotWidget;
1818
import net.roboxgamer.modernutils.item.ModItems;
1919
import net.roboxgamer.modernutils.menu.MechanicalFurnaceMenu;
20+
import net.roboxgamer.modernutils.util.AddonClientManager;
2021
import net.roboxgamer.modernutils.util.AddonManager;
2122
import net.roboxgamer.modernutils.util.Constants;
2223
import org.jetbrains.annotations.NotNull;
@@ -48,8 +49,8 @@ public class MechanicalFurnaceScreen extends AbstractContainerScreen<MechanicalF
4849
private ExtendedButton frontSideBtn;
4950
private Map<Constants.Sides, SideConfigButton> sideButtons = new HashMap<>();
5051
private MechanicalFurnaceBlockEntity blockEntity;
51-
private AnimatedTab AddonTab;
5252
private AddonManager addonManager;
53+
private AddonClientManager addonClientManager;
5354

5455

5556
public MechanicalFurnaceScreen(MechanicalFurnaceMenu menu, Inventory playerInv, Component title) {
@@ -71,6 +72,7 @@ protected void init() {
7172
if (blockEntity instanceof MechanicalFurnaceBlockEntity be) {
7273
this.blockEntity = be;
7374
this.addonManager = this.blockEntity.getAddonManager();
75+
this.addonClientManager = new AddonClientManager(this.addonManager);
7476
} else {
7577
return;
7678
}
@@ -115,16 +117,10 @@ public boolean hasFuel() {
115117
);
116118
addRenderableWidget(sideConfigTab);
117119

118-
// Create addon tab and button
119-
this.addonManager.createAddonTab(this.player, this);
120-
addRenderableWidget(this.addonManager.getAddonTab());
121-
addRenderableWidget(this.addonManager.getAddonConfigButton());
122-
123-
// Create addon tab in top right corner
124-
this.AddonTab = new AnimatedTab(
125-
46, 68, Component.empty(), ExtendedButton.WidgetPosition.TOP_RIGHT
126-
);
127-
addRenderableWidget(AddonTab);
120+
// Create addon tab and button using the client manager
121+
this.addonClientManager.createAddonTab(this.player, this);
122+
addRenderableWidget(this.addonClientManager.getAddonTab());
123+
addRenderableWidget(this.addonClientManager.getAddonConfigButton());
128124

129125
// Create side config button
130126
this.sideConfigBtn = new ExtendedButton(
@@ -155,8 +151,6 @@ public void renderIcon(GuiGraphics guiGraphics, int mouseX, int mouseY, float pa
155151
};
156152
addRenderableWidget(this.sideConfigBtn);
157153

158-
// TODO: ADD ADDON TAB BUTTON
159-
160154
// Create auto import/export buttons
161155
this.autoImportBtn = new ExtendedButton(
162156
"AutoImportBtn",
@@ -339,12 +333,16 @@ protected void renderSlot(@NotNull GuiGraphics guiGraphics, @NotNull Slot slot)
339333
// Check if this slot is an addon slot
340334
if (slot.index >= addonStartIndex && slot.index < addonEndIndex) {
341335
// Only render addon slots when both the tab is open and the slot is active
342-
if (this.addonManager.getAddonTab().isOpen() && slot.isActive()) {
343-
this.addonManager.renderAddonSlot(guiGraphics, slot);
336+
if (this.addonClientManager.getAddonTab().isOpen() && slot.isActive()) {
337+
this.addonClientManager.renderAddonSlot(guiGraphics, slot);
344338
super.renderSlot(guiGraphics, slot);
345339
}
346340
} else {
347341
super.renderSlot(guiGraphics, slot);
348342
}
349343
}
350-
}
344+
345+
public AddonClientManager getAddonManager() {
346+
return this.addonClientManager;
347+
}
348+
}

src/main/java/net/roboxgamer/modernutils/integrations/jei/JEIPlugin.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ private static class MechanicalCrafterGuiHandler implements IGuiContainerHandler
6060
List<Rect2i> areas = new ArrayList<>();
6161

6262
// Only add the addon tab area if it's open
63-
var tab = containerScreen.getMenu().getBlockEntity().getAddonManager().getAddonTab();
63+
var tab = containerScreen.getAddonManager().getAddonTab();
6464
if (tab != null && tab.isOpen()) {
6565
// Get the tab dimensions and position
6666
int tabX = containerScreen.getGuiLeft() + containerScreen.getXSize(); // Position at the right edge of the GUI
@@ -101,7 +101,7 @@ private static class MechanicalFurnaceGuiHandler implements IGuiContainerHandler
101101
public @NotNull List<Rect2i> getGuiExtraAreas(MechanicalFurnaceScreen containerScreen) {
102102
List<Rect2i> areas = new ArrayList<>();
103103
// Only add the addon tab area if it's open
104-
var tab = containerScreen.getMenu().getBlockEntity().getAddonManager().getAddonTab();
104+
var tab = containerScreen.getAddonManager().getAddonTab();
105105
if (tab != null && tab.isOpen()) {
106106
// Get the tab dimensions and position
107107
int tabX = containerScreen.getGuiLeft() + containerScreen.getXSize(); // Position at the right edge of the GUI
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package net.roboxgamer.modernutils.util;
2+
3+
import net.minecraft.client.gui.GuiGraphics;
4+
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
5+
import net.minecraft.network.chat.Component;
6+
import net.minecraft.world.entity.player.Player;
7+
import net.minecraft.world.inventory.Slot;
8+
import net.minecraft.world.item.Items;
9+
import net.roboxgamer.modernutils.client.screen.AnimatedTab;
10+
import net.roboxgamer.modernutils.client.screen.ExtendedButton;
11+
12+
/**
13+
* AddonClientManager handles client-side addon UI functionality.
14+
* Manages the addon tab and config button rendering and interactions.
15+
*/
16+
public class AddonClientManager {
17+
private final AddonManager addonManager;
18+
private AnimatedTab addonTab;
19+
private ExtendedButton addonConfigBtn;
20+
21+
public AddonClientManager(AddonManager addonManager) {
22+
this.addonManager = addonManager;
23+
}
24+
25+
/**
26+
* Create the addon tab and config button for the screen.
27+
*/
28+
public void createAddonTab(Player player, AbstractContainerScreen<?> screen) {
29+
// Create addon tab in top right corner
30+
this.addonTab = new AnimatedTab(46, 68, null, ExtendedButton.WidgetPosition.TOP_RIGHT);
31+
this.addonManager.getAddonSlotHandlers().forEach(handler -> handler.setActive(false));
32+
33+
// Create addon config button in top right
34+
this.addonConfigBtn = new ExtendedButton(
35+
"AddonConfig_Btn",
36+
24, 24,
37+
Component.literal("Addons"),
38+
true,
39+
ExtendedButton.WidgetPosition.TOP_RIGHT,
40+
(button, clickAction, mouseX, mouseY) -> {
41+
if (this.addonTab != null) {
42+
boolean isOpen = this.addonTab.toggleOpen();
43+
this.setAddonSlotHandlerStates(isOpen);
44+
screen.getMinecraft().gameMode
45+
.handleInventoryButtonClick(
46+
screen.getMenu().containerId,
47+
AddonManager.ADDON_TAB_TOGGLE_BUTTON_ID);
48+
}
49+
},
50+
player) {
51+
@Override
52+
public void renderIcon(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick,
53+
ExtendedButton extendedButton) {
54+
float scale = 1;
55+
float offset = (extendedButton.getWidth() - (16 * scale)) / 2;
56+
57+
guiGraphics.pose().pushPose();
58+
guiGraphics.pose().translate(extendedButton.getX() + offset, extendedButton.getY() + offset, 0);
59+
guiGraphics.pose().scale(scale, scale, 1);
60+
guiGraphics.renderFakeItem(Items.DIAMOND_BLOCK.getDefaultInstance(), 0, 0);
61+
guiGraphics.pose().popPose();
62+
}
63+
};
64+
}
65+
66+
private void setAddonSlotHandlerStates(boolean isOpen) {
67+
this.addonManager.getAddonSlotHandlers().forEach(handler -> handler.setActive(isOpen));
68+
}
69+
70+
/**
71+
* Render an addon slot in the GUI.
72+
*/
73+
public void renderAddonSlot(GuiGraphics guiGraphics, Slot slot) {
74+
if (addonTab != null && addonTab.isOpen() && slot.isActive()) {
75+
guiGraphics.blitSprite(AddonManager.ADDON_SLOT_LOCATION_SPRITE, slot.x - 1, slot.y - 1, 18, 18);
76+
}
77+
}
78+
79+
/**
80+
* Get the addon tab widget.
81+
*/
82+
public AnimatedTab getAddonTab() {
83+
return this.addonTab;
84+
}
85+
86+
/**
87+
* Get the addon config button widget.
88+
*/
89+
public ExtendedButton getAddonConfigButton() {
90+
return this.addonConfigBtn;
91+
}
92+
93+
/**
94+
* Toggle addon slots active state and synchronize with tab.
95+
*/
96+
public boolean toggleAddonSlots() {
97+
boolean newState = !this.addonManager.getAddonSlotHandlers().getFirst().isActive();
98+
this.addonManager.getAddonSlotHandlers().forEach(handler -> handler.setActive(newState));
99+
if (this.addonTab != null) {
100+
// Synchronize tab state with slot state
101+
if (this.addonTab.isOpen() != newState) {
102+
this.addonTab.toggleOpen();
103+
}
104+
}
105+
return true;
106+
}
107+
}

0 commit comments

Comments
 (0)