Керівництво початківця · cyberlis
Table of Contents
Починаємо проект плагіна
Спочатку потрібно все підготувати для створення плагіна
- Кладемо pploader.jar у каталог /plugins/
- Кладемо jython.jar у каталог /lib/
Далі створимо папку для нашого плагіна. Створювати її потрібно в каталозі /plugins/ Назва папки має закінчуватися на .py.dir Створимо, наприклад, папку sampleplugin.py.dir Після цього в папці sampleplugin.py.dir необхідно створити два файли
- plugin.py (Це головний файл плагіна. Також допускається main.py. Усі інші файли будуть проігноровані)
- plugin.yml (Файл з усіма метаданими плагіна. Його ім'я, головний клас, версія, коммади та ін.)
Без цих двох файлів плагін не працюватиме.
Починаємо створювати ваш плагін
Заповніть вашplugin.ymlщоб він виглядав ось так:
Заповніть вашplugin.pyщоб він виглядав ось так:
Увага:У цьому файлі дуже важливі правильні відступи. Не використовуйте Tab для відступів. Ставте 4 пробіли. Кожна секція має бути на одному рівні! У всіх функціях класу (наприклад def onEnable) перший аргумент завжди має бути self! Дуже важливо, щоб головний клас був успадкований від PythonPlugin. Також його ім'я повинне збігатися з параметром main зplugin.yml
Всі. Плагін готовий. Тепер можна запускати сервер. Наш плагін під час запуску напише в консоль
sample plugin enabled
onEnable() та onDisable()
Ці функції викликаються коли плагін enabled/disabled (Увімкнено/вимкнено). За замовчуванням плагін буде вмикатися при запуску сервера і ви можете налаштувати повідомлення, яке пише в консолі при запуску плагіна. onEnable() це перше, що виконується у плагіні.
Слухачіподій (хукі)
Слухачі подій або хуки фактично будуть найбільшою частиною у ваших плагінах. Все, що б не відбувалося з гравцями на сервері, можна відловити через них. Гравець поставив блок чи гравець убив якогось монстра, чи щось інше – це все відловлюється через хук (подій). Перед тим, як ви створите такий хук, Вам треба зареєструвати його на стороні плагіна. Хорошим місцем для реєстрації хуків, буде те саме місце, де Ваш плагін підключається до сервера (onEnable). Коли ви зареєструєте подію (хук), сервер вже знатиме, що коли станеться подія, він сповістить Вашу плагін про неї.Досить стандартна модель реєстрації подій.
Насамперед потрібно імпортувати необхідні класи. Додамо на початок нашого файлуplugin.yml
Тепер настав час написати клас слухач подій. Для кожної події у ньому буде обробник. Вставляємо наступний код після підключення класів. Перед нашим класом class SampleClass(PythonPlugin):
Щоб зареєструвати саму подію, нам знадобиться Plugin Manager. Додамо наступну позицію в onEnable нашого головного класу плагіна.
Наступним кроком буде реєстрація нашого класу слухача подій. Всі хуки, які знаходяться вclass SimpleListener(PythonListener)будуть автоматично зареєстровані. Для цього додамо наступні рядки
Перший рядок створює наш слухач подій. Друга реєструє його у Bukkit. Готово. Тепер при вході гравця на сервер йому відправиться повідомлення в чатWellcome to rccraft server
Ну і весь код цілком:
Тепер Ви знаєте, як використовувати події, але що якщо Вам потрібно обробляти команди, надіслані гравцем? Для цього використовується функція всередині головного класу onCommand . Цей код викликається колигравець пише в чат команду, починаючи із символу "/". Наприклад, введення "/do something" викликає код '''onCommand''' . У разі при виклику нічого не станеться т.к. необхідно запрограмувати оточення.
Намагайтеся не використовувати команди, які вже зайняті іншими плагінами або самим bukkit. Наприклад, give одна з таких команд.
Метод '''onCommand''' повинен завжди повертати True або False. Якщо команда виконалася коректно, то зазвичай повертають True. Якщо ж у команді або її параметрах було допущено помилки, то повертають False. Bukkit у свою чергу, якщо ''onCommand''' поверне False, надрукує 'usage: property' з вашогоplugin.ymlфайлу.
Для опису '''onCommand''' завжди потрібно вказувати 4 параметри.
- '''sender''' - хто відправив команду (може бути і консоль)
- '''cmd''' - команда, яку ввів користувач (вplugin.ymlможна перерахувати кілька команд)
- '''alias''' - яке з імен посилань було використано (наприклад: msg, pm, t)
- '''args''' - список додаткових аргументів, переданих у команду. Наприклад/hello abc defпокладеabcв args[0], іdefв args[1]
Додамо накоманда в головний клас нашого плагіна.
Рядок '''cmd.getName().lower() == "samplecommand"''' у цьому рядку ми наводимо команду, яку ввів користувач до нижнього регістру і потім порівнюємо з "samplecommand" . Це ми робимо для того, щоб користувач міг ввести вашу команду у будь-якому регістрі. Хоч так "Samplecommand" або "SampleComMaNd".
Додаємо команду до plugin.yml
Ви також повинні додати команду доplugin.ymlфайлу. Додайте наступне в кінецьplugin.yml:
- '''samplecommand''' - Назва команди
- '''description''' - Опис команди.
- '''permission''' - permission для вашої команди. Bukkit автоматично перевірить permission і виведе повідомлення для користувача, якщо він не має доступу до цієї команди
- '''usage''' - Повідомлення, яке буде відправлено гравцеві якщо метод '''onCommand''' поверне False. Пишіть так щоб гравець зміг зрозуміти, як цю команду використовувати
Консольні команди проти команд Гравців
Параметр "sender" може бути як користувачем так і консоллю сервера.
Завжди перевіряйте, хто відправив команду. Це важливо. Адже якщо ви, наприклад, хочете надрукувати координати гравця, а введете команду в консолі, то відбудеться помилка.
Ще один приклад накоманда:
Часто буває так, що вашому плагіну потрібна змінна для збереження, коли сервер вимкнений або вимикається, як правило, налаштування або майно. Це досягається за допомогою конфігурації, для цього Bukkit надає вбудовану функцію.
Отримуємо конфігурацію для плагіна
Щоб отримати конфіг для вашого плагіна, потрібно написати self.getConfig()plugin.py
Змінна config тепер міститиме всі налаштування вашого плагіна. І надалі ми працюватимемо саме з нею.
Налаштування змінних конфігурацій
За допомогою нашої змінної config ми можемо зберігати будь-які стандартні типи даних у файл (рядки, цифри, списки, boolean):
Отримання змінних конфігурацій
Отримання змінних конфігурації досягається за рахунок використання різних методів одержання, як показано тут:
Перший аргумент всіх get функцій конфіга - це ім'я властивості (наприклад 'player.damaged'). Другий аргумент це значення позамовчуванням, яке підставляється, якщо властивість не була виявлена в конфізі.
Збереження та завантаження з диска
Є тільки три команди, які ви повинні знати, щоб зберігати та завантажувати налаштування з диска:
Визначити якщо в людини певні Дозволи (Permissions) у bukkit дуже просто:
Щоб вказати значення за замовчуванням для Permissions або батьківські та дочірні Permissions, їх потрібно додати доplugin.yml. Це необов'язково, але краще робити це завжди. Нижче наведено прикладplugin.yml:
Defaults (За замовчуванням)
Після того, як додаток, коли передача не буде визначена для програвачаhasPermissionwill return false. Inside your plugin.yml ви можете змінити цей параметр, щоб встановити більшу кількість слів на одну з чотирьох величин:
- true- permission буде доступний всім за умовчанням.
- false- permission буде недоступний всім за умовчанням.
- op- доступний за замовчуванням лише адміністраторам.
- not op- доступний всім, хто не адміністратор.
Children (Предки, діти, спадкоємці)
Щоб всі дочірні permissions були включені в permissions з * вам необхідно оголосити його через точку плюс * Далі в секції children вказати всі дочірні permissions:
Scheduling Tasks and Background Tasks
Операції над блоками
Найпростіший спосіб створення або зміни блоків. Для початку ми змінимо блок, що знаходиться над гравцем (вгорі) у 5-му блоці від позиції гравця. Для цього ми будемо використовувати подію PlayerMove (вона спрацьовує кожного разу, коли позиція гравця змінюється) (Хендлер повинен бути описаний у PythonListener класі).
Давайте розберемо код. На початку ми беремо позицію гравця, потім отримуємо "світ", якийнам знадобиться для подальших операцій над блоками. Далі ми беремо поточну позицію гравця по висоті та збільшуємо її на 5. Потім ми отримуємо інформацію про поточний блок через команду w.getBlockAt(loc); Насамкінець ми змінюємо ID блоку на 1 (камінь). Також ми можемо змінити його додаткові властивості, ви можете додати новий рядок b.setData(3) відразу після рядка b.setTypeId(1)
Також ми розглянемо досить простий алгоритм конструювання.
Цей код побудує 3д куб або кубоїд з необхідним розміром (його необхідно викликати примусово у зручному для вас місці). Якщо вам необхідно очистити блоки, то використовуйте значення ID рівним 0 (він же блок повітря)
Керуємо інвентарем спочатку здається складним, але насправді це досить просто. Тут буде описано управління інвентарем гравця, але це підходить і для управління інвентарем скринь та подібних блоків:
У методі onPlayerJoin ми створюємо пару змінних для спрощення нашої роботи: player, inventory та diamondstack. Після цього перевіряємо якщо гравець має алмази. Якщо є, то ми видаємо ще один алмазів inventory.addItem(diamondstack) і відправляємо золоте повідомлення. Якби ми захотіли відібрати у гравця його алмази, замість inventory.addItem(diamondstack) ми б написали inventory.remove(diamondstack).
API Bukkit дозволяє робити дуже багато цікавих та нестандартних речей. Ось кілька прикладів:
Як підпалити когось лише командою:
Тепер, якщо написати команду типу /ignite Notch та якщо гравець "Notch" онлайн, Notch загориться!
Продовжуючи тему, представляємо спосіб вбити гравця. Використовуємо метод onCommand для цього:
Ще один спосіб вбивства гравця, але вже з вибухом: