Класс для работы с CEF (JS)

NozmaD

Администратор
Команда форума
Администратор
Сообщения
166
Баллы
208
Само собой многие (не все) задаются вопросами о взаимодействии с

Пожалуйста, Войдите или Зарегистрируйтесь, что бы увидеть скрытый контент.

и с работой CEF браузера в игре. В этом мануале разберемся как же взаимодействовать с CEF. Безусловно все легко, если знать как подступиться.

CEF Controller
Разберем работу с CEF. Прежде всего необходимы хоть базовые знания о JS, ведь именно на этом языке осуществляется передача данных Client (cef) ‹-› Server.
Можно для каждой отдельной загрузки той или иной страницы писать и создавать свои переменные, а после просматривать, что бы при открытии другой страницы (вернее другого вызова createCefBrowser) предыдущий закрывался и т.д.

Но легче использовать class, который представлен в WIKI. Ниже он представлен, но слегка изменен.
(Написан был в TypeScript)
JS Тогда приложу к этому посту, но он будет слегка отличаться

JavaScript:
/*==========================================*/
/* Основной класс для работы браузера       */
/*==========================================*/
class WebBrowser {
    browser: GrandTheftMultiplayer.Client.GUI.Browser;
    private readonly path: string;
    private open: boolean;

    constructor(resourcePath:string) {
        this.path = resourcePath;
        this.open = false;
    }

    show(local:boolean, optPath:string, chatstate:boolean = false, cursorstate:boolean = true) {
        if (this.open === false) {
      
            this.open = true;
            const resolution = API.getScreenResolution();

            this.browser = API.createCefBrowser(resolution.Width, resolution.Height, local);
            API.waitUntilCefBrowserInit(this.browser);
            API.setCefBrowserPosition(this.browser, 0, 0);
            API.loadPageCefBrowser(this.browser, optPath ? optPath : this.path);
      
            API.setCanOpenChat(chatstate);
            API.showCursor(cursorstate);
        }
    }

    destroy() {
        this.open = false;
        API.destroyCefBrowser(this.browser);
        API.setCanOpenChat(true);
        API.setHudVisible(true);
        API.showCursor(false);
    }

    eval(callFunction:string) {
        this.browser.eval(callFunction);
    }
}
Параметры:
  • show
    • local
      • Тип: boolean
      • Значения:
        • true - файл локальный (например: "Client/login.html")
        • false - файл удаленный (в интернете) (например "

          Пожалуйста, Войдите или Зарегистрируйтесь, что бы увидеть скрытый контент.

          ")
    • optPath
      • Тип: string
      • Значения:
        • Путь к загружаемой странице (опять таки либо локальный либо удаленный)
    • chatstate (Опционально)
      • Тип: boolean
      • Значения:
        • true - Пользователь может открыть строку чата
        • false - Не может (по умолчанию)
    • cursorstate (Опционально)
      • Тип: boolean
      • Значения:
        • true - Показывает курсор (по умолчанию)
        • false - Не показывает
  • eval
    • callFunction
      • Тип: string
      • Значения:
        • Имя вызываемой в созданном браузере функции.

Использование:
В этом же файле определяем новый объект WebBrowser, используя следующий синтаксис. Теперь вы можете показать CEF просто, вызвав функцию show(), с указанием параметров. и уничтожить его с помощью destroy().

JavaScript:
const cef = new WebBrowser("");
API.onServerEventTrigger.connect((eventName, args) => {

    if (eventName === "CEFDestroy") {
        cef.destroy();
    }
    else if (eventName === "CEFCreate") {
        if (args[1] === void 0) { args[1] = false; }
        cef.show(args[1], args[0]);
    }
});

API.onResourceStop.connect(() => {
    if (cef != null) {
        cef.destroy();
    }
});

Что же это получилось у нас спорите вы. Отвечу. Получилось удобное средство вызова браузера прямиком из серверной части нашего игрового мода.

Пример создания браузера из серверной части мода:
C#:
API.onPlayerConnected += player =>
{
    player.triggerEvent("CEFCreate", "Client/index.html", true);
    // "Client/index.html" - Путь до файла
    // true - Значит, что файл локальный

    API.triggerClientEvent(player, "CEFCreate", "http://google.com/");
    // "http://google.com/" - Путь до файла
    // Второго аргумента нету т.к. по умолчанию, созданный нами класс, открывает ссылки из интернета
};

Как и говорил. Прикрепляю полученные файлы здесь. Внутри вы найдете TS и JS
Скачать:

Пожалуйста, Войдите или Зарегистрируйтесь, что бы увидеть скрытый контент.


Автор: SkyLaGer
 
Верх