- Баллы
- 76
Всем привет! Есть у меня один большой плагин в разработке. И там есть крафты с ItemStack нашёл видео на польском где чувак рассказывает как сделать такие крафты. Но они получились грамосткие.
Позже я нашёл видео на английском и нашёл в его методе что-то удобное поддающееся к автоматизации. На его основе я сделал данную утилиту. Она представляет из себя 2 класса и один вспомогательный интерфейс.
Применение:
Жду комментарии и конструктивную критику
Позже я нашёл видео на английском и нашёл в его методе что-то удобное поддающееся к автоматизации. На его основе я сделал данную утилиту. Она представляет из себя 2 класса и один вспомогательный интерфейс.
PHP:
public class CraftUtils implements Listener
{
public class CraftUtils implements Listener
{
private static List<Craft> crafts = new ArrayList<Craft>();
private static Main main;
@EventHandler
public void onCraft(PrepareItemCraftEvent e) {
CraftingInventory ci = e.getInventory();
ItemStack[] matrix = ci.getMatrix();
if(matrix.length < 9) return;
crafts.forEach(x->{
checkCraft(x.getResult(), ci, x.convertToIntMap());
});
}
public CraftUtils(Main main) {
CraftUtils.main = main;
Bukkit.getPluginManager().registerEvents(this, main);
}
public static void addCraft(ItemStack result, String[] shape, HashMap<Character, ItemStack> ingrs){
ShapedRecipe recipe = new ShapedRecipe(new NamespacedKey(main, UUID.randomUUID().toString()), result);
recipe.shape(shape);
//Пробегаемся по карте с знаками и итемами
ingrs.forEach((x, x1)->{
recipe.setIngredient(x, x1.getType());
});
Bukkit.addRecipe(recipe);
//Добавляем в лист с рецептами
crafts.add(new Craft(result, shape, ingrs));
}
//Проверка крафта
public void checkCraft(ItemStack result, CraftingInventory ci, HashMap<Integer, ItemStack> ingridients){
ItemStack[] matrix = ci.getMatrix();
//Пробежка по слотам
for(int i =0; i <9; i++){
if(ingridients.containsKey(i)){//Если в карте ингридиентов есть этот слот - то
if(matrix[i] == null || !matrix[i].equals(ingridients.get(i))){ //Если слот пуст или он не ровняется тому что есть в карте - то ничего не делаем
return;
}
} else {
//Иначе проверяем не ровняется ли нулю этот слот
if(matrix[i] != null) return;
}
}
ci.setResult(result);
}
}
}
PHP:
package pack;
import java.util.HashMap;
import org.bukkit.Material;
import org.*********ventory.ItemStack;
public class Craft
{
private HashMap<Character, ItemStack> ingrs = new HashMap<>();
private ItemStack result;
private String[] shape;
public Craft(ItemStack result, String[] shape, HashMap<Character, ItemStack> ingrs) {
this.setResult(result);
this.setShape(shape);
this.setIngrs(ingrs);
}
public HashMap<Integer, ItemStack> convertToIntMap(){
HashMap<Integer, ItemStack> ingridients = new HashMap<Integer, ItemStack>();
String sh = shapeString();
for(int i = 0; ingridients.size() < sh.length(); i++){
if(sh.charAt(i) == ' ') ingridients.put(i, new ItemStack(Material.AIR));
ingridients.put(i, ingrs.get(sh.charAt(i)));
}
return ingridients;
}
public HashMap<Character, ItemStack> getIngrs() {
return ingrs;
}
public void setIngrs(HashMap<Character, ItemStack> ingrs) {
this.ingrs = ingrs;
}
public String[] getShape() {
return shape;
}
public void setShape(String[] shape) {
this.shape = shape;
}
public ItemStack getResult() {
return result;
}
private String shapeString(){
return shape[0]+shape[1]+shape[2];
}
public void setResult(ItemStack result) {
this.result = result;
}
}
PHP:
package pack;
public interface CraftInterface
{
public ItemStack getResult();
public String[] getShape();
public HashMap<Character, ItemStack> getIngredientMap();
public default ItemStack(Material mat){
return new ItemStack(mat);
}
}
Применение:
PHP:
public class Main extends JavaPlugin implements CraftInterface
{
@Override
public void onEnable() {
new CraftUtils(this);
CraftUtils.addCraft(getResult(), getShape(), getIngredientMap());
}
@Override
public ItemStack getResult() {
ItemStack i = toItemStack(Material.DIRT);
ItemMeta me = i.getItemMeta();
me.setDisplayName("DIRT");
i.setItemMeta(me);
return i;
}
@Override
public String[] getShape() {
return new String[]{" "," D "," "};
}
@Override
public HashMap<Character, ItemStack> getIngredientMap() {
HashMap<Character, ItemStack> i = new HashMap<>();
i.put('D', toItemStack(Material.DIAMOND));
return i;
}
}
Жду комментарии и конструктивную критику
Последнее редактирование: