Ваш ресурс рядом с телефоном
Экспорты и state bag’и — это о том, как говорить с телефоном. Здесь — обратное направление: несколько вещей, которые должен знать ресурс, чтобы вы с телефоном не боролись за одного и того же игрока.
Ничего из этого не требует зависимости, события или разрешения. Четыре state bag’а и один экспорт, а большинству скриптов хватает одной строки.
1. Кто-то делает фотографию
Заголовок раздела «1. Кто-то делает фотографию»Фотография — это весь кадр. Всё, что вы рисовали в момент нажатия затвора — подсказку, подпись маркера, индикатор выполнения, текстовый UI — попадает на снимок, и этот ресурс не может запретить вам рисовать. Между вашим вызовом отрисовки и экраном ничего нашего нет.
Поэтому вместо этого можно спросить:
if LocalPlayer.state.phoneCamera then goto skip end -- or return, or whatever your loop wantsphoneCamera равен true с того момента, как открывается видоискатель, и до его закрытия. Одна строка — и ваша подсказка не попадёт в фотоальбом незнакомца.
Собственный HUD телефона уже убран с дороги: пока камера открыта, миникарта и полоски здоровья в игре скрыты, так что человек получает именно то, что кадрирует.
2. Телефон в руке — не мусор
Заголовок раздела «2. Телефон в руке — не мусор»Складной телефон — это два объекта, прикреплённых к руке педа. Скрипт, который подметает бесхозные пропы или предлагает Нажмите [E], чтобы удалить объект всему, что находится поблизости, предложит удалить чей-то телефон — и сделает это, пока человек держит его в руках.
Общее правило важнее названия модели: объект, прикреплённый к педу, — не мусор.
if IsEntityAttached(object) then goto skip endЕсли нужна конкретика, модели — pear_fold_base* и pear_fold_leaf*, по одной на каждую отделку.
3. Пока телефон вынут, пед принадлежит ему
Заголовок раздела «3. Пока телефон вынут, пед принадлежит ему»mic_phone_props владеет позой педа, пока телефон в руке, и делает это всерьёз: есть сторожевой механизм, который возвращает анимацию удержания в течение полусекунды после того, как что-то другое заняло верхнюю часть тела. Он не может определить, чья анимация перед ним.
Если ваш скрипт задаёт позу этому педу — звонок, сценарий, собственную задачу, — сначала запросите руки:
exports.mic_phone_props:SetPose(false) -- they are yours; the phone hangs where a phone hangs-- … your animation …exports.mic_phone_props:SetPose(true) -- and backУступка также перемещает проп: он переходит на кость и смещение, которые использует игровой prop_npc_phone_02, и складывается, так что все стандартные анимации мобильного телефона работают без каких-либо замеров с вашей стороны. SetPose(true) возвращает хват, угол шарнира и анимацию, которые были раньше.
IsOut() сообщает, есть ли вообще от чего уступать.
4. Режим предметов меняет смысл идентификатора
Заголовок раздела «4. Режим предметов меняет смысл идентификатора»Когда телефоны — это предметы, телефон принадлежит устройству, а не персонажу. phoneDevice у игрока — это предмет, в котором телефон живёт; в режиме персонажа он равен nil.
Это важно, если вы храните что-либо привязанным к телефону: номер, подписку, лицензию. Используйте exports.mic_phone:GetDevice() и привязывайтесь к нему, иначе ваши данные последуют за человеком, хотя он продал именно телефон.
5. Четыре bag’а и одна команда, которая выводит их все
Заголовок раздела «5. Четыре bag’а и одна команда, которая выводит их все»phoneOpen boolean the phone is out and on screenphoneCamera boolean a viewfinder is uponCallWith number | nil the source at the other endflashlight boolean their torch is onПолный список с остальными — в разделе Экспорты и state bag’и. phoneapi <id> выводит каждый из них для игрока в консоль сервера, что быстрее, чем гадать, на чьей стороне ошибка.
Как положить что-то в телефон
Заголовок раздела «Как положить что-то в телефон»Уведомление, сообщение, письмо, счёт — всё это серверные экспорты, всё одной строкой, и всё описано в разделе Экспорты и state bag’и.
Целое собственное приложение — это ваше собственное приложение в нём: один вызов, без настройки телефона и без перезапуска, и оно работает в собственном фрейме.
Чего здесь пока нет
Заголовок раздела «Чего здесь пока нет»Нет хука, позволяющего отказать в открытии телефона. Правила находятся в Config.Open.Restrict — мёртв, в наручниках, плывёт, за рулём и так далее, — и ресурс не может добавить своё. Если вам уже сегодня нужно, чтобы телефон нельзя было открыть во время вашей мини-игры, честных вариантов два: правило в конфиге, которое совпадает с вашим состоянием, или вызов exports.mic_phone:Close() в момент начала вашей активности. Напишите нам, если вам нужен хук: добавить его несложно, но пока никто не просил.
Всё вместе — в виде чек-листа
Заголовок раздела «Всё вместе — в виде чек-листа»- Рисует ли ваш скрипт что-то на экране? → пропускайте отрисовку, пока
phoneCamera - Удаляет ли он, подметает или хватает ближайшие объекты? → пропускайте прикреплённые
- Анимирует ли он игрока? →
SetPose(false)иSetPose(true) - Хранит ли он что-то для каждого телефона? → привязывайтесь к
phoneDevice, а не к персонажу - Нужно ли ему знать, доступен ли человек? →
phoneOpen,onCallWith