Баффы и дебаффы (в игре они называются эффектами) лежат в объекте effects. Он же buffs, если так привычнее. Список отсортирован по названию, поэтому иконки в ряд не прыгают между кадрами.
@events.tick
def on_tick(event):
if not world.ingame():
return
for eff in effects.list():
client.msg("%s осталось %s" % (eff.label, eff.time))
if effects.has("speed"):
client.msg("Скорость %d уровня" % effects.level("speed"))Эффект всюду можно назвать строкой: "speed" или полным именем "minecraft:speed". Так же принимаются и сами объекты эффектов.
| Вызов | Что вернёт |
|---|---|
effects.list(hidden=False) | Список эффектов игрока |
effects.good() / effects.bad() | Только полезные или только вредные |
effects.has("speed") | True, если эффект висит прямо сейчас |
effects.get("speed") | Сам эффект или None |
effects.level("speed") | Уровень с единицы, как в игре; нет эффекта: 0 |
effects.duration("speed") | Сколько ходов игры осталось, у бесконечного -1 |
effects.seconds("speed") | То же в секундах |
effects.time("speed") | Оставшееся время строкой 01:23 |
effects.info("speed") | Описание эффекта, даже если его на игроке нет |
effects.of(entity) | Эффекты другого существа |
effects.types() | Все названия эффектов, какие знает игра |
Объект работает и как список: for eff in effects:, len(effects) и "speed" in effects дают то же, что и методы выше.
Каждый эффект это объект со свойствами, а не с методами: скобки после eff.level ставить не нужно.
| Свойство | Тип | Что это |
|---|---|---|
id | str | Полное название: minecraft:speed |
key | str | Короткое название: speed |
name | str | Как эффект называется в игре на твоём языке |
label | str | Название с уровнем: Скорость II |
level | int | Уровень с единицы, как в игре |
amplifier | int | Уровень с нуля, как внутри игры |
duration | int | Сколько ходов игры осталось, у бесконечного -1 |
seconds | float | То же в секундах |
time | str | Оставшееся время строкой: 01:23 |
color | Color | Цвет эффекта, тот же, что у его частиц |
category | str | good, bad или neutral |
good / bad | bool | Полезный или вредный |
infinite | bool | Бесконечный (маяк, творческий режим) |
ambient | bool | Эффект от маяка: игра рисует значок тусклее |
particles / visible | bool | Показывает ли игра частицы и значок |
hidden | bool | Служебный эффект: сервер спрятал и частицы, и значок |
active | bool | Висит прямо сейчас (у описания из info будет False) |
Иконка это тот же значок, который игра рисует в инвентаре. Рисовать его умеет любой контекст рисования: HUD-элемент, свой экран и меню на компонентах.
bar = hud.add("BuffBar", width=100, height=14)
@bar.render
def draw(ctx):
x = 0
for eff in effects.list():
ctx.effect(eff, x, 2, 10) # значок эффекта
ctx.text(eff.time, x + 12, 4, size=6) # и время рядом
x += 40Первым аргументом идёт сам эффект или его название, дальше координаты, размер и цвет: ctx.effect(effect, x, y, size=10, color=None). Название удобно, когда эффекта на игроке нет, а значок нарисовать надо: ctx.effect("strength", 0, 0, 16).
Те же значки доступны в меню и в мире:
@screen("Мои баффы", 200, 160)
def menu(ui):
with ui.column(gap=4, pad=8):
for eff in effects.list():
with ui.row(gap=6):
ui.effect(eff, 12)
ui.text("%s %s" % (eff.label, eff.time))
@events.render_3d
def draw_world(event):
target = world.nearest_player()
for i, eff in enumerate(effects.of(target)):
render3d.effect(event, eff, target, size=0.35, roll=0)В уведомлениях значок тоже есть: notify.effect(text, effect) показывает маленькую плашку с иконкой:
@events.effect_added
def on_effect(event):
eff = event.getEffect()
notify.effect("Выдали %s" % eff.name, eff, eff.label, eff.color)Ловить смену эффектов опросом каждый ход игры не нужно, для этого есть два события: effect_added и effect_removed. Эффект приходит таким же объектом, как в списке.
@events.effect_added
def on_added(event):
eff = event.getEffect()
if event.isUpgraded():
client.msg("Обновили %s" % eff.label)
else:
client.msg("Выдали %s на %s" % (eff.label, eff.time))
@events.effect_removed
def on_removed(event):
eff = event.getEffect()
if event.isExpired():
client.warn("%s кончился" % eff.name)effects.of(entity) берёт эффекты любого живого существа, но клиент знает только то, что ему прислал сервер. Для чужих игроков список почти всегда пустой, и это не ошибка скрипта: сервер такие данные не рассылает.
Что действительно видно у чужих: частицы вокруг них и невидимость. Строить свой ESP по чужим баффам нельзя, а вот показывать свои над головой или рядом с прицелом вполне можно.
@events.render_3d
def draw(event):
if not world.ingame():
return
me = world.self()
for i, eff in enumerate(effects.list()):
render3d.effect(event, eff, (me.getX(), me.getY() + 2.4 + i * 0.4, me.getZ()), size=0.3)