Challenges/src/main/java/world/bentobox/challenges/database/object/Challenge.java

1149 lines
24 KiB
Java

package world.bentobox.challenges.database.object;
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack;
import org.eclipse.jdt.annotation.NonNull;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.JsonAdapter;
import world.bentobox.bentobox.database.objects.DataObject;
import world.bentobox.challenges.database.object.adapters.RequirementsAdapter;
import world.bentobox.challenges.database.object.requirements.Requirements;
/**
* Data object for challenges
* @author tastybento
*
*/
public class Challenge implements DataObject
{
/**
* Empty constructor
*/
public Challenge()
{
}
/**
* This enum holds all Challenge Types.
*/
public enum ChallengeType
{
/**
* The player must have the items on them.
*/
INVENTORY,
/**
* Items or required entities have to be within x blocks of the player.
*/
ISLAND,
/**
* Other type, like required money / experience or island level. This my request
* other plugins to be setup before it could work.
*/
OTHER,
}
// ---------------------------------------------------------------------
// Section: Variables
// ---------------------------------------------------------------------
/**
* Unique name for challenge object.
*/
@Expose
private String uniqueId = "";
/**
* The name of the challenge. May include color codes. Single line.
*/
@Expose
private String friendlyName = "";
/**
* Whether this challenge is deployed or not.
*/
@Expose
private boolean deployed;
/**
* Description of the challenge. Will become the lore on the icon. Can include & color codes. String List.
*/
@Expose
private List<String> description = new ArrayList<>();
/**
* The icon in the GUI for this challenge. ItemStack.
*/
@Expose
private ItemStack icon = new ItemStack(Material.PAPER);
/**
* Order of this challenge. It allows define order for challenges in
* single level. If order for challenges are equal, it will order by
* challenge unique id.
*/
@Expose
private int order = -1;
/**
* Challenge type can be INVENTORY, OTHER or ISLAND.
*/
@Expose
private ChallengeType challengeType = ChallengeType.INVENTORY;
/**
* List of environments where this challenge will occur: NETHER, NORMAL, THE_END. Leave blank for all.
*/
@Expose
private Set<World.Environment> environment = new HashSet<>();
/**
* If true, the challenge will disappear from the GUI when completed
*/
@Expose
private boolean removeWhenCompleted;
/**
* Unique level ID. Empty means that challenge is in free challenge list.
*/
@Expose
private String level = "";
// ---------------------------------------------------------------------
// Section: Requirement related
// ---------------------------------------------------------------------
/**
* Requirements for current challenge.
*/
@Expose
@JsonAdapter(RequirementsAdapter.class)
private Requirements requirements;
// ---------------------------------------------------------------------
// Section: Deprecated Requirements
// ---------------------------------------------------------------------
@Deprecated
@Expose
private Set<String> requiredPermissions = new HashSet<>();
@Deprecated
@Expose
private Map<Material, Integer> requiredBlocks = new EnumMap<>(Material.class);
@Deprecated
@Expose
private boolean removeBlocks;
@Deprecated
@Expose
private Map<EntityType, Integer> requiredEntities = new EnumMap<>(EntityType.class);
@Deprecated
@Expose
private boolean removeEntities;
@Deprecated
@Expose
private List<ItemStack> requiredItems = new ArrayList<>();
@Deprecated
@Expose
private boolean takeItems = true;
@Deprecated
@Expose
private int requiredExperience = 0;
@Deprecated
@Expose
private boolean takeExperience;
@Deprecated
@Expose
private int requiredMoney = 0;
@Deprecated
@Expose
private boolean takeMoney;
@Deprecated
@Expose
private long requiredIslandLevel;
@Deprecated
@Expose
private int searchRadius = 10;
// ---------------------------------------------------------------------
// Section: Rewards
// ---------------------------------------------------------------------
/**
* If this is blank, the reward text will be auto-generated, otherwise this will be used.
*/
@Expose
private String rewardText = "";
/**
* List of items the player will receive first time. ItemStack List.
*/
@Expose
private List<ItemStack> rewardItems = new ArrayList<>();
/**
* Experience point reward
*/
@Expose
private int rewardExperience = 0;
/**
* Money reward. Economy plugin or addon required for this option.
*/
@Expose
private int rewardMoney = 0;
/**
* Commands to run when the player completes the challenge for the first time. String List
*/
@Expose
private List<String> rewardCommands = new ArrayList<>();
// ---------------------------------------------------------------------
// Section: Repeat Rewards
// ---------------------------------------------------------------------
/**
* True if the challenge is repeatable
*/
@Expose
private boolean repeatable;
/**
* Description of the repeat rewards. If blank, it will be autogenerated
*/
@Expose
private String repeatRewardText = "";
/**
* Maximum number of times the challenge can be repeated. 0 or less will mean infinite times.
*/
@Expose
private int maxTimes = 1;
/**
* Repeat experience reward
*/
@Expose
private int repeatExperienceReward = 0;
/**
* Reward items for repeating the challenge. List of ItemStacks.
*/
@Expose
private List<ItemStack> repeatItemReward = new ArrayList<>();
/**
* Repeat money reward. Economy plugin or addon required for this option.
*/
@Expose
private int repeatMoneyReward;
/**
* Commands to run when challenge is repeated. String List.
*/
@Expose
private List<String> repeatRewardCommands = new ArrayList<>();
// ---------------------------------------------------------------------
// Section: Getters
// ---------------------------------------------------------------------
/**
* @return the uniqueId
*/
@Override
public String getUniqueId()
{
return uniqueId;
}
/**
* @return the friendlyName
*/
public String getFriendlyName()
{
return friendlyName.isEmpty() ? uniqueId : friendlyName;
}
/**
* @return the deployed
*/
public boolean isDeployed()
{
return deployed;
}
/**
* @return the description
*/
public List<String> getDescription()
{
return description;
}
/**
* @return the icon
*/
public ItemStack getIcon()
{
return icon !=null ? icon.clone() : new ItemStack(Material.PAPER);
}
/**
* @return the order
*/
public int getOrder()
{
return order;
}
/**
* @return the challengeType
*/
public ChallengeType getChallengeType()
{
return challengeType;
}
/**
* @return the environment
*/
public Set<World.Environment> getEnvironment()
{
return environment;
}
/**
* @return the level
*/
public String getLevel()
{
return level;
}
/**
* @return the removeWhenCompleted
*/
public boolean isRemoveWhenCompleted()
{
return removeWhenCompleted;
}
/**
* Method Challenge#getRequirements returns the requirements of this object.
* @return the requirements (type Requirements) of this object.
*/
@SuppressWarnings("unchecked")
public <T extends Requirements> T getRequirements()
{
return (T) this.requirements;
}
/**
* @return the requiredPermissions
*/
@Deprecated
public Set<String> getRequiredPermissions()
{
return requiredPermissions;
}
/**
* @return the requiredBlocks
*/
@Deprecated
public Map<Material, Integer> getRequiredBlocks()
{
return requiredBlocks;
}
/**
* @return the removeBlocks
*/
@Deprecated
public boolean isRemoveBlocks()
{
return removeBlocks;
}
/**
* @return the requiredEntities
*/
@Deprecated
public Map<EntityType, Integer> getRequiredEntities()
{
return requiredEntities;
}
/**
* @return the removeEntities
*/
@Deprecated
public boolean isRemoveEntities()
{
return removeEntities;
}
/**
* @return the requiredItems
*/
@Deprecated
public List<ItemStack> getRequiredItems()
{
return requiredItems;
}
/**
* @return the takeItems
*/
@Deprecated
public boolean isTakeItems()
{
return takeItems;
}
/**
* @return the requiredExperience
*/
@Deprecated
public int getRequiredExperience()
{
return requiredExperience;
}
/**
* @return the takeExperience
*/
@Deprecated
public boolean isTakeExperience()
{
return takeExperience;
}
/**
* @return the requiredMoney
*/
@Deprecated
public int getRequiredMoney()
{
return requiredMoney;
}
/**
* @return the takeMoney
*/
@Deprecated
public boolean isTakeMoney()
{
return takeMoney;
}
/**
* @return the requiredIslandLevel
*/
@Deprecated
public long getRequiredIslandLevel()
{
return requiredIslandLevel;
}
/**
* @return the searchRadius
*/
@Deprecated
public int getSearchRadius()
{
return searchRadius;
}
/**
* @return the rewardText
*/
public String getRewardText()
{
return rewardText;
}
/**
* @return the rewardItems
*/
public List<ItemStack> getRewardItems()
{
return rewardItems;
}
/**
* @return the rewardExperience
*/
public int getRewardExperience()
{
return rewardExperience;
}
/**
* @return the rewardMoney
*/
public int getRewardMoney()
{
return rewardMoney;
}
/**
* @return the rewardCommands
*/
public List<String> getRewardCommands()
{
return rewardCommands;
}
/**
* @return the repeatable
*/
public boolean isRepeatable()
{
return repeatable;
}
/**
* @return the repeatRewardText
*/
public String getRepeatRewardText()
{
return repeatRewardText;
}
/**
* @return the maxTimes
*/
public int getMaxTimes()
{
return maxTimes;
}
/**
* @return the repeatExperienceReward
*/
public int getRepeatExperienceReward()
{
return repeatExperienceReward;
}
/**
* @return the repeatItemReward
*/
public List<ItemStack> getRepeatItemReward()
{
return repeatItemReward;
}
/**
* @return the repeatMoneyReward
*/
public int getRepeatMoneyReward()
{
return repeatMoneyReward;
}
/**
* @return the repeatRewardCommands
*/
public List<String> getRepeatRewardCommands()
{
return repeatRewardCommands;
}
// ---------------------------------------------------------------------
// Section: Setters
// ---------------------------------------------------------------------
/**
* @param uniqueId the uniqueId to set
*/
@Override
public void setUniqueId(String uniqueId)
{
this.uniqueId = uniqueId;
}
/**
* This method sets the friendlyName value.
* @param friendlyName the friendlyName new value.
*
*/
public void setFriendlyName(String friendlyName)
{
this.friendlyName = friendlyName;
}
/**
* This method sets the deployed value.
* @param deployed the deployed new value.
*
*/
public void setDeployed(boolean deployed)
{
this.deployed = deployed;
}
/**
* This method sets the description value.
* @param description the description new value.
*
*/
public void setDescription(List<String> description)
{
this.description = description;
}
/**
* This method sets the icon value.
* @param icon the icon new value.
*
*/
public void setIcon(ItemStack icon)
{
this.icon = icon;
}
/**
* This method sets the order value.
* @param order the order new value.
*
*/
public void setOrder(int order)
{
this.order = order;
}
/**
* This method sets the challengeType value.
* @param challengeType the challengeType new value.
*
*/
public void setChallengeType(ChallengeType challengeType)
{
this.challengeType = challengeType;
}
/**
* This method sets the environment value.
* @param environment the environment new value.
*
*/
public void setEnvironment(Set<World.Environment> environment)
{
this.environment = environment;
}
/**
* This method sets the level value.
* @param level the level new value.
*/
public void setLevel(@NonNull String level)
{
this.level = level;
}
/**
* This method sets the removeWhenCompleted value.
* @param removeWhenCompleted the removeWhenCompleted new value.
*
*/
public void setRemoveWhenCompleted(boolean removeWhenCompleted)
{
this.removeWhenCompleted = removeWhenCompleted;
}
/**
* This method sets the requiredPermissions value.
* @param requiredPermissions the requiredPermissions new value.
*
*/
@Deprecated
public void setRequiredPermissions(Set<String> requiredPermissions)
{
this.requiredPermissions = requiredPermissions;
}
/**
* This method sets the requiredBlocks value.
* @param requiredBlocks the requiredBlocks new value.
*
*/
@Deprecated
public void setRequiredBlocks(Map<Material, Integer> requiredBlocks)
{
this.requiredBlocks = requiredBlocks;
}
/**
* This method sets the removeBlocks value.
* @param removeBlocks the removeBlocks new value.
*
*/
@Deprecated
public void setRemoveBlocks(boolean removeBlocks)
{
this.removeBlocks = removeBlocks;
}
/**
* This method sets the requiredEntities value.
* @param requiredEntities the requiredEntities new value.
*
*/
@Deprecated
public void setRequiredEntities(Map<EntityType, Integer> requiredEntities)
{
this.requiredEntities = requiredEntities;
}
/**
* This method sets the removeEntities value.
* @param removeEntities the removeEntities new value.
*
*/
@Deprecated
public void setRemoveEntities(boolean removeEntities)
{
this.removeEntities = removeEntities;
}
/**
* This method sets the requiredItems value.
* @param requiredItems the requiredItems new value.
*
*/
@Deprecated
public void setRequiredItems(List<ItemStack> requiredItems)
{
this.requiredItems = requiredItems;
}
/**
* This method sets the takeItems value.
* @param takeItems the takeItems new value.
*
*/
@Deprecated
public void setTakeItems(boolean takeItems)
{
this.takeItems = takeItems;
}
/**
* This method sets the requiredExperience value.
* @param requiredExperience the requiredExperience new value.
*
*/
@Deprecated
public void setRequiredExperience(int requiredExperience)
{
this.requiredExperience = requiredExperience;
}
/**
* This method sets the takeExperience value.
* @param takeExperience the takeExperience new value.
*
*/
@Deprecated
public void setTakeExperience(boolean takeExperience)
{
this.takeExperience = takeExperience;
}
/**
* This method sets the requiredMoney value.
* @param requiredMoney the requiredMoney new value.
*
*/
@Deprecated
public void setRequiredMoney(int requiredMoney)
{
this.requiredMoney = requiredMoney;
}
/**
* This method sets the takeMoney value.
* @param takeMoney the takeMoney new value.
*
*/
@Deprecated
public void setTakeMoney(boolean takeMoney)
{
this.takeMoney = takeMoney;
}
/**
* This method sets the requiredIslandLevel value.
* @param requiredIslandLevel the requiredIslandLevel new value.
*
*/
@Deprecated
public void setRequiredIslandLevel(long requiredIslandLevel)
{
this.requiredIslandLevel = requiredIslandLevel;
}
/**
* This method sets the searchRadius value.
* @param searchRadius the searchRadius new value.
*
*/
@Deprecated
public void setSearchRadius(int searchRadius)
{
this.searchRadius = searchRadius;
}
/**
* This method sets the rewardText value.
* @param rewardText the rewardText new value.
*
*/
public void setRewardText(String rewardText)
{
this.rewardText = rewardText;
}
/**
* This method sets the rewardItems value.
* @param rewardItems the rewardItems new value.
*
*/
public void setRewardItems(List<ItemStack> rewardItems)
{
this.rewardItems = rewardItems;
}
/**
* This method sets the rewardExperience value.
* @param rewardExperience the rewardExperience new value.
*
*/
public void setRewardExperience(int rewardExperience)
{
this.rewardExperience = rewardExperience;
}
/**
* This method sets the rewardMoney value.
* @param rewardMoney the rewardMoney new value.
*
*/
public void setRewardMoney(int rewardMoney)
{
this.rewardMoney = rewardMoney;
}
/**
* This method sets the rewardCommands value.
* @param rewardCommands the rewardCommands new value.
*
*/
public void setRewardCommands(List<String> rewardCommands)
{
this.rewardCommands = rewardCommands;
}
/**
* This method sets the repeatable value.
* @param repeatable the repeatable new value.
*
*/
public void setRepeatable(boolean repeatable)
{
this.repeatable = repeatable;
}
/**
* This method sets the repeatRewardText value.
* @param repeatRewardText the repeatRewardText new value.
*
*/
public void setRepeatRewardText(String repeatRewardText)
{
this.repeatRewardText = repeatRewardText;
}
/**
* This method sets the maxTimes value.
* @param maxTimes the maxTimes new value.
*
*/
public void setMaxTimes(int maxTimes)
{
this.maxTimes = maxTimes;
}
/**
* This method sets the repeatExperienceReward value.
* @param repeatExperienceReward the repeatExperienceReward new value.
*
*/
public void setRepeatExperienceReward(int repeatExperienceReward)
{
this.repeatExperienceReward = repeatExperienceReward;
}
/**
* This method sets the repeatItemReward value.
* @param repeatItemReward the repeatItemReward new value.
*
*/
public void setRepeatItemReward(List<ItemStack> repeatItemReward)
{
this.repeatItemReward = repeatItemReward;
}
/**
* This method sets the repeatMoneyReward value.
* @param repeatMoneyReward the repeatMoneyReward new value.
*
*/
public void setRepeatMoneyReward(int repeatMoneyReward)
{
this.repeatMoneyReward = repeatMoneyReward;
}
/**
* This method sets the repeatRewardCommands value.
* @param repeatRewardCommands the repeatRewardCommands new value.
*
*/
public void setRepeatRewardCommands(List<String> repeatRewardCommands)
{
this.repeatRewardCommands = repeatRewardCommands;
}
/**
* Method Challenge#setRequirements sets new value for the requirements of this object.
* @param requirements new value for this object.
*
*/
public void setRequirements(Requirements requirements)
{
this.requirements = requirements;
}
// ---------------------------------------------------------------------
// Section: Other methods
// ---------------------------------------------------------------------
/**
* This method match if given gameMode relates to current challenge. It is detected
* via challenge uniqueId, as it always must start with gameMode name.
* This method is created to avoid issues with capital letters in world names in 1.14
* and readjust to store GameMode name instead of world name.
* @param gameMode Name that must be checked.
* @return {@code true} if current challenge relates to given gameMode name, otherwise
* {@code false}.
*/
public boolean matchGameMode(String gameMode)
{
return gameMode != null &&
this.uniqueId.regionMatches(true, 0, gameMode, 0, gameMode.length());
}
/**
* @see java.lang.Object#hashCode()
* @return int
*/
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((uniqueId == null) ? 0 : uniqueId.hashCode());
return result;
}
/**
* @see java.lang.Object#equals(Object) ()
* @param obj of type Object
* @return boolean
*/
@Override
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (!(obj instanceof Challenge))
{
return false;
}
Challenge other = (Challenge) obj;
if (uniqueId == null)
{
return other.uniqueId == null;
}
else
{
return uniqueId.equalsIgnoreCase(other.uniqueId);
}
}
/**
* Clone method that returns clone of current challenge.
* @return Challenge that is cloned from current object.
*/
@Override
public Challenge clone()
{
Challenge clone;
try
{
clone = (Challenge) super.clone();
}
catch (CloneNotSupportedException e)
{
clone = new Challenge();
clone.setUniqueId(this.uniqueId);
clone.setFriendlyName(this.friendlyName);
clone.setDeployed(this.deployed);
clone.setDescription(new ArrayList<>(this.description));
clone.setIcon(this.icon.clone());
clone.setOrder(this.order);
clone.setChallengeType(ChallengeType.valueOf(this.challengeType.name()));
clone.setEnvironment(new HashSet<>(this.environment));
clone.setLevel(this.level);
clone.setRemoveWhenCompleted(this.removeWhenCompleted);
clone.setRequirements(this.requirements.clone());
clone.setRewardText(this.rewardText);
clone.setRewardItems(this.rewardItems.stream().map(ItemStack::clone).
collect(Collectors.toCollection(() -> new ArrayList<>(this.rewardItems.size()))));
clone.setRewardExperience(this.rewardExperience);
clone.setRewardMoney(this.rewardMoney);
clone.setRewardCommands(new ArrayList<>(this.rewardCommands));
clone.setRepeatable(this.repeatable);
clone.setRepeatRewardText(this.repeatRewardText);
clone.setMaxTimes(this.maxTimes);
clone.setRepeatExperienceReward(this.repeatExperienceReward);
clone.setRepeatItemReward(this.repeatItemReward.stream().map(ItemStack::clone).
collect(Collectors.toCollection(() -> new ArrayList<>(this.repeatItemReward.size()))));
clone.setRepeatMoneyReward(this.repeatMoneyReward);
clone.setRepeatRewardCommands(new ArrayList<>(this.repeatRewardCommands));
}
return clone;
}
}