/
NamedContentType.java
56 lines (48 loc) · 1.72 KB
/
NamedContentType.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package knightminer.inspirations.library.recipe.cauldron.contenttype;
import io.netty.handler.codec.DecoderException;
import knightminer.inspirations.library.recipe.cauldron.contents.ICauldronContents;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.IStringSerializable;
import javax.annotation.Nullable;
import java.util.function.Function;
/**
* Cauldron content type based on an {@link IStringSerializable} object, typically an enum
* @param <T> Type class
* @param <C> Contents class
*/
public class NamedContentType<C extends ICauldronContents, T extends IStringSerializable> extends MapContentType<C, T> {
private final Function<String, ? extends T> lookup;
/**
* Creates a new type instance
* @param clazz Contents class
* @param constructor Contents constructor
* @param lookup Function to lookup a value from a string
* @param valueGetter Function to get the value from a content type
*/
public NamedContentType(Class<C> clazz, Function<? super T,? extends C> constructor, Function<String,? extends T> lookup, Function<C,T> valueGetter) {
super(clazz, constructor, valueGetter);
this.lookup = lookup;
}
@Override
public String getName(T value) {
return value.getString();
}
@Nullable
@Override
public T getEntry(String name) {
return lookup.apply(name);
}
@Override
public C read(PacketBuffer buffer) {
String name = buffer.readString(Short.MAX_VALUE);
T value = lookup.apply(name);
if (value != null) {
return of(value);
}
throw new DecoderException("Invalid name '" + name + "' for type " + this);
}
@Override
public void write(C contents, PacketBuffer buffer) {
buffer.writeString(getName(contents));
}
}