C++ SDK

На этой странице описаны основные шаги, необходимые для создания новой пользовательской команды с помощью C++ SDK, которая считывает два целочисленных аргумента и возвращает их сумму.

Это руководство было проверено для Visual Studio 2019 (Community Edition) и может отличаться для других IDE и компиляторов.

Разработка плагина

  • Создайте новый проект библиотеки динамической компоновки (DLL). В Настройки проекта->Дополнительно установите для Расширение целевого файла значение .cleo.

  • Загрузите cleo_redux_sdk.h и добавьте его в свой проект.

#include "cleo_redux_sdk.h"

Если этот заголовочный файл находится за пределами каталога вашего проекта, вам необходимо добавить папку с этим файлом в «Настройки проекта->Каталоги VC++->Включить каталоги», чтобы позволить Visual Studio обнаружить этот файл.

  • В Настройки проекта->Линкер->Вход добавьте полный путь к cleo_redux.lib (если вы разрабатываете 32-битный плагин) или в cleo_redux64.lib для 64-битного плагина.

  • в dllmain.cpp создайте новый статический класс с функцией-конструктором. Этот конструктор будет вызван, как только CLEO загрузит ваш плагин

class TestPlugin {
public:
	TestPlugin() {
		Log("My Test Plugin");
	}
} TestPlugin;
  • в конструкторе класса плагина вызовите функцию RegisterCommand для каждой новой команды
class TestPlugin {
public:
	TestPlugin() {
		Log("My Test Plugin");
        RegisterCommand("INT_ADD", IntAdd);
	}

    static HandlerResult IntAdd(Context ctx) {
        return HandlerResult::CONTINUE;
    }
} TestPlugin;
  • реализуйте обработчики для новых команд. Каждый обработчик команд получает один входной аргумент — Context ctx. Этот аргумент используется для вызова других методов SDK.
class TestPlugin {
public:
	TestPlugin() {
		Log("My Test Plugin");
        RegisterCommand("INT_ADD", IntAdd);
	}

    static HandlerResult IntAdd(Context ctx) {
        auto arg1 = GetIntParam(ctx);
        auto arg2 = GetIntParam(ctx);
        SetIntParam(ctx, arg1 + arg2);

        return HandlerResult::CONTINUE;
    }
} TestPlugin;
  • скомпилируйте проект и поместите файл .cleo в папку CLEO_PLUGINS.

  • добавить определение команды в файл JSON для целевой игры (например, gta3.json для GTA III или unknown_x86.json для хоста Unknown (x86)). Каждый GetXXXParam/SetXXXParam должен быть связан с вводом или выводом в определении команды.

{
    "input": [
        { "name": "arg1", "type": "int" },
        { "name": "arg2", "type": "int" }
    ],
    "output": [
        { "name": "result", "type": "int", "source": "var_any" }
    ],
    "id": "0DDD",
    "name": "INT_ADD",
    "num_params": 3,
    "short_desc": "Adds together two integer values and writes the result into the variable",
},

id необязателен для неизвестных хостов. Для известных и поддерживаемых игр идентификатор должен быть уникальным кодом операции, который больше нигде не используется.

Лучший способ создать правильное определение команды — использовать Sanny Builder Library. Если вы планируете поделиться подключаемым модулем и сделать его доступным через Интернет, подумайте о том, чтобы связаться с сопровождающими библиотеки, чтобы ваша команда была опубликована там.

  • теперь вы можете использовать новую команду в коде с помощью команды native
var result = native("INT_ADD", 10, 20); // 30

Пример

См. подключаемый модуль IniFiles, который включает полный проект для Visual Studio 2019.