Quests/src/main/java/me/blackvein/quests/Quest.java
2013-08-05 17:09:42 -07:00

374 lines
11 KiB
Java

package me.blackvein.quests;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import java.util.LinkedList;
import java.util.List;
import me.blackvein.quests.util.ItemUtil;
import net.citizensnpcs.api.npc.NPC;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
public class Quest {
public String name;
public String description;
public String finished;
public long redoDelay = -1;
public int parties = 0;
LinkedList<Stage> stages = new LinkedList<Stage>();
NPC npcStart;
Location blockStart;
Quests plugin;
Event initialEvent;
//Requirements
int moneyReq = 0;
int questPointsReq = 0;
List<ItemStack> items = new LinkedList<ItemStack>();
List<Boolean> removeItems = new LinkedList<Boolean>();
List<String> neededQuests = new LinkedList<String>();
List<String> blockQuests = new LinkedList<String>();
List<String> permissionReqs = new LinkedList<String>();
public String failRequirements = null;
//
//Rewards
int moneyReward = 0;
int questPoints = 0;
int exp = 0;
List<String> commands = new LinkedList<String>();
List<String> permissions = new LinkedList<String>();
LinkedList<ItemStack> itemRewards = new LinkedList<ItemStack>();
//mcMMO
List<String> mcmmoSkills = new LinkedList<String>();
List<Integer> mcmmoAmounts = new LinkedList<Integer>();
//
//
public void nextStage(Quester q){
String stageCompleteMessage = q.currentStage.completeMessage;
if (stageCompleteMessage != null) {
q.getPlayer().sendMessage(Quests.parseString(stageCompleteMessage, q.currentQuest));
}
if(q.currentStage.delay < 0){
Player player = q.getPlayer();
if(stages.indexOf(q.currentStage) == (stages.size() - 1)){
if(q.currentStage.script != null)
plugin.trigger.parseQuestTaskTrigger(q.currentStage.script, player);
if(q.currentStage.event != null)
q.currentStage.event.happen(q);
completeQuest(q);
}else {
q.reset();
if(q.currentStage.script != null)
plugin.trigger.parseQuestTaskTrigger(q.currentStage.script, player);
if(q.currentStage.event != null)
q.currentStage.event.happen(q);
q.currentStage = stages.get(stages.indexOf(q.currentStage) + 1);
q.addEmpties();
player.sendMessage(ChatColor.GOLD + "---(Objectives)---");
for(String s : q.getObjectives()){
player.sendMessage(s);
}
String stageStartMessage = q.currentStage.startMessage;
if (stageStartMessage != null) {
q.getPlayer().sendMessage(Quests.parseString(stageStartMessage, q.currentQuest));
}
}
q.delayStartTime = 0;
q.delayTimeLeft = -1;
}else{
q.startStageTimer();
}
}
public String getName(){
return name;
}
public boolean testRequirements(Quester quester){
return testRequirements(quester.getPlayer());
}
public boolean testRequirements(Player player){
Quester quester = plugin.getQuester(player.getName());
if(moneyReq != 0 && Quests.economy.getBalance(player.getName()) < moneyReq)
return false;
PlayerInventory inventory = player.getInventory();
int num = 0;
for(ItemStack is : items){
for(ItemStack stack : inventory.getContents()){
if(stack != null){
if(ItemUtil.compareItems(is, stack, true) == 0)
num += stack.getAmount();
}
}
if(num < is.getAmount())
return false;
num = 0;
}
for(String s : permissionReqs){
if(player.hasPermission(s) == false)
return false;
}
if(quester.questPoints < questPointsReq)
return false;
if(quester.completedQuests.containsAll(neededQuests) == false)
return false;
for (String q : blockQuests) {
if (quester.completedQuests.contains(q)) {
return false;
}
}
return true;
}
public void completeQuest(Quester q){
Player player = plugin.getServer().getPlayerExact(q.name);
q.reset();
q.completedQuests.add(name);
String none = ChatColor.GRAY + "- (None)";
player.sendMessage(Quests.parseString(finished, q.currentQuest));
if(moneyReward > 0 && Quests.economy != null){
Quests.economy.depositPlayer(q.name, moneyReward);
none = null;
}
if(redoDelay > -1)
q.completedTimes.put(this.name, System.currentTimeMillis());
for(ItemStack i : itemRewards){
Quests.addItem(player, i);
none = null;
}
for(String s : commands){
s = s.replaceAll("<player>", player.getName());
plugin.getServer().dispatchCommand(plugin.getServer().getConsoleSender(), s);
none = null;
}
for(String s : permissions){
Quests.permission.playerAdd(player, s);
none = null;
}
for(String s : mcmmoSkills){
new McMMOPlayer(player).getProfile().skillUp(Quests.getMcMMOSkill(s), mcmmoAmounts.get(mcmmoSkills.indexOf(s)));
none = null;
}
if(exp > 0){
player.giveExp(exp);
none = null;
}
player.sendMessage(ChatColor.GOLD + "**QUEST COMPLETE: " + ChatColor.YELLOW + q.currentQuest.name + ChatColor.GOLD + "**");
player.sendMessage(ChatColor.GREEN + "Rewards:");
if(questPoints > 0){
player.sendMessage("- " + ChatColor.DARK_GREEN + questPoints + " Quest Points");
q.questPoints += questPoints;
none = null;
}
for(ItemStack i : itemRewards){
if(i.hasItemMeta() && i.getItemMeta().hasDisplayName())
player.sendMessage("- " + ChatColor.DARK_AQUA + ChatColor.ITALIC + i.getItemMeta().getDisplayName() + ChatColor.RESET + ChatColor.GRAY + " x " + i.getAmount());
else if(i.getDurability() != 0)
player.sendMessage("- " + ChatColor.DARK_GREEN + Quester.prettyItemString(i.getTypeId()) + ":" + i.getDurability() + ChatColor.GRAY + " x " + i.getAmount());
else
player.sendMessage("- " + ChatColor.DARK_GREEN + Quester.prettyItemString(i.getTypeId()) + ChatColor.GRAY + " x " + i.getAmount());
none = null;
}
if(moneyReward > 1){
player.sendMessage("- " + ChatColor.DARK_GREEN + moneyReward + " " + ChatColor.DARK_PURPLE + Quests.getCurrency(true));
none = null;
}else if(moneyReward == 1){
player.sendMessage("- " + ChatColor.DARK_GREEN + moneyReward + " " + ChatColor.DARK_PURPLE + Quests.getCurrency(false));
none = null;
}
if(exp > 0){
player.sendMessage("- " + ChatColor.DARK_GREEN + exp + ChatColor.DARK_PURPLE + " Experience");
none = null;
}
if(none != null){
player.sendMessage(none);
}
q.currentQuest = null;
q.currentStage = null;
q.saveData();
player.updateInventory();
}
@Override
public boolean equals(Object o){
if(o instanceof Quest){
Quest other = (Quest) o;
if(other.blockStart != null && blockStart != null){
if(other.blockStart.equals(blockStart) == false)
return false;
}else if(other.blockStart != null && blockStart == null){
return false;
}else if(other.blockStart == null && blockStart != null)
return false;
for(String s : other.commands){
if(commands.size() >= (other.commands.indexOf(s))){
if(commands.get(other.commands.indexOf(s)).equals(s) == false)
return false;
}else{
return false;
}
}
if(other.description.equals(description) == false)
return false;
if(other.initialEvent != null && initialEvent != null){
if(other.initialEvent.equals(initialEvent) == false)
return false;
}else if(other.initialEvent != null && initialEvent == null){
return false;
}else if(other.initialEvent == null && initialEvent != null)
return false;
if(other.exp != exp)
return false;
if(other.failRequirements != null && failRequirements != null){
if(other.failRequirements.equals(failRequirements) == false)
return false;
}else if(other.failRequirements != null && failRequirements == null){
return false;
}else if(other.failRequirements == null && failRequirements != null)
return false;
if(other.finished.equals(finished) == false)
return false;
if(other.items.equals(items) == false)
return false;
if(other.itemRewards.equals(itemRewards) == false)
return false;
if(other.mcmmoAmounts.equals(mcmmoAmounts) == false)
return false;
if(other.mcmmoSkills.equals(mcmmoSkills) == false)
return false;
if(other.moneyReq != moneyReq)
return false;
if(other.moneyReward != moneyReward)
return false;
if(other.name.equals(name) == false)
return false;
if(other.neededQuests.equals(neededQuests) == false)
return false;
if (other.blockQuests.equals(blockQuests) == false)
return false;
if(other.npcStart != null && npcStart != null){
if(other.npcStart.equals(npcStart) == false)
return false;
}else if(other.npcStart != null && npcStart == null){
return false;
}else if(other.npcStart == null && npcStart != null)
return false;
if(other.permissionReqs.equals(permissionReqs) == false)
return false;
if(other.permissions.equals(permissions) == false)
return false;
if(other.questPoints != questPoints)
return false;
if(other.questPointsReq != questPointsReq)
return false;
if(other.redoDelay != redoDelay)
return false;
if(other.stages.equals(stages) == false)
return false;
}
return true;
}
}