Форум Pawn.Wiki - Воплоти мечту в реальность!: Примеры CEF, описание функций и многое другое - Форум Pawn.Wiki - Воплоти мечту в реальность!

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

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Урок ]
Примеры CEF, описание функций и многое другое
Оценка: -----

#1
Пользователь офлайн   Макс 

  • Местный
  • Вставить ник
  • Раскрыть информацию
Структура
  • Файл cef.asi должен находится в корневой папке с игрой (собирается как loader.dll).
  • Папка cef со всем содержимым так же там же.
  • Так же создается папка CEF по пути Мои документы/GTA San Andreas User Files/CEF/, где хранится кэш, куки файлы и прочие вещи, необходимые для корректной работы Chromium.
  • gta_sa.exe
  • cef.asi
  • cef/
    • client.dll
    • libcef.dll
    • renderer.exe
    • etc ...



Советы по использованию и некоторые ограничения
  • В идеале иметь один браузер со всеми интерфейсами. Не создавать новые для разных действий, а использовать встроенную систему событий.
  • Если имеются клиентские плагины, которые используют относительные пути, то, скорее всего, они поломаются и будут неверно работать. К сожалению, на данный момент во время инициализации меняется текущая директория в другом потоке. Как пример: CLEO библиотека может создать свой лог cleo.log, а так же папки cleo_text и cleo_saves в папке cef. Для корректной работы следует лучше узнавать путь до текущего исполняемого файла (gta_sa.exe).


Pawn API

Создает браузер для указанного игрока.
cef_create_browser(player_id, browser_id, const url[], hidden, focused)


Удаляет браузер.
cef_destroy_browser(player_id, browser_id)


Скрывает браузер.
cef_hide_browser(player_id, browser_id, hide)


Вызвать событие у клиента. Поддерживаемые типы аргументов: string, integer, float.
cef_emit_event(player_id, const event_name[], args...)


Подписаться на событие от клиента. Сигнатура функции колбека: Callback(player_id, const arguments[])
cef_subscribe(const event_name[], const callback[])


Проверка на наличие плагина у клиента.
cef_player_has_plugin(player_id)


Создает браузер как и в первом случае, но с пометкой, что он будет отображаться на объектах на определенной текстуре. Параметр scale указывает во сколько раз нужно увеличить стандартную текстуру. Например, если стандартная текстура имеет размер 250x30 будет иметь размер 1250x150 при переданном параметре в 5 единиц.
cef_create_ext_browser(player_id, browser_id, const texture[], const url[], scale)


Заменяет текстуру переданного объекта на изображение браузера у клиента. Браузер должен быть создан с помощью cef_create_ext_browser, а так же должна присутствовать текстура, указанная при создании, для корректного отображения.
cef_append_to_object(player_id, browser_id, object_id)


Возвращает оригинальную текстуру объекта.
cef_remove_from_object(player_id, browser_id, object_id)


Включает / выключает инструменты разработчика.
cef_toggle_dev_tools(player_id, browser_id, enabled)


Выставляет максимальную слышимую дистанцию для браузера на объекте. reference_distance - расстояние, до которого будет максимальная громкость, а после пойдет на понижение от max_distance до 0.
native cef_set_audio_settings(player_id, browser_id, Float:max_distance, Float:reference_distance)


Функция делает браузер сфокусированным. Выводится на первый план, получает все события с клавиатуры и мыши. То же самое, что и передача аргумента focused = true при создании браузера.
cef_focus_browser(player_id, browser_id, focused)


Позволяет браузеру получать ввод с клавиатуры в фоне, даже если браузер не имеет фокуса или скрыт. Это позволяет использовать в JS коде функции для подписки на события от клавиатуры все время. Например, можно сделать открытие / закрытие интерфейса по нажатию клавиши (window.addEventListener("keyup")).
cef_always_listen_keys(player_id, browser_id, listen)


Загружает указанный URL у заданного браузера. Быстрее, чем пересоздание браузера.
cef_load_url(player_id, browser_id, const url[])



Так же есть два события встроенных в плагин:

Вызывается, когда клиент создал у себя браузер по запросу от сервера / плагина. Значение status_code либо 0 (при неудачном создании), либо HTTP код (200, 404 etc).
forward OnCefBrowserCreated(player_id, browser_id, status_code)


Вызывается после подключения клиента к CEF серверу, либо по истечению тайм-аута. Грубо говоря, замена ручной проверки cef_player_has_plugin.
forward OnCefInitialize(player_id, success)


Browser API
Так же у браузеров есть свое API для управления ими.

Фокусируется на браузере, что позволяет ему быть поверх всех остальных окон, а так же иметь возможность вводить с клавиатуры и мыши в него.
cef.set_focus(focused)


Подписывается на событие от браузера / других плагинов.
cef.on(event_name, callback)


Отписывается от события. Чтобы использовать данную функцию, необходимо передавать переменную, которая содержит функцию на колбек события, указанный при подписке на событие.
Не работает на данный момент, сломано!
cef.off(event_name, callback)


Скрывает браузер и отключает звук от него.
cef.hide(hide)


Вызвать событие на сервере / в сторонних плагинах с указанными аргументами. Поддерживает все типы, кроме объектов с полями и функций. Замечание: в плагинах возможно использовать все типы по человечески, но на сервере все аргументы преобразуются в единую строку, разделенную пробелами.
cef.emit(event_name, args...)


C API



Устаревший пример, больше не работает [Показать]



Инструкция к применению

Описание
Браузер можно создать из двух мест: из игрового мода и плагинов.


Браузер имеет два дополнительных состояния: hidden и focused. Первое состояние отвечает за отображение браузера на экране игрока. Второе состояние сложнее: если браузер сфокусирован (focused = true), то у игрока замораживается камера, появляется курсор и весь его ввод (от клавиатуры и мыши) идет прямиком в браузер, минуя GTA и SA:MP (за исключением некоторых функций по типу скриншота на F8). Игрок самостоятельно никогда не сможет выйти из этого состояния, вы должны поспособствовать этому в коде интерфейса браузера. Например, можно слушать нажатие клавиши ESC и при ее нажатии вызывать cef.set_focus(false).


Условно говоря, что открыв какой-нибудь youtube.com из него уже никогда не выйти, не закрыв игру или не поставив таймер на удаление браузера в моде.


Эти два состояния полностью независимы друг от друга, то есть браузер может быть hidden = false, но в тот же момент focused = false, в таком случае браузер будет показан, но доступа к вводу у него не будет, а игрок может спокойно совершать действия в игре.


Взаимодействие из игрового мода
В двух словах: игровой мод должен использовать только несколько нативных функций (создание / удаление браузеров, вызов событий в браузере, а так же подписка на них).


Ну и чуть кода:
Скрытый текст [Показать]



Так же есть небольшой пример псевдокода, показывающий взаимодействие игрового мода, плагина и браузера:
Скрытый текст [Показать]


Этот пост почти полная копия оригинала в котором есть неточности и битые ссылки. Также существует вероятность что его могут удалить, по этому решил продублировать на форум.

Сообщение отредактировал Макс: 06 марта 2023 - 06:34

0

#2
Пользователь офлайн   Макс 

  • Местный
  • Вставить ник
  • Раскрыть информацию
Обновлены примеры кода (были не рабочие ссылки).
0

#3
Пользователь офлайн   AngryKitten 

  • Прохожий
  • Вставить ник
  • Раскрыть информацию
как возможно сделать запуск .html файла из папки с игрой ?
0

#4
Пользователь офлайн   Perdolinka 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияAngryKitten (24 мая 2023 - 23:11) писал:

как возможно сделать запуск .html файла из папки с игрой ?

Передать в качестве url следующую строку:
file://директория_к_файлу/файл.html

0

#5
Пользователь офлайн   AngryKitten 

  • Прохожий
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияPerdolinka (24 мая 2023 - 23:18) писал:

Передать в качестве url следующую строку:
file://директория_к_файлу/файл.html

А вот возможно ли еще сделать авто определение Диска, Пути к примеру file://s%/cef/assets/index.html где s% автоопределение. Или же нужны плагины какие то уже для этой реализации ?
0

#6
Пользователь офлайн   Perdolinka 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияAngryKitten (25 мая 2023 - 10:15) писал:

А вот возможно ли еще сделать авто определение Диска, Пути к примеру file://s%/cef/assets/index.html где s% автоопределение. Или же нужны плагины какие то уже для этой реализации ?

Нужна, как минимум функция, получающая текущую рабочую область, исходя из таких данных. Честно, я не знаю существует ли такое вообще, но в Pawn такого точно нет(или, быть может, я не знаю о существовании такого). Только если явным образом указывать.

Сообщение отредактировал Perdolinka: 25 мая 2023 - 11:28

1

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика