В этом гайде я опишу создание кейсов, рандом и анимации для кейсов. За идею спасибо @PbI6A.
База: инвентарь кейса. Перед тем как кодить поставьте в технической зоне(где-то за картой) двойной сундук с названием "Кейс"(Можно цветное)
Анимация открытия. Сразу скажу, что она работает неидеально. Если есть идеи для решения проблем - пишите. Моя анимация - просто поднятие кейса наверх. Если есть желание и время - можете сделать как на мл, чтобы были линии из частиц. Можно ещё кучу разных придумать.
Итак. Теперь сделаем рандом. Есть два вида: Простой и сложный.
Простой рандом - рандом с одинаковыми шансами. То есть, мы ложим 5 предметов и у каждого предмета шанс на выпадение 20%(100%:5=20%). Ложим 10 предметов - у каждого шанс 10%. Это делается через "Установить случайное значение". Если вам лень кодить - делайте этот способ.
Сложный рандом - рандом с разными шансами. То есть, допустим, у нас есть 3 предмета - легендарный, обычный и редкий. Допустим, у легендарного шанс на выпадения 10%, у редкого 35% и у обычного 55%. Я сделаю код для этого отдельной функцией.
Итак, сам код-функция.
Теперь сделаем предосторожность, если игрок выйдет во время чего-то.
В течении двух дней я напишу в комментарии код для категорий рандома(редкостей, в одной редкости может быть несколько предметов) и код для страниц, чтобы у игрока могло быть несколько страниц кейсов. Возможно так же добавлю напишу код для еще нескольких анимаций.
Если найдете какие-то ошибки/нелогичности в коде - пишите, я исправлю. Пишу статью второй день, потому могут быть недоработки. Вопросы тоже пишите.
Скриншот, который я обещал(если не обещал(мог стереть пометку эту) - напишите пожалуйста)
База: инвентарь кейса. Перед тем как кодить поставьте в технической зоне(где-то за картой) двойной сундук с названием "Кейс"(Можно цветное)
Форматирование (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)
}
Если найдете какие-то ошибки/нелогичности в коде - пишите, я исправлю. Пишу статью второй день, потому могут быть недоработки. Вопросы тоже пишите.
Скриншот, который я обещал(если не обещал(мог стереть пометку эту) - напишите пожалуйста)
Последнее редактирование: