Matter level widget

This commit is contained in:
DBotThePony 2021-08-14 00:36:29 +07:00
parent 3f3e043c1d
commit 1067aa0bd5
Signed by: DBot
GPG Key ID: DCC23B5715498507
10 changed files with 125 additions and 209 deletions

View File

@ -12,14 +12,14 @@ import ru.dbotthepony.mc.otm.capability.IMatteryEnergyStorage;
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
import ru.dbotthepony.mc.otm.menu.data.BigDecimalDataContainer;
import ru.dbotthepony.mc.otm.menu.slot.BatterySlot;
import ru.dbotthepony.mc.otm.menu.widget.BatteryLevelWidget;
import javax.annotation.Nullable;
public class BatteryBankMenu extends MatteryMenu {
protected BlockEntityBatteryBank tile;
public BigDecimalDataContainer energy;
public BigDecimalDataContainer max_energy;
public BatteryLevelWidget<PoweredMatteryMenu> battery_widget;
public BatteryBankMenu(int p_38852_, Inventory inventory) {
this(p_38852_, inventory, null, new SimpleContainer(5 * 3));
@ -29,27 +29,12 @@ public class BatteryBankMenu extends MatteryMenu {
super(Registry.Menus.BATTERY_BANK, p_38852_, inventory, tile);
this.tile = tile;
if (tile == null) {
energy = new BigDecimalDataContainer();
max_energy = new BigDecimalDataContainer();
if (tile == null || tile.getCapability(MatteryCapability.ENERGY).resolve().isEmpty()) {
battery_widget = new BatteryLevelWidget(this, 13, 14);
} else {
energy = new BigDecimalDataContainer() {
@Override
protected void updateValue() {
setDecimal(tile.energy.getBatteryLevel());
}
};
max_energy = new BigDecimalDataContainer() {
@Override
protected void updateValue() {
setDecimal(tile.energy.getMaxBatteryLevel());
}
};
battery_widget = new BatteryLevelWidget(this, 13, 14, tile.getCapability(MatteryCapability.ENERGY).resolve().get());
}
this.addDataSlots(energy);
this.addDataSlots(max_energy);
for (int row = 0; row < 3; row++)
for (int column = 0; column < 5; column++)
this.addSlot(new BatterySlot(batteries, row * 5 + column, 62 + column * 18, 24 + row * 18));

View File

@ -11,9 +11,12 @@ import ru.dbotthepony.mc.otm.MatterRegistry;
import ru.dbotthepony.mc.otm.Registry;
import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatterDecomposer;
import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatteryPoweredMachine;
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
import ru.dbotthepony.mc.otm.menu.data.BigDecimalDataContainer;
import ru.dbotthepony.mc.otm.menu.slot.MachineInputSlot;
import ru.dbotthepony.mc.otm.menu.slot.MachineOutputSlot;
import ru.dbotthepony.mc.otm.menu.widget.BatteryLevelWidget;
import ru.dbotthepony.mc.otm.menu.widget.MatterLevelWidget;
import javax.annotation.Nullable;
@ -22,8 +25,7 @@ public class MatterDecomposerMenu extends PoweredMatteryMenu {
this(containerID, inventory, null);
}
public BigDecimalDataContainer matter;
public BigDecimalDataContainer max_matter;
public MatterLevelWidget<PoweredMatteryMenu> matter_widget;
public ContainerData progress;
@ -64,32 +66,16 @@ public class MatterDecomposerMenu extends PoweredMatteryMenu {
// Выход
addSlot(new MachineOutputSlot(container, 1, 61 + 18 + 10 + 3 + 22, 36, true, true));
if (tile == null) {
matter = new BigDecimalDataContainer();
max_matter = new BigDecimalDataContainer();
if (tile == null || tile.getCapability(MatteryCapability.MATTER).resolve().isEmpty()) {
matter_widget = new MatterLevelWidget<>(this, 22, 14);
} else {
matter = new BigDecimalDataContainer() {
@Override
protected void updateValue() {
setDecimal(tile.matter.getStoredMatter());
}
};
max_matter = new BigDecimalDataContainer() {
@Override
protected void updateValue() {
setDecimal(tile.matter.getMaxStoredMatter());
}
};
matter_widget = new MatterLevelWidget<>(this, 22, 14, tile.getCapability(MatteryCapability.MATTER).resolve().get());
}
addBatterySlot(14);
addInventorySlots();
this.addDataSlots(matter);
this.addDataSlots(max_matter);
this.addDataSlots(progress);
}

View File

@ -19,9 +19,6 @@ import javax.annotation.Nullable;
abstract public class PoweredMatteryMenu extends MatteryMenu {
protected BlockEntityMatteryPoweredMachine tile;
public BigDecimalDataContainer energy;
public BigDecimalDataContainer max_energy;
public BatteryLevelWidget<PoweredMatteryMenu> battery_widget;
protected PoweredMatteryMenu(
@ -34,36 +31,10 @@ abstract public class PoweredMatteryMenu extends MatteryMenu {
this.tile = tile;
if (tile == null || tile.getCapability(MatteryCapability.ENERGY).resolve().isEmpty()) {
energy = new BigDecimalDataContainer();
max_energy = new BigDecimalDataContainer();
battery_widget = new BatteryLevelWidget<>(this, 13, 14);
} else {
energy = new BigDecimalDataContainer() {
@Override
protected void updateValue() {
LazyOptional<IMatteryEnergyStorage> capability = tile.getCapability(MatteryCapability.ENERGY);
if (capability.isPresent())
setDecimal(capability.resolve().get().getBatteryLevel());
}
};
max_energy = new BigDecimalDataContainer() {
@Override
protected void updateValue() {
LazyOptional<IMatteryEnergyStorage> capability = tile.getCapability(MatteryCapability.ENERGY);
if (capability.isPresent())
setDecimal(capability.resolve().get().getMaxBatteryLevel());
}
};
battery_widget = new BatteryLevelWidget<>(this, 13, 14, tile.getCapability(MatteryCapability.ENERGY).resolve().get());
}
this.addDataSlots(energy);
this.addDataSlots(max_energy);
}
protected void addBatterySlot() {

View File

@ -19,36 +19,17 @@ import java.util.concurrent.Callable;
import java.util.function.Consumer;
import java.util.function.Supplier;
public class BatteryLevelWidget<T extends MatteryMenu> extends VerticalGaugeWidget<T> {
protected Supplier<BigDecimal> value_supplier;
protected Supplier<BigDecimal> max_value_supplier;
protected final BigDecimalDataContainer value_container = new BigDecimalDataContainer();
protected final BigDecimalDataContainer max_value_container = new BigDecimalDataContainer();
public class BatteryLevelWidget<T extends MatteryMenu> extends StorageVerticalGaugeWidget<T> {
public BatteryLevelWidget(T menu, int x, int y, IMatteryEnergyStorage capability) {
this(menu, x, y, capability::getBatteryLevel, capability::getMaxBatteryLevel);
super(menu, x, y, capability::getBatteryLevel, capability::getMaxBatteryLevel);
}
public BatteryLevelWidget(T menu, int x, int y) {
super(menu, x, y);
addDataSlots(value_container);
addDataSlots(max_value_container);
}
public BatteryLevelWidget(T menu, int x, int y, Supplier<BigDecimal> value_supplier, Supplier<BigDecimal> max_value_supplier) {
this(menu, x, y);
this.value_supplier = value_supplier;
this.max_value_supplier = max_value_supplier;
}
@Override
public void updateServer() {
if (value_supplier == null || max_value_supplier == null)
return;
value_container.setDecimal(value_supplier.get());
max_value_container.setDecimal(max_value_supplier.get());
super(menu, x, y, value_supplier, max_value_supplier);
}
@Override
@ -86,9 +67,4 @@ public class BatteryLevelWidget<T extends MatteryMenu> extends VerticalGaugeWidg
return false;
}
@Override
float getLevel() {
return max_value_container.getDecimal().compareTo(BigDecimal.ZERO) == 0 ? 0f : value_container.getDecimal().divide(max_value_container.getDecimal(), MatteryCapability.ROUND_RULES).floatValue();
}
}

View File

@ -0,0 +1,64 @@
package ru.dbotthepony.mc.otm.menu.widget;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TranslatableComponent;
import ru.dbotthepony.mc.otm.capability.IMatterHandler;
import ru.dbotthepony.mc.otm.capability.IMatteryEnergyStorage;
import ru.dbotthepony.mc.otm.menu.FormattingHelper;
import ru.dbotthepony.mc.otm.menu.MatteryMenu;
import ru.dbotthepony.mc.otm.screen.MatteryScreen;
import java.math.BigDecimal;
import java.util.List;
import java.util.function.Supplier;
public class MatterLevelWidget<T extends MatteryMenu> extends StorageVerticalGaugeWidget<T> {
public MatterLevelWidget(T menu, int x, int y, IMatterHandler capability) {
super(menu, x, y, capability::getStoredMatter, capability::getMaxStoredMatter);
}
public MatterLevelWidget(T menu, int x, int y) {
super(menu, x, y);
}
public MatterLevelWidget(T menu, int x, int y, Supplier<BigDecimal> value_supplier, Supplier<BigDecimal> max_value_supplier) {
super(menu, x, y, value_supplier, max_value_supplier);
}
@Override
public int getImageWidth() {
return 9;
}
@Override
public int getImageHeight() {
return 48;
}
@Override
public int getImageX() {
return 0;
}
@Override
public int getImageY() {
return 0;
}
@Override
public boolean renderTooltip(MatteryScreen<T> screen, PoseStack pose, int local_x, int local_y, int mouse_x, int mouse_y) {
if (is_hovered) {
List<Component> text = List.of(
new TranslatableComponent("otm.gui.matter.percentage_level", String.format("%.2f", getLevel() * 100d)),
FormattingHelper.formatMatterLevel(value_container.getDecimal(), max_value_container.getDecimal())
);
screen.renderComponentTooltip(pose, text, mouse_x, mouse_y);
return true;
}
return false;
}
}

View File

@ -0,0 +1,45 @@
package ru.dbotthepony.mc.otm.menu.widget;
import com.mojang.blaze3d.vertex.PoseStack;
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
import ru.dbotthepony.mc.otm.menu.MatteryMenu;
import ru.dbotthepony.mc.otm.menu.data.BigDecimalDataContainer;
import ru.dbotthepony.mc.otm.screen.MatteryScreen;
import java.math.BigDecimal;
import java.util.function.Supplier;
abstract public class StorageVerticalGaugeWidget<T extends MatteryMenu> extends VerticalGaugeWidget<T> {
protected Supplier<BigDecimal> value_supplier;
protected Supplier<BigDecimal> max_value_supplier;
protected final BigDecimalDataContainer value_container = new BigDecimalDataContainer();
protected final BigDecimalDataContainer max_value_container = new BigDecimalDataContainer();
public StorageVerticalGaugeWidget(T menu, int x, int y) {
this(menu, x, y, null, null);
}
public StorageVerticalGaugeWidget(T menu, int x, int y, Supplier<BigDecimal> value_supplier, Supplier<BigDecimal> max_value_supplier) {
super(menu, x, y);
this.value_supplier = value_supplier;
this.max_value_supplier = max_value_supplier;
addDataSlots(value_container);
addDataSlots(max_value_container);
}
@Override
public void updateServer() {
if (value_supplier == null || max_value_supplier == null)
return;
value_container.setDecimal(value_supplier.get());
max_value_container.setDecimal(max_value_supplier.get());
}
@Override
float getLevel() {
return max_value_container.getDecimal().compareTo(BigDecimal.ZERO) == 0 ? 0f : value_container.getDecimal().divide(max_value_container.getDecimal(), MatteryCapability.ROUND_RULES).floatValue();
}
}

View File

@ -12,10 +12,5 @@ import ru.dbotthepony.mc.otm.menu.MatteryMenu;
public class BatteryBankScreen extends MatteryScreen<BatteryBankMenu> {
public BatteryBankScreen(BatteryBankMenu p_97741_, Inventory p_97742_, Component p_97743_) {
super(p_97741_, p_97742_, p_97743_);
power_supplier = () -> menu.energy.getDecimal();
max_matter_supplier = () -> menu.max_energy.getDecimal();
power_gauge_x = 15;
power_gauge_y = 24;
}
}

View File

@ -8,9 +8,5 @@ import ru.dbotthepony.mc.otm.menu.MatterDecomposerMenu;
public class MatterDecomposerScreen extends PoweredMachineScreen<MatterDecomposerMenu> {
public MatterDecomposerScreen(MatterDecomposerMenu p_97741_, Inventory p_97742_, Component p_97743_) {
super(p_97741_, p_97742_, p_97743_);
matter_supplier = () -> menu.matter.getDecimal();
max_matter_supplier = () -> menu.max_matter.getDecimal();
progress_supplier = () -> p_97741_.progress.get(0) / 100f;
}
}

View File

@ -31,23 +31,6 @@ public class MatteryScreen<T extends MatteryMenu> extends AbstractContainerScree
return CONTAINER_BASE;
}
protected Supplier<BigDecimal> power_supplier;
protected Supplier<BigDecimal> max_power_supplier;
protected int power_gauge_x = 13;
protected int power_gauge_y = 14;
protected Supplier<BigDecimal> matter_supplier;
protected Supplier<BigDecimal> max_matter_supplier;
protected Supplier<Float> progress_supplier;
protected int matter_gauge_x = 22;
protected int matter_gauge_y = 14;
protected boolean hovering_power_gauge = false;
protected boolean hovering_matter_gauge = false;
protected int render_x;
protected int render_y;
@ -71,55 +54,9 @@ public class MatteryScreen<T extends MatteryMenu> extends AbstractContainerScree
return;
}
}
if (hovering_power_gauge) {
List<FormattedText> text = getFormattedPowerLevel();
if (text.size() != 0)
this.renderComponentToolTip(pose, text, mouseX, mouseY, font);
} else if (hovering_matter_gauge) {
List<FormattedText> text = getFormattedMatterLevel();
if (text.size() != 0)
this.renderComponentToolTip(pose, text, mouseX, mouseY, font);
}
}
}
protected List<FormattedText> getFormattedPowerLevel() {
if (power_supplier != null && max_power_supplier != null)
return getFormattedPowerLevel(power_supplier.get(), max_power_supplier.get());
return List.of();
}
protected List<FormattedText> getFormattedMatterLevel() {
if (matter_supplier != null && max_matter_supplier != null)
return getFormattedMatterLevel(matter_supplier.get(), max_matter_supplier.get());
return List.of();
}
protected List<FormattedText> getFormattedPowerLevel(BigDecimal current, BigDecimal max) {
if (current == null || max == null)
return List.of();
return List.of(
new TranslatableComponent("otm.gui.power.percentage_level", String.format("%.2f", level(current, max) * 100d)),
FormattingHelper.formatPowerLevel(current, max)
);
}
protected List<FormattedText> getFormattedMatterLevel(BigDecimal current, BigDecimal max) {
if (current == null || max == null)
return List.of();
return List.of(
new TranslatableComponent("otm.gui.matter.percentage_level", String.format("%.2f", level(current, max) * 100d)),
FormattingHelper.formatMatterLevel(current, max)
);
}
protected void renderVerticalGauge(PoseStack pose, int x, int y, float level, int image_x, int image_y, int width, int max_height) {
RenderSystem.setShader(GameRenderer::getPositionTexShader);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
@ -155,7 +92,7 @@ public class MatteryScreen<T extends MatteryMenu> extends AbstractContainerScree
}
protected boolean renderHorizontalGauge(PoseStack pose, int x, int y, int mouseX, int mouseY, float level, int image_x, int image_y, int width, int max_height) {
renderVerticalGauge(pose, x, y, level, image_x, image_y, width, max_height);
renderHorizontalGauge(pose, x, y, level, image_x, image_y, width, max_height);
x += leftPos;
y += topPos;
@ -181,36 +118,6 @@ public class MatteryScreen<T extends MatteryMenu> extends AbstractContainerScree
return level(a, b, true);
}
protected boolean renderMatterGauge(PoseStack pose, int mouseX, int mouseY) {
if (matter_supplier != null && max_matter_supplier != null)
return renderMatterGauge(pose, mouseX, mouseY, matter_supplier.get(), max_matter_supplier.get());
return false;
}
protected boolean renderPowerGauge(PoseStack pose, int mouseX, int mouseY) {
if (power_supplier != null && max_power_supplier != null)
return renderPowerGauge(pose, mouseX, mouseY, power_supplier.get(), max_power_supplier.get());
return false;
}
protected boolean renderMatterGauge(PoseStack pose, int mouseX, int mouseY, BigDecimal current_value, BigDecimal max_value) {
return renderMatterGauge(pose, matter_gauge_x, matter_gauge_y, mouseX, mouseY, current_value, max_value);
}
protected boolean renderPowerGauge(PoseStack pose, int mouseX, int mouseY, BigDecimal current_value, BigDecimal max_value) {
return renderPowerGauge(pose, power_gauge_x, power_gauge_y, mouseX, mouseY, current_value, max_value);
}
protected boolean renderPowerGauge(PoseStack pose, int x, int y, int mouseX, int mouseY, BigDecimal current_value, BigDecimal max_value) {
return hovering_power_gauge = renderVerticalGauge(pose, x, y, mouseX, mouseY, level(current_value, max_value), 0, 48, 9, 48);
}
protected boolean renderMatterGauge(PoseStack pose, int x, int y, int mouseX, int mouseY, BigDecimal current_value, BigDecimal max_value) {
return hovering_matter_gauge = renderVerticalGauge(pose, x, y, mouseX, mouseY, level(current_value, max_value), 0, 0, 9, 48);
}
protected void renderProgressGauge(PoseStack pose, int x, int y, float level) {
renderHorizontalGauge(pose, x, y, level, 0, 132, 22, 16);
}
@ -254,9 +161,6 @@ public class MatteryScreen<T extends MatteryMenu> extends AbstractContainerScree
// PoseStack, x, y, image_start_x, image_start_y, rect_size_x, rect_size_y
this.blit(pose, render_x, render_y, 0, 0, this.imageWidth, this.imageHeight);
renderPowerGauge(pose, mouseX, mouseY);
renderMatterGauge(pose, mouseX, mouseY);
RenderSystem.setShader(GameRenderer::getPositionTexShader);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
RenderSystem.setShaderTexture(0, WIDGETS);
@ -267,10 +171,6 @@ public class MatteryScreen<T extends MatteryMenu> extends AbstractContainerScree
} else if (slot instanceof MachineOutputSlot slot1 && slot1.auto_bg) {
if (slot1.is_main_output) {
renderOutputSlot(pose, slot1.x, slot1.y);
if (progress_supplier != null) {
renderProgressGaugeLeft(pose, slot1.x - 8, slot1.y, progress_supplier.get());
}
} else {
renderRegularSlot(pose, slot1.x, slot1.y);
}

View File

@ -11,7 +11,5 @@ import java.util.List;
public class PoweredMachineScreen<T extends PoweredMatteryMenu> extends MatteryScreen<T> {
public PoweredMachineScreen(T p_97741_, Inventory p_97742_, Component p_97743_) {
super(p_97741_, p_97742_, p_97743_);
// power_supplier = () -> menu.energy.getDecimal();
// max_power_supplier = () -> menu.max_energy.getDecimal();
}
}