Improve debugging in Creative GameMode.

Add ability to Creative GameMode complete inventory and exp challenge without necessary items and exp.
This commit is contained in:
BONNe1704 2019-02-14 10:28:06 +02:00
parent 40d33f4afc
commit 68b0fa3b2e
2 changed files with 56 additions and 43 deletions

View File

@ -6,7 +6,7 @@
<groupId>world.bentobox</groupId> <groupId>world.bentobox</groupId>
<artifactId>challenges</artifactId> <artifactId>challenges</artifactId>
<version>0.5.0</version> <version>0.6.0-SNAPSHOT</version>
<name>Challenges</name> <name>Challenges</name>
<description>Challenges is an add-on for BentoBox, an expandable Minecraft Bukkit plugin for island-type games like SkyBlock, AcidIsland or CaveBlock.</description> <description>Challenges is an add-on for BentoBox, an expandable Minecraft Bukkit plugin for island-type games like SkyBlock, AcidIsland or CaveBlock.</description>

View File

@ -4,6 +4,7 @@
package world.bentobox.challenges.panel; package world.bentobox.challenges.panel;
import org.bukkit.GameMode;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.Block; import org.bukkit.block.Block;
@ -486,50 +487,57 @@ public class TryToComplete
{ {
// Run through inventory // Run through inventory
List<ItemStack> required = new ArrayList<>(this.challenge.getRequiredItems()); List<ItemStack> required = new ArrayList<>(this.challenge.getRequiredItems());
for (ItemStack req : required)
{
// Check for FIREWORK_ROCKET, ENCHANTED_BOOK, WRITTEN_BOOK, POTION and FILLED_MAP because these have unique meta when created
switch (req.getType())
{
case FIREWORK_ROCKET:
case ENCHANTED_BOOK:
case WRITTEN_BOOK:
case FILLED_MAP:
// Get how many items are in the inventory. Item stacks amounts need to be summed
int numInInventory =
Arrays.stream(this.user.getInventory().getContents()).filter(Objects::nonNull).
filter(i -> i.getType().equals(req.getType())).
mapToInt(ItemStack::getAmount).
sum();
if (numInInventory < req.getAmount()) // Players in creative game mode has got all items. No point to search for them.
{ if (this.user.getPlayer().getGameMode() != GameMode.CREATIVE)
this.user.sendMessage("challenges.errors.not-enough-items", {
"[items]", for (ItemStack req : required)
Util.prettifyText(req.getType().toString())); {
return EMPTY_RESULT; // Check for FIREWORK_ROCKET, ENCHANTED_BOOK, WRITTEN_BOOK, POTION and
} // FILLED_MAP because these have unique meta when created
break; switch (req.getType())
default: {
// General checking case FIREWORK_ROCKET:
if (!this.user.getInventory().containsAtLeast(req, req.getAmount())) case ENCHANTED_BOOK:
{ case WRITTEN_BOOK:
this.user.sendMessage("challenges.errors.not-enough-items", case FILLED_MAP:
"[items]", // Get how many items are in the inventory. Item stacks amounts need to be summed
Util.prettifyText(req.getType().toString())); int numInInventory =
return EMPTY_RESULT; Arrays.stream(this.user.getInventory().getContents()).
} filter(Objects::nonNull).
filter(i -> i.getType().equals(req.getType())).
mapToInt(ItemStack::getAmount).
sum();
if (numInInventory < req.getAmount())
{
this.user.sendMessage("challenges.errors.not-enough-items",
"[items]",
Util.prettifyText(req.getType().toString()));
return EMPTY_RESULT;
}
break;
default:
// General checking
if (!this.user.getInventory().containsAtLeast(req, req.getAmount()))
{
this.user.sendMessage("challenges.errors.not-enough-items",
"[items]",
Util.prettifyText(req.getType().toString()));
return EMPTY_RESULT;
}
break;
}
}
// If remove items, then remove them
if (this.challenge.isTakeItems())
{
this.removeItems(required);
} }
} }
// If remove items, then remove them
if (this.challenge.isTakeItems())
{
this.removeItems(required);
}
// Return the result // Return the result
return new ChallengeResult().setMeetsRequirements().setRepeat( return new ChallengeResult().setMeetsRequirements().setRepeat(
this.manager.isChallengeComplete(this.user, this.challenge)); this.manager.isChallengeComplete(this.user, this.challenge));
@ -790,8 +798,11 @@ public class TryToComplete
{ {
this.user.sendMessage("challenges.errors.incorrect"); this.user.sendMessage("challenges.errors.incorrect");
} }
else if (this.user.getPlayer().getTotalExperience() < this.challenge.getRequiredExperience()) else if (this.user.getPlayer().getTotalExperience() < this.challenge.getRequiredExperience() &&
this.user.getPlayer().getGameMode() != GameMode.CREATIVE)
{ {
// Players in creative gamemode has infinite amount of EXP.
this.user.sendMessage("challenges.errors.not-enough-experience", this.user.sendMessage("challenges.errors.not-enough-experience",
"[value]", "[value]",
Integer.toString(this.challenge.getRequiredExperience())); Integer.toString(this.challenge.getRequiredExperience()));
@ -810,8 +821,10 @@ public class TryToComplete
this.addon.getEconomyProvider().withdraw(this.user, this.challenge.getRequiredMoney()); this.addon.getEconomyProvider().withdraw(this.user, this.challenge.getRequiredMoney());
} }
if (this.challenge.isTakeExperience()) if (this.challenge.isTakeExperience() &&
this.user.getPlayer().getGameMode() != GameMode.CREATIVE)
{ {
// Cannot take anything from creative game mode.
this.user.getPlayer().setTotalExperience( this.user.getPlayer().setTotalExperience(
this.user.getPlayer().getTotalExperience() - this.challenge.getRequiredExperience()); this.user.getPlayer().getTotalExperience() - this.challenge.getRequiredExperience());
} }