Added reading from shulker boxes

This commit is contained in:
Auxilor
2021-01-03 14:09:26 +00:00
parent a2bef399ff
commit 7683fc7588
2 changed files with 45 additions and 12 deletions

View File

@@ -3,25 +3,38 @@ package com.willfp.talismans.talismans.util;
import com.willfp.eco.util.config.Configs;
import com.willfp.eco.util.config.updating.annotations.ConfigUpdater;
import com.willfp.eco.util.plugin.AbstractEcoPlugin;
import com.willfp.talismans.talismans.Talisman;
import com.willfp.talismans.talismans.Talismans;
import lombok.experimental.UtilityClass;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.block.BlockState;
import org.bukkit.block.ShulkerBox;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BlockStateMeta;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
@UtilityClass
public class TalismanChecks {
private static final Map<UUID, Set<Talisman>> CACHED_TALISMANS = new HashMap<>();
private static boolean readEnderChest = true;
private static boolean readShulkerBoxes = true;
private static final AbstractEcoPlugin PLUGIN = AbstractEcoPlugin.getInstance();
/**
* Does the specified ItemStack have a certain Talisman present?
@@ -86,9 +99,35 @@ public class TalismanChecks {
* @return A set of all found talismans.
*/
public static Set<Talisman> getTalismansOnPlayer(@NotNull final Player player) {
Set<Talisman> cached = CACHED_TALISMANS.get(player.getUniqueId());
if (cached != null) {
return cached;
}
List<ItemStack> contents = new ArrayList<>();
Set<Talisman> found = new HashSet<>();
for (ItemStack itemStack : player.getInventory()) {
List<ItemStack> rawContents = new ArrayList<>(Arrays.asList(player.getInventory().getContents()));
if (readEnderChest) {
rawContents.addAll(Arrays.asList(player.getEnderChest().getContents()));
}
for (ItemStack rawContent : rawContents) {
if (readShulkerBoxes) {
ItemMeta meta = rawContent.getItemMeta();
if (meta instanceof BlockStateMeta) {
BlockStateMeta shulkerMeta = (BlockStateMeta) meta;
BlockState state = shulkerMeta.getBlockState();
if (state instanceof ShulkerBox) {
ShulkerBox shulkerBox = (ShulkerBox) state;
contents.addAll(Arrays.asList(shulkerBox.getInventory().getContents()));
}
}
}
}
for (ItemStack itemStack : contents) {
Talisman talisman = getTalismanOnItem(itemStack);
if (talisman == null) {
continue;
@@ -97,16 +136,8 @@ public class TalismanChecks {
found.add(talisman);
}
if (readEnderChest) {
for (ItemStack itemStack : player.getEnderChest()) {
Talisman talisman = getTalismanOnItem(itemStack);
if (talisman == null) {
continue;
}
found.add(talisman);
}
}
CACHED_TALISMANS.put(player.getUniqueId(), found);
PLUGIN.getScheduler().runLater(() -> CACHED_TALISMANS.remove(player.getUniqueId()), 40);
return found;
}
@@ -126,5 +157,6 @@ public class TalismanChecks {
@ConfigUpdater
public static void reload() {
readEnderChest = Configs.CONFIG.getBool("read-enderchest");
readShulkerBoxes = Configs.CONFIG.getBool("read-shulkerboxes");
}
}

View File

@@ -15,7 +15,8 @@ strengths:
relic:
color: "&d"
read-enderchest: true # If a player's inventory should be checked for talismans
read-enderchest: true # If a player's ender chest should be checked for talismans
read-shulkerboxes: true # If a player's shulker boxes should be checked for talismans
drops:
### ADVANCED OPTIONS