Перейти к содержимому

Ваш ресурс рядом с телефоном

Экспорты и state bag’и — это о том, как говорить с телефоном. Здесь — обратное направление: несколько вещей, которые должен знать ресурс, чтобы вы с телефоном не боролись за одного и того же игрока.

Ничего из этого не требует зависимости, события или разрешения. Четыре state bag’а и один экспорт, а большинству скриптов хватает одной строки.


Фотография — это весь кадр. Всё, что вы рисовали в момент нажатия затвора — подсказку, подпись маркера, индикатор выполнения, текстовый UI — попадает на снимок, и этот ресурс не может запретить вам рисовать. Между вашим вызовом отрисовки и экраном ничего нашего нет.

Поэтому вместо этого можно спросить:

if LocalPlayer.state.phoneCamera then goto skip end -- or return, or whatever your loop wants

phoneCamera равен true с того момента, как открывается видоискатель, и до его закрытия. Одна строка — и ваша подсказка не попадёт в фотоальбом незнакомца.

Собственный HUD телефона уже убран с дороги: пока камера открыта, миникарта и полоски здоровья в игре скрыты, так что человек получает именно то, что кадрирует.

Складной телефон — это два объекта, прикреплённых к руке педа. Скрипт, который подметает бесхозные пропы или предлагает Нажмите [E], чтобы удалить объект всему, что находится поблизости, предложит удалить чей-то телефон — и сделает это, пока человек держит его в руках.

Общее правило важнее названия модели: объект, прикреплённый к педу, — не мусор.

if IsEntityAttached(object) then goto skip end

Если нужна конкретика, модели — pear_fold_base* и pear_fold_leaf*, по одной на каждую отделку.

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 screen
phoneCamera boolean a viewfinder is up
onCallWith number | nil the source at the other end
flashlight 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