Создание объектов из игры (MySQL, DC_CMD, sscanf)

Описание: Уроки по скриптингу
Модератор: SJplayer

Pinger
Автор темы, Мл. сержант
Мл. сержант
Аватара
Pinger
Автор темы, Мл. сержант
Мл. сержант
Сообщения: 34
Зарегистрирован: 6 февраля 2014
С нами: 10 лет 1 месяц

#1 Pinger » 9 июля 2018, 18:23

Спойлер
Изображение

Изображение


Вставляем это в начало мода. Здесь мы будем сохранять информацию об каждом созданном объекте.

Код: Выделить всё

#define o<%1:%0> \
    db_objects[%0][%1]

const OBJECTS_LIMIT = 1000;

new IsLastObject;

enum DB_OBJECTS
{
    object_id,
    model_id,
    Float:f_x,
    Float:f_y,
    Float:f_z,
    Float:f_rx,
    Float:f_ry,
    Float:f_rz,
    world_id,
    interior_id
}
new db_objects[OBJECTS_LIMIT][DB_OBJECTS];


Это вставляем туда, где у вас все команды. Так как это ZCMD/DC_CMD, то в каллбэк OnPlayerCommandText это вставлять НЕ надо! Команда создает объект на сервере.

Код: Выделить всё

COMMAND:create(playerid, params[])
{
    if(sscanf(params, "i", params[0]))
        return SendClientMessage(playerid, -1, "Введите /create [model id]");
    new Float:x, Float:y, Float:z;
    GetPlayerPos(playerid, x, y, z);
    IsLastObject = CreateObject(params[0], x, y, z, 0, 0, 0);
    printf("Объект id %i", IsLastObject);
    EditObject(playerid, IsLastObject);
    return 1;
}


Если у вас нет каллбэка OnPlayerEditObject, то добавьте весь код, который ниже, а если у вас есть этот паблик, то добавляем код, который внутри каллбэка приведенного ниже. Он отвечает управление объектом.

Код: Выделить всё

public OnPlayerEditObject(playerid, playerobject, objectid, response, Float:fX, Float:fY, Float:fZ, Float:fRotX, Float:fRotY, Float:fRotZ)
{
    if(!playerobject)
    {
        if(!IsValidObject(objectid))
            return 1;
        MoveObject(objectid, fX, fY, fZ, 10.0, fRotX, fRotY, fRotZ);
    }
    if(response == EDIT_RESPONSE_FINAL)
    {
        o<f_x:IsLastObject> = fX;
        o<f_y:IsLastObject> = fY;
        o<f_z:IsLastObject> = fZ;
        o<f_rx:IsLastObject> = fRotX;
        o<f_ry:IsLastObject> = fRotY;
        o<f_rz:IsLastObject> = fRotZ;
        o<world_id:IsLastObject> = GetPlayerVirtualWorld(playerid);
        o<interior_id:IsLastObject> = GetPlayerInterior(playerid);
        o<model_id:IsLastObject> = GetObjectModel(IsLastObject);
        MySQL__CreateObjects(IsLastObject);
        CancelEdit(playerid);
        SendClientMessage(playerid, -1, "Объект установлен.");
        return 1;
    }
    if(response == EDIT_RESPONSE_CANCEL)
    {
        SendClientMessage(playerid, -1, "Установка объекта отменена.");
        DestroyObject(IsLastObject);
        IsLastObject -= 1;
        CancelEdit(playerid);
        return 1;
    }
    return 1;
}


Это добавим в конец мода, ну как обычно. Функция создают в таблице с объектами столбец с конктертным объектом.

Код: Выделить всё

stock MySQL__CreateObjects(i)
{
    new str[1054];
    format(str, sizeof(str), "INSERT INTO `objects` (`ID`, `Model`, `fX`, `fY`, `fZ`, `fRX`, `fRY`, `fRZ`, `World`, `Interior`) VALUES ('%i', '%i', '%f', '%f', '%f', '%f', '%f', '%f', '%i', '%i')",
    i, o<model_id:i>, o<f_x:i>, o<f_y:i>,     o<f_z:i>, o<f_rx:i>, o<f_ry:i>, o<f_rz:i>, o<world_id:i>, o<interior_id:i>);
    mysql_function_query(/* id подключения к бд */, str, false, "", "");
    return 1;
}


Это функцию тоже в конец мода. Функция загружает все объекты из базы данных и устанавливает их на сервере.

Код: Выделить всё

forward MySQL__LoadObjects();
public MySQL__LoadObjects()
{
    new rows, fields;
    cache_get_data(rows, fields);
    if(rows)
    {
        for(new i; i < rows; i++)
        {
            o<object_id:i> = cache_get_field_content_int(i, "ID", /* id подключения к бд */);
            o<model_id:i> = cache_get_field_content_int(i, "Model", /* id подключения к бд */);
            o<f_x:i> = cache_get_field_content_float(i, "fX", /* id подключения к бд */);
            o<f_y:i> = cache_get_field_content_float(i, "fY", /* id подключения к бд */);
            o<f_z:i> = cache_get_field_content_float(i, "fZ", /* id подключения к бд */);
            o<f_rx:i> = cache_get_field_content_float(i, "fRX", /* id подключения к бд */);
            o<f_ry:i> = cache_get_field_content_float(i, "fRY", /* id подключения к бд */);
            o<f_rz:i> = cache_get_field_content_float(i, "fRZ", /* id подключения к бд */);
            o<world_id:i> = cache_get_field_content_int(i, "World", /* id подключения к бд */);
            o<interior_id:i> = cache_get_field_content_int(i, "Interior", /* id подключения к бд */);
            o<object_id:i> = CreateDynamicObject(o<model_id:i>, o<f_x:i>, o<f_y:i>, o<f_z:i>, o<f_rx:i>, o<f_ry:i>, o<f_rz:i>, o<world_id:i>, o<interior_id:i>);
            o<object_id:i> = IsLastObject;
        }
    }
    return 1;
}


Ищем каллбэк OnGameModeInit и вставляем туда.

Код: Выделить всё

mysql_function_query(/* id подключения к бд */, "SELECT * FROM `objects`", true, "MySQL__LoadObjects", "");


Запрос на создание таблицы "objects" в базе данных.

Код: Выделить всё

CREATE TABLE IF NOT EXISTS `objects` (
  `ID` int(4) NOT NULL,
  `Model` int(5) NOT NULL,
  `fX` float NOT NULL,
  `fY` float NOT NULL,
  `fZ` float NOT NULL,
  `fRX` float NOT NULL,
  `fRY` float NOT NULL,
  `fRZ` float NOT NULL,
  `World` int(11) NOT NULL,
  `Interior` int(11) NOT NULL,
  PRIMARY KEY (`ID`)
)
 ENGINE=InnoDB DEFAULT CHARSET=utf8;


  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Уроки»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 1 гость