Skip to content

Commit

Permalink
Implement Money support for challenges. #25
Browse files Browse the repository at this point in the history
If VaultHook is found, then add money to user account.
Add check on Required XP and Required Money.
Enable Money withdraw if isTakeMoney() is true.
  • Loading branch information
BONNe committed Dec 17, 2018
1 parent cb04689 commit c2051d2
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 8 deletions.
80 changes: 73 additions & 7 deletions src/main/java/bentobox/addon/challenges/panel/TryToComplete.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;

import org.bukkit.Material;
Expand All @@ -26,6 +27,7 @@
import bentobox.addon.challenges.database.object.Challenges.ChallengeType;
import world.bentobox.bentobox.api.localization.TextVariables;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.hooks.VaultHook;
import world.bentobox.bentobox.util.Util;
import world.bentobox.level.Level;

Expand Down Expand Up @@ -89,8 +91,11 @@ public ChallengeResult build() {
for (ItemStack reward : challenge.getRewardItems()) {
user.getInventory().addItem(reward).forEach((k,v) -> user.getWorld().dropItem(user.getLocation(), v));
}

// Give money
challenge.getRewardMoney();
this.addon.getPlugin().getVault().ifPresent(
vaultHook -> vaultHook.deposit(this.user, this.challenge.getRewardMoney()));

// Give exp
user.getPlayer().giveExp(challenge.getRewardExp());
// Run commands
Expand All @@ -107,8 +112,11 @@ public ChallengeResult build() {
for (ItemStack reward : challenge.getRepeatItemReward()) {
user.getInventory().addItem(reward).forEach((k,v) -> user.getWorld().dropItem(user.getLocation(), v));
}
// Give money
challenge.getRepeatMoneyReward();

// Give money
this.addon.getPlugin().getVault().ifPresent(
vaultHook -> vaultHook.deposit(this.user, this.challenge.getRepeatMoneyReward()));

// Give exp
user.getPlayer().giveExp(challenge.getRepeatExpReward());
// Run commands
Expand Down Expand Up @@ -148,8 +156,11 @@ public TryToComplete(ChallengesAddon addon, User user, ChallengesManager manager
for (ItemStack reward : challenge.getRewardItems()) {
user.getInventory().addItem(reward).forEach((k,v) -> user.getWorld().dropItem(user.getLocation(), v));
}
// Give money
challenge.getRewardMoney();

// Give money
this.addon.getPlugin().getVault().ifPresent(
vaultHook -> vaultHook.deposit(this.user, this.challenge.getRewardMoney()));

// Give exp
user.getPlayer().giveExp(challenge.getRewardExp());
// Run commands
Expand All @@ -166,8 +177,11 @@ public TryToComplete(ChallengesAddon addon, User user, ChallengesManager manager
for (ItemStack reward : challenge.getRepeatItemReward()) {
user.getInventory().addItem(reward).forEach((k,v) -> user.getWorld().dropItem(user.getLocation(), v));
}

// Give money
challenge.getRepeatMoneyReward();
this.addon.getPlugin().getVault().ifPresent(
vaultHook -> vaultHook.deposit(this.user, this.challenge.getRepeatMoneyReward()));

// Give exp
user.getPlayer().giveExp(challenge.getRepeatExpReward());
// Run commands
Expand Down Expand Up @@ -206,6 +220,26 @@ private ChallengeResult checkIfCanCompleteChallenge() {
user.sendMessage("challenges.not-repeatable");
return new ChallengeResult();
}

// Check money
Optional<VaultHook> vaultHook = this.addon.getPlugin().getVault();

if (vaultHook.isPresent())
{
if (!vaultHook.get().has(this.user, this.challenge.getReqMoney()))
{
this.user.sendMessage("challenges.not-enough-money");
return new ChallengeResult();
}
}

// Check exp
if (this.user.getPlayer().getTotalExperience() < this.challenge.getReqExp())
{
this.user.sendMessage("challenges.not-enough-exp");
return new ChallengeResult();
}

switch (challenge.getChallengeType()) {
case INVENTORY:
return checkInventory();
Expand Down Expand Up @@ -249,10 +283,33 @@ private ChallengeResult checkInventory() {
removeItems(required);

}

// process money removal
this.removeMoney();

// Return the result
return new ChallengeResult().setMeetsRequirements().setRepeat(manager.isChallengeComplete(user, challenge.getUniqueId(), world));
}


/**
* This method withdraw user money, if challenge Required Money is larger then 0, and
* it is set to removal.
* This works only if vaultHook is enabled.
*/
private void removeMoney()
{
Optional<VaultHook> vaultHook = this.addon.getPlugin().getVault();

if (vaultHook.isPresent() &&
this.challenge.isTakeMoney() &&
this.challenge.getReqMoney() > 0)
{
vaultHook.get().withdraw(this.user, this.challenge.getReqMoney());
}
}


/**
* Removes items from a user's inventory
* @param required - a list of item stacks to be removed
Expand Down Expand Up @@ -290,7 +347,9 @@ private ChallengeResult checkLevel() {
long level = addon.getAddonByName("Level")
.map(l -> ((Level)l).getIslandLevel(world, user.getUniqueId())).orElse(0L);
if (level >= challenge.getReqIslandlevel()) {
return new ChallengeResult().setMeetsRequirements();
// process money removal
this.removeMoney();
return new ChallengeResult().setMeetsRequirements();
} else {
user.sendMessage("challenges.error.island-level", TextVariables.NUMBER, String.valueOf(challenge.getReqIslandlevel()));
return new ChallengeResult();
Expand All @@ -309,6 +368,13 @@ private ChallengeResult checkSurrounding() {
// Search for items only if entities found
result = searchForBlocks(challenge.getRequiredBlocks(), challenge.getSearchRadius());
}

if (result.meetsRequirements && this.challenge.isTakeMoney())
{
// process money removal
this.removeMoney();
}

return result;
}

Expand Down
4 changes: 3 additions & 1 deletion src/main/resources/locales/en-US.yml
Original file line number Diff line number Diff line change
Expand Up @@ -98,4 +98,6 @@ challenges:
rewards: "&FReward(s)"
to-complete: "Complete [challengesToDo] more [thisLevel] challenges to unlock this level!"
you-completed: "You completed the [challenge] challenge!"
you-repeated: "You repeated the [challenge] challenge!"
you-repeated: "You repeated the [challenge] challenge!"
not-enough-money: "It is necessary to have [money] on your account to complete the challenge."
not-enough-exp: "It is necessary to have [xp] EXP to complete challenge."

0 comments on commit c2051d2

Please sign in to comment.