Сейчас мы соберём модуль Counter: он считает твои удары и показывает счётчик над хотбаром. Собирать будем по шагам, дописывая файл сверху вниз, чтобы на каждом шаге было понятно, откуда взялась каждая строчка.
Создай скрипт командой .py create counter и открой файл counter.py редактором. Всё, что клиент положил туда сам, можно стереть.
Начнём с самого маленького, что вообще имеет смысл: модуля, который ничего не делает.
mod = Module("Counter", "Combat")
mod.setDesc("Считает удары")Загрузи скрипт (.py load counter), открой меню и зайди во вкладку Combat. Там уже есть Counter: его можно включить и забиндить, как любой другой модуль клиента.
| Строка | Что происходит |
|---|---|
Module("Counter", "Combat") | Создаёт модуль и сразу добавляет его в клиент. Первое слово это название в меню, второе вкладка |
mod = ... | Сохраняем модуль в переменную, чтобы дальше к нему обращаться. Имя переменной любое |
mod.setDesc("...") | Описание, которое видно в подсказке при наведении на модуль |
Вкладок всего пять, и выбирать надо из них: Combat, Movement, Visuals, Player, Other. Написать своё название вкладки нельзя.
Модуль есть, но он пустой. Теперь надо объяснить клиенту: когда игрок бьёт, зови вот эту мою функцию.
mod = Module("Counter", "Combat")
mod.setDesc("Считает удары")
hits = 0
@events.attack
def on_attack(event):
global hits
if not mod.isEnabled():
return
hits += 1
client.overlay("Ударов: %d" % hits)Сохрани файл. Клиент перезапустит скрипт сам, включи модуль в меню и ударь кого-нибудь: над хотбаром появится счётчик.
| Строка | Что происходит |
|---|---|
@events.attack | Строчка над функцией, которая говорит клиенту: зови её каждый раз, когда игрок бьёт. Таких событий больше двадцати, дальше будет отдельная страница про них |
def on_attack(event) | Сама функция. Называть можно как угодно, важна строчка сверху. Аргумент event обязателен: в нём лежат подробности удара, например по кому ударили |
mod.isEnabled() | Включён ли модуль в меню. Возвращает True или False |
global hits | Обычное правило Python: без этого слова присваивание внутри функции создаст новую переменную вместо изменения нашей |
client.overlay("...") | Надпись над хотбаром. Она сама пропадает через пару секунд и не засоряет чат |
Модуль без настроек скучный. Добавим галочку Писать в чат и ползунок, который решает, как часто это делать.
mod = Module("Counter", "Combat")
mod.setDesc("Считает удары")
notify = Checkbox(mod, "Писать в чат")
every = Slider(mod, "Каждые N ударов").min(1).max(50).step(1).set(10)
hits = 0
@events.attack
def on_attack(event):
global hits
if not mod.isEnabled():
return
hits += 1
client.overlay("Ударов: %d" % hits)
# notify.get() и every.get() читают то, что стоит в меню прямо сейчас
if notify.get() and hits % int(every.get()) == 0:
client.msg("Уже %d ударов!" % hits)Настройки создаются так же, как модуль: вызовом в файле, сверху. Первым аргументом идёт модуль, к которому настройка прицепится в меню. Сохранять значения не нужно, клиент запоминает их сам и вернёт при следующем запуске игры.
Читать значение надо через .get() и делать это внутри функции, каждый раз заново. Если положить значение в переменную один раз при загрузке, оно там и застрянет: игрок подвинет ползунок, а скрипт об этом не узнает.
.py load counter.Ничего не появилось, смотри в чат. Если там висит [Python Error], значит в коде опечатка: скрипт выгрузился целиком, и модуль пропал из меню. Почини строчку, о которой ругается клиент, и загрузи скрипт заново командой .py load counter.