Иконка ресурса

Правильно создаем менюшки на бакките

Fallen

Пользователь
Сообщения
3
Fallen добавил(а) новый ресурс:

You must be logged in to see this link. - Объяснение как правильно создать меню

Начнем с того что многие все еще не умеют создавать нормальные менюшки и делает те же самые проверки по title, не соблюдают структуру классов и позже данный код невозможно дополнять/читать. А также этот гайд будет очень полезен для новичков которые только начинают свое знакомство с Bukkit и его обитателями.

Шаг 1: Основа меню (BaseMenu)​

Используем интерфейс InventoryHolder - это современный стандарт. Он позволяет «пометить» инвентарь как наш собственный.

Java:
//...

You must be logged in to see this link.
 
1. кастомный ClickEvent - нахрен не нужен
2. Замени мапу на что-то типа private Int2ObjectMap<TsonFunc> slotFunctions - если не нужна поддержка кликов на невозможные слоты - то тогда и вовсе массива хватит.
Можешь собственна и использовать мои Tson-конфиги - мощный рефлектор и кодогенерация с поддержкой скриптовых движков и

3. containsKey - не нужен. Просто get и проверка на null после

Если опустить небольшие косяки выше - норм, у меня у самого похожий дизайн виртуальных инвентарей (но там переброска - прямая, без событий)

Java:
public class SmartChestGui extends ChestGui{
    private Int2ObjectMap<TsonFunc> slotFunctions = Int2ObjectMaps.emptyMap();
    private TsonFunc onClose;
    private Object[] runtimeVrPl;

    public SmartChestGui(int size) {
        super(size);
    }


    protected void setRuntimeVrPl(Object[] vrPl){
        this.runtimeVrPl = vrPl;
    }


    public void setFunctions(Int2ObjectMap<TsonFunc> funcs){
        slotFunctions = funcs;
    }


    public void setOnClose(TsonFunc onClose) {
        this.onClose = onClose;
    }


    @Override
    public void closeInventory(EntityPlayer player) {
        super.closeInventory(player);
        if(onClose != null)onClose.call(this, player);
    }


    @Override
    protected void onCreateVrPl(VrPlayerInv inv, IPlayerDataModel model) {
        Object[] vr = runtimeVrPl;
        if(vr != null) inv.fill(model, (TsonFunc[])vr[0], (byte[])vr[1]);
    }


    @Override
    public ItemStack onClick(Container cont, int slotId, int dType, ClickType cType, EntityPlayer player) {
        TsonFunc func = slotFunctions.get(slotId);
        if(func == null)return null;
        ItemStack result;
        if(func.countArgs() == 1){
            result = ChestGui.canselAll(cont, slotId, dType, cType, player);
            try {
                func.call(player);
            } catch (Throwable e){
                e.printStackTrace();
            }
            return result;
        }
        try {
            result = (ItemStack)func.call(cont, slotId, dType, cType, player);
        } catch (Throwable e){
            e.printStackTrace();
            result = ChestGui.canselAll(cont, slotId, dType, cType, player);
        }
        return result;
    }
}
 
Назад
Сверху Снизу