Skip to content

Commit 399ae9b

Browse files
authored
Merge pull request #66 from WolfyScript/feature/api-ref-stack-fallback
New StackReference System to replace old APIReferences
2 parents 17c0203 + 3b71b49 commit 399ae9b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+2069
-75
lines changed

buildSrc/src/main/kotlin/com.wolfyscript.wolfyutils.spigot.java-conventions.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ java {
3737
}
3838

3939
group = "com.wolfyscript.wolfyutils.spigot"
40-
version = "4.16.14.1"
40+
version = "4.16.15-beta.2"
4141
val apiVersion = "4.16.1-SNAPSHOT"
4242

4343
dependencies {
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.wolfyscript.utilities.bukkit.registry;
2+
3+
import com.google.common.base.Preconditions;
4+
import com.wolfyscript.utilities.bukkit.world.items.reference.BukkitStackIdentifier;
5+
import com.wolfyscript.utilities.bukkit.world.items.reference.StackIdentifier;
6+
import com.wolfyscript.utilities.bukkit.world.items.reference.StackIdentifierParser;
7+
import com.wolfyscript.utilities.bukkit.world.items.reference.StackReference;
8+
import me.wolfyscript.utilities.registry.Registries;
9+
import me.wolfyscript.utilities.registry.RegistrySimple;
10+
import me.wolfyscript.utilities.util.NamespacedKey;
11+
import org.bukkit.inventory.ItemStack;
12+
13+
import java.util.Comparator;
14+
import java.util.List;
15+
import java.util.Objects;
16+
import java.util.Optional;
17+
18+
public class RegistryStackIdentifierParsers extends RegistrySimple<StackIdentifierParser<?>> {
19+
20+
private List<StackIdentifierParser<?>> priorityIndexedParsers = List.of();
21+
private final Registries registries;
22+
23+
public RegistryStackIdentifierParsers(Registries registries) {
24+
super(new NamespacedKey(registries.getCore(), "stack_identifier/parsers"), registries, (Class<StackIdentifierParser<?>>)(Object) StackIdentifierParser.class);
25+
this.registries = registries;
26+
}
27+
28+
@Override
29+
public void register(NamespacedKey namespacedKey, StackIdentifierParser<?> value) {
30+
if (value != null) {
31+
Preconditions.checkState(!this.map.containsKey(namespacedKey), "namespaced key '%s' already has an associated value!", namespacedKey);
32+
map.put(namespacedKey, value);
33+
reIndexParsers();
34+
}
35+
}
36+
37+
public List<StackIdentifierParser<?>> sortedParsers() {
38+
return priorityIndexedParsers;
39+
}
40+
41+
public StackIdentifier parseIdentifier(ItemStack stack) {
42+
for (StackIdentifierParser<?> parser : sortedParsers()) {
43+
Optional<? extends StackIdentifier> identifierOptional = parser.from(stack);
44+
if (identifierOptional.isPresent()) return identifierOptional.get();
45+
}
46+
return new BukkitStackIdentifier(stack);
47+
}
48+
49+
public List<StackIdentifierParser<?>> matchingParsers(ItemStack stack) {
50+
return sortedParsers().stream().sorted().filter(stackIdentifierParser -> stackIdentifierParser.from(stack).isPresent()).toList();
51+
}
52+
53+
/**
54+
*
55+
*
56+
* @param stack
57+
* @return
58+
*/
59+
public StackReference parseFrom(ItemStack stack) {
60+
return new StackReference(registries.getCore(), parseIdentifier(stack), 1, 1, stack);
61+
}
62+
63+
private void reIndexParsers() {
64+
priorityIndexedParsers = map.values().stream().sorted(Comparator.naturalOrder()).filter(Objects::nonNull).toList();
65+
}
66+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.wolfyscript.utilities.bukkit.world.items.reference;
2+
3+
import me.wolfyscript.utilities.util.NamespacedKey;
4+
import net.kyori.adventure.text.Component;
5+
import net.kyori.adventure.text.format.NamedTextColor;
6+
import net.kyori.adventure.text.format.TextDecoration;
7+
import org.bukkit.Material;
8+
import org.bukkit.inventory.ItemStack;
9+
10+
import java.util.Optional;
11+
12+
public class BukkitStackIdentifier implements StackIdentifier {
13+
14+
public static final NamespacedKey ID = NamespacedKey.wolfyutilties("bukkit");
15+
16+
private final ItemStack stack;
17+
18+
public BukkitStackIdentifier(ItemStack stack) {
19+
this.stack = stack;
20+
}
21+
22+
@Override
23+
public ItemStack stack(ItemCreateContext context) {
24+
ItemStack cloned = stack.clone();
25+
cloned.setAmount(context.amount());
26+
return cloned;
27+
}
28+
29+
@Override
30+
public boolean matches(ItemStack other, int count, boolean exact, boolean ignoreAmount) {
31+
if (other.getType() != stack.getType()) return false;
32+
if (!ignoreAmount && other.getAmount() < stack.getAmount() * count) return false;
33+
if (!stack.hasItemMeta() && !exact) return false;
34+
return stack.isSimilar(other);
35+
}
36+
37+
@Override
38+
public NamespacedKey getNamespacedKey() {
39+
return ID;
40+
}
41+
42+
public static class Parser implements StackIdentifierParser<BukkitStackIdentifier> {
43+
44+
@Override
45+
public int priority() {
46+
return -2048;
47+
}
48+
49+
@Override
50+
public Optional<BukkitStackIdentifier> from(ItemStack itemStack) {
51+
return Optional.of(new BukkitStackIdentifier(itemStack.clone()));
52+
}
53+
54+
@Override
55+
public NamespacedKey getNamespacedKey() {
56+
return ID;
57+
}
58+
59+
@Override
60+
public DisplayConfiguration displayConfig() {
61+
return new DisplayConfiguration.SimpleDisplayConfig(
62+
Component.text("Bukkit").color(NamedTextColor.WHITE).decorate(TextDecoration.BOLD),
63+
new DisplayConfiguration.MaterialIconSettings(Material.LAVA_BUCKET)
64+
);
65+
}
66+
}
67+
68+
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package com.wolfyscript.utilities.bukkit.world.items.reference;
2+
3+
import org.bukkit.World;
4+
import org.bukkit.entity.Player;
5+
6+
import java.util.Optional;
7+
8+
public interface ItemCreateContext {
9+
10+
int amount();
11+
12+
default Optional<StackReference> reference() {
13+
return Optional.empty();
14+
}
15+
16+
default Optional<Player> player() {
17+
return Optional.empty();
18+
}
19+
20+
default Optional<World> world() {
21+
return Optional.empty();
22+
}
23+
24+
/**
25+
* An empty implementation only containing the required values.
26+
*
27+
* @return An empty context only containing the required values
28+
*/
29+
static ItemCreateContext empty(int amount) {
30+
return () -> amount;
31+
}
32+
33+
static Builder of(int amount) {
34+
return new Builder.BuilderImpl(amount);
35+
}
36+
37+
static Builder of(StackReference reference) {
38+
return of(reference.amount()).reference(reference);
39+
}
40+
41+
/**
42+
* Builder to construct an ItemCreateContext
43+
*
44+
*/
45+
interface Builder {
46+
47+
Builder reference(StackReference reference);
48+
49+
Builder player(Player player);
50+
51+
Builder world(World world);
52+
53+
ItemCreateContext build();
54+
55+
class BuilderImpl implements Builder {
56+
57+
private final int amount;
58+
private StackReference reference;
59+
private Player player;
60+
private World world;
61+
62+
public BuilderImpl(int amount) {
63+
this.amount = amount;
64+
}
65+
66+
@Override
67+
public Builder reference(StackReference reference) {
68+
this.reference = reference;
69+
return this;
70+
}
71+
72+
@Override
73+
public Builder player(Player player) {
74+
this.player = player;
75+
return this;
76+
}
77+
78+
@Override
79+
public Builder world(World world) {
80+
this.world = world;
81+
return this;
82+
}
83+
84+
@Override
85+
public ItemCreateContext build() {
86+
return new ItemCreateContext() {
87+
@Override
88+
public int amount() {
89+
return amount;
90+
}
91+
92+
@Override
93+
public Optional<StackReference> reference() {
94+
return Optional.ofNullable(reference);
95+
}
96+
97+
@Override
98+
public Optional<Player> player() {
99+
return Optional.ofNullable(player);
100+
}
101+
102+
@Override
103+
public Optional<World> world() {
104+
return Optional.ofNullable(world);
105+
}
106+
};
107+
}
108+
}
109+
110+
}
111+
112+
}

0 commit comments

Comments
 (0)