From e2df33fb5ff6848e3af3a33e010a0558168b0175 Mon Sep 17 00:00:00 2001 From: "Luis C.M" Date: Sun, 29 May 2022 04:45:38 -0500 Subject: [PATCH] Added quest objective and turnin data to the quest tracker. --- .../java/noppes/npcs/NoppesUtilPlayer.java | 22 ++++ .../java/noppes/npcs/PacketHandlerServer.java | 5 +- .../noppes/npcs/ScriptPlayerEventHandler.java | 7 +- .../npcs/client/gui/OverlayQuestTracking.java | 112 +++++++++++++----- .../controllers/data/PlayerQuestData.java | 6 +- 5 files changed, 113 insertions(+), 39 deletions(-) diff --git a/src/main/java/noppes/npcs/NoppesUtilPlayer.java b/src/main/java/noppes/npcs/NoppesUtilPlayer.java index df129a397..2c6bbe6c8 100644 --- a/src/main/java/noppes/npcs/NoppesUtilPlayer.java +++ b/src/main/java/noppes/npcs/NoppesUtilPlayer.java @@ -14,6 +14,9 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTTagString; import net.minecraft.server.MinecraftServer; import net.minecraft.util.ChatComponentText; import net.minecraft.world.WorldServer; @@ -33,6 +36,7 @@ import cpw.mods.fml.common.network.internal.FMLProxyPacket; import noppes.npcs.scripted.event.DialogEvent; import noppes.npcs.scripted.event.QuestEvent; import noppes.npcs.scripted.interfaces.entity.IPlayer; +import noppes.npcs.scripted.interfaces.handler.data.IQuestObjective; import noppes.npcs.scripted.interfaces.item.IItemStack; import noppes.npcs.scripted.NpcAPI; @@ -284,6 +288,24 @@ public class NoppesUtilPlayer { else Server.sendData(player, EnumPacketClient.GUI_CLOSE); } + public static void sendTrackedQuestData(EntityPlayerMP player, Quest trackedQuest) { + Quest quest = (Quest) PlayerDataController.instance.getPlayerData(player).questData.trackedQuest; + if (quest.id != trackedQuest.id) { + return; + } + + NBTTagCompound compound = new NBTTagCompound(); + compound.setTag("Quest",trackedQuest.writeToNBT(new NBTTagCompound())); + compound.setString("CategoryName", trackedQuest.getCategory().getName()); + compound.setString("TurnInNPC", trackedQuest.getNpcName()); + NBTTagList nbtTagList = new NBTTagList(); + for (IQuestObjective objective : trackedQuest.questInterface.getObjectives(player)) { + nbtTagList.appendTag(new NBTTagString(objective.getText())); + } + compound.setTag("ObjectiveList",nbtTagList); + Server.sendData(player, EnumPacketClient.OVERLAY_QUEST_TRACKING, compound); + } + public static void sendQuestLogData(EntityPlayerMP player) { if(!PlayerQuestController.hasActiveQuests(player)){ return; diff --git a/src/main/java/noppes/npcs/PacketHandlerServer.java b/src/main/java/noppes/npcs/PacketHandlerServer.java index 0a030410c..71bfdab6d 100644 --- a/src/main/java/noppes/npcs/PacketHandlerServer.java +++ b/src/main/java/noppes/npcs/PacketHandlerServer.java @@ -154,10 +154,7 @@ public class PacketHandlerServer{ for (Quest quest : category.quests.values()) { if (quest.title.equals(questName)) { PlayerDataController.instance.getPlayerData(player).questData.trackedQuest = quest; - NBTTagCompound compound = new NBTTagCompound(); - compound.setTag("Quest",quest.writeToNBT(new NBTTagCompound())); - compound.setString("CategoryName", quest.getCategory().getName()); - Server.sendData(player, EnumPacketClient.OVERLAY_QUEST_TRACKING, compound); + NoppesUtilPlayer.sendTrackedQuestData(player, quest); return; } } diff --git a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java index 3bfed30b9..7ff56edce 100644 --- a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java +++ b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java @@ -14,7 +14,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.ContainerPlayer; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ChatComponentTranslation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldServer; @@ -28,7 +27,6 @@ import net.minecraftforge.event.entity.living.LivingFallEvent; import net.minecraftforge.event.entity.living.LivingHurtEvent; import net.minecraftforge.event.entity.player.*; import net.minecraftforge.event.world.*; -import noppes.npcs.constants.EnumPacketClient; import noppes.npcs.constants.EnumQuestType; import noppes.npcs.controllers.*; import noppes.npcs.controllers.data.PlayerData; @@ -435,10 +433,7 @@ public class ScriptPlayerEventHandler { Quest quest = (Quest) PlayerDataController.instance.getPlayerData(event.player).questData.trackedQuest; if (quest != null) { - NBTTagCompound compound = new NBTTagCompound(); - compound.setTag("Quest",quest.writeToNBT(new NBTTagCompound())); - compound.setString("CategoryName", quest.getCategory().getName()); - Server.sendData((EntityPlayerMP) event.player, EnumPacketClient.OVERLAY_QUEST_TRACKING, compound); + NoppesUtilPlayer.sendTrackedQuestData((EntityPlayerMP) event.player, quest); } } } diff --git a/src/main/java/noppes/npcs/client/gui/OverlayQuestTracking.java b/src/main/java/noppes/npcs/client/gui/OverlayQuestTracking.java index ef3f2cd25..dbfc6638c 100644 --- a/src/main/java/noppes/npcs/client/gui/OverlayQuestTracking.java +++ b/src/main/java/noppes/npcs/client/gui/OverlayQuestTracking.java @@ -10,6 +10,7 @@ import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.util.ResourceLocation; import noppes.npcs.CustomNpcs; import noppes.npcs.controllers.data.Quest; @@ -55,8 +56,10 @@ public class OverlayQuestTracking extends Gui { private float renderOffsetY; - public static Quest trackedQuest = new Quest(); - public static String categoryName = ""; + public ArrayList trackedQuestLines = new ArrayList<>(); + public ArrayList categoryNameLines = new ArrayList<>(); + public ArrayList objectiveLines = new ArrayList<>(); + public ArrayList turnInText = new ArrayList<>(); public OverlayQuestTracking(Minecraft mc) { this.mc = mc; @@ -102,11 +105,56 @@ public class OverlayQuestTracking extends Gui { } public void setOverlayData(NBTTagCompound compound) { + Quest trackedQuest = new Quest(); trackedQuest.readNBT(compound.getCompoundTag("Quest")); - categoryName = compound.getString("CategoryName"); + + trackedQuestLines = getLineList(trackedQuest.getName()); + categoryNameLines = getLineList(compound.getString("CategoryName")); + + NBTTagList nbtTagList = compound.getTagList("ObjectiveList",8); + for (int i = 0; i < nbtTagList.tagCount(); i++) { + String objective = nbtTagList.getStringTagAt(i); + + String[] split = objective.split(":"); + split = split[split.length-1].split("/"); + + int completed = Integer.parseInt(split[0].trim()); + int total = Integer.parseInt(split[1].trim()); + if (completed / total == 1) { + objective = "&a&o&m" + objective; + } else { + objective = "&o" + objective; + } + + objectiveLines.add(objective); + } + + String npcName = compound.getString("TurnInNPC"); + if (!npcName.isEmpty()) { + turnInText.add("Complete with " + npcName); + } + this.initOverlay(); } + public ArrayList getLineList(String string) { + String[] split = string.split(" "); + + ArrayList lines = new ArrayList<>(); + lines.add(split[0]); + + for (int i = 1; i < split.length; i++) { + String s = split[i]; + if (this.fontRenderer.getStringWidth(lines.get(lines.size() - 1) + " " + s) > 100) { + lines.add(s); + } else { + lines.set(lines.size() - 1, lines.get(lines.size() - 1) + " " + s); + } + } + + return lines; + } + public void renderGameOverlay(float partialTicks){ res = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight); scaledWidth = res.getScaledWidth(); @@ -129,24 +177,32 @@ public class OverlayQuestTracking extends Gui { this.renderOffsetY = -40; GL11.glPushMatrix(); GL11.glTranslatef(centerX, 0.0F, 0.0F); - this.renderStringLines(trackedQuest.getName(),1.2F, false, true); + this.renderStringLines(trackedQuestLines,1.2F, false, true, 0); GL11.glPopMatrix(); questTitleTop = this.renderOffsetY; - this.renderOffsetY -= 5; + this.renderOffsetY -= 10; GL11.glPushMatrix(); GL11.glTranslatef(centerX, 0.0F, 0.0F); - this.renderStringLines(categoryName,0.85F, false, false); + this.renderStringLines(categoryNameLines,0.85F, false, false, 0); GL11.glPopMatrix(); - //TODO: Add objectives list, with green strikethrough text for completed objectives. Then, add who the player should turn the quest in to. + this.renderOffsetY = -10; + GL11.glPushMatrix(); + this.renderStringLines(objectiveLines,1F, true, false, 2); + GL11.glPopMatrix(); - this.renderOffsetY = -25; + this.renderOffsetY += 10; + GL11.glPushMatrix(); + this.renderStringLines(turnInText,1F, false, false, 2); + GL11.glPopMatrix(); + + this.renderOffsetY = -20; GL11.glPushMatrix(); this.drawHorizontalLine((int)(-60 + centerX), (int)(60 + centerX), (int) (this.renderOffsetY+2), 0xFF777777); this.drawHorizontalLine((int)(-60 + centerX), (int)(60 + centerX), (int) (this.renderOffsetY+1), 0xFFA8A8A8); this.drawHorizontalLine((int)(-60 + centerX), (int)(60 + centerX), (int) (this.renderOffsetY), 0xFFFFFFFF); GL11.glPopMatrix(); - this.renderOffsetY = questTitleTop + 5; + this.renderOffsetY = questTitleTop + 2; GL11.glPushMatrix(); this.drawHorizontalLine((int)(-60 + centerX), (int)(60 + centerX), (int) (this.renderOffsetY), 0xFFFFFFFF); this.drawHorizontalLine((int)(-60 + centerX), (int)(60 + centerX), (int) (this.renderOffsetY-1), 0xFFA8A8A8); @@ -159,36 +215,38 @@ public class OverlayQuestTracking extends Gui { GL11.glEnable(GL11.GL_ALPHA_TEST); } - public void renderStringLines(String string, float scale, boolean upwards, boolean bold) { - String[] split = string.split(" "); - - ArrayList lines = new ArrayList<>(); - lines.add(split[0]); - - for (int i = 1; i < split.length; i++) { - String s = split[i]; - if (this.fontRenderer.getStringWidth(lines.get(lines.size() - 1) + " " + s) > 100) { - lines.add(s); - } else { - lines.set(lines.size() - 1, lines.get(lines.size() - 1) + " " + s); - } - } - + public void renderStringLines(ArrayList lines, float scale, boolean downwards, boolean bold, int justified) { for (int i = 0; i < lines.size(); i++) { String s = lines.get(i); - if (!upwards) { + if (!downwards) { s = lines.get(lines.size()-1 - i); } + int stringWidth = this.fontRenderer.getStringWidth(s.replace("&o","")); + if (s.startsWith("&a&o&m")) { + stringWidth = this.fontRenderer.getStringWidth(s.replace("&a&o&m","")); + } + GL11.glPushMatrix(); - GL11.glTranslatef(scale*(-this.fontRenderer.getStringWidth(s)/2.0F), this.renderOffsetY, 0.0F); + switch (justified) { + case 0://center + GL11.glTranslatef(scale * (-stringWidth / 2.0F), this.renderOffsetY, 0.0F); + break; + case 1://left + GL11.glTranslatef(scale * (stringWidth), this.renderOffsetY, 0.0F); + break; + case 2://right + GL11.glTranslatef(scale * (-stringWidth), this.renderOffsetY, 0.0F); + break; + } + GL11.glScalef(scale, scale, scale); this.drawString(s, 0, 0, this.color, true); if (bold) { GL11.glTranslatef(0.2F, 0.2F, 0.0F); this.drawString(s, 0, 0, this.color, false); } - this.renderOffsetY += upwards ? 10 : -10; + this.renderOffsetY += downwards ? 10 : -10; GL11.glPopMatrix(); } } diff --git a/src/main/java/noppes/npcs/controllers/data/PlayerQuestData.java b/src/main/java/noppes/npcs/controllers/data/PlayerQuestData.java index d02218ef4..06e73e83f 100644 --- a/src/main/java/noppes/npcs/controllers/data/PlayerQuestData.java +++ b/src/main/java/noppes/npcs/controllers/data/PlayerQuestData.java @@ -7,6 +7,7 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import noppes.npcs.EventHooks; +import noppes.npcs.NoppesUtilPlayer; import noppes.npcs.Server; import noppes.npcs.constants.EnumPacketClient; import noppes.npcs.constants.EnumQuestCompletion; @@ -107,9 +108,10 @@ public class PlayerQuestData { for(QuestData data : this.activeQuests.values()){ if(data.quest.type != type && type != null) continue; - - QuestInterface inter = data.quest.questInterface; + NoppesUtilPlayer.sendTrackedQuestData((EntityPlayerMP) player,data.quest); + + QuestInterface inter = data.quest.questInterface; if(inter.isCompleted(playerData)){ if(!data.isCompleted){ if(!data.quest.complete(player,data)){