Плагин выдаёт коробку удачи командой /givebox . После этого, игрок может эту коробку открыть командой /openbox, держа её в руках: коробка удалится, и в инвентаре появятся вещи, выпавшие из неё. В чат выведется сообщение: "Вам выпало то-то, то-то и то-то.", или сообщение об ошибке и краткое описание (например, если в инвентаре нет места).
Коробка — это обычный предмет, отличающийся от других только описанием (lore), тем, что на него наложено зачарование Защита 3 (просто для красоты, чтоб светился, можно отключить). В lore закодирован id коробки (с помощью не влияющих на отображение цветовых кодов) и написаны названия всех предметов, выпадающих из коробки и их количество. Пример на скриншоте.
# Идентификатор коробки (указывается в команде /givebox )
# Должен быть целым положительным числом,
# желательно, в формате 990 во избежание пересечения под-id с обычными предметами.
9901:
# Вещь, которой является коробка, желательно, нестакающаяся.
# Лучше всего подходит вагонетка с сундуком (STORAGE_MINECART).
# Если эту вещь можно использовать (вагонетку, например, поставить на рельсы),
# то это нельзя будет сделать, если эта вещь — коробка
# Формат указания: цифровой id (например, "57" — алмазный блок)
# или строковый (для предыдущего — "DIAMOND_BLOCK").
boxItem: STORAGE_MINECART
# Название коробки
boxName: 'Коробка удачи'
# Сколько вещей выпадает из коробки (если меньше общего кол-ва вещей, то коробка не будет открываться)
itemsToSelectCount: 3
# Проверять наличие у открывающего разрешения randombox.open.
checkPermission: true
# Открывать коробку при клике правой кнопки мыши во время держания её в руках
openWhenClicked: true
# Зачаровывать коробку на Защиту III?
enchant: true
# Делает коробки нестакающимися (если это стакающиеся предметы или блоки)
unstackable: true
items:
# Вещи, выпадающие из коробки
Как видно, коробкой может быть любой предмет, при это его нельзя будет поставить на землю (если это блок), на рельсы (если это вагонетка) и вообще как либо использовать, кроме как открыть.
id предметов рекомендуется указывать числами, можно строками типа "DIAMOND_BLOCK", но не нужно, потому что они часто не соответствуют нормальным названиям блоков и предметов (например, "DIODE" - это повторитель).
# Любое уникальное название, не влияет ни на что
item1:
# Если добавлена эта секция, то вместе
# с выдачей предмета будет выполнены
# команды из этого списка с заданными
# аргументами
#
# В данном примере игрок получит
# 10 уровней опыта
# Чтобы выполнить только команды, поставьте
# id предмета 0 или AIR
commands:
# Любое название, не влияет ни на что
command1:
# Название команды без / вместе
# с аргументами.
line: 'xp give %player% 10L'
# Выполнять команду от имени
# консоли (true) или игрока (false)
fromConsole: true
# id предмета
item: DIAMOND_SWORD
# Data value предмета (то, которое через двоеточие)
data: 0
# Количество предметов в стаке
amount: 1
# Название предмета (может быть цветным)
# Обязательный параметр! Иначе не будет имени предмета
# в описании к коробке.
name: '&cАлмазный меч'
# Описание предмета (может быть цветным)
# Каждая строчка — отдельный пункт
# - 'текст строки'
lore:
- '&7Этот меч выпал'
- '&7из коробки удачи.'
# Зачарования любого уровня и типа
# Формат: :
enchants:
sharpness: 8
unbreaking: 5
fire: 4
knockback: 2
# Сообщение, которое будет показано всем игрокам,
# Rкогда эта вещь выпадет. Чтобы это отключить, удалите
# этот параметр или оставьте пустым.
broadcastMessage: '&6%player% вытянул охрененный меч из коробки!'
# Шанс выпадения вещи
chance: 15
Допустимые зачарования:
power — Сила лука
flame — Огненные стрелы
infinity — Бесконечные стрелы
punch — Отбрасывание лука
sharpness — Острота
bane, baneofarthropods, bane_of_arthropods — Урон насекомым
smite — Урон нежити
efficiency — Эффективность
unbreaking — Прочность
fire, fireaspect, fire_aspect — Поджигание мечом
knockback — Отбрасывание мечом
fortune — Увеличение дропа руд
looting — Увеличение дропа с мобов
luck, luckofthesea, luck_of_the_sea — Более редкие вещи при рыбалке
lure — Клюёт чаще
respiration — Воздух под водой медленнее кончается
protection — Защита от всего урона
blast, blastprotection, blast_protection — Защита от взрывов
feather, featherfalling, feather_falling — Уменьшение урона от падения
fireprotection, fire_protection — Защита от огня
projectile, projectileprotection, projectile_protection — Защита от стрел
silk, silktouch, silk_touch — Добыча блоков в их настоящем виде (камень, трава вместо булыжника и земли)
thorns — Часть урона вернётся напавшему
aqua, aquaaffinity, aqua_affinity — Блоки под водой добываются быстрее
Шанс — целое число больше нуля. Чем больше доля данного шанса в сумме шансов всех вещей, тем чаще он будет выпадать. Чтобы каждая вещь выпадала с равной вероятностью, поставьте у всех вещей одинаковые шансы.
У каждой вещи есть параметр "chance" — это любое целое число, большее нуля. Пусть у нас есть 3 вещи с шансами 5, 15 и 45. Нужно выбрать 2 из них. Перед расчётом все вероятности складываются: 5 + 15 + 45 = 65.
Далее, каждая вероятность делится на сумму и умножается на 100 — узнаём долю каждой вещи в процентах. Для нашего примера это будет 7,6%, 23%, 69,2%. В сумме они образуют чуть меньше 100 (99,9% примерно).
Далее, выбирается (псевдо)случайное число из диапазона [0; 100] со случайной дробной частью. Пусть это будет 10,08. Последовательно это число проверяется на вхождение в следующие промежутки: 0..7,6; 7,6..23. 10,08 входит во второй промежуток, значит, выпала вторая вещь.
После этого вещь запоминается в отдельный список, удаляется из старого вместе с вероятностью и всё пересчитывается: 5 + 45 = 50, 5/50 = 0.1 = 10%, 45/50 = 0.9 = 90%. Пусть выпало число 6. Проверяем на промежуток: 0..10. Так как оно входит в него, следовательно, выпала первая из списка вещь.
После всего этого мы имеем, что из 3 вещей нам выпали 2: первая и вторая (редкий случай, обычно обязательно выпадет ещё и последняя с наибольшим шансом).
Всё не очень понятно на первый взгляд, но разобраться можно.
Код метода находится в saharnooby.randombox.box.Box.getRandomItems()
/givebox : выдать коробку игроку.
/openbox: открыть коробку, которая находится у вас в руках.
/randombox, /rb: информация о плагине: версия, автор и краткое описание.
/randombox reload: перезагрузить настройки с диска.
/randombox list: отобразить список коробок в конфиге
randombox.*: Разрешает выполнять все команды.
randombox.main: Разрешает выполнять команду /randombox без аргументов.
randombox.main.reload: Разрешает перезагружать плагин.
randombox.openbox: Разрешает открывать коробки.
randombox.givebox: Разрешает выдавать коробки игрокам.
randombox.infinitebox: При открытии коробка не исчезает.
randombox.open.: разрешает открывать коробку id. Проверяется, только если в настройках коробки checkPermission установлено в true.
randombox.open.*: разрешает открывать все коробки. Проверяется, только если в настройках коробки checkPermission установлено в true.
В конфиге есть булев параметр debug — включает вывод некоторой информации в консоль, типа рассчитанных вероятностей.
Есть раздел strings — в нём хранятся все строки, выводимые в чат на двух языках (русском и чуть ломанном английском, за переключение отвечает параметр locale), а также префикс сообщений и строка "Выпадающие предметы:" из описания коробки.
2.1.1:
data values вещей не записывались.
2.1
Добавлена настройка useDataValue. Если установлена в true, то id коробки будет записываться в data value вещи, а не в первую строку lore. Не рекомендуется использовать на 1.8: предметы с изменённым data value отображаются как чёрно-розовые кубы.
Если у вещи нет имени, то, вместо исключения в консоли со стектрейсом в простыню, коробка просто не будет распарсена.
2.0
Плагин полностью переписан, улучшена производительность.
Коробки парсятся при запуске, а не во время игры, и все ошибки выводятся в консоль. Количество ошибок, выводимых в чат, сокращено.
При выполнении команды /rb list выводятся также названия вещей в коробках, и команды, соответствующие вещам.
Добавлена функция оповещения всех игроков при выпадении какой-нибудь вещи: заполните строку broadcastMessage в секции вещи, и, когда вещь выпадет, все узнают об этом.
Известные ошибки
Что будет, если изменить id коробки в конфиге? Все коробки со старым id, выданные до этого, перестанут открываться.
Что будет, если изменить выпадающие вещи? Открыв любую коробку, выданную до этого, игроки немного удивятся — в описании одни вещи, а выпали другие.
С вами был Jedisiths, ставьте оценки и пилите комментарии). Всем пока!