Skip to content

Commit

Permalink
Fixes inventory item removal bug (for sure this time).
Browse files Browse the repository at this point in the history
Also saves player data after player completes a challenge or the
challenge is reset. Now reloading challenges doesn't cause challenge
completion loss.

#27
#30
  • Loading branch information
tastybento committed Nov 23, 2018
1 parent 326b8ca commit edc2c45
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 15 deletions.
13 changes: 11 additions & 2 deletions src/main/java/bentobox/addon/challenges/ChallengesAddon.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
package bentobox.addon.challenges;

import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;

import bentobox.addon.challenges.commands.ChallengesCommand;
import bentobox.addon.challenges.commands.admin.Challenges;
import world.bentobox.bentobox.api.addons.Addon;
import world.bentobox.bentobox.api.commands.CompositeCommand;
import world.bentobox.level.event.IslandLevelCalculatedEvent;

/**
* Add-on to BSkyBlock that enables challenges
* @author tastybento
*
*/
public class ChallengesAddon extends Addon {
public class ChallengesAddon extends Addon implements Listener {

private ChallengesManager challengesManager;
private String permissionPrefix = "addon";
Expand All @@ -24,9 +27,15 @@ public void onLoad() {
// Save default config.yml
saveDefaultConfig();
}

@EventHandler
public void onIslandLevelChange(IslandLevelCalculatedEvent event)
{
event.getResults();
Bukkit.getLogger().info("DEBUG: event called");
}
@Override
public void onEnable() {
this.registerListener(this);
// Check if it is enabled - it might be loaded, but not enabled.
if (getPlugin() == null || !getPlugin().isEnabled()) {
Bukkit.getLogger().severe("BentoBox is not available or disabled!");
Expand Down
15 changes: 14 additions & 1 deletion src/main/java/bentobox/addon/challenges/ChallengesManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -372,9 +372,19 @@ private void save() {
lvConfig.saveConfigObject(en.getKey());
en.getValue().forEach(chConfig::saveConfigObject);
});
savePlayers();
}

private void savePlayers() {
playerData.values().forEach(players :: saveObject);
}

private void savePlayer(UUID playerUUID) {
if (playerData.containsKey(playerUUID)) {
players.saveObject(playerData.get(playerUUID));
}
}

/**
* Save to the database
* @param async - if true, saving will be done async
Expand All @@ -396,6 +406,8 @@ public void save(boolean async) {
public void setChallengeComplete(User user, String challengeUniqueId, World world) {
addPlayer(user);
playerData.get(user.getUniqueId()).setChallengeDone(world, challengeUniqueId);
// Save
savePlayer(user.getUniqueId());
}

/**
Expand All @@ -407,7 +419,8 @@ public void setChallengeComplete(User user, String challengeUniqueId, World worl
public void setResetChallenge(User user, String challengeUniqueId, World world) {
addPlayer(user);
playerData.get(user.getUniqueId()).setChallengeTimes(world, challengeUniqueId, 0);

// Save
savePlayer(user.getUniqueId());
}

/**
Expand Down
16 changes: 10 additions & 6 deletions src/main/java/bentobox/addon/challenges/panel/TryToComplete.java
Original file line number Diff line number Diff line change
Expand Up @@ -261,17 +261,21 @@ public Map<Material, Integer> removeItems(List<ItemStack> required) {
for (ItemStack i : itemsInInv) {
if (amountToBeRemoved > 0) {
// Remove either the full amount or the remaining amount
i.setAmount(Math.min(i.getAmount(), amountToBeRemoved));
// Remove all of this item
HashMap<Integer, ItemStack> remaining = user.getInventory().removeItem(i);
if (!remaining.isEmpty()) {
remaining.forEach((k,v) -> addon.logError("Could not remove items: " + v.getType() + " x " + v.getAmount()));
if (i.getAmount() >= amountToBeRemoved) {
i.setAmount(i.getAmount() - amountToBeRemoved);
removed.merge(i.getType(), amountToBeRemoved, Integer::sum);
amountToBeRemoved = 0;
} else {
amountToBeRemoved -= i.getAmount();
removed.merge(i.getType(), i.getAmount(), Integer::sum);
amountToBeRemoved -= i.getAmount();
i.setAmount(0);

}
}
}
if (amountToBeRemoved > 0) {
addon.logError("Could not remove " + amountToBeRemoved + " of " + req.getType() + " from player's inventory!");
}
}
return removed;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import static org.mockito.Mockito.when;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

Expand Down Expand Up @@ -153,14 +152,13 @@ public void testRemoveItemsMultipleOtherFail() {
*/
@Test
public void testRemoveItemsFail() {
HashMap<Integer, ItemStack> unremovable = new HashMap<>();
unremovable.put(0, new ItemStack(Material.GOLD_BLOCK, 2));
when(inv.removeItem(Mockito.any(ItemStack.class))).thenReturn(unremovable);
required.add(new ItemStack(Material.GOLD_BLOCK, 5));
required.add(new ItemStack(Material.GOLD_BLOCK, 55));
TryToComplete x = new TryToComplete(addon);
x.user(user);
Map<Material, Integer> removed = x.removeItems(required);
assertTrue(removed.isEmpty());
// It will remove 32, but not any more
assertTrue(removed.get(Material.GOLD_BLOCK) == 32);
// An error will be thrown
Mockito.verify(addon, Mockito.times(1)).logError(Mockito.anyString());
}
}

0 comments on commit edc2c45

Please sign in to comment.