@@ -18,6 +18,46 @@ private MaterialCompat() {}
1818 @ Nonnull
1919 public static Material safe (@ Nonnull XMaterial material ) {
2020 Material resolved = material .parseMaterial ();
21+ if (resolved == null ) {
22+ resolved = substitute (material );
23+ }
2124 return resolved != null ? resolved : Material .STONE ;
2225 }
26+
27+ // Sensible legacy substitutes for materials that don't exist on older servers (e.g. on 1.8),
28+ // so an icon resolves to something recognisable instead of STONE.
29+ private static final java .util .Map <XMaterial , XMaterial > LEGACY_SUBSTITUTES = buildLegacySubstitutes ();
30+
31+ private static java .util .Map <XMaterial , XMaterial > buildLegacySubstitutes () {
32+ java .util .Map <XMaterial , XMaterial > m = new java .util .EnumMap <>(XMaterial .class );
33+ m .put (XMaterial .NETHERITE_BLOCK , XMaterial .DIAMOND_BLOCK );
34+ m .put (XMaterial .NETHERITE_INGOT , XMaterial .DIAMOND );
35+ m .put (XMaterial .NETHERITE_SCRAP , XMaterial .IRON_NUGGET );
36+ m .put (XMaterial .ANCIENT_DEBRIS , XMaterial .NETHERRACK );
37+ m .put (XMaterial .BEEHIVE , XMaterial .DISPENSER );
38+ m .put (XMaterial .BEE_NEST , XMaterial .DISPENSER );
39+ m .put (XMaterial .HONEY_BLOCK , XMaterial .SLIME_BLOCK );
40+ m .put (XMaterial .BARREL , XMaterial .CHEST );
41+ m .put (XMaterial .BLAST_FURNACE , XMaterial .FURNACE );
42+ m .put (XMaterial .SMOKER , XMaterial .FURNACE );
43+ m .put (XMaterial .CAMPFIRE , XMaterial .NETHERRACK );
44+ m .put (XMaterial .SMITHING_TABLE , XMaterial .CRAFTING_TABLE );
45+ m .put (XMaterial .CARTOGRAPHY_TABLE , XMaterial .CRAFTING_TABLE );
46+ m .put (XMaterial .FLETCHING_TABLE , XMaterial .CRAFTING_TABLE );
47+ m .put (XMaterial .LOOM , XMaterial .CRAFTING_TABLE );
48+ m .put (XMaterial .STONECUTTER , XMaterial .CRAFTING_TABLE );
49+ m .put (XMaterial .GRINDSTONE , XMaterial .ANVIL );
50+ m .put (XMaterial .LANTERN , XMaterial .GLOWSTONE );
51+ m .put (XMaterial .COMPOSTER , XMaterial .CHEST );
52+ m .put (XMaterial .MAGMA_BLOCK , XMaterial .NETHERRACK );
53+ m .put (XMaterial .LODESTONE , XMaterial .IRON_BLOCK );
54+ m .put (XMaterial .BLACKSTONE , XMaterial .COBBLESTONE );
55+ m .put (XMaterial .OBSERVER , XMaterial .PISTON );
56+ return m ;
57+ }
58+
59+ private static Material substitute (XMaterial xMaterial ) {
60+ XMaterial sub = LEGACY_SUBSTITUTES .get (xMaterial );
61+ return sub != null ? sub .parseMaterial () : null ;
62+ }
2363}
0 commit comments