1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-19 19:25:48 +00:00

Fixed a small issue with backpacks

This commit is contained in:
TheBusyBiscuit 2021-01-17 14:27:01 +01:00
parent 9c3c6d7245
commit 7eff4d381e
5 changed files with 71 additions and 3 deletions

View File

@ -42,6 +42,7 @@
* Fixed #2721
* Fixed #2662
* Fixed #2728
* Fixed some backpack opening issues
* Fixed Infused Hopper picking up items with a max pickup delay
* Fixed duplication issues related to holograms/armorstands

View File

@ -46,6 +46,7 @@ public enum SlimefunBranch {
SlimefunBranch(@Nonnull String name, boolean official) {
Validate.notNull(name, "The branch name cannot be null");
this.name = name;
this.official = official;

View File

@ -456,9 +456,9 @@ public final class PlayerProfile {
if (id.isPresent()) {
int number = id.getAsInt();
fromUUID(UUID.fromString(uuid), profile -> {
Optional<PlayerBackpack> backpack = profile.getBackpack(number);
backpack.ifPresent(callback);
});
}

View File

@ -25,6 +25,7 @@ import io.github.thebusybiscuit.cscorelib2.collections.KeyMap;
import io.github.thebusybiscuit.cscorelib2.config.Config;
import io.github.thebusybiscuit.slimefun4.api.geo.GEOResource;
import io.github.thebusybiscuit.slimefun4.api.player.PlayerProfile;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuide;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideImplementation;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideMode;
import io.github.thebusybiscuit.slimefun4.core.multiblocks.MultiBlock;
@ -132,14 +133,36 @@ public final class SlimefunRegistry {
return backwardsCompatibility;
}
/**
* This method sets the status of backwards compatibility.
* Backwards compatibility allows Slimefun to recognize items from older versions but comes
* at a huge performance cost.
*
* @param compatible
* Whether backwards compatibility should be enabled
*/
public void setBackwardsCompatible(boolean compatible) {
backwardsCompatibility = compatible;
}
/**
* This method will make any {@link SlimefunItem} which is registered automatically
* call {@link SlimefunItem#load()}.
* Normally this method call is delayed but when the {@link Server} is already running,
* the method can be called instantaneously.
*
* @param mode
* Whether auto-loading should be enabled
*/
public void setAutoLoadingMode(boolean mode) {
automaticallyLoadItems = mode;
}
/**
* This returns a {@link List} containing every enabled {@link Category}.
*
* @return {@link List} containing every enabled {@link Category}
*/
@Nonnull
public List<Category> getCategories() {
return categories;
@ -165,11 +188,23 @@ public final class SlimefunRegistry {
return enabledItems;
}
/**
* This returns a {@link List} containing every enabled {@link Research}.
*
* @return A {@link List} containing every enabled {@link Research}
*/
@Nonnull
public List<Research> getResearches() {
return researches;
}
/**
* This method returns a {@link Set} containing the {@link UUID} of every
* {@link Player} who is currently unlocking a {@link Research}.
*
* @return A {@link Set} holding the {@link UUID} from every {@link Player}
* who is currently unlocking a {@link Research}
*/
@Nonnull
public Set<UUID> getCurrentlyResearchingPlayers() {
return researchingPlayers;
@ -200,6 +235,11 @@ public final class SlimefunRegistry {
return researchFireworks;
}
/**
* This method returns a {@link List} of every enabled {@link MultiBlock}.
*
* @return A {@link List} containing every enabled {@link MultiBlock}
*/
@Nonnull
public List<MultiBlock> getMultiBlocks() {
return multiblocks;
@ -208,6 +248,10 @@ public final class SlimefunRegistry {
/**
* This returns the corresponding {@link SlimefunGuideImplementation} for a certain
* {@link SlimefunGuideMode}.
* <p>
* This mainly only exists for internal purposes, if you want to open a certain section
* using the {@link SlimefunGuide}, then please use the static methods provided in the
* {@link SlimefunGuide} class.
*
* @param mode
* The {@link SlimefunGuideMode}

View File

@ -7,6 +7,7 @@ import java.util.UUID;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
import org.apache.commons.lang.Validate;
import org.bukkit.ChatColor;
@ -57,12 +58,21 @@ public class BackpackListener implements Listener {
@EventHandler
public void onClose(InventoryCloseEvent e) {
Player p = ((Player) e.getPlayer());
Player p = (Player) e.getPlayer();
if (markBackpackDirty(p)) {
p.playSound(p.getLocation(), Sound.ENTITY_HORSE_ARMOR, 1F, 1F);
}
}
private boolean markBackpackDirty(@Nonnull Player p) {
ItemStack backpack = backpacks.remove(p.getUniqueId());
if (backpack != null) {
p.playSound(p.getLocation(), Sound.ENTITY_HORSE_ARMOR, 1F, 1F);
PlayerProfile.getBackpack(backpack, PlayerBackpack::markDirty);
return true;
} else {
return false;
}
}
@ -109,6 +119,7 @@ public class BackpackListener implements Listener {
return backpack.isItemAllowed(item, SlimefunItem.getByItem(item));
}
@ParametersAreNonnullByDefault
public void openBackpack(Player p, ItemStack item, SlimefunBackpack backpack) {
if (item.getAmount() == 1) {
if (Slimefun.hasUnlocked(p, backpack, true) && !PlayerProfile.get(p, profile -> openBackpack(p, item, profile, backpack.getSize()))) {
@ -119,8 +130,10 @@ public class BackpackListener implements Listener {
}
}
@ParametersAreNonnullByDefault
private void openBackpack(Player p, ItemStack item, PlayerProfile profile, int size) {
List<String> lore = item.getItemMeta().getLore();
for (int line = 0; line < lore.size(); line++) {
if (lore.get(line).equals(ChatColor.GRAY + "ID: <ID>")) {
setBackpackId(p, item, line, profile.createBackpack(size).getId());
@ -128,6 +141,15 @@ public class BackpackListener implements Listener {
}
}
/*
* If the current Player is already viewing a backpack (for whatever reason),
* terminate that view.
*/
if (markBackpackDirty(p)) {
p.closeInventory();
}
// Check if someone else is currently viewing this backpack
if (!backpacks.containsValue(item)) {
p.playSound(p.getLocation(), Sound.ENTITY_HORSE_ARMOR, 1F, 1F);
backpacks.put(p.getUniqueId(), item);