Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Стартап Простая утилита для создания крафтов с ItemStack'ами

Полезна ли эта тема для новичков

  • Да

    2 голосов 40,0%
  • Нет

    0 голосов 0,0%
  • Незнаю

    1 голосов 20,0%
  • Ваще хрень

    2 голосов 40,0%
Статус
Закрыто для дальнейших ответов.

Energy warrior

Активный участник
Пользователь
Баллы
76
Всем привет! Есть у меня один большой плагин в разработке. И там есть крафты с ItemStack нашёл видео на польском где чувак рассказывает как сделать такие крафты. Но они получились грамосткие.
Позже я нашёл видео на английском и нашёл в его методе что-то удобное поддающееся к автоматизации. На его основе я сделал данную утилиту. Она представляет из себя 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;
    }
}

Жду комментарии и конструктивную критику
 
Последнее редактирование:
Я тебе кинул в другой теме же. Все, тебе только иметь конфиг со стаками.

Код:
public static void addRecipe(Plugin plugin, ItemStack stack, ItemStack[] istack) {
        ShapedRecipe rc = new ShapedRecipe(new NamespacedKey(plugin, UUID.randomUUID().toString()), stack);
        rc.shape("012", "345", "678");
        for (int i = 0; i < 9; i++) {
            if (istack[i] != null && istack[i].getType() != Material.AIR)
                rc.setIngredient(String.valueOf(i).toCharArray()[0], istack[i].getType());
        }
        Bukkit.getServer().addRecipe(rc);
    }
 
Я тебе кинул в другой теме же. Все, тебе только иметь конфиг со стаками.

Код:
public static void addRecipe(Plugin plugin, ItemStack stack, ItemStack[] istack) {
        ShapedRecipe rc = new ShapedRecipe(new NamespacedKey(plugin, UUID.randomUUID().toString()), stack);
        rc.shape("012", "345", "678");
        for (int i = 0; i < 9; i++) {
            if (istack[i] != null && istack[i].getType() != Material.AIR)
                rc.setIngredient(String.valueOf(i).toCharArray()[0], istack[i].getType());
        }
        Bukkit.getServer().addRecipe(rc);
    }
Я говорю про код. Мне нужен крафт внутри.
 
псс.. ты интерфейс не выложил
 
Эм, плагин если не ошибаюсь года 2 на спайтготе валяется по созданию подобного
 
Эм, плагин если не ошибаюсь года 2 на спайтготе валяется по созданию подобного
Во-первых, это для новичков и говнокодеров(вроде меня),которые не умеют пользоваться гуглом. Во-вторых, зачем скачивать плагин, когда можно создать пакет и запихнуть туда 3 файла. В-третьих, эта утилита нужна в случае если у тебя дохринилион крафтов и не хочется создавать миллион файлов. Просто написал одну строчку и всё.
 
Согласен только с первым, новичкам зайдет.
Во вторых и в третьих - зачем усложнять? И это видимо очень большая строчка!

Не в тему конечно но близко, касается "плагиноделов"
Существует допустим плагин на сообщение при входе и таких уже десятки, не стоит тратить время на то что уже есть, неужели кто-то горд за такое название плагина "JoinMessageGovnoCraft.jar"
"Зачем брать туалетную бумагу, если есть рука", собственно может кто нибудь осознает.
 
И это видимо очень большая строчка!
Я хотел сказать, что для одного крафта одна строчка.
Во вторых и в третьих - зачем усложнять
Кому как. Лично мне нравится. Когда утилиты находятся в пакете плагина , а не в папке plugins.

Понимаю ещё какой-нибудь Pex, WG, We, Vault, IDisguise... Но малюсенький плагин в папку?Тем-более есть возможность редачить под себя . А готовый плагин не всегда даёт такую возможность. Поэтому, кому как.
Ты за готовый плагин, я за пакет.
 
Статус
Закрыто для дальнейших ответов.

Поделиться этой страницей

Назад
Верх