Объект inventory это те же инструменты, которыми клиент двигает предметы в своих модулях. Слот везде задаётся числом, и нумерация одна на весь инвентарь.
| Номера | Что это |
|---|---|
0-8 | Панель быстрого доступа, слева направо |
9-35 | Рюкзак: три ряда сверху вниз |
36-39 | Броня: шлем, нагрудник, поножи, ботинки |
40 | Левая рука |
Там, где нужно указать часть инвентаря, пишут словом: "hotbar", "main", "armor", "offhand" или "all". По умолчанию везде "all".
slot = inventory.selected() # что сейчас в руке, 0-8
inventory.select(3) # взять четвёртый слот
inventory.id(slot) # "minecraft:diamond_sword" или None
inventory.label(slot) # название, как показывает игра
inventory.count(slot) # сколько штук в стопкеПредмет задаётся именем как в игре. Поиск возвращает номер слота или None, если такого предмета нет.
totem = inventory.find("totem_of_undying", "hotbar")
if totem is None:
client.warn("тотема в панели нет")
inventory.has("ender_pearl") # просто да или нет
inventory.total("ender_pearl") # сколько всего штук
inventory.find_all("obsidian", "main") # все слоты с обсидианом
inventory.empty("hotbar") # первый свободный слот
inventory.items("hotbar") # [(слот, id, количество), ...]Отдельно есть inventory.hold(item): берёт предмет в руку, если он лежит в панели быстрого доступа, и возвращает номер слота.
mod = Module("AutoTotem", "Player")
@events.tick
def on_tick(event):
if not mod.isEnabled() or not world.ingame():
return
if float(mc.player.getHealth()) > 10.0:
return
if inventory.offhand_is("totem_of_undying"):
return
slot = inventory.find("totem_of_undying")
if slot is not None:
inventory.to_offhand(slot)Все эти вызовы делают ровно то же, что игрок мышью, и возвращают да или нет.
| Вызов | Что делает |
|---|---|
inventory.swap(a, b) | Поменять местами два слота |
inventory.move(from, to) | Переложить предмет из слота в слот |
inventory.quick_move(slot) | Shift-клик: предмет уедет в другую часть инвентаря |
inventory.to_offhand(slot) | Отправить предмет в левую руку |
inventory.to_armor(slot, "helmet") | Надеть: helmet, chestplate, leggings, boots |
inventory.select(slot) | Взять слот панели в руку |
Пока на экране чужое меню, сундук, шалкер или меню сервера на предметах, скрипт видит его через глобал container: что лежит в слотах и что там написано, плюс клик по любому слоту. Свой инвентарь по клавише E за контейнер не считается.
@command("chest")
def chest(ctx):
"""Что лежит в открытом сундуке"""
if not container.open:
ctx.error("Ничего не открыто")
return
ctx.msg("%s: %d слотов" % (container.title, container.size))
for item in container.items():
ctx.msg("%d: %s x%d" % (item.slot, item.name, item.count))
# забрать все алмазы себе
for slot in container.find_all("diamond"):
container.shift_click(slot)| Вызов | Что делает |
|---|---|
container.open | Открыто ли чужое меню |
container.title | Заголовок окна: Сундук, Меню кланов и что там придумал сервер |
container.type | Тип меню: generic_9x3, hopper, furnace |
container.size / container.total | Слотов у контейнера и всего, вместе с инвентарём |
container.id(slot) / label(slot) / count(slot) | Идентификатор, видимое имя и количество |
container.lore(slot) | Подписи под предметом: у меню сервера там цена и условие |
container.items() | Всё содержимое разом: slot, id, name, count, lore |
container.find("diamond") | Слот с предметом или -1. Ищет и по имени тоже |
container.find_all("diamond") | Все такие слоты |
container.click(slot) | Клик левой кнопкой |
container.right_click(slot) / shift_click(slot) | Правая кнопка и перенос |
container.drop(slot, stack=False) | Выбросить предмет или стопку |
container.close() | Закрыть меню |
Иногда предмет нужно применить, не меняя того, что в руке у игрока: inventory.with_slot(slot, действие) переключает слот, выполняет действие и возвращает прежний слот обратно.
def place():
# тут действие, которому нужен именно этот слот
client.msg("ставлю блок из слота 8")
inventory.with_slot(8, place) # после вызова в руке снова прежний предметПрочность и зачарования читаются по номеру слота. Прочность приходит в процентах, а None означает, что предмет не ломается.
slot = inventory.selected()
left = inventory.durability(slot)
if left is not None and left < 20:
notify.error("Инструмент почти сломан")
if inventory.enchant(slot, "unbreaking") >= 3:
client.msg("прочность III")