package matteroverdrive.data.quest; import cpw.mods.fml.common.eventhandler.Event; import matteroverdrive.api.quest.IQuestLogic; import matteroverdrive.api.quest.IQuestReward; import matteroverdrive.api.quest.QuestStack; import matteroverdrive.data.quest.logic.AbstractQuestLogic; import matteroverdrive.entity.player.MOExtendedProperties; import matteroverdrive.util.MOStringHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MathHelper; import java.util.List; import java.util.Random; /** * Created by Simeon on 1/5/2016. */ public class GenericMultiQuest extends GenericQuest { protected IQuestLogic[] logics; boolean sequential; boolean autoComplete; public GenericMultiQuest(IQuestLogic[] questLogics, String title, int xpReward) { super(null, title, xpReward); this.logics = questLogics; for (int i = 0;i < logics.length;i++) { if (logics[i] instanceof AbstractQuestLogic) { ((AbstractQuestLogic) logics[i]).setAutoComplete(true); ((AbstractQuestLogic) logics[i]).setId(Integer.toString(i)); } } } @Override public boolean canBeAccepted(QuestStack questStack, EntityPlayer entityPlayer) { MOExtendedProperties extendedProperties = MOExtendedProperties.get(entityPlayer); if (extendedProperties != null) { for (IQuestLogic logic : logics) { if (!logic.canAccept(questStack,entityPlayer)) { return false; } } } return !extendedProperties.hasCompletedQuest(questStack) && !extendedProperties.hasQuest(questStack); } @Override public String getTitle(QuestStack questStack) { String t = MOStringHelper.translateToLocal("quest." + title + ".title"); if (sequential) { t = logics[getCurrentObjective(questStack)].modifyTitle(questStack,t); } return t; } @Override public String getTitle(QuestStack questStack,EntityPlayer entityPlayer) { String t = replaceVariables(MOStringHelper.translateToLocal("quest." + title + ".title"),entityPlayer); if (sequential) { t = logics[getCurrentObjective(questStack)].modifyTitle(questStack,t); } return t; } @Override public String getInfo(QuestStack questStack, EntityPlayer entityPlayer) { if (sequential) { String i; if(MOStringHelper.hasTranslation("quest." + title + ".info."+getCurrentObjective(questStack))) { i = replaceVariables(MOStringHelper.translateToLocal("quest." + title + ".info."+getCurrentObjective(questStack)),entityPlayer); }else { i = replaceVariables(MOStringHelper.translateToLocal("quest." + title + ".info"),entityPlayer); } i = logics[getCurrentObjective(questStack)].modifyInfo(questStack,i); return i; } return replaceVariables(MOStringHelper.translateToLocal("quest." + title + ".info"),entityPlayer); } @Override public String getObjective(QuestStack questStack, EntityPlayer entityPlayer, int objectiveIndex) { return logics[objectiveIndex].modifyObjective(questStack,entityPlayer,replaceVariables(MOStringHelper.translateToLocal("quest." + title + ".objective."+objectiveIndex),entityPlayer),objectiveIndex); } @Override public int getObjectivesCount(QuestStack questStack, EntityPlayer entityPlayer) { if (sequential) { return getCurrentObjective(questStack)+1; }else { return logics.length; } } @Override public boolean isObjectiveCompleted(QuestStack questStack, EntityPlayer entityPlayer, int objectiveIndex) { return logics[objectiveIndex].isObjectiveCompleted(questStack,entityPlayer,0); } @Override public boolean areQuestStacksEqual(QuestStack questStackOne, QuestStack questStackTwo) { if (questStackOne.getQuest() instanceof GenericMultiQuest && questStackTwo.getQuest() instanceof GenericMultiQuest) { return questStackOne.getQuest() == questStackTwo.getQuest(); } return false; } @Override public void initQuestStack(Random random, QuestStack questStack) { for (IQuestLogic logic : logics) { logic.initQuestStack(random,questStack); } } @Override public boolean onEvent(QuestStack questStack, Event event, EntityPlayer entityPlayer) { boolean hasChangedFlag = false; for (int i = 0;i < logics.length;i++) { if (sequential) { if (i <= getCurrentObjective(questStack)) { hasChangedFlag |= logics[i].onEvent(questStack,event,entityPlayer); } }else { if (logics[i].onEvent(questStack,event,entityPlayer)) { hasChangedFlag = true; } } } return hasChangedFlag; } @Override public void onCompleted(QuestStack questStack, EntityPlayer entityPlayer) { for (IQuestLogic logic : logics) { logic.onCompleted(questStack,entityPlayer); } } @Override public int getXpReward(QuestStack questStack, EntityPlayer entityPlayer) { int xp = xpReward; for (IQuestLogic logic : logics) { xp = logic.modifyXP(questStack,entityPlayer,xp); } return xp; } @Override public void addToRewards(QuestStack questStack, EntityPlayer entityPlayer, List<IQuestReward> rewards) { rewards.addAll(questRewards); for (IQuestLogic logic : logics) { logic.modifyRewards(questStack,entityPlayer,rewards); } } public GenericMultiQuest setSequential(boolean sequential) { this.sequential = sequential; return this; } @Override public void setCompleted(QuestStack questStack,EntityPlayer entityPlayer) { for (int i = 0;i < logics.length;i++) { if (!logics[i].isObjectiveCompleted(questStack,entityPlayer,0)) { return; }else if (sequential && i >= getCurrentObjective(questStack) && i < logics.length) { setCurrentObjective(questStack,i+1); } } if (autoComplete) { super.setCompleted(questStack, entityPlayer); } } public int getCurrentObjective(QuestStack questStack) { if (questStack.getTagCompound() != null) { return MathHelper.clamp_int(questStack.getTagCompound().getByte("CurrentObjective"),0,logics.length-1); }return 0; } public void setCurrentObjective(QuestStack questStack,int objective) { if (questStack.getTagCompound() == null) questStack.setTagCompound(new NBTTagCompound()); questStack.getTagCompound().setByte("CurrentObjective",(byte) MathHelper.clamp_int(objective,0,logics.length-1)); } public GenericMultiQuest setAutoComplete(boolean autoComplete) { this.autoComplete = autoComplete; return this; } }