From a895c8bd24a3eb7ca2b142bf8f17f082eb321d9e Mon Sep 17 00:00:00 2001 From: "Luis C.M" <42545778+c0508383@users.noreply.github.com> Date: Tue, 20 Dec 2022 09:21:39 -0600 Subject: [PATCH] NpcAPI: -Added millisToTime(long) and ticksToTime(long) functions to return time formatted strings from long values. IPlayerQuestData: -Added last completed time functions for repeating quests. IQuest: -Added repeat functions for repeating quests. ServerCloneController: -Fixed cloned NPCs having identical UUIDs. --- src/api | 2 +- .../java/noppes/npcs/NoppesUtilServer.java | 37 +++++++++++++++++++ .../controllers/PlayerQuestController.java | 10 +++++ .../controllers/ServerCloneController.java | 2 + .../controllers/data/PlayerQuestData.java | 15 ++++++++ .../noppes/npcs/controllers/data/Quest.java | 32 ++++++++++++++++ .../java/noppes/npcs/scripted/NpcAPI.java | 8 ++++ 7 files changed, 105 insertions(+), 1 deletion(-) diff --git a/src/api b/src/api index 705bf53ae..3e537043d 160000 --- a/src/api +++ b/src/api @@ -1 +1 @@ -Subproject commit 705bf53aea98dc0f7cc234186cd43f2c3ae6dd87 +Subproject commit 3e537043dc96fb3a7dd689a492fca7eb62cc1894 diff --git a/src/main/java/noppes/npcs/NoppesUtilServer.java b/src/main/java/noppes/npcs/NoppesUtilServer.java index a17d80b64..908d97d73 100644 --- a/src/main/java/noppes/npcs/NoppesUtilServer.java +++ b/src/main/java/noppes/npcs/NoppesUtilServer.java @@ -798,4 +798,41 @@ public class NoppesUtilServer { public static boolean IsItemStackNull(ItemStack is) { return is == null || is.stackSize == 0 || is.getItem() == null; } + + public static String millisToTime(long millis) { + long seconds = millis / 1000; + long minutes = seconds / 60; + long hours = minutes / 60; + long days = hours / 24; + long months = days / 30; + long years = months / 12; + + months = months % 12; + days = days % 30; + hours = hours % 24; + minutes = minutes % 60; + seconds = seconds % 60; + + StringBuilder sb = new StringBuilder(); + if (years > 0) { + sb.append(years + " year(s) "); + } + if (months > 0) { + sb.append(months + " month(s) "); + } + if (days > 0) { + sb.append(days + " day(s) "); + } + if (hours > 0) { + sb.append(hours + " hour(s) "); + } + if (minutes > 0) { + sb.append(minutes + " minute(s) "); + } + if (seconds > 0) { + sb.append(seconds + " second(s)"); + } + + return sb.toString(); + } } diff --git a/src/main/java/noppes/npcs/controllers/PlayerQuestController.java b/src/main/java/noppes/npcs/controllers/PlayerQuestController.java index 16c63431f..55bb6cba8 100644 --- a/src/main/java/noppes/npcs/controllers/PlayerQuestController.java +++ b/src/main/java/noppes/npcs/controllers/PlayerQuestController.java @@ -4,7 +4,10 @@ import java.util.Vector; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.util.ChatComponentTranslation; import noppes.npcs.EventHooks; +import noppes.npcs.NoppesStringUtils; +import noppes.npcs.NoppesUtilServer; import noppes.npcs.Server; import noppes.npcs.constants.EnumPacketClient; import noppes.npcs.constants.EnumQuestRepeat; @@ -42,6 +45,13 @@ public class PlayerQuestController { data.activeQuests.put(quest.id,new QuestData(quest)); Server.sendData((EntityPlayerMP)player, EnumPacketClient.MESSAGE, "quest.newquest", quest.title); Server.sendData((EntityPlayerMP)player, EnumPacketClient.CHAT, "quest.newquest", ": ", quest.title); + } else { + long timeUntilRepeat = quest.getTimeUntilRepeat(player); + if (timeUntilRepeat > 0 && quest.getIsRepeatable() && quest.repeat != EnumQuestRepeat.NONE && quest.repeat != EnumQuestRepeat.REPEATABLE) { + String timeString = NoppesUtilServer.millisToTime(timeUntilRepeat); + String message = "You have " + timeString + " left until you can repeat this quest."; + player.addChatMessage(new ChatComponentTranslation(NoppesStringUtils.formatText(message,player))); + } } } diff --git a/src/main/java/noppes/npcs/controllers/ServerCloneController.java b/src/main/java/noppes/npcs/controllers/ServerCloneController.java index 7b5c35ff9..c963f324f 100644 --- a/src/main/java/noppes/npcs/controllers/ServerCloneController.java +++ b/src/main/java/noppes/npcs/controllers/ServerCloneController.java @@ -170,6 +170,8 @@ public class ServerCloneController implements ICloneHandler { nbttagcompound.removeTag("MovingPathNew"); nbttagcompound.removeTag("Pos"); nbttagcompound.removeTag("Riding"); + nbttagcompound.removeTag("UUIDMost"); + nbttagcompound.removeTag("UUIDLeast"); if(!nbttagcompound.hasKey("ModRev")) nbttagcompound.setInteger("ModRev", 1); diff --git a/src/main/java/noppes/npcs/controllers/data/PlayerQuestData.java b/src/main/java/noppes/npcs/controllers/data/PlayerQuestData.java index 411eb3ac2..b480bf323 100644 --- a/src/main/java/noppes/npcs/controllers/data/PlayerQuestData.java +++ b/src/main/java/noppes/npcs/controllers/data/PlayerQuestData.java @@ -11,6 +11,7 @@ import net.minecraft.nbt.NBTTagList; import noppes.npcs.EventHooks; import noppes.npcs.NoppesUtilPlayer; import noppes.npcs.Server; +import noppes.npcs.api.entity.IPlayer; import noppes.npcs.constants.EnumPacketClient; import noppes.npcs.constants.EnumQuestCompletion; import noppes.npcs.constants.EnumQuestType; @@ -213,4 +214,18 @@ public class PlayerQuestData implements IPlayerQuestData { return (IQuest[])quests.toArray(new IQuest[0]); } + + public long getLastCompletedTime(int id) { + if (this.hasFinishedQuest(id)) { + return this.finishedQuests.get(id); + } + return 0; + } + + public void setLastCompletedTime(int id,long time) { + Quest quest = QuestController.instance.quests.get(id); + if (quest == null) + return; + this.finishedQuests.put(id,time); + } } diff --git a/src/main/java/noppes/npcs/controllers/data/Quest.java b/src/main/java/noppes/npcs/controllers/data/Quest.java index 2c36b191c..b0e419ccd 100644 --- a/src/main/java/noppes/npcs/controllers/data/Quest.java +++ b/src/main/java/noppes/npcs/controllers/data/Quest.java @@ -8,6 +8,7 @@ import noppes.npcs.constants.EnumPacketClient; import noppes.npcs.constants.EnumQuestCompletion; import noppes.npcs.constants.EnumQuestRepeat; import noppes.npcs.constants.EnumQuestType; +import noppes.npcs.controllers.PlayerDataController; import noppes.npcs.controllers.QuestController; import noppes.npcs.quests.QuestDialog; import noppes.npcs.quests.QuestInterface; @@ -146,6 +147,22 @@ public class Quest implements ICompatibilty, IQuest { quest.readNBT(this.writeToNBT(new NBTTagCompound())); return quest; } + + public long getTimeUntilRepeat(EntityPlayer player) { + long questTime = PlayerDataController.instance.getPlayerData(player).getQuestData().getLastCompletedTime(this.id); + + switch (repeat) { + case MCDAILY: + return Math.max(0, questTime + 24000 - player.worldObj.getTotalWorldTime()); + case MCWEEKLY: + return Math.max(0, questTime + 168000 - player.worldObj.getTotalWorldTime()); + case RLDAILY: + return Math.max(0, questTime + 86400000 - System.currentTimeMillis()); + case RLWEEKLY: + return Math.max(0, questTime + 604800000 - System.currentTimeMillis()); + } + return 0L; + } @Override public int getVersion() { @@ -239,6 +256,21 @@ public class Quest implements ICompatibilty, IQuest { return this.repeat != EnumQuestRepeat.NONE; } + public long getTimeUntilRepeat(IPlayer player) { + return this.getTimeUntilRepeat((EntityPlayer) player.getMCEntity()); + } + + public void setRepeatType(int type) { + if (type < 0 || type >= EnumQuestRepeat.values().length) { + return; + } + this.repeat = EnumQuestRepeat.values()[type]; + } + + public int getRepeatType() { + return this.repeat.ordinal(); + } + public IContainer getRewards() { return NpcAPI.Instance().getIContainer(this.rewardItems); } diff --git a/src/main/java/noppes/npcs/scripted/NpcAPI.java b/src/main/java/noppes/npcs/scripted/NpcAPI.java index 3639d47e0..d0e7032fa 100644 --- a/src/main/java/noppes/npcs/scripted/NpcAPI.java +++ b/src/main/java/noppes/npcs/scripted/NpcAPI.java @@ -546,4 +546,12 @@ public class NpcAPI extends AbstractNpcAPI { public ISkinOverlay createSkinOverlay(String texture) { return new SkinOverlay(texture); } + + public String millisToTime(long millis) { + return NoppesUtilServer.millisToTime(millis); + } + + public String ticksToTime(long ticks) { + return this.millisToTime(ticks * 50); + } }