Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ public class NativeProps {
public static final IPropertyType<Boolean> LOCKED_PROGRESS = new PropertyTypeBoolean(new ResourceLocation(ModReference.MODID, "lockedProgress"), false);
public static final IPropertyType<Boolean> SIMULTANEOUS = new PropertyTypeBoolean(new ResourceLocation(ModReference.MODID, "simultaneous"), false);
public static final IPropertyType<Boolean> IGNORES_VIEW_MODE = new PropertyTypeBoolean(new ResourceLocation(ModReference.MODID, "ignoresView"), false);
public static final IPropertyType<Boolean> SKIP_COMPLETION_COUNT = new PropertyTypeBoolean(new ResourceLocation(ModReference.MODID, "skipCompletionCount"), false);

public static final IPropertyType<EnumQuestVisibility> VISIBILITY = new PropertyTypeEnum<>(new ResourceLocation(ModReference.MODID, "visibility"), findVisibility());
public static final IPropertyType<EnumLogic> LOGIC_TASK = new PropertyTypeEnum<>(new ResourceLocation(ModReference.MODID, "taskLogic"), EnumLogic.AND);
Expand Down
82 changes: 67 additions & 15 deletions src/main/java/betterquesting/client/gui2/GuiQuestLines.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,21 +53,24 @@
import betterquesting.network.handlers.NetQuestAction;
import betterquesting.questing.QuestDatabase;
import betterquesting.questing.QuestLineDatabase;
import it.unimi.dsi.fastutil.ints.IntArraySet;
import it.unimi.dsi.fastutil.ints.IntSet;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.Tuple;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraftforge.common.config.Configuration;
import org.lwjgl.util.vector.Vector4f;

import javax.annotation.Nonnull;
import java.text.DecimalFormat;
import java.util.*;

public class GuiQuestLines extends GuiScreenCanvas implements IPEventListener, INeedsRefresh {

private static OpenTray openTray = OpenTray.NONE;
private static final DecimalFormat PERCENT_FORMAT = new DecimalFormat("0.##");

private final ScrollPosition scrollPosition;

Expand All @@ -91,6 +94,7 @@ public class GuiQuestLines extends GuiScreenCanvas implements IPEventListener, I
private PanelTextBox txTitle;
private PanelTextBox txDesc;
private PanelTextBox completionText;
private PanelTextBox globalCompletionText;

private PanelButton claimAll;

Expand Down Expand Up @@ -198,9 +202,13 @@ public void initPanel() {
});
cvBackground.addPanel(cvChapterTray);

cvLines = new CanvasScrolling(new GuiTransform(GuiAlign.FULL_BOX, new GuiPadding(8, 8, 16, 8), 0));
cvLines = new CanvasScrolling(new GuiTransform(GuiAlign.FULL_BOX, new GuiPadding(8, 20, 16, 8), 0));
cvChapterTray.getCanvasOpen().addPanel(cvLines);

globalCompletionText = new PanelTextBox(new GuiTransform(new Vector4f(0F, 0F, 1F, 0F), new GuiPadding(24, 8, 16, -20), 0), "");
globalCompletionText.setColor(PresetColor.TEXT_HEADER.getColor());
cvChapterTray.getCanvasOpen().addPanel(globalCompletionText);

scLines = new PanelVScrollBar(new GuiTransform(GuiAlign.RIGHT_EDGE, new GuiPadding(-16, 8, 8, 8), 0));
cvLines.setScrollDriverY(scLines);
cvChapterTray.getCanvasOpen().addPanel(scLines);
Expand Down Expand Up @@ -470,7 +478,9 @@ private void refreshChapterVisibility() {
for (DBEntry<IQuestLine> dbEntry : lineList) {
IQuestLine ql = dbEntry.getValue();
EnumQuestVisibility vis = ql.getProperty(NativeProps.VISIBILITY);
if (!canEdit && vis == EnumQuestVisibility.HIDDEN) continue;

if (!canEdit && vis == EnumQuestVisibility.HIDDEN && (!viewMode || ql.getProperty(NativeProps.IGNORES_VIEW_MODE)))
continue;

boolean show = false;
boolean unlocked = false;
Expand Down Expand Up @@ -513,11 +523,13 @@ private void refreshChapterVisibility() {
}

if (cvChapterTray.isTrayOpen()) buildChapterList();
refreshGlobalCompletion();
}

private boolean isQuestCompletedForQuestline(UUID playerID, @Nonnull IQuest q) {
if (q.isComplete(playerID)) return true; // Completed quest
if (q.getProperty(NativeProps.VISIBILITY) == EnumQuestVisibility.HIDDEN) return true; // Always hidden quest
if (q.getProperty(NativeProps.SKIP_COMPLETION_COUNT)) return true; // Always counted as true
if (q.getProperty(NativeProps.VISIBILITY) == EnumQuestVisibility.HIDDEN && q.getProperty(NativeProps.IGNORES_VIEW_MODE)) return true; // Always hidden quest
if (q.getProperty(NativeProps.LOGIC_QUEST) == EnumLogic.XOR) { // Quest with choice
int reqCount = 0;
for (int qRequirementId : q.getRequirements()) {
Expand Down Expand Up @@ -578,31 +590,71 @@ private void buildChapterList() {
}

private void refreshQuestCompletion() {
UUID playerUUID = QuestingAPI.getQuestingUUID(mc.player);
if (selectedLine == null) return;

if (selectedLine == null) {
return;
}
UUID playerUUID = QuestingAPI.getQuestingUUID(mc.player);

int questsCompleted = 0;
int totalQuests = 0;
var database = Objects.requireNonNull(QuestingAPI.getAPI(ApiReference.QUEST_DB));
int completed = 0;
int total = 0;

for (DBEntry<IQuestLineEntry> entry : selectedLine.getEntries()) {
IQuest quest = database.getValue(entry.getID());

if (quest.getProperty(NativeProps.SKIP_COMPLETION_COUNT)) continue;
if (quest.getProperty(NativeProps.VISIBILITY) == EnumQuestVisibility.HIDDEN && quest.getProperty(NativeProps.IGNORES_VIEW_MODE)) continue;
if (quest.getProperty(NativeProps.LOGIC_QUEST) == EnumLogic.XOR) {
// Subtract the number of requirements - 1 to simulate only doing 1 task for XOR requirements
totalQuests = totalQuests - Math.max(0, quest.getRequirements().length - 1);
total = total - Math.max(0, quest.getRequirements().length - 1);
}

totalQuests++;
total++;

if (quest.isComplete(playerUUID)) {
questsCompleted++;
completed++;
}
}
completionText.setText(QuestTranslation.translate("betterquesting.title.completion", questsCompleted, totalQuests));
completionText.setText(completionText("betterquesting.title.completion", completed, total));
}

private void refreshGlobalCompletion() {
if (globalCompletionText == null) return;

UUID playerUUID = QuestingAPI.getQuestingUUID(mc.player);
var database = Objects.requireNonNull(QuestingAPI.getAPI(ApiReference.QUEST_DB));
IntSet seen = new IntArraySet();
int completed = 0;
int total = 0;

for (var visChapter : visChapters) {
IQuestLine line = visChapter.getFirst().getValue();
if (line.getProperty(NativeProps.VISIBILITY) == EnumQuestVisibility.HIDDEN && line.getProperty(NativeProps.IGNORES_VIEW_MODE)) continue;
for (var entry : line.getEntries()) {
int questId = entry.getID();
if (!seen.add(questId)) continue; // already counted in another visible line
IQuest quest = database.getValue(questId);

if (quest.getProperty(NativeProps.SKIP_COMPLETION_COUNT)) continue;
if (quest.getProperty(NativeProps.VISIBILITY) == EnumQuestVisibility.HIDDEN && quest.getProperty(NativeProps.IGNORES_VIEW_MODE)) continue;
if (quest.getProperty(NativeProps.LOGIC_QUEST) == EnumLogic.XOR) {
// Subtract the number of requirements - 1 to simulate only doing 1 task for XOR requirements
total = total - Math.max(0, quest.getRequirements().length - 1);
}

total++;

if (quest.isComplete(playerUUID)) {
completed++;
}
}
}

globalCompletionText.setText(completionText("betterquesting.title.completion_total", completed, total));
}

private static String completionText(String key, int completed, int total) {
String percent = total > 0 ? PERCENT_FORMAT.format(completed * 100.0 / total) : "0";
return QuestTranslation.translate(key, completed, total, percent);
}

private void openQuestLine(DBEntry<IQuestLine> q) {
Expand Down Expand Up @@ -707,7 +759,7 @@ enum OpenTray {
NONE, CHAPTER, DESCRIPTION
}

public static class ScrollPosition{
public static class ScrollPosition {
public ScrollPosition(int chapterScrollY) {
this.chapterScrollY = chapterScrollY;
}
Expand Down
1 change: 1 addition & 0 deletions src/main/java/betterquesting/questing/QuestInstance.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ private void setupProps() {
setupValue(NativeProps.GLOBAL_SHARE, false);
setupValue(NativeProps.SIMULTANEOUS, false);
setupValue(NativeProps.IGNORES_VIEW_MODE, false);
setupValue(NativeProps.SKIP_COMPLETION_COUNT, false);
setupValue(NativeProps.VISIBILITY, NativeProps.VISIBILITY.getDefault());
}

Expand Down
1 change: 1 addition & 0 deletions src/main/java/betterquesting/questing/QuestLine.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ private void setupProps() {
this.setupValue(NativeProps.DESC, "No Description");
this.setupValue(NativeProps.ICON, new BigItemStack(Items.BOOK));
this.setupValue(NativeProps.VISIBILITY, NativeProps.VISIBILITY.getDefault());
this.setupValue(NativeProps.IGNORES_VIEW_MODE, false);
this.setupValue(NativeProps.BG_IMAGE);
this.setupValue(NativeProps.BG_SIZE);
}
Expand Down
3 changes: 2 additions & 1 deletion src/main/resources/assets/betterquesting/lang/en_us.lang
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ betterquesting.title.party_invite=Invite Users
betterquesting.title.select_theme=Select Theme
betterquesting.title.importers=Importers
betterquesting.title.submit_station=Submit Station
betterquesting.title.completion=Completion: %d/%d
betterquesting.title.completion=Completion: %d/%d (%s%%)
betterquesting.title.completion_total=Total: %d/%d (%s%%)

betterquesting.btn.rewards=Rewards
betterquesting.btn.tasks=Tasks
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/assets/betterquesting/lang/ja_jp.lang
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ betterquesting.title.party_invite=ユーザーを招待
betterquesting.title.select_theme=テーマを選択
betterquesting.title.importers=インポーター
betterquesting.title.submit_station=提出ステーション
betterquesting.title.completion=%d/%d : 完了
betterquesting.title.completion=%d/%d : 完了 (%s%%)

betterquesting.btn.rewards=報酬
betterquesting.btn.tasks=タスク
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/assets/betterquesting/lang/ru_ru.lang
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ betterquesting.title.party_invite=Пригласить игроков
betterquesting.title.select_theme=Выбрать тему
betterquesting.title.importers=Импортеры
betterquesting.title.submit_station=Станция отправки
betterquesting.title.completion=Завершение: %d/%d
betterquesting.title.completion=Завершение: %d/%d (%s%%)

betterquesting.btn.rewards=Награды
betterquesting.btn.tasks=Задания
Expand Down
Loading