Объект skins меняет то, как игроки выглядят на твоём экране: скин, плащ, текстуру элитры и толщину рук. Настоящий скин лежит на серверах Mojang, поэтому подмена видна только тебе. Остальные игроки и сервер видят родной скин, и ни одного пакета наружу такая замена не отправляет.
Правило действует, пока загружен твой скрипт. Выгрузишь его командой .py unload или перезагрузишь файл, и облик вернётся сам.
skins.me(skin="Notch") # себе скин Нотча
skins.skin("Player123", "Dream") # другому игроку скин Дрима
skins.all(skin="Herobrine") # всем сразу, кроме тех, у кого своё правилоПервым аргументом идёт цель. Понимается четыре вида записи:
| Цель | Кто это |
|---|---|
None или "self" | Ты сам. Скин видно и в третьем лице, и на руке от первого |
"Ник" | Игрок с таким ником, даже если он ещё не появился рядом |
объект игрока | То, что вернул world.players() или событие |
"all" | Все игроки. Работает там, где для ника нет своего правила |
for player in world.players():
if player.getName().getString().startswith("Bot"):
skins.skin(player, "MHF_Steve")Вторым аргументом идёт источник. Клиент сам понимает, что ему дали:
| Источник | Что произойдёт |
|---|---|
"Notch" | Скин игрока с таким ником, вместе с его плащом и толщиной рук |
"skins/my.png" | Файл рядом со скриптом или в папке клиента |
"https://.../skin.png" | Картинка по ссылке, качается один раз |
"optifine:Notch" | Плащ Optifine этого ника. Только для плаща |
image("skins/my.png") | Готовая текстура, если ты уже загрузил её сам |
None | Снять подмену этой части и вернуть родную |
Плащ меняется отдельно от скина: можно оставить игроку его скин и надеть на него другой плащ. Текстура элитры берётся тем же способом и видна, когда игрок летит.
skins.cape(None, "optifine:Notch") # себе плащ Optifine
skins.cape("Player123", "Dream") # чужой плащ из профиля Mojang
skins.cape(None, "capes/rockstar.png") # свой файл
skins.elytra(None, "capes/wings.png") # текстура элитры
skins.hide_cape("Player123") # плаща нет вовсе
skins.cape("Player123", None) # вернуть родной плащПлащ это обычный png 64 на 32. Рисунок берётся из левого прямоугольника: он начинается с пикселя 1, 1 и занимает 10 на 16. Правый прямоугольник, с пикселя 12, 1 и такого же размера, это изнанка, её видно, когда плащ отбрасывает в сторону. Верхняя полоса высотой в один пиксель это торцы, остальная часть картинки не используется.
| Размер файла | Как понимается |
|---|---|
64 x 32 | Обычный плащ, как у ванильных и как в шаблонах |
128 x 64 и больше вдвое | Чёткий плащ: рисунок тот же, просто в большем масштабе |
46 x 22, 92 x 44 | Формат Optifine. Клиент сам перенесёт его на нужный холст |
другое | Картинка ляжет в левый верхний угол холста 64 на 32 без растягивания |
skins.cape(None, "capes/my.png") # файл в папке скриптов
skins.cape(None, "https://site.ru/cape.png") # или по ссылке
skins.cape(None, image("capes/my.png")) # или уже загруженная текстураПлащ можно и рисовать на ходу. Динамическая текстура из assets.dynamic_texture(...) подходит так же, как файл: обновляешь её пиксели, и плащ меняется в тот же кадр, заново назначать его не нужно.
tex = assets.dynamic_texture("mycape", 64, 32)
tex.update(bytes(64 * 32 * 4)) # RGBA, слева направо и сверху вниз
skins.cape(None, tex)У скинов две модели: wide это обычные руки в четыре пикселя, а slim это тонкие в три. Когда скин берётся по нику, модель приходит вместе с ним и указывать её не нужно. Для файла и ссылки её задают руками.
skins.me(skin="skins/alex.png", model="slim")
skins.model("Player123", "wide")
skins.model("Player123", None) # вернуть роднуюskins.reset("Player123") # у одного игрока
skins.reset() # у себя
skins.clear() # все правила этого скрипта
skins.targets() # ["player123", "*"]
skins.get("Player123") # {"skin": "...", "model": "slim", "hide_cape": False}Отдельно чистить ничего не обязательно: при выгрузке скрипта клиент снимает его правила сам.
| Метод | Описание |
|---|---|
skins.set(target, skin, cape, elytra, model) | Всё сразу, любым набором именованных аргументов |
skins.me(skin, cape, elytra, model) | То же самое для себя |
skins.all(skin, cape, elytra, model) | То же самое для всех игроков |
skins.skin(target, source) | Только скин |
skins.cape(target, source) | Только плащ |
skins.elytra(target, source) | Только текстура элитры |
skins.model(target, name) | Толщина рук: slim или wide |
skins.hide_cape(target) | Убрать плащ совсем |
skins.reset(target) | Снять правило цели |
skins.clear() | Снять все правила скрипта |
skins.targets() | Список целей, у которых сейчас есть правило |
skins.get(target) | Что подменено у цели |
mod = Module("Disguise", "Visuals")
nick = TextSetting(mod, "Скин").maxLength(16).set("Notch")
cape = Checkbox(mod, "И плащ Optifine").set(True)
@events.module_toggled
def on_toggle(event):
if event.getModule().getName() != "Disguise":
return
if mod.isEnabled():
skins.me(skin=nick.get())
if cape.get():
skins.cape(None, "optifine:" + nick.get())
client.msg("маскировка включена, видно только тебе")
else:
skins.reset()