Add GUI for editing Challenge and Challenge Level lore messages.

Rework Lore message construction.
This commit is contained in:
BONNe 2019-09-03 09:03:21 +03:00 committed by BuildTools
parent 747c12f1a6
commit c7fe138d78
9 changed files with 1291 additions and 326 deletions

View File

@ -1,7 +1,9 @@
package world.bentobox.challenges.config; package world.bentobox.challenges.config;
import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Set; import java.util.Set;
import org.bukkit.Material; import org.bukkit.Material;
@ -12,7 +14,12 @@ import world.bentobox.bentobox.api.configuration.ConfigEntry;
import world.bentobox.bentobox.api.configuration.ConfigObject; import world.bentobox.bentobox.api.configuration.ConfigObject;
import world.bentobox.bentobox.api.configuration.StoreAt; import world.bentobox.bentobox.api.configuration.StoreAt;
import world.bentobox.bentobox.database.objects.adapters.Adapter;
import world.bentobox.challenges.config.SettingsUtils.GuiMode; import world.bentobox.challenges.config.SettingsUtils.GuiMode;
import world.bentobox.challenges.config.SettingsUtils.ChallengeLore;
import world.bentobox.challenges.config.SettingsUtils.LevelLore;
import world.bentobox.challenges.database.object.adapters.ChallengeLoreAdapter;
import world.bentobox.challenges.database.object.adapters.LevelLoreAdapter;
@StoreAt(filename="config.yml", path="addons/Challenges") @StoreAt(filename="config.yml", path="addons/Challenges")
@ -98,35 +105,41 @@ public class Settings implements ConfigObject
@ConfigComment("one object from challenge description. If letter is not used, then its represented part") @ConfigComment("one object from challenge description. If letter is not used, then its represented part")
@ConfigComment("will not be in description. If use any letter that is not recognized, then it will be") @ConfigComment("will not be in description. If use any letter that is not recognized, then it will be")
@ConfigComment("ignored. Some strings can be customized via lang file under 'challenges.gui.challenge-description'.") @ConfigComment("ignored. Some strings can be customized via lang file under 'challenges.gui.challenge-description'.")
@ConfigComment("List of letters and their meaning: ") @ConfigComment("List of values and their meaning: ")
@ConfigComment(" - L - Level String: '*.level'") @ConfigComment(" - LEVEL - Level String: '*.level'")
@ConfigComment(" - S - Status String: '*.completed'") @ConfigComment(" - STATUS - Status String: '*.completed'")
@ConfigComment(" - T - Times String: '*.completed-times', '*.completed-times-of' or '*.maxed-reached'") @ConfigComment(" - COUNT - Times String: '*.completed-times', '*.completed-times-of' or '*.maxed-reached'")
@ConfigComment(" - D - Description String: defined in challenge object - challenge.description") @ConfigComment(" - DESCRIPTION - Description String: defined in challenge object - challenge.description")
@ConfigComment(" - W - Warning String: '*.warning-items-take', '*.objects-close-by', '*.warning-entities-kill', '*.warning-blocks-remove'") @ConfigComment(" - WARNINGS - Warning String: '*.warning-items-take', '*.objects-close-by', '*.warning-entities-kill', '*.warning-blocks-remove'")
@ConfigComment(" - E - Environment String: defined in challenge object - challenge.environment") @ConfigComment(" - ENVIRONMENT - Environment String: defined in challenge object - challenge.environment")
@ConfigComment(" - Q - Requirement String: '*.required-level', '*.required-money', '*.required-experience'") @ConfigComment(" - REQUIREMENTS - Requirement String: '*.required-level', '*.required-money', '*.required-experience' and items, blocks or entities")
@ConfigComment(" - R - Reward String: '*.experience-reward', '*.money-reward', '*.not-repeatable'") @ConfigComment(" - REWARD_TEXT - Reward String: message that is defined in challenge.rewardTest and challenge.repeatRewardText")
@ConfigComment("By adding 'i' after Q or R (requirements and rewards) will display list of items, blocks") @ConfigComment(" - REWARD_OTHER - Reward extra String: '*.experience-reward', '*.money-reward', '*.not-repeatable'")
@ConfigComment("and entities that are defined in challenge and can be customized under 'challenges.gui.description.*'") @ConfigComment(" - REWARD_ITEMS - Reward Items: List of items that will be rewarded.")
@ConfigEntry(path = "gui-settings.challenge-lore-message") @ConfigComment(" - REWARD_COMMANDS - Reward Commands: List of commands that will be rewarded.")
private String challengeLoreMessage = "LSTDEQiWRi"; @ConfigComment("Requirement and reward items, blocks and entities that are defined in challenge and can be customized under 'challenges.gui.item-description.*'")
@ConfigEntry(path = "gui-settings.challenge-lore")
@Adapter(ChallengeLoreAdapter.class)
private List<ChallengeLore> challengeLoreMessage = new ArrayList<>();
@ConfigComment("") @ConfigComment("")
@ConfigComment("This string allows to change element order in Level description. Each letter represents") @ConfigComment("This string allows to change element order in Level description. Each letter represents")
@ConfigComment("one object from level description. If letter is not used, then its represented part") @ConfigComment("one object from level description. If letter is not used, then its represented part")
@ConfigComment("will not be in description. If use any letter that is not recognized, then it will be") @ConfigComment("will not be in description. If use any letter that is not recognized, then it will be")
@ConfigComment("ignored. Some strings can be customized via lang file under 'challenges.gui.level-description'.") @ConfigComment("ignored. Some strings can be customized via lang file under 'challenges.gui.level-description'.")
@ConfigComment("List of letters and their meaning: ") @ConfigComment("List of values and their meaning: ")
@ConfigComment(" - S - Status String: '*.completed'") @ConfigComment(" - LEVEL_STATUS - Status String: '*.completed'")
@ConfigComment(" - T - Count of completed challenges String: '*.completed-challenges-of'") @ConfigComment(" - CHALLENGE_COUNT - Count of completed challenges String: '*.completed-challenges-of'")
@ConfigComment(" - D - Description String: defined in level object - challengeLevel.unlockMessage") @ConfigComment(" - UNLOCK_MESSAGE - Description String: defined in level object - challengeLevel.unlockMessage")
@ConfigComment(" - A - WaiverAmount String: '*.waver-amount'") @ConfigComment(" - WAIVER_AMOUNT - WaiverAmount String: '*.waver-amount'")
@ConfigComment(" - R - Reward String: '*.experience-reward', '*.money-reward', '*.not-repeatable'") @ConfigComment(" - LEVEL_REWARD_TEXT - Reward String: message that is defined in challengeLevel.rewardText.")
@ConfigComment("By adding 'i' after R (rewards) will display list of items that are defined in challenge") @ConfigComment(" - LEVEL_REWARD_OTHER - Reward extra String: '*.experience-reward', '*.money-reward'")
@ConfigComment("and can be customized under 'challenges.gui.description.*'") @ConfigComment(" - LEVEL_REWARD_ITEMS - Reward Items: List of items that will be rewarded.")
@ConfigEntry(path = "gui-settings.level-lore-message") @ConfigComment(" - LEVEL_REWARD_COMMANDS - Reward Commands: List of commands that will be rewarded.")
private String levelLoreMessage = "STDARi"; @ConfigComment("Reward items that are defined in challenge level and can be customized under 'challenges.gui.item-description.*'")
@ConfigEntry(path = "gui-settings.level-lore")
@Adapter(LevelLoreAdapter.class)
private List<LevelLore> levelLoreMessage = new ArrayList<>();
@ConfigComment("") @ConfigComment("")
@ConfigComment("This indicate if challenges data will be stored per island (true) or per player (false).") @ConfigComment("This indicate if challenges data will be stored per island (true) or per player (false).")
@ -187,7 +200,7 @@ public class Settings implements ConfigObject
* This method returns the challengeLoreMessage object. * This method returns the challengeLoreMessage object.
* @return the challengeLoreMessage object. * @return the challengeLoreMessage object.
*/ */
public String getChallengeLoreMessage() public List<ChallengeLore> getChallengeLoreMessage()
{ {
return challengeLoreMessage; return challengeLoreMessage;
} }
@ -271,7 +284,7 @@ public class Settings implements ConfigObject
* This method returns the levelLoreMessage object. * This method returns the levelLoreMessage object.
* @return the levelLoreMessage object. * @return the levelLoreMessage object.
*/ */
public String getLevelLoreMessage() public List<LevelLore> getLevelLoreMessage()
{ {
return levelLoreMessage; return levelLoreMessage;
} }
@ -455,7 +468,7 @@ public class Settings implements ConfigObject
* This method sets the challengeLoreMessage object value. * This method sets the challengeLoreMessage object value.
* @param challengeLoreMessage the challengeLoreMessage object new value. * @param challengeLoreMessage the challengeLoreMessage object new value.
*/ */
public void setChallengeLoreMessage(String challengeLoreMessage) public void setChallengeLoreMessage(List<ChallengeLore> challengeLoreMessage)
{ {
this.challengeLoreMessage = challengeLoreMessage; this.challengeLoreMessage = challengeLoreMessage;
} }
@ -465,7 +478,7 @@ public class Settings implements ConfigObject
* This method sets the levelLoreMessage object value. * This method sets the levelLoreMessage object value.
* @param levelLoreMessage the levelLoreMessage object new value. * @param levelLoreMessage the levelLoreMessage object new value.
*/ */
public void setLevelLoreMessage(String levelLoreMessage) public void setLevelLoreMessage(List<LevelLore> levelLoreMessage)
{ {
this.levelLoreMessage = levelLoreMessage; this.levelLoreMessage = levelLoreMessage;
} }

View File

@ -26,4 +26,132 @@ public class SettingsUtils
*/ */
CURRENT_WORLD CURRENT_WORLD
} }
/**
* This enum holds all possible values for Challenge Lore Message.
*/
public enum ChallengeLore
{
/**
* Level String: 'challenges.gui.challenge-description.level'
*/
LEVEL,
/**
* Status String: 'challenges.gui.challenge-description.completed'
*/
STATUS,
/**
* Completion Times String:
* 'challenges.gui.challenge-description.completed-times',
* 'challenges.gui.challenge-description.completed-times-of'
* 'challenges.gui.challenge-description.maxed-reached'
*/
COUNT,
/**
* Description String: defined in challenge object - challenge.description
*/
DESCRIPTION,
/**
* Warning String:
* 'challenges.gui.challenge-description.warning-items-take'
* 'challenges.gui.challenge-description.objects-close-by'
* 'challenges.gui.challenge-description.warning-entities-kill'
* 'challenges.gui.challenge-description.warning-blocks-remove'
*/
WARNINGS,
/**
* Environment String: defined in challenge object - challenge.environment
*/
ENVIRONMENT,
/**
* Requirement String:
* 'challenges.gui.challenge-description.required-level'
* 'challenges.gui.challenge-description.required-money'
* 'challenges.gui.challenge-description.required-experience'
* and challenge.requiredItems, challenge.requiredBlocks or challenge.requiredEntities
*/
REQUIREMENTS,
/**
* Reward String: message that is defined in challenge.rewardTest and challenge.repeatRewardText
*/
REWARD_TEXT,
/**
* Reward other String:
* 'challenges.gui.challenge-description.experience-reward'
* 'challenges.gui.challenge-description.money-reward'
* 'challenges.gui.challenge-description.not-repeatable'
*/
REWARD_OTHER,
/**
* Reward Items: List of items that will be rewarded defined in challenge.rewardItems and
* challenge.repeatRewardItems.
*/
REWARD_ITEMS,
/**
* Reward commands: List of commands that will be rewarded defined in challenge.rewardCommands
* and challenge.repeatRewardCommands.
*/
REWARD_COMMANDS,
}
/**
* This enum holds all possible values for Level Lore Message.
*/
public enum LevelLore
{
/**
* Status String: 'challenges.gui.level-description.completed'
*/
LEVEL_STATUS,
/**
* Completed Challenge count String: 'challenges.gui.level-description.completed-challenges-of'
*/
CHALLENGE_COUNT,
/**
* Unlock message String: defined in challenge level object - challengeLevel.unlockMessage
*/
UNLOCK_MESSAGE,
/**
* Count of challenges which can be skipped to unlock next level string:
* 'challenges.gui.level-description.waver-amount'
*/
WAIVER_AMOUNT,
/**
* Reward String: message that is defined in challengeLevel.rewardTest
*/
LEVEL_REWARD_TEXT,
/**
* Reward other String:
* 'challenges.gui.level-description.experience-reward'
* 'challenges.gui.level-description.money-reward'
*/
LEVEL_REWARD_OTHER,
/**
* Reward Items: List of items that will be rewarded defined in challengeLevel.rewardItems.
*/
LEVEL_REWARD_ITEMS,
/**
* Reward commands: List of commands that will be rewarded defined in challengeLevel.rewardCommands.
*/
LEVEL_REWARD_COMMANDS,
}
} }

View File

@ -0,0 +1,63 @@
//
// Created by BONNe
// Copyright - 2019
//
package world.bentobox.challenges.database.object.adapters;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import world.bentobox.bentobox.database.objects.adapters.AdapterInterface;
import world.bentobox.challenges.config.SettingsUtils.ChallengeLore;
/**
* This adapter allows to serialize and deserialize ChallengeLore object.
*/
public class ChallengeLoreAdapter implements AdapterInterface<List<ChallengeLore>, List<String>>
{
@SuppressWarnings("unchecked")
@Override
public List<ChallengeLore> deserialize(Object from)
{
List<ChallengeLore> result;
if (from instanceof List)
{
result = ((List<String>) from).stream().
map(ChallengeLore::valueOf).
collect(Collectors.toCollection(ArrayList::new));
}
else
{
result = new ArrayList<>(0);
}
return result;
}
@SuppressWarnings("unchecked")
@Override
public List<String> serialize(Object to)
{
List<String> result;
if (to instanceof List)
{
result = ((List<ChallengeLore>) to).stream().
map(ChallengeLore::name).
collect(Collectors.toCollection(ArrayList::new));
}
else
{
result = new ArrayList<>(0);
}
return result;
}
}

View File

@ -0,0 +1,63 @@
//
// Created by BONNe
// Copyright - 2019
//
package world.bentobox.challenges.database.object.adapters;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import world.bentobox.bentobox.database.objects.adapters.AdapterInterface;
import world.bentobox.challenges.config.SettingsUtils.LevelLore;
/**
* This adapter allows to serialize and deserialize LevelLore object.
*/
public class LevelLoreAdapter implements AdapterInterface<List<LevelLore>, List<String>>
{
@SuppressWarnings("unchecked")
@Override
public List<LevelLore> deserialize(Object from)
{
List<LevelLore> result;
if (from instanceof List)
{
result = ((List<String>) from).stream().
map(LevelLore::valueOf).
collect(Collectors.toCollection(ArrayList::new));
}
else
{
result = new ArrayList<>(0);
}
return result;
}
@SuppressWarnings("unchecked")
@Override
public List<String> serialize(Object to)
{
List<String> result;
if (to instanceof List)
{
result = ((List<LevelLore>) to).stream().
map(LevelLore::name).
collect(Collectors.toCollection(ArrayList::new));
}
else
{
result = new ArrayList<>(0);
}
return result;
}
}

View File

@ -336,21 +336,19 @@ public abstract class CommonGUI
// Some values to avoid overchecking. // Some values to avoid overchecking.
ChallengesManager manager = this.addon.getChallengesManager(); ChallengesManager manager = this.addon.getChallengesManager();
final boolean isCompletedOnce = manager.isChallengeComplete(user.getUniqueId(), world, challenge); final boolean isCompletedOnce =
manager.isChallengeComplete(user.getUniqueId(), world, challenge);
final long doneTimes = challenge.isRepeatable() ? final long doneTimes = challenge.isRepeatable() ?
manager.getChallengeTimes(this.user, this.world, challenge) : manager.getChallengeTimes(this.user, this.world, challenge) : isCompletedOnce ? 0 : 1;
isCompletedOnce ? 0 : 1;
boolean isCompletedAll = isCompletedOnce && challenge.isRepeatable() && boolean isCompletedAll = isCompletedOnce && challenge.isRepeatable() &&
challenge.getMaxTimes() > 0 && doneTimes >= challenge.getMaxTimes(); challenge.getMaxTimes() > 0 &&
doneTimes >= challenge.getMaxTimes();
// Used to know if blocks, entities, items should be added after requirements and rewards. this.addon.getChallengesSettings().getChallengeLoreMessage().forEach(messagePart -> {
char prevChar = ' '; switch (messagePart)
for (char c : this.addon.getChallengesSettings().getChallengeLoreMessage().toLowerCase().toCharArray())
{ {
switch (c) case LEVEL:
{
case 'l':
{ {
ChallengeLevel level = manager.getLevel(challenge); ChallengeLevel level = manager.getLevel(challenge);
@ -361,21 +359,22 @@ public abstract class CommonGUI
} }
else else
{ {
result.add(this.user.getTranslation("challenges.gui.challenge-description.level", result.add(this.user
.getTranslation("challenges.gui.challenge-description.level",
"[level]", level.getFriendlyName())); "[level]", level.getFriendlyName()));
} }
break; break;
} }
case 's': case STATUS:
{ {
if (isCompletedOnce) if (isCompletedOnce)
{ {
result.add(this.user.getTranslation("challenges.gui.challenge-description.completed")); result.add(this.user
.getTranslation("challenges.gui.challenge-description.completed"));
} }
break; break;
} }
case 't': case COUNT:
{ {
if (challenge.isRepeatable()) if (challenge.isRepeatable())
{ {
@ -383,35 +382,39 @@ public abstract class CommonGUI
{ {
if (isCompletedAll) if (isCompletedAll)
{ {
result.add(this.user.getTranslation("challenges.gui.challenge-description.maxed-reached", result.add(this.user.getTranslation(
"[donetimes]", String.valueOf(doneTimes), "challenges.gui.challenge-description.maxed-reached",
"[maxtimes]", String.valueOf(challenge.getMaxTimes()))); "[donetimes]",
String.valueOf(doneTimes),
"[maxtimes]",
String.valueOf(challenge.getMaxTimes())));
} }
else else
{ {
result.add(this.user.getTranslation( result.add(this.user.getTranslation(
"challenges.gui.challenge-description.completed-times-of", "challenges.gui.challenge-description.completed-times-of",
"[donetimes]", String.valueOf(doneTimes), "[donetimes]",
"[maxtimes]", String.valueOf(challenge.getMaxTimes()))); String.valueOf(doneTimes),
"[maxtimes]",
String.valueOf(challenge.getMaxTimes())));
} }
} }
else else
{ {
result.add(this.user.getTranslation("challenges.gui.challenge-description.completed-times", result.add(this.user.getTranslation(
"[donetimes]", String.valueOf(doneTimes))); "challenges.gui.challenge-description.completed-times",
"[donetimes]",
String.valueOf(doneTimes)));
} }
} }
break; break;
} }
case 'd': case DESCRIPTION:
{
if (!isCompletedAll)
{ {
result.addAll(challenge.getDescription()); result.addAll(challenge.getDescription());
}
break; break;
} }
case 'w': case WARNINGS:
{ {
if (!isCompletedAll) if (!isCompletedAll)
{ {
@ -425,15 +428,18 @@ public abstract class CommonGUI
} }
else if (challenge.getChallengeType().equals(Challenge.ChallengeType.ISLAND)) else if (challenge.getChallengeType().equals(Challenge.ChallengeType.ISLAND))
{ {
result.add(this.user.getTranslation("challenges.gui.challenge-description.objects-close-by")); result.add(this.user.getTranslation(
"challenges.gui.challenge-description.objects-close-by"));
if (challenge.isRemoveEntities() && !challenge.getRequiredEntities().isEmpty()) if (challenge.isRemoveEntities() &&
!challenge.getRequiredEntities().isEmpty())
{ {
result.add(this.user.getTranslation( result.add(this.user.getTranslation(
"challenges.gui.challenge-description.warning-entities-kill")); "challenges.gui.challenge-description.warning-entities-kill"));
} }
if (challenge.isRemoveBlocks() && !challenge.getRequiredBlocks().isEmpty()) if (challenge.isRemoveBlocks() &&
!challenge.getRequiredBlocks().isEmpty())
{ {
result.add(this.user.getTranslation( result.add(this.user.getTranslation(
"challenges.gui.challenge-description.warning-blocks-remove")); "challenges.gui.challenge-description.warning-blocks-remove"));
@ -442,7 +448,7 @@ public abstract class CommonGUI
} }
break; break;
} }
case 'e': case ENVIRONMENT:
{ {
// Display only if there are limited environments // Display only if there are limited environments
@ -469,15 +475,23 @@ public abstract class CommonGUI
} }
break; break;
} }
case 'q': case REQUIREMENTS:
{ {
if (!isCompletedAll && challenge.getChallengeType() == Challenge.ChallengeType.OTHER) if (!isCompletedAll)
{
if (challenge.getChallengeType() == Challenge.ChallengeType.OTHER)
{ {
result.addAll(this.getChallengeRequirements(challenge)); result.addAll(this.getChallengeRequirements(challenge));
} }
else
{
result.addAll(this.getChallengeRequiredItems(challenge));
}
}
break; break;
} }
case 'r': case REWARD_TEXT:
{ {
if (isCompletedAll) if (isCompletedAll)
{ {
@ -485,33 +499,43 @@ public abstract class CommonGUI
} }
else else
{ {
result.addAll(this.getChallengeRewards(challenge, isCompletedOnce)); if (isCompletedOnce)
{
result.add(challenge.getRepeatRewardText());
}
else
{
result.add(challenge.getRewardText());
}
} }
break; break;
} }
case 'i': case REWARD_OTHER:
{ {
if (!isCompletedAll) if (!isCompletedAll)
{ {
if (prevChar == 'q' && challenge.getChallengeType() != Challenge.ChallengeType.OTHER) result.addAll(this.getChallengeRewardOthers(challenge, isCompletedOnce));
{
result.addAll(this.getChallengeRequiredItems(challenge));
}
else if (prevChar == 'r')
{
result.addAll(this.getChallengeRewardItems(challenge, isCompletedOnce, user));
}
} }
break; break;
} }
default: case REWARD_ITEMS:
{ {
if (!isCompletedAll)
{
result.addAll(this.getChallengeRewardItems(challenge, isCompletedOnce));
}
break;
}
case REWARD_COMMANDS:
{
if (!isCompletedAll)
{
result.addAll(this.getChallengeRewardCommands(challenge, isCompletedOnce, user));
}
break; break;
} }
} }
});
prevChar = c;
}
result.replaceAll(x -> x.replace("[label]", this.topLabel)); result.replaceAll(x -> x.replace("[label]", this.topLabel));
@ -525,31 +549,25 @@ public abstract class CommonGUI
* @param isCompletedOnce indicate if must use repeat rewards * @param isCompletedOnce indicate if must use repeat rewards
* @return list of strings that contains rewards message. * @return list of strings that contains rewards message.
*/ */
private List<String> getChallengeRewards(Challenge challenge, boolean isCompletedOnce) private List<String> getChallengeRewardOthers(Challenge challenge, boolean isCompletedOnce)
{ {
String rewardText;
double rewardMoney; double rewardMoney;
int rewardExperience; int rewardExperience;
if (!isCompletedOnce) if (!isCompletedOnce)
{ {
rewardText = challenge.getRewardText();
rewardMoney = challenge.getRewardMoney(); rewardMoney = challenge.getRewardMoney();
rewardExperience = challenge.getRewardExperience(); rewardExperience = challenge.getRewardExperience();
} }
else else
{ {
rewardText = challenge.getRepeatRewardText();
rewardMoney = challenge.getRepeatMoneyReward(); rewardMoney = challenge.getRepeatMoneyReward();
rewardExperience = challenge.getRepeatExperienceReward(); rewardExperience = challenge.getRepeatExperienceReward();
} }
List<String> result = new ArrayList<>(); List<String> result = new ArrayList<>();
// Add reward text
result.add(rewardText);
// Add message about reward XP // Add message about reward XP
if (rewardExperience > 0) if (rewardExperience > 0)
{ {
@ -569,28 +587,24 @@ public abstract class CommonGUI
/** /**
* This method returns list of strings that contains reward items and commands from given challenge. * This method returns list of strings that contains reward items from given challenge.
* @param challenge Challenge which reward items and commands must be returned. * @param challenge Challenge which reward items and commands must be returned.
* @param isCompletedOnce Boolean that indicate if must use repeat rewards. * @param isCompletedOnce Boolean that indicate if must use repeat rewards.
* @param user Target user for command string.
* @return List of strings that contains message from challenges. * @return List of strings that contains message from challenges.
*/ */
private List<String> getChallengeRewardItems(Challenge challenge, boolean isCompletedOnce, Player user) private List<String> getChallengeRewardItems(Challenge challenge, boolean isCompletedOnce)
{ {
List<String> result = new ArrayList<>(); List<String> result = new ArrayList<>();
List<ItemStack> rewardItems; List<ItemStack> rewardItems;
List<String> rewardCommands;
if (!isCompletedOnce) if (isCompletedOnce)
{ {
rewardItems = challenge.getRewardItems(); rewardItems = challenge.getRepeatItemReward();
rewardCommands = challenge.getRewardCommands();
} }
else else
{ {
rewardItems = challenge.getRepeatItemReward(); rewardItems = challenge.getRewardItems();
rewardCommands = challenge.getRepeatRewardCommands();
} }
// Add message about reward items // Add message about reward items
@ -602,6 +616,32 @@ public abstract class CommonGUI
result.addAll(this.generateItemStackDescription(itemStack))); result.addAll(this.generateItemStackDescription(itemStack)));
} }
return result;
}
/**
* This method returns list of strings that contains reward commands from given challenge.
* @param challenge Challenge which reward items and commands must be returned.
* @param isCompletedOnce Boolean that indicate if must use repeat rewards.
* @param user Target user for command string.
* @return List of strings that contains message from challenges.
*/
private List<String> getChallengeRewardCommands(Challenge challenge, boolean isCompletedOnce, Player user)
{
List<String> result = new ArrayList<>();
List<String> rewardCommands;
if (isCompletedOnce)
{
rewardCommands = challenge.getRepeatRewardCommands();
}
else
{
rewardCommands = challenge.getRewardCommands();
}
// Add message about reward commands // Add message about reward commands
if (!rewardCommands.isEmpty()) if (!rewardCommands.isEmpty())
{ {
@ -723,14 +763,15 @@ public abstract class CommonGUI
ChallengesManager manager = this.addon.getChallengesManager(); ChallengesManager manager = this.addon.getChallengesManager();
LevelStatus status = manager.getChallengeLevelStatus(user.getUniqueId(), this.world, level); LevelStatus status = manager.getChallengeLevelStatus(user.getUniqueId(), this.world, level);
// Used to know if blocks, entities, items should be added after requirements and rewards. // Check if unlock message should appear.
char prevChar = ' '; boolean hasCompletedOne = status.isComplete() || status.isUnlocked() &&
level.getChallenges().stream().anyMatch(challenge ->
this.addon.getChallengesManager().isChallengeComplete(user.getUniqueId(), world, challenge));
for (char c : this.addon.getChallengesSettings().getLevelLoreMessage().toLowerCase().toCharArray()) this.addon.getChallengesSettings().getLevelLoreMessage().forEach(messagePart -> {
switch (messagePart)
{ {
switch (c) case LEVEL_STATUS:
{
case 's':
{ {
if (status.isComplete()) if (status.isComplete())
{ {
@ -738,9 +779,9 @@ public abstract class CommonGUI
} }
break; break;
} }
case 't': case CHALLENGE_COUNT:
{ {
if (!status.isComplete()) if (!status.isComplete() && status.isUnlocked())
{ {
int doneChallengeCount = (int) level.getChallenges().stream(). int doneChallengeCount = (int) level.getChallenges().stream().
filter(challenge -> this.addon.getChallengesManager().isChallengeComplete(user.getUniqueId(), world, challenge)). filter(challenge -> this.addon.getChallengesManager().isChallengeComplete(user.getUniqueId(), world, challenge)).
@ -750,33 +791,43 @@ public abstract class CommonGUI
"[number]", Integer.toString(doneChallengeCount), "[number]", Integer.toString(doneChallengeCount),
"[max]", Integer.toString(level.getChallenges().size()))); "[max]", Integer.toString(level.getChallenges().size())));
} }
break; break;
} }
case 'd': case UNLOCK_MESSAGE:
{ {
if (!status.isUnlocked()) if (!hasCompletedOne)
{ {
result.add(level.getUnlockMessage()); result.add(level.getUnlockMessage());
} }
break; break;
} }
case 'a': case WAIVER_AMOUNT:
{ {
if (!status.isUnlocked() && !status.isComplete()) if (status.isUnlocked() && !status.isComplete())
{ {
result.add(this.user.getTranslation("challenges.gui.level-description.waver-amount", result.add(this.user.getTranslation("challenges.gui.level-description.waver-amount",
"[value]", Integer.toString(level.getWaiverAmount()))); "[value]", Integer.toString(level.getWaiverAmount())));
} }
break; break;
} }
case 'r': case LEVEL_REWARD_TEXT:
{
if (status.isUnlocked() && !status.isComplete())
{
result.add(level.getRewardText());
}
break;
}
case LEVEL_REWARD_OTHER:
{ {
if (status.isUnlocked() && !status.isComplete()) if (status.isUnlocked() && !status.isComplete())
{ {
if (level.getRewardExperience() > 0) if (level.getRewardExperience() > 0)
{ {
result.add(this.user result.add(this.user.getTranslation("challenges.gui.level-description.experience-reward",
.getTranslation("challenges.gui.level-description.experience-reward",
"[value]", Integer.toString(level.getRewardExperience()))); "[value]", Integer.toString(level.getRewardExperience())));
} }
@ -788,21 +839,20 @@ public abstract class CommonGUI
} }
break; break;
} }
case 'i': case LEVEL_REWARD_ITEMS:
{ {
if (status.isUnlocked() && !status.isComplete() && prevChar == 'r') if (status.isUnlocked() && !status.isComplete() && !level.getRewardItems().isEmpty())
{
// Add message about reward items
if (!level.getRewardItems().isEmpty())
{ {
result.add(this.user.getTranslation("challenges.gui.level-description.reward-items")); result.add(this.user.getTranslation("challenges.gui.level-description.reward-items"));
Utils.groupEqualItems(level.getRewardItems()).forEach(itemStack -> Utils.groupEqualItems(level.getRewardItems()).forEach(itemStack ->
result.addAll(this.generateItemStackDescription(itemStack))); result.addAll(this.generateItemStackDescription(itemStack)));
} }
break;
// Add message about reward commands }
if (!level.getRewardCommands().isEmpty()) case LEVEL_REWARD_COMMANDS:
{
if (status.isUnlocked() && !status.isComplete() && !level.getRewardCommands().isEmpty())
{ {
result.add(this.user.getTranslation("challenges.gui.level-description.reward-commands")); result.add(this.user.getTranslation("challenges.gui.level-description.reward-commands"));
@ -812,17 +862,10 @@ public abstract class CommonGUI
"[command]", command.replace("[player]", user.getName()).replace("[SELF]", ""))); "[command]", command.replace("[player]", user.getName()).replace("[SELF]", "")));
} }
} }
}
break;
}
default:
{
break; break;
} }
} }
});
prevChar = c;
}
result.replaceAll(x -> x.replace("[label]", this.topLabel)); result.replaceAll(x -> x.replace("[label]", this.topLabel));
@ -836,7 +879,7 @@ public abstract class CommonGUI
/** /**
* This method generates decsription for given item stack object. * This method generates description for given item stack object.
* @param itemStack Object which lore must be generated * @param itemStack Object which lore must be generated
* @return List with generated description * @return List with generated description
*/ */

View File

@ -0,0 +1,630 @@
package world.bentobox.challenges.panel.admin;
import org.bukkit.Material;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.inventory.ItemStack;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import world.bentobox.bentobox.api.panels.PanelItem;
import world.bentobox.bentobox.api.panels.PanelListener;
import world.bentobox.bentobox.api.panels.builders.PanelBuilder;
import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.challenges.config.SettingsUtils.ChallengeLore;
import world.bentobox.challenges.config.SettingsUtils.LevelLore;
import world.bentobox.challenges.panel.CommonGUI;
import world.bentobox.challenges.utils.GuiUtils;
/**
* This class allows to change Input ItemStacks to different ItemStacks.
*/
public class EditLoreGUI extends CommonGUI
{
public EditLoreGUI(CommonGUI parent, LoreType loreType)
{
super(parent);
this.lore = loreType;
this.activeValues = new ArrayList<>();
switch (this.lore)
{
case CHALLENGES:
for (ChallengeLore lore : this.addon.getChallengesSettings().getChallengeLoreMessage())
{
this.activeValues.add(lore.name());
}
break;
case LEVELS:
for (LevelLore lore : this.addon.getChallengesSettings().getLevelLoreMessage())
{
this.activeValues.add(lore.name());
}
break;
}
}
/**
* This is static call method for easier GUI opening.
* @param parent Parent GUI.
* @param loreType loreType that will be edited.
*/
public static void open(CommonGUI parent, LoreType loreType)
{
new EditLoreGUI(parent, loreType).build();
}
// ---------------------------------------------------------------------
// Section: Methods
// ---------------------------------------------------------------------
/**
* This method builds panel that allows to change given number value.
*/
@Override
public void build()
{
PanelBuilder panelBuilder = new PanelBuilder().
name(this.user.getTranslation("challenges.gui.title.admin.lore-edit")).
user(this.user).
listener(new CustomPanelListener());
GuiUtils.fillBorder(panelBuilder, 5, Material.MAGENTA_STAINED_GLASS_PANE);
// Define all active buttons
panelBuilder.item(1, this.getButton(Button.SAVE));
panelBuilder.item(3, this.getButton(Button.ADD));
panelBuilder.item(4, this.getButton(Button.REMOVE));
// TODO: Need 2 View Buttons
// One for closes / One for opened.
// panelBuilder.item(6, this.getButton(Button.VIEW));
panelBuilder.item(44, this.returnButton);
// necessary as I have a border around this GUI
int currentIndex = 10;
// Only 21 elements will be displayed. On porpoise!
for (int i = 0; i < this.activeValues.size() || i > 21; i++)
{
panelBuilder.item(currentIndex++, this.getLoreButton(this.activeValues.get(i)));
// Border element
if (currentIndex % 9 == 8)
{
currentIndex += 2;
}
// Just in case. Should never occur.
if (currentIndex % 9 == 0)
{
currentIndex++;
}
}
panelBuilder.build();
}
/**
* This method create button that does some functionality in current gui.
* @param button Button functionality.
* @return PanelItem.
*/
private PanelItem getButton(Button button)
{
ItemStack icon;
String name;
List<String> description;
PanelItem.ClickHandler clickHandler;
switch (button)
{
case SAVE:
{
name = this.user.getTranslation("challenges.gui.buttons.admin.save");
description = Collections.emptyList();
icon = new ItemStack(Material.COMMAND_BLOCK);
clickHandler = (panel, user, clickType, slot) -> {
switch (this.lore)
{
case CHALLENGES:
{
List<ChallengeLore> lore = this.activeValues.stream().
map(ChallengeLore::valueOf).
collect(Collectors.toCollection(() -> new ArrayList<>(this.activeValues.size())));
this.addon.getChallengesSettings().setChallengeLoreMessage(lore);
break;
}
case LEVELS:
{
List<LevelLore> lore = this.activeValues.stream().
map(LevelLore::valueOf).
collect(Collectors.toCollection(() -> new ArrayList<>(this.activeValues.size())));
this.addon.getChallengesSettings().setLevelLoreMessage(lore);
break;
}
}
// Save and return to parent gui.
this.parentGUI.build();
return true;
};
break;
}
case ADD:
{
name = this.user.getTranslation("challenges.gui.buttons.admin.add");
description = Collections.emptyList();
icon = new ItemStack(Material.GREEN_STAINED_GLASS_PANE);
clickHandler = (panel, user, clickType, slot) -> {
new AddLoreElementGUI(element -> {
this.activeValues.add(element);
this.build();
});
return true;
};
break;
}
case REMOVE:
{
name = this.user.getTranslation("challenges.gui.buttons.admin.remove-selected");
description = Collections.emptyList();
icon = new ItemStack(Material.RED_STAINED_GLASS_PANE);
clickHandler = (panel, user, clickType, slot) -> {
new RemoveLoreElementGUI((element, index) -> {
if (this.activeValues.get(index).equals(element))
{
this.activeValues.remove(element);
}
this.build();
});
return true;
};
break;
}
case VIEW:
{
name = this.user.getTranslation("challenges.gui.buttons.admin.view");
description = Collections.emptyList();
icon = new ItemStack(Material.YELLOW_STAINED_GLASS_PANE);
clickHandler = (panel, user, clickType, slot) -> {
return true;
};
break;
}
default:
return null;
}
return new PanelItemBuilder().
icon(icon).
name(name).
description(GuiUtils.stringSplit(description, this.addon.getChallengesSettings().getLoreLineLength())).
glow(false).
clickHandler(clickHandler).
build();
}
/**
* This method creates button for lore element.
* @param loreElement String that represents current lore element.
* @return PanelItem.
*/
private PanelItem getLoreButton(String loreElement)
{
switch (this.lore)
{
case CHALLENGES:
return this.getChallengeLoreButton(loreElement);
case LEVELS:
return this.getLevelLoreButton(loreElement);
default:
// this should never happen!
return null;
}
}
/**
* This method creates button for challenge lore element.
* @param loreElement String that represents current challenge lore element.
* @return PanelItem.
*/
private PanelItem getChallengeLoreButton(String loreElement)
{
Material icon;
String name = loreElement;
List<String> description = new ArrayList<>();
description.add(this.user.getTranslation(REFERENCE_DESCRIPTION + "lore." + loreElement.toLowerCase()));
PanelItem.ClickHandler clickHandler = (panel, user1, clickType, slot) -> true;
switch (ChallengeLore.valueOf(loreElement))
{
case LEVEL:
{
icon = Material.DIRT;
break;
}
case STATUS:
{
icon = Material.LEVER;
break;
}
case COUNT:
{
icon = Material.REPEATER;
break;
}
case DESCRIPTION:
{
icon = Material.WRITTEN_BOOK;
break;
}
case WARNINGS:
{
icon = Material.LAVA_BUCKET;
break;
}
case ENVIRONMENT:
{
icon = Material.GLASS;
break;
}
case REQUIREMENTS:
{
icon = Material.HOPPER;
break;
}
case REWARD_TEXT:
{
icon = Material.PAPER;
break;
}
case REWARD_OTHER:
{
icon = Material.CHEST;
break;
}
case REWARD_ITEMS:
{
icon = Material.TRAPPED_CHEST;
break;
}
case REWARD_COMMANDS:
{
icon = Material.COMMAND_BLOCK;
break;
}
default:
{
icon = Material.BARRIER;
break;
}
}
return new PanelItemBuilder().
name(name).
icon(icon).
description(description).
clickHandler(clickHandler).
glow(false).
build();
}
/**
* This method creates button for challenge level lore element.
* @param loreElement String that represents current challenge level lore element.
* @return PanelItem.
*/
private PanelItem getLevelLoreButton(String loreElement)
{
Material icon;
String name = loreElement;
List<String> description = new ArrayList<>();
description.add(this.user.getTranslation(REFERENCE_DESCRIPTION + "lore." + loreElement.toLowerCase()));
PanelItem.ClickHandler clickHandler = (panel, user1, clickType, slot) -> true;
switch (LevelLore.valueOf(loreElement))
{
case LEVEL_STATUS:
{
icon = Material.DIRT;
break;
}
case CHALLENGE_COUNT:
{
icon = Material.REPEATER;
break;
}
case UNLOCK_MESSAGE:
{
icon = Material.WRITTEN_BOOK;
break;
}
case WAIVER_AMOUNT:
{
icon = Material.COMPARATOR;
break;
}
case LEVEL_REWARD_TEXT:
{
icon = Material.PAPER;
break;
}
case LEVEL_REWARD_OTHER:
{
icon = Material.CHEST;
break;
}
case LEVEL_REWARD_ITEMS:
{
icon = Material.TRAPPED_CHEST;
break;
}
case LEVEL_REWARD_COMMANDS:
{
icon = Material.COMMAND_BLOCK;
break;
}
default:
{
icon = Material.BARRIER;
break;
}
}
return new PanelItemBuilder().
name(name).
icon(icon).
description(description).
clickHandler(clickHandler).
glow(false).
build();
}
// ---------------------------------------------------------------------
// Section: Select GUI
// ---------------------------------------------------------------------
/**
* This class opens new GUI that add an element from all available lore values.
*/
private class AddLoreElementGUI
{
private AddLoreElementGUI(Consumer<String> selectedElement)
{
PanelBuilder panelBuilder = new PanelBuilder().
name(EditLoreGUI.this.user.getTranslation("challenges.gui.title.admin.lore-add")).
user(EditLoreGUI.this.user);
GuiUtils.fillBorder(panelBuilder, 5, Material.MAGENTA_STAINED_GLASS_PANE);
int currentIndex = 10;
List<String> values = new ArrayList<>();
// Populate list with all elements.
switch (EditLoreGUI.this.lore)
{
case CHALLENGES:
for (ChallengeLore value : ChallengeLore.values())
{
values.add(value.name());
}
break;
case LEVELS:
for (LevelLore value : LevelLore.values())
{
values.add(value.name());
}
break;
}
for (String value : values)
{
PanelItem item = EditLoreGUI.this.getLoreButton(value);
item.setClickHandler((panel, user1, clickType, slot) -> {
selectedElement.accept(value);
return true;
});
panelBuilder.item(currentIndex++, item);
// Border element
if (currentIndex % 9 == 8)
{
currentIndex += 2;
}
// Just in case. Should never occur.
if (currentIndex % 9 == 0)
{
currentIndex++;
}
// Just in case. Should never occur.
if (currentIndex > 35)
{
break;
}
}
panelBuilder.build();
}
}
/**
* This class opens new GUI that remove an element from all available lore values.
*/
private class RemoveLoreElementGUI
{
private RemoveLoreElementGUI(BiConsumer<String, Integer> selectedElement)
{
PanelBuilder panelBuilder = new PanelBuilder().
name(EditLoreGUI.this.user.getTranslation("challenges.gui.title.admin.lore-remove")).
user(EditLoreGUI.this.user);
GuiUtils.fillBorder(panelBuilder, 5, Material.MAGENTA_STAINED_GLASS_PANE);
int currentIndex = 10;
List<String> values = EditLoreGUI.this.activeValues;
for (int i = 0; i < values.size(); i++)
{
final int counter = i;
String value = values.get(counter);
PanelItem item = EditLoreGUI.this.getLoreButton(value);
item.setClickHandler((panel, user1, clickType, slot) -> {
selectedElement.accept(value, counter);
return true;
});
panelBuilder.item(currentIndex++, item);
// Border element
if (currentIndex % 9 == 8)
{
currentIndex += 2;
}
// Just in case. Should never occur.
if (currentIndex % 9 == 0)
{
currentIndex++;
}
// Just in case. Should never occur.
if (currentIndex > 35)
{
break;
}
}
panelBuilder.build();
}
}
// ---------------------------------------------------------------------
// Section: Private classes
// ---------------------------------------------------------------------
/**
* This CustomPanelListener allows to move items in current panel.
*/
private class CustomPanelListener implements PanelListener
{
@Override
public void setup()
{
}
@Override
public void onInventoryClose(InventoryCloseEvent inventoryCloseEvent)
{
}
@Override
public void onInventoryClick(User user, InventoryClickEvent event)
{
// First row of elements should be ignored, as it contains buttons and blocked slots.
event.setCancelled(event.getRawSlot() < 9 ||
event.getRawSlot() < 35 ||
event.getRawSlot() % 9 == 0 ||
event.getRawSlot() % 9 == 8);
}
}
// ---------------------------------------------------------------------
// Section: Enums
// ---------------------------------------------------------------------
/**
* This enum holds all button values in current gui.
*/
private enum Button
{
SAVE,
ADD,
REMOVE,
VIEW,
RETURN
}
/**
* This enum holds which Lore is edited with current GUI.
*/
public enum LoreType
{
CHALLENGES,
LEVELS,
}
// ---------------------------------------------------------------------
// Section: Variables
// ---------------------------------------------------------------------
/**
* Lore that will be edited with current GUI.
*/
private final LoreType lore;
/**
* List of lore elements that are currently enabled.
*/
private List<String> activeValues;
// ---------------------------------------------------------------------
// Section: Constants
// ---------------------------------------------------------------------
private final static String REFERENCE_DESCRIPTION = "challenges.gui.descriptions.admin.";
}

View File

@ -236,21 +236,11 @@ public class EditSettingsGUI extends CommonGUI
{ {
description = new ArrayList<>(2); description = new ArrayList<>(2);
description.add(this.user.getTranslation("challenges.gui.descriptions.admin.level-lore")); description.add(this.user.getTranslation("challenges.gui.descriptions.admin.level-lore"));
description.add(this.user.getTranslation("challenges.gui.descriptions.current-value",
"[value]", this.settings.getLevelLoreMessage()));
name = this.user.getTranslation("challenges.gui.buttons.admin.level-lore"); name = this.user.getTranslation("challenges.gui.buttons.admin.level-lore");
icon = new ItemStack(Material.MAP); icon = new ItemStack(Material.MAP);
clickHandler = (panel, user1, clickType, i) -> { clickHandler = (panel, user1, clickType, i) -> {
// TODO: AnvilGUI is out. Need to implement better GUI for editing this. EditLoreGUI.open(this, EditLoreGUI.LoreType.LEVELS);
// new AnvilGUI(this.addon.getPlugin(),
// this.user.getPlayer(),
// this.settings.getLevelLoreMessage(),
// (player, reply) -> {
// this.settings.setLevelLoreMessage(reply);
// panel.getInventory().setItem(i, this.getSettingsButton(button).getItem());
// return reply;
// });
return true; return true;
}; };
@ -261,21 +251,11 @@ public class EditSettingsGUI extends CommonGUI
{ {
description = new ArrayList<>(2); description = new ArrayList<>(2);
description.add(this.user.getTranslation("challenges.gui.descriptions.admin.challenge-lore")); description.add(this.user.getTranslation("challenges.gui.descriptions.admin.challenge-lore"));
description.add(this.user.getTranslation("challenges.gui.descriptions.current-value",
"[value]", this.settings.getChallengeLoreMessage()));
name = this.user.getTranslation("challenges.gui.buttons.admin.challenge-lore"); name = this.user.getTranslation("challenges.gui.buttons.admin.challenge-lore");
icon = new ItemStack(Material.PAPER); icon = new ItemStack(Material.PAPER);
clickHandler = (panel, user1, clickType, i) -> { clickHandler = (panel, user1, clickType, i) -> {
// TODO: AnvilGUI is out. Need to implement better GUI for editing this.
// new AnvilGUI(this.addon.getPlugin(), EditLoreGUI.open(this, EditLoreGUI.LoreType.CHALLENGES);
// this.user.getPlayer(),
// this.settings.getChallengeLoreMessage(),
// (player, reply) -> {
// this.settings.setChallengeLoreMessage(reply);
// panel.getInventory().setItem(i, this.getSettingsButton(button).getItem());
// return reply;
// });
return true; return true;
}; };

View File

@ -62,32 +62,55 @@ gui-settings:
# one object from challenge description. If letter is not used, then its represented part # one object from challenge description. If letter is not used, then its represented part
# will not be in description. If use any letter that is not recognized, then it will be # will not be in description. If use any letter that is not recognized, then it will be
# ignored. Some strings can be customized via lang file under 'challenges.gui.challenge-description'. # ignored. Some strings can be customized via lang file under 'challenges.gui.challenge-description'.
# List of letters and their meaning: # List of values and their meaning:
# - L - Level String: '*.level' # - LEVEL - Level String: '*.level'
# - S - Status String: '*.completed' # - STATUS - Status String: '*.completed'
# - T - Times String: '*.completed-times', '*.completed-times-of' or '*.maxed-reached' # - COUNT - Times String: '*.completed-times', '*.completed-times-of' or '*.maxed-reached'
# - D - Description String: defined in challenge object - challenge.description # - DESCRIPTION - Description String: defined in challenge object - challenge.description
# - W - Warning String: '*.warning-items-take', '*.objects-close-by', '*.warning-entities-kill', '*.warning-blocks-remove' # - WARNINGS - Warning String: '*.warning-items-take', '*.objects-close-by', '*.warning-entities-kill', '*.warning-blocks-remove'
# - E - Environment String: defined in challenge object - challenge.environment # - ENVIRONMENT - Environment String: defined in challenge object - challenge.environment
# - Q - Requirement String: '*.required-level', '*.required-money', '*.required-experience' # - REQUIREMENTS - Requirement String: '*.required-level', '*.required-money', '*.required-experience' and items, blocks or entities
# - R - Reward String: '*.experience-reward', '*.money-reward', '*.not-repeatable' # - REWARD_TEXT - Reward String: message that is defined in challenge.rewardTest and challenge.repeatRewardText
# By adding 'i' after Q or R (requirements and rewards) will display list of items, blocks # - REWARD_OTHER - Reward extra String: '*.experience-reward', '*.money-reward', '*.not-repeatable'
# and entities that are defined in challenge and can be customized under 'challenges.gui.description.*' # - REWARD_ITEMS - Reward Items: List of items that will be rewarded.
challenge-lore-message: LSTDEQiWRi # - REWARD_COMMANDS - Reward Commands: List of commands that will be rewarded.
# Requirement and reward items, blocks and entities that are defined in challenge and can be customized under 'challenges.gui.item-description.*'
challenge-lore:
- LEVEL
- STATUS
- COUNT
- DESCRIPTION
- WARNINGS
- ENVIRONMENT
- REQUIREMENTS
- REWARD_TEXT
- REWARD_OTHER
- REWARD_ITEMS
- REWARD_COMMANDS
# #
# This string allows to change element order in Level description. Each letter represents # This string allows to change element order in Level description. Each letter represents
# one object from level description. If letter is not used, then its represented part # one object from level description. If letter is not used, then its represented part
# will not be in description. If use any letter that is not recognized, then it will be # will not be in description. If use any letter that is not recognized, then it will be
# ignored. Some strings can be customized via lang file under 'challenges.gui.level-description'. # ignored. Some strings can be customized via lang file under 'challenges.gui.level-description'.
# List of letters and their meaning: # List of values and their meaning:
# - S - Status String: '*.completed' # - LEVEL_STATUS - Status String: '*.completed'
# - T - Count of completed challenges String: '*.completed-challenges-of' # - CHALLENGE_COUNT - Count of completed challenges String: '*.completed-challenges-of'
# - D - Description String: defined in level object - challengeLevel.unlockMessage # - UNLOCK_MESSAGE - Description String: defined in level object - challengeLevel.unlockMessage
# - A - WaiverAmount String: '*.waver-amount' # - WAIVER_AMOUNT - WaiverAmount String: '*.waver-amount'
# - R - Reward String: '*.experience-reward', '*.money-reward', '*.not-repeatable' # - LEVEL_REWARD_TEXT - Reward String: message that is defined in challengeLevel.rewardText.
# By adding 'i' after R (rewards) will display list of items that are defined in challenge # - LEVEL_REWARD_OTHER - Reward extra String: '*.experience-reward', '*.money-reward'
# and can be customized under 'challenges.gui.description.*' # - LEVEL_REWARD_ITEMS - Reward Items: List of items that will be rewarded.
level-lore-message: STDARi # - LEVEL_REWARD_COMMANDS - Reward Commands: List of commands that will be rewarded.
# Reward items that are defined in challenge level and can be customized under 'challenges.gui.item-description.*'
level-lore:
- LEVEL_STATUS
- CHALLENGE_COUNT
- UNLOCK_MESSAGE
- WAIVER_AMOUNT
- LEVEL_REWARD_TEXT
- LEVEL_REWARD_OTHER
- LEVEL_REWARD_ITEMS
- LEVEL_REWARD_COMMANDS
# #
# This indicate if challenges data will be stored per island (true) or per player (false). # This indicate if challenges data will be stored per island (true) or per player (false).
store-island-data: false store-island-data: false

View File

@ -273,6 +273,28 @@ challenges:
library-lang: '&aLanguage: [lang]' library-lang: '&aLanguage: [lang]'
library-gamemode: '&aPrimary for [gamemode]' library-gamemode: '&aPrimary for [gamemode]'
lore:
level: "Level string. | Represents translation 'challenges.gui.challenge-description.level'."
status: "Status string. | Represents translation 'challenges.gui.challenge-description.completed'."
count: "Completion count string. | Represents translation for 'challenges.gui.challenge-description.completed-times', 'challenges.gui.challenge-description.completed-times-of' and 'challenges.gui.challenge-description.maxed-reached'."
description: "Description string. | Defined in challenges object - challenge.description."
warnings: "Warning string. | Represents translation for: | 'challenges.gui.challenge-description.warning-items-take' | 'challenges.gui.challenge-description.objects-close-by' | 'challenges.gui.challenge-description.warning-entities-kill' | 'challenges.gui.challenge-description.warning-blocks-remove'."
environment: "Environment string. | Defined in challenges object - challenge.environment."
requirements: "Requirement string. | Represents translation for: | 'challenges.gui.challenge-description.required-level' | 'challenges.gui.challenge-description.required-money' | 'challenges.gui.challenge-description.required-experience' | and challenge.requiredItems, challenge.requiredBlocks or challenge.requiredEntities."
reward_text: "Reward string. | Defined in challenge.rewardText and challenge.repeatRewardText"
reward_other: "Reward other String. | Represents translation for: | 'challenges.gui.challenge-description.experience-reward' | 'challenges.gui.challenge-description.money-reward' | 'challenges.gui.challenge-description.not-repeatable'."
reward_items: "Reward Items. | List of items that will be rewarded defined in challenge.rewardItems and challenge.repeatRewardItems."
reward_commands: "Reward Commands. | List of commands that will be rewarded defined in challenge.rewardCommands and challenge.repeatRewardCommands."
level_status: "Status string. | Represents translation 'challenges.gui.level-description.completed'."
challenge_count: "Completed challenge count string. | Represents translation for 'challenges.gui.level-description.completed-challenges-of'"
unlock_message: "Unlock message string. | Defined in challenges Level object - challengeLevel.unlockMessage."
waiver_amount: "Shippable challenge count to unlock next level string. | Represents translation for 'challenges.gui.level-description.waver-amount'"
level_reward_text: "Reward string. | Defined in challengeLevel.rewardText"
level_reward_other: "Reward other String. | Represents translation for: | 'challenges.gui.level-description.experience-reward' | 'challenges.gui.level-description.money-reward'."
level_reward_items: "Reward Items. | List of items that will be rewarded defined in challengeLevel.rewardItems."
level_reward_commands: "Reward Commands. | List of commands that will be rewarded defined in challengeLevel.rewardCommands."
current-value: '|&6Current value: [value].' current-value: '|&6Current value: [value].'
enabled: 'Active' enabled: 'Active'
disabled: 'Disabled' disabled: 'Disabled'