Quests/main/src/main/java/me/blackvein/quests/convo/conditions/menu/ConditionMenuPrompt.java

404 lines
18 KiB
Java

/*
* Copyright (c) 2014 PikaMug and contributors. 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.menu;
import me.blackvein.quests.Quest;
import me.blackvein.quests.Quests;
import me.blackvein.quests.Stage;
import me.blackvein.quests.conditions.Condition;
import me.blackvein.quests.convo.QuestsNumericPrompt;
import me.blackvein.quests.convo.conditions.ConditionsEditorNumericPrompt;
import me.blackvein.quests.convo.conditions.ConditionsEditorStringPrompt;
import me.blackvein.quests.convo.conditions.main.ConditionMainPrompt;
import me.blackvein.quests.events.editor.conditions.ConditionsEditorPostOpenNumericPromptEvent;
import me.blackvein.quests.events.editor.conditions.ConditionsEditorPostOpenStringPromptEvent;
import me.blackvein.quests.util.CK;
import me.blackvein.quests.util.Lang;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.conversations.ConversationContext;
import org.bukkit.conversations.Prompt;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
public class ConditionMenuPrompt extends ConditionsEditorNumericPrompt {
private final Quests plugin;
public ConditionMenuPrompt(final ConversationContext context) {
super(context);
this.plugin = (Quests)context.getPlugin();
}
private final int size = 4;
@Override
public int getSize() {
return size;
}
@Override
public String getTitle(final ConversationContext context) {
final String title = Lang.get("conditionEditorTitle");
return title + (plugin.hasLimitedAccess(context.getForWhom()) ? ChatColor.RED + " (" + Lang.get("trialMode")
+ ")" : "");
}
@Override
public ChatColor getNumberColor(final ConversationContext context, final int number) {
switch (number) {
case 1:
case 2:
case 3:
return ChatColor.BLUE;
case 4:
return ChatColor.RED;
default:
return null;
}
}
@Override
public String getSelectionText(final ConversationContext context, final int number) {
switch (number) {
case 1:
return ChatColor.YELLOW + Lang.get("conditionEditorCreate");
case 2:
return ChatColor.YELLOW + Lang.get("conditionEditorEdit");
case 3:
return ChatColor.YELLOW + Lang.get("conditionEditorDelete");
case 4:
return ChatColor.RED + Lang.get("exit");
default:
return null;
}
}
@Override
public String getAdditionalText(final ConversationContext context, final int number) {
return null;
}
@Override
public @NotNull String getBasicPromptText(final @NotNull ConversationContext context) {
final ConditionsEditorPostOpenNumericPromptEvent event
= new ConditionsEditorPostOpenNumericPromptEvent(context, this);
plugin.getServer().getPluginManager().callEvent(event);
final StringBuilder text = new StringBuilder(ChatColor.GOLD + getTitle(context));
for (int i = 1; i <= size; i++) {
text.append("\n").append(getNumberColor(context, i)).append(ChatColor.BOLD).append(i)
.append(ChatColor.RESET).append(" - ").append(getSelectionText(context, i));
}
return text.toString();
}
@Override
protected Prompt acceptValidatedInput(final ConversationContext context, final Number input) {
final CommandSender cs = (CommandSender) context.getForWhom();
switch (input.intValue()) {
case 1:
if (cs.hasPermission("quests.conditions.create")) {
context.setSessionData(CK.C_OLD_CONDITION, "");
return new ConditionSelectCreatePrompt(context);
} else {
cs.sendMessage(ChatColor.RED + Lang.get("noPermission"));
return new ConditionMenuPrompt(context);
}
case 2:
if (cs.hasPermission("quests.conditions.edit")) {
if (plugin.getLoadedConditions().isEmpty()) {
context.getForWhom().sendRawMessage(ChatColor.YELLOW
+ Lang.get("conditionEditorNoneToEdit"));
return new ConditionMenuPrompt(context);
} else {
return new ConditionSelectEditPrompt(context);
}
} else {
cs.sendMessage(ChatColor.RED + Lang.get("noPermission"));
return new ConditionMenuPrompt(context);
}
case 3:
if (cs.hasPermission("quests.conditions.delete")) {
if (plugin.getLoadedConditions().isEmpty()) {
context.getForWhom().sendRawMessage(ChatColor.YELLOW
+ Lang.get("conditionEditorNoneToDelete"));
return new ConditionMenuPrompt(context);
} else {
return new ConditionSelectDeletePrompt(context);
}
} else {
cs.sendMessage(ChatColor.RED + Lang.get("noPermission"));
return new ConditionMenuPrompt(context);
}
case 4:
context.getForWhom().sendRawMessage(ChatColor.YELLOW + Lang.get("exited"));
return Prompt.END_OF_CONVERSATION;
default:
return new ConditionMenuPrompt(context);
}
}
public class ConditionSelectCreatePrompt extends ConditionsEditorStringPrompt {
public ConditionSelectCreatePrompt(final ConversationContext context) {
super(context);
}
@Override
public String getTitle(final ConversationContext context) {
return Lang.get("conditionCreateTitle");
}
@Override
public String getQueryText(final ConversationContext context) {
return Lang.get("conditionEditorEnterName");
}
@Override
public @NotNull String getPromptText(final @NotNull ConversationContext context) {
final ConditionsEditorPostOpenStringPromptEvent event
= new ConditionsEditorPostOpenStringPromptEvent(context, this);
plugin.getServer().getPluginManager().callEvent(event);
return ChatColor.GOLD + getTitle(context) + "\n" + ChatColor.YELLOW + getQueryText(context);
}
@Override
public Prompt acceptInput(final @NotNull ConversationContext context, String input) {
if (input == null) {
context.getForWhom().sendRawMessage(ChatColor.RED + Lang.get("itemCreateInvalidInput"));
return new ConditionSelectCreatePrompt(context);
}
input = input.trim();
if (!input.equalsIgnoreCase(Lang.get("cmdCancel"))) {
for (final Condition c : plugin.getLoadedConditions()) {
if (c.getName().equalsIgnoreCase(input)) {
context.getForWhom().sendRawMessage(ChatColor.RED + Lang.get("conditionEditorExists"));
return new ConditionSelectCreatePrompt(context);
}
}
final List<String> actionNames = plugin.getConditionFactory().getNamesOfConditionsBeingEdited();
if (actionNames.contains(input)) {
context.getForWhom().sendRawMessage(ChatColor.RED + Lang.get("questEditorBeingEdited"));
return new ConditionSelectCreatePrompt(context);
}
if (input.contains(".") || input.contains(",")) {
context.getForWhom().sendRawMessage(ChatColor.RED + Lang.get("questEditorInvalidQuestName"));
return new ConditionSelectCreatePrompt(context);
}
if (input.equals("")) {
context.getForWhom().sendRawMessage(ChatColor.RED + Lang.get("itemCreateInvalidInput"));
return new ConditionSelectCreatePrompt(context);
}
context.setSessionData(CK.C_NAME, input);
actionNames.add(input);
plugin.getConditionFactory().setNamesOfConditionsBeingEdited(actionNames);
return new ConditionMainPrompt(context);
} else {
return new ConditionMenuPrompt(context);
}
}
}
public class ConditionSelectEditPrompt extends ConditionsEditorStringPrompt {
public ConditionSelectEditPrompt(final ConversationContext context) {
super(context);
}
@Override
public String getTitle(final ConversationContext context) {
return Lang.get("conditionEditTitle");
}
@Override
public String getQueryText(final ConversationContext context) {
return Lang.get("conditionEditorEnterName");
}
@Override
public @NotNull String getPromptText(final @NotNull ConversationContext context) {
final ConditionsEditorPostOpenStringPromptEvent event
= new ConditionsEditorPostOpenStringPromptEvent(context, this);
plugin.getServer().getPluginManager().callEvent(event);
final List<String> names = plugin.getLoadedConditions().stream().map(Condition::getName).collect(Collectors.toList());
return sendClickableMenu(getTitle(context), names, getQueryText(context), context.getForWhom());
}
@Override
public Prompt acceptInput(final @NotNull ConversationContext context, final String input) {
if (input == null) {
return null;
}
if (!input.equalsIgnoreCase(Lang.get("cmdCancel"))) {
final Condition c = plugin.getCondition(input);
if (c != null) {
context.setSessionData(CK.C_OLD_CONDITION, c.getName());
context.setSessionData(CK.C_NAME, c.getName());
plugin.getConditionFactory().loadData(c, context);
return new ConditionMainPrompt(context);
}
context.getForWhom().sendRawMessage(ChatColor.RED + Lang.get("conditionEditorNotFound"));
return new ConditionSelectEditPrompt(context);
} else {
return new ConditionMenuPrompt(context);
}
}
}
public class ConditionSelectDeletePrompt extends ConditionsEditorStringPrompt {
public ConditionSelectDeletePrompt(final ConversationContext context) {
super(context);
}
@Override
public String getTitle(final ConversationContext context) {
return Lang.get("conditionDeleteTitle");
}
@Override
public String getQueryText(final ConversationContext context) {
return Lang.get("conditionEditorEnterName");
}
@Override
public @NotNull String getPromptText(final @NotNull ConversationContext context) {
final ConditionsEditorPostOpenStringPromptEvent event
= new ConditionsEditorPostOpenStringPromptEvent(context, this);
plugin.getServer().getPluginManager().callEvent(event);
final List<String> names = plugin.getLoadedConditions().stream().map(Condition::getName).collect(Collectors.toList());
return sendClickableMenu(getTitle(context), names, getQueryText(context), context.getForWhom());
}
@Override
public Prompt acceptInput(final @NotNull ConversationContext context, final String input) {
if (input == null) {
return null;
}
if (!input.equalsIgnoreCase(Lang.get("cmdCancel"))) {
final LinkedList<String> used = new LinkedList<>();
final Condition c = plugin.getCondition(input);
if (c != null) {
for (final Quest quest : plugin.getLoadedQuests()) {
for (final Stage stage : quest.getStages()) {
if (stage.getCondition() != null
&& stage.getCondition().getName().equalsIgnoreCase(c.getName())) {
used.add(quest.getName());
break;
}
}
}
if (used.isEmpty()) {
context.setSessionData(CK.ED_CONDITION_DELETE, c.getName());
return new ConditionConfirmDeletePrompt(context);
} else {
context.getForWhom().sendRawMessage(ChatColor.RED + Lang.get("conditionEditorInUse")
+ " \"" + ChatColor.DARK_PURPLE + c.getName() + ChatColor.RED + "\":");
for (final String s : used) {
context.getForWhom().sendRawMessage(ChatColor.RED + "- " + ChatColor.DARK_RED + s);
}
context.getForWhom().sendRawMessage(ChatColor.RED
+ Lang.get("eventEditorMustModifyQuests"));
return new ConditionSelectDeletePrompt(context);
}
}
context.getForWhom().sendRawMessage(ChatColor.RED + Lang.get("conditionEditorNotFound"));
return new ConditionSelectDeletePrompt(context);
} else {
return new ConditionMenuPrompt(context);
}
}
}
public class ConditionConfirmDeletePrompt extends ConditionsEditorStringPrompt {
public ConditionConfirmDeletePrompt(final ConversationContext context) {
super(context);
}
private final int size = 2;
public int getSize() {
return size;
}
@Override
public String getTitle(final ConversationContext context) {
return null;
}
public ChatColor getNumberColor(final ConversationContext context, final int number) {
switch (number) {
case 1:
return ChatColor.GREEN;
case 2:
return ChatColor.RED;
default:
return null;
}
}
public String getSelectionText(final ConversationContext context, final int number) {
switch (number) {
case 1:
return ChatColor.GREEN + Lang.get("yesWord");
case 2:
return ChatColor.RED + Lang.get("noWord");
default:
return null;
}
}
@Override
public String getQueryText(final ConversationContext context) {
return Lang.get("confirmDelete");
}
@Override
public @NotNull String getPromptText(final @NotNull ConversationContext context) {
final ConditionsEditorPostOpenStringPromptEvent event
= new ConditionsEditorPostOpenStringPromptEvent(context, this);
plugin.getServer().getPluginManager().callEvent(event);
final StringBuilder text = new StringBuilder(ChatColor.RED + getQueryText(context) + " (" + ChatColor.YELLOW
+ context.getSessionData(CK.ED_CONDITION_DELETE) + ChatColor.RED + ")\n");
for (int i = 1; i <= size; i++) {
text.append("\n").append(getNumberColor(context, i)).append(ChatColor.BOLD).append(i)
.append(ChatColor.RESET).append(" - ").append(getSelectionText(context, i));
}
return QuestsNumericPrompt.sendClickableSelection(text.toString(), context.getForWhom());
}
@Override
public Prompt acceptInput(final @NotNull ConversationContext context, final String input) {
if (input == null) {
return null;
}
if (input.equalsIgnoreCase("1") || input.equalsIgnoreCase(Lang.get("yesWord"))) {
plugin.getConditionFactory().deleteCondition(context);
return Prompt.END_OF_CONVERSATION;
} else if (input.equalsIgnoreCase("2") || input.equalsIgnoreCase(Lang.get("noWord"))) {
return new ConditionMenuPrompt(context);
} else {
return new ConditionConfirmDeletePrompt(context);
}
}
}
}