2019-03-19 14:13:27 +01:00
|
|
|
package com.songoda.epicenchants.utils.single;
|
|
|
|
|
2023-06-25 12:50:56 +02:00
|
|
|
import com.craftaro.core.third_party.com.cryptomorin.xseries.XMaterial;
|
2019-03-21 15:35:12 +01:00
|
|
|
import com.google.common.collect.HashMultimap;
|
2019-03-19 14:13:27 +01:00
|
|
|
import com.google.common.collect.Multimap;
|
2023-06-25 12:50:56 +02:00
|
|
|
import com.craftaro.core.compatibility.CompatibleMaterial;
|
2019-03-19 14:13:27 +01:00
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
|
|
|
2021-01-19 20:54:44 +01:00
|
|
|
import java.util.Arrays;
|
|
|
|
import java.util.Collection;
|
|
|
|
import java.util.HashSet;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Optional;
|
|
|
|
import java.util.Set;
|
2019-03-19 14:13:27 +01:00
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
2023-06-25 12:50:56 +02:00
|
|
|
import static com.craftaro.core.third_party.com.cryptomorin.xseries.XMaterial.*;
|
2019-03-19 14:13:27 +01:00
|
|
|
import static com.songoda.epicenchants.utils.single.ItemGroup.Group.*;
|
|
|
|
|
|
|
|
public class ItemGroup {
|
|
|
|
|
2023-06-25 12:50:56 +02:00
|
|
|
private final Multimap<Group, XMaterial> groupMap;
|
2019-03-19 14:13:27 +01:00
|
|
|
|
2020-07-22 18:32:31 +02:00
|
|
|
public ItemGroup() {
|
2019-03-21 15:35:12 +01:00
|
|
|
groupMap = HashMultimap.create();
|
2019-03-19 14:13:27 +01:00
|
|
|
|
2020-07-22 18:32:31 +02:00
|
|
|
groupMap.putAll(AXES, Arrays.asList(NETHERITE_AXE, DIAMOND_AXE, GOLDEN_AXE, IRON_AXE, STONE_AXE, WOODEN_AXE));
|
2019-03-19 14:13:27 +01:00
|
|
|
|
2020-07-22 18:32:31 +02:00
|
|
|
groupMap.putAll(PICKAXES, Arrays.asList(NETHERITE_PICKAXE, DIAMOND_PICKAXE, GOLDEN_PICKAXE, IRON_PICKAXE, STONE_PICKAXE, WOODEN_PICKAXE));
|
2019-03-19 14:13:27 +01:00
|
|
|
|
2020-07-22 18:32:31 +02:00
|
|
|
groupMap.putAll(HOES, Arrays.asList(NETHERITE_HOE, DIAMOND_HOE, GOLDEN_HOE, IRON_HOE, STONE_HOE, WOODEN_HOE));
|
2019-08-05 21:57:11 +02:00
|
|
|
|
2020-07-22 18:32:31 +02:00
|
|
|
groupMap.putAll(SHOVELS, Arrays.asList(NETHERITE_SHOVEL, DIAMOND_SHOVEL, GOLDEN_SHOVEL, IRON_SHOVEL, STONE_SHOVEL, WOODEN_SHOVEL));
|
2019-08-05 21:57:11 +02:00
|
|
|
|
2020-07-22 18:32:31 +02:00
|
|
|
groupMap.putAll(SWORDS, Arrays.asList(NETHERITE_SWORD, DIAMOND_SWORD, GOLDEN_SWORD, IRON_SWORD, STONE_SWORD, WOODEN_SWORD));
|
2019-03-19 14:13:27 +01:00
|
|
|
|
|
|
|
groupMap.put(BOWS, BOW);
|
|
|
|
|
2020-07-22 18:32:31 +02:00
|
|
|
groupMap.putAll(BOOTS, Arrays.asList(NETHERITE_BOOTS, DIAMOND_BOOTS, GOLDEN_BOOTS, IRON_BOOTS, LEATHER_BOOTS));
|
2019-03-19 14:13:27 +01:00
|
|
|
|
2020-07-22 18:32:31 +02:00
|
|
|
groupMap.putAll(LEGGINGS, Arrays.asList(NETHERITE_LEGGINGS, DIAMOND_LEGGINGS, GOLDEN_LEGGINGS, IRON_LEGGINGS, LEATHER_LEGGINGS));
|
2019-03-19 14:13:27 +01:00
|
|
|
|
2020-07-22 18:32:31 +02:00
|
|
|
groupMap.putAll(CHESTPLATES, Arrays.asList(NETHERITE_CHESTPLATE, DIAMOND_CHESTPLATE, GOLDEN_CHESTPLATE, IRON_CHESTPLATE, LEATHER_CHESTPLATE));
|
2019-03-19 14:13:27 +01:00
|
|
|
|
2020-07-22 18:32:31 +02:00
|
|
|
groupMap.putAll(HELMETS, Arrays.asList(NETHERITE_HELMET, DIAMOND_HELMET, GOLDEN_HELMET, IRON_HELMET, LEATHER_HELMET));
|
2020-04-11 06:58:19 +02:00
|
|
|
|
|
|
|
groupMap.put(TRIDENTS, TRIDENT);
|
2019-03-19 14:13:27 +01:00
|
|
|
}
|
|
|
|
|
2023-06-25 12:50:56 +02:00
|
|
|
public Set<XMaterial> get(String key) {
|
2019-03-19 14:13:27 +01:00
|
|
|
Optional<Group> optionalGroup = Group.from(key);
|
2023-06-25 12:50:56 +02:00
|
|
|
Set<XMaterial> output = new HashSet<>();
|
2019-03-19 14:13:27 +01:00
|
|
|
|
2019-04-24 11:40:40 +02:00
|
|
|
optionalGroup.ifPresent(group -> output.addAll(getMaterials(group)));
|
2019-03-19 14:13:27 +01:00
|
|
|
|
2023-06-25 12:50:56 +02:00
|
|
|
Optional<XMaterial> material = CompatibleMaterial.getMaterial(key);
|
|
|
|
material.ifPresent(output::add);
|
2019-03-19 14:13:27 +01:00
|
|
|
|
|
|
|
return output;
|
|
|
|
}
|
|
|
|
|
2023-06-25 12:50:56 +02:00
|
|
|
public boolean isValid(XMaterial material) {
|
2021-01-19 20:54:44 +01:00
|
|
|
for (Group group : groupMap.keys())
|
|
|
|
if (getMaterials(group).contains(material))
|
|
|
|
return true;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2023-06-25 12:50:56 +02:00
|
|
|
public Set<String> getGroups(Set<XMaterial> materials) {
|
2019-04-24 11:40:40 +02:00
|
|
|
Set<String> groups = new HashSet<>();
|
|
|
|
|
|
|
|
for (int i = 0; i < 5; i++) {
|
|
|
|
getGroup(materials).ifPresent(group -> {
|
|
|
|
groups.add(group.getName());
|
2020-08-31 11:50:22 +02:00
|
|
|
materials.removeAll(getMaterials(group).stream().collect(Collectors.toList()));
|
2019-04-24 11:40:40 +02:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2023-06-25 12:50:56 +02:00
|
|
|
groups.addAll(materials.stream().map(XMaterial::toString).collect(Collectors.toSet()));
|
2019-04-24 11:40:40 +02:00
|
|
|
return groups;
|
|
|
|
}
|
|
|
|
|
2023-06-25 12:50:56 +02:00
|
|
|
public Optional<Group> getGroup(Set<XMaterial> materials) {
|
2019-04-04 14:40:11 +02:00
|
|
|
Optional<Group> group = Arrays.stream(Group.values())
|
|
|
|
.filter(s -> !s.getChildren().isEmpty() && s.getChildren().stream().allMatch(child -> materials.containsAll(groupMap.get(child))))
|
|
|
|
.findFirst();
|
|
|
|
|
|
|
|
if (group.isPresent()) {
|
|
|
|
return group;
|
|
|
|
}
|
|
|
|
|
2019-04-24 11:40:40 +02:00
|
|
|
return groupMap.asMap().entrySet().stream().filter(s -> materials.containsAll(s.getValue())).map(Map.Entry::getKey).findFirst();
|
|
|
|
}
|
|
|
|
|
2023-06-25 12:50:56 +02:00
|
|
|
public Set<XMaterial> getMaterials(Group group) {
|
|
|
|
Set<XMaterial> out = new HashSet<>();
|
2019-04-24 11:40:40 +02:00
|
|
|
|
|
|
|
for (int i = 0; i < 5; i++) {
|
|
|
|
if (group.getChildren().isEmpty())
|
2020-08-31 11:50:22 +02:00
|
|
|
out.addAll(groupMap.get(group));
|
2019-04-24 11:40:40 +02:00
|
|
|
else
|
|
|
|
out.addAll(group.getChildren().stream().map(this::getMaterials).flatMap(Collection::stream).collect(Collectors.toSet()));
|
|
|
|
}
|
|
|
|
|
|
|
|
return out;
|
2019-03-21 15:35:12 +01:00
|
|
|
}
|
|
|
|
|
2019-03-19 14:13:27 +01:00
|
|
|
public enum Group {
|
|
|
|
AXES,
|
2019-08-05 21:57:11 +02:00
|
|
|
HOES,
|
2019-03-19 14:13:27 +01:00
|
|
|
PICKAXES,
|
|
|
|
SHOVELS,
|
2019-08-05 21:57:11 +02:00
|
|
|
TOOLS(AXES, PICKAXES, HOES, SHOVELS),
|
2019-03-19 14:13:27 +01:00
|
|
|
|
|
|
|
SWORDS,
|
|
|
|
BOWS,
|
2020-04-11 06:58:19 +02:00
|
|
|
TRIDENTS,
|
|
|
|
WEAPONS(SWORDS, BOWS, AXES, TRIDENTS),
|
2019-03-19 14:13:27 +01:00
|
|
|
|
|
|
|
BOOTS,
|
|
|
|
LEGGINGS,
|
|
|
|
CHESTPLATES,
|
|
|
|
HELMETS,
|
|
|
|
ARMOR(BOOTS, LEGGINGS, CHESTPLATES, HELMETS);
|
|
|
|
|
2019-08-04 23:50:07 +02:00
|
|
|
private final Set<Group> children;
|
2019-03-19 14:13:27 +01:00
|
|
|
|
|
|
|
Group(Group... child) {
|
|
|
|
children = child == null ? new HashSet<>() : new HashSet<>(Arrays.asList(child));
|
|
|
|
}
|
|
|
|
|
|
|
|
public static Optional<Group> from(String key) {
|
|
|
|
return Arrays.stream(values()).filter(s -> s.toString().equalsIgnoreCase(key)).findFirst();
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getName() {
|
|
|
|
return StringUtils.capitalize(toString().toLowerCase());
|
|
|
|
}
|
2019-08-04 23:50:07 +02:00
|
|
|
|
|
|
|
public Set<Group> getChildren() {
|
|
|
|
return this.children;
|
|
|
|
}
|
2019-03-19 14:13:27 +01:00
|
|
|
}
|
|
|
|
}
|