[ГАЙД] Кейсы(Тайники).

В этом гайде я опишу создание кейсов, рандом и анимации для кейсов. За идею спасибо @PbI6A.

База: инвентарь кейса. Перед тем как кодить поставьте в технической зоне(где-то за картой) двойной сундук с названием "Кейс"(Можно цветное)
Форматирование (BB-код):
# - объяснение кода.
#Жирным выделены сохранённые переменные и постоянные массивы.
#Слова в кавычках - текстовые переменные

Событие игрок заходит в игру
    #Создадим массив где будут хранится все кейсы игрока
    Если переменная НЕ существует(%player%CaseArray) {
        #Сделаем так, чтобы массив создавался всего 1 раз
        Установить значение переменной(%player%CaseArray, "True")
        Создать массив(%player%CaseArray)
        #Поместим предметы кейсов в переменные. Например донатный кейс будет головой золотого сундука в переменной donateCase
        Установить предмет в переменную(defaultCaseItem, ложим голову/предмет)
        #Устанавливаем столько переменных и предметов, сколько хотим сделать видов кейсов
    }

Событие игрок кликает правой кнопкой
    #Это когда игрок открывает меню кейсов. У меня для этого надо кликнуть по порталу энда
    Если игрок смотрит на(Ложим блок по которому надо кликнуть для открытия меню, число ложим 0 и отключаем дату блоков) {
        #Так как майнленд сильно ограничивает вызов функций, мы сделаем очередь для открытия кейсов.
        #То есть если два игрока пытаются одновременно открыть меню - одному из них придётся подождать
        #Если не сделать - могут быть ошибки + сломается код
        Если переменная(functionBusy = True) {
            Присвоить значение переменной +=(query)
            Отправить сообщение игроку("Кейсы уже используются! Место в очереди: " query)
        } Иначе {
            Сравнить число облегчённо(query > 1) {
                 Присвоить значение переменной -=(query)
            } Иначе {
                Установить значение переменной(query, 0)
            }
            #Тут мы сделаем открытие меню кейсов. Начнём.
            Установить значение переменной(functionBusy, "True")
Установить значение переменной(caseFillerLength, 0)
            #caseFillerLength - переменная, которая будет использовать для заполнения меню
            #0 - переменная "Число", не "Текст"
            Установить значение переменной(caseFillerLength, 0)
            #Тоже переменная пригодится позже
            Получить размер массива(%player%CaseArray, %player%ArrayLength)
            Отправить сообщение игроку на экран("Выдача кейсов..." "Это может занять до 2-х секунд...")
            #Очищаем сундук с кейсами после прошлого игрока
            Очистить контейнер(Ложим координаты того двойного сундука)
            #Эту строчку можно не делать. Я просто немного обрезал количество кейсов, теперь самая нижняя строка будет заполнена серым стеклом)
            #Если что, скриншот будет ниже
            Установить предметы в контейнер(Ложим координаты того двойного сундука, предмет - светло серая стеклянная панель, числа ложим от 45 до 53)
            #Собственно заполним сундук кейсами игрока
            Вызвать функцию(CaseFiller)
        }
   }

Функция(CaseFiller)
    #Очистим экран игрока, так как кейсы могли загрузиться быстрее
    Отправить сообщение игроку на экран("&f")
    Сравнить число облегчённо(%player%ArrayLength > 0) {
        #Будем выполнять код, пока не добавим все кейсы
        Сравнить число облегчённо(caseFillerLength < %player%ArrayLength) {
            Присвоить значение переменной +=(caseFillerLength)
            #Узнаем слот, куда надо ложить кейс
            Присвоить значение переменной -(caseFillerItemSlot, caseFillerLength, 1)
            #Так как у нас может быть несколько видов кейсов, мы узнаем, что именно это за кейс
            Получить элемент массива(%player%CaseArray, caseFillerLength, caseItem)
            #Положим кейс в инвентарь
            Установить предметы в контейнер(Ложим координаты того двойного сундука, Динамическая переменная: caseItem, число: caseFillerItemSlot)
            Ждать(1 тик)
            Вызвать функцию(caseFiller)
        } Иначе {
            #Когда мы добавим все предметы - мы откроем инвентарь игроку и покажем его кейсы
            Присвоить значение переменной(functionBusy, "False")
            Открыть инвентарь из игры(Ложим координаты того двойного сундука, выбираем "Копия")
        }
    } Иначе {
        #Если у игрока нету кейсов - отобразим пустой инвентарь(Можно положить предмет с названием "Пусто!")
        Открыть инвентарь из игры(Ложим координаты того двойного сундука, выбираем "Копия")
        Установить значение переменной(functionBusy, "False")
    }

Событие игрок пишет в чат
    #Это лимит кейсов, всего можно будет иметь 1 заполненную страницу.
    Сравнить число облегчённо(%player%ArrayLength < 45) {
        #Дальше - код для добавления кейса игроку
        #Повторяйте это "Если сообщение равно" сколько хотите
        Если сообщение равно("@giveDefaultCase") {
            Добавить в конец массива(%player%CaseArray, defaultCaseItem)
            Получить размер массива(%player%CaseArray, %player%ArrayLength)
        }
    }

Событие игрок кликает по инвентарю
    Если название открытого инвентаря("Кейс") {
        Отменить событие
        #Это код, когда игрок открывает кейс.
        Если переменная(caseBusy != "True") {
            Если кликнутый предмет равен(Ложим предмет-кейс, например голову ввиде золотого сундука) {
                Присвоить значение переменной(casePlayer, %player%)
                Присвоить значение переменной +(%player%ClickSlot, Значение события - кликнутый слот, 1)
                Удалить элемент из массива(%player%CaseArray, %player%ClickSlot)
                Присвоить значение переменной(caseBusy, "True")
                Закрыть инвентарь
                Присвоить значение переменной(caseCoordinates, координаты - центр блока кейсов(x и z координаты должны иметь .50, y координата на 1-1.5 блоков меньше координаты где стоит блок для открытия кейсов.))
                #Тут появляется проблема. Если поставить интеллект и гравитацию на "нету", то моб с головой не сможет подлетать вверх(подлетать вверх - анимация поднятия. А если поставить на "есть" - моб будет крутиться и будет не очень красиво. И будет ещё одна проблема, опишу дальше
                #Если есть идеи для решения этой проблемы - пишите.
                #Возраст 100 нужен для того, чтобы не спавнился зомби-малыш. Радиус зрения чтобы зомби не атаковал.
                Заспавнить моба(Яйцо зомби, координаты - центр блока кейсов(должно совпадать с координатами из "Присвоить значение переменной") Отключаем звуки, деспавн и урон. Радиус зрения - 0, возраст - 100. Имя - "КЕЙС". Ложим зелье невидимости 10 на 8 минут(я сделал через инфинити айтем эдитор), отключаем частицы и в слот для шлема ложим голову кейса. В данном случае - голову золотого кейса.)
                Вызвать функцию(caseAnimation)
            }
        } Иначе {
            Отправить сообщение игроку("Кейсы уже открываются!")
        }
    }


Анимация открытия. Сразу скажу, что она работает неидеально. Если есть идеи для решения проблем - пишите. Моя анимация - просто поднятие кейса наверх. Если есть желание и время - можете сделать как на мл, чтобы были линии из частиц. Можно ещё кучу разных придумать.
Форматирование (BB-код):
Функция(caseAnimation)
    #Можно экспериментировать с числом, например вместо 0.1 поставить 0.5
    Установить значения в местоположение(caseCoordinates, caseCoordinates, режим установки Y += и туда же ложим 0.1)
    #Можно экспериментировать с выборкой, например попробовать "Если находится рядом"
    Выбрать моба по типу(Яйцо зомби)
    #Шифт + пкм по табличке и выбираем "Выборка"
    Запустить к местоположению(caseCoordinates)
    Присвоить значение переменной +=(caseAnimationIter)
    #Это количество итераций. Проще говоря, на сколько блоков надо поднять(10 итераций - 1 блок)
    Сравнить число облегчённо(caseAnimationIter <= 20) {
        Ждать(1 тик)
        Вызвать функцию("caseAnimation")
    } Иначе {
        #Дальнейший код нужен чтобы зомби с головой кейса не упал вниз - тогда анимация не сломается.
        Заспавнить моба(Яйцо зомби, координаты - под блоком кейсов(Ну блок кейсов и по Y отнимаем 2-3 блока через IIE Отключаем звуки, деспавн, гравитацию, ИИ и урон. Возраст - 100. Ложим зелье невидимости 10 на 8 минут(я сделал через инфинити айтем эдитор.)
        #Можно экспериментировать с выборкой. Так же ставим через стрелочку "НЕ"
        #Дальнейший код - пересоздание головы кейса, чтобы зомби с головой не упал вниз(так как гравитация на него действует)
        Выбрать моба по условию(Имя равно "КЕЙС")
        #Все дальнейшие блоки действий будут с выборкой, не забудьте(Шифт + пкм по блоку)
        Телепортация(caseCoordinates)
        Ждать(1 тик)
        Надеть броню(В слот для шлема ложим голову кейса, например голову золотого сундука)
        Выбрать моба по условию(Имя равно "КЕЙС")
        Удалить сущность
        #Когда кейс полностью поднимется - вызовется рандом, чтобы определить что выпало
        #Если экономите место - все блоки из функции можно запихнуть сюда
        Установить значение переменной(caseAnimationIter, 0)
        Вызвать функцию("caseRandom")
    }

Итак. Теперь сделаем рандом. Есть два вида: Простой и сложный.

Простой рандом - рандом с одинаковыми шансами. То есть, мы ложим 5 предметов и у каждого предмета шанс на выпадение 20%(100%:5=20%). Ложим 10 предметов - у каждого шанс 10%. Это делается через "Установить случайное значение". Если вам лень кодить - делайте этот способ.

Сложный рандом - рандом с разными шансами. То есть, допустим, у нас есть 3 предмета - легендарный, обычный и редкий. Допустим, у легендарного шанс на выпадения 10%, у редкого 35% и у обычного 55%. Я сделаю код для этого отдельной функцией.

Итак, сам код-функция.

Форматирование (BB-код):
Функция("caseRandom")
    #Расскажу принцип работы. Мы как бы делим 100(100%) на несколько сегментов.
    #Чем меньше размер сегмента, тем меньше и процент попадания в данный сегмент
    Установить случайное число(caseRandomValue, 1, 100)
    #Это проверки, в какой сегмент попадаем. Их можно делать сколько хотите.
    Сравнить число(caseRandomValue, сверху: > 0, снизу: <= 10) {
        Установить предмет в переменную(caseRandomItem, легендарный предмет для выпадения)
    }
    Сравнить число(caseRandomValue, сверху: > 10, снизу: <= 45) {
        Установить предмет в переменную(caseRandomItem, редкий предмет для выпадения)
    }
    Сравнить число(caseRandomValue, сверху: > 45, снизу: <= 100) {
        Установить предмет в переменную(caseRandomItem, обычный предмет для выпадения)
    }
    #Дальше идёт выдача предметов и анимация(Появится предмет и будут партиклы, а ещё сообщение в чат)
    Выбрать моба по условию(Тип = зомби)
    Удалить сущность(Шифт + пкм и выбираешь "Выборка")
    #Тут мы создадим предмет(как на мл при открытии тайников), и настроим координаты: чтобы голова кейса заменилась на предмет
    Установить значения в местоположение(caseCoordinates, caseCoordinates, режим установки Y +=, число сделайте где-то 1.8, может 1.7)
    Создать предмет(caseCoordinates, caseRandomItem, название если хотите сделайте, задержку введите типа 100000000000, свечение включаем и гравитацию отключаем)
    Воспроизвести взрыв фейерверка(Фейерверк сделайте сами, местоположение - caseCoordinates)
    #Можно сделать тут какое-то сообщение в чат, типа такой-то игрок выбил такой-то предмет
    Выбрать игрока значение равно(casePlayer, %default%)
    #Тут тоже сделайте "Выборка"
    Выдать переменные(caseRandomItem)

Теперь сделаем предосторожность, если игрок выйдет во время чего-то.
Форматирование (BB-код):
Событие игрок выходит из игры
    Если переменная(casePlayer = %player%) {
        Установить значение переменной(casePlayer, "None")
        Установить значение переменной(caseBusy, "False")
        Установить значение переменной(functionBusy, "False")
        Присвоить значение переменной -=(query)
    }
В течении двух дней я напишу в комментарии код для категорий рандома(редкостей, в одной редкости может быть несколько предметов) и код для страниц, чтобы у игрока могло быть несколько страниц кейсов. Возможно так же добавлю напишу код для еще нескольких анимаций.

Если найдете какие-то ошибки/нелогичности в коде - пишите, я исправлю. Пишу статью второй день, потому могут быть недоработки. Вопросы тоже пишите.

Скриншот, который я обещал(если не обещал(мог стереть пометку эту) - напишите пожалуйста)
1687709503166.png
 
Последнее редактирование:

miha1l_YT_

Участник
Регистрация
16 Май 2023
Сообщения
9
Слишком много букв. Больше 3 строк не перевариваю. Х
 
Сверху