Рантайм это сам Python, программа, которая исполняет твой код. Скрипты запускает не тот Python, что стоит у тебя в системе, а собственный, который Rockstar скачивает себе. Лежит он в папке клиента, в runtime/python.
Ставить его руками не нужно. При запуске клиент сам проверяет, есть ли рантайм, и если его нет, качает в фоне (около 16 МБ, один раз). Пока идёт загрузка, играть можно как обычно. Когда всё скачается, клиент напишет об этом в чат и сразу подхватит твои скрипты, перезаходить не надо.
Пути к своим папкам скрипт всегда может спросить сам:
print("папка клиента:", paths.root()) # .minecraft/Rockstar
print("папка скриптов:", paths.scripts()) # .minecraft/Rockstar/scripts
print("папка runtime:", paths.runtime()) # .minecraft/Rockstar/runtime, Python внутри, в python/
print(client.gameDir()) # то же самое, что paths.root()Отсюда важный вывод: пакеты из твоего системного Python клиенту не видны, а пакеты клиента не засоряют систему. Это два независимых мира. Ставить зависимости надо именно во встроенный рантайм, командой .py install.
pip это менеджер пакетов Python: он скачивает библиотеки из интернета и кладёт их туда, откуда Python сможет их импортировать. Команда .py install <пакет> (то же самое: .py pip и .py i) запускает обычный pip install внутри встроенного рантайма.
Установка идёт в фоне, игра не виснет. В чат прилетит сообщение о старте, а потом успех или текст ошибки.
.py install requests # HTTP-запросы
.py install aiogram # Telegram-бот
.py install mediapipe # компьютерное зрение (тянет opencv и numpy)
.py load myscript # теперь import внутри скрипта сработаетЭто просто примеры. Ставить можно любую библиотеку с PyPI, белого списка нет: всё, что обычно ставится обычным pip install, встанет и в рантайм клиента. Единственные ограничения это интернет и место на диске: тяжёлые пакеты вроде mediapipe или torch занимают сотни мегабайт и ставятся дольше.
За один вызов ставится один пакет. Версию можно закрепить через ==, например requests==2.32.3. Подробный вывод pip уходит в лог клиента (latest.log), строки помечены [pip]. Если установка упала, смотри туда.
| Пакет | Зачем | Нюанс |
|---|---|---|
requests | HTTP: API, вебхуки, статусы серверов | лёгкий, ставится за секунды |
aiogram | Telegram-боты | тянет за собой asyncio |
mediapipe | распознавание рук, лиц, поз с вебки | сотни МБ, ставится минуту |
opencv-python | захват камеры и обработка кадров | приезжает вместе с mediapipe |
numpy | математика по массивам | часто ставится сам, как зависимость |
websocket-client | постоянное соединение с сервером | держит соединение открытым |
Стандартная библиотека это то, что идёт в комплекте с самим Python. Ставить ничего не надо, доступна вся: os, json, time, math, random, re, datetime, socket, urllib.request, subprocess.
Половину задач она закрывает вообще без pip: скачать файл, разобрать JSON, посчитать геометрию, поставить таймер.
import json
import os
import time
import urllib.request
# скачиваем файл без requests, одной стандартной библиотекой
target = os.path.join(client.gameDir(), "motd.json") # .minecraft/Rockstar/motd.json
if not os.path.exists(target):
urllib.request.urlretrieve("https://example.com/motd.json", target)
with open(target, "r", encoding="utf-8") as handle:
motd = json.load(handle)
print("[demo] загружено:", motd.get("title", "без названия"), "в", time.strftime("%H:%M"))Обрати внимание на client.gameDir(). Относительный путь вроде "motd.json" отсчитывается от рабочей папки процесса игры, а это не папка твоего скрипта, и полагаться на неё нельзя. Поэтому свои файлы всегда собирай абсолютным путём: от client.gameDir() (он же paths.root()) или от paths.scripts().
Скрипт можно продавать на маркете. Покупателю он приезжает уже скомпилированным: байткод живёт в памяти, исходник на диск не пишется. А pip-зависимости, которые ты указал при публикации, поставятся у него сами, вручную ему ничего вводить не придётся.
Поэтому список зависимостей должен быть полным. Перечисли всё, что импортируешь и чего нет в стандартной библиотеке. Забыл пакет, и у покупателя скрипт просто не запустится.
Ещё пара правил для скриптов, которые ты выкладываешь.
Не рассчитывай на файлы рядом со скриптом. Покупателю едет только код и список пакетов: ни картинок, ни моделей, ни твоего .py на диске у него не будет. Тяжёлые ресурсы докачивай при первом запуске в client.gameDir().
Закрепляй версии важных пакетов через ==. Иначе обновление библиотеки может сломать твой скрипт сразу у всех покупателей.