NEW conditions editor, part 3. Fixes #1007

This commit is contained in:
PikaMug 2020-07-14 18:20:20 -04:00
parent 2962b6ff79
commit 50d3f655dd
9 changed files with 271 additions and 14 deletions

View File

@ -591,6 +591,12 @@ public class Quester {
msg += ChatColor.AQUA + "\n - " + ItemUtil.getPrettyItemName(is.getType().name());
}
p.sendMessage(ChatColor.YELLOW + msg);
} else if (c.getBiomesWhileStayingWithin() != null) {
String msg = "- " + Lang.get("conditionEditorStayingWithinBiome");
for (String b : c.getBiomesWhileStayingWithin()) {
msg += ChatColor.AQUA + "\n - " + MiscUtil.snakeCaseToUpperCamelCase(b);
}
p.sendMessage(ChatColor.YELLOW + msg);
}
}
}

View File

@ -48,6 +48,7 @@ import org.bukkit.Effect;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.command.CommandExecutor;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.InvalidConfigurationException;
@ -3332,6 +3333,22 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener
}
condition.setItemsWhileHoldingMainHand(temp);
}
if (data.contains(conditionKey + "stay-within-biome")) {
if (ConfigUtil.checkList(data.getList(conditionKey + "stay-within-biome"), String.class)) {
LinkedList<String> biomes = new LinkedList<String>();
for (String s : data.getStringList(conditionKey + "stay-within-biome")) {
Biome b = MiscUtil.getProperBiome(s);
if (b == null) {
throw new ConditionFormatException("stay-within-biome is not a valid biome",
conditionKey);
}
biomes.add(s);
}
condition.setBiomesWhileStayingWithin(biomes);
} else {
throw new ConditionFormatException("stay-within-biome is not a list of biomes", conditionKey);
}
}
return condition;
}

View File

@ -21,13 +21,16 @@ import me.blackvein.quests.Quest;
import me.blackvein.quests.Quester;
import me.blackvein.quests.Quests;
import me.blackvein.quests.util.ItemUtil;
import me.blackvein.quests.util.MiscUtil;
public class Condition {
@SuppressWarnings("unused")
private Quests plugin;
private String name = "";
private boolean failQuest = false;
private LinkedList<ItemStack> itemsWhileHoldingMainHand = new LinkedList<ItemStack>();
private LinkedList<String> biomesWhileStayingWithin = new LinkedList<String>();
public Condition(final Quests plugin) {
this.plugin = plugin;
@ -56,10 +59,18 @@ public class Condition {
public void setItemsWhileHoldingMainHand(LinkedList<ItemStack> itemsWhileHoldingMainHand) {
this.itemsWhileHoldingMainHand = itemsWhileHoldingMainHand;
}
public LinkedList<String> getBiomesWhileStayingWithin() {
return biomesWhileStayingWithin;
}
public void setBiomesWhileStayingWithin(LinkedList<String> biomesWhileStayingWithin) {
this.biomesWhileStayingWithin = biomesWhileStayingWithin;
}
@SuppressWarnings("deprecation")
public boolean check(Quester quester, Quest quest) {
Player player = quester.getPlayer();
final Player player = quester.getPlayer();
if (itemsWhileHoldingMainHand.isEmpty() == false) {
for (ItemStack is : itemsWhileHoldingMainHand) {
if (ItemUtil.compareItems(player.getItemInHand(), is, true, true) == 0) {
@ -69,6 +80,16 @@ public class Condition {
+ ItemUtil.compareItems(player.getItemInHand(), is, true, true));
}
}
} else if (biomesWhileStayingWithin.isEmpty() == false) {
for (String b : biomesWhileStayingWithin) {
if (player.getWorld().getBiome(player.getLocation().getBlockX(), player.getLocation().getBlockZ())
.name().equalsIgnoreCase(MiscUtil.getProperBiome(b).name())) {
return true;
} else {
System.out.println("DEBUG: condition biome does not match for= "
+ MiscUtil.getProperBiome(b));
}
}
}
return false;
}

View File

@ -85,6 +85,12 @@ public class ConditionFactory implements ConversationAbandonedListener {
items.addAll(condition.getItemsWhileHoldingMainHand());
context.setSessionData(CK.C_WHILE_HOLDING_MAIN_HAND, items);
}
if (condition.getBiomesWhileStayingWithin() != null
&& condition.getBiomesWhileStayingWithin().isEmpty() == false) {
LinkedList<String> biomes = new LinkedList<String>();
biomes.addAll(condition.getBiomesWhileStayingWithin());
context.setSessionData(CK.C_WHILE_WITHIN_BIOME, biomes);
}
}
public void clearData(ConversationContext context) {
@ -92,6 +98,7 @@ public class ConditionFactory implements ConversationAbandonedListener {
context.setSessionData(CK.C_NAME, null);
context.setSessionData(CK.C_FAIL_QUEST, null);
context.setSessionData(CK.C_WHILE_HOLDING_MAIN_HAND, null);
context.setSessionData(CK.C_WHILE_WITHIN_BIOME, null);
}
public void deleteCondition(ConversationContext context) {
@ -171,6 +178,10 @@ public class ConditionFactory implements ConversationAbandonedListener {
section.set("hold-main-hand",
(LinkedList<ItemStack>) context.getSessionData(CK.C_WHILE_HOLDING_MAIN_HAND));
}
if (context.getSessionData(CK.C_WHILE_WITHIN_BIOME) != null) {
section.set("stay-within-biome",
(LinkedList<ItemStack>) context.getSessionData(CK.C_WHILE_WITHIN_BIOME));
}
try {
data.save(conditionsFile);
} catch (IOException e) {

View File

@ -27,6 +27,7 @@ import me.blackvein.quests.conditions.Condition;
import me.blackvein.quests.convo.conditions.ConditionsEditorNumericPrompt;
import me.blackvein.quests.convo.conditions.menu.ConditionMenuPrompt;
import me.blackvein.quests.convo.conditions.tasks.PlayerPrompt;
import me.blackvein.quests.convo.conditions.tasks.WorldPrompt;
import me.blackvein.quests.events.editor.conditions.ConditionsEditorPostOpenNumericPromptEvent;
import me.blackvein.quests.util.CK;
import me.blackvein.quests.util.Lang;
@ -40,7 +41,7 @@ public class ConditionMainPrompt extends ConditionsEditorNumericPrompt {
this.plugin = (Quests)context.getPlugin();
}
private final int size = 5;
private final int size = 6;
public int getSize() {
return size;
@ -55,10 +56,11 @@ public class ConditionMainPrompt extends ConditionsEditorNumericPrompt {
case 1:
case 2:
case 3:
return ChatColor.BLUE;
case 4:
return ChatColor.GREEN;
return ChatColor.BLUE;
case 5:
return ChatColor.GREEN;
case 6:
return ChatColor.RED;
default:
return null;
@ -70,12 +72,14 @@ public class ConditionMainPrompt extends ConditionsEditorNumericPrompt {
case 1:
return ChatColor.YELLOW + Lang.get("conditionEditorSetName");
case 2:
return ChatColor.GOLD + Lang.get("conditionEditorPlayer");
return ChatColor.GOLD + Lang.get("eventEditorPlayer");
case 3:
return ChatColor.YELLOW + Lang.get("conditionEditorFailQuest") + ":";
return ChatColor.GOLD + Lang.get("conditionEditorWorld");
case 4:
return ChatColor.GREEN + Lang.get("save");
return ChatColor.YELLOW + Lang.get("conditionEditorFailQuest") + ":";
case 5:
return ChatColor.GREEN + Lang.get("save");
case 6:
return ChatColor.RED + Lang.get("exit");
default:
return null;
@ -86,14 +90,15 @@ public class ConditionMainPrompt extends ConditionsEditorNumericPrompt {
switch (number) {
case 1:
case 2:
return "";
case 3:
return "";
case 4:
if (context.getSessionData(CK.C_FAIL_QUEST) == null) {
context.setSessionData(CK.C_FAIL_QUEST, Lang.get("noWord"));
}
return "" + ChatColor.AQUA + context.getSessionData(CK.C_FAIL_QUEST);
case 4:
case 5:
case 6:
return "";
default:
return null;
@ -122,6 +127,8 @@ public class ConditionMainPrompt extends ConditionsEditorNumericPrompt {
case 2:
return new PlayerPrompt(context);
case 3:
return new WorldPrompt(context);
case 4:
String s = (String) context.getSessionData(CK.C_FAIL_QUEST);
if (s.equalsIgnoreCase(Lang.get("yesWord"))) {
context.setSessionData(CK.C_FAIL_QUEST, Lang.get("noWord"));
@ -129,13 +136,13 @@ public class ConditionMainPrompt extends ConditionsEditorNumericPrompt {
context.setSessionData(CK.C_FAIL_QUEST, Lang.get("yesWord"));
}
return new ConditionMainPrompt(context);
case 4:
case 5:
if (context.getSessionData(CK.C_OLD_CONDITION) != null) {
return new ConditionSavePrompt((String) context.getSessionData(CK.C_OLD_CONDITION));
} else {
return new ConditionSavePrompt(null);
}
case 5:
case 6:
return new ConditionExitPrompt();
default:
return new ConditionMainPrompt(context);

View File

@ -0,0 +1,174 @@
/*******************************************************************************************************
* Continued by PikaMug (formerly HappyPikachu) with permission from _Blackvein_. All rights reserved.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
* NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*******************************************************************************************************/
package me.blackvein.quests.convo.conditions.tasks;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.block.Biome;
import org.bukkit.conversations.ConversationContext;
import org.bukkit.conversations.Prompt;
import org.bukkit.entity.Player;
import me.blackvein.quests.convo.conditions.main.ConditionMainPrompt;
import me.blackvein.quests.convo.quests.QuestsEditorNumericPrompt;
import me.blackvein.quests.convo.quests.QuestsEditorStringPrompt;
import me.blackvein.quests.events.editor.quests.QuestsEditorPostOpenNumericPromptEvent;
import me.blackvein.quests.events.editor.quests.QuestsEditorPostOpenStringPromptEvent;
import me.blackvein.quests.util.CK;
import me.blackvein.quests.util.Lang;
import me.blackvein.quests.util.MiscUtil;
public class WorldPrompt extends QuestsEditorNumericPrompt {
public WorldPrompt(ConversationContext context) {
super(context);
}
private final int size = 2;
public int getSize() {
return size;
}
public String getTitle(ConversationContext context) {
return Lang.get("eventEditorPlayer");
}
public ChatColor getNumberColor(ConversationContext context, int number) {
switch (number) {
case 1:
return ChatColor.BLUE;
case 2:
return ChatColor.GREEN;
default:
return null;
}
}
public String getSelectionText(ConversationContext context, int number) {
switch(number) {
case 1:
return ChatColor.YELLOW + Lang.get("conditionEditorStayingWithinBiome");
case 2:
return ChatColor.GREEN + Lang.get("done");
default:
return null;
}
}
@SuppressWarnings("unchecked")
public String getAdditionalText(ConversationContext context, int number) {
switch(number) {
case 1:
if (context.getSessionData(CK.C_WHILE_WITHIN_BIOME) == null) {
return ChatColor.GRAY + "(" + Lang.get("noneSet") + ")";
} else {
String text = "\n";
for (String s: (List<String>) context.getSessionData(CK.C_WHILE_WITHIN_BIOME)) {
text += ChatColor.GRAY + " - " + ChatColor.BLUE + s + "\n";
}
return text;
}
case 2:
return "";
default:
return null;
}
}
@Override
public String getPromptText(ConversationContext context) {
QuestsEditorPostOpenNumericPromptEvent event = new QuestsEditorPostOpenNumericPromptEvent(context, this);
context.getPlugin().getServer().getPluginManager().callEvent(event);
String text = ChatColor.AQUA + "- " + getTitle(context) + " -\n";
for (int i = 1; i <= size; i++) {
text += getNumberColor(context, i) + "" + ChatColor.BOLD + i + ChatColor.RESET + " - "
+ getSelectionText(context, i) + " " + getAdditionalText(context, i) + "\n";
}
return text;
}
@Override
protected Prompt acceptValidatedInput(ConversationContext context, Number input) {
switch(input.intValue()) {
case 1:
return new BiomesPrompt(context);
case 2:
try {
return new ConditionMainPrompt(context);
} catch (Exception e) {
context.getForWhom().sendRawMessage(ChatColor.RED + Lang.get("itemCreateCriticalError"));
return Prompt.END_OF_CONVERSATION;
}
default:
return new WorldPrompt(context);
}
}
public class BiomesPrompt extends QuestsEditorStringPrompt {
public BiomesPrompt(ConversationContext context) {
super(context);
}
@Override
public String getTitle(ConversationContext context) {
return Lang.get("conditionEditorBiomesTitle");
}
@Override
public String getQueryText(ConversationContext context) {
return Lang.get("conditionEditorBiomesPrompt");
}
@Override
public String getPromptText(ConversationContext context) {
QuestsEditorPostOpenStringPromptEvent event = new QuestsEditorPostOpenStringPromptEvent(context, this);
context.getPlugin().getServer().getPluginManager().callEvent(event);
String biomes = ChatColor.LIGHT_PURPLE + getTitle(context) + "\n";
LinkedList<Biome> biomeArr = new LinkedList<Biome>(Arrays.asList(Biome.values()));
for (int i = 0; i < biomeArr.size(); i++) {
if (i < (biomeArr.size() - 1)) {
biomes += MiscUtil.snakeCaseToUpperCamelCase(biomeArr.get(i).name()) + ", ";
} else {
biomes += MiscUtil.snakeCaseToUpperCamelCase(biomeArr.get(i).name()) + "\n";
}
}
return biomes + ChatColor.YELLOW + getQueryText(context);
}
@Override
public Prompt acceptInput(ConversationContext context, String input) {
Player player = (Player) context.getForWhom();
if (input.equalsIgnoreCase(Lang.get("cmdCancel")) == false) {
LinkedList<String> biomes = new LinkedList<String>();
for (String s : input.split(" ")) {
if (MiscUtil.getProperBiome(s) != null) {
biomes.add(s);
} else {
player.sendMessage(ChatColor.LIGHT_PURPLE + s + " " + ChatColor.RED
+ Lang.get("conditionEditorInvalidBiome"));
return new BiomesPrompt(context);
}
}
context.setSessionData(CK.C_WHILE_WITHIN_BIOME, biomes);
}
return new WorldPrompt(context);
}
}
}

View File

@ -178,4 +178,5 @@ public class CK {
public static final String C_NAME = "conName";
public static final String C_FAIL_QUEST = "conFailQuest";
public static final String C_WHILE_HOLDING_MAIN_HAND = "conHoldingMainHand";
public static final String C_WHILE_WITHIN_BIOME = "conWithinBiome";
}

View File

@ -17,6 +17,7 @@ import java.util.LinkedList;
import org.bukkit.ChatColor;
import org.bukkit.DyeColor;
import org.bukkit.Effect;
import org.bukkit.block.Biome;
import org.bukkit.entity.EntityType;
public class MiscUtil {
@ -163,6 +164,22 @@ public class MiscUtil {
return null;
}
/**
* Gets Biome from name
*
* @param properName Name to get biome from
* @return Biome or null if invalid
*/
public static Biome getProperBiome(String properName) {
properName = properName.replace("_", "").replace(" ", "").toUpperCase();
for (Biome b : Biome.values()) {
if (b.name().replace("_", "").equalsIgnoreCase(properName)) {
return b;
}
}
return null;
}
/**
* Gets player-friendly name from type. 'LIGHT_BLUE' becomes 'Light Blue'
*

View File

@ -410,11 +410,14 @@ conditionEditorDeleted: "Condition deleted. Quest and condition data reloaded."
conditionEditorModifiedNote: 'Note: You have modified a condition that the following quests use:'
conditionEditorForcedToQuit: "If you save the condition, anyone who is actively doing any of these quests will be forced to quit them."
conditionEditorSetName: "Set name"
conditionEditorPlayer: "Player"
conditionEditorItemsInMainHand: "Holding in main hand"
conditionEditorSetItemsInMainHand: "Set holding in main hand"
conditionEditorWorld: "World"
conditionEditorFailQuest: "Fail the quest"
conditionEditorConditionCleared: "Condition cleared."
conditionEditorItemsInMainHand: "Holding in main hand"
conditionEditorBiomesTitle: "- Biomes -"
conditionEditorStayingWithinBiome: "Staying within biome"
conditionEditorBiomesPrompt: "Enter biome names, <space>, <cancel>"
conditionEditorInvalidBiome: "is not a valid biome name!"
reqSetMoney: "Set money requirement"
reqSetQuestPoints: "Set <points> requirement"
reqSetItem: "Set item requirements"