diff --git a/src/main/java/com/hrznstudio/titanium/_impl/test/tile/TwentyFourTestTile.java b/src/main/java/com/hrznstudio/titanium/_impl/test/tile/TwentyFourTestTile.java index e8d4a099..9bb200d9 100644 --- a/src/main/java/com/hrznstudio/titanium/_impl/test/tile/TwentyFourTestTile.java +++ b/src/main/java/com/hrznstudio/titanium/_impl/test/tile/TwentyFourTestTile.java @@ -9,18 +9,30 @@ import com.hrznstudio.titanium._impl.test.TwentyFourTestBlock; import com.hrznstudio.titanium.annotation.Save; +import com.hrznstudio.titanium.api.IFactory; import com.hrznstudio.titanium.api.IItemStackQuery; +import com.hrznstudio.titanium.api.client.IScreenAddon; import com.hrznstudio.titanium.block.tile.PoweredTile; +import com.hrznstudio.titanium.client.screen.addon.BasicScreenAddon; +import com.hrznstudio.titanium.client.screen.addon.EnergyBarScreenAddon; +import com.hrznstudio.titanium.client.screen.addon.WidgetScreenAddon; import com.hrznstudio.titanium.component.inventory.InventoryComponent; import com.hrznstudio.titanium.component.progress.ProgressBarComponent; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.widget.SoundSlider; +import net.minecraft.client.gui.widget.TextFieldWidget; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Hand; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.text.StringTextComponent; +import net.minecraftforge.fml.client.gui.widget.Slider; import javax.annotation.Nonnull; import javax.annotation.ParametersAreNonnullByDefault; +import java.util.List; public class TwentyFourTestTile extends PoweredTile implements ITickableTileEntity { @Save @@ -35,18 +47,22 @@ public class TwentyFourTestTile extends PoweredTile implemen public TwentyFourTestTile() { super(TwentyFourTestBlock.TEST); - this.addInventory(first = new InventoryComponent("test", -120, 20, 1) + this.addInventory(first = new InventoryComponent("test", 80, 20, 1) .setComponentHarness(this) .setInputFilter(IItemStackQuery.ANYTHING.toSlotFilter())); - this.addInventory(second = new InventoryComponent("test2", 80, 30, 1) + this.addInventory(second = new InventoryComponent("test2", 80, 40, 1) .setComponentHarness(this) .setInputFilter(IItemStackQuery.ANYTHING.toSlotFilter())); - this.addProgressBar(bar = new ProgressBarComponent(20, 20, 500) + this.addProgressBar(bar = new ProgressBarComponent(110, 20, 500) .setCanIncrease(componentHarness -> true) .setOnFinishWork(() -> System.out.println("WOWOOW"))); - this.addInventory(third = new InventoryComponent("test3", 180, 30, 1) + this.addInventory(third = new InventoryComponent("test3", 80, 60, 1) .setComponentHarness(this) .setInputFilter(IItemStackQuery.ANYTHING.toSlotFilter())); + this.addGuiAddonFactory(() -> new WidgetScreenAddon(30, 185, new SoundSlider(Minecraft.getInstance(), 0, 0, SoundCategory.HOSTILE, 120))); + TextFieldWidget widget = new TextFieldWidget(Minecraft.getInstance().fontRenderer, 0, 0, 120, 20, new StringTextComponent("")); + widget.setText("This is a Text Widget"); + this.addGuiAddonFactory(() -> new WidgetScreenAddon(30, -25, widget)); } @Override @@ -65,6 +81,19 @@ public void tick() { } } + @Nonnull + @Override + public List> getScreenAddons() { + List> addons = super.getScreenAddons(); + for (IFactory addon : addons) { + if (addon.create() instanceof EnergyBarScreenAddon) { + addons.remove(addon); + addons.add(() -> new EnergyBarScreenAddon(50, 20, this.getEnergyStorage())); + } + } + return addons; + } + @Override @Nonnull public TwentyFourTestTile getSelf() { diff --git a/src/main/java/com/hrznstudio/titanium/api/client/IScreenAddon.java b/src/main/java/com/hrznstudio/titanium/api/client/IScreenAddon.java index 0c2a4df4..f9a81ac9 100644 --- a/src/main/java/com/hrznstudio/titanium/api/client/IScreenAddon.java +++ b/src/main/java/com/hrznstudio/titanium/api/client/IScreenAddon.java @@ -7,18 +7,22 @@ package com.hrznstudio.titanium.api.client; +import com.hrznstudio.titanium.Titanium; import com.hrznstudio.titanium.client.screen.asset.IAssetProvider; import com.mojang.blaze3d.matrix.MatrixStack; +import net.minecraft.client.gui.IGuiEventListener; import net.minecraft.client.gui.screen.Screen; import net.minecraft.util.text.ITextComponent; +import javax.annotation.Nullable; import java.util.Collections; import java.util.List; -public interface IScreenAddon { +public interface IScreenAddon extends IGuiEventListener { /** * Draws the component in the background layer * + * @param stack The {@link com.mojang.blaze3d.matrix.MatrixStack} * @param screen The current open screen * @param provider The current asset provider used in the GUI * @param guiX The gui X in the top left corner @@ -32,56 +36,291 @@ public interface IScreenAddon { /** * Draws the component in the foreground layer * - * @param screen The current open screen - * @param provider The current asset provider used in the GUI - * @param guiX The gui X in the top left corner - * @param guiY The gui Y in the top left corner - * @param mouseX The current mouse X - * @param mouseY The current mouse Y + * @param stack The {@link com.mojang.blaze3d.matrix.MatrixStack} + * @param screen The current open screen + * @param provider The current asset provider used in the GUI + * @param guiX The gui X in the top left corner + * @param guiY The gui Y in the top left corner + * @param mouseX The current mouse X + * @param mouseY The current mouse Y + * @param partialTicks Partial Ticks */ - void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY); + void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY, float partialTicks); /** * A list of strings that will be drawn as a tooltip when `isInside` returns true * - * @return A list of strings + * @return Returns a list of tooltip lines represented as {@link net.minecraft.util.text.ITextComponent}'s */ default List getTooltipLines() { return Collections.emptyList(); } /** - * A check to know if the mouse is inside of the component to draw the tooltip lines + * Called when init is called in the screen. * - * @param screen The current open screen - * @param mouseX The current mouse X - * @param mouseY The current mouse Y - * @return True if the mouse is inside the component + * @param screenX the left point of the Screen + * @param screenY the top point of the Screen + */ + default void init(int screenX, int screenY) {} + + /** + * @return Returns true if the addon is part of the background, background rendering. + */ + default boolean isBackground() { + return false; + } + + /** + * Called when the mouse is moved. + * + * @param xPos Current mouse coordinate X + * @param yPos Current mouse coordinate Y */ - boolean isInside(Screen screen, double mouseX, double mouseY); + @Override + default void mouseMoved(double xPos, double yPos) {} + + /** + * Called when a mouse button is clicked + * + * @param mouseX The mouse X coordinate where it was clicked + * @param mouseY The mouse Y coordinate where it was clicked + * @param button The Id of the button that was clicked + * @return Returns whether the mouse was clicked successfully or not + */ + @Override + default boolean mouseClicked(double mouseX, double mouseY, int button) { + return false; + } + + /** + * Called when the mouse button is released + * + * @param mouseX The Mouse's X coordinate where it was released + * @param mouseY The Mouse's Y coordinate where it was released + * @param button The Id of the mouse button that was released + * @return Returns true if the mouse button release was handled + */ + @Override + default boolean mouseReleased(double mouseX, double mouseY, int button) { + return false; + } + + /** + * Called when the mouse is pressed and dragged + * + * @param mouseX The X coordinate of the mouse where the drag was initiated + * @param mouseY The Y coordinate of the mouse where the drag was initiated + * @param button The Id of the Button that was pressed + * @param dragX The X coordinate of the mouse where the drag was finished + * @param dragY The Y coordinate of the mouse where the drag was finished + * @return Returns true if the drag was handled + */ + @Override + default boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) { + return false; + } + + /** + * Called when mouse scroll is applied + * + * @param mouseX The X coordinate of the mouse where the scroll was initiated + * @param mouseY The Y coordinate of the mouse where the scroll was initiated + * @param delta The scroll wheel delta (Change rate) + * @return Returns true if the scroll was handled + */ + @Override + default boolean mouseScrolled(double mouseX, double mouseY, double delta) { + return false; + } /** * Called when a key is pressed - * @param key The key pressed - * @param scan ?? - * @param modifiers ?? - * @return if something was done + * + * @param keyCode The keyboard key that was pressed or released + * @param scanCode The system-specific scancode of the key + * @param modifiers The 'bitfield' describing which modifiers keys were held down (ctrl, alt, shift, etc) + * @return Returns true if the key press was handled */ - default boolean keyPressed(int key, int scan, int modifiers) { + @Override + default boolean keyPressed(int keyCode, int scanCode, int modifiers) { return false; } /** - * Called when init is called in the screen. + * Called when a key is pressed * - * @param screenX the left point of the Screen - * @param screenY the top point of the Screen + * @param keyCode The keyboard key that was pressed or released + * @param scanCode The system-specific scancode of the key + * @param modifiers The 'bitfield' describing which modifiers keys were held down (ctrl, alt, shift, etc) + * @return Returns whether the key release was handled */ - default void init(int screenX, int screenY) { + @Override + default boolean keyReleased(int keyCode, int scanCode, int modifiers) { + return false; + } + /** + * Called when a specific 'Character' is typed + * + * @param codePoint The Unicode code point of the character + * @param modifiers The 'bitfield' describing which modifiers keys were held down (ctrl, alt, shift, etc) + * @return Returns true if the 'Character' being typed was handled + */ + @Override + default boolean charTyped(char codePoint, int modifiers) { + return false; } - default boolean isBackground() { + /** + * Called when Screen Focus changes + * + * @param focus If the screen the addon is part of is focused + * @return Returns true if the widget is part of a focused screen + */ + @Override + default boolean changeFocus(boolean focus) { return false; } + + /** + * Checks whether the mouse if over a specific object or point + * + * @param mouseX The X position of the mouse + * @param mouseY The Y position of the mouse + * @return Returns true if the mouse if over a specific object or point + */ + @Override + default boolean isMouseOver(double mouseX, double mouseY) { + return false; + } + + // Titanium-Extension Methods - Most are just X -> X translations but Screen-Sensitive + /** + * Called when the mouse is moved. + * + * @param screen The current open screen + * @param mouseX Current mouse coordinate X + * @param mouseY Current mouse coordinate Y + */ + default void handleMouseMoved(@Nullable Screen screen, double mouseX, double mouseY) { + mouseMoved(mouseX, mouseY); + } + + /** + * Returns whether a specific portion of the screen was clicked + * + * @param screen The current open screen + * @param guiX The current GUI X position + * @param guiY The current GUI Y position + * @param mouseX The current Mouse X position + * @param mouseY The current Mouse Y position + * @param mouseButton The current button being clicked + * @return Returns whether the click was handled + */ + default boolean handleMouseClicked(@Nullable Screen screen, int guiX, int guiY, double mouseX, double mouseY, int mouseButton) { + return mouseClicked(mouseX, mouseY, mouseButton); + } + + /** + * Called when the mouse button is released + * + * @param screen The current open screen + * @param mouseX The Mouse's X coordinate where it was released + * @param mouseY The Mouse's Y coordinate where it was released + * @param button The Id of the mouse button that was released + * @return Returns true if the mouse button release was handled + */ + default boolean handleMouseReleased(@Nullable Screen screen, double mouseX, double mouseY, int button) { + return mouseReleased(mouseX, button, button); + } + + /** + * Called when the mouse is pressed and dragged + * + * @param screen The current open screen + * @param mouseX The X coordinate of the mouse where the drag was initiated + * @param mouseY The Y coordinate of the mouse where the drag was initiated + * @param button The Id of the Button that was pressed + * @param dragX The X coordinate of the mouse where the drag was finished + * @param dragY The Y coordinate of the mouse where the drag was finished + * @return Returns true if the drag was handled + */ + default boolean handleMouseDragged(@Nullable Screen screen, double mouseX, double mouseY, int button, double dragX, double dragY) { + return mouseDragged(mouseX, mouseY, button, dragX, dragY); + } + + /** + * Called when mouse scroll is applied + * + * @param screen The current open screen + * @param mouseX The X coordinate of the mouse where the scroll was initiated + * @param mouseY The Y coordinate of the mouse where the scroll was initiated + * @param delta The scroll wheel delta (Change rate) + * @return Returns true if the scroll was handled + */ + default boolean handleMouseScrolled(@Nullable Screen screen, double mouseX, double mouseY, double delta) { + return mouseScrolled(mouseX, mouseY, delta); + } + + /** + * Called when a key is pressed + * + * @param screen The current open screen + * @param keyCode The keyboard key that was pressed or released + * @param scanCode The system-specific scancode of the key + * @param modifiers The 'bitfield' describing which modifiers keys were held down (ctrl, alt, shift, etc) + * @return Returns true if the key press was handled + */ + default boolean handleKeyPressed(@Nullable Screen screen, int keyCode, int scanCode, int modifiers) { + return keyPressed(keyCode, scanCode, modifiers); + } + + /** + * Called when a key is pressed + * + * @param screen The current open screen + * @param keyCode The keyboard key that was pressed or released + * @param scanCode The system-specific scancode of the key + * @param modifiers The 'bitfield' describing which modifiers keys were held down (ctrl, alt, shift, etc) + * @return Returns whether the key release was handled + */ + default boolean handleKeyReleased(@Nullable Screen screen, int keyCode, int scanCode, int modifiers) { + return keyReleased(keyCode, scanCode, modifiers); + } + + /** + * Called when a specific 'Character' is typed + * + * @param screen The current open screen + * @param codePoint The Unicode code point of the character + * @param modifiers The 'bitfield' describing which modifiers keys were held down (ctrl, alt, shift, etc) + * @return Returns true if the 'Character' being typed was handled + */ + default boolean handleCharTyped(@Nullable Screen screen, char codePoint, int modifiers) { + return charTyped(codePoint, modifiers); + } + + /** + * Called when Screen Focus changes + * + * @param screen The current open screen + * @param focus If the screen the addon is part of is focused + * @return Returns true if the widget is part of a focused screen + */ + default boolean handleFocusChange(@Nullable Screen screen, boolean focus) { + return changeFocus(focus); + } + + /** + * A check to know if the mouse is inside of the component to draw the tooltip lines + * + * @param screen The current open screen + * @param mouseX The current mouse X + * @param mouseY The current mouse Y + * @return Returns true if the mouse is inside the component + */ + default boolean isInside(@Nullable Screen screen, double mouseX, double mouseY) { + return isMouseOver(mouseX, mouseY); + } } diff --git a/src/main/java/com/hrznstudio/titanium/client/screen/ScreenAddonScreen.java b/src/main/java/com/hrznstudio/titanium/client/screen/ScreenAddonScreen.java index 13c0f71e..f208228f 100644 --- a/src/main/java/com/hrznstudio/titanium/client/screen/ScreenAddonScreen.java +++ b/src/main/java/com/hrznstudio/titanium/client/screen/ScreenAddonScreen.java @@ -7,17 +7,17 @@ package com.hrznstudio.titanium.client.screen; +import com.google.common.collect.Lists; import com.hrznstudio.titanium.api.IFactory; import com.hrznstudio.titanium.api.client.AssetTypes; import com.hrznstudio.titanium.api.client.IScreenAddon; import com.hrznstudio.titanium.api.client.assets.types.IBackgroundAsset; -import com.hrznstudio.titanium.client.screen.addon.interfaces.ICanMouseDrag; -import com.hrznstudio.titanium.client.screen.addon.interfaces.IClickable; import com.hrznstudio.titanium.client.screen.asset.IAssetProvider; import com.hrznstudio.titanium.util.AssetUtil; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.IGuiEventListener; import net.minecraft.client.gui.screen.Screen; import net.minecraft.util.text.StringTextComponent; import org.lwjgl.glfw.GLFW; @@ -77,7 +77,7 @@ public void renderBackground(MatrixStack stack, int mouseX, int mouseY, float pa } public void renderForeground(MatrixStack stack, int mouseX, int mouseY, float partialTicks) { - addonList.forEach(iGuiAddon -> iGuiAddon.drawForegroundLayer(stack, this, assetProvider, x, y, mouseX, mouseY)); + addonList.forEach(iGuiAddon -> iGuiAddon.drawForegroundLayer(stack, this, assetProvider, x, y, mouseX, mouseY, partialTicks)); for (IScreenAddon iScreenAddon : addonList) { if (iScreenAddon.isInside(this, mouseX - x, mouseY - y) && !iScreenAddon.getTooltipLines().isEmpty()) { // renderTooltip @@ -89,35 +89,31 @@ public void renderForeground(MatrixStack stack, int mouseX, int mouseY, float pa public abstract List> guiAddons(); private void checkForMouseDrag(int mouseX, int mouseY) { - if (GLFW.glfwGetMouseButton(Minecraft.getInstance().getMainWindow().getHandle(), GLFW.GLFW_MOUSE_BUTTON_LEFT) == GLFW.GLFW_PRESS) {//Main Window - if (!this.isMouseDragging) { - this.isMouseDragging = true; + int pressedButton = GLFW.glfwGetMouseButton(Minecraft.getInstance().getMainWindow().getHandle(), GLFW.GLFW_MOUSE_BUTTON_LEFT); + if (pressedButton == GLFW.GLFW_PRESS) {//Main Window + if (!this.isDragging()) { + this.setDragging(true); } else { for (IScreenAddon iScreenAddon : this.addonList) { - if (iScreenAddon instanceof ICanMouseDrag && iScreenAddon.isInside(null, mouseX - x, mouseY - y)) { - ((ICanMouseDrag) iScreenAddon).drag(mouseX - x, mouseY - y); + if (iScreenAddon.isInside(null, mouseX - x, mouseY - y)) { + iScreenAddon.handleMouseDragged(this, mouseX - x, mouseY - y, pressedButton, dragX, dragY); } } } this.dragX = mouseX; this.dragY = mouseY; } else { - this.isMouseDragging = false; + this.setDragging(false); } } - // mouseClicked @Override - public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) { - super.mouseClicked(mouseX, mouseY, mouseButton); - addonList.stream() - .filter(iScreenAddon -> iScreenAddon instanceof IClickable && iScreenAddon.isInside(this, mouseX - x, mouseY - y)) - .forEach(iScreenAddon -> ((IClickable) iScreenAddon).handleClick(this, x, y, mouseX, mouseY, mouseButton)); - return false; + public List getAddons() { + return addonList; } @Override - public List getAddons() { - return addonList; + public List getEventListeners() { + return Lists.newArrayList(getAddons()); } } diff --git a/src/main/java/com/hrznstudio/titanium/client/screen/addon/ArrowButtonScreenAddon.java b/src/main/java/com/hrznstudio/titanium/client/screen/addon/ArrowButtonScreenAddon.java index c3ae4560..678e1b0d 100644 --- a/src/main/java/com/hrznstudio/titanium/client/screen/addon/ArrowButtonScreenAddon.java +++ b/src/main/java/com/hrznstudio/titanium/client/screen/addon/ArrowButtonScreenAddon.java @@ -44,7 +44,7 @@ public void drawBackgroundLayer(MatrixStack stack, Screen screen, IAssetProvider } @Override - public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY) {} + public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY, float partialTicks) {} public IAssetType getAssetFromSideness(FacingUtil.Sideness sideness) { switch (sideness) { diff --git a/src/main/java/com/hrznstudio/titanium/client/screen/addon/AssetScreenAddon.java b/src/main/java/com/hrznstudio/titanium/client/screen/addon/AssetScreenAddon.java index 711fdd36..6a581023 100644 --- a/src/main/java/com/hrznstudio/titanium/client/screen/addon/AssetScreenAddon.java +++ b/src/main/java/com/hrznstudio/titanium/client/screen/addon/AssetScreenAddon.java @@ -48,7 +48,7 @@ public void drawBackgroundLayer(MatrixStack stack, Screen screen, IAssetProvider } @Override - public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY) { + public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY, float partialTicks) { if (assetType != null && !isBackground()) { AssetUtil.drawAsset(stack, screen, provider.getAsset(assetType), this.getPosX() + guiX, this.getPosY() + guiY); } diff --git a/src/main/java/com/hrznstudio/titanium/client/screen/addon/BasicButtonAddon.java b/src/main/java/com/hrznstudio/titanium/client/screen/addon/BasicButtonAddon.java index ac6f363f..37fbe912 100644 --- a/src/main/java/com/hrznstudio/titanium/client/screen/addon/BasicButtonAddon.java +++ b/src/main/java/com/hrznstudio/titanium/client/screen/addon/BasicButtonAddon.java @@ -8,7 +8,6 @@ package com.hrznstudio.titanium.client.screen.addon; import com.hrznstudio.titanium.Titanium; -import com.hrznstudio.titanium.client.screen.addon.interfaces.IClickable; import com.hrznstudio.titanium.client.screen.asset.IAssetProvider; import com.hrznstudio.titanium.component.button.ButtonComponent; import com.hrznstudio.titanium.network.locator.ILocatable; @@ -26,7 +25,7 @@ import java.util.Collections; import java.util.List; -public class BasicButtonAddon extends BasicScreenAddon implements IClickable { +public class BasicButtonAddon extends BasicScreenAddon { private ButtonComponent button; @@ -39,7 +38,7 @@ public BasicButtonAddon(ButtonComponent buttonComponent) { public void drawBackgroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY, float partialTicks) {} @Override - public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY) {} + public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY, float partialTicks) {} @Override public List getTooltipLines() { @@ -47,12 +46,13 @@ public List getTooltipLines() { } @Override - public void handleClick(Screen screen, int guiX, int guiY, double mouseX, double mouseY, int button) { + public boolean handleMouseClicked(Screen screen, int guiX, int guiY, double mouseX, double mouseY, int button) { Minecraft.getInstance().getSoundHandler().play(new SimpleSound(SoundEvents.UI_BUTTON_CLICK, SoundCategory.PLAYERS, 1f, 1f, Minecraft.getInstance().player.getPosition())); //getPosition - if (screen instanceof ContainerScreen && ((ContainerScreen) screen).getContainer() instanceof ILocatable) { - ILocatable locatable = (ILocatable) ((ContainerScreen) screen).getContainer(); + if (screen instanceof ContainerScreen && ((ContainerScreen) screen).getContainer() instanceof ILocatable) { + ILocatable locatable = (ILocatable) ((ContainerScreen) screen).getContainer(); Titanium.NETWORK.get().sendToServer(new ButtonClickNetworkMessage(locatable.getLocatorInstance(), this.button.getId(), new CompoundNBT())); } + return true; } @Override diff --git a/src/main/java/com/hrznstudio/titanium/client/screen/addon/BasicScreenAddon.java b/src/main/java/com/hrznstudio/titanium/client/screen/addon/BasicScreenAddon.java index e921a393..013831e5 100644 --- a/src/main/java/com/hrznstudio/titanium/client/screen/addon/BasicScreenAddon.java +++ b/src/main/java/com/hrznstudio/titanium/client/screen/addon/BasicScreenAddon.java @@ -21,7 +21,7 @@ protected BasicScreenAddon(int posX, int posY) { } @Override - public boolean isInside(Screen container, double mouseX, double mouseY) { + public boolean isMouseOver(double mouseX, double mouseY) { return mouseX > this.getPosX() && mouseX < this.getPosX() + getXSize() && mouseY > this.getPosY() && mouseY < this.getPosY() + getYSize(); } diff --git a/src/main/java/com/hrznstudio/titanium/client/screen/addon/DragPanelScreenAddon.java b/src/main/java/com/hrznstudio/titanium/client/screen/addon/DragPanelScreenAddon.java index dc6f9cec..e1090534 100644 --- a/src/main/java/com/hrznstudio/titanium/client/screen/addon/DragPanelScreenAddon.java +++ b/src/main/java/com/hrznstudio/titanium/client/screen/addon/DragPanelScreenAddon.java @@ -7,10 +7,12 @@ package com.hrznstudio.titanium.client.screen.addon; -import com.hrznstudio.titanium.client.screen.addon.interfaces.ICanMouseDrag; +import net.minecraft.client.gui.screen.Screen; import net.minecraft.util.math.MathHelper; -public abstract class DragPanelScreenAddon extends BasicScreenAddon implements ICanMouseDrag { +import javax.annotation.Nullable; + +public abstract class DragPanelScreenAddon extends BasicScreenAddon { private final int minX; private final int minY; @@ -43,9 +45,10 @@ public int getYSize() { } @Override - public void drag(int x, int y) { - this.scrollX = MathHelper.clamp(this.scrollX - x, this.minX, this.maxX); - this.scrollY = MathHelper.clamp(this.scrollY - y, this.minY, this.maxY); + public boolean handleMouseDragged(@Nullable Screen screen, double mouseX, double mouseY, int button, double dragX, double dragY) { + this.scrollX = (int) Math.round(MathHelper.clamp(this.scrollX - mouseX, this.minX, this.maxX)); + this.scrollY = (int) Math.round(MathHelper.clamp(this.scrollY - mouseY, this.minY, this.maxY)); + return super.handleMouseDragged(screen, mouseX, mouseY, button, dragX, dragY); } public int getScrollX() { diff --git a/src/main/java/com/hrznstudio/titanium/client/screen/addon/EnergyBarScreenAddon.java b/src/main/java/com/hrznstudio/titanium/client/screen/addon/EnergyBarScreenAddon.java index 475b6372..6b248ccd 100644 --- a/src/main/java/com/hrznstudio/titanium/client/screen/addon/EnergyBarScreenAddon.java +++ b/src/main/java/com/hrznstudio/titanium/client/screen/addon/EnergyBarScreenAddon.java @@ -70,7 +70,7 @@ public void drawBackgroundLayer(MatrixStack stack, Screen screen, IAssetProvider } @Override - public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY) { + public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY, float partialTicks) { drawForeground(stack, screen, provider, getPosX(), getPosY(), guiX, guiY, handler.getEnergyStored(), handler.getMaxEnergyStored()); } diff --git a/src/main/java/com/hrznstudio/titanium/client/screen/addon/FacingHandlerScreenAddon.java b/src/main/java/com/hrznstudio/titanium/client/screen/addon/FacingHandlerScreenAddon.java index 42d005f4..f0ac6e33 100644 --- a/src/main/java/com/hrznstudio/titanium/client/screen/addon/FacingHandlerScreenAddon.java +++ b/src/main/java/com/hrznstudio/titanium/client/screen/addon/FacingHandlerScreenAddon.java @@ -14,7 +14,6 @@ import com.hrznstudio.titanium.api.client.IScreenAddon; import com.hrznstudio.titanium.api.client.assets.types.IBackgroundAsset; import com.hrznstudio.titanium.client.screen.IScreenAddonConsumer; -import com.hrznstudio.titanium.client.screen.addon.interfaces.IClickable; import com.hrznstudio.titanium.client.screen.asset.IAssetProvider; import com.hrznstudio.titanium.component.button.ButtonComponent; import com.hrznstudio.titanium.component.sideness.IFacingComponent; @@ -47,7 +46,7 @@ import java.util.function.Consumer; -public class FacingHandlerScreenAddon extends BasicScreenAddon implements IClickable { +public class FacingHandlerScreenAddon extends BasicScreenAddon { private final IFacingComponent handler; private List buttonAddons; @@ -110,7 +109,7 @@ public void drawBackgroundLayer(MatrixStack stack, Screen screen, IAssetProvider } @Override - public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY) { + public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY, float partialTicks) { if (isInside(screen, mouseX - guiX, mouseY - guiY)) { AssetUtil.drawSelectingOverlay(stack, getPosX() + 1, getPosY() + 1, getPosX() + getXSize() - 1, getPosY() + getYSize() - 1); } @@ -140,8 +139,8 @@ public int getYSize() { } @Override - public void handleClick(Screen screen, int guiX, int guiY, double mouseX, double mouseY, int button) { - if (button == 1) return; + public boolean handleMouseClicked(Screen screen, int guiX, int guiY, double mouseX, double mouseY, int button) { + if (button == 1) return false; if (screen instanceof IScreenAddonConsumer && screen instanceof IHasContainer) { IScreenAddonConsumer screenAddonConsumer = (IScreenAddonConsumer) screen; Container container = ((IHasContainer) screen).getContainer(); @@ -184,7 +183,7 @@ public int getState() { } @Override - public void handleClick(Screen gui, int guiX, int guiY, double mouseX, double mouseY, int mouse) { + public boolean handleMouseClicked(Screen gui, int guiX, int guiY, double mouseX, double mouseY, int mouse) { StateButtonInfo info = getStateInfo(); if (info != null && gui instanceof IHasContainer) { CompoundNBT compound = new CompoundNBT(); @@ -201,6 +200,7 @@ public void handleClick(Screen gui, int guiX, int guiY, double mouseX, double mo } handler.getFacingModes().put(facing, handler.getValidFacingModes()[faceMode]); } + return true; } @Override @@ -219,6 +219,7 @@ public List getTooltipLines() { } } } + return false; } public boolean isClicked() { diff --git a/src/main/java/com/hrznstudio/titanium/client/screen/addon/ItemstackFilterScreenAddon.java b/src/main/java/com/hrznstudio/titanium/client/screen/addon/ItemstackFilterScreenAddon.java index f0dea4bc..b39878e2 100644 --- a/src/main/java/com/hrznstudio/titanium/client/screen/addon/ItemstackFilterScreenAddon.java +++ b/src/main/java/com/hrznstudio/titanium/client/screen/addon/ItemstackFilterScreenAddon.java @@ -10,7 +10,6 @@ import com.hrznstudio.titanium.Titanium; import com.hrznstudio.titanium.api.client.AssetTypes; import com.hrznstudio.titanium.api.filter.FilterSlot; -import com.hrznstudio.titanium.client.screen.addon.interfaces.IClickable; import com.hrznstudio.titanium.client.screen.asset.IAssetProvider; import com.hrznstudio.titanium.filter.ItemStackFilter; import com.hrznstudio.titanium.network.locator.ILocatable; @@ -29,7 +28,7 @@ import java.awt.*; import java.util.Objects; -public class ItemstackFilterScreenAddon extends BasicScreenAddon implements IClickable { +public class ItemstackFilterScreenAddon extends BasicScreenAddon { private final ItemStackFilter filter; @@ -66,7 +65,7 @@ public void drawBackgroundLayer(MatrixStack stack, Screen screen, IAssetProvider } @Override - public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY) { + public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY, float partialTicks) { for (FilterSlot filterSlot : filter.getFilterSlots()) { if (filterSlot != null && mouseX > (guiX + filterSlot.getX() + 1) && mouseX < (guiX + filterSlot.getX() + 16) && mouseY > (guiY + filterSlot.getY() + 1) && mouseY < (guiY + filterSlot.getY() + 16)) { RenderSystem.translated(0, 0, 200); @@ -81,7 +80,7 @@ public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider } @Override - public void handleClick(Screen screen, int guiX, int guiY, double mouseX, double mouseY, int button) { + public boolean handleMouseClicked(Screen screen, int guiX, int guiY, double mouseX, double mouseY, int button) { if (screen instanceof ContainerScreen && ((ContainerScreen) screen).getContainer() instanceof ILocatable) { ILocatable locatable = (ILocatable) ((ContainerScreen) screen).getContainer(); for (FilterSlot filterSlot : filter.getFilterSlots()) { @@ -93,8 +92,8 @@ public void handleClick(Screen screen, int guiX, int guiY, double mouseX, double Titanium.NETWORK.get().sendToServer(new ButtonClickNetworkMessage(locatable.getLocatorInstance(), -2, compoundNBT)); } } - } + return true; } } diff --git a/src/main/java/com/hrznstudio/titanium/client/screen/addon/LockableOverlayAddon.java b/src/main/java/com/hrznstudio/titanium/client/screen/addon/LockableOverlayAddon.java index edc92aa7..c6e2ad3f 100644 --- a/src/main/java/com/hrznstudio/titanium/client/screen/addon/LockableOverlayAddon.java +++ b/src/main/java/com/hrznstudio/titanium/client/screen/addon/LockableOverlayAddon.java @@ -37,7 +37,7 @@ public void drawBackgroundLayer(MatrixStack stack, Screen screen, IAssetProvider } @Override - public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY) { + public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY, float partialTicks) { if (isInside(screen, mouseX - guiX, mouseY - guiY)) { int extra = 4; IAsset asset = provider.getAsset(AssetTypes.BUTTON_SIDENESS_MANAGER); diff --git a/src/main/java/com/hrznstudio/titanium/client/screen/addon/ProgressBarScreenAddon.java b/src/main/java/com/hrznstudio/titanium/client/screen/addon/ProgressBarScreenAddon.java index e63929ea..ae4a1a98 100644 --- a/src/main/java/com/hrznstudio/titanium/client/screen/addon/ProgressBarScreenAddon.java +++ b/src/main/java/com/hrznstudio/titanium/client/screen/addon/ProgressBarScreenAddon.java @@ -48,7 +48,7 @@ public void drawBackgroundLayer(MatrixStack stack, Screen screen, IAssetProvider } @Override - public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY) {} + public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY, float partialTicks) {} public ProgressBarComponent getProgressBar() { return progressBar; diff --git a/src/main/java/com/hrznstudio/titanium/client/screen/addon/SlotsScreenAddon.java b/src/main/java/com/hrznstudio/titanium/client/screen/addon/SlotsScreenAddon.java index efeabba3..8f22596a 100644 --- a/src/main/java/com/hrznstudio/titanium/client/screen/addon/SlotsScreenAddon.java +++ b/src/main/java/com/hrznstudio/titanium/client/screen/addon/SlotsScreenAddon.java @@ -95,6 +95,6 @@ public void drawBackgroundLayer(MatrixStack stack, Screen screen, IAssetProvider } @Override - public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY) {} + public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY, float partialTicks) {} } diff --git a/src/main/java/com/hrznstudio/titanium/client/screen/addon/StateButtonAddon.java b/src/main/java/com/hrznstudio/titanium/client/screen/addon/StateButtonAddon.java index 36682a27..eb1f7e88 100644 --- a/src/main/java/com/hrznstudio/titanium/client/screen/addon/StateButtonAddon.java +++ b/src/main/java/com/hrznstudio/titanium/client/screen/addon/StateButtonAddon.java @@ -39,7 +39,7 @@ public void drawBackgroundLayer(MatrixStack stack, Screen screen, IAssetProvider } @Override - public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY) { + public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY, float partialTicks) { StateButtonInfo buttonInfo = getStateInfo(); if (buttonInfo != null && isInside(screen, mouseX - guiX, mouseY - guiY)) { AssetUtil.drawSelectingOverlay(stack, getPosX() + 1, getPosY() + 1, getPosX() + getXSize() - 1, getPosY() + getYSize() - 1); diff --git a/src/main/java/com/hrznstudio/titanium/client/screen/addon/TankScreenAddon.java b/src/main/java/com/hrznstudio/titanium/client/screen/addon/TankScreenAddon.java index e34bc816..2abd84d7 100644 --- a/src/main/java/com/hrznstudio/titanium/client/screen/addon/TankScreenAddon.java +++ b/src/main/java/com/hrznstudio/titanium/client/screen/addon/TankScreenAddon.java @@ -9,7 +9,6 @@ import com.hrznstudio.titanium.Titanium; import com.hrznstudio.titanium.api.client.assets.types.ITankAsset; -import com.hrznstudio.titanium.client.screen.addon.interfaces.IClickable; import com.hrznstudio.titanium.client.screen.asset.IAssetProvider; import com.hrznstudio.titanium.component.fluid.FluidTankComponent; import com.hrznstudio.titanium.network.locator.ILocatable; @@ -45,7 +44,7 @@ import java.util.ArrayList; import java.util.List; -public class TankScreenAddon extends BasicScreenAddon implements IClickable { +public class TankScreenAddon extends BasicScreenAddon { private IFluidTank tank; private ITankAsset asset; @@ -96,7 +95,7 @@ public void drawBackgroundLayer(MatrixStack stack, Screen screen, IAssetProvider } @Override - public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY) {} + public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY, float partialTicks) {} @Override public List getTooltipLines() { @@ -145,7 +144,7 @@ public int getYSize() { } @Override - public void handleClick(Screen screen, int guiX, int guiY, double mouseX, double mouseY, int button) { + public boolean handleMouseClicked(Screen screen, int guiX, int guiY, double mouseX, double mouseY, int button) { if (!Minecraft.getInstance().player.inventory.getItemStack().isEmpty() && Minecraft.getInstance().player.inventory.getItemStack().getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY).isPresent()){ Minecraft.getInstance().getSoundHandler().play(new SimpleSound(SoundEvents.UI_BUTTON_CLICK, SoundCategory.PLAYERS, 1f, 1f, Minecraft.getInstance().player.getPosition())); //getPosition if (screen instanceof ContainerScreen && ((ContainerScreen) screen).getContainer() instanceof ILocatable) { @@ -172,7 +171,9 @@ public void handleClick(Screen screen, int guiX, int guiY, double mouseX, double if (canDrainFromItem && button == 1) compoundNBT.putBoolean("Fill", false); }); Titanium.NETWORK.get().sendToServer(new ButtonClickNetworkMessage(locatable.getLocatorInstance(), -3, compoundNBT)); + return true; } } + return false; } } diff --git a/src/main/java/com/hrznstudio/titanium/client/screen/addon/TextFieldScreenAddon.java b/src/main/java/com/hrznstudio/titanium/client/screen/addon/TextFieldScreenAddon.java index 9c64fbad..ee21c9c7 100644 --- a/src/main/java/com/hrznstudio/titanium/client/screen/addon/TextFieldScreenAddon.java +++ b/src/main/java/com/hrznstudio/titanium/client/screen/addon/TextFieldScreenAddon.java @@ -35,7 +35,7 @@ public void drawBackgroundLayer(MatrixStack stack, Screen screen, IAssetProvider } @Override - public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY) {} + public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY, float partialTicks) {} @Override public void init(int guiX, int guiY) { diff --git a/src/main/java/com/hrznstudio/titanium/client/screen/addon/TextScreenAddon.java b/src/main/java/com/hrznstudio/titanium/client/screen/addon/TextScreenAddon.java index c51981cf..3c792e65 100644 --- a/src/main/java/com/hrznstudio/titanium/client/screen/addon/TextScreenAddon.java +++ b/src/main/java/com/hrznstudio/titanium/client/screen/addon/TextScreenAddon.java @@ -51,7 +51,7 @@ public void drawBackgroundLayer(MatrixStack stack, Screen screen, IAssetProvider } @Override - public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY) {} + public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY, float partialTicks) {} public String getText() { return text; diff --git a/src/main/java/com/hrznstudio/titanium/client/screen/addon/WidgetScreenAddon.java b/src/main/java/com/hrznstudio/titanium/client/screen/addon/WidgetScreenAddon.java new file mode 100644 index 00000000..dedbe368 --- /dev/null +++ b/src/main/java/com/hrznstudio/titanium/client/screen/addon/WidgetScreenAddon.java @@ -0,0 +1,99 @@ +package com.hrznstudio.titanium.client.screen.addon; + +import com.hrznstudio.titanium.Titanium; +import com.hrznstudio.titanium.client.screen.asset.IAssetProvider; +import com.mojang.blaze3d.matrix.MatrixStack; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.widget.Widget; + +public class WidgetScreenAddon extends BasicScreenAddon{ + + private final Widget widget; + + public WidgetScreenAddon(int posX, int posY, Widget widget) { + super(posX, posY); + this.widget = widget; + } + + @Override + public void init(int screenX, int screenY) { + this.widget.x = screenX + getPosX(); + this.widget.y = screenY + getPosY(); + } + + @Override + public void drawBackgroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY, float partialTicks) {} + + @Override + public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY, float partialTicks) { + widget.x = getPosX(); + widget.y = getPosY(); + widget.render(stack, mouseX, mouseY, partialTicks); + widget.x = guiX + getPosX(); + widget.y = guiY + getPosY(); + } + + @Override + public int getXSize() { + return widget.getWidth(); + } + + @Override + public int getYSize() { + return widget.getHeightRealms(); + } + + @Override + public void mouseMoved(double xPos, double yPos) { + widget.mouseMoved(xPos, yPos); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + return widget.mouseClicked(mouseX, mouseY, button); + } + + @Override + public boolean mouseReleased(double mouseX, double mouseY, int button) { + return widget.mouseReleased(mouseX, mouseY, button); + } + + @Override + public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) { + return widget.mouseDragged(mouseX, mouseY, button, dragX, dragY); + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double delta) { + return widget.mouseScrolled(mouseX, mouseY, delta); + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + return widget.keyPressed(keyCode, scanCode, modifiers); + } + + @Override + public boolean keyReleased(int keyCode, int scanCode, int modifiers) { + return widget.keyReleased(keyCode, scanCode, modifiers); + } + + @Override + public boolean charTyped(char codePoint, int modifiers) { + return widget.charTyped(codePoint, modifiers); + } + + @Override + public boolean changeFocus(boolean focus) { + return widget.changeFocus(focus); + } + + @Override + public boolean isMouseOver(double mouseX, double mouseY) { + return mouseX > this.getPosX() && mouseX < this.getPosX() + getXSize() && mouseY > this.getPosY() && mouseY < this.getPosY() + getYSize(); + } + + public Widget getWidget() { + return widget; + } +} diff --git a/src/main/java/com/hrznstudio/titanium/client/screen/addon/color/ColorPickerAddon.java b/src/main/java/com/hrznstudio/titanium/client/screen/addon/color/ColorPickerAddon.java index 2526d42f..fc2daab4 100644 --- a/src/main/java/com/hrznstudio/titanium/client/screen/addon/color/ColorPickerAddon.java +++ b/src/main/java/com/hrznstudio/titanium/client/screen/addon/color/ColorPickerAddon.java @@ -8,17 +8,17 @@ package com.hrznstudio.titanium.client.screen.addon.color; import com.hrznstudio.titanium.client.screen.addon.BasicScreenAddon; -import com.hrznstudio.titanium.client.screen.addon.interfaces.ICanMouseDrag; -import com.hrznstudio.titanium.client.screen.addon.interfaces.IClickable; import com.hrznstudio.titanium.client.screen.asset.IAssetProvider; import com.mojang.blaze3d.matrix.MatrixStack; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.AbstractGui; import net.minecraft.client.gui.screen.Screen; +import org.lwjgl.glfw.GLFW; import java.awt.*; import java.util.function.Consumer; -public class ColorPickerAddon extends BasicScreenAddon implements IClickable, ICanMouseDrag { +public class ColorPickerAddon extends BasicScreenAddon { private final Consumer colorConsumer; private ShadePickerAddon shadePickerAddon; @@ -63,29 +63,31 @@ public void drawBackgroundLayer(MatrixStack stack, Screen screen, IAssetProvider } @Override - public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY) { - this.shadePickerAddon.drawForegroundLayer(stack, screen, provider, guiX, guiY, mouseX, mouseY); - this.huePickerAddon.drawForegroundLayer(stack, screen, provider, guiX, guiY, mouseX, mouseY); + public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY, float partialTicks) { + this.shadePickerAddon.drawForegroundLayer(stack, screen, provider, guiX, guiY, mouseX, mouseY, partialTicks); + this.huePickerAddon.drawForegroundLayer(stack, screen, provider, guiX, guiY, mouseX, mouseY, partialTicks); } @Override - public void handleClick(Screen screen, int guiX, int guiY, double mouseX, double mouseY, int button) { + public boolean handleMouseClicked(Screen screen, int guiX, int guiY, double mouseX, double mouseY, int button) { if (this.huePickerAddon.isInside(screen, mouseX - guiX, mouseY - guiY)) { - this.huePickerAddon.handleClick(screen, guiX, guiY, mouseX, mouseY, button); + return this.huePickerAddon.handleMouseClicked(screen, guiX, guiY, mouseX, mouseY, button); } if (this.shadePickerAddon.isInside(screen, mouseX - guiX, mouseY - guiY)) { - this.shadePickerAddon.handleClick(screen, guiX, guiY, mouseX, mouseY, button); + return this.shadePickerAddon.handleMouseClicked(screen, guiX, guiY, mouseX, mouseY, button); } + return super.handleMouseClicked(screen, guiX, guiY, mouseX, mouseY, button); } @Override - public void drag(int x, int y) { - if (this.huePickerAddon.isInside(null, x, y)) { - this.huePickerAddon.drag(x, y); + public boolean handleMouseDragged(Screen screen, double mouseX, double mouseY, int button, double dragX, double dragY) { + if (this.huePickerAddon.isInside(null, mouseX, mouseY)) { + return this.huePickerAddon.handleMouseDragged(screen, mouseX, mouseY, button, mouseX, mouseY); } - if (this.shadePickerAddon.isInside(null, x, y)) { - this.shadePickerAddon.drag(x, y); + if (this.shadePickerAddon.isInside(null, mouseX, mouseY)) { + return this.shadePickerAddon.handleMouseDragged(screen, mouseX, mouseY, button, mouseX, mouseY); } + return super.handleMouseDragged(screen, mouseX, mouseY, button, dragX, dragY); } private void updateColor() { diff --git a/src/main/java/com/hrznstudio/titanium/client/screen/addon/color/HuePickerAddon.java b/src/main/java/com/hrznstudio/titanium/client/screen/addon/color/HuePickerAddon.java index 4afb15e2..b9a9c588 100644 --- a/src/main/java/com/hrznstudio/titanium/client/screen/addon/color/HuePickerAddon.java +++ b/src/main/java/com/hrznstudio/titanium/client/screen/addon/color/HuePickerAddon.java @@ -9,18 +9,17 @@ import com.hrznstudio.titanium.api.client.AssetTypes; import com.hrznstudio.titanium.client.screen.addon.BasicScreenAddon; -import com.hrznstudio.titanium.client.screen.addon.interfaces.ICanMouseDrag; -import com.hrznstudio.titanium.client.screen.addon.interfaces.IClickable; import com.hrznstudio.titanium.client.screen.asset.IAssetProvider; import com.hrznstudio.titanium.util.AssetUtil; import com.mojang.blaze3d.matrix.MatrixStack; import net.minecraft.client.gui.AbstractGui; import net.minecraft.client.gui.screen.Screen; +import javax.annotation.Nullable; import java.awt.*; import java.util.function.Consumer; -public class HuePickerAddon extends BasicScreenAddon implements IClickable, ICanMouseDrag { +public class HuePickerAddon extends BasicScreenAddon { private final Consumer consumer; private float hue; @@ -48,7 +47,7 @@ public void drawBackgroundLayer(MatrixStack stack, Screen screen, IAssetProvider } @Override - public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY) { + public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY, float partialTicks) { } @@ -59,15 +58,17 @@ private void drawColorBar(MatrixStack matrix, int x, int y, int width, int heigh } @Override - public void handleClick(Screen screen, int guiX, int guiY, double mouseX, double mouseY, int button) { + public boolean handleMouseClicked(Screen screen, int guiX, int guiY, double mouseX, double mouseY, int button) { this.hue = (float) ((mouseX - this.getPosX() - guiX) / getXSize()); consumer.accept(hue); + return true; } @Override - public void drag(int x, int y) { - this.hue = ((float) x - this.getPosX()) / getXSize(); + public boolean handleMouseDragged(@Nullable Screen screen, double mouseX, double mouseY, int button, double dragX, double dragY) { + this.hue = ((float) mouseX - this.getPosX()) / getXSize(); consumer.accept(hue); + return super.handleMouseDragged(screen, mouseX, mouseY, button, dragX, dragY); } public void setHue(float hue) { diff --git a/src/main/java/com/hrznstudio/titanium/client/screen/addon/color/ShadePickerAddon.java b/src/main/java/com/hrznstudio/titanium/client/screen/addon/color/ShadePickerAddon.java index f4ef2fbe..9b3a16fd 100644 --- a/src/main/java/com/hrznstudio/titanium/client/screen/addon/color/ShadePickerAddon.java +++ b/src/main/java/com/hrznstudio/titanium/client/screen/addon/color/ShadePickerAddon.java @@ -9,8 +9,6 @@ import com.hrznstudio.titanium.api.client.AssetTypes; import com.hrznstudio.titanium.client.screen.addon.BasicScreenAddon; -import com.hrznstudio.titanium.client.screen.addon.interfaces.ICanMouseDrag; -import com.hrznstudio.titanium.client.screen.addon.interfaces.IClickable; import com.hrznstudio.titanium.client.screen.asset.IAssetProvider; import com.hrznstudio.titanium.util.AssetUtil; import com.mojang.blaze3d.matrix.MatrixStack; @@ -23,11 +21,12 @@ import net.minecraft.util.math.vector.Matrix4f; import org.lwjgl.opengl.GL11; +import javax.annotation.Nullable; import java.awt.*; import java.util.function.Consumer; import java.util.function.Supplier; -public class ShadePickerAddon extends BasicScreenAddon implements IClickable, ICanMouseDrag { +public class ShadePickerAddon extends BasicScreenAddon { private static final int S_TILES = 10, V_TILES = 10; private final Supplier hueSupplier; @@ -62,7 +61,7 @@ public void drawBackgroundLayer(MatrixStack stack, Screen screen, IAssetProvider } @Override - public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY) { + public void drawForegroundLayer(MatrixStack stack, Screen screen, IAssetProvider provider, int guiX, int guiY, int mouseX, int mouseY, float partialTicks) { } @@ -102,19 +101,21 @@ private void drawGradient(MatrixStack matrix, int x, int y, int width, int heigh } @Override - public void drag(int x, int y) { - this.saturation = (((float) x - this.getPosX()) / getXSize()); - this.brightness = 1 - (((float) y - this.getPosY()) / getYSize()); + public boolean handleMouseDragged(@Nullable Screen screen, double mouseX, double mouseY, int button, double dragX, double dragY) { + this.saturation = (((float) mouseX - this.getPosX()) / getXSize()); + this.brightness = 1 - (((float) mouseY - this.getPosY()) / getYSize()); this.saturationConsumer.accept(saturation); this.brightnessConsumer.accept(brightness); + return super.handleMouseDragged(screen, mouseX, mouseY, button, dragX, dragY); } @Override - public void handleClick(Screen screen, int guiX, int guiY, double mouseX, double mouseY, int button) { + public boolean handleMouseClicked(Screen screen, int guiX, int guiY, double mouseX, double mouseY, int button) { this.saturation = (float) ((mouseX - this.getPosX() - guiX) / getXSize()); this.brightness = 1 - (float) ((mouseY - this.getPosY() - guiY) / getYSize()); this.saturationConsumer.accept(saturation); this.brightnessConsumer.accept(brightness); + return true; } public void setBrightness(float brightness) { diff --git a/src/main/java/com/hrznstudio/titanium/client/screen/addon/interfaces/ICanMouseDrag.java b/src/main/java/com/hrznstudio/titanium/client/screen/addon/interfaces/ICanMouseDrag.java deleted file mode 100644 index 2327dc58..00000000 --- a/src/main/java/com/hrznstudio/titanium/client/screen/addon/interfaces/ICanMouseDrag.java +++ /dev/null @@ -1,13 +0,0 @@ -/* - * This file is part of Titanium - * Copyright (C) 2021, Horizon Studio . - * - * This code is licensed under GNU Lesser General Public License v3.0, the full license text can be found in LICENSE.txt - */ - -package com.hrznstudio.titanium.client.screen.addon.interfaces; - -public interface ICanMouseDrag { - - void drag(int x, int y); -} diff --git a/src/main/java/com/hrznstudio/titanium/client/screen/addon/interfaces/IClickable.java b/src/main/java/com/hrznstudio/titanium/client/screen/addon/interfaces/IClickable.java deleted file mode 100644 index 1513b648..00000000 --- a/src/main/java/com/hrznstudio/titanium/client/screen/addon/interfaces/IClickable.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * This file is part of Titanium - * Copyright (C) 2021, Horizon Studio . - * - * This code is licensed under GNU Lesser General Public License v3.0, the full license text can be found in LICENSE.txt - */ - -package com.hrznstudio.titanium.client.screen.addon.interfaces; - -import net.minecraft.client.gui.screen.Screen; - -public interface IClickable { - - void handleClick(Screen screen, int guiX, int guiY, double mouseX, double mouseY, int button); - -} diff --git a/src/main/java/com/hrznstudio/titanium/client/screen/container/BasicContainerScreen.java b/src/main/java/com/hrznstudio/titanium/client/screen/container/BasicContainerScreen.java index 9797b60d..7409ac88 100644 --- a/src/main/java/com/hrznstudio/titanium/client/screen/container/BasicContainerScreen.java +++ b/src/main/java/com/hrznstudio/titanium/client/screen/container/BasicContainerScreen.java @@ -7,18 +7,20 @@ package com.hrznstudio.titanium.client.screen.container; +import com.google.common.collect.Lists; import com.hrznstudio.titanium.api.client.AssetTypes; import com.hrznstudio.titanium.api.client.IAsset; import com.hrznstudio.titanium.api.client.IScreenAddon; import com.hrznstudio.titanium.client.screen.IScreenAddonConsumer; import com.hrznstudio.titanium.client.screen.addon.AssetScreenAddon; -import com.hrznstudio.titanium.client.screen.addon.interfaces.ICanMouseDrag; -import com.hrznstudio.titanium.client.screen.addon.interfaces.IClickable; +import com.hrznstudio.titanium.client.screen.addon.WidgetScreenAddon; import com.hrznstudio.titanium.client.screen.asset.IAssetProvider; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.IGuiEventListener; import net.minecraft.client.gui.screen.inventory.ContainerScreen; +import net.minecraft.client.gui.widget.Widget; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.container.Container; import net.minecraft.util.text.ITextComponent; @@ -85,7 +87,7 @@ protected void drawGuiContainerBackgroundLayer(MatrixStack stack, float partialT getMinecraft().getTextureManager().bindTexture(IAssetProvider.getAsset(assetProvider, AssetTypes.BACKGROUND).getResourceLocation()); blit(stack, xCenter, yCenter, 0, 0, xSize, ySize); Minecraft.getInstance().fontRenderer.drawString(stack, TextFormatting.DARK_GRAY + title.getString(), xCenter + xSize / 2 - Minecraft.getInstance().fontRenderer.getStringWidth(title.getString()) / 2, yCenter + 6, 0xFFFFFF); - this.checkForMouseDrag(mouseX, mouseY); + //this.checkForMouseDrag(mouseX, mouseY); addons.stream().filter(IScreenAddon::isBackground).forEach(iGuiAddon -> { iGuiAddon.drawBackgroundLayer(stack, this, assetProvider, xCenter, yCenter, mouseX, mouseY, partialTicks); }); @@ -101,10 +103,10 @@ protected void drawGuiContainerForegroundLayer(MatrixStack stack, int mouseX, in if (iGuiAddon instanceof AssetScreenAddon) { AssetScreenAddon assetGuiAddon = (AssetScreenAddon) iGuiAddon; if (!assetGuiAddon.isBackground()) { - iGuiAddon.drawForegroundLayer(stack, this, assetProvider, xCenter, yCenter, mouseX, mouseY); + iGuiAddon.drawForegroundLayer(stack, this, assetProvider, xCenter, yCenter, mouseX, mouseY, minecraft.getRenderPartialTicks()); } } else { - iGuiAddon.drawForegroundLayer(stack, this, assetProvider, xCenter, yCenter, mouseX, mouseY); + iGuiAddon.drawForegroundLayer(stack, this, assetProvider, xCenter, yCenter, mouseX, mouseY, minecraft.getRenderPartialTicks()); } }); // renderHoveredToolTip @@ -117,14 +119,36 @@ protected void drawGuiContainerForegroundLayer(MatrixStack stack, int mouseX, in } } + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if (this.children != null) { + for (IGuiEventListener listener : this.children) { + if (listener instanceof WidgetScreenAddon) { + WidgetScreenAddon addon = (WidgetScreenAddon) listener; + Widget widget = addon.getWidget(); + if (widget.keyPressed(keyCode, scanCode, modifiers)) { + return true; + } + if (widget.isFocused()) { + if (scanCode == 18) { + return true; + } + } + } + } + } + return super.keyPressed(keyCode, scanCode, modifiers); + } + private void checkForMouseDrag(int mouseX, int mouseY) { - if (GLFW.glfwGetMouseButton(Minecraft.getInstance().getMainWindow().getHandle(), GLFW.GLFW_MOUSE_BUTTON_LEFT) == GLFW.GLFW_PRESS) {//Main Window + int pressedButton = GLFW.glfwGetMouseButton(Minecraft.getInstance().getMainWindow().getHandle(), GLFW.GLFW_MOUSE_BUTTON_LEFT); + if (pressedButton == GLFW.GLFW_PRESS) {//Main Window if (!this.isMouseDragging) { this.isMouseDragging = true; } else { for (IScreenAddon iScreenAddon : this.addons) { - if (iScreenAddon instanceof ICanMouseDrag && iScreenAddon.isInside(null, mouseX - this.xCenter, mouseY - this.yCenter)) { - ((ICanMouseDrag) iScreenAddon).drag(mouseX - this.xCenter, mouseY - this.yCenter); + if (iScreenAddon.isInside(this, mouseX - this.xCenter, mouseY - this.yCenter)) { + iScreenAddon.handleMouseDragged(this, mouseX - this.xCenter, mouseY - this.yCenter, pressedButton, dragX, dragY); } } } @@ -135,23 +159,6 @@ private void checkForMouseDrag(int mouseX, int mouseY) { } } - // mouseClicked - @Override - public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) { - super.mouseClicked(mouseX, mouseY, mouseButton); - new ArrayList<>(addons).stream().filter(iGuiAddon -> iGuiAddon instanceof IClickable && iGuiAddon.isInside(this, mouseX - xCenter, mouseY - yCenter)) - .forEach(iGuiAddon -> ((IClickable) iGuiAddon).handleClick(this, xCenter, yCenter, mouseX, mouseY, mouseButton)); - return false; - } - - // keyPressed - @Override - public boolean keyPressed(int keyCode, int scan, int modifiers) { - return this.getAddons().stream() - .anyMatch(screenAddon -> screenAddon.keyPressed(keyCode, scan, modifiers)) || - super.keyPressed(keyCode, scan, modifiers); - } - public int getX() { return xCenter; } @@ -171,6 +178,14 @@ public List getAddons() { return addons; } + @Override + public List getEventListeners() { + if (this.children != null) { + children.addAll(getAddons()); + } + return this.children; + } + public void setAddons(List addons) { this.addons = addons; } diff --git a/src/main/resources/assets/titanium/lang/en_us.json b/src/main/resources/assets/titanium/lang/en_us.json index 16b12fbd..5dd3d393 100644 --- a/src/main/resources/assets/titanium/lang/en_us.json +++ b/src/main/resources/assets/titanium/lang/en_us.json @@ -1,4 +1,8 @@ { + "block.titanium.block_test": "Test Block: (Base)", + "block.titanium.block_twenty_four_test": "Test Block: (Twenty-Four Rotation)", + "block.titanium.block_asset_test": "Test Block: (Asset)", + "block.titanium.machine_test": "Test Block: (Machine)", "tooltip.titanium.facing_handler.direction": "Direction: ", "tooltip.titanium.facing_handler.top": "Top", "tooltip.titanium.facing_handler.bottom": "Bottom", @@ -16,6 +20,7 @@ "tooltip.titanium.facing_handler.inventory": "Input", "tooltip.titanium.facing_handler.real_output": "Output", "tooltip.titanium.facing_handler.fluid_input": "Manual Fluid Insertion", + "tooltip.titanium.facing_handler.fluid": "Fluid Tank", "tooltip.titanium.progressbar.progress": "Progress: ", "tooltip.titanium.tank.fluid": "Fluid: ", "tooltip.titanium.tank.empty": "Empty ", @@ -29,7 +34,6 @@ "titanium.rewards.remove_success": "Removed reward successfully", "titanium.rewards.enabled_success": "Enabled reward successfully", "titanium.rewards.granted_success": "Granted reward to the server successfully", - "block.titanium.block_asset_test": "Asset Test", "direction.titanium.east": "East", "direction.titanium.west": "West", "direction.titanium.north": "North",