Implement MetaData ignoring for rewards.

While required items had a metadata grouping, reward items did not have it. This will fix that.

Fixes #289
This commit is contained in:
BONNe 2022-01-04 21:45:34 +02:00
parent 71e0029d46
commit 88215b6f0c
5 changed files with 282 additions and 8 deletions

View File

@ -177,6 +177,11 @@ public class Challenge implements DataObject
@Expose
private List<String> rewardCommands = new ArrayList<>();
/**
* Set of item stacks that should ignore metadata.
*/
@Expose
private Set<Material> ignoreRewardMetaData = new HashSet<>();
// ---------------------------------------------------------------------
// Section: Repeat Rewards
@ -457,6 +462,17 @@ public class Challenge implements DataObject
}
/**
* Gets ignore reward meta data.
*
* @return the ignore reward meta data
*/
public Set<Material> getIgnoreRewardMetaData()
{
return ignoreRewardMetaData;
}
// ---------------------------------------------------------------------
// Section: Setters
// ---------------------------------------------------------------------
@ -724,6 +740,17 @@ public class Challenge implements DataObject
}
/**
* Sets ignore reward meta data.
*
* @param ignoreRewardMetaData the ignore reward meta data
*/
public void setIgnoreRewardMetaData(Set<Material> ignoreRewardMetaData)
{
this.ignoreRewardMetaData = ignoreRewardMetaData;
}
// ---------------------------------------------------------------------
// Section: Other methods
// ---------------------------------------------------------------------
@ -856,6 +883,7 @@ public class Challenge implements DataObject
clone.setRepeatMoneyReward(this.repeatMoneyReward);
clone.setRepeatRewardCommands(new ArrayList<>(this.repeatRewardCommands));
clone.setTimeout(this.timeout);
clone.setIgnoreRewardMetaData(new HashSet<>(this.ignoreRewardMetaData));
}
catch (Exception e)
{

View File

@ -115,6 +115,10 @@ public class ChallengeLevel implements DataObject, Comparable<ChallengeLevel>
@Expose
private Set<String> challenges = new HashSet<>();
@ConfigComment("")
@ConfigComment("Set of materials which metadata can be ignored.")
@Expose
private Set<Material> ignoreRewardMetaData = new HashSet<>();
// ---------------------------------------------------------------------
// Section: Getters
@ -263,6 +267,17 @@ public class ChallengeLevel implements DataObject, Comparable<ChallengeLevel>
}
/**
* Gets ignore reward meta data.
*
* @return the ignore reward meta data
*/
public Set<Material> getIgnoreRewardMetaData()
{
return ignoreRewardMetaData;
}
// ---------------------------------------------------------------------
// Section: Setters
// ---------------------------------------------------------------------
@ -424,6 +439,17 @@ public class ChallengeLevel implements DataObject, Comparable<ChallengeLevel>
}
/**
* Sets ignore reward meta data.
*
* @param ignoreRewardMetaData the ignore reward meta data
*/
public void setIgnoreRewardMetaData(Set<Material> ignoreRewardMetaData)
{
this.ignoreRewardMetaData = ignoreRewardMetaData;
}
// ---------------------------------------------------------------------
// Section: Other methods
// ---------------------------------------------------------------------
@ -564,6 +590,7 @@ public class ChallengeLevel implements DataObject, Comparable<ChallengeLevel>
clone.setRewardMoney(this.rewardMoney);
clone.setRewardCommands(new ArrayList<>(this.rewardCommands));
clone.setChallenges(new HashSet<>(this.challenges));
clone.setIgnoreRewardMetaData(new HashSet<>(this.ignoreRewardMetaData));
}
catch (Exception e)
{

View File

@ -655,7 +655,7 @@ public abstract class CommonPanel
{
StringBuilder builder = new StringBuilder();
builder.append(this.user.getTranslationOrNothing(reference + "item-title"));
Utils.groupEqualItems(challenge.getRepeatItemReward(), Collections.emptySet()).stream().
Utils.groupEqualItems(challenge.getRepeatItemReward(), challenge.getIgnoreRewardMetaData()).stream().
sorted(Comparator.comparing(ItemStack::getType)).
forEach(itemStack ->
{
@ -756,7 +756,7 @@ public abstract class CommonPanel
{
StringBuilder builder = new StringBuilder();
builder.append(this.user.getTranslationOrNothing(reference + "item-title"));
Utils.groupEqualItems(challenge.getRewardItems(), Collections.emptySet()).stream().
Utils.groupEqualItems(challenge.getRewardItems(), challenge.getIgnoreRewardMetaData()).stream().
sorted(Comparator.comparing(ItemStack::getType)).
forEach(itemStack ->
{
@ -970,7 +970,7 @@ public abstract class CommonPanel
{
StringBuilder builder = new StringBuilder();
builder.append(this.user.getTranslationOrNothing(reference + "item-title"));
Utils.groupEqualItems(level.getRewardItems(), Collections.emptySet()).stream().
Utils.groupEqualItems(level.getRewardItems(), level.getIgnoreRewardMetaData()).stream().
sorted(Comparator.comparing(ItemStack::getType)).
forEach(itemStack ->
{

View File

@ -282,11 +282,20 @@ public class EditChallengePanel extends CommonPanel
panelBuilder.item(22, this.createRewardButton(RewardButton.REPEATABLE));
if (!this.challenge.getRewardItems().isEmpty() || !this.challenge.getRepeatItemReward().isEmpty())
{
panelBuilder.item(31, this.createRewardButton(RewardButton.ADD_IGNORED_META));
}
if (!this.challenge.getIgnoreRewardMetaData().isEmpty())
{
panelBuilder.item(32, this.createRewardButton(RewardButton.REMOVE_IGNORED_META));
}
if (this.challenge.isRepeatable())
{
panelBuilder.item(13, this.createRewardButton(RewardButton.COOL_DOWN));
panelBuilder.item(31, this.createRewardButton(RewardButton.REPEAT_COUNT));
panelBuilder.item(23, this.createRewardButton(RewardButton.REPEAT_COUNT));
panelBuilder.item(15, this.createRewardButton(RewardButton.REPEAT_REWARD_TEXT));
panelBuilder.item(24, this.createRewardButton(RewardButton.REPEAT_REWARD_COMMANDS));
@ -967,6 +976,12 @@ public class EditChallengePanel extends CommonPanel
forEach(collection::remove);
collection.addAll(requirements.getIgnoreMetaData());
if (Material.values().length == collection.size())
{
// If there are no items anymore, then do not allow opening gui.
return true;
}
MultiBlockSelector.open(this.user,
MultiBlockSelector.Mode.ANY,
collection,
@ -974,6 +989,7 @@ public class EditChallengePanel extends CommonPanel
{
if (status)
{
materials.addAll(requirements.getIgnoreMetaData());
requirements.setIgnoreMetaData(new HashSet<>(materials));
}
@ -1442,7 +1458,7 @@ public class EditChallengePanel extends CommonPanel
{
description.add(this.user.getTranslation(reference + "title"));
Utils.groupEqualItems(this.challenge.getRewardItems(), Collections.emptySet()).
Utils.groupEqualItems(this.challenge.getRewardItems(), this.challenge.getIgnoreRewardMetaData()).
stream().
sorted(Comparator.comparing(ItemStack::getType)).
forEach(itemStack ->
@ -1694,7 +1710,7 @@ public class EditChallengePanel extends CommonPanel
{
description.add(this.user.getTranslation(reference + "title"));
Utils.groupEqualItems(this.challenge.getRepeatItemReward(), Collections.emptySet()).
Utils.groupEqualItems(this.challenge.getRepeatItemReward(), this.challenge.getIgnoreRewardMetaData()).
stream().
sorted(Comparator.comparing(ItemStack::getType)).
forEach(itemStack ->
@ -1821,6 +1837,101 @@ public class EditChallengePanel extends CommonPanel
description.add(this.user.getTranslation(Constants.TIPS + "shift-click-to-reset"));
}
}
case ADD_IGNORED_META -> {
if (this.challenge.getIgnoreRewardMetaData().isEmpty())
{
description.add(this.user.getTranslation(reference + "none"));
}
else
{
description.add(this.user.getTranslation(reference + "title"));
this.challenge.getIgnoreRewardMetaData().stream().
sorted(Comparator.comparing(Material::name)).
forEach(itemStack ->
description.add(this.user.getTranslationOrNothing(reference + "list",
"[item]", Utils.prettifyObject(itemStack, this.user))));
}
icon = new ItemStack(Material.GREEN_SHULKER_BOX);
clickHandler = (panel, user, clickType, slot) -> {
if (this.challenge.getRewardItems().isEmpty() &&
this.challenge.getRepeatItemReward().isEmpty())
{
// Do nothing if no requirements are set.
return true;
}
// Allow choosing only from inventory items.
Set<Material> collection = Arrays.stream(Material.values()).collect(Collectors.toSet());
this.challenge.getRewardItems().stream().
map(ItemStack::getType).
forEach(collection::remove);
this.challenge.getRepeatItemReward().stream().
map(ItemStack::getType).
forEach(collection::remove);
collection.addAll(this.challenge.getIgnoreRewardMetaData());
if (Material.values().length == collection.size())
{
// If there are no items anymore, then do not allow opening gui.
return true;
}
MultiBlockSelector.open(this.user,
MultiBlockSelector.Mode.ANY,
collection,
(status, materials) ->
{
if (status)
{
materials.addAll(this.challenge.getIgnoreRewardMetaData());
this.challenge.setIgnoreRewardMetaData(new HashSet<>(materials));
}
this.build();
});
return true;
};
glow = false;
description.add("");
description.add(this.user.getTranslation(Constants.TIPS + "click-to-add"));
}
case REMOVE_IGNORED_META -> {
icon = new ItemStack(Material.RED_SHULKER_BOX);
clickHandler = (panel, user, clickType, slot) -> {
if (this.challenge.getIgnoreRewardMetaData().isEmpty())
{
// Do nothing if no requirements are set.
return true;
}
// Allow choosing only from inventory items.
Set<Material> collection = Arrays.stream(Material.values()).collect(Collectors.toSet());
collection.removeAll(this.challenge.getIgnoreRewardMetaData());
MultiBlockSelector.open(this.user,
MultiBlockSelector.Mode.ANY,
collection,
(status, materials) ->
{
if (status)
{
this.challenge.getIgnoreRewardMetaData().removeAll(materials);
}
this.build();
});
return true;
};
glow = false;
description.add("");
description.add(this.user.getTranslation(Constants.TIPS + "click-to-remove"));
}
default -> {
icon = new ItemStack(Material.PAPER);
clickHandler = null;
@ -1951,6 +2062,9 @@ public class EditChallengePanel extends CommonPanel
REPEAT_REWARD_EXPERIENCE,
REPEAT_REWARD_MONEY,
REPEAT_REWARD_COMMANDS,
ADD_IGNORED_META,
REMOVE_IGNORED_META,
}

View File

@ -27,6 +27,7 @@ import world.bentobox.challenges.panel.CommonPanel;
import world.bentobox.challenges.panel.ConversationUtils;
import world.bentobox.challenges.panel.util.ItemSelector;
import world.bentobox.challenges.panel.util.ChallengeSelector;
import world.bentobox.challenges.panel.util.MultiBlockSelector;
import world.bentobox.challenges.utils.Constants;
import world.bentobox.challenges.utils.Utils;
@ -191,6 +192,16 @@ public class EditLevelPanel extends CommonPagedPanel<Challenge>
panelBuilder.item(13, this.createButton(Button.REWARD_ITEMS));
panelBuilder.item(22, this.createButton(Button.REWARD_EXPERIENCE));
panelBuilder.item(31, this.createButton(Button.REWARD_MONEY));
if (!this.challengeLevel.getRewardItems().isEmpty())
{
panelBuilder.item(33, this.createButton(Button.ADD_IGNORED_META));
}
if (!this.challengeLevel.getIgnoreRewardMetaData().isEmpty())
{
panelBuilder.item(34, this.createButton(Button.REMOVE_IGNORED_META));
}
}
@ -387,7 +398,7 @@ public class EditLevelPanel extends CommonPagedPanel<Challenge>
{
description.add(this.user.getTranslation(reference + "title"));
Utils.groupEqualItems(this.challengeLevel.getRewardItems(), Collections.emptySet()).
Utils.groupEqualItems(this.challengeLevel.getRewardItems(), this.challengeLevel.getIgnoreRewardMetaData()).
stream().
sorted(Comparator.comparing(ItemStack::getType)).
forEach(itemStack ->
@ -514,6 +525,97 @@ public class EditLevelPanel extends CommonPagedPanel<Challenge>
description.add(this.user.getTranslation(Constants.TIPS + "shift-click-to-reset"));
}
}
case ADD_IGNORED_META -> {
if (this.challengeLevel.getIgnoreRewardMetaData().isEmpty())
{
description.add(this.user.getTranslation(reference + "none"));
}
else
{
description.add(this.user.getTranslation(reference + "title"));
this.challengeLevel.getIgnoreRewardMetaData().stream().
sorted(Comparator.comparing(Material::name)).
forEach(itemStack ->
description.add(this.user.getTranslationOrNothing(reference + "list",
"[item]", Utils.prettifyObject(itemStack, this.user))));
}
icon = new ItemStack(Material.GREEN_SHULKER_BOX);
clickHandler = (panel, user, clickType, slot) -> {
if (this.challengeLevel.getRewardItems().isEmpty())
{
// Do nothing if no requirements are set.
return true;
}
// Allow choosing only from inventory items.
Set<Material> collection = Arrays.stream(Material.values()).collect(Collectors.toSet());
this.challengeLevel.getRewardItems().stream().
map(ItemStack::getType).
forEach(collection::remove);
collection.addAll(this.challengeLevel.getIgnoreRewardMetaData());
if (Material.values().length == collection.size())
{
// If all materials are blocked, then do not allow to open gui.
return true;
}
MultiBlockSelector.open(this.user,
MultiBlockSelector.Mode.ANY,
collection,
(status, materials) ->
{
if (status)
{
materials.addAll(this.challengeLevel.getIgnoreRewardMetaData());
this.challengeLevel.setIgnoreRewardMetaData(new HashSet<>(materials));
}
this.build();
});
return true;
};
glow = false;
description.add("");
description.add(this.user.getTranslation(Constants.TIPS + "click-to-add"));
}
case REMOVE_IGNORED_META -> {
icon = new ItemStack(Material.RED_SHULKER_BOX);
clickHandler = (panel, user, clickType, slot) -> {
if (this.challengeLevel.getIgnoreRewardMetaData().isEmpty())
{
// Do nothing if no requirements are set.
return true;
}
// Allow choosing only from inventory items.
Set<Material> collection = Arrays.stream(Material.values()).collect(Collectors.toSet());
collection.removeAll(this.challengeLevel.getIgnoreRewardMetaData());
MultiBlockSelector.open(this.user,
MultiBlockSelector.Mode.ANY,
collection,
(status, materials) ->
{
if (status)
{
this.challengeLevel.getIgnoreRewardMetaData().removeAll(materials);
}
this.build();
});
return true;
};
glow = false;
description.add("");
description.add(this.user.getTranslation(Constants.TIPS + "click-to-remove"));
}
case NAME -> {
description.add(this.user.getTranslation(reference + "value",
Constants.PARAMETER_NAME, this.challengeLevel.getFriendlyName()));
@ -858,6 +960,9 @@ public class EditLevelPanel extends CommonPagedPanel<Challenge>
REWARD_MONEY,
REWARD_COMMANDS,
ADD_IGNORED_META,
REMOVE_IGNORED_META,
ADD_CHALLENGES,
REMOVE_CHALLENGES
}