Update 1.6

Git has been updated
This commit is contained in:
Alex C 2013-04-08 14:24:44 -07:00
parent 5e498424d7
commit 41252807dd
20 changed files with 17858 additions and 9398 deletions

View File

@ -24,6 +24,7 @@ show-requirements: true
allow-quitting: true
debug-mode: false
kill-delay: 600
snoop: true
quester-blacklist:
- "SomeGuy12345"
- "somePrefix*"

View File

@ -31,9 +31,9 @@ public class Event {
LinkedList<Location> lightningStrikes = new LinkedList<Location>();
LinkedList<PotionEffect> potionEffects = new LinkedList<PotionEffect>();
int hunger = 0;
int saturation = 0;
int health = 0;
int hunger = -1;
int saturation = -1;
int health = -1;
Location teleport;
@Override
@ -125,10 +125,18 @@ public class Event {
return true;
}
public void happen(Player player){
public String getName(){
return name;
}
public void happen(Quester quester){
Player player = quester.getPlayer();
if(message != null)
player.sendMessage(message);
player.sendMessage(Quests.parseString(message, quester.currentQuest));
if(clearInv == true){
player.getInventory().clear();
@ -205,19 +213,19 @@ public class Event {
}
if(hunger != 0){
if(hunger != -1){
player.setFoodLevel(hunger);
}
if(saturation != 0){
if(saturation != -1){
player.setSaturation(saturation);
}
if(health != 0){
if(health != -1){
player.setHealth(health);
@ -231,9 +239,9 @@ public class Event {
}
public static Event getEvent(String name, Quests plugin, Quest quest){
public static Event getEvent(String name, Quests plugin){
if(name == null || plugin == null || quest == null)
if(name == null || plugin == null)
return null;
Event event = new Event();
@ -249,7 +257,7 @@ public class Event {
event.name = name;
if(data.contains(eventKey + "message"))
event.message = plugin.parseString(data.getString(eventKey + "message"), quest);
event.message = data.getString(eventKey + "message");
if(data.contains(eventKey + "clear-inventory")){

File diff suppressed because it is too large Load Diff

View File

@ -2,12 +2,14 @@ package me.blackvein.quests;
import net.citizensnpcs.api.event.NPCDespawnEvent;
import net.citizensnpcs.api.event.NPCRightClickEvent;
import net.citizensnpcs.api.npc.NPC;
import org.bukkit.ChatColor;
import org.bukkit.conversations.Conversable;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.inventory.ItemStack;
public class NpcListener implements Listener {
@ -22,20 +24,39 @@ public class NpcListener implements Listener {
@EventHandler(priority = EventPriority.LOWEST)
public void onNPCRightClick(NPCRightClickEvent evt) {
if (plugin.questNPCs.contains(evt.getNPC())) {
final Player player = evt.getClicker();
final Quester quester = plugin.getQuester(player.getName());
boolean delivery = false;
final Player player = evt.getClicker();
if(quester.hasObjective("deliverItem") && player.getItemInHand() != null){
ItemStack hand = player.getItemInHand();
if(quester.itemsDelivered.containsKey(hand.getType())){
NPC clicked = evt.getNPC();
for(NPC n : quester.currentStage.itemDeliveryTargets){
if(n.getId() == clicked.getId()){
quester.deliverItem(hand);
delivery = true;
break;
}
}
}
}
if (plugin.questNPCs.contains(evt.getNPC()) && delivery == false) {
if (plugin.checkQuester(player.getName()) == false) {
final Quester quester = plugin.getQuester(player.getName());
if (quester.hasObjective("talkToNPC")) {
quester.interactWithNPC(evt.getNPC());
} else {
for (final Quest q : plugin.quests) {
for (Quest q : plugin.quests) {
if (q.npcStart != null && player.hasPermission("quests.quest")) {
@ -66,17 +87,19 @@ public class NpcListener implements Listener {
if (quester.getDifference(q) > 0) {
player.sendMessage(ChatColor.YELLOW + "You may not take " + ChatColor.AQUA + q.name + ChatColor.YELLOW + " again for another " + ChatColor.DARK_PURPLE + Quests.getTime(quester.getDifference(q)) + ChatColor.YELLOW + ".");
} else {
} else if (quester.completedQuests.contains(q.name) && q.redoDelay < 0) {
player.sendMessage(ChatColor.YELLOW + "You have already completed " + ChatColor.AQUA + q.name + ChatColor.YELLOW + ".");
}else{
quester.questToTake = q.name;
String s =
ChatColor.GOLD + "- " + ChatColor.DARK_PURPLE + quester.questToTake + ChatColor.GOLD + " -\n"
+ "\n"
+ ChatColor.RESET + plugin.getQuest(quester.questToTake).description + "\n";
player.sendMessage(s);
plugin.conversationFactory.buildConversation((Conversable) player).begin();
ChatColor.GOLD + "- " + ChatColor.DARK_PURPLE + quester.questToTake + ChatColor.GOLD + " -\n"
+ "\n"
+ ChatColor.RESET + plugin.getQuest(quester.questToTake).description + "\n";
player.sendMessage(s);
plugin.conversationFactory.buildConversation((Conversable) player).begin();
}
} else if (quester.currentQuest.equals(q) == false) {

View File

@ -1,9 +1,10 @@
package me.blackvein.quests;
import java.io.File;
import java.util.HashMap;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.conversations.Conversable;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.*;
@ -19,14 +20,8 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.EntityTameEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.inventory.CraftItemEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.player.PlayerFishEvent.State;
import org.bukkit.event.player.*;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.event.player.PlayerFishEvent.State;
public class PlayerListener implements Listener {
@ -52,7 +47,63 @@ public class PlayerListener implements Listener {
quester.useBlock(evt.getClickedBlock().getType());
} else {
}else if (plugin.questFactory.selectedBlockStarts.containsKey(evt.getPlayer())){
Block block = evt.getClickedBlock();
Location loc = block.getLocation();
plugin.questFactory.selectedBlockStarts.put(evt.getPlayer(), block);
evt.getPlayer().sendMessage(ChatColor.GOLD + "Selected location " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + Quester.prettyItemString(block.getType().getId()) + ChatColor.GOLD + ")");
}else if (plugin.eventFactory.selectedExplosionLocations.containsKey(evt.getPlayer())){
Block block = evt.getClickedBlock();
Location loc = block.getLocation();
plugin.eventFactory.selectedExplosionLocations.put(evt.getPlayer(), block);
evt.getPlayer().sendMessage(ChatColor.GOLD + "Selected location " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + Quester.prettyItemString(block.getType().getId()) + ChatColor.GOLD + ")");
}else if (plugin.eventFactory.selectedEffectLocations.containsKey(evt.getPlayer())){
Block block = evt.getClickedBlock();
Location loc = block.getLocation();
plugin.eventFactory.selectedEffectLocations.put(evt.getPlayer(), block);
evt.getPlayer().sendMessage(ChatColor.GOLD + "Selected location " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + Quester.prettyItemString(block.getType().getId()) + ChatColor.GOLD + ")");
}else if (plugin.eventFactory.selectedMobLocations.containsKey(evt.getPlayer())){
Block block = evt.getClickedBlock();
Location loc = block.getLocation();
plugin.eventFactory.selectedMobLocations.put(evt.getPlayer(), block);
evt.getPlayer().sendMessage(ChatColor.GOLD + "Selected location " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + Quester.prettyItemString(block.getType().getId()) + ChatColor.GOLD + ")");
}else if (plugin.eventFactory.selectedLightningLocations.containsKey(evt.getPlayer())){
Block block = evt.getClickedBlock();
Location loc = block.getLocation();
plugin.eventFactory.selectedLightningLocations.put(evt.getPlayer(), block);
evt.getPlayer().sendMessage(ChatColor.GOLD + "Selected location " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + Quester.prettyItemString(block.getType().getId()) + ChatColor.GOLD + ")");
}else if (plugin.eventFactory.selectedTeleportLocations.containsKey(evt.getPlayer())){
Block block = evt.getClickedBlock();
Location loc = block.getLocation();
plugin.eventFactory.selectedTeleportLocations.put(evt.getPlayer(), block);
evt.getPlayer().sendMessage(ChatColor.GOLD + "Selected location " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + Quester.prettyItemString(block.getType().getId()) + ChatColor.GOLD + ")");
}else if (plugin.questFactory.selectedKillLocations.containsKey(evt.getPlayer())){
Block block = evt.getClickedBlock();
Location loc = block.getLocation();
plugin.questFactory.selectedKillLocations.put(evt.getPlayer(), block);
evt.getPlayer().sendMessage(ChatColor.GOLD + "Selected location " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + Quester.prettyItemString(block.getType().getId()) + ChatColor.GOLD + ")");
}else if (plugin.questFactory.selectedReachLocations.containsKey(evt.getPlayer())){
Block block = evt.getClickedBlock();
Location loc = block.getLocation();
plugin.questFactory.selectedReachLocations.put(evt.getPlayer(), block);
evt.getPlayer().sendMessage(ChatColor.GOLD + "Selected location " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + Quester.prettyItemString(block.getType().getId()) + ChatColor.GOLD + ")");
}else {
for (final Quest q : plugin.quests) {
@ -68,11 +119,16 @@ public class PlayerListener implements Listener {
if (quester.completedQuests.contains(q.name)) {
if (q.redoDelay < 0 || q.redoDelay > -1 && (quester.getDifference(q)) > 0) {
if (q.redoDelay > -1 && (quester.getDifference(q)) > 0) {
player.sendMessage(ChatColor.YELLOW + "You may not take " + ChatColor.AQUA + q.name + ChatColor.YELLOW + " again for another " + ChatColor.DARK_PURPLE + Quests.getTime(quester.getDifference(q)) + ChatColor.YELLOW + ".");
return;
}else if (quester.completedQuests.contains(q.name) && q.redoDelay < 0) {
player.sendMessage(ChatColor.YELLOW + "You have already completed " + ChatColor.AQUA + q.name + ChatColor.YELLOW + ".");
return;
}
}
@ -184,22 +240,6 @@ public class PlayerListener implements Listener {
}
@EventHandler
public void onPlayerPickupItem(PlayerPickupItemEvent evt) {
if (plugin.checkQuester(evt.getPlayer().getName()) == false) {
Quester quester = plugin.getQuester(evt.getPlayer().getName());
if (quester.hasObjective("collectItem")) {
quester.collectItem(evt.getItem().getItemStack());
}
}
}
@EventHandler
public void onPlayerShearEntity(PlayerShearEntityEvent evt) {
@ -258,37 +298,6 @@ public class PlayerListener implements Listener {
}
@EventHandler
public void onCraftItem(final CraftItemEvent evt) {
if (evt.getWhoClicked() instanceof Player) {
Player p = (Player) evt.getWhoClicked();
if (plugin.checkQuester(p.getName()) == false) {
final Quester quester = plugin.getQuester(p.getName());
//HANDLE CRAFTING ITEMS FOR ITEM CRAFTING AND COLLECTION
}
}
}
@EventHandler
public void onInventoryClose(InventoryCloseEvent evt) {
if (evt.getPlayer() instanceof Player) {
if (plugin.checkQuester(evt.getPlayer().getName()) == false) {
//HANDLE CLOSING INVENTORY
}
}
}
/*
*
* CRAFTING (Player)
@ -360,25 +369,6 @@ public class PlayerListener implements Listener {
*
*/
@EventHandler(priority = EventPriority.LOWEST)
public void onInventoryClick(InventoryClickEvent evt) {
Player player = null;
if (evt.getWhoClicked() instanceof Player) {
player = (Player) evt.getWhoClicked();
}
if (player != null) {
if (plugin.checkQuester(player.getName()) == false) {
//HANDLE INVENTORY CLICKING FOR ITEM COLLECTION
}
}
}
@EventHandler
public void onEntityDeath(EntityDeathEvent evt) {
@ -532,27 +522,6 @@ public class PlayerListener implements Listener {
}
@EventHandler
public void onPlayerDropItem(PlayerDropItemEvent evt) {
if(plugin.checkQuester(evt.getPlayer().getName()) == false){
Quester quester = plugin.getQuester(evt.getPlayer().getName());
if (quester.currentQuest != null) {
if (quester.currentQuest.questItems.containsKey(evt.getItemDrop().getItemStack().getType())) {
evt.getPlayer().sendMessage(ChatColor.YELLOW + "You may not discard Quest items.");
evt.setCancelled(true);
}
}
}
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent evt) {
@ -602,9 +571,12 @@ public class PlayerListener implements Listener {
if(plugin.checkQuester(evt.getPlayer().getName()) == false){
Quester quester = plugin.getQuester(evt.getPlayer().getName());
if(quester.currentStage.delay > -1)
quester.stopStageTimer();
if(quester.currentQuest != null){
if(quester.currentStage.delay > -1)
quester.stopStageTimer();
}
quester.saveData();
plugin.questers.remove(quester.name);
}

View File

@ -1,6 +1,5 @@
package me.blackvein.quests;
import com.herocraftonline.heroes.characters.classes.HeroClass.ExperienceType;
import java.util.EnumMap;
import java.util.LinkedList;
import java.util.List;
@ -49,16 +48,12 @@ public class Quest {
List<String> permissions = new LinkedList<String>();
LinkedList<ItemStack> itemRewards = new LinkedList<ItemStack>();
LinkedList<Integer> itemRewardAmounts = new LinkedList<Integer>();
//Heroes
int heroesExp = 0;
String heroesClass = null;
String heroesSecClass = null;
//
//mcMMO
List<String> mcmmoSkills = new LinkedList<String>();
List<Integer> mcmmoAmounts = new LinkedList<Integer>();
//
//
public void nextStage(Quester q){
@ -71,36 +66,20 @@ public class Quest {
if(q.currentStage.script != null)
plugin.trigger.parseQuestTaskTrigger(q.currentStage.script, player);
if(q.currentStage.event != null)
q.currentStage.event.happen(player);
q.currentStage.event.happen(q);
completeQuest(q);
}else {
q.reset();
player.sendMessage(plugin.parseString(q.currentStage.finished, q.currentQuest));
if(q.currentStage.script != null)
plugin.trigger.parseQuestTaskTrigger(q.currentStage.script, player);
if(q.currentStage.event != null)
q.currentStage.event.happen(player);
q.currentStage.event.happen(q);
q.currentStage = stages.get(stages.indexOf(q.currentStage) + 1);
q.addEmpties();
for (Entry e : q.currentStage.itemsToCollect.entrySet()) {
if ((Boolean) e.getValue() == true) {
Map<Material, Integer> tempMap = (Map<Material, Integer>) e.getKey();
for (Entry e2 : tempMap.entrySet()) {
questItems.put((Material) e2.getKey(), (Integer) e2.getValue());
}
}
}
for (Entry e : q.currentStage.itemsToCraft.entrySet()) {
if ((Boolean) e.getValue() == true) {
@ -191,7 +170,7 @@ public class Quest {
q.reset();
q.completedQuests.add(name);
String none = ChatColor.GRAY + "- (None)";
player.sendMessage(plugin.parseString(finished, q.currentQuest));
player.sendMessage(Quests.parseString(finished, q.currentQuest));
if(moneyReward > 0 && Quests.economy != null){
Quests.economy.depositPlayer(q.name, moneyReward);
none = null;
@ -264,20 +243,6 @@ public class Quest {
none = null;
}
if(heroesExp > 0){
plugin.heroes.getCharacterManager().getHero(player).gainExp(heroesExp, ExperienceType.QUESTING, player.getLocation());
none = null;
}
if(heroesClass != null){
plugin.heroes.getCharacterManager().getHero(player).changeHeroClass(plugin.heroes.getClassManager().getClass(heroesClass), false);
none = null;
}
if(heroesSecClass != null){
plugin.heroes.getCharacterManager().getHero(player).changeHeroClass(plugin.heroes.getClassManager().getClass(heroesSecClass), true);
none = null;
}
player.sendMessage(ChatColor.GOLD + "**QUEST COMPLETE: " + ChatColor.YELLOW + q.currentQuest.name + ChatColor.GOLD + "**");
player.sendMessage(ChatColor.GREEN + "Rewards:");
@ -305,21 +270,6 @@ public class Quest {
none = null;
}
if(heroesExp > 0){
player.sendMessage("- " + ChatColor.DARK_GREEN + heroesExp + ChatColor.DARK_PURPLE + " Heroes Exp");
none = null;
}
if(heroesClass != null){
player.sendMessage("- " + ChatColor.DARK_PURPLE + heroesClass + ChatColor.AQUA + " Heroes Class");
none = null;
}
if(heroesSecClass != null){
player.sendMessage("- " + ChatColor.DARK_PURPLE + heroesSecClass + ChatColor.AQUA + " Heroes Secondary Class");
none = null;
}
if(none != null){
player.sendMessage(none);
}
@ -370,25 +320,6 @@ public class Quest {
if(other.finished.equals(finished) == false)
return false;
if(other.heroesClass != null && heroesClass != null){
if(other.heroesClass.equals(heroesClass) == false)
return false;
}else if(other.heroesClass != null && heroesClass == null){
return false;
}else if(other.heroesClass == null && heroesClass != null)
return false;
if(other.heroesExp != heroesExp)
return false;
if(other.heroesSecClass != null && heroesSecClass != null){
if(other.heroesSecClass.equals(heroesSecClass) == false)
return false;
}else if(other.heroesSecClass != null && heroesSecClass == null){
return false;
}else if(other.heroesSecClass == null && heroesSecClass != null)
return false;
if(other.itemAmounts.equals(itemAmounts) == false)
return false;

File diff suppressed because it is too large Load Diff

View File

@ -1,26 +1,17 @@
package me.blackvein.quests;
import java.util.List;
import net.aufdemrand.denizen.scripts.ScriptEngine.QueueType;
import net.aufdemrand.denizen.scripts.ScriptHelper;
import net.aufdemrand.denizen.triggers.AbstractTrigger;
import net.aufdemrand.denizen.scripts.ScriptRegistry;
import net.aufdemrand.denizen.scripts.containers.core.TaskScriptContainer;
import org.bukkit.entity.Player;
public class QuestTaskTrigger extends AbstractTrigger {
public boolean parseQuestTaskTrigger(String theScriptName, Player thePlayer) {
ScriptHelper sE = plugin.getScriptEngine().helper;
if (theScriptName == null) return false;
List<String> theScript = sE.getScript(theScriptName + ".Script");
if (theScript.isEmpty()) return false;
sE.queueScriptEntries(thePlayer, sE.buildScriptEntries(thePlayer, theScript, theScriptName), QueueType.TASK);
return true;
}
public class QuestTaskTrigger {
public boolean parseQuestTaskTrigger(String theScriptName, Player thePlayer) {
if (!ScriptRegistry.containsScript(theScriptName)) {
return false;
}
TaskScriptContainer task_script = ScriptRegistry.getScriptContainerAs(theScriptName, TaskScriptContainer.class);
task_script.runTaskScript(thePlayer, null, null);
return true;
}
}

View File

@ -1,8 +1,8 @@
package me.blackvein.quests;
import java.io.File;
import java.util.Map.Entry;
import java.util.*;
import java.util.Map.Entry;
import net.citizensnpcs.api.npc.NPC;
import org.bukkit.ChatColor;
import org.bukkit.DyeColor;
@ -17,7 +17,6 @@ import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.Potion;
import org.bukkit.potion.PotionType;
public class Quester {
@ -35,10 +34,10 @@ public class Quester {
Map<Material, Integer> blocksDamaged = new EnumMap<Material, Integer>(Material.class);
Map<Material, Integer> blocksBroken = new EnumMap<Material, Integer>(Material.class);
Map<Material, Integer> blocksPlaced = new EnumMap<Material, Integer>(Material.class);
Map<Material, Integer> itemsCollected = new EnumMap<Material, Integer>(Material.class);
Map<Material, Integer> blocksUsed = new EnumMap<Material, Integer>(Material.class);
Map<Material, Integer> blocksCut = new EnumMap<Material, Integer>(Material.class);
Map<Integer, Integer> potionsBrewed = new HashMap<Integer, Integer>();
Map<Material, Integer> itemsDelivered = new EnumMap<Material, Integer>(Material.class);
int fishCaught = 0;
int playersKilled = 0;
long delayStartTime = 0;
@ -58,6 +57,7 @@ public class Quester {
Map<EntityType, Integer> mobsTamed = new EnumMap<EntityType, Integer>(EntityType.class);
Map<DyeColor, Integer> sheepSheared = new EnumMap<DyeColor, Integer>(DyeColor.class);
Map<Material, Integer> itemsCrafted = new EnumMap<Material, Integer>(Material.class);
final Random random = new Random();
public Quester(Quests newPlugin) {
@ -65,6 +65,12 @@ public class Quester {
}
public Player getPlayer() {
return plugin.getServer().getPlayer(name);
}
public void takeQuest(Quest q) {
Player player = plugin.getServer().getPlayer(name);
@ -171,34 +177,6 @@ public class Quester {
}
for (Entry e : currentStage.itemsToCollect.entrySet()) {
Map<Material, Integer> map = (Map<Material, Integer>) e.getKey();
for (Entry e2 : map.entrySet()) {
for (Entry e3 : itemsCollected.entrySet()) {
if (((Material) e3.getKey()).equals((Material) e2.getKey())) {
if (((Integer) e3.getValue()) < ((Integer) e2.getValue())) {
unfinishedObjectives.add(ChatColor.GREEN + "Collect " + Quester.prettyItemString(((Material) e3.getKey()).getId()) + ": " + ((Integer) e3.getValue()) + "/" + ((Integer) e2.getValue()));
} else {
finishedObjectives.add(ChatColor.GRAY + "Collect " + Quester.prettyItemString(((Material) e3.getKey()).getId()) + ": " + ((Integer) e3.getValue()) + "/" + ((Integer) e2.getValue()));
}
}
}
}
}
for (Entry e : currentStage.blocksToUse.entrySet()) {
for (Entry e2 : blocksUsed.entrySet()) {
@ -358,6 +336,25 @@ public class Quester {
}
for (Material m : currentStage.itemsToDeliver) {
int delivered = itemsDelivered.get(m);
int amt = currentStage.itemAmountsToDeliver.get(currentStage.itemsToDeliver.indexOf(m));
NPC npc = currentStage.itemDeliveryTargets.get(currentStage.itemsToDeliver.indexOf(m));
if (delivered < amt) {
unfinishedObjectives.add(ChatColor.GREEN + "Deliver " + Quester.prettyItemString(m.getId()) + " to " + npc.getName() + ": " + delivered + "/" + amt);
} else {
finishedObjectives.add(ChatColor.GRAY + "Deliver " + Quester.prettyItemString(m.getId()) + " to " + npc.getName() + ": " + delivered + "/" + amt);
}
}
for (NPC n : currentStage.citizensToInteract) {
for (Entry e : citizensInteracted.entrySet()) {
@ -445,8 +442,9 @@ public class Quester {
for (Entry e : currentStage.itemsToCraft.entrySet()) {
Entry entry = null;
for(Object o : ((Map) e.getKey()).entrySet())
for (Object o : ((Map) e.getKey()).entrySet()) {
entry = (Entry) o;
}
for (Entry e2 : itemsCrafted.entrySet()) {
@ -527,14 +525,6 @@ public class Quester {
return true;
}
} else if (s.equalsIgnoreCase("collectItem")) {
if (currentStage.itemsToCollect.isEmpty()) {
return false;
} else {
return true;
}
} else if (s.equalsIgnoreCase("useBlock")) {
if (currentStage.blocksToUse.isEmpty()) {
@ -575,6 +565,14 @@ public class Quester {
return true;
}
} else if (s.equalsIgnoreCase("deliverItem")) {
if (currentStage.itemsToDeliver.isEmpty()) {
return false;
} else {
return true;
}
} else if (s.equalsIgnoreCase("killPlayer")) {
if (currentStage.playersToKill == null) {
@ -679,38 +677,6 @@ public class Quester {
}
public void collectItem(ItemStack i) {
if (itemsCollected.containsKey(i.getType())) {
for (Map m : currentStage.itemsToCollect.keySet()) {
if (m.containsKey(i.getType())) {
if (itemsCollected.get(i.getType()) < (Integer) m.get(i.getType())) {
int integer = itemsCollected.get(i.getType());
if ((i.getAmount() + integer) >= (Integer) m.get(i.getType())) {
itemsCollected.put(i.getType(), (Integer) m.get(i.getType()));
} else {
itemsCollected.put(i.getType(), (integer + i.getAmount()));
}
if (itemsCollected.get(i.getType()).equals((Integer) m.get(i.getType()))) {
finishObjective("collectItem", null, i, null, null, null, null, null, null, 0);
}
}
break;
}
}
}
}
public void useBlock(Material m) {
if (blocksUsed.containsKey(m)) {
@ -891,13 +857,14 @@ public class Quester {
public void killNPC(NPC n) {
if(citizensKilled.contains(n)){
if (citizensKilled.contains(n)) {
int index = citizensKilled.indexOf(n);
if(citizenNumKilled.get(index) < currentStage.citizenNumToKill.get(index)){
if (citizenNumKilled.get(index) < currentStage.citizenNumToKill.get(index)) {
citizenNumKilled.set(index, citizenNumKilled.get(index) + 1);
if(citizenNumKilled.get(index) == currentStage.citizenNumToKill.get(index))
if (citizenNumKilled.get(index) == currentStage.citizenNumToKill.get(index)) {
finishObjective("killNPC", null, null, null, null, null, n, null, null, 0);
}
}
}
@ -962,6 +929,49 @@ public class Quester {
}
public void deliverItem(ItemStack i) {
Player player = plugin.getServer().getPlayer(name);
if (itemsDelivered.containsKey(i.getType())) {
int amount = itemsDelivered.get(i.getType());
int req = currentStage.itemAmountsToDeliver.get(currentStage.itemsToDeliver.indexOf(i.getType()));
if (amount < req) {
if ((i.getAmount() + amount) > req) {
itemsDelivered.put(i.getType(), req);
int index = player.getInventory().first(i);
i.setAmount(i.getAmount() - (req - amount)); //Take away the remaining amount needed to be delivered from the item stack
player.getInventory().setItem(index, i);
player.updateInventory();
finishObjective("deliverItem", i.getType(), null, null, null, null, null, null, null, 0);
} else if ((i.getAmount() + amount) == req) {
itemsDelivered.put(i.getType(), req);
player.getInventory().setItem(player.getInventory().first(i), null);
player.updateInventory();
finishObjective("deliverItem", i.getType(), null, null, null, null, null, null, null, 0);
} else {
itemsDelivered.put(i.getType(), (amount + i.getAmount()));
player.getInventory().setItem(player.getInventory().first(i), null);
player.updateInventory();
String message = Quests.parseString(currentStage.deliverMessages.get(random.nextInt(currentStage.deliverMessages.size())), currentQuest);
player.sendMessage(message);
}
}
}
}
public void craftItem(ItemStack i) {
if (itemsCrafted.containsKey(i.getType())) {
@ -1025,16 +1035,6 @@ public class Quester {
currentQuest.nextStage(this);
}
} else if (objective.equalsIgnoreCase("collectItem")) {
String message = ChatColor.GREEN + "(Completed) Collect " + prettyItemString(itemstack.getTypeId());
message = message + " " + itemsCollected.get(itemstack.getType()) + "/" + itemsCollected.get(itemstack.getType());
p.sendMessage(message);
if (testComplete()) {
currentQuest.nextStage(this);
}
} else if (objective.equalsIgnoreCase("useBlock")) {
String message = ChatColor.GREEN + "(Completed) Use " + prettyItemString(material.getId());
@ -1081,6 +1081,14 @@ public class Quester {
currentQuest.nextStage(this);
}
} else if (objective.equalsIgnoreCase("deliverItem")) {
String message = ChatColor.GREEN + "(Completed) Deliver " + currentStage.itemAmountsToDeliver.get(currentStage.itemsToDeliver.indexOf(material)) + " " + prettyItemString(material.getId()) + " to " + currentStage.itemDeliveryTargets.get(currentStage.itemsToDeliver.indexOf(material)).getName();
p.sendMessage(message);
if (testComplete()) {
currentQuest.nextStage(this);
}
} else if (objective.equalsIgnoreCase("killMob")) {
String message = ChatColor.GREEN + "(Completed) Kill " + mob.getName();
@ -1134,15 +1142,6 @@ public class Quester {
currentQuest.nextStage(this);
}
} else if (objective.equalsIgnoreCase("craftItem")) {
String message = ChatColor.GREEN + "(Completed) Craft " + prettyItemString(material.getId());
message = message + " " + itemsCrafted.get(material) + "/" + itemsCrafted.get(material);
p.sendMessage(message);
if (testComplete()) {
currentQuest.nextStage(this);
}
} else {
String message = ChatColor.GREEN + "(Completed) Go to " + currentStage.locationNames.get(currentStage.locationsToReach.indexOf(location));
@ -1194,18 +1193,6 @@ public class Quester {
}
}
if (currentStage.itemsToCollect.isEmpty() == false) {
for (Entry e : currentStage.itemsToCollect.entrySet()) {
for (Object o : ((Map) e.getKey()).keySet()) {
itemsCollected.put((Material) o, 0);
}
}
}
if (currentStage.blocksToUse.isEmpty() == false) {
for (Material m : currentStage.blocksToUse.keySet()) {
@ -1250,6 +1237,14 @@ public class Quester {
playersKilled = 0;
if (currentStage.itemsToDeliver.isEmpty() == false) {
for (Material m : currentStage.itemsToDeliver) {
itemsDelivered.put(m, 0);
}
}
if (currentStage.citizensToInteract.isEmpty() == false) {
for (NPC n : currentStage.citizensToInteract) {
@ -1320,7 +1315,6 @@ public class Quester {
blocksDamaged.clear();
blocksBroken.clear();
blocksPlaced.clear();
itemsCollected.clear();
blocksUsed.clear();
blocksCut.clear();
fishCaught = 0;
@ -1330,6 +1324,7 @@ public class Quester {
locationsToKillWithin.clear();
radiiToKillWithin.clear();
playersKilled = 0;
itemsDelivered.clear();
citizensInteracted.clear();
citizensKilled.clear();
citizenNumKilled.clear();
@ -1369,32 +1364,6 @@ public class Quester {
return prettyString;
}
public static String prettyPotionString(PotionType type) {
if (type.equals(PotionType.FIRE_RESISTANCE)) {
return "Fire Resistance";
} else if (type.equals(PotionType.INSTANT_DAMAGE)) {
return "Harming";
} else if (type.equals(PotionType.INSTANT_HEAL)) {
return "Healing";
} else if (type.equals(PotionType.POISON)) {
return "Poison";
} else if (type.equals(PotionType.REGEN)) {
return "Regeneration";
} else if (type.equals(PotionType.SLOWNESS)) {
return "Slowness";
} else if (type.equals(PotionType.SPEED)) {
return "Swiftness";
} else if (type.equals(PotionType.STRENGTH)) {
return "Strength";
} else if (type.equals(PotionType.WATER)) {
return "Water";
} else {
return "Weakness";
}
}
public static String fullPotionString(short dv) {
Potion potion = Potion.fromDamage(dv);
@ -1403,7 +1372,7 @@ public class Quester {
try {
potionName = "Potion of " + Quester.prettyPotionString(potion.getType());
potionName = "Potion of " + potion.getType().getEffectType().getName();
} catch (NullPointerException e) { // Potion is primary
@ -1443,7 +1412,7 @@ public class Quester {
public static String prettyMobString(EntityType type) {
String baseString = type.getName();
String baseString = type.toString();
String[] substrings = baseString.split("_");
String prettyString = "";
int size = 1;
@ -1465,6 +1434,26 @@ public class Quester {
return prettyString;
}
public static String prettyString(String s) {
String[] substrings = s.split("_");
String prettyString = "";
int size = 1;
for (String sb : substrings) {
prettyString = prettyString.concat(Quester.getCapitalized(sb));
if (size < substrings.length) {
prettyString = prettyString.concat(" ");
}
size++;
}
return prettyString;
}
public static String prettyEnchantmentString(Enchantment e) {
String prettyString = "";
@ -1509,6 +1498,8 @@ public class Quester {
prettyString = "Projectile Protection";
} else if (e.equals(Enchantment.SILK_TOUCH)) {
prettyString = "Silk Touch";
} else if (e.equals(Enchantment.THORNS)) {
prettyString = "Thorns";
} else if (e.equals(Enchantment.WATER_WORKER)) {
prettyString = "Aqua Affinity";
}
@ -1656,21 +1647,6 @@ public class Quester {
}
if (itemsCollected.isEmpty() == false) {
LinkedList<Integer> itemIds = new LinkedList<Integer>();
LinkedList<Integer> itemAmounts = new LinkedList<Integer>();
for (Material m : itemsCollected.keySet()) {
itemIds.add(m.getId());
itemAmounts.add(itemsCollected.get(m));
}
data.set("items-collected-ids", itemIds);
data.set("items-collected-amounts", itemAmounts);
}
if (blocksUsed.isEmpty() == false) {
LinkedList<Integer> blockIds = new LinkedList<Integer>();
@ -1778,6 +1754,23 @@ public class Quester {
}
if (itemsDelivered.isEmpty() == false) {
LinkedList<Integer> deliveryIds = new LinkedList<Integer>();
LinkedList<Integer> deliveryAmounts = new LinkedList<Integer>();
for (Entry<Material, Integer> e : itemsDelivered.entrySet()) {
deliveryIds.add(e.getKey().getId());
deliveryAmounts.add(e.getValue());
}
data.set("item-delivery-ids", deliveryIds);
data.set("item-delivery-amounts", deliveryAmounts);
}
if (citizensInteracted.isEmpty() == false) {
LinkedList<Integer> npcIds = new LinkedList<Integer>();
@ -1795,7 +1788,7 @@ public class Quester {
}
if(citizensKilled.isEmpty() == false) {
if (citizensKilled.isEmpty() == false) {
LinkedList<Integer> npcIds = new LinkedList<Integer>();
@ -1904,8 +1897,9 @@ public class Quester {
}
if(delayTimeLeft > 0)
if (delayTimeLeft > 0) {
data.set("stage-delay", delayTimeLeft);
}
} else {
@ -2060,19 +2054,6 @@ public class Quester {
}
if (data.contains("items-collected-ids")) {
List<Integer> ids = data.getIntegerList("items-collected-ids");
List<Integer> amounts = data.getIntegerList("items-collected-amounts");
for (int i : ids) {
itemsCollected.put(Material.getMaterial(i), amounts.get(ids.indexOf(i)));
}
}
if (data.contains("blocks-used-ids")) {
List<Integer> ids = data.getIntegerList("blocks-used-ids");
@ -2378,6 +2359,19 @@ public class Quester {
}
if (data.contains("item-delivery-ids")) {
List<Integer> deliveryIds = data.getIntegerList("item-delivery-ids");
List<Integer> deliveryAmounts = data.getIntegerList("item-delivery-amounts");
for (int i : deliveryIds) {
itemsDelivered.put(Material.getMaterial(i), deliveryAmounts.get(deliveryIds.indexOf(i)));
}
}
if (data.contains("citizen-ids-to-talk-to")) {
List<Integer> ids = data.getIntegerList("citizen-ids-to-talk-to");
@ -2574,7 +2568,7 @@ public class Quester {
}
if(data.contains("stage-delay")){
if (data.contains("stage-delay")) {
delayTimeLeft = data.getLong("stage-delay");
@ -2586,34 +2580,38 @@ public class Quester {
}
public void startStageTimer(){
public void startStageTimer() {
if(delayTimeLeft > -1)
plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new StageTimer(plugin, this), delayTimeLeft*50);
else
if (delayTimeLeft > -1) {
plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new StageTimer(plugin, this), delayTimeLeft * 50);
} else {
plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new StageTimer(plugin, this), currentStage.delay);
plugin.getServer().getPlayer(name).sendMessage(currentStage.delayMessage);
}
delayStartTime = System.currentTimeMillis();
}
public void stopStageTimer(){
public void stopStageTimer() {
if(delayTimeLeft > -1)
if (delayTimeLeft > -1) {
delayTimeLeft = delayTimeLeft - (System.currentTimeMillis() - delayStartTime);
else
} else {
delayTimeLeft = currentStage.delay - (System.currentTimeMillis() - delayStartTime);
}
delayOver = false;
}
public long getStageTime(){
public long getStageTime() {
if(delayTimeLeft > -1)
if (delayTimeLeft > -1) {
return delayTimeLeft - (System.currentTimeMillis() - delayStartTime);
else
} else {
return currentStage.delay - (System.currentTimeMillis() - delayStartTime);
}
}
@ -2660,69 +2658,69 @@ public class Quester {
}
public static String checkPlacement(Inventory inv, int rawSlot){
public static String checkPlacement(Inventory inv, int rawSlot) {
if(rawSlot < 0){
if (rawSlot < 0) {
return "You may not drop Quest items.";
}
InventoryType type = inv.getType();
if(type.equals(InventoryType.BREWING)){
if (type.equals(InventoryType.BREWING)) {
if(rawSlot < 4){
if (rawSlot < 4) {
return "You may not brew using Quest items.";
}
}else if(type.equals(InventoryType.CHEST)){
} else if (type.equals(InventoryType.CHEST)) {
if(inv.getContents().length == 27){
if(rawSlot < 27){
if (inv.getContents().length == 27) {
if (rawSlot < 27) {
return "You may not store Quest items.";
}
}else {
if(rawSlot < 54){
} else {
if (rawSlot < 54) {
return "You may not store Quest items.";
}
}
}else if(type.equals(InventoryType.CRAFTING)){
} else if (type.equals(InventoryType.CRAFTING)) {
if(rawSlot < 5){
if (rawSlot < 5) {
return "You may not craft using Quest items.";
}else if(rawSlot < 9){
} else if (rawSlot < 9) {
return "You may not equip Quest items.";
}
}else if(type.equals(InventoryType.DISPENSER)){
} else if (type.equals(InventoryType.DISPENSER)) {
if(rawSlot < 9){
if (rawSlot < 9) {
return "You may not put Quest items in dispensers.";
}
}else if(type.equals(InventoryType.ENCHANTING)){
} else if (type.equals(InventoryType.ENCHANTING)) {
if(rawSlot == 0){
if (rawSlot == 0) {
return "You may not enchant Quest items.";
}
}else if(type.equals(InventoryType.ENDER_CHEST)){
} else if (type.equals(InventoryType.ENDER_CHEST)) {
if(rawSlot < 27){
if (rawSlot < 27) {
return "You may not store Quest items.";
}
}else if(type.equals(InventoryType.FURNACE)){
} else if (type.equals(InventoryType.FURNACE)) {
if(rawSlot < 3){
if (rawSlot < 3) {
return "You may not smelt using Quest items.";
}
}else if(type.equals(InventoryType.WORKBENCH)){
} else if (type.equals(InventoryType.WORKBENCH)) {
if(rawSlot < 10){
if (rawSlot < 10) {
return "You may not craft using Quest items.";
}
@ -2731,30 +2729,24 @@ public class Quester {
}
public static List<Integer> getChangedSlots(Inventory inInv, ItemStack inNew)
{
public static List<Integer> getChangedSlots(Inventory inInv, ItemStack inNew) {
List<Integer> changed = new ArrayList<Integer>();
if(inInv.contains(inNew.getType()))
{
if (inInv.contains(inNew.getType())) {
int amount = inNew.getAmount();
HashMap<Integer, ? extends ItemStack> items = inInv.all(inNew.getType());
for(int i = 0; i < inInv.getSize(); i++)
{
if(!items.containsKey((Integer)i))
for (int i = 0; i < inInv.getSize(); i++) {
if (!items.containsKey((Integer) i)) {
continue;
}
ItemStack item = items.get((Integer)i);
ItemStack item = items.get((Integer) i);
int slotamount = item.getMaxStackSize() - item.getAmount();
if(slotamount > 1)
{
if(amount > slotamount)
{
if (slotamount > 1) {
if (amount > slotamount) {
int toAdd = slotamount - amount;
amount = amount - toAdd;
changed.add(i);
}
else
{
} else {
changed.add(i);
amount = 0;
break;
@ -2762,16 +2754,15 @@ public class Quester {
}
}
if(amount > 0)
{
if(inInv.firstEmpty() != -1)
if (amount > 0) {
if (inInv.firstEmpty() != -1) {
changed.add(inInv.firstEmpty());
}
}
}
else
{
if(inInv.firstEmpty() != -1)
} else {
if (inInv.firstEmpty() != -1) {
changed.add(inInv.firstEmpty());
}
}
return changed;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,6 @@
package me.blackvein.quests;
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.LinkedList;
@ -14,11 +15,9 @@ import org.bukkit.entity.EntityType;
public class Stage {
public String finished;
Map<Material, Integer> blocksToDamage = new EnumMap<Material, Integer>(Material.class);
Map<Material, Integer> blocksToBreak = new EnumMap<Material, Integer>(Material.class);
Map<Material, Integer> blocksToPlace = new EnumMap<Material, Integer>(Material.class);
Map<Map<Material, Integer>, Boolean> itemsToCollect = new HashMap<Map<Material, Integer>, Boolean>();
Map<Material, Integer> blocksToUse = new EnumMap<Material, Integer>(Material.class);
Map<Material, Integer> blocksToCut = new EnumMap<Material, Integer>(Material.class);
Integer fishToCatch;
@ -29,6 +28,35 @@ public class Stage {
LinkedList<Location> locationsToKillWithin = new LinkedList<Location>();
LinkedList<Integer> radiiToKillWithin = new LinkedList<Integer>();
LinkedList<String> areaNames = new LinkedList<String>();
LinkedList<Material> itemsToDeliver = new LinkedList<Material>();
LinkedList<Integer> itemAmountsToDeliver = new LinkedList<Integer>();
LinkedList<NPC> itemDeliveryTargets = new LinkedList<NPC>(){
@Override
public boolean equals(Object o) {
if (o instanceof LinkedList) {
LinkedList<NPC> otherList = (LinkedList<NPC>) o;
for (NPC n : this) {
NPC other = otherList.get(this.indexOf(n));
if (other.getId() != n.getId()) {
return false;
}
}
}
return true;
}
};
ArrayList<String> deliverMessages = new ArrayList<String>();
LinkedList<NPC> citizensToInteract = new LinkedList<NPC>(){
@Override
@ -97,16 +125,6 @@ public class Stage {
Stage other = (Stage) o;
if (other.finished != null && finished != null) {
if (other.finished.equals(finished) == false) {
return false;
}
} else if (other.finished != null && finished == null) {
return false;
} else if (other.finished == null && finished != null) {
return false;
}
if (other.blocksToDamage.equals(blocksToDamage) == false) {
return false;
}
@ -119,10 +137,6 @@ public class Stage {
return false;
}
if (other.itemsToCollect.equals(itemsToCollect) == false) {
return false;
}
if (other.blocksToUse.equals(blocksToUse) == false) {
return false;
}
@ -175,6 +189,22 @@ public class Stage {
return false;
}
if (other.itemsToDeliver.equals(itemsToDeliver) == false){
return false;
}
if (other.itemAmountsToDeliver.equals(itemAmountsToDeliver) == false){
return false;
}
if (other.itemDeliveryTargets.equals(itemDeliveryTargets) == false){
return false;
}
if (other.deliverMessages.equals(deliverMessages) == false){
return false;
}
if (other.citizensToInteract.equals(citizensToInteract) == false) {
return false;
}

View File

@ -29,18 +29,17 @@ public class StageTimer implements Runnable{
if(quester.currentStage.script != null)
plugin.trigger.parseQuestTaskTrigger(quester.currentStage.script, player);
if(quester.currentStage.event != null)
quester.currentStage.event.happen(player);
quester.currentStage.event.happen(quester);
quester.currentQuest.completeQuest(quester);
}else {
quester.reset();
player.sendMessage(plugin.parseString(quester.currentStage.finished, quester.currentQuest));
if(quester.currentStage.script != null)
plugin.trigger.parseQuestTaskTrigger(quester.currentStage.script, player);
if(quester.currentStage.event != null)
quester.currentStage.event.happen(player);
quester.currentStage.event.happen(quester);
quester.currentStage = quester.currentQuest.stages.get(quester.currentQuest.stages.indexOf(quester.currentStage) + 1);
quester.addEmpties();
quester.delayStartTime = 0;

View File

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,610 @@
package me.blackvein.quests.prompts;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import me.blackvein.quests.Quest;
import me.blackvein.quests.QuestFactory;
import me.blackvein.quests.Quester;
import me.blackvein.quests.Quests;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.conversations.*;
public class RequirementsPrompt extends FixedSetPrompt{
Quests quests;
static final ChatColor BOLD = ChatColor.BOLD;
static final ChatColor AQUA = ChatColor.AQUA;
static final ChatColor DARKAQUA = ChatColor.DARK_AQUA;
static final ChatColor BLUE = ChatColor.BLUE;
static final ChatColor GOLD = ChatColor.GOLD;
static final ChatColor PINK = ChatColor.LIGHT_PURPLE;
static final ChatColor PURPLE = ChatColor.DARK_PURPLE;
static final ChatColor GREEN = ChatColor.GREEN;
static final ChatColor DARKGREEN = ChatColor.DARK_GREEN;
static final ChatColor RED = ChatColor.RED;
static final ChatColor DARKRED = ChatColor.DARK_RED;
static final ChatColor YELLOW = ChatColor.YELLOW;
static final ChatColor GRAY = ChatColor.GRAY;
static final ChatColor RESET = ChatColor.RESET;
final QuestFactory factory;
public RequirementsPrompt(Quests plugin, QuestFactory qf){
super("1", "2", "3", "4", "5", "6", "7");
quests = plugin;
factory = qf;
}
@Override
public String getPromptText(ConversationContext context){
String text;
text = DARKAQUA + "- " + AQUA + context.getSessionData("questName") + AQUA + " | Requirements -\n";
if(context.getSessionData("moneyReq") == null)
text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set money requirement " + GRAY + "(None set)\n";
else{
int moneyReq = (Integer) context.getSessionData("moneyReq");
text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set money requirement (" + context.getSessionData("moneyReq") + " " + (moneyReq > 1 ? Quests.getCurrency(true) : Quests.getCurrency(false)) + ")\n";
}
if(context.getSessionData("questPointsReq") == null)
text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set Quest Points requirement " + GRAY + "(None set)\n";
else{
text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set Quest Points requirement " + GRAY + "(" + AQUA + context.getSessionData("questPointsReq") + " Quest Points" + GRAY + ")\n";
}
if(context.getSessionData("itemIdReqs") == null)
text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Set item requirements " + GRAY + "(None set)\n";
else{
text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Set item requirements\n";
List<Integer> ids = (List<Integer>) context.getSessionData("itemIdReqs");
List<Integer> amounts = (List<Integer>) context.getSessionData("itemAmountReqs");
List<Boolean> removes = (List<Boolean>) context.getSessionData("removeItemReqs");
for(int i : ids){
text += GRAY + " - " + AQUA + Quester.prettyItemString(i) + YELLOW + " x " + AQUA + amounts.get(ids.indexOf(i));
if(removes.get(ids.indexOf(i)) == false)
text += GRAY + "(" + DARKRED + "Remove" + GRAY + ")\n";
else
text += GRAY + "(" + DARKGREEN + "Keep" + GRAY + ")\n";
}
}
if(context.getSessionData("permissionReqs") == null)
text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Set permission requirements " + GRAY + "(None set)\n";
else{
text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Set permission requirements\n";
List<String> perms = (List<String>) context.getSessionData("permissionReqs");
for(String s : perms){
text += GRAY + " - " + AQUA + s + "\n";
}
}
if(context.getSessionData("questReqs") == null)
text += BLUE + "" + BOLD + "5" + RESET + YELLOW + " - Set Quest requirements " + GRAY + "(None set)\n";
else{
text += BLUE + "" + BOLD + "5" + RESET + YELLOW + " - Set Quest requirements\n";
List<String> qs = (List<String>) context.getSessionData("questReqs");
for(String s : qs){
text += GRAY + " - " + AQUA + s + "\n";
}
}
if(context.getSessionData("moneyReq") == null && context.getSessionData("questPointsReq") == null && context.getSessionData("itemIdReqs") == null && context.getSessionData("permissionReqs") == null && context.getSessionData("questReqs") == null){
text += GRAY + "" + BOLD + "6 - " + RESET + GRAY + "Set fail requirements message (No requirements set)\n";
}else if(context.getSessionData("failMessage") == null){
text += RED + "" + BOLD + "6 - " + RESET + RED + "Set fail requirements message (Required)\n";
}else{
text += BLUE + "" + BOLD + "6 - " + RESET + YELLOW + "Set fail requirements message" + GRAY + "(" + AQUA + "\"" + context.getSessionData("failMessage") + "\"" + GRAY + ")\n";
}
text += GREEN + "" + BOLD + "7" + RESET + YELLOW + " - Done";
return text;
}
@Override
protected Prompt acceptValidatedInput(ConversationContext context, String input){
if(input.equalsIgnoreCase("1")){
return new MoneyPrompt();
}else if(input.equalsIgnoreCase("2")){
return new QuestPointsPrompt();
}else if(input.equalsIgnoreCase("3")){
return new ItemListPrompt();
}else if(input.equalsIgnoreCase("4")){
return new PermissionsPrompt();
}else if(input.equalsIgnoreCase("5")){
return new QuestListPrompt();
}else if(input.equalsIgnoreCase("6")){
return new FailMessagePrompt();
}else if(input.equalsIgnoreCase("7")){
if(context.getSessionData("moneyReq") != null || context.getSessionData("questPointsReq") != null || context.getSessionData("itemIdReqs") != null || context.getSessionData("permissionReqs") != null || context.getSessionData("questReqs") != null){
if(context.getSessionData("failMessage") == null){
context.getForWhom().sendRawMessage(RED + "You must set a fail requirements message!");
return new RequirementsPrompt(quests, factory);
}
}
return factory.returnToMenu();
}
return null;
}
private class MoneyPrompt extends NumericPrompt {
@Override
public String getPromptText(ConversationContext context){
return YELLOW + "Enter amount of " + PURPLE + ((Quests.economy.currencyNamePlural().isEmpty() ? "Money" : Quests.economy.currencyNamePlural())) + YELLOW + ", or 0 to clear the money requirement, or -1 to cancel";
}
@Override
protected Prompt acceptValidatedInput(ConversationContext context, Number input){
if(input.intValue() < -1){
context.getForWhom().sendRawMessage(RED + "Amount must be greater than 0!");
return new MoneyPrompt();
}else if(input.intValue() == -1){
return new RequirementsPrompt(quests, factory);
}else if(input.intValue() == 0){
context.setSessionData("moneyReq", null);
return new RequirementsPrompt(quests, factory);
}
context.setSessionData("moneyReq", input.intValue());
return new RequirementsPrompt(quests, factory);
}
}
private class QuestPointsPrompt extends NumericPrompt {
@Override
public String getPromptText(ConversationContext context){
return YELLOW + "Enter amount of Quest Points, or 0 to clear the Quest Point requirement,\nor -1 to cancel";
}
@Override
protected Prompt acceptValidatedInput(ConversationContext context, Number input){
if(input.intValue() < -1){
context.getForWhom().sendRawMessage(RED + "Amount must be greater than 0!");
return new QuestPointsPrompt();
}else if(input.intValue() == -1){
return new RequirementsPrompt(quests, factory);
}else if(input.intValue() == 0){
context.setSessionData("questPointsReq", null);
return new RequirementsPrompt(quests, factory);
}
context.setSessionData("questPointsReq", input.intValue());
return new RequirementsPrompt(quests, factory);
}
}
private class QuestListPrompt extends StringPrompt {
@Override
public String getPromptText(ConversationContext context){
String text = PINK + "- Quests -\n" + PURPLE;
boolean none = true;
for(Quest q : quests.getQuests()){
text += q.getName() + ", ";
none = false;
}
if(none)
text += "(None)\n";
else{
text = text.substring(0, (text.length() - 2));
text += "\n";
}
text += YELLOW + "Enter a list of Quest names separating each one by a " + RED + BOLD + "comma" + RESET + YELLOW + ", or enter \'clear\' to clear the list, or \'cancel\' to return.";
return text;
}
@Override
public Prompt acceptInput(ConversationContext context, String input){
if(input.equalsIgnoreCase("cancel") == false && input.equalsIgnoreCase("clear") == false){
String[] args = input.split(",");
LinkedList<String> questNames = new LinkedList<String>();
for(String s : args){
if(quests.getQuest(s) == null){
context.getForWhom().sendRawMessage(PINK + s + " " + RED + "is not a Quest name!");
return new QuestListPrompt();
}
if(questNames.contains(s)){
context.getForWhom().sendRawMessage(RED + "List contains duplicates!");
return new QuestListPrompt();
}
questNames.add(s);
}
Collections.sort(questNames, new Comparator(){
@Override
public int compare(Object one, Object two){
String s = (String) one;
String s2 = (String) two;
return s.compareTo(s2);
}
});
context.setSessionData("questReqs", questNames);
}else if(input.equalsIgnoreCase("clear")){
context.setSessionData("questReqs", null);
}
return new RequirementsPrompt(quests, factory);
}
}
private class ItemListPrompt extends FixedSetPrompt {
public ItemListPrompt(){
super("1", "2", "3", "4", "5");
}
@Override
public String getPromptText(ConversationContext context){
String text = GOLD + "- Item Requirements -\n";
if(context.getSessionData("itemIdReqs") == null){
text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set item IDs (None set)\n";
text += GRAY + "2 - Set item amounts (No IDs set)\n";
text += GRAY + "3 - Set remove items (No IDs set)\n";
text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Clear\n";
text += BLUE + "" + BOLD + "5" + RESET + YELLOW + " - Done";
}else{
text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set item IDs\n";
for(Integer i : getItemIds(context)){
text += GRAY + " - " + AQUA + Quester.prettyItemString(i) + "\n";
}
if(context.getSessionData("itemAmountReqs") == null){
text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set item amounts (None set)\n";
}else{
text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set item amounts\n";
for(Integer i : getItemAmounts(context)){
text += GRAY + " - " + AQUA + i + "\n";
}
}
if(context.getSessionData("removeItemReqs") == null){
text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Set remove items (None set)\n";
}else{
text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Set remove items\n";
for(Boolean b : getRemoveItems(context)){
text += GRAY + " - " + AQUA + b.toString().toLowerCase() + "\n";
}
}
text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Clear\n";
text += BLUE + "" + BOLD + "5" + RESET + YELLOW + " - Done";
}
return text;
}
@Override
protected Prompt acceptValidatedInput(ConversationContext context, String input){
if(input.equalsIgnoreCase("1")){
return new ItemIdsPrompt();
}else if(input.equalsIgnoreCase("2")){
if(context.getSessionData("itemIdReqs") == null){
context.getForWhom().sendRawMessage(RED + "You must set item IDs first!");
return new ItemListPrompt();
}else{
return new ItemAmountsPrompt();
}
}else if(input.equalsIgnoreCase("3")){
if(context.getSessionData("itemIdReqs") == null){
context.getForWhom().sendRawMessage(RED + "You must set item IDs first!");
return new ItemListPrompt();
}else{
return new RemoveItemsPrompt();
}
}else if(input.equalsIgnoreCase("4")){
context.getForWhom().sendRawMessage(YELLOW + "Item requirements cleared.");
context.setSessionData("itemIdReqs", null);
context.setSessionData("itemAmountReqs", null);
context.setSessionData("removeItemReqs", null);
return new ItemListPrompt();
}else if(input.equalsIgnoreCase("5")){
int one;
int two;
int three;
if(context.getSessionData("itemIdReqs") != null)
one = ((List<Integer>) context.getSessionData("itemIdReqs")).size();
else
one = 0;
if(context.getSessionData("itemAmountReqs") != null)
two = ((List<Integer>) context.getSessionData("itemAmountReqs")).size();
else
two = 0;
if(context.getSessionData("removeItemReqs") != null)
three = ((List<Integer>) context.getSessionData("removeItemReqs")).size();
else
three = 0;
if(one == two && two == three)
return new RequirementsPrompt(quests, factory);
else{
context.getForWhom().sendRawMessage(RED + "The " + GOLD + "item IDs list" + RED + ", " + GOLD + "item amounts list " + RED + "and " + GOLD + "remove items list " + RED + "are not the same size!");
return new ItemListPrompt();
}
}
return null;
}
private List<Integer> getItemIds(ConversationContext context){
return (List<Integer>) context.getSessionData("itemIdReqs");
}
private List<Integer> getItemAmounts(ConversationContext context){
return (List<Integer>) context.getSessionData("itemAmountReqs");
}
private List<Boolean> getRemoveItems(ConversationContext context){
return (List<Boolean>) context.getSessionData("removeItemReqs");
}
}
private class ItemIdsPrompt extends StringPrompt {
@Override
public String getPromptText(ConversationContext context){
return YELLOW + "Enter item IDs, separating each one by a space, or enter \'cancel\' to return.";
}
@Override
public Prompt acceptInput(ConversationContext context, String input){
if(input.equalsIgnoreCase("cancel") == false){
String[] args = input.split(" ");
LinkedList<Integer> ids = new LinkedList<Integer>();
for(String s : args){
try{
if(Material.getMaterial(Integer.parseInt(s)) != null){
if(ids.contains(Integer.parseInt(s)) == false){
ids.add(Integer.parseInt(s));
}else{
context.getForWhom().sendRawMessage(RED + " List contains duplicates!");
return new ItemIdsPrompt();
}
}else{
context.getForWhom().sendRawMessage(PINK + s + RED + " is not a valid item ID!");
return new ItemIdsPrompt();
}
}catch (Exception e){
context.getForWhom().sendRawMessage(RED + "Invalid entry " + PINK + s + RED + ". Input was not a list of numbers!");
return new ItemIdsPrompt();
}
}
context.setSessionData("itemIdReqs", ids);
}
return new ItemListPrompt();
}
}
private class ItemAmountsPrompt extends StringPrompt {
@Override
public String getPromptText(ConversationContext context){
return YELLOW + "Enter item amounts (numbers), separating each one by a space, or enter \'cancel\' to return.";
}
@Override
public Prompt acceptInput(ConversationContext context, String input){
if(input.equalsIgnoreCase("cancel") == false){
String[] args = input.split(" ");
LinkedList<Integer> amounts = new LinkedList<Integer>();
for(String s : args){
try{
if(Integer.parseInt(s) > 0)
amounts.add(Integer.parseInt(s));
else{
context.getForWhom().sendRawMessage(PINK + s + RED + " is not greater than 0!");
return new ItemAmountsPrompt();
}
}catch (Exception e){
context.getForWhom().sendRawMessage(RED + "Invalid entry " + PINK + s + RED + ". Input was not a list of numbers!");
return new ItemAmountsPrompt();
}
}
context.setSessionData("itemAmountReqs", amounts);
}
return new ItemListPrompt();
}
}
private class RemoveItemsPrompt extends StringPrompt {
@Override
public String getPromptText(ConversationContext context){
return YELLOW + "Enter a list of true/false values, separating each one by a space, or enter \'cancel\' to return.";
}
@Override
public Prompt acceptInput(ConversationContext context, String input){
if(input.equalsIgnoreCase("cancel") == false){
String[] args = input.split(" ");
LinkedList<Boolean> booleans = new LinkedList<Boolean>();
for(String s : args){
if(s.equalsIgnoreCase("true") || s.equalsIgnoreCase("yes"))
booleans.add(true);
else if(s.equalsIgnoreCase("false") || s.equalsIgnoreCase("no"))
booleans.add(false);
else{
context.getForWhom().sendRawMessage(PINK + s + RED + " is not a true or false value!\n " + GOLD + "Example: true false true true");
return new RemoveItemsPrompt();
}
}
context.setSessionData("removeItemReqs", booleans);
}
return new ItemListPrompt();
}
}
private class PermissionsPrompt extends StringPrompt {
@Override
public String getPromptText(ConversationContext context){
return YELLOW + "Enter permission requirements separating each one by a space, or enter \'clear\' to clear the list, or enter \'cancel\' to return.";
}
@Override
public Prompt acceptInput(ConversationContext context, String input){
if(input.equalsIgnoreCase("cancel") == false && input.equalsIgnoreCase("clear") == false){
String[] args = input.split(" ");
LinkedList<String> permissions = new LinkedList<String>();
permissions.addAll(Arrays.asList(args));
context.setSessionData("permissionReqs", permissions);
}else if(input.equalsIgnoreCase("clear")){
context.setSessionData("permissionReqs", null);
}
return new RequirementsPrompt(quests, factory);
}
}
private class FailMessagePrompt extends StringPrompt {
@Override
public String getPromptText(ConversationContext context){
return YELLOW + "Enter fail requirements message, or enter \'cancel\' to return.";
}
@Override
public Prompt acceptInput(ConversationContext context, String input){
if(input.equalsIgnoreCase("cancel") == false)
context.setSessionData("failMessage", input);
return new RequirementsPrompt(quests, factory);
}
}
}

View File

@ -0,0 +1,715 @@
package me.blackvein.quests.prompts;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import me.blackvein.quests.QuestFactory;
import me.blackvein.quests.Quester;
import me.blackvein.quests.Quests;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.conversations.*;
public class RewardsPrompt extends FixedSetPrompt{
Quests quests;
static final ChatColor BOLD = ChatColor.BOLD;
static final ChatColor ITALIC = ChatColor.ITALIC;
static final ChatColor AQUA = ChatColor.AQUA;
static final ChatColor DARKAQUA = ChatColor.DARK_AQUA;
static final ChatColor BLUE = ChatColor.BLUE;
static final ChatColor GOLD = ChatColor.GOLD;
static final ChatColor PINK = ChatColor.LIGHT_PURPLE;
static final ChatColor PURPLE = ChatColor.DARK_PURPLE;
static final ChatColor GREEN = ChatColor.GREEN;
static final ChatColor RED = ChatColor.RED;
static final ChatColor DARKRED = ChatColor.DARK_RED;
static final ChatColor YELLOW = ChatColor.YELLOW;
static final ChatColor GRAY = ChatColor.GRAY;
static final ChatColor RESET = ChatColor.RESET;
final QuestFactory factory;
public RewardsPrompt(Quests plugin, QuestFactory qf){
super("1", "2", "3", "4", "5", "6", "7", "8");
quests = plugin;
factory = qf;
}
@Override
public String getPromptText(ConversationContext context){
String text;
text = DARKAQUA + "- " + AQUA + context.getSessionData("questName") + AQUA + " | Rewards -\n";
if(context.getSessionData("moneyRew") == null)
text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set money reward (None set)\n";
else{
int moneyRew = (Integer) context.getSessionData("moneyRew");
text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set money reward (" + moneyRew + " " + (moneyRew > 1 ? Quests.getCurrency(true) : Quests.getCurrency(false)) + ")\n";
}
if(context.getSessionData("questPointsRew") == null)
text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set Quest Points reward (None set)\n";
else{
text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set Quest Points reward (" + context.getSessionData("questPointsRew") + " Quest Points)\n";
}
if(context.getSessionData("itemIdRews") == null)
text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Set item rewards (None set)\n";
else{
text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Set item rewards\n";
List<Integer> ids = (List<Integer>) context.getSessionData("itemIdRews");
List<Integer> amounts = (List<Integer>) context.getSessionData("itemAmountRews");
for(int i : ids){
text += GRAY + " - " + AQUA + Quester.prettyItemString(i) + YELLOW + " x " + DARKAQUA + amounts.get(ids.indexOf(i)) + "\n";
}
}
if(context.getSessionData("expRew") == null)
text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Set experience reward (None set)\n";
else{
text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Set experience reward (" + context.getSessionData("expRew") + " points)\n";
}
if(context.getSessionData("commandRews") == null)
text += BLUE + "" + BOLD + "5" + RESET + YELLOW + " - Set command rewards (None set)\n";
else{
text += BLUE + "" + BOLD + "5" + RESET + YELLOW + " - Set command rewards\n";
List<String> commands = (List<String>) context.getSessionData("commandRews");
for(String cmd : commands){
text += GRAY + " - " + AQUA + cmd + "\n";
}
}
if(context.getSessionData("permissionRews") == null)
text += BLUE + "" + BOLD + "6" + RESET + YELLOW + " - Set permission rewards (None set)\n";
else{
text += BLUE + "" + BOLD + "6" + RESET + YELLOW + " - Set permission rewards\n";
List<String> permissions = (List<String>) context.getSessionData("permissionRews");
for(String perm : permissions){
text += GRAY + " - " + AQUA + perm + "\n";
}
}
//mcMMO
if(Quests.mcmmo != null){
if(context.getSessionData("mcMMOSkillRews") == null)
text += BLUE + "" + BOLD + "7" + RESET + YELLOW + " - Set mcMMO skill rewards (None set)\n";
else{
text += BLUE + "" + BOLD + "7" + RESET + YELLOW + " - Set mcMMO skill rewards\n";
List<String> skills = (List<String>) context.getSessionData("mcMMOSkillRews");
List<Integer> amounts = (List<Integer>) context.getSessionData("mcMMOSkillAmounts");
for(String skill : skills){
text += GRAY + " - " + AQUA + skill + GRAY + " x " + DARKAQUA + amounts.get(skills.indexOf(skill)) + "\n";
}
}
}
//
if(Quests.mcmmo != null)
text += GREEN + "" + BOLD + "8" + RESET + YELLOW + " - Done";
else
text += GREEN + "" + BOLD + "7" + RESET + YELLOW + " - Done";
return text;
}
@Override
protected Prompt acceptValidatedInput(ConversationContext context, String input){
if(input.equalsIgnoreCase("1")){
return new MoneyPrompt();
}else if(input.equalsIgnoreCase("2")){
return new QuestPointsPrompt();
}else if(input.equalsIgnoreCase("3")){
return new ItemListPrompt();
}else if(input.equalsIgnoreCase("4")){
return new ExperiencePrompt();
}else if(input.equalsIgnoreCase("5")){
return new CommandsPrompt();
}else if(input.equalsIgnoreCase("6")){
return new PermissionsPrompt();
}else if(input.equalsIgnoreCase("7")){
if(Quests.mcmmo != null)
return new mcMMOListPrompt();
else
return factory.returnToMenu();
}else if(input.equalsIgnoreCase("8")){
if(Quests.mcmmo != null)
return factory.returnToMenu();
else
return new RewardsPrompt(quests, factory);
}
return null;
}
private class MoneyPrompt extends NumericPrompt {
@Override
public String getPromptText(ConversationContext context){
return YELLOW + "Enter amount of " + AQUA + (Quests.economy.currencyNamePlural().isEmpty() ? "Money" : Quests.economy.currencyNamePlural()) + YELLOW + ", or 0 to clear the money reward, or -1 to cancel";
}
@Override
protected Prompt acceptValidatedInput(ConversationContext context, Number input){
if(input.intValue() < -1){
context.getForWhom().sendRawMessage(RED + "Amount must be positive!");
return new MoneyPrompt();
}else if(input.intValue() == 0)
context.setSessionData("moneyRew", null);
else if(input.intValue() != -1)
context.setSessionData("moneyRew", input.intValue());
return new RewardsPrompt(quests, factory);
}
}
private class ExperiencePrompt extends NumericPrompt {
@Override
public String getPromptText(ConversationContext context){
return YELLOW + "Enter amount of experience, or 0 to clear the experience reward, or -1 to cancel";
}
@Override
protected Prompt acceptValidatedInput(ConversationContext context, Number input){
if(input.intValue() < -1){
context.getForWhom().sendRawMessage(RED + "Amount must be positive!");
return new ExperiencePrompt();
}else if(input.intValue() == -1)
context.setSessionData("expRew", null);
else if(input.intValue() != 0)
context.setSessionData("expRew", input.intValue());
return new RewardsPrompt(quests, factory);
}
}
private class QuestPointsPrompt extends NumericPrompt {
@Override
public String getPromptText(ConversationContext context){
return YELLOW + "Enter amount of Quest Points, or 0 to clear the Quest Points reward, or -1 to cancel";
}
@Override
protected Prompt acceptValidatedInput(ConversationContext context, Number input){
if(input.intValue() < -1){
context.getForWhom().sendRawMessage(RED + "Amount must be positive!");
return new QuestPointsPrompt();
}else if(input.intValue() == -1)
context.setSessionData("questPointsRew", null);
else if(input.intValue() != 0)
context.setSessionData("questPointsRew", input.intValue());
return new RewardsPrompt(quests, factory);
}
}
private class ItemListPrompt extends FixedSetPrompt {
public ItemListPrompt(){
super("1", "2", "3", "4");
}
@Override
public String getPromptText(ConversationContext context){
String text = GOLD + "- Item Rewards -\n";
if(context.getSessionData("itemIdRews") == null){
text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set item IDs (None set)\n";
text += GRAY + "2 - Set item amounts (No IDs set)\n";
text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Clear\n";
text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Done";
}else{
text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set item IDs\n";
for(Integer i : getItemIds(context)){
text += GRAY + " - " + AQUA + Quester.prettyItemString(i) + "\n";
}
if(context.getSessionData("itemAmountRews") == null){
text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set item amounts (None set)\n";
}else{
text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set item amounts\n";
for(Integer i : getItemAmounts(context)){
text += GRAY + " - " + AQUA + i + "\n";
}
}
text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Clear\n";
text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Done";
}
return text;
}
@Override
protected Prompt acceptValidatedInput(ConversationContext context, String input){
if(input.equalsIgnoreCase("1")){
return new ItemIdsPrompt();
}else if(input.equalsIgnoreCase("2")){
if(context.getSessionData("itemIdRews") == null){
context.getForWhom().sendRawMessage(RED + "You must set item IDs first!");
return new ItemListPrompt();
}else{
return new ItemAmountsPrompt();
}
}else if(input.equalsIgnoreCase("3")){
context.getForWhom().sendRawMessage(YELLOW + "Item rewards cleared.");
context.setSessionData("itemIdRews", null);
context.setSessionData("itemAmountRews", null);
return new ItemListPrompt();
}else if(input.equalsIgnoreCase("4")){
int one;
int two;
if(context.getSessionData("itemIdRews") != null)
one = ((List<Integer>) context.getSessionData("itemIdRews")).size();
else
one = 0;
if(context.getSessionData("itemAmountRews") != null)
two = ((List<Integer>) context.getSessionData("itemAmountRews")).size();
else
two = 0;
if(one == two)
return new RewardsPrompt(quests, factory);
else{
context.getForWhom().sendRawMessage(RED + "The " + GOLD + "item IDs list " + RED + "and " + GOLD + "item amounts list " + RED + "are not the same size!");
return new ItemListPrompt();
}
}
return null;
}
private List<Integer> getItemIds(ConversationContext context){
return (List<Integer>) context.getSessionData("itemIdRews");
}
private List<Integer> getItemAmounts(ConversationContext context){
return (List<Integer>) context.getSessionData("itemAmountRews");
}
}
private class ItemIdsPrompt extends StringPrompt {
@Override
public String getPromptText(ConversationContext context){
return YELLOW + "Enter item IDs separating each one by a space, or enter \'cancel\' to return.";
}
@Override
public Prompt acceptInput(ConversationContext context, String input){
if(input.equalsIgnoreCase("cancel") == false){
String[] args = input.split(" ");
LinkedList<Integer> ids = new LinkedList<Integer>();
for(String s : args){
try{
if(Material.getMaterial(Integer.parseInt(s)) != null){
if(ids.contains(Integer.parseInt(s)) == false){
ids.add(Integer.parseInt(s));
}else{
context.getForWhom().sendRawMessage(RED + "List contains duplicates!");
return new ItemIdsPrompt();
}
}else{
context.getForWhom().sendRawMessage(PINK + s + RED + " is not a valid item ID!");
return new ItemIdsPrompt();
}
}catch (Exception e){
context.getForWhom().sendRawMessage(RED + "Invalid entry " + PINK + s + RED + ". Input was not a list of numbers!");
return new ItemIdsPrompt();
}
}
context.setSessionData("itemIdRews", ids);
}
return new ItemListPrompt();
}
}
private class ItemAmountsPrompt extends StringPrompt {
@Override
public String getPromptText(ConversationContext context){
return YELLOW + "Enter item amounts (numbers) separating each one by a space, or enter \'cancel\' to return.";
}
@Override
public Prompt acceptInput(ConversationContext context, String input){
if(input.equalsIgnoreCase("cancel") == false){
String[] args = input.split(" ");
LinkedList<Integer> amounts = new LinkedList<Integer>();
for(String s : args){
try{
if(Integer.parseInt(s) > 0)
amounts.add(Integer.parseInt(s));
else{
context.getForWhom().sendRawMessage(PINK + s + RED + " is not greater than 0!");
return new ItemAmountsPrompt();
}
}catch (Exception e){
context.getForWhom().sendRawMessage(RED + "Invalid entry " + PINK + s + RED + ". Input was not a list of numbers!");
return new ItemAmountsPrompt();
}
}
context.setSessionData("itemAmountRews", amounts);
}
return new ItemListPrompt();
}
}
private class CommandsPrompt extends StringPrompt {
@Override
public String getPromptText(ConversationContext context){
String note = GOLD + "\nNote: You may put <player> to specify the player who completed the Quest. e.g. " + AQUA + BOLD + ITALIC + "smite <player>" + RESET;
return YELLOW + "Enter command rewards separating each one by a " + BOLD + "comma" + RESET + YELLOW + ", or enter \'clear\' to clear the list, or enter \'cancel\' to return." + note;
}
@Override
public Prompt acceptInput(ConversationContext context, String input){
if(input.equalsIgnoreCase("cancel") == false && input.equalsIgnoreCase("clear") == false){
String[] args = input.split(",");
LinkedList<String> commands = new LinkedList<String>();
for(String s : args){
if(s.startsWith("/"))
s = s.substring(1);
commands.add(s);
}
context.setSessionData("commandRews", commands);
}else if(input.equalsIgnoreCase("clear")){
context.setSessionData("commandRews", null);
}
return new RewardsPrompt(quests, factory);
}
}
private class PermissionsPrompt extends StringPrompt {
@Override
public String getPromptText(ConversationContext context){
return YELLOW + "Enter permission rewards separating each one by a space, or enter \'clear\' to clear the list, or enter \'cancel\' to return.";
}
@Override
public Prompt acceptInput(ConversationContext context, String input){
if(input.equalsIgnoreCase("cancel") == false && input.equalsIgnoreCase("clear") == false){
String[] args = input.split(" ");
LinkedList<String> permissions = new LinkedList<String>();
permissions.addAll(Arrays.asList(args));
context.setSessionData("permissionRews", permissions);
}else if(input.equalsIgnoreCase("clear")){
context.setSessionData("permissionRews", null);
}
return new RewardsPrompt(quests, factory);
}
}
//mcMMO
private class mcMMOListPrompt extends FixedSetPrompt {
public mcMMOListPrompt(){
super("1", "2", "3", "4");
}
@Override
public String getPromptText(ConversationContext context){
String text = GOLD + "- mcMMO Rewards -\n";
if(context.getSessionData("mcMMOSkillRews") == null){
text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set skills (None set)\n";
text += GRAY + "2 - Set skill amounts (No skills set)\n";
text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Clear\n";
text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Done";
}else{
text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set skills\n";
for(String s : getSkills(context)){
text += GRAY + " - " + AQUA + s + "\n";
}
if(context.getSessionData("mcMMOAmountRews") == null){
text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set skill amounts (None set)\n";
}else{
text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set skill amounts\n";
for(Integer i : getSkillAmounts(context)){
text += GRAY + " - " + AQUA + i + "\n";
}
}
text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Clear\n";
text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Done";
}
return text;
}
@Override
protected Prompt acceptValidatedInput(ConversationContext context, String input){
if(input.equalsIgnoreCase("1")){
return new ItemIdsPrompt();
}else if(input.equalsIgnoreCase("2")){
if(context.getSessionData("itemIdRews") == null){
context.getForWhom().sendRawMessage(RED + "You must set skills first!");
return new mcMMOListPrompt();
}else{
return new mcMMOAmountsPrompt();
}
}else if(input.equalsIgnoreCase("3")){
context.getForWhom().sendRawMessage(YELLOW + "mcMMO rewards cleared.");
context.setSessionData("mcMMOSkillRews", null);
context.setSessionData("mcMMOAmountRews", null);
return new mcMMOListPrompt();
}else if(input.equalsIgnoreCase("4")){
int one;
int two;
if(context.getSessionData("mcMMOSkillRews") != null)
one = ((List<Integer>) context.getSessionData("mcMMOSkillRews")).size();
else
one = 0;
if(context.getSessionData("mcMMOAmountRews") != null)
two = ((List<Integer>) context.getSessionData("mcMMOAmountRews")).size();
else
two = 0;
if(one == two)
return new RewardsPrompt(quests, factory);
else{
context.getForWhom().sendRawMessage(RED + "The " + GOLD + "skills list " + RED + "and " + GOLD + "skill amounts list " + RED + "are not the same size!");
return new mcMMOListPrompt();
}
}
return null;
}
private List<String> getSkills(ConversationContext context){
return (List<String>) context.getSessionData("mcMMORews");
}
private List<Integer> getSkillAmounts(ConversationContext context){
return (List<Integer>) context.getSessionData("mcMMOAmountRews");
}
}
private class mcMMOSkillsPrompt extends StringPrompt {
@Override
public String getPromptText(ConversationContext context){
String skillList =
GOLD + "-Skill List-\n" +
AQUA + "Acrobatics\n" +
AQUA + "All\n" +
AQUA + "Archery\n" +
AQUA + "Axes\n" +
AQUA + "Excavation\n" +
AQUA + "Fishing\n" +
AQUA + "Herbalism\n" +
AQUA + "Mining\n" +
AQUA + "Repair\n" +
AQUA + "Swords\n" +
AQUA + "Taming\n" +
AQUA + "Unarmed\n" +
AQUA + "Woodcutting\n\n";
return skillList + YELLOW + "Enter mcMMO skills, separating each one by a space, or enter \'cancel\' to return."
+ "\n" + GOLD + "Note: The \'All\' option will give levels to all skills.";
}
@Override
public Prompt acceptInput(ConversationContext context, String input){
if(input.equalsIgnoreCase("cancel") == false){
String[] args = input.split(" ");
LinkedList<String> skills = new LinkedList<String>();
for(String s : args){
if(Quests.getMcMMOSkill(s) != null){
if(skills.contains(s) == false){
skills.add(Quester.getCapitalized(s));
}else{
context.getForWhom().sendRawMessage(RED + "List contains duplicates!");
return new mcMMOSkillsPrompt();
}
}else{
context.getForWhom().sendRawMessage(PINK + s + RED + " is not a valid mcMMO skill!");
return new mcMMOSkillsPrompt();
}
}
context.setSessionData("mcMMOSkillRews", skills);
}
return new mcMMOListPrompt();
}
}
private class mcMMOAmountsPrompt extends StringPrompt {
@Override
public String getPromptText(ConversationContext context){
return YELLOW + "Enter skill amounts (numbers), separating each one by a space, or enter \'cancel\' to return.";
}
@Override
public Prompt acceptInput(ConversationContext context, String input){
if(input.equalsIgnoreCase("cancel") == false){
String[] args = input.split(" ");
LinkedList<Integer> amounts = new LinkedList<Integer>();
for(String s : args){
try{
if(Integer.parseInt(s) > 0)
amounts.add(Integer.parseInt(s));
else{
context.getForWhom().sendRawMessage(PINK + s + RED + " is not greater than 0!");
return new mcMMOAmountsPrompt();
}
}catch (Exception e){
context.getForWhom().sendRawMessage(RED + "Invalid entry " + PINK + s + RED + ". Input was not a list of numbers!");
return new mcMMOAmountsPrompt();
}
}
context.setSessionData("mcMMOAmountRews", amounts);
}
return new mcMMOListPrompt();
}
}
}

View File

@ -0,0 +1,245 @@
package me.blackvein.quests.prompts;
import me.blackvein.quests.QuestFactory;
import org.bukkit.ChatColor;
import org.bukkit.conversations.ConversationContext;
import org.bukkit.conversations.Prompt;
import org.bukkit.conversations.StringPrompt;
public class StagesPrompt extends StringPrompt{
private final QuestFactory questFactory;
static final ChatColor BOLD = ChatColor.BOLD;
static final ChatColor ITALIC = ChatColor.ITALIC;
static final ChatColor AQUA = ChatColor.AQUA;
static final ChatColor DARKAQUA = ChatColor.DARK_AQUA;
static final ChatColor BLUE = ChatColor.BLUE;
static final ChatColor GOLD = ChatColor.GOLD;
static final ChatColor PINK = ChatColor.LIGHT_PURPLE;
static final ChatColor PURPLE = ChatColor.DARK_PURPLE;
static final ChatColor GREEN = ChatColor.GREEN;
static final ChatColor RED = ChatColor.RED;
static final ChatColor DARKRED = ChatColor.DARK_RED;
static final ChatColor YELLOW = ChatColor.YELLOW;
static final ChatColor GRAY = ChatColor.GRAY;
static final ChatColor RESET = ChatColor.RESET;
public StagesPrompt(QuestFactory qf){
questFactory = qf;
}
@Override
public String getPromptText(ConversationContext cc) {
String text = PINK + "- " + PURPLE + "Stages" + PINK + " -\n";
int stages = getStages(cc);
for(int i = 1; i <= stages; i++){
text += BOLD + "" + GREEN + i + ". " + RESET + GOLD + "Edit Stage " + i + "\n";
}
stages++;
text += "\n" + BOLD + "" + GREEN + stages + ". " + RESET + YELLOW + "Add new Stage";
stages++;
text += "\n" + BOLD + "" + BLUE + stages + ". " + RESET + YELLOW + "Done";
return text;
}
@Override
public Prompt acceptInput(ConversationContext cc, String string) {
int i;
try{
i = Integer.parseInt(string);
}catch(Exception e){
return new StagesPrompt(questFactory);
}
int stages = getStages(cc);
if(i < 0)
return new StagesPrompt(questFactory);
else if(i < (stages + 1) && i > 0)
return new CreateStagePrompt((i), questFactory, questFactory.quests.citizens);
else if(i == (stages + 1))
return new CreateStagePrompt((stages + 1), questFactory, questFactory.quests.citizens);
else if(i == (stages + 2))
return questFactory.returnToMenu();
else
return new StagesPrompt(questFactory);
}
public static int getStages(ConversationContext cc){
int num = 1;
while(true){
if(cc.getSessionData("stage" + num) != null)
num++;
else
break;
}
return (num - 1);
}
public static void deleteStage(ConversationContext cc, int stageNum){
int stages = getStages(cc);
int current = stageNum;
String pref = "stage" + current;
String newPref;
boolean last = false;
if(stageNum == stages)
last = true;
while(true){
if(!last){
current++;
if(current > stages)
break;
pref = "stage" + current;
newPref = "stage" + (current - 1);
cc.setSessionData(newPref + "breakIds", cc.getSessionData(pref + "breakIds"));
cc.setSessionData(newPref + "breakAmounts", cc.getSessionData(pref + "breakAmounts"));
cc.setSessionData(newPref + "damageIds", cc.getSessionData(pref + "damageIds"));
cc.setSessionData(newPref + "damageAmounts", cc.getSessionData(pref + "damageAmounts"));
cc.setSessionData(newPref + "placeIds", cc.getSessionData(pref + "placeIds"));
cc.setSessionData(newPref + "placeAmounts", cc.getSessionData(pref + "placeAmounts"));
cc.setSessionData(newPref + "useIds", cc.getSessionData(pref + "useIds"));
cc.setSessionData(newPref + "useAmounts", cc.getSessionData(pref + "useAmounts"));
cc.setSessionData(newPref + "cutIds", cc.getSessionData(pref + "cutIds"));
cc.setSessionData(newPref + "cutAmounts", cc.getSessionData(pref + "cutAmounts"));
cc.setSessionData(newPref + "fish", cc.getSessionData(pref + "fish"));
cc.setSessionData(newPref + "playerKill", cc.getSessionData(pref + "playerKill"));
cc.setSessionData(newPref + "enchantTypes", cc.getSessionData(pref + "enchantTypes"));
cc.setSessionData(newPref + "enchantIds", cc.getSessionData(pref + "enchantIds"));
cc.setSessionData(newPref + "enchantAmounts", cc.getSessionData(pref + "enchantAmounts"));
cc.setSessionData(newPref + "deliveryIds", cc.getSessionData(pref + "deliveryIds"));
cc.setSessionData(newPref + "deliveryAmounts", cc.getSessionData(pref + "deliveryAmounts"));
cc.setSessionData(newPref + "deliveryNPCs", cc.getSessionData(pref + "deliveryNPCs"));
cc.setSessionData(newPref + "deliveryMessages", cc.getSessionData(pref + "deliveryMessages"));
cc.setSessionData(newPref + "npcIdsToTalkTo", cc.getSessionData(pref + "npcIdsToTalkTo"));
cc.setSessionData(newPref + "mobTypes", cc.getSessionData(pref + "mobTypes"));
cc.setSessionData(newPref + "mobAmounts", cc.getSessionData(pref + "mobAmounts"));
cc.setSessionData(newPref + "killLocations", cc.getSessionData(pref + "killLocations"));
cc.setSessionData(newPref + "killLocationRadii", cc.getSessionData(pref + "killLocationRadii"));
cc.setSessionData(newPref + "killLocationNames", cc.getSessionData(pref + "killLocationNames"));
cc.setSessionData(newPref + "reachLocations", cc.getSessionData(pref + "reachLocations"));
cc.setSessionData(newPref + "reachLocationRadii", cc.getSessionData(pref + "reachLocationRadii"));
cc.setSessionData(newPref + "reachLocationNames", cc.getSessionData(pref + "reachLocationNames"));
cc.setSessionData(newPref + "tameTypes", cc.getSessionData(pref + "tameTypes"));
cc.setSessionData(newPref + "tameAmounts", cc.getSessionData(pref + "tameAmounts"));
cc.setSessionData(newPref + "shearColors", cc.getSessionData(pref + "shearColors"));
cc.setSessionData(newPref + "shearAmounts", cc.getSessionData(pref + "shearAmounts"));
cc.setSessionData(newPref + "event", cc.getSessionData(pref + "event"));
cc.setSessionData(newPref + "delay", cc.getSessionData(pref + "delay"));
cc.setSessionData(newPref + "delayMessage", cc.getSessionData(pref + "delayMessage"));
cc.setSessionData(newPref + "denizen", cc.getSessionData(pref + "denizen"));
}
cc.setSessionData(pref + "breakIds", null);
cc.setSessionData(pref + "breakAmounts", null);
cc.setSessionData(pref + "damageIds", null);
cc.setSessionData(pref + "damageAmounts", null);
cc.setSessionData(pref + "placeIds", null);
cc.setSessionData(pref + "placeAmounts", null);
cc.setSessionData(pref + "useIds", null);
cc.setSessionData(pref + "useAmounts", null);
cc.setSessionData(pref + "cutIds", null);
cc.setSessionData(pref + "cutAmounts", null);
cc.setSessionData(pref + "fish", null);
cc.setSessionData(pref + "playerKill", null);
cc.setSessionData(pref + "enchantTypes", null);
cc.setSessionData(pref + "enchantIds", null);
cc.setSessionData(pref + "enchantAmounts", null);
cc.setSessionData(pref + "deliveryIds", null);
cc.setSessionData(pref + "deliveryAmounts", null);
cc.setSessionData(pref + "deliveryNPCs", null);
cc.setSessionData(pref + "deliveryMessages", null);
cc.setSessionData(pref + "npcIdsToTalkTo", null);
cc.setSessionData(pref + "mobTypes", null);
cc.setSessionData(pref + "mobAmounts", null);
cc.setSessionData(pref + "killLocations", null);
cc.setSessionData(pref + "killLocationRadii", null);
cc.setSessionData(pref + "killLocationNames", null);
cc.setSessionData(pref + "reachLocations", null);
cc.setSessionData(pref + "reachLocationRadii", null);
cc.setSessionData(pref + "reachLocationNames", null);
cc.setSessionData(pref + "tameTypes", null);
cc.setSessionData(pref + "tameAmounts", null);
cc.setSessionData(pref + "shearColors", null);
cc.setSessionData(pref + "shearAmounts", null);
cc.setSessionData(pref + "event", null);
cc.setSessionData(pref + "delay", null);
cc.setSessionData(pref + "delayMessage", null);
cc.setSessionData(pref + "denizen", null);
if(last)
break;
}
if(!last)
cc.setSessionData("stage" + (current - 1), null);
else
cc.setSessionData("stage" + (current), null);
}
}

View File

@ -0,0 +1,52 @@
stage#breakIds
stage#breakAmounts
stage#damageIds
stage#damageAmounts
stage#placeIds
stage#placeAmounts
stage#useIds
stage#useAmounts
stage#cutIds
stage#cutAmounts
stage#fish
stage#playerKill
stage#enchantTypes
stage#enchantIds
stage#enchantAmounts
stage#deliveryIds
stage#deliveryAmounts
stage#deliveryNPCs
stage#deliveryMessages
stage#npcIdsToTalkTo
stage#mobTypes
stage#mobAmounts
stage#killLocations
stage#killLocationRadii
stage#killLocationNames
stage#reachLocations
stage#reachLocationRadii
stage#reachLocationNames
stage#tameTypes
stage#tameAmounts
stage#shearColors
stage#shearAmounts
stage#event
stage#delay
stage#delayMessage
stage#denizen

View File

@ -1,6 +1,6 @@
name: Quests
main: me.blackvein.quests.Quests
version: 1.5.1c
version: 1.5.4
description: Player questing system
website: http://dev.bukkit.org/server-mods/quests/
dev-url: https://github.com/Blackvein/Quests/
@ -55,6 +55,12 @@ permissions:
quests.admin.reload:
description: Reload all Quests
default: op
quests.editor.create:
description: Create new Quests
default: op
quests.editor.events:
description: Create/Edit/Delete Events
default: op
commands:
quests:
description: Quests command
@ -66,6 +72,6 @@ commands:
quest:
description: Quest command
permission: quests.quest
editor:
description: Editor
events:
description: Events
permission: quests.editor

View File

@ -1,22 +1,24 @@
quests:
Miner:
name: 'Stone Miner'
ask-message: '<yellow>Mine <purple>10<yellow> blocks of <purple>Stone<yellow>, and retrieve <purple>10<yellow> pieces of <purple>Cobblestone<yellow>.'
ask-message: '<yellow>Could you mine <purple>10<yellow> blocks of <purple>Stone<yellow>, and deliver the <purple>10<yellow> pieces of <purple>Cobblestone<yellow> to me?.'
finish-message: '<yellow>Well done. Here is your reward.'
redo-delay: 1800000
requirements:
item-ids: [270]
item-amounts: [1]
remove-items: [false]
item-ids:
- 270
item-amounts:
- 1
remove-items:
- false
fail-requirement-message: '<red>You must have a <purple>Wooden Pickaxe<red> first.'
stages:
ordered:
1:
break-block-ids: [1]
break-block-amounts: [10]
collect-item-ids: [4]
collect-item-amounts: [10]
quest-items: [true]
break-block-ids:
- 1
break-block-amounts:
- 10
rewards:
money: 1000
@ -28,23 +30,26 @@ quests:
ask-message: '<yellow>Kill an assortment of Mobs.'
finish-message: '<yellow>Excellent. Here is a <purple>Diamond Sword<yellow>.'
requirements:
quests: [Stone Miner]
quests:
- Stone Miner
fail-requirement-message: '<red>Complete <purple>Stone Miner<red> first.'
stages:
ordered:
1:
mobs-to-kill: [Pig]
mob-amounts: [3]
finished: '<yellow>Now kill <purple>2 Zombies<yellow>.'
mobs-to-kill:
- Pig
mob-amounts:
- 3
2:
mobs-to-kill: [Zombie]
mob-amounts: [2]
finished: '<yellow>Finally, kill <purple>1 Skeleton<yellow>.'
mobs-to-kill:
- Zombie
mob-amounts:
- 2
3:
mobs-to-kill: [Skeleton]
mob-amounts: [1]
mobs-to-kill:
- Skeleton
mob-amounts:
- 1
rewards:
item-ids: [276]