SPIGOT-4120: Store BlockData enum mappings per class
This commit is contained in:
parent
ea7b61290a
commit
fbf903a1bc
@ -89,7 +89,7 @@ public class CraftBlockData implements BlockData {
|
|||||||
this.state = this.state.set(nms, toNMS(bukkit, nms.b()));
|
this.state = this.state.set(nms, toNMS(bukkit, nms.b()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final BiMap<Enum<?>, Enum<?>> nmsToBukkit = HashBiMap.create();
|
private static final Map<Class, BiMap<Enum<?>, Enum<?>>> classMappings = new HashMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert an NMS Enum (usually a BlockStateEnum) to its appropriate Bukkit
|
* Convert an NMS Enum (usually a BlockStateEnum) to its appropriate Bukkit
|
||||||
@ -99,9 +99,14 @@ public class CraftBlockData implements BlockData {
|
|||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private static <B extends Enum<B>> B toBukkit(Enum<?> nms, Class<B> bukkit) {
|
private static <B extends Enum<B>> B toBukkit(Enum<?> nms, Class<B> bukkit) {
|
||||||
Enum<?> converted = nmsToBukkit.get(nms);
|
Enum<?> converted;
|
||||||
if (converted != null) {
|
BiMap<Enum<?>, Enum<?>> nmsToBukkit = classMappings.get(nms.getClass());
|
||||||
return (B) converted;
|
|
||||||
|
if (nmsToBukkit != null) {
|
||||||
|
converted = nmsToBukkit.get(nms);
|
||||||
|
if (converted != null) {
|
||||||
|
return (B) converted;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nms instanceof EnumDirection) {
|
if (nms instanceof EnumDirection) {
|
||||||
@ -111,6 +116,12 @@ public class CraftBlockData implements BlockData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Preconditions.checkState(converted != null, "Could not convert enum %s->%s", nms, bukkit);
|
Preconditions.checkState(converted != null, "Could not convert enum %s->%s", nms, bukkit);
|
||||||
|
|
||||||
|
if (nmsToBukkit == null) {
|
||||||
|
nmsToBukkit = HashBiMap.create();
|
||||||
|
classMappings.put(nms.getClass(), nmsToBukkit);
|
||||||
|
}
|
||||||
|
|
||||||
nmsToBukkit.put(nms, converted);
|
nmsToBukkit.put(nms, converted);
|
||||||
|
|
||||||
return (B) converted;
|
return (B) converted;
|
||||||
@ -126,9 +137,14 @@ public class CraftBlockData implements BlockData {
|
|||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private static <N extends Enum<N> & INamable> N toNMS(Enum<?> bukkit, Class<N> nms) {
|
private static <N extends Enum<N> & INamable> N toNMS(Enum<?> bukkit, Class<N> nms) {
|
||||||
Enum<?> converted = nmsToBukkit.inverse().get(bukkit);
|
Enum<?> converted;
|
||||||
if (converted != null) {
|
BiMap<Enum<?>, Enum<?>> nmsToBukkit = classMappings.get(nms.getClass());
|
||||||
return (N) converted;
|
|
||||||
|
if (nmsToBukkit != null) {
|
||||||
|
converted = nmsToBukkit.inverse().get(bukkit);
|
||||||
|
if (converted != null) {
|
||||||
|
return (N) converted;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bukkit instanceof BlockFace) {
|
if (bukkit instanceof BlockFace) {
|
||||||
@ -138,6 +154,12 @@ public class CraftBlockData implements BlockData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Preconditions.checkState(converted != null, "Could not convert enum %s->%s", nms, bukkit);
|
Preconditions.checkState(converted != null, "Could not convert enum %s->%s", nms, bukkit);
|
||||||
|
|
||||||
|
if (nmsToBukkit == null) {
|
||||||
|
nmsToBukkit = HashBiMap.create();
|
||||||
|
classMappings.put(nms.getClass(), nmsToBukkit);
|
||||||
|
}
|
||||||
|
|
||||||
nmsToBukkit.put(converted, bukkit);
|
nmsToBukkit.put(converted, bukkit);
|
||||||
|
|
||||||
return (N) converted;
|
return (N) converted;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user