Skip to content

Commit

Permalink
Add a warning for machine inactivity due to redstone control
Browse files Browse the repository at this point in the history
- Make GuiInsetElement able to track warnings with a supplier
- Use a separate texture for GuiInsetElement on a warning condition
- Inject an activation supplier into the redstone control tab during its creation
- Write a corresponding lang entry for "en_us" (we will need to support more langs in future)
  • Loading branch information
bukowski912 committed Nov 22, 2024
1 parent e7febd3 commit 34e0dd6
Show file tree
Hide file tree
Showing 9 changed files with 46 additions and 8 deletions.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 4 additions & 1 deletion src/main/java/mekanism/client/gui/GuiMekanismTile.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package mekanism.client.gui;

import java.util.function.BooleanSupplier;
import mekanism.api.security.IBlockSecurityUtils;
import mekanism.client.gui.element.tab.GuiRedstoneControlTab;
import mekanism.client.gui.element.tab.GuiSecurityTab;
import mekanism.client.gui.element.tab.window.GuiUpgradeWindowTab;
import mekanism.common.inventory.container.tile.MekanismTileContainer;
import mekanism.common.inventory.warning.WarningTracker.WarningType;
import mekanism.common.tile.base.TileEntityMekanism;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Inventory;
Expand Down Expand Up @@ -39,7 +41,8 @@ protected void addGenericTabs() {
upgradeWindowTab = addRenderableWidget(new GuiUpgradeWindowTab(this, tile, () -> upgradeWindowTab));
}
if (tile.supportsRedstone()) {
addRenderableWidget(new GuiRedstoneControlTab(this, tile));
BooleanSupplier supplier = trackWarning(WarningType.REDSTONE_UNACTIVATED, () -> !tile.isRedstoneActivated());
addRenderableWidget(new GuiRedstoneControlTab(this, tile).warning(supplier));
}
//Note: We check if the capability is present rather than calling hasSecurity so that we don't add the tab to the security desk
if (tile.getLevel() != null && IBlockSecurityUtils.INSTANCE.securityCapability(tile.getLevel(), tile.getBlockPos(), tile) != null) {
Expand Down
26 changes: 26 additions & 0 deletions src/main/java/mekanism/client/gui/element/GuiInsetElement.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,28 @@
package mekanism.client.gui.element;

import java.util.function.BooleanSupplier;
import mekanism.client.gui.IGuiWrapper;
import mekanism.common.inventory.warning.ISupportsWarning;
import mekanism.common.util.MekanismUtils;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.resources.ResourceLocation;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public abstract class GuiInsetElement<DATA_SOURCE> extends GuiSideHolder {

private static final ResourceLocation WARNING_LEFT = MekanismUtils.getResource(MekanismUtils.ResourceType.GUI, "warning_left.png");
private static final ResourceLocation WARNING_RIGHT = MekanismUtils.getResource(MekanismUtils.ResourceType.GUI, "warning_right.png");

protected final int border;
protected final int innerWidth;
protected final int innerHeight;
protected final DATA_SOURCE dataSource;
protected final ResourceLocation overlay;

@Nullable
protected BooleanSupplier warningSupplier;

public GuiInsetElement(ResourceLocation overlay, IGuiWrapper gui, DATA_SOURCE dataSource, int x, int y, int height, int innerSize, boolean left) {
super(gui, x, y, height, left, false);
this.overlay = overlay;
Expand All @@ -25,6 +35,11 @@ public GuiInsetElement(ResourceLocation overlay, IGuiWrapper gui, DATA_SOURCE da
active = true;
}

public GuiInsetElement<DATA_SOURCE> warning(@NotNull BooleanSupplier warningSupplier) {
this.warningSupplier = ISupportsWarning.compound(this.warningSupplier, warningSupplier);
return this;
}

@Override
public boolean isMouseOver(double xAxis, double yAxis) {
//TODO: override isHovered
Expand Down Expand Up @@ -55,6 +70,17 @@ protected ResourceLocation getOverlay() {
return overlay;
}

@Override
public void draw(@NotNull GuiGraphics guiGraphics) {
boolean warning = warningSupplier != null && warningSupplier.getAsBoolean();
if (warning) {
ResourceLocation texture = (left ? WARNING_LEFT : WARNING_RIGHT);
innerDraw(guiGraphics, texture);
} else {
super.draw(guiGraphics);
}
}

@Override
public void drawBackground(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTicks) {
super.drawBackground(guiGraphics, mouseX, mouseY, partialTicks);
Expand Down
8 changes: 6 additions & 2 deletions src/main/java/mekanism/client/gui/element/GuiSideHolder.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,13 @@ public void drawBackground(@NotNull GuiGraphics guiGraphics, int mouseX, int mou
}
}

private void draw(@NotNull GuiGraphics guiGraphics) {
protected void draw(@NotNull GuiGraphics guiGraphics) {
colorTab(guiGraphics);
GuiUtils.blitNineSlicedSized(guiGraphics, getResource(), relativeX, relativeY, width, height, 4, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0, 0, TEXTURE_WIDTH, TEXTURE_HEIGHT);
innerDraw(guiGraphics, getResource());
MekanismRenderer.resetColor(guiGraphics);
}

protected void innerDraw(@NotNull GuiGraphics guiGraphics, ResourceLocation texture) {
GuiUtils.blitNineSlicedSized(guiGraphics, texture, relativeX, relativeY, width, height, 4, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0, 0, TEXTURE_WIDTH, TEXTURE_HEIGHT);
}
}
1 change: 1 addition & 0 deletions src/main/java/mekanism/common/MekanismLang.java
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,7 @@ public enum MekanismLang implements ILangEntry {
ISSUE_INPUT_DOESNT_PRODUCE_OUTPUT("gui", "issues.input_doesnt_produce_output"),
ISSUE_INVALID_OREDICTIONIFICATOR_FILTER("gui", "issues.invalid_oredictionificator_filter"),
ISSUE_FILTER_HAS_BLACKLISTED_ELEMENT("gui", "issues.filter_has_blacklisted_element"),
ISSUE_REDSTONE_UNACTIVATED("gui", "issues.redstone_unactivated"),
//Laser Amplifier
ENTITY_DETECTION("laser_amplifier", "entity_detection"),
ENERGY_CONTENTS("laser_amplifier", "energy_contents"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ public enum WarningType {
NOT_ENOUGH_ENERGY_REDUCED_RATE(MekanismLang.ISSUE_NOT_ENOUGH_ENERGY_REDUCED_RATE),
INVALID_OREDICTIONIFICATOR_FILTER(MekanismLang.ISSUE_INVALID_OREDICTIONIFICATOR_FILTER, 4),
FILTER_HAS_BLACKLISTED_ELEMENT(MekanismLang.ISSUE_FILTER_HAS_BLACKLISTED_ELEMENT, 5),
REDSTONE_UNACTIVATED(MekanismLang.ISSUE_REDSTONE_UNACTIVATED),
;

private final ILangEntry langEntry;
Expand Down
12 changes: 7 additions & 5 deletions src/main/java/mekanism/common/tile/base/TileEntityMekanism.java
Original file line number Diff line number Diff line change
Expand Up @@ -1087,16 +1087,18 @@ public final void updatePower() {
}
}

public boolean canFunction() {
if (supportsRedstone()) {
return switch (controlType) {
public final boolean isRedstoneActivated() {
return !supportsRedstone() ||
switch (controlType) {
case DISABLED -> true;
case HIGH -> isPowered();
case LOW -> !isPowered();
case PULSE -> isPowered() && !redstoneLastTick;
};
}
return true;
}

public boolean canFunction() {
return isRedstoneActivated();
}
//End methods ITileRedstone

Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 34e0dd6

Please sign in to comment.