package net.glowstone.inventory.crafting; import org.bukkit.Color; import org.bukkit.FireworkEffect; import org.bukkit.Material; import org.bukkit.inventory.ItemMatcher; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.FireworkEffectMeta; import org.bukkit.material.Dye; import java.util.ArrayList; import java.util.List; import static org.bukkit.FireworkEffect.Type; public class GlowChargeMatcher extends ItemMatcher { @Override public ItemStack getResult(ItemStack[] matrix) { boolean hasGunpowder = false; boolean trail = false; boolean twinkle = false; List<Color> colors = new ArrayList<>(); Type type = Type.BALL; for (ItemStack item : matrix) { if (item == null) continue; switch (item.getType()) { case SULPHUR: if (hasGunpowder) return null; // Only 1 gunpowder allowed hasGunpowder = true; break; case INK_SACK: Dye dye = (Dye) item.getData(); colors.add(dye.getColor().getFireworkColor()); break; case DIAMOND: if (trail) return null; // Only 1 diamond allowed trail = true; break; case GLOWSTONE_DUST: if (twinkle) return null; // Only 1 dust allowed twinkle = true; break; case FIREBALL: if (type != Type.BALL) return null; type = Type.BALL_LARGE; break; case GOLD_NUGGET: if (type != Type.BALL) return null; type = Type.STAR; break; case FEATHER: if (type != Type.BALL) return null; type = Type.BURST; break; case SKULL_ITEM: if (type != Type.BALL) return null; type = Type.CREEPER; break; default: return null; // Non firework item on matrix } } if (!hasGunpowder || colors.isEmpty()) return null; // Not enough ingredients FireworkEffect effect = FireworkEffect.builder() .withColor(colors) .trail(trail) .flicker(twinkle) .with(type) .build(); ItemStack charge = new ItemStack(Material.FIREWORK_CHARGE, 1); FireworkEffectMeta meta = (FireworkEffectMeta) charge.getItemMeta(); meta.setEffect(effect); charge.setItemMeta(meta); return charge; } }