3232import net .coreprotect .config .ConfigHandler ;
3333import net .coreprotect .utility .BlockUtils ;
3434
35+ /**
36+ * Base adapter implementation for Bukkit API compatibility.
37+ * Provides default implementations for methods that work across multiple Minecraft versions.
38+ * Version-specific implementations extend this class to provide specialized behavior.
39+ */
3540public class BukkitAdapter implements BukkitInterface {
3641
42+ /** The currently active adapter instance */
3743 public static BukkitInterface ADAPTER ;
44+
45+ // Version constants for Bukkit implementations
3846 public static final int BUKKIT_V1_13 = 13 ;
3947 public static final int BUKKIT_V1_14 = 14 ;
4048 public static final int BUKKIT_V1_15 = 15 ;
@@ -45,33 +53,39 @@ public class BukkitAdapter implements BukkitInterface {
4553 public static final int BUKKIT_V1_20 = 20 ;
4654 public static final int BUKKIT_V1_21 = 21 ;
4755
56+ /**
57+ * Initializes the appropriate Bukkit adapter based on the server version.
58+ * This method should be called during plugin initialization.
59+ */
4860 public static void loadAdapter () {
4961 switch (ConfigHandler .SERVER_VERSION ) {
5062 case BUKKIT_V1_13 :
5163 case BUKKIT_V1_14 :
5264 case BUKKIT_V1_15 :
5365 case BUKKIT_V1_16 :
54- BukkitAdapter . ADAPTER = new BukkitAdapter ();
66+ ADAPTER = new BukkitAdapter ();
5567 break ;
5668 case BUKKIT_V1_17 :
57- BukkitAdapter . ADAPTER = new Bukkit_v1_17 ();
69+ ADAPTER = new Bukkit_v1_17 ();
5870 break ;
5971 case BUKKIT_V1_18 :
60- BukkitAdapter . ADAPTER = new Bukkit_v1_18 ();
72+ ADAPTER = new Bukkit_v1_18 ();
6173 break ;
6274 case BUKKIT_V1_19 :
63- BukkitAdapter . ADAPTER = new Bukkit_v1_19 ();
75+ ADAPTER = new Bukkit_v1_19 ();
6476 break ;
6577 case BUKKIT_V1_20 :
66- BukkitAdapter . ADAPTER = new Bukkit_v1_20 ();
78+ ADAPTER = new Bukkit_v1_20 ();
6779 break ;
6880 case BUKKIT_V1_21 :
6981 default :
70- BukkitAdapter . ADAPTER = new Bukkit_v1_21 ();
82+ ADAPTER = new Bukkit_v1_21 ();
7183 break ;
7284 }
7385 }
7486
87+ // -------------------- Basic data conversion methods --------------------
88+
7589 @ Override
7690 public String parseLegacyName (String name ) {
7791 return name ;
@@ -82,6 +96,8 @@ public int getLegacyBlockId(Material material) {
8296 return -1 ;
8397 }
8498
99+ // -------------------- Entity methods --------------------
100+
85101 @ Override
86102 public boolean getEntityMeta (LivingEntity entity , List <Object > info ) {
87103 return false ;
@@ -92,6 +108,18 @@ public boolean setEntityMeta(Entity entity, Object value, int count) {
92108 return false ;
93109 }
94110
111+ @ Override
112+ public EntityType getEntityType (Material material ) {
113+ switch (material ) {
114+ case END_CRYSTAL :
115+ return EntityType .valueOf ("ENDER_CRYSTAL" );
116+ default :
117+ return EntityType .UNKNOWN ;
118+ }
119+ }
120+
121+ // -------------------- Item handling methods --------------------
122+
95123 @ Override
96124 public boolean getItemMeta (ItemMeta itemMeta , List <Map <String , Object >> list , List <List <Map <String , Object >>> metadata , int slot ) {
97125 return false ;
@@ -102,6 +130,45 @@ public boolean setItemMeta(Material rowType, ItemStack itemstack, List<Map<Strin
102130 return false ;
103131 }
104132
133+ @ Override
134+ public Material getPlantSeeds (Material material ) {
135+ switch (material ) {
136+ case WHEAT :
137+ return Material .WHEAT_SEEDS ;
138+ case PUMPKIN_STEM :
139+ return Material .PUMPKIN_SEEDS ;
140+ case MELON_STEM :
141+ return Material .MELON_SEEDS ;
142+ case BEETROOTS :
143+ return Material .BEETROOT_SEEDS ;
144+ default :
145+ return material ;
146+ }
147+ }
148+
149+ @ Override
150+ public ItemStack adjustIngredient (MerchantRecipe recipe , ItemStack itemStack ) {
151+ return null ;
152+ }
153+
154+ @ Override
155+ public ItemStack getArrowMeta (Arrow arrow , ItemStack itemStack ) {
156+ PotionData data = arrow .getBasePotionData ();
157+ if (data .getType () != PotionType .valueOf ("UNCRAFTABLE" )) {
158+ itemStack = new ItemStack (Material .TIPPED_ARROW );
159+ PotionMeta meta = (PotionMeta ) itemStack .getItemMeta ();
160+ meta .setBasePotionData (data );
161+ for (PotionEffect effect : arrow .getCustomEffects ()) {
162+ meta .addCustomEffect (effect , false );
163+ }
164+ itemStack .setItemMeta (meta );
165+ }
166+
167+ return itemStack ;
168+ }
169+
170+ // -------------------- Block methods --------------------
171+
105172 @ Override
106173 public boolean isAttached (Block block , Block scanBlock , BlockData blockData , int scanMin ) {
107174 if (blockData instanceof Directional && blockData instanceof FaceAttachable ) {
@@ -139,9 +206,16 @@ public Material getBucketContents(Material material) {
139206 return Material .AIR ;
140207 }
141208
209+ @ Override
210+ public boolean isInvisible (Material material ) {
211+ return BlockUtils .isAir (material );
212+ }
213+
214+ // -------------------- Special block type checkers --------------------
215+
142216 @ Override
143217 public boolean isItemFrame (Material material ) {
144- return ( material == Material .ITEM_FRAME ) ;
218+ return material == Material .ITEM_FRAME ;
145219 }
146220
147221 @ Override
@@ -159,75 +233,6 @@ public Class<?> getFrameClass(Material material) {
159233 return ItemFrame .class ;
160234 }
161235
162- @ Override
163- public boolean isGlowing (Sign sign , boolean isFront ) {
164- return false ;
165- }
166-
167- @ Override
168- public boolean isWaxed (Sign sign ) {
169- return false ;
170- }
171-
172- @ Override
173- public boolean isInvisible (Material material ) {
174- return BlockUtils .isAir (material );
175- }
176-
177- @ Override
178- public ItemStack adjustIngredient (MerchantRecipe recipe , ItemStack itemStack ) {
179- return null ;
180- }
181-
182- @ Override
183- public void setGlowing (Sign sign , boolean isFront , boolean isGlowing ) {
184- return ;
185- }
186-
187- @ Override
188- public void setColor (Sign sign , boolean isFront , int color ) {
189- if (!isFront ) {
190- return ;
191- }
192-
193- sign .setColor (DyeColor .getByColor (Color .fromRGB (color )));
194- }
195-
196- @ Override
197- public void setWaxed (Sign sign , boolean isWaxed ) {
198- return ;
199- }
200-
201- @ Override
202- public int getColor (Sign sign , boolean isFront ) {
203- if (isFront ) {
204- return sign .getColor ().getColor ().asRGB ();
205- }
206-
207- return 0 ;
208- }
209-
210- @ Override
211- public Material getPlantSeeds (Material material ) {
212- switch (material ) {
213- case WHEAT :
214- material = Material .WHEAT_SEEDS ;
215- break ;
216- case PUMPKIN_STEM :
217- material = Material .PUMPKIN_SEEDS ;
218- break ;
219- case MELON_STEM :
220- material = Material .MELON_SEEDS ;
221- break ;
222- case BEETROOTS :
223- material = Material .BEETROOT_SEEDS ;
224- break ;
225- default :
226- }
227-
228- return material ;
229- }
230-
231236 @ Override
232237 public boolean isDecoratedPot (Material material ) {
233238 return false ;
@@ -258,6 +263,8 @@ public ItemStack getChiseledBookshelfBook(BlockState blockState, PlayerInteractE
258263 return null ;
259264 }
260265
266+ // -------------------- Sign handling methods --------------------
267+
261268 @ Override
262269 public String getLine (Sign sign , int line ) {
263270 if (line < 4 ) {
@@ -285,31 +292,45 @@ public boolean isSignFront(SignChangeEvent event) {
285292 }
286293
287294 @ Override
288- public ItemStack getArrowMeta (Arrow arrow , ItemStack itemStack ) {
289- PotionData data = arrow .getBasePotionData ();
290- if (data .getType () != PotionType .valueOf ("UNCRAFTABLE" )) {
291- itemStack = new ItemStack (Material .TIPPED_ARROW );
292- PotionMeta meta = (PotionMeta ) itemStack .getItemMeta ();
293- meta .setBasePotionData (data );
294- for (PotionEffect effect : arrow .getCustomEffects ()) {
295- meta .addCustomEffect (effect , false );
296- }
297- itemStack .setItemMeta (meta );
295+ public boolean isGlowing (Sign sign , boolean isFront ) {
296+ return false ;
297+ }
298+
299+ @ Override
300+ public boolean isWaxed (Sign sign ) {
301+ return false ;
302+ }
303+
304+ @ Override
305+ public void setGlowing (Sign sign , boolean isFront , boolean isGlowing ) {
306+ // Base implementation does nothing
307+ }
308+
309+ @ Override
310+ public void setColor (Sign sign , boolean isFront , int color ) {
311+ if (!isFront ) {
312+ return ;
298313 }
299314
300- return itemStack ;
315+ sign . setColor ( DyeColor . getByColor ( Color . fromRGB ( color ))) ;
301316 }
302317
303318 @ Override
304- public EntityType getEntityType (Material material ) {
305- switch (material ) {
306- case END_CRYSTAL :
307- return EntityType .valueOf ("ENDER_CRYSTAL" );
308- default :
309- return EntityType .UNKNOWN ;
319+ public void setWaxed (Sign sign , boolean isWaxed ) {
320+ // Base implementation does nothing
321+ }
322+
323+ @ Override
324+ public int getColor (Sign sign , boolean isFront ) {
325+ if (isFront ) {
326+ return sign .getColor ().getColor ().asRGB ();
310327 }
328+
329+ return 0 ;
311330 }
312331
332+ // -------------------- Registry methods --------------------
333+
313334 @ Override
314335 public Object getRegistryKey (Object value ) {
315336 return value ;
@@ -319,5 +340,4 @@ public Object getRegistryKey(Object value) {
319340 public Object getRegistryValue (String key , Object tClass ) {
320341 return null ;
321342 }
322-
323343}
0 commit comments