Files
CustomNPC-Plus/src/main/java/noppes/npcs/controllers/data/Quest.java
T

384 lines
13 KiB
Java
Raw Normal View History

package noppes.npcs.controllers.data;
2018-09-13 12:03:28 -04:00
import kamkeel.npcs.controllers.ProfileController;
import kamkeel.npcs.controllers.data.ISlot;
import kamkeel.npcs.controllers.data.Profile;
import kamkeel.npcs.controllers.data.Slot;
import kamkeel.npcs.network.packets.data.QuestCompletionPacket;
2018-09-13 12:03:28 -04:00
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
import noppes.npcs.*;
2023-01-12 21:33:06 -05:00
import noppes.npcs.api.IContainer;
import noppes.npcs.api.entity.IPlayer;
import noppes.npcs.api.handler.IPlayerData;
import noppes.npcs.api.handler.IPlayerQuestData;
import noppes.npcs.api.handler.data.*;
import noppes.npcs.config.ConfigMain;
2025-02-21 16:42:09 -05:00
import noppes.npcs.constants.EnumProfileSync;
2024-02-15 17:54:28 -05:00
import noppes.npcs.constants.EnumQuestCompletion;
import noppes.npcs.constants.EnumQuestRepeat;
import noppes.npcs.constants.EnumQuestType;
2022-12-20 09:21:39 -06:00
import noppes.npcs.controllers.PlayerDataController;
import noppes.npcs.controllers.QuestController;
2025-02-20 21:40:39 -05:00
import noppes.npcs.quests.*;
2022-01-10 15:21:48 -06:00
import noppes.npcs.scripted.CustomNPCsException;
import noppes.npcs.scripted.NpcAPI;
2018-09-13 12:03:28 -04:00
2022-01-10 15:21:48 -06:00
public class Quest implements ICompatibilty, IQuest {
2018-09-13 12:03:28 -04:00
public int version = VersionCompatibility.ModRev;
public int id = -1;
public EnumQuestType type = EnumQuestType.Item;
public EnumQuestRepeat repeat = EnumQuestRepeat.NONE;
public EnumQuestCompletion completion = EnumQuestCompletion.Npc;
public String title = "default";
public QuestCategory category;
public String logText = "";
public String completeText = "";
public String completerNpc = "";
public int nextQuestid = -1;
public String nextQuestTitle = "";
public PlayerMail mail = new PlayerMail();
public String command = "";
2024-02-15 17:54:28 -05:00
2018-09-13 12:03:28 -04:00
public QuestInterface questInterface = new QuestItem();
public long customCooldown = 0;
2018-09-13 12:03:28 -04:00
public int rewardExp = 0;
public NpcMiscInventory rewardItems = new NpcMiscInventory(9);
public boolean randomReward = false;
public FactionOptions factionOptions = new FactionOptions();
public PartyOptions partyOptions = new PartyOptions();
2025-02-21 06:19:24 -05:00
public ProfileOptions profileOptions = new ProfileOptions();
2018-09-13 12:03:28 -04:00
public void readNBT(NBTTagCompound compound) {
id = compound.getInteger("Id");
readNBTPartial(compound);
}
public void readNBTPartial(NBTTagCompound compound) {
version = compound.getInteger("ModRev");
VersionCompatibility.CheckAvailabilityCompatibility(this, compound);
2024-02-15 17:54:28 -05:00
2018-09-13 12:03:28 -04:00
setType(EnumQuestType.values()[compound.getInteger("Type")]);
title = compound.getString("Title");
logText = compound.getString("Text");
completeText = compound.getString("CompleteText");
completerNpc = compound.getString("CompleterNpc");
command = compound.getString("QuestCommand");
nextQuestid = compound.getInteger("NextQuestId");
nextQuestTitle = compound.getString("NextQuestTitle");
if(hasNewQuest())
nextQuestTitle = getNextQuest().title;
else
nextQuestTitle = "";
randomReward = compound.getBoolean("RandomReward");
rewardExp = compound.getInteger("RewardExp");
rewardItems.setFromNBT(compound.getCompoundTag("Rewards"));
2024-02-15 17:54:28 -05:00
2018-09-13 12:03:28 -04:00
completion = EnumQuestCompletion.values()[compound.getInteger("QuestCompletion")];
repeat = EnumQuestRepeat.values()[compound.getInteger("QuestRepeat")];
customCooldown = compound.getLong("CustomCooldown");
2018-09-13 12:03:28 -04:00
questInterface.readEntityFromNBT(compound);
2024-02-15 17:54:28 -05:00
2018-09-13 12:03:28 -04:00
factionOptions.readFromNBT(compound.getCompoundTag("QuestFactionPoints"));
partyOptions.readFromNBT(compound.getCompoundTag("PartyOptions"));
2025-02-21 06:19:24 -05:00
profileOptions.readFromNBT(compound.getCompoundTag("ProfileOptions"));
2024-02-15 17:54:28 -05:00
2018-09-13 12:03:28 -04:00
mail.readNBT(compound.getCompoundTag("QuestMail"));
}
public void setType(EnumQuestType questType) {
type = questType;
if(type == EnumQuestType.Item)
questInterface = new QuestItem();
else if(type == EnumQuestType.Dialog)
questInterface = new QuestDialog();
else if(type == EnumQuestType.Kill || type == EnumQuestType.AreaKill)
questInterface = new QuestKill();
else if(type == EnumQuestType.Location)
questInterface = new QuestLocation();
2024-03-19 05:09:11 -04:00
else if(type == EnumQuestType.Manual)
questInterface = new QuestManual();
2024-02-15 17:54:28 -05:00
2018-09-13 12:03:28 -04:00
if(questInterface != null)
questInterface.questId = id;
}
public NBTTagCompound writeToNBT(NBTTagCompound compound) {
compound.setInteger("Id", id);
return writeToNBTPartial(compound);
}
public NBTTagCompound writeToNBTPartial(NBTTagCompound compound) {
compound.setInteger("ModRev", version);
compound.setInteger("Type", type.ordinal());
compound.setString("Title", title);
compound.setString("Text", logText);
compound.setString("CompleteText", completeText);
compound.setString("CompleterNpc", completerNpc);
compound.setInteger("NextQuestId", nextQuestid);
compound.setString("NextQuestTitle", nextQuestTitle);
compound.setInteger("RewardExp", rewardExp);
compound.setTag("Rewards", rewardItems.getToNBT());
compound.setString("QuestCommand", command);
compound.setBoolean("RandomReward", randomReward);
compound.setLong("CustomCooldown", customCooldown);
2018-09-13 12:03:28 -04:00
compound.setInteger("QuestCompletion", completion.ordinal());
compound.setInteger("QuestRepeat", repeat.ordinal());
2024-02-15 17:54:28 -05:00
2018-09-13 12:03:28 -04:00
this.questInterface.writeEntityToNBT(compound);
compound.setTag("QuestFactionPoints", factionOptions.writeToNBT(new NBTTagCompound()));
compound.setTag("PartyOptions", partyOptions.writeToNBT());
2025-02-21 06:19:24 -05:00
compound.setTag("ProfileOptions", profileOptions.writeToNBT());
2018-09-13 12:03:28 -04:00
compound.setTag("QuestMail", mail.writeNBT());
2018-09-13 12:03:28 -04:00
return compound;
}
2024-02-15 17:54:28 -05:00
2018-09-13 12:03:28 -04:00
public boolean hasNewQuest()
{
return getNextQuest() != null;
}
public Quest getNextQuest()
{
2023-06-05 22:12:48 -04:00
return QuestController.Instance == null?null:QuestController.Instance.quests.get(nextQuestid);
2018-09-13 12:03:28 -04:00
}
public boolean instantComplete(EntityPlayer player, QuestData data) {
if(completion == EnumQuestCompletion.Instant && NoppesUtilPlayer.questCompletion((EntityPlayerMP) player, data.quest.id)){
QuestCompletionPacket.sendQuestComplete((EntityPlayerMP)player, data.quest.writeToNBT(new NBTTagCompound()));
2018-09-13 12:03:28 -04:00
return true;
}
return false;
}
public boolean instantPartyComplete(Party party) {
2024-03-03 00:14:19 -05:00
return completion == EnumQuestCompletion.Instant && NoppesUtilPlayer.questPartyCompletion(party);
}
2018-09-13 12:03:28 -04:00
public Quest copy(){
Quest quest = new Quest();
quest.readNBT(this.writeToNBT(new NBTTagCompound()));
return quest;
}
2022-12-20 09:21:39 -06:00
public long getTimeUntilRepeat(EntityPlayer player) {
2025-02-21 16:42:09 -05:00
if(ConfigMain.ProfilesEnabled && profileOptions.enableOptions && profileOptions.cooldownControl == EnumProfileSync.Shared){
Profile profile = ProfileController.Instance.getProfile(player);
IPlayer iPlayer = NoppesUtilServer.getIPlayer(player);
long timeRemaining = 0L;
for(ISlot slot : profile.getSlots().values()){
IPlayerData playerData = ProfileController.Instance.getSlotPlayerData(iPlayer, slot.getId());
IPlayerQuestData iPlayerQuestData = playerData.getQuestData();
timeRemaining = Math.max(timeRemaining, getTimeUntilRepeatQuestData(player, iPlayerQuestData));
}
return timeRemaining;
}
IPlayerQuestData questData = PlayerDataController.Instance.getPlayerData(player).getQuestData();
return getTimeUntilRepeatQuestData(player, questData);
}
2022-12-20 09:21:39 -06:00
public long getTimeUntilRepeatQuestData(EntityPlayer player, IPlayerQuestData questData){
long questTime = questData.getLastCompletedTime(this.id);
switch (repeat) {
case MCDAILY: {
long now = player.worldObj.getTotalWorldTime();
long allowedTicks = 24000;
// If questTime is in the future and the excess is greater than allowed, reset it.
if (questTime > now && (questTime - now) > allowedTicks) {
questTime = now;
questData.setLastCompletedTime(this.id, questTime);
}
long remainingTicks = questTime + allowedTicks - now;
return Math.max(0, remainingTicks * 50);
}
case MCWEEKLY: {
long now = player.worldObj.getTotalWorldTime();
long allowedTicks = 168000;
if (questTime > now && (questTime - now) > allowedTicks) {
questTime = now;
questData.setLastCompletedTime(this.id, questTime);
}
long remainingTicks = questTime + allowedTicks - now;
return Math.max(0, remainingTicks * 50);
}
case RLDAILY: {
long now = System.currentTimeMillis();
long allowedMillis = 86400000;
if (questTime > now && (questTime - now) > allowedMillis) {
questTime = now;
questData.setLastCompletedTime(this.id, questTime);
}
long remainingMillis = questTime + allowedMillis - now;
return Math.max(0, remainingMillis);
}
case RLWEEKLY: {
long now = System.currentTimeMillis();
long allowedMillis = 604800000;
if (questTime > now && (questTime - now) > allowedMillis) {
questTime = now;
questData.setLastCompletedTime(this.id, questTime);
}
long remainingMillis = questTime + allowedMillis - now;
return Math.max(0, remainingMillis);
}
case MCCUSTOM: {
// For MCCUSTOM, customCooldown is assumed to be defined in ticks.
long now = player.worldObj.getTotalWorldTime();
long allowedTicks = this.customCooldown;
if (questTime > now && (questTime - now) > allowedTicks) {
questTime = now;
questData.setLastCompletedTime(this.id, questTime);
}
long remainingTicks = questTime + allowedTicks - now;
return Math.max(0, remainingTicks * 50);
}
case RLCUSTOM: {
// For RLCUSTOM, customCooldown is assumed to be in milliseconds.
long now = System.currentTimeMillis();
long allowedMillis = this.customCooldown;
if (questTime > now && (questTime - now) > allowedMillis) {
questTime = now;
questData.setLastCompletedTime(this.id, questTime);
}
long remainingMillis = questTime + allowedMillis - now;
return Math.max(0, remainingMillis);
}
default:
return 0L;
}
}
2024-02-15 17:54:28 -05:00
@Override
2018-09-13 12:03:28 -04:00
public int getVersion() {
return version;
}
@Override
public void setVersion(int version) {
this.version = version;
}
2022-01-10 15:21:48 -06:00
public int getId() {
return this.id;
}
public String getName() {
return this.title;
}
public int getType() {
return this.type.ordinal();
}
public void setType(int questType) {
if(questType < 0 || questType >= EnumQuestType.values().length)
return;
EnumQuestType type = EnumQuestType.values()[questType];
setType(type);
}
public IQuestCategory getCategory() {
return this.category;
}
public void save() {
2023-06-05 22:12:48 -04:00
QuestController.Instance.saveQuest(this.category.id, this);
2022-01-10 15:21:48 -06:00
}
public void setName(String name) {
this.title = name;
}
public String getLogText() {
return this.logText;
}
public void setLogText(String text) {
this.logText = text;
}
public String getCompleteText() {
return this.completeText;
}
public void setCompleteText(String text) {
this.completeText = text;
}
public void setNextQuest(IQuest quest) {
if (quest == null) {
this.nextQuestid = -1;
this.nextQuestTitle = "";
} else {
if (quest.getId() < 0) {
throw new CustomNPCsException("Quest id is lower than 0", new Object[0]);
}
this.nextQuestid = quest.getId();
this.nextQuestTitle = quest.getName();
}
}
public String getNpcName() {
return this.completerNpc;
}
public void setNpcName(String name) {
this.completerNpc = name;
}
public IQuestObjective[] getObjectives(IPlayer player) {
if (!player.hasActiveQuest(this.id)) {
throw new CustomNPCsException("Player doesnt have this quest active.", new Object[0]);
} else {
return this.questInterface.getObjectives((EntityPlayer) player.getMCEntity());
}
}
public boolean getIsRepeatable() {
return this.repeat != EnumQuestRepeat.NONE;
}
2022-12-20 09:21:39 -06:00
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();
}
2022-01-10 15:21:48 -06:00
public IContainer getRewards() {
return NpcAPI.Instance().getIContainer(this.rewardItems);
}
public IQuestInterface getQuestInterface(){
return this.questInterface;
}
2023-10-30 21:06:01 -04:00
public IPartyOptions getPartyOptions() {
return this.partyOptions;
}
2025-02-21 06:19:24 -05:00
public IProfileOptions getProfileOptions() {
return this.profileOptions;
}
public long getCustomCooldown() {
return this.customCooldown;
}
public void setCustomCooldown(long newCooldown) {
this.customCooldown = newCooldown;
}
2018-09-13 12:03:28 -04:00
}