From 9e726e177972701720fa5bc7630ce27ff3c4eb81 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Sun, 22 Aug 2021 19:22:30 +0700 Subject: [PATCH] Research render test --- .../android/AndroidAirBagsType.java | 3 +- .../android/AndroidFeatureResearchNode.java | 26 ++++ .../mc/otm/screen/AndroidStationScreen.java | 113 +++++++++++++----- .../mc/otm/screen/MatteryScreen.java | 7 -- .../mc/otm/screen/RenderHelper.java | 102 ---------------- .../mc/otm/screen/SkinElement.java | 111 +++++++++++++++++ .../mc/otm/screen/panels/GridPanel.java | 6 +- .../overdrive_that_matters/lang/en_us.json | 7 ++ .../textures/gui/android_station.png | Bin 9576 -> 0 bytes .../textures/gui/android_station.xcf | 3 - .../textures/gui/generic_machine.png | Bin 9200 -> 0 bytes .../textures/gui/generic_machine.xcf | 3 - .../textures/gui/matter_panel.png | Bin 3209 -> 0 bytes .../textures/gui/matter_panel.xcf | 3 - 14 files changed, 232 insertions(+), 152 deletions(-) create mode 100644 src/main/java/ru/dbotthepony/mc/otm/screen/SkinElement.java delete mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/android_station.png delete mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/android_station.xcf delete mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/generic_machine.png delete mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/generic_machine.xcf delete mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/matter_panel.png delete mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/matter_panel.xcf diff --git a/src/main/java/ru/dbotthepony/mc/otm/capability/android/AndroidAirBagsType.java b/src/main/java/ru/dbotthepony/mc/otm/capability/android/AndroidAirBagsType.java index a7586b47b..4870c6c06 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/capability/android/AndroidAirBagsType.java +++ b/src/main/java/ru/dbotthepony/mc/otm/capability/android/AndroidAirBagsType.java @@ -10,6 +10,7 @@ public class AndroidAirBagsType extends AndroidFeatureType { @Nullable @Override public AndroidFeatureResearchNode getResearchNodeInner() { - return new AndroidFeatureResearchNode(this, new AndroidFeatureResearchCost(18)); + return new AndroidFeatureResearchNode(this, new AndroidFeatureResearchCost(18)) + .withDescription(); } } diff --git a/src/main/java/ru/dbotthepony/mc/otm/capability/android/AndroidFeatureResearchNode.java b/src/main/java/ru/dbotthepony/mc/otm/capability/android/AndroidFeatureResearchNode.java index 5e02ccb29..de79b7d97 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/capability/android/AndroidFeatureResearchNode.java +++ b/src/main/java/ru/dbotthepony/mc/otm/capability/android/AndroidFeatureResearchNode.java @@ -3,10 +3,13 @@ package ru.dbotthepony.mc.otm.capability.android; import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; import ru.dbotthepony.mc.otm.capability.MatteryCapability; import ru.dbotthepony.mc.otm.network.MatteryNetworking; import ru.dbotthepony.mc.otm.network.android.AndroidResearchRequestPacket; +import ru.dbotthepony.mc.otm.screen.RenderHelper; +import ru.dbotthepony.mc.otm.screen.SkinElement; import java.util.HashSet; import java.util.List; @@ -19,11 +22,21 @@ public class AndroidFeatureResearchNode { public final Set> predecessors = new HashSet<>(); protected final Component name; + protected final Component description; + public boolean with_description = false; + + public SkinElement icon; public AndroidFeatureResearchNode(AndroidFeatureType type, AndroidFeatureResearchCost cost) { this.type = type; this.cost = cost; name = new TranslatableComponent("android_feature." + type.getRegistryName().getNamespace() + "." + type.getRegistryName().getPath()); + description = new TranslatableComponent("android_feature." + type.getRegistryName().getNamespace() + "." + type.getRegistryName().getPath() + ".description"); + } + + public AndroidFeatureResearchNode(AndroidFeatureType type, AndroidFeatureResearchCost cost, SkinElement icon) { + this(type, cost); + this.icon = icon; } public AndroidFeatureResearchNode addPredecessor(AndroidFeatureType value) { @@ -31,6 +44,11 @@ public class AndroidFeatureResearchNode { return this; } + public AndroidFeatureResearchNode withDescription() { + with_description = true; + return this; + } + public boolean canResearch(Player ply, AndroidCapabilityPlayer cap) { for (var prec : predecessors) { if (!cap.hasFeature(prec)) @@ -69,7 +87,15 @@ public class AndroidFeatureResearchNode { return name; } + public Component getDescription() { + return description; + } + public List getTooltip() { + if (with_description) { + return List.of(getName(), getDescription()); + } + return List.of(getName()); } } diff --git a/src/main/java/ru/dbotthepony/mc/otm/screen/AndroidStationScreen.java b/src/main/java/ru/dbotthepony/mc/otm/screen/AndroidStationScreen.java index bd7f4467f..4697f930a 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/screen/AndroidStationScreen.java +++ b/src/main/java/ru/dbotthepony/mc/otm/screen/AndroidStationScreen.java @@ -2,34 +2,96 @@ package ru.dbotthepony.mc.otm.screen; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Inventory; import ru.dbotthepony.mc.otm.OverdriveThatMatters; import ru.dbotthepony.mc.otm.Registry; +import ru.dbotthepony.mc.otm.capability.MatteryCapability; +import ru.dbotthepony.mc.otm.capability.android.AndroidCapabilityPlayer; import ru.dbotthepony.mc.otm.capability.android.AndroidFeatureResearchNode; import ru.dbotthepony.mc.otm.menu.AndroidStationMenu; -import ru.dbotthepony.mc.otm.screen.panels.Dock; -import ru.dbotthepony.mc.otm.screen.panels.EditBoxPanel; -import ru.dbotthepony.mc.otm.screen.panels.EditablePanel; -import ru.dbotthepony.mc.otm.screen.panels.FramePanel; +import ru.dbotthepony.mc.otm.screen.panels.*; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.ArrayList; import java.util.HashSet; import java.util.Set; public class AndroidStationScreen extends MatteryScreen { - private static final ResourceLocation CONTAINER_BACKGROUND = new ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/android_station.png"); + class AndroidFeatureButton extends EditablePanel { + public static final int BUTTON_SIZE = 16; + private final AndroidFeatureResearchNode node; - @Override - protected ResourceLocation CONTAINER_BACKGROUND() { - return CONTAINER_BACKGROUND; + public static final RGBAColor RESEARCHED = new RGBAColor(150, 150, 200); + public static final RGBAColor CAN_BE_RESEARCHED = new RGBAColor(150, 200, 150); + public static final RGBAColor CAN_NOT_BE_RESEARCHED = new RGBAColor(200, 150, 150); + + public AndroidFeatureButton(@Nullable EditablePanel parent, AndroidFeatureResearchNode node) { + super(AndroidStationScreen.this, parent, 0, 0, BUTTON_SIZE, BUTTON_SIZE); + this.node = node; + setDockMargin(2, 2, 0, 0); + } + + @Override + protected void innerRender(PoseStack stack, float mouse_x, float mouse_y, float flag) { + Minecraft.getInstance().player.getCapability(MatteryCapability.ANDROID).ifPresent(_cap -> { + if (_cap instanceof AndroidCapabilityPlayer cap) { + if (cap.hasFeature(node.type)) { + RenderHelper.setDrawColor(RESEARCHED); + } else if (node.canResearch(Minecraft.getInstance().player, cap)) { + RenderHelper.setDrawColor(CAN_BE_RESEARCHED); + } else { + RenderHelper.setDrawColor(CAN_NOT_BE_RESEARCHED); + } + + RenderHelper.drawRect(stack, 0, 0, getWidth(), getHeight()); + } + }); + } + + @Override + protected boolean mouseClickedInner(double mouse_x, double mouse_y, int flag) { + node.researchClient(); + return true; + } + + @Override + protected boolean innerRenderTooltips(PoseStack stack, float mouse_x, float mouse_y, float flag) { + if (is_hovered) { + var list = new ArrayList<>(node.getTooltip()); + + Minecraft.getInstance().player.getCapability(MatteryCapability.ANDROID).ifPresent(_cap -> { + if (_cap instanceof AndroidCapabilityPlayer cap) { + if (cap.hasFeature(node.type)) { + list.add(new TranslatableComponent("otm.android_station.research.researched").withStyle(ChatFormatting.DARK_AQUA)); + } else if (node.canResearch(Minecraft.getInstance().player, cap)) { + list.add(new TranslatableComponent("otm.android_station.research.can_be_researched").withStyle(ChatFormatting.DARK_GREEN)); + } else { + list.add(new TranslatableComponent("otm.android_station.research.can_not_be_researched").withStyle(ChatFormatting.DARK_RED)); + } + } + }); + + renderComponentTooltip(stack, list, (int) mouse_x, (int) mouse_y); + } + + return is_hovered; + } } private final Set nodes = new HashSet<>(); - private FramePanel frame = new FramePanel(this, null, 0, 0, 80, 120, new TextComponent("test")); + public static final int FRAME_WIDTH = 210; + public static final int GRID_WIDTH = 6; + public static final int GRID_HEIGHT = 5; + public static final int FRAME_HEIGHT = 120; public AndroidStationScreen(AndroidStationMenu p_97741_, Inventory p_97742_, Component p_97743_) { super(p_97741_, p_97742_, p_97743_); @@ -43,32 +105,23 @@ public class AndroidStationScreen extends MatteryScreen { } } + @Nullable @Override - public boolean mouseClicked(double mouseX, double mouseY, int p_97750_) { - int x = leftPos + 40; - int y = topPos + 10; + protected FramePanel makeMainFrame() { + var frame = new FramePanel(this, null, 0, 0, FRAME_WIDTH, FRAME_HEIGHT, getTitle()); - for (var node : nodes) { - if (mouseX >= x && mouseX <= x + 16 && mouseY >= y && mouseY <= y + 16) { - node.researchClient(); - return true; + var grid = new GridPanel(this, frame, 0, 0, GRID_WIDTH * 18, 0, GRID_WIDTH, GRID_HEIGHT); + + for (var feature : Registry.ANDROID_FEATURES().getValues()) { + var node = feature.getResearchNode(); + + if (node != null) { + new AndroidFeatureButton(grid, node); } } - return super.mouseClicked(mouseX, mouseY, p_97750_); - } + grid.setDocking(Dock.RIGHT); - @Override - protected void renderTooltip(PoseStack pose, int mouseX, int mouseY) { - super.renderTooltip(pose, mouseX, mouseY); - - int x = leftPos + 40; - int y = topPos + 10; - - for (var node : nodes) { - if (mouseX >= x && mouseX <= x + 16 && mouseY >= y && mouseY <= y + 16) { - renderComponentTooltip(pose, node.getTooltip(), mouseX, mouseY); - } - } + return frame; } } diff --git a/src/main/java/ru/dbotthepony/mc/otm/screen/MatteryScreen.java b/src/main/java/ru/dbotthepony/mc/otm/screen/MatteryScreen.java index 808a9f440..011e3c6f1 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/screen/MatteryScreen.java +++ b/src/main/java/ru/dbotthepony/mc/otm/screen/MatteryScreen.java @@ -45,9 +45,6 @@ import java.util.Set; * @param type of menu, which extends MatteryMenu */ public abstract class MatteryScreen extends AbstractContainerScreen { - protected static final ResourceLocation CONTAINER_BASE = new ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/generic_machine.png"); - public static final ResourceLocation WIDGETS = new ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets.png"); - public static final float SNAPBACK_SPEED = 100.0F; public static final int QUICKDROP_DELAY = 500; public static final int DOUBLECLICK_SPEED = 250; @@ -98,10 +95,6 @@ public abstract class MatteryScreen extends AbstractConta protected boolean doubleclick; protected ItemStack lastQuickMoved = ItemStack.EMPTY; - protected ResourceLocation CONTAINER_BACKGROUND() { - return CONTAINER_BASE; - } - protected final ArrayList panels = new ArrayList<>(); public FramePanel inventory_frame; public FramePanel main_frame; diff --git a/src/main/java/ru/dbotthepony/mc/otm/screen/RenderHelper.java b/src/main/java/ru/dbotthepony/mc/otm/screen/RenderHelper.java index 80d4f0243..7652e62d7 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/screen/RenderHelper.java +++ b/src/main/java/ru/dbotthepony/mc/otm/screen/RenderHelper.java @@ -181,108 +181,6 @@ public class RenderHelper { drawTexturedRectUV(stack, x, y, width, height, 0, 0, 1, 1); } - public record SkinElement(ResourceLocation texture, float image_x, float image_y, float rect_w, float rect_h, float defined_width, float defined_height) { - public void render(PoseStack stack, float x, float y, float width, float height) { - RenderSystem.setShaderTexture(0, texture); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - - drawTexturedRectUV( - stack, - x, - y, - width, - height, - image_x / defined_width, - image_y / defined_height, - (image_x + rect_w) / defined_width, - (image_y + rect_h) / defined_height); - } - - public void render(PoseStack stack, float x, float y) { - RenderSystem.setShaderTexture(0, texture); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - - drawTexturedRectUV( - stack, - x, - y, - rect_w, - rect_h, - image_x / defined_width, - image_y / defined_height, - (image_x + rect_w) / defined_width, - (image_y + rect_h) / defined_height); - } - - public void renderW(PoseStack stack, float x, float y, float width) { - RenderSystem.setShaderTexture(0, texture); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - - drawTexturedRectUV( - stack, - x, - y, - width, - rect_h, - image_x / defined_width, - image_y / defined_height, - (image_x + rect_w) / defined_width, - (image_y + rect_h) / defined_height); - } - - public void renderH(PoseStack stack, float x, float y, float height) { - RenderSystem.setShaderTexture(0, texture); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - - drawTexturedRectUV( - stack, - x, - y, - rect_w, - height, - image_x / defined_width, - image_y / defined_height, - (image_x + rect_w) / defined_width, - (image_y + rect_h) / defined_height); - } - - public void renderRaw(PoseStack stack, float x, float y, float width, float height) { - // RenderSystem.setShader(GameRenderer::getPositionTexShader); - // RenderSystem.setShaderTexture(0, texture); - - drawTexturedRectUV( - stack, - x, - y, - width, - height, - image_x / defined_width, - image_y / defined_height, - (image_x + rect_w) / defined_width, - (image_y + rect_h) / defined_height); - } - - public void renderRaw(PoseStack stack, float x, float y) { - // RenderSystem.setShader(GameRenderer::getPositionTexShader); - // RenderSystem.setShaderTexture(0, texture); - - drawTexturedRectUV( - stack, - x, - y, - rect_w, - rect_h, - image_x / defined_width, - image_y / defined_height, - (image_x + rect_w) / defined_width, - (image_y + rect_h) / defined_height); - } - } - public static final SkinElement top_left_window_corner = new SkinElement( WIDGETS, 18, diff --git a/src/main/java/ru/dbotthepony/mc/otm/screen/SkinElement.java b/src/main/java/ru/dbotthepony/mc/otm/screen/SkinElement.java new file mode 100644 index 000000000..b77c7ac28 --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/screen/SkinElement.java @@ -0,0 +1,111 @@ +package ru.dbotthepony.mc.otm.screen; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.resources.ResourceLocation; + +/** + * Represents a texture element on atlas + */ +public record SkinElement(ResourceLocation texture, float image_x, float image_y, float rect_w, float rect_h, + float defined_width, float defined_height) { + public void render(PoseStack stack, float x, float y, float width, float height) { + RenderSystem.setShaderTexture(0, texture); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + + RenderHelper.drawTexturedRectUV( + stack, + x, + y, + width, + height, + image_x / defined_width, + image_y / defined_height, + (image_x + rect_w) / defined_width, + (image_y + rect_h) / defined_height); + } + + public void render(PoseStack stack, float x, float y) { + RenderSystem.setShaderTexture(0, texture); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + + RenderHelper.drawTexturedRectUV( + stack, + x, + y, + rect_w, + rect_h, + image_x / defined_width, + image_y / defined_height, + (image_x + rect_w) / defined_width, + (image_y + rect_h) / defined_height); + } + + public void renderW(PoseStack stack, float x, float y, float width) { + RenderSystem.setShaderTexture(0, texture); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + + RenderHelper.drawTexturedRectUV( + stack, + x, + y, + width, + rect_h, + image_x / defined_width, + image_y / defined_height, + (image_x + rect_w) / defined_width, + (image_y + rect_h) / defined_height); + } + + public void renderH(PoseStack stack, float x, float y, float height) { + RenderSystem.setShaderTexture(0, texture); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + + RenderHelper.drawTexturedRectUV( + stack, + x, + y, + rect_w, + height, + image_x / defined_width, + image_y / defined_height, + (image_x + rect_w) / defined_width, + (image_y + rect_h) / defined_height); + } + + public void renderRaw(PoseStack stack, float x, float y, float width, float height) { + // RenderSystem.setShader(GameRenderer::getPositionTexShader); + // RenderSystem.setShaderTexture(0, texture); + + RenderHelper.drawTexturedRectUV( + stack, + x, + y, + width, + height, + image_x / defined_width, + image_y / defined_height, + (image_x + rect_w) / defined_width, + (image_y + rect_h) / defined_height); + } + + public void renderRaw(PoseStack stack, float x, float y) { + // RenderSystem.setShader(GameRenderer::getPositionTexShader); + // RenderSystem.setShaderTexture(0, texture); + + RenderHelper.drawTexturedRectUV( + stack, + x, + y, + rect_w, + rect_h, + image_x / defined_width, + image_y / defined_height, + (image_x + rect_w) / defined_width, + (image_y + rect_h) / defined_height); + } +} diff --git a/src/main/java/ru/dbotthepony/mc/otm/screen/panels/GridPanel.java b/src/main/java/ru/dbotthepony/mc/otm/screen/panels/GridPanel.java index f47cbe7fb..9651ef921 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/screen/panels/GridPanel.java +++ b/src/main/java/ru/dbotthepony/mc/otm/screen/panels/GridPanel.java @@ -43,9 +43,9 @@ public class GridPanel extends EditablePanel { } if (child.getVisible()) { - line_y = Math.max(line_y, child.getHeight()); - child.setPos(current_x, current_y); - current_x += child.getWidth(); + line_y = Math.max(line_y, child.getHeight() + child.getDockMargin().top() + child.getDockMargin().bottom()); + child.setPos(current_x + child.getDockMargin().left(), current_y + child.getDockMargin().top()); + current_x += child.getWidth() + child.getDockMargin().left() + child.getDockMargin().right(); } else { column--; } diff --git a/src/main/resources/assets/overdrive_that_matters/lang/en_us.json b/src/main/resources/assets/overdrive_that_matters/lang/en_us.json index f8b13b401..8ad289287 100644 --- a/src/main/resources/assets/overdrive_that_matters/lang/en_us.json +++ b/src/main/resources/assets/overdrive_that_matters/lang/en_us.json @@ -36,6 +36,13 @@ "otm.gui.matter_task.in_progress": "In progress: %s", "otm.gui.matter_task.finished": "Finished: %s", + "otm.android_station.research.researched": "Researched!", + "otm.android_station.research.can_be_researched": "Ready to research!", + "otm.android_station.research.can_not_be_researched": "Can not afford!", + + "android_feature.overdrive_that_matters.air_bags": "Air bags", + "android_feature.overdrive_that_matters.air_bags.description": "Allows to swim in water", + "otm.suffix.merge": "%s %s", "otm.suffix.kilo": "%s k%s", diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/android_station.png b/src/main/resources/assets/overdrive_that_matters/textures/gui/android_station.png deleted file mode 100644 index debc0e4f0a857cb84096ae6852dff53dc91a72d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9576 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 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/android_station.xcf b/src/main/resources/assets/overdrive_that_matters/textures/gui/android_station.xcf deleted file mode 100644 index 4417070b6..000000000 --- a/src/main/resources/assets/overdrive_that_matters/textures/gui/android_station.xcf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e156bbe0c76a3253c7622fe1f6fcbc00c7fa53c997579d46420b062f88494e2 -size 21075 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/generic_machine.png b/src/main/resources/assets/overdrive_that_matters/textures/gui/generic_machine.png deleted file mode 100644 index 2469f6b1a320dec87aa6091d9cefa544f4b792e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9200 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