Skip to content

Commit

Permalink
Make quest gui cool
Browse files Browse the repository at this point in the history
  • Loading branch information
KatatsumuriPan committed Mar 7, 2024
1 parent 5d1b946 commit e34a219
Show file tree
Hide file tree
Showing 11 changed files with 744 additions and 143 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
package betterquesting.api2.client.gui.panels.content;

import java.util.List;

import org.lwjgl.opengl.GL11;

import betterquesting.api.utils.RenderUtils;
import betterquesting.api2.client.gui.misc.IGuiRect;
import betterquesting.api2.client.gui.panels.IGuiPanel;
import betterquesting.api2.client.gui.resources.colors.GuiColorStatic;
import betterquesting.api2.client.gui.themes.presets.PresetIcon;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;

/**
* Displays task info over the panel.
*/
public class PanelTaskOverlay implements IGuiPanel {

public static final float FRAME_WIDTH = 2;

private final IGuiPanel delegate;
private State state;
private boolean consume;
private String text; // Long text will be scaled.

public PanelTaskOverlay(IGuiPanel delegate) { this.delegate = delegate; }

public PanelTaskOverlay setState(State state) {
this.state = state;
return this;
}

public PanelTaskOverlay setConsume(boolean consume) {
this.consume = consume;
return this;
}

public PanelTaskOverlay setText(String text) {
this.text = text;
return this;
}

@Override
public void drawPanel(int mx, int my, float partialTick) {
delegate.drawPanel(mx, my, partialTick);
switch (state) {
case INCOMPLETE -> {
renderIncomplete();
if (consume)
renderConsumeIcon(mx, my);
}
case COMPLETE -> {
renderComplete(mx, my);
}
case IN_PROGRESS -> {
renderInProgress();
if (consume)
renderConsumeIcon(mx, my);
}
}
renderText(mx, my);
}

// delegates

@Override
public IGuiRect getTransform() { return delegate.getTransform(); }

@Override
public void initPanel() {
delegate.initPanel();
}

@Override
public void setEnabled(boolean state) {
delegate.setEnabled(state);
}

@Override
public boolean isEnabled() { return delegate.isEnabled(); }

@Override
public boolean onMouseClick(int mx, int my, int button) {
return delegate.onMouseClick(mx, my, button);
}

@Override
public boolean onMouseRelease(int mx, int my, int button) {
return delegate.onMouseRelease(mx, my, button);
}

@Override
public boolean onMouseScroll(int mx, int my, int scroll) {
return delegate.onMouseScroll(mx, my, scroll);
}

@Override
public boolean onKeyTyped(char c, int keycode) {
return delegate.onKeyTyped(c, keycode);
}

@Override
public List<String> getTooltip(int mx, int my) {
return delegate.getTooltip(mx, my);
}

private void renderIncomplete() {
renderFrame(0.2f * RenderUtils.sineWave(2, 0) + 0.3f, 0, 0, 1);
}

private void renderComplete(int mx, int my) {
renderFrame(0.2f, 1, 0, 1);
int size = 12;
IGuiRect rect = getTransform();
int x = rect.getX() + rect.getWidth() - size + 2;
int y = rect.getY() - 2;
int a = getTransform().contains(mx, my) ? 100 : 255;
PresetIcon.ICON_CHECK.getTexture().drawTexture(x, y, size, size, 0, 0, new GuiColorStatic(0, 255, 0, a));
}

private void renderInProgress() {
float r = 0.3f * RenderUtils.sineWave(2, 0) + 0.3f;
float g = r;
renderFrame(r, g, 0, 1);
}

private void renderFrame(float red, float green, float blue, float alpha) {
Tessellator tessellator = Tessellator.getInstance();
BufferBuilder vertexbuffer = tessellator.getBuffer();
GlStateManager.enableBlend();
GlStateManager.disableTexture2D();
GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA,
GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA,
GlStateManager.SourceFactor.ONE,
GlStateManager.DestFactor.ZERO);
GlStateManager.color(red, green, blue, alpha);

vertexbuffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION);
IGuiRect rect = getTransform();
double w = FRAME_WIDTH / 2;
vertexbuffer.pos((double) rect.getX() - w, (double) rect.getY() + w, 0.0D).endVertex();
vertexbuffer.pos((double) rect.getX() + rect.getWidth() + w, (double) rect.getY() + w, 0.0D).endVertex();
vertexbuffer.pos((double) rect.getX() + rect.getWidth() + w, (double) rect.getY() - w, 0.0D).endVertex();
vertexbuffer.pos((double) rect.getX() - w, (double) rect.getY() - w, 0.0D).endVertex();

vertexbuffer.pos((double) rect.getX() - w, (double) rect.getY() + rect.getHeight() + w, 0.0D).endVertex();
vertexbuffer.pos((double) rect.getX() + rect.getWidth() + w, (double) rect.getY() + rect.getHeight() + w, 0.0D).endVertex();
vertexbuffer.pos((double) rect.getX() + rect.getWidth() + w, (double) rect.getY() + rect.getHeight() - w, 0.0D).endVertex();
vertexbuffer.pos((double) rect.getX() - w, (double) rect.getY() + rect.getHeight() - w, 0.0D).endVertex();

vertexbuffer.pos((double) rect.getX() - w, (double) rect.getY() + rect.getHeight() + w, 0.0D).endVertex();
vertexbuffer.pos((double) rect.getX() + w, (double) rect.getY() + rect.getHeight() + w, 0.0D).endVertex();
vertexbuffer.pos((double) rect.getX() + w, (double) rect.getY() - w, 0.0D).endVertex();
vertexbuffer.pos((double) rect.getX() - w, (double) rect.getY() - w, 0.0D).endVertex();

vertexbuffer.pos((double) rect.getX() + rect.getWidth() - w, (double) rect.getY() + rect.getHeight() + w, 0.0D).endVertex();
vertexbuffer.pos((double) rect.getX() + rect.getWidth() + w, (double) rect.getY() + rect.getHeight() + w, 0.0D).endVertex();
vertexbuffer.pos((double) rect.getX() + rect.getWidth() + w, (double) rect.getY() - w, 0.0D).endVertex();
vertexbuffer.pos((double) rect.getX() + rect.getWidth() - w, (double) rect.getY() - w, 0.0D).endVertex();

tessellator.draw();
GlStateManager.enableTexture2D();
GlStateManager.disableBlend();
}

private void renderText(int mx, int my) {
GlStateManager.enableBlend();
FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer;
IGuiRect rect = getTransform();
int width = fontRenderer.getStringWidth(text);
int x = rect.getX() + rect.getWidth() - width;
int y = rect.getY() + rect.getHeight() - fontRenderer.FONT_HEIGHT + 1;
int a = getTransform().contains(mx, my) ? 100 : 255;
if (x < rect.getX() + FRAME_WIDTH / 2) {
//scale to fit
float s = (rect.getWidth() - FRAME_WIDTH) / width;
float new_x = rect.getX() + FRAME_WIDTH / 2;
float new_y = y + fontRenderer.FONT_HEIGHT * (1 - s) - FRAME_WIDTH / 2;
GlStateManager.pushMatrix();
GlStateManager.translate(new_x, new_y, 0);
GlStateManager.scale(s, s, s);
fontRenderer.drawStringWithShadow(text, 0, 0, 0xFFFFFF | (a << 24));
GlStateManager.popMatrix();
} else {
fontRenderer.drawStringWithShadow(text, x, y, 0xFFFFFF | (a << 24));
}
}

private void renderConsumeIcon(int mx, int my) {
GlStateManager.enableBlend();
FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer;
IGuiRect rect = getTransform();
int x = rect.getX() + rect.getWidth() - fontRenderer.getStringWidth("C");
int y = rect.getY() + 1;
int a = getTransform().contains(mx, my) ? 100 : 255;
fontRenderer.drawStringWithShadow("C", x, y, 0xFFFF00 | (a << 24));
}

public enum State {
INCOMPLETE,
COMPLETE,
IN_PROGRESS,
}

}
38 changes: 28 additions & 10 deletions src/main/java/betterquesting/client/gui2/GuiQuest.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,14 @@
import betterquesting.api2.client.gui.panels.CanvasTextured;
import betterquesting.api2.client.gui.panels.IGuiPanel;
import betterquesting.api2.client.gui.panels.bars.PanelVScrollBar;
import betterquesting.api2.client.gui.panels.content.PanelGeneric;
import betterquesting.api2.client.gui.panels.content.PanelLine;
import betterquesting.api2.client.gui.panels.content.PanelTextBox;
import betterquesting.api2.client.gui.panels.lists.CanvasScrolling;
import betterquesting.api2.client.gui.popups.PopContextMenu;
import betterquesting.api2.client.gui.resources.colors.GuiColorStatic;
import betterquesting.api2.client.gui.themes.presets.PresetColor;
import betterquesting.api2.client.gui.themes.presets.PresetIcon;
import betterquesting.api2.client.gui.themes.presets.PresetLine;
import betterquesting.api2.client.gui.themes.presets.PresetTexture;
import betterquesting.api2.storage.DBEntry;
Expand All @@ -48,7 +51,6 @@
import betterquesting.questing.tasks.TaskRetrieval;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.resources.I18n;

public class GuiQuest extends GuiScreenCanvas implements IPEventListener, INeedsRefresh {

Expand All @@ -66,6 +68,7 @@ public class GuiQuest extends GuiScreenCanvas implements IPEventListener, INeeds
private PanelButton btnClaim;

private CanvasEmpty cvInner;
private PanelTextBox logicTitle;

private IGuiRect rectReward;
private IGuiRect rectTask;
Expand Down Expand Up @@ -154,6 +157,13 @@ else if (rectReward != null && rectReward.contains(mx, my) && QuestingAPI.getAPI
panTxt.setColor(PresetColor.TEXT_HEADER.getColor());
cvBackground.addPanel(panTxt);

if (quest.getTasks().getEntries().size() > 1) {
// The text will be set in refreshGui()
logicTitle = new PanelTextBox(new GuiTransform(GuiAlign.TOP_EDGE, new GuiPadding(0, 16, 16, -32), 0), "").setAlignment(2);
logicTitle.setColor(PresetColor.TEXT_HEADER.getColor());
cvBackground.addPanel(logicTitle);
}

if (QuestingAPI.getAPI(ApiReference.SETTINGS).canUserEdit(mc.player)) {
cvBackground.addPanel(new PanelButton(new GuiTransform(GuiAlign.BOTTOM_CENTER, -100, -16, 100, 16, 0), 0, QuestTranslation.translate("gui.back")));
cvBackground.addPanel(new PanelButton(new GuiTransform(GuiAlign.BOTTOM_CENTER, 0, -16, 100, 16, 0),
Expand Down Expand Up @@ -226,6 +236,9 @@ public boolean onMouseClick(int mx, int my, int click) {

@Override
public void refreshGui() {
if (logicTitle != null)
logicTitle.setText(QuestTranslation.translate("betterquesting.btn.logic") + ": " + quest.getProperty(NativeProps.LOGIC_TASK));

this.refreshTaskPanel();
this.refreshRewardPanel();
this.updateButtons();
Expand Down Expand Up @@ -393,13 +406,6 @@ private void refreshTaskPanel() {

int yOffset = 0;
List<DBEntry<ITask>> entries = quest.getTasks().getEntries();
if (entries.size() > 1) {
PanelTextBox logicTitle = new PanelTextBox(new GuiTransform(new Vector4f(), 8, yOffset, rectTask.getWidth(), 12, 0),
I18n.format("betterquesting.btn.task_logic", quest.getProperty(NativeProps.LOGIC_TASK)));
logicTitle.setColor(PresetColor.TEXT_HEADER.getColor());
csTask.addPanel(logicTitle);
yOffset += 12;
}
for (int i = 0; i < entries.size(); i++) {
ITask tsk = entries.get(i).getValue();

Expand All @@ -409,16 +415,28 @@ private void refreshTaskPanel() {
if (entryLogic != EnumLogic.AND)
taskName += " (" + entryLogic + ")";
}
PanelTextBox titleReward = new PanelTextBox(new GuiTransform(new Vector4f(), 0, yOffset, rectTask.getWidth(), 12, 0), taskName);
PanelTextBox titleReward = new PanelTextBox(new GuiTransform(new Vector4f(), 0, yOffset, csTask.getTransform().getWidth(), 12, 0), taskName);
titleReward.setColor(PresetColor.TEXT_HEADER.getColor()).setAlignment(1);
titleReward.setEnabled(true);
csTask.addPanel(titleReward);

// Display checkmark if completed
if (tsk.isComplete(QuestingAPI.getQuestingUUID(Minecraft.getMinecraft().player))) {
int size = 18;
int x = csTask.getTransform().getWidth() / 2;
int y = yOffset - 4;
PanelGeneric panel = new PanelGeneric(new GuiTransform(new Vector4f(), x, y, size, size, 0),
PresetIcon.ICON_CHECK.getTexture(),
new GuiColorStatic(0, 255, 0, 255));
csTask.addPanel(panel);
}

yOffset += 10;

IGuiPanel taskGui = tsk.getTaskGui(new GuiTransform(GuiAlign.FULL_BOX,
8,
i == 0 && entries.size() == 1 && tsk.displaysCenteredAlone() ? rectTask.getHeight() / 3 : 0,
i == 0 && entries.size() == 1 && tsk.displaysCenteredAlone() ? csTask.getTransform()
.getHeight() / 3 : 0,
csTask.getTransform().getWidth(),
csTask.getTransform().getHeight(),
0), new DBEntry<>(questID, quest));
Expand Down
Loading

0 comments on commit e34a219

Please sign in to comment.