Add objective update API events, part 3. Fixes #1501

This commit is contained in:
PikaMug 2020-12-17 04:47:38 -05:00
parent c4aa648448
commit 557bcfd6d6
10 changed files with 765 additions and 629 deletions

View File

@ -177,28 +177,30 @@ public abstract class CustomObjective implements Listener {
}
}
if (index > -1) {
final int progress = quester.getQuestData(quest).customObjectiveCounts.get(obj.getName());
final int goal = quester.getCurrentStage(quest).customObjectiveCounts.get(index);
final ObjectiveType type = ObjectiveType.CUSTOM;
final QuesterPreUpdateObjectiveEvent preEvent
= new QuesterPreUpdateObjectiveEvent(quester, quest, type);
= new QuesterPreUpdateObjectiveEvent(quester, quest, new Objective(type, progress, goal));
plugin.getServer().getPluginManager().callEvent(preEvent);
final int goal = quester.getCurrentStage(quest).customObjectiveCounts.get(index);
if (quester.getQuestData(quest).customObjectiveCounts.get(obj.getName()) >= goal) {
quester.finishObjective(quest, type, new ItemStack(Material.AIR, 1),
new ItemStack(Material.AIR, goal), null, null, null, null, null, null, null, obj);
if (progress >= goal) {
quester.finishObjective(quest, new Objective(type, new ItemStack(Material.AIR, 1),
new ItemStack(Material.AIR, goal)), null, null, null, null, null, null, null, obj);
// Multiplayer
quester.dispatchMultiplayerObjectives(quest, quester.getCurrentStage(quest), (final Quester q) -> {
q.getQuestData(quest).customObjectiveCounts.put(obj.getName(),
quester.getQuestData(quest).customObjectiveCounts.get(obj.getName()));
q.finishObjective(quest, type, new ItemStack(Material.AIR, 1),
new ItemStack(Material.AIR, goal), null, null, null, null, null, null, null, obj);
q.finishObjective(quest, new Objective(type, new ItemStack(Material.AIR, 1),
new ItemStack(Material.AIR, goal)), null, null, null, null, null, null, null, obj);
return null;
});
}
final QuesterPostUpdateObjectiveEvent postEvent
= new QuesterPostUpdateObjectiveEvent(quester, quest, type);
= new QuesterPostUpdateObjectiveEvent(quester, quest, new Objective(type, progress, goal));
plugin.getServer().getPluginManager().callEvent(postEvent);
}
}

View File

@ -0,0 +1,50 @@
package me.blackvein.quests;
import org.bukkit.inventory.ItemStack;
import me.blackvein.quests.enums.ObjectiveType;
public class Objective {
private final ObjectiveType type;
private final int progress;
private final int goal;
private final ItemStack progressStack;
private final ItemStack goalStack;
public Objective(final ObjectiveType type, final int progress, final int goal) {
this.type = type;
this.progress = progress;
this.goal = goal;
this.progressStack = null;
this.goalStack = null;
}
public Objective(final ObjectiveType type, final ItemStack progress, final ItemStack goal) {
this.type = type;
this.progress = progress.getAmount();
this.goal = goal.getAmount();
this.progressStack = progress;
this.goalStack = goal;
}
public ObjectiveType getType() {
return type;
}
public int getProgress() {
return progress;
}
public int getGoal() {
return goal;
}
public ItemStack getItemProgress() {
return progressStack;
}
public ItemStack getItemGoal() {
return goalStack;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -26,6 +26,7 @@ import org.bukkit.inventory.ItemStack;
import me.blackvein.quests.actions.Action;
import me.blackvein.quests.conditions.Condition;
import me.blackvein.quests.enums.ObjectiveType;
public class Stage {
@ -554,59 +555,72 @@ public class Stage {
}
/**
* Check if stage has the specified objective<p>
* Check if stage has the specified type of objective<p>
*
* Accepted strings are: breakBlock, damageBlock, placeBlock, useBlock,
* cutBlock, craftItem, smeltItem, enchantItem, brewItem, milkCow, catchFish,
* killMob, deliverItem, killPlayer, talkToNPC, killNPC, tameMob,
* shearSheep, password, reachLocation
*
* @deprecated Use {@link #containsObjective(ObjectiveType)}
*
* @param type The type of objective to check for
* @return true if stage contains specified objective
*/
@Deprecated
public boolean containsObjective(final String type) {
if (type.equalsIgnoreCase("breakBlock")) {
return containsObjective(ObjectiveType.fromName(type));
}
/**
* Check if stage has the specified type of objective<p>
*
* @param type The type of objective to check for
* @return true if stage contains specified objective
*/
public boolean containsObjective(final ObjectiveType type) {
if (type.equals(ObjectiveType.BREAK_BLOCK)) {
return !blocksToBreak.isEmpty();
} else if (type.equalsIgnoreCase("damageBlock")) {
} else if (type.equals(ObjectiveType.DAMAGE_BLOCK)) {
return !blocksToDamage.isEmpty();
} else if (type.equalsIgnoreCase("placeBlock")) {
} else if (type.equals(ObjectiveType.PLACE_BLOCK)) {
return !blocksToPlace.isEmpty();
} else if (type.equalsIgnoreCase("useBlock")) {
} else if (type.equals(ObjectiveType.USE_BLOCK)) {
return !blocksToUse.isEmpty();
} else if (type.equalsIgnoreCase("cutBlock")) {
} else if (type.equals(ObjectiveType.CUT_BLOCK)) {
return !blocksToCut.isEmpty();
} else if (type.equalsIgnoreCase("craftItem")) {
} else if (type.equals(ObjectiveType.CRAFT_ITEM)) {
return !itemsToCraft.isEmpty();
} else if (type.equalsIgnoreCase("smeltItem")) {
} else if (type.equals(ObjectiveType.SMELT_ITEM)) {
return !itemsToSmelt.isEmpty();
} else if (type.equalsIgnoreCase("enchantItem")) {
} else if (type.equals(ObjectiveType.ENCHANT_ITEM)) {
return !itemsToEnchant.isEmpty();
} else if (type.equalsIgnoreCase("brewItem")) {
} else if (type.equals(ObjectiveType.BREW_ITEM)) {
return !itemsToBrew.isEmpty();
} else if (type.equalsIgnoreCase("consumeItem")) {
} else if (type.equals(ObjectiveType.CONSUME_ITEM)) {
return !itemsToConsume.isEmpty();
} else if (type.equalsIgnoreCase("milkCow")) {
return cowsToMilk != null;
} else if (type.equalsIgnoreCase("catchFish")) {
return fishToCatch != null;
} else if (type.equalsIgnoreCase("killMob")) {
return !mobsToKill.isEmpty();
} else if (type.equalsIgnoreCase("deliverItem")) {
} else if (type.equals(ObjectiveType.DELIVER_ITEM)) {
return !itemsToDeliver.isEmpty();
} else if (type.equalsIgnoreCase("killPlayer")) {
} else if (type.equals(ObjectiveType.MILK_COW)) {
return cowsToMilk != null;
} else if (type.equals(ObjectiveType.CATCH_FISH)) {
return fishToCatch != null;
} else if (type.equals(ObjectiveType.KILL_MOB)) {
return !mobsToKill.isEmpty();
} else if (type.equals(ObjectiveType.KILL_PLAYER)) {
return playersToKill != null;
} else if (type.equalsIgnoreCase("talkToNPC")) {
} else if (type.equals(ObjectiveType.TALK_TO_NPC)) {
return !citizensToInteract.isEmpty();
} else if (type.equalsIgnoreCase("killNPC")) {
} else if (type.equals(ObjectiveType.KILL_NPC)) {
return !citizensToKill.isEmpty();
} else if (type.equalsIgnoreCase("tameMob")) {
} else if (type.equals(ObjectiveType.TAME_MOB)) {
return !mobsToTame.isEmpty();
} else if (type.equalsIgnoreCase("shearSheep")) {
} else if (type.equals(ObjectiveType.SHEAR_SHEEP)) {
return !sheepToShear.isEmpty();
} else if (type.equalsIgnoreCase("password")) {
return !passwordPhrases.isEmpty();
} else if (type.equalsIgnoreCase("reachLocation")) {
} else if (type.equals(ObjectiveType.REACH_LOCATION)) {
return !locationsToReach.isEmpty();
} else if (type.equals(ObjectiveType.PASSWORD)) {
return !passwordPhrases.isEmpty();
} else {
return false;
}

View File

@ -15,9 +15,9 @@ package me.blackvein.quests.events.quester;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import me.blackvein.quests.Objective;
import me.blackvein.quests.Quest;
import me.blackvein.quests.Quester;
import me.blackvein.quests.enums.ObjectiveType;
/**
* Called after a quester progresses an objective
@ -25,13 +25,13 @@ import me.blackvein.quests.enums.ObjectiveType;
public class QuesterPostUpdateObjectiveEvent extends QuesterEvent implements Cancellable {
private static final HandlerList HANDLERS = new HandlerList();
private final Quest quest;
private final ObjectiveType type;
private final Objective objective;
private boolean cancel = false;
public QuesterPostUpdateObjectiveEvent(final Quester quester, final Quest quest, final ObjectiveType type) {
public QuesterPostUpdateObjectiveEvent(final Quester quester, final Quest quest, final Objective objective) {
super(quester);
this.quest = quest;
this.type = type;
this.objective = objective;
}
/**
@ -44,12 +44,12 @@ public class QuesterPostUpdateObjectiveEvent extends QuesterEvent implements Can
}
/**
* Returns the type of objective involved in this event
* Returns the objective involved in this event
*
* @return Type which is involved in this event
* @return Objective which is involved in this event
*/
public ObjectiveType getObjectiveType() {
return type;
public Objective getObjective() {
return objective;
}
@Override

View File

@ -15,9 +15,9 @@ package me.blackvein.quests.events.quester;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import me.blackvein.quests.Objective;
import me.blackvein.quests.Quest;
import me.blackvein.quests.Quester;
import me.blackvein.quests.enums.ObjectiveType;
/**
* Called before a quester progresses an objective
@ -25,13 +25,13 @@ import me.blackvein.quests.enums.ObjectiveType;
public class QuesterPreUpdateObjectiveEvent extends QuesterEvent implements Cancellable {
private static final HandlerList HANDLERS = new HandlerList();
private final Quest quest;
private final ObjectiveType type;
private final Objective objective;
private boolean cancel = false;
public QuesterPreUpdateObjectiveEvent(final Quester quester, final Quest quest, final ObjectiveType type) {
public QuesterPreUpdateObjectiveEvent(final Quester quester, final Quest quest, final Objective objective) {
super(quester);
this.quest = quest;
this.type = type;
this.objective = objective;
}
/**
@ -44,12 +44,12 @@ public class QuesterPreUpdateObjectiveEvent extends QuesterEvent implements Canc
}
/**
* Returns the type of objective involved in this event
* Returns the objective involved in this event
*
* @return Type which is involved in this event
* @return Objective which is involved in this event
*/
public ObjectiveType getObjectiveType() {
return type;
public Objective getObjective() {
return objective;
}
@Override

View File

@ -31,6 +31,7 @@ import org.bukkit.inventory.ItemStack;
import me.blackvein.quests.Quest;
import me.blackvein.quests.Quester;
import me.blackvein.quests.Quests;
import me.blackvein.quests.enums.ObjectiveType;
import me.blackvein.quests.util.Lang;
public class BlockListener implements Listener {
@ -49,13 +50,16 @@ public class BlockListener implements Listener {
final ItemStack blockItemStack = new ItemStack(evt.getBlock().getType(), 1, evt.getBlock().getState()
.getData().toItemStack().getDurability());
final Quester quester = plugin.getQuester(player.getUniqueId());
final ObjectiveType breakType = ObjectiveType.BREAK_BLOCK;
final ObjectiveType placeType = ObjectiveType.PLACE_BLOCK;
final ObjectiveType cutType = ObjectiveType.CUT_BLOCK;
for (final Quest quest : plugin.getQuests()) {
if (evt.isCancelled() == false) {
if (!quester.meetsCondition(quest, true)) {
return;
}
if (quester.getCurrentQuests().containsKey(quest)
&& quester.getCurrentStage(quest).containsObjective("breakBlock")) {
&& quester.getCurrentStage(quest).containsObjective(breakType)) {
if (quest.getOptions().canIgnoreSilkTouch()
&& player.getItemInHand().containsEnchantment(Enchantment.SILK_TOUCH)) {
player.sendMessage(ChatColor.RED + Lang.get(player, "optionSilkTouchFail")
@ -64,7 +68,7 @@ public class BlockListener implements Listener {
quester.breakBlock(quest, blockItemStack);
}
}
quester.dispatchMultiplayerEverything(quest, "breakBlock", (final Quester q) -> {
quester.dispatchMultiplayerEverything(quest, breakType, (final Quester q) -> {
if (quest.getOptions().canIgnoreSilkTouch()
&& player.getItemInHand().containsEnchantment(Enchantment.SILK_TOUCH)) {
player.sendMessage(ChatColor.RED + Lang.get(player, "optionSilkTouchFail")
@ -75,7 +79,7 @@ public class BlockListener implements Listener {
return null;
});
if (quester.getCurrentQuests().containsKey(quest)
&& quester.getCurrentStage(quest).containsObjective("placeBlock")) {
&& quester.getCurrentStage(quest).containsObjective(placeType)) {
for (final ItemStack is : quester.getQuestData(quest).blocksPlaced) {
if (evt.getBlock().getType().equals(is.getType()) && is.getAmount() > 0) {
final int index = quester.getQuestData(quest).blocksPlaced.indexOf(is);
@ -84,7 +88,7 @@ public class BlockListener implements Listener {
}
}
}
quester.dispatchMultiplayerEverything(quest, "placeBlock", (final Quester q) -> {
quester.dispatchMultiplayerEverything(quest, placeType, (final Quester q) -> {
for (final ItemStack is : q.getQuestData(quest).blocksPlaced) {
if (evt.getBlock().getType().equals(is.getType()) && is.getAmount() > 0) {
final int index = q.getQuestData(quest).blocksPlaced.indexOf(is);
@ -95,12 +99,12 @@ public class BlockListener implements Listener {
return null;
});
if (quester.getCurrentQuests().containsKey(quest)
&& quester.getCurrentStage(quest).containsObjective("cutBlock")) {
&& quester.getCurrentStage(quest).containsObjective(cutType)) {
if (player.getItemInHand().getType().equals(Material.SHEARS)) {
quester.cutBlock(quest, blockItemStack);
}
}
quester.dispatchMultiplayerEverything(quest, "cutBlock", (final Quester q) -> {
quester.dispatchMultiplayerEverything(quest, cutType, (final Quester q) -> {
if (player.getItemInHand().getType().equals(Material.SHEARS)) {
q.cutBlock(quest, blockItemStack);
}
@ -119,17 +123,18 @@ public class BlockListener implements Listener {
final ItemStack blockItemStack = new ItemStack(evt.getBlock().getType(), 1, evt.getBlock().getState()
.getData().toItemStack().getDurability());
final Quester quester = plugin.getQuester(player.getUniqueId());
final ObjectiveType type = ObjectiveType.DAMAGE_BLOCK;
for (final Quest quest : plugin.getQuests()) {
if (!quester.meetsCondition(quest, true)) {
return;
}
if (quester.getCurrentQuests().containsKey(quest)
&& quester.getCurrentStage(quest).containsObjective("damageBlock")) {
&& quester.getCurrentStage(quest).containsObjective(type)) {
quester.damageBlock(quest, blockItemStack);
}
quester.dispatchMultiplayerEverything(quest, "placeBlock", (final Quester q) -> {
quester.dispatchMultiplayerEverything(quest, type, (final Quester q) -> {
q.placeBlock(quest, blockItemStack);
return null;
});
@ -145,6 +150,7 @@ public class BlockListener implements Listener {
final ItemStack blockItemStack = new ItemStack(evt.getBlock().getType(), 1, evt.getBlock().getState()
.getData().toItemStack().getDurability());
final Quester quester = plugin.getQuester(player.getUniqueId());
final ObjectiveType type = ObjectiveType.PLACE_BLOCK;
for (final Quest quest : plugin.getQuests()) {
if (evt.isCancelled() == false) {
if (!quester.meetsCondition(quest, true)) {
@ -152,11 +158,11 @@ public class BlockListener implements Listener {
}
if (quester.getCurrentQuests().containsKey(quest)
&& quester.getCurrentStage(quest).containsObjective("placeBlock")) {
&& quester.getCurrentStage(quest).containsObjective(type)) {
quester.placeBlock(quest, blockItemStack);
}
quester.dispatchMultiplayerEverything(quest, "placeBlock", (final Quester q) -> {
quester.dispatchMultiplayerEverything(quest, type, (final Quester q) -> {
q.placeBlock(quest, blockItemStack);
return null;
});
@ -185,17 +191,18 @@ public class BlockListener implements Listener {
if (evt.isCancelled() == false) {
final ItemStack blockItemStack = new ItemStack(evt.getClickedBlock().getType(), 1, evt
.getClickedBlock().getState().getData().toItemStack().getDurability());
final ObjectiveType type = ObjectiveType.USE_BLOCK;
for (final Quest quest : plugin.getQuests()) {
if (!quester.meetsCondition(quest, true)) {
return;
}
if (quester.getCurrentQuests().containsKey(quest)
&& quester.getCurrentStage(quest).containsObjective("useBlock")) {
&& quester.getCurrentStage(quest).containsObjective(type)) {
quester.useBlock(quest, blockItemStack);
}
quester.dispatchMultiplayerEverything(quest, "useBlock", (final Quester q) -> {
quester.dispatchMultiplayerEverything(quest, type, (final Quester q) -> {
q.useBlock(quest, blockItemStack);
return null;
});

View File

@ -28,6 +28,7 @@ import org.bukkit.inventory.ItemStack;
import me.blackvein.quests.Quest;
import me.blackvein.quests.Quester;
import me.blackvein.quests.Quests;
import me.blackvein.quests.enums.ObjectiveType;
public class ItemListener implements Listener {
@ -44,17 +45,18 @@ public class ItemListener implements Listener {
if (plugin.canUseQuests(player.getUniqueId())) {
final ItemStack craftedItem = getCraftedItem(evt);
final Quester quester = plugin.getQuester(player.getUniqueId());
final ObjectiveType type = ObjectiveType.CRAFT_ITEM;
for (final Quest quest : plugin.getQuests()) {
if (!quester.meetsCondition(quest, true)) {
return;
}
if (quester.getCurrentQuests().containsKey(quest)
&& quester.getCurrentStage(quest).containsObjective("craftItem")) {
&& quester.getCurrentStage(quest).containsObjective(type)) {
quester.craftItem(quest, craftedItem);
}
quester.dispatchMultiplayerEverything(quest, "craftItem", (final Quester q) -> {
quester.dispatchMultiplayerEverything(quest, type, (final Quester q) -> {
q.craftItem(quest, craftedItem);
return null;
});
@ -88,17 +90,18 @@ public class ItemListener implements Listener {
|| evt.getInventory().getType().name().equals("SMOKER")) {
if (evt.getSlotType() == SlotType.RESULT) {
final Quester quester = plugin.getQuester(player.getUniqueId());
final ObjectiveType type = ObjectiveType.SMELT_ITEM;
for (final Quest quest : plugin.getQuests()) {
if (!quester.meetsCondition(quest, true)) {
return;
}
if (quester.getCurrentQuests().containsKey(quest)
&& quester.getCurrentStage(quest).containsObjective("smeltItem")) {
&& quester.getCurrentStage(quest).containsObjective(type)) {
quester.smeltItem(quest, evt.getCurrentItem());
}
quester.dispatchMultiplayerEverything(quest, "smeltItem", (final Quester q) -> {
quester.dispatchMultiplayerEverything(quest, type, (final Quester q) -> {
q.smeltItem(quest, evt.getCurrentItem());
return null;
});
@ -107,17 +110,18 @@ public class ItemListener implements Listener {
} else if (evt.getInventory().getType() == InventoryType.BREWING) {
if (evt.getSlotType() == SlotType.CRAFTING) {
final Quester quester = plugin.getQuester(player.getUniqueId());
final ObjectiveType type = ObjectiveType.BREW_ITEM;
for (final Quest quest : plugin.getQuests()) {
if (!quester.meetsCondition(quest, true)) {
return;
}
if (quester.getCurrentQuests().containsKey(quest)
&& quester.getCurrentStage(quest).containsObjective("brewItem")) {
&& quester.getCurrentStage(quest).containsObjective(type)) {
quester.brewItem(quest, evt.getCurrentItem());
}
quester.dispatchMultiplayerEverything(quest, "brewItem", (final Quester q) -> {
quester.dispatchMultiplayerEverything(quest, type, (final Quester q) -> {
q.brewItem(quest, evt.getCurrentItem());
return null;
});
@ -138,17 +142,18 @@ public class ItemListener implements Listener {
// Ignore
}
final Quester quester = plugin.getQuester(evt.getEnchanter().getUniqueId());
final ObjectiveType type = ObjectiveType.ENCHANT_ITEM;
for (final Quest quest : plugin.getQuests()) {
if (!quester.meetsCondition(quest, true)) {
return;
}
if (quester.getCurrentQuests().containsKey(quest)
&& quester.getCurrentStage(quest).containsObjective("enchantItem")) {
&& quester.getCurrentStage(quest).containsObjective(type)) {
quester.enchantItem(quest, enchantedItem);
}
quester.dispatchMultiplayerEverything(quest, "enchantItem", (final Quester q) -> {
quester.dispatchMultiplayerEverything(quest, type, (final Quester q) -> {
quester.enchantItem(quest, enchantedItem);
return null;
});
@ -163,17 +168,18 @@ public class ItemListener implements Listener {
final ItemStack consumedItem = evt.getItem().clone();
consumedItem.setAmount(1);
final Quester quester = plugin.getQuester(evt.getPlayer().getUniqueId());
final ObjectiveType type = ObjectiveType.CONSUME_ITEM;
for (final Quest quest : plugin.getQuests()) {
if (!quester.meetsCondition(quest, true)) {
return;
}
if (quester.getCurrentQuests().containsKey(quest)
&& quester.getCurrentStage(quest).containsObjective("consumeItem")) {
&& quester.getCurrentStage(quest).containsObjective(type)) {
quester.consumeItem(quest, consumedItem);
}
quester.dispatchMultiplayerEverything(quest, "consumeItem", (final Quester q) -> {
quester.dispatchMultiplayerEverything(quest, type, (final Quester q) -> {
quester.consumeItem(quest, consumedItem);
return null;
});

View File

@ -34,6 +34,7 @@ import org.bukkit.inventory.meta.EnchantmentStorageMeta;
import me.blackvein.quests.Quest;
import me.blackvein.quests.Quester;
import me.blackvein.quests.Quests;
import me.blackvein.quests.enums.ObjectiveType;
import me.blackvein.quests.util.ItemUtil;
import me.blackvein.quests.util.Lang;
import me.blackvein.quests.util.RomanNumeral;
@ -68,7 +69,8 @@ public class NpcListener implements Listener {
final Quester quester = plugin.getQuester(player.getUniqueId());
boolean delivery = false;
for (final Quest quest : quester.getCurrentQuests().keySet()) {
if (quester.getCurrentStage(quest).containsObjective("deliverItem") && player.getItemInHand() != null) {
if (quester.getCurrentStage(quest).containsObjective(ObjectiveType.DELIVER_ITEM)
&& player.getItemInHand() != null) {
final ItemStack hand = player.getItemInHand();
int currentIndex = -1;
final LinkedList<Integer> matches = new LinkedList<Integer>();
@ -191,7 +193,7 @@ public class NpcListener implements Listener {
if (plugin.getQuestNpcs().contains(evt.getNPC()) && delivery == false) {
boolean hasObjective = false;
for (final Quest quest : quester.getCurrentQuests().keySet()) {
if (quester.getCurrentStage(quest).containsObjective("talkToNPC")) {
if (quester.getCurrentStage(quest).containsObjective(ObjectiveType.TALK_TO_NPC)) {
if (quester.getQuestData(quest) != null
&& quester.getQuestData(quest).citizensInteracted.containsKey(evt.getNPC().getId())
&& quester.getQuestData(quest).citizensInteracted.get(evt.getNPC().getId()) == false) {
@ -255,74 +257,6 @@ public class NpcListener implements Listener {
} else if (npcQuests.isEmpty()) {
evt.getClicker().sendMessage(ChatColor.YELLOW + Lang.get(player, "noMoreQuest"));
}
/*if (!quester.getCompletedQuests().contains(q.getName())) {
if (quester.getCurrentQuests().size() < plugin.getSettings().getMaxQuests()
|| plugin.getSettings().getMaxQuests() < 1) {
quester.setQuestToTake(q.getName());
if (!plugin.getSettings().canAskConfirmation()) {
quester.takeQuest(q, false);
} else {
if (q.getGUIDisplay() != null) {
quester.showGUIDisplay(evt.getNPC(), npcQuests);
} else {
for (String msg : extracted(quester).split("<br>")) {
player.sendMessage(msg);
}
plugin.getConversationFactory().buildConversation((Conversable) player).begin();
}
}
} else if (quester.getCurrentQuests().containsKey(q) == false) {
String msg = Lang.get(player, "questMaxAllowed");
msg = msg.replace("<number>", String.valueOf(plugin.getSettings().getMaxQuests()));
player.sendMessage(ChatColor.YELLOW + msg);
}
} else if (quester.getCurrentQuests().size() < plugin.getSettings().getMaxQuests()
|| plugin.getSettings().getMaxQuests() < 1) {
if (quester.getCooldownDifference(q) > 0) {
String early = Lang.get(player, "questTooEarly");
early = early.replace("<quest>", ChatColor.AQUA + q.getName() + ChatColor.YELLOW);
early = early.replace("<time>", ChatColor.DARK_PURPLE
+ MiscUtil.getTime(quester.getCooldownDifference(q)) + ChatColor.YELLOW);
player.sendMessage(ChatColor.YELLOW + early);
} else if (q.getPlanner().getCooldown() < 0) {
String completed = Lang.get(player, "questAlreadyCompleted");
completed = completed.replace("<quest>", ChatColor.AQUA + q.getName()
+ ChatColor.YELLOW);
player.sendMessage(ChatColor.YELLOW + completed);
} else {
quester.setQuestToTake(q.getName());
if (!plugin.getSettings().canAskConfirmation()) {
quester.takeQuest(q, false);
} else {
if (q.getGUIDisplay() != null) {
quester.showGUIDisplay(evt.getNPC(), npcQuests);
} else {
for (String msg : extracted(quester).split("<br>")) {
player.sendMessage(msg);
}
plugin.getConversationFactory().buildConversation((Conversable) player).begin();
}
}
}
} else if (quester.getCurrentQuests().containsKey(q) == false) {
String msg = Lang.get(player, "questMaxAllowed");
msg = msg.replace("<number>", String.valueOf(plugin.getSettings().getMaxQuests()));
player.sendMessage(ChatColor.YELLOW + msg);
}
} else if (npcQuests.isEmpty() == false && npcQuests.size() > 1) {
if (hasAtLeastOneGUI) {
quester.showGUIDisplay(evt.getNPC(), npcQuests);
} else {
Conversation c = plugin.getNpcConversationFactory().buildConversation(player);
c.getContext().setSessionData("npcQuests", npcQuests);
c.getContext().setSessionData("npc", evt.getNPC().getName());
c.begin();
}
return;
} else if (npcQuests.isEmpty()) {
evt.getClicker().sendMessage(ChatColor.YELLOW + Lang.get(player, "noMoreQuest"));
}*/
}
}
}
@ -355,6 +289,7 @@ public class NpcListener implements Listener {
= (EntityDamageByEntityEvent) evt.getNPC().getEntity().getLastDamageCause();
final Entity damager = damageEvent.getDamager();
if (damager != null) {
final ObjectiveType type = ObjectiveType.KILL_NPC;
if (damager instanceof Projectile) {
if (evt.getNPC().getEntity().getLastDamageCause().getEntity() instanceof Player) {
final Player player = (Player) evt.getNPC().getEntity().getLastDamageCause().getEntity();
@ -367,7 +302,7 @@ public class NpcListener implements Listener {
if (okay) {
final Quester quester = plugin.getQuester(player.getUniqueId());
for (final Quest quest : quester.getCurrentQuests().keySet()) {
if (quester.getCurrentStage(quest).containsObjective("killNPC")) {
if (quester.getCurrentStage(quest).containsObjective(type)) {
quester.killNPC(quest, evt.getNPC());
}
}
@ -384,7 +319,7 @@ public class NpcListener implements Listener {
final Player player = (Player) damager;
final Quester quester = plugin.getQuester(player.getUniqueId());
for (final Quest quest : quester.getCurrentQuests().keySet()) {
if (quester.getCurrentStage(quest).containsObjective("killNPC")) {
if (quester.getCurrentStage(quest).containsObjective(type)) {
quester.killNPC(quest, evt.getNPC());
}
}

View File

@ -65,6 +65,7 @@ import me.blackvein.quests.Quest;
import me.blackvein.quests.Quester;
import me.blackvein.quests.Quests;
import me.blackvein.quests.Stage;
import me.blackvein.quests.enums.ObjectiveType;
import me.blackvein.quests.util.ItemUtil;
import me.blackvein.quests.util.Lang;
import me.blackvein.quests.util.MiscUtil;
@ -392,17 +393,18 @@ public class PlayerListener implements Listener {
final Player player = evt.getPlayer();
if (plugin.canUseQuests(player.getUniqueId())) {
final Quester quester = plugin.getQuester(player.getUniqueId());
final ObjectiveType type = ObjectiveType.MILK_COW;
for (final Quest quest : plugin.getQuests()) {
if (!quester.meetsCondition(quest, true)) {
return;
}
if (quester.getCurrentQuests().containsKey(quest)
&& quester.getCurrentStage(quest).containsObjective("milkCow")) {
&& quester.getCurrentStage(quest).containsObjective(type)) {
quester.milkCow(quest);
}
quester.dispatchMultiplayerEverything(quest, "milkCow", (final Quester q) -> {
quester.dispatchMultiplayerEverything(quest, type, (final Quester q) -> {
q.milkCow(quest);
return null;
});
@ -445,15 +447,16 @@ public class PlayerListener implements Listener {
}
}
}
if (quester.getCurrentStage(quest).containsObjective("password")) {
final ObjectiveType type = ObjectiveType.PASSWORD;
if (quester.getCurrentStage(quest).containsObjective(type)) {
quester.sayPassword(quest, evt);
}
quester.dispatchMultiplayerEverything(quest, type, (final Quester q) -> {
q.sayPassword(quest, evt);
return null;
});
}
quester.dispatchMultiplayerEverything(quest, "password", (final Quester q) -> {
q.sayPassword(quest, evt);
return null;
});
}
}
}
@ -505,17 +508,18 @@ public class PlayerListener implements Listener {
if (plugin.canUseQuests(player.getUniqueId())) {
final Sheep sheep = (Sheep) evt.getEntity();
final Quester quester = plugin.getQuester(player.getUniqueId());
final ObjectiveType type = ObjectiveType.SHEAR_SHEEP;
for (final Quest quest : plugin.getQuests()) {
if (!quester.meetsCondition(quest, true)) {
return;
}
if (quester.getCurrentQuests().containsKey(quest)
&& quester.getCurrentStage(quest).containsObjective("shearSheep")) {
&& quester.getCurrentStage(quest).containsObjective(type)) {
quester.shearSheep(quest, sheep.getColor());
}
quester.dispatchMultiplayerEverything(quest, "shearSheep", (final Quester q) -> {
quester.dispatchMultiplayerEverything(quest, type, (final Quester q) -> {
q.shearSheep(quest, sheep.getColor());
return null;
});
@ -530,17 +534,18 @@ public class PlayerListener implements Listener {
final Player player = (Player) evt.getOwner();
if (plugin.canUseQuests(player.getUniqueId())) {
final Quester quester = plugin.getQuester(player.getUniqueId());
final ObjectiveType type = ObjectiveType.TAME_MOB;
for (final Quest quest : plugin.getQuests()) {
if (!quester.meetsCondition(quest, true)) {
return;
}
if (quester.getCurrentQuests().containsKey(quest)
&& quester.getCurrentStage(quest).containsObjective("tameMob")) {
&& quester.getCurrentStage(quest).containsObjective(type)) {
quester.tameMob(quest, evt.getEntityType());
}
quester.dispatchMultiplayerEverything(quest, "tameMob", (final Quester q) -> {
quester.dispatchMultiplayerEverything(quest, type, (final Quester q) -> {
q.tameMob(quest, evt.getEntityType());
return null;
});
@ -596,33 +601,35 @@ public class PlayerListener implements Listener {
if (damager instanceof Player) {
final Quester quester = plugin.getQuester(damager.getUniqueId());
if (plugin.getDependencies().getCitizens() != null && CitizensAPI.getNPCRegistry().isNPC(target)) {
final ObjectiveType type = ObjectiveType.KILL_NPC;
for (final Quest quest : plugin.getQuests()) {
if (!quester.meetsCondition(quest, true)) {
return;
}
if (quester.getCurrentQuests().containsKey(quest)
&& quester.getCurrentStage(quest).containsObjective("killNPC")) {
&& quester.getCurrentStage(quest).containsObjective(type)) {
quester.killNPC(quest, CitizensAPI.getNPCRegistry().getNPC(target));
}
quester.dispatchMultiplayerEverything(quest, "killNPC", (final Quester q) -> {
quester.dispatchMultiplayerEverything(quest, type, (final Quester q) -> {
q.killNPC(quest, CitizensAPI.getNPCRegistry().getNPC(target));
return null;
});
}
} else {
final ObjectiveType type = ObjectiveType.KILL_MOB;
for (final Quest quest : plugin.getQuests()) {
if (!quester.meetsCondition(quest, true)) {
return;
}
if (quester.getCurrentQuests().containsKey(quest)
&& quester.getCurrentStage(quest).containsObjective("killMob")) {
&& quester.getCurrentStage(quest).containsObjective(type)) {
quester.killMob(quest, target.getLocation(), target.getType());
}
quester.dispatchMultiplayerEverything(quest, "killMob", (final Quester q) -> {
quester.dispatchMultiplayerEverything(quest, type, (final Quester q) -> {
q.killMob(quest, target.getLocation(), target.getType());
return null;
});
@ -713,17 +720,18 @@ public class PlayerListener implements Listener {
}
}
final Quester quester = plugin.getQuester(damager.getUniqueId());
final ObjectiveType type = ObjectiveType.KILL_PLAYER;
for (final Quest quest : plugin.getQuests()) {
if (!quester.meetsCondition(quest, true)) {
return;
}
if (quester.getCurrentQuests().containsKey(quest)
&& quester.getCurrentStage(quest).containsObjective("killPlayer")) {
&& quester.getCurrentStage(quest).containsObjective(type)) {
quester.killPlayer(quest, (Player)target);
}
quester.dispatchMultiplayerEverything(quest, "killPlayer", (final Quester q) -> {
quester.dispatchMultiplayerEverything(quest, type, (final Quester q) -> {
q.killPlayer(quest, (Player)target);
return null;
});
@ -736,18 +744,19 @@ public class PlayerListener implements Listener {
final Player player = evt.getPlayer();
if (plugin.canUseQuests(player.getUniqueId())) {
final Quester quester = plugin.getQuester(player.getUniqueId());
final ObjectiveType type = ObjectiveType.CATCH_FISH;
for (final Quest quest : plugin.getQuests()) {
if (!quester.meetsCondition(quest, true)) {
return;
}
if (quester.getCurrentQuests().containsKey(quest)
&& quester.getCurrentStage(quest).containsObjective("catchFish")
&& quester.getCurrentStage(quest).containsObjective(type)
&& evt.getState().equals(State.CAUGHT_FISH)) {
quester.catchFish(quest);
}
quester.dispatchMultiplayerEverything(quest, "catchFish", (final Quester q) -> {
quester.dispatchMultiplayerEverything(quest, type, (final Quester q) -> {
q.catchFish(quest);
return null;
});
@ -906,6 +915,7 @@ public class PlayerListener implements Listener {
final Quester quester = plugin.getQuester(uuid);
if (quester != null) {
if (plugin.canUseQuests(uuid)) {
final ObjectiveType type = ObjectiveType.REACH_LOCATION;
for (final Quest quest : plugin.getQuests()) {
if (!quester.meetsCondition(quest, false)) {
return;
@ -913,7 +923,7 @@ public class PlayerListener implements Listener {
if (quester.getCurrentQuests().containsKey(quest)) {
if (quester.getCurrentStage(quest) != null
&& quester.getCurrentStage(quest).containsObjective("reachLocation")) {
&& quester.getCurrentStage(quest).containsObjective(type)) {
plugin.getServer().getScheduler().runTask(plugin, new Runnable() {
@Override
public void run() {
@ -923,7 +933,7 @@ public class PlayerListener implements Listener {
}
}
quester.dispatchMultiplayerEverything(quest, "reachLocation", (final Quester q) -> {
quester.dispatchMultiplayerEverything(quest, type, (final Quester q) -> {
plugin.getServer().getScheduler().runTask(plugin, new Runnable() {
@Override
public void run() {