Skip to content

Commit

Permalink
Add a warning for redstone conditions not being met
Browse files Browse the repository at this point in the history
- Make GuiInsetElement able to track warnings through a supplier
- Use a separate texture for GuiInsetElement during a warning
- Track the activation warning under GuiRedstoneControlTab
- Add the corresponding lang entry to MekanismLangProvider
- Synchronize activation (redstone) state of TileEntityMekanism
  • Loading branch information
bukowski912 committed Dec 25, 2024
1 parent f34ea72 commit e281bba
Show file tree
Hide file tree
Showing 12 changed files with 53 additions and 12 deletions.

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

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

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

Original file line number Diff line number Diff line change
Expand Up @@ -1182,6 +1182,7 @@ private void addMisc() {
add(MekanismLang.ISSUE_INPUT_DOESNT_PRODUCE_OUTPUT, " - Input does not produce output");
add(MekanismLang.ISSUE_INVALID_OREDICTIONIFICATOR_FILTER, " - Filter is no longer valid or supported");
add(MekanismLang.ISSUE_FILTER_HAS_BLACKLISTED_ELEMENT, " - Filter contains at least one element that is blacklisted");
add(MekanismLang.ISSUE_REDSTONE_PREVENTS_ACTIVATION, " - Redstone conditions not met");
//Laser Amplifier
add(MekanismLang.ENTITY_DETECTION, "Entity Detection");
add(MekanismLang.ENERGY_CONTENTS, "Energy Contents");
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/mekanism/client/gui/GuiMekanismTile.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
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 +40,7 @@ protected void addGenericTabs() {
upgradeWindowTab = addRenderableWidget(new GuiUpgradeWindowTab(this, tile, () -> upgradeWindowTab));
}
if (tile.supportsRedstone()) {
addRenderableWidget(new GuiRedstoneControlTab(this, tile));
addRenderableWidget(new GuiRedstoneControlTab(this, tile).warning(WarningType.REDSTONE_PREVENTS_ACTIVATION, () -> !tile.isRedstoneActivated()));
}
//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
29 changes: 28 additions & 1 deletion src/main/java/mekanism/client/gui/element/GuiInsetElement.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,29 @@
package mekanism.client.gui.element;

import java.util.function.BooleanSupplier;
import mekanism.client.gui.IGuiWrapper;
import mekanism.common.inventory.warning.ISupportsWarning;
import mekanism.common.inventory.warning.WarningTracker.WarningType;
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 {
public abstract class GuiInsetElement<DATA_SOURCE> extends GuiSideHolder implements ISupportsWarning<GuiInsetElement<DATA_SOURCE>> {

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 +36,12 @@ public GuiInsetElement(ResourceLocation overlay, IGuiWrapper gui, DATA_SOURCE da
active = true;
}

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

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

@Override
protected void draw(@NotNull GuiGraphics guiGraphics) {
boolean warning = warningSupplier != null && warningSupplier.getAsBoolean();
if (warning) {
innerDraw(guiGraphics, left ? WARNING_LEFT : WARNING_RIGHT);
} 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_PREVENTS_ACTIVATION("gui", "issues.redstone_prevents_activation"),
//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_PREVENTS_ACTIVATION(MekanismLang.ISSUE_REDSTONE_PREVENTS_ACTIVATION),
;

private final ILangEntry langEntry;
Expand Down
14 changes: 9 additions & 5 deletions src/main/java/mekanism/common/tile/base/TileEntityMekanism.java
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@
import mekanism.common.integration.computer.annotation.ComputerMethod;
import mekanism.common.inventory.container.ITrackableContainer;
import mekanism.common.inventory.container.MekanismContainer;
import mekanism.common.inventory.container.sync.SyncableBoolean;
import mekanism.common.inventory.container.sync.SyncableDouble;
import mekanism.common.inventory.container.sync.SyncableEnum;
import mekanism.common.inventory.container.sync.SyncableFluidStack;
Expand Down Expand Up @@ -908,6 +909,7 @@ public void addContainerTrackers(MekanismContainer container) {
}
if (supportsRedstone()) {
container.track(SyncableEnum.create(RedstoneControl.BY_ID, RedstoneControl.DISABLED, () -> controlType, value -> controlType = value));
container.track(SyncableBoolean.create(this::isPowered, value -> redstone = value));
}
boolean isClient = isRemote();
if (canHandleChemicals() && syncs(ContainerType.CHEMICAL)) {
Expand Down Expand Up @@ -1094,16 +1096,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 e281bba

Please sign in to comment.