2018-09-13 12:03:28 -04:00
|
|
|
package noppes.npcs.controllers;
|
|
|
|
|
|
2025-02-21 06:19:24 -05:00
|
|
|
import kamkeel.npcs.controllers.ProfileController;
|
2025-01-30 13:54:49 -05:00
|
|
|
import kamkeel.npcs.network.packets.data.AchievementPacket;
|
|
|
|
|
import kamkeel.npcs.network.packets.data.ChatAlertPacket;
|
2018-09-13 12:03:28 -04:00
|
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
|
|
|
import net.minecraft.entity.player.EntityPlayerMP;
|
2022-12-20 09:21:39 -06:00
|
|
|
import net.minecraft.util.ChatComponentTranslation;
|
2022-01-12 20:12:16 -06:00
|
|
|
import noppes.npcs.EventHooks;
|
2022-12-20 09:21:39 -06:00
|
|
|
import noppes.npcs.NoppesStringUtils;
|
|
|
|
|
import noppes.npcs.NoppesUtilServer;
|
2025-02-21 06:19:24 -05:00
|
|
|
import noppes.npcs.config.ConfigMain;
|
|
|
|
|
import noppes.npcs.constants.EnumProfileSync;
|
2018-09-13 12:03:28 -04:00
|
|
|
import noppes.npcs.constants.EnumQuestRepeat;
|
|
|
|
|
import noppes.npcs.constants.EnumQuestType;
|
2024-03-17 23:15:11 -04:00
|
|
|
import noppes.npcs.controllers.data.PlayerData;
|
|
|
|
|
import noppes.npcs.controllers.data.PlayerQuestData;
|
|
|
|
|
import noppes.npcs.controllers.data.Quest;
|
|
|
|
|
import noppes.npcs.controllers.data.QuestData;
|
2018-09-13 12:03:28 -04:00
|
|
|
import noppes.npcs.quests.QuestDialog;
|
|
|
|
|
|
2023-01-12 21:33:06 -05:00
|
|
|
import java.util.Vector;
|
|
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
public class PlayerQuestController {
|
|
|
|
|
|
|
|
|
|
public static boolean hasActiveQuests(EntityPlayer player){
|
2024-03-07 22:27:34 -05:00
|
|
|
PlayerQuestData data = PlayerData.get(player).questData;
|
2018-09-13 12:03:28 -04:00
|
|
|
return !data.activeQuests.isEmpty();
|
|
|
|
|
}
|
2024-03-02 21:06:42 -05:00
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
public static boolean isQuestActive(EntityPlayer player, int quest){
|
2024-03-07 22:27:34 -05:00
|
|
|
PlayerQuestData data = PlayerData.get(player).questData;
|
2018-09-13 12:03:28 -04:00
|
|
|
return data.activeQuests.containsKey(quest);
|
|
|
|
|
}
|
2024-03-02 21:06:42 -05:00
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
public static boolean isQuestFinished(EntityPlayer player, int questid){
|
2024-03-07 22:27:34 -05:00
|
|
|
PlayerQuestData data = PlayerData.get(player).questData;
|
2018-09-13 12:03:28 -04:00
|
|
|
return data.finishedQuests.containsKey(questid);
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-16 23:37:57 -05:00
|
|
|
public static void addActiveQuest(QuestData questData, EntityPlayer player) {
|
2024-03-07 22:22:39 -05:00
|
|
|
PlayerData playerData = PlayerData.get(player);
|
|
|
|
|
PlayerQuestData data = playerData.questData;
|
2023-03-16 23:37:57 -05:00
|
|
|
if(canQuestBeAccepted(questData.quest, player)){
|
|
|
|
|
if (EventHooks.onQuestStarted(player, questData.quest)) {
|
2022-01-12 20:12:16 -06:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-16 23:37:57 -05:00
|
|
|
data.activeQuests.put(questData.quest.id,questData);
|
|
|
|
|
if (questData.sendAlerts) {
|
2025-01-30 13:54:49 -05:00
|
|
|
AchievementPacket.sendAchievement((EntityPlayerMP) player, false, "quest.newquest", questData.quest.title);
|
|
|
|
|
ChatAlertPacket.sendChatAlert((EntityPlayerMP) player, "quest.newquest", ": ", questData.quest.title);
|
2023-03-16 23:37:57 -05:00
|
|
|
}
|
2024-03-07 22:22:39 -05:00
|
|
|
playerData.updateClient = true;
|
2022-12-20 09:21:39 -06:00
|
|
|
} else {
|
2023-03-16 23:37:57 -05:00
|
|
|
long timeUntilRepeat = questData.quest.getTimeUntilRepeat(player);
|
|
|
|
|
if (timeUntilRepeat > 0 && questData.quest.getIsRepeatable() && questData.quest.repeat != EnumQuestRepeat.NONE && questData.quest.repeat != EnumQuestRepeat.REPEATABLE) {
|
2022-12-20 09:21:39 -06:00
|
|
|
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)));
|
|
|
|
|
}
|
2018-09-13 12:03:28 -04:00
|
|
|
}
|
|
|
|
|
}
|
2024-03-02 21:06:42 -05:00
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
public static void setQuestFinished(Quest quest, EntityPlayer player){
|
2024-03-07 22:27:34 -05:00
|
|
|
PlayerData playerdata = PlayerData.get(player);
|
2018-09-13 12:03:28 -04:00
|
|
|
PlayerQuestData data = playerdata.questData;
|
2023-05-11 16:58:03 -04:00
|
|
|
QuestData questData = data.activeQuests.get(quest.id);
|
2018-09-13 12:03:28 -04:00
|
|
|
data.activeQuests.remove(quest.id);
|
2025-02-21 06:19:24 -05:00
|
|
|
setQuestFinishedUtil(player, quest, data);
|
2018-09-13 12:03:28 -04:00
|
|
|
if(quest.repeat != EnumQuestRepeat.NONE && quest.type == EnumQuestType.Dialog){
|
|
|
|
|
QuestDialog questdialog = (QuestDialog) quest.questInterface;
|
|
|
|
|
for(int dialog : questdialog.dialogs.values()){
|
|
|
|
|
playerdata.dialogData.dialogsRead.remove(dialog);
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-03-02 21:06:42 -05:00
|
|
|
if (questData != null && questData.sendAlerts) {
|
2025-01-30 13:54:49 -05:00
|
|
|
AchievementPacket.sendAchievement((EntityPlayerMP) player, false, "quest.completed", questData.quest.title);
|
|
|
|
|
ChatAlertPacket.sendChatAlert((EntityPlayerMP) player, "quest.completed", ": ", questData.quest.title);
|
2023-05-11 16:58:03 -04:00
|
|
|
}
|
2024-03-07 22:22:39 -05:00
|
|
|
playerdata.updateClient = true;
|
2018-09-13 12:03:28 -04:00
|
|
|
}
|
2024-03-02 21:06:42 -05:00
|
|
|
|
2025-02-21 06:19:24 -05:00
|
|
|
public static void setQuestFinishedUtil(EntityPlayer player, Quest quest, PlayerQuestData questData){
|
|
|
|
|
long completeTime;
|
|
|
|
|
if(quest.repeat == EnumQuestRepeat.RLDAILY || quest.repeat == EnumQuestRepeat.RLWEEKLY || quest.repeat == EnumQuestRepeat.RLCUSTOM){
|
|
|
|
|
completeTime = System.currentTimeMillis();
|
|
|
|
|
questData.finishedQuests.put(quest.id, completeTime);
|
|
|
|
|
} else {
|
|
|
|
|
completeTime = player.worldObj.getTotalWorldTime();
|
|
|
|
|
questData.finishedQuests.put(quest.id, completeTime);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(ConfigMain.ProfilesEnabled && quest.profileOptions.enableOptions && quest.profileOptions.completeControl == EnumProfileSync.Shared)
|
|
|
|
|
ProfileController.Instance.shareQuestCompletion(player, quest.id, completeTime);
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-02 21:06:42 -05:00
|
|
|
public static void setQuestPartyFinished(Quest quest, EntityPlayer player, QuestData questData ){
|
2024-03-07 22:27:34 -05:00
|
|
|
PlayerData playerdata = PlayerData.get(player);
|
2024-03-02 21:06:42 -05:00
|
|
|
PlayerQuestData data = playerdata.questData;
|
|
|
|
|
data.activeQuests.remove(quest.id);
|
|
|
|
|
if(quest.repeat == EnumQuestRepeat.RLDAILY || quest.repeat == EnumQuestRepeat.RLWEEKLY)
|
|
|
|
|
data.finishedQuests.put(quest.id, System.currentTimeMillis());
|
|
|
|
|
else
|
|
|
|
|
data.finishedQuests.put(quest.id,player.worldObj.getTotalWorldTime());
|
|
|
|
|
|
|
|
|
|
if(quest.repeat != EnumQuestRepeat.NONE && quest.type == EnumQuestType.Dialog){
|
|
|
|
|
QuestDialog questdialog = (QuestDialog) quest.questInterface;
|
|
|
|
|
for(int dialog : questdialog.dialogs.values()){
|
|
|
|
|
playerdata.dialogData.dialogsRead.remove(dialog);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (questData != null && questData.sendAlerts) {
|
2025-01-30 13:54:49 -05:00
|
|
|
AchievementPacket.sendAchievement((EntityPlayerMP) player, false, "quest.completed", questData.quest.title);
|
|
|
|
|
ChatAlertPacket.sendChatAlert((EntityPlayerMP) player, "quest.completed", ": ", questData.quest.title);
|
2024-03-02 21:06:42 -05:00
|
|
|
}
|
2024-03-07 22:22:39 -05:00
|
|
|
playerdata.updateClient = true;
|
2024-03-02 21:06:42 -05:00
|
|
|
}
|
|
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
public static boolean canQuestBeAccepted(Quest quest, EntityPlayer player){
|
|
|
|
|
if(quest == null)
|
|
|
|
|
return false;
|
|
|
|
|
|
2024-03-29 04:41:15 -04:00
|
|
|
PlayerData playerData = PlayerData.get(player);
|
|
|
|
|
if(playerData == null)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
PlayerQuestData data = playerData.questData;
|
2018-09-13 12:03:28 -04:00
|
|
|
if(data.activeQuests.containsKey(quest.id))
|
|
|
|
|
return false;
|
2024-03-02 21:06:42 -05:00
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
if(!data.finishedQuests.containsKey(quest.id) || quest.repeat == EnumQuestRepeat.REPEATABLE)
|
|
|
|
|
return true;
|
|
|
|
|
if(quest.repeat == EnumQuestRepeat.NONE)
|
|
|
|
|
return false;
|
2024-03-02 21:06:42 -05:00
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
long questTime = data.finishedQuests.get(quest.id);
|
2024-03-02 21:06:42 -05:00
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
if(quest.repeat == EnumQuestRepeat.MCDAILY){
|
|
|
|
|
return player.worldObj.getTotalWorldTime() - questTime >= 24000;
|
|
|
|
|
}
|
|
|
|
|
else if(quest.repeat == EnumQuestRepeat.MCWEEKLY){
|
|
|
|
|
return player.worldObj.getTotalWorldTime() - questTime >= 168000;
|
|
|
|
|
}
|
|
|
|
|
else if(quest.repeat == EnumQuestRepeat.RLDAILY){
|
|
|
|
|
return System.currentTimeMillis() - questTime >= 86400000;
|
|
|
|
|
}
|
|
|
|
|
else if(quest.repeat == EnumQuestRepeat.RLWEEKLY){
|
|
|
|
|
return System.currentTimeMillis() - questTime >= 604800000;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
public static Vector<Quest> getActiveQuests(EntityPlayer player)
|
|
|
|
|
{
|
|
|
|
|
Vector<Quest> quests = new Vector<Quest>();
|
2024-03-07 22:27:34 -05:00
|
|
|
PlayerQuestData data = PlayerData.get(player).questData;
|
2018-09-13 12:03:28 -04:00
|
|
|
for(QuestData questdata: data.activeQuests.values()){
|
|
|
|
|
if(questdata.quest == null)
|
|
|
|
|
continue;
|
|
|
|
|
quests.add(questdata.quest);
|
|
|
|
|
}
|
|
|
|
|
return quests;
|
|
|
|
|
}
|
|
|
|
|
}
|