Гость stibs

Система гаражей для КРМП на mysql r-41

В теме 12 сообщений

Как понятно из названия, представлю к вашему вниманию систему гаражей на mySQL r-41-2. 

Команды все написаны на zcmd / dc_cmd + sscanf. 

Сразу говорю автор данной системы не я, в конце укажу авторство. Также, скоро сделаю в виде скрипте. 

Давайте начнем. 

Ко всем #define:

#define MAX_GARAGES 200//200 - максимальное количество гаражей на сервере. Не нужно писать 1000, если не собираетесь создавать даже половины. Лишний раз нагрузите систему.
#define PLAYERADMIN(%0) //Через пробел необходимо добавить Вашу проверку на администратора. Например, PlayerInfo[playerid][pAdministrator]
#define PLAYERMONEY(%0) //Через пробел необходимо добавить Вашу проверку на количество денег. Например, PlayerInfo[playerid][pMoney]
#define MAX_ADMIN_LEVEL 10//10 - максимальный уровень администратора. При необходимости меняйте на свой.

Ко всем переменным / енумам:

enum gInfo//массив с гаражами будет называться gInfo
{
        gID,//ID гаража на сервере.
        bool:gLoad,//Переменная, в которую будем хранить данные о загрузке гаража. 1 - загрузить на сервер, 0 - не загружать.
        gType,//Тип решетки в гараже. Это может быть как закрытый объект стены, так и объект решетки.
        Float:gX,//Координата пикапа гаража X.
        Float:gY,//Координата пикапа гараж Y.
        Float:gZ,//Координата пикапа гаража Z.
        Float:gdXO,//Координата решетки в открытом положении x.
        Float:gdXY,//Координата решетки в открытом положении Y.
        Float:gdXZ,//Координата решетки в открытом положении Z.
        Float:gdXC,//Координата решетки в закрытом положении X.
        Float:gdYC,//Координата решетки в закрытом положении Y.
        Float:gdZC,//Координата решетки в закрытом положении Z.
        gOwner[MAX_PLAYER_NAME],//Nick-name владельца гаража.
        gResident[MAX_PLAYER_NAME],//Nick-name совладельца гаража.
        gPrice,//Цена гаража.
        bool:gLock,//Состояние гаража (0 - открыт, 1 - закрыт).
        gPickup,//ID пикапа гаража будет записан в эту переменную. В базе данных не сохраняется.
        gObject,//ID объекта гаража (ворот) будет записан в эту переменную. В базе данных не сохраняется.
}
new GI[MAX_GARAGES][gInfo];//Расшифровывается как GarageInfo

Немного пояснение данного кода:

Спойлер

Немного хочется конкретизировать по поводу переменной gLoad. Дабы гаражи не удалялись "случайно" или "невольным образом" (глупая ситуация, но если взломают администратора и удалят все гаражи), можно будет вернуть их всего лишь заменив 0 на 1 в базе данных. А вообще, честно говоря, просто увидел это в одном моде и заинтересовался  

Что касается gResident. Это nick-name совладельца гаража. Поскольку я писал эту систему для своего мода, где предусматривался совладелец для автомобилей, то сделал и совладельца для гаража. Имена совладельца транспорта и совладельца гаража совпадают.

GI можно заменить на GarageInfo, чтобы Вам было понятнее что к чему.

Ну теперь давайте дальше. 

Добавим систему загрузки гаражей на сервер. Надеюсь, базу данных вы уже подключили в моде ;)

ВНИМАНИЕ! dbHandle - название переменной, которая отвечает за ID подключения к базе данных. Если у вас другая (глянуть можно в других запросах), то обязательно смените, иначе будут ошибки. 

В OnGameModeInit добавляем:

mysql_tquery(dbHandle, "SELECT * FROM `garages`", "LoadGarages", "");//Запрос на получение данных о гаражах из базы данных. Ответ будет в public LoadGarages.

Далее, создаем новый паблик для обработки запроса, так как сток для этого дела не подойдет. 

forward LoadGarages();
public LoadGarages()
{
        if(cache_num_row() == 0)
                return true;//Если гаражи не найдены на сервере, пропускаем оставшееся действие кода.
        new str[8*3+3];
        for(new idx = 0; idx < cache_num_rows(); idx++)
        {
                cache_get_value_name_int(idx, "id", GI[idx][gID]);//Загружаем ID гаража
                cache_get_value_name_int(idx, "load", GI[idx][gLoad]);//Получаем статус гаража: стоит ли его создавать на сервере или нет
                if(GI[idx][gLoad] == 0)
                        continue;//Если гараж не должен загружаться, пропускаем оставшееся действие кода
                cache_get_value_name_int(idx, "type", GI[idx][gType]);//загружаем тип решетки гаража
                cache_get_value_name(idx, "buydate", GI[idx][gDate], 20);//Загружаем дату покупки кем-либо гаража
                cache_get_value_name(idx, "owner", GI[idx][gOwner], MAX_PLAYER_NAME);//Загружаем имя владельца гаража на сервер
                cache_get_value_name(idx, "resident", GI[idx][gResident], MAX_PLAYER_NAME);//Загружаем имя совладельца гаража на сервер
                cache_get_value_name_int(idx, "lock", GI[idx][gLock]);//Загружаем состояние гаража: ворота открыты или закрыты
                cache_get_value_name(idx, "pos", str, 26);//Загружаем координаты пикапа гаража
                sscanf(str, "p<,>fff", GI[idx][gX], GI[idx][gY], GI[idx][gZ]);//При помощи sscanf извлекаем из строки str координаты X, Y, Z в отдельности и записываем в gX, gY, gZ
                cache_get_value_name(idx, "opos", str, 26);//Загружаем координаты решетки гаража в открытом положении
                sscanf(str, "p<,>fff", GI[idx][gdXO], GI[idx][gdYO], GI[idx][gdZO]);//При помощи sscanf извлекаем из строки str координаты X, Y, Z в отдельности и записываем в gdXO, gdYO, gdZO
                cache_get_value_name(idx, "cpos", str, 26);//Загружаем координаты решетки гаража в закрытом положении
                sscanf(str, "p<,>fff", GI[idx][gdXC], GI[idx][gdYC], GI[idx][gdZC]);//При помощи sscanf извлекаем из строки str координаты X, Y, Z в отдельности и записываем в gdXC, gdYC, gdZC
                switch(GI[idx][gLock])//0 - гараж открыт, 1 - закрыт
                {
                        case 0: GI[idx][gObject] = CreateObject(GI[idx][gType], GI[idx][gdXO], GI[idx][gdYO], GI[idx][gdZO],0,0,0);//Если гараж открыт, ставим координаты решетки в открытом положении
                        case 1: GI[idx][gObject] = CreateObject(GI[idx][gType], GI[idx][gdXC], GI[idx][gdYC], GI[idx][gdZC],0,0,0);//Если гараж закрыт, ставим координаты решетки в закрытом положении
                }
                GI[idx][gPickup] = CreateDynamicPickup(1239, 23, GI[idx][gX], GI[idx][gY], GI[idx][gZ], 0);//Создаем пикап гаража, 0 - показывается только в виртуальном мире 0
        }
        return true;
}

ВНИМАНИЕ! Для работы данного кода, вы уже смогли, наверное заметить, что используется sscanf2. Поэтому обязательно его скачайте. Я думаю скоро выложу его на этом портале.

После этого паблика добавляем функцию (сток):
 

stock GetGarageID(playerid)//Чтобы получить ID гаража достаточно ввести GetGarageID(playerid). Например, new i = GetGarageID(playerid). В i будет записан ID гаража.
{
        for(new garageid; garageid < MAX_GARAGES; garageid++)//Добавляем цикл, который будет перебирать все гаражи
        {
                if(!IsPlayerInRangeOfPoint(playerid, 2.0, GI[garageid][gX], GI[garageid][gY], GI[garageid][gZ]))//Проверяем, находится ли игрок рядом с пикапом (r = 2 метра)
                        continue;//Пропускаем, если игрок не находится рядом
                if(GI[garageid][gLoad] == 0)//Проверяем, загружен ли этот гараж на сервер
                        continue;//Пропускаем, если гараж не загружен на сервер
                return garageid;//возвращаем ID гаража, прошедшего через все условия
        }
        return -1;//Если ни один гараж не прошел через все условия, возвращаем -1. Диалоговое окно показываться не будет.
}

В OnPlayerKeyStateChange суем следующий код:

if(newkeys & KEY_WALK)//Если игрок нажимает клавишу ALT
{
        if(!IsPlayerInAnyVehicle(playerid) && GetGarageID(playerid) >= 0)//Если игрок не находится в автомобиле и возле него есть какой-либо гараж...
                return ShowPlayerDialogGarageInfo(playerid);//Показываем окно информации
}
if(newkeys & KEY_CROUCH)
{
        if(!IsPlayerInAnyVehicle(playerid) && GetPVarInt(playerid, "EditGaragePosition") == 1)
        {
                new garageid = GPI(playerid, "GarageID"), Float:x, Float:y, Float:z;
                GetPlayerPos(playerid, x, y, z);
                GI[garageid][gX] = x;
                GI[garageid][gY] = y;
                GI[garageid][gZ] = z;
                DestroyDynamicPickup(GI[garageid][gPickup]);
                GI[garageid][gPickup] = CreateDynamicPickup(1239, 23, GI[garageid][gX], GI[garageid][gY], GI[garageid][gZ], -1);//-1 показывается во всех виртуальных мирах
                DeletePVar(playerid, "EditGaragePosition");
                static const fmt_string[] = "UPDATE `garages` SET `pos` = '%s' WHERE `id` = '%d'";
                new string[sizeof(fmt_string)+(-2+26)+(-2+3)], str[26];
                format(str, sizeof(str), "%f,%f,%f", x, y, z);
                format(string, sizeof(string), fmt_string, str, garageid+1);
                mysql_tquery(dbHandle, string, "", "");
                return true;
        }
} 

Еще один сток добавляем:
 

stock ShowPlayerDialogGarageInfo(playerid, garageid)
{
        if(PLAYERADMIN == MAX_ADMIN_LEVEL)//Если игрок является администратором высокого уровня
        {
                new param1[8], param1[8], str[78], string[78*10];
                switch(GI[garageid][gLock])
                {
                        case 0: param1 = "открыты";
                        case 1: param1 = "закрыты";
                }
                switch(GI[garageid][gType])
                {
                        case 988: param2 = "решетка";
                        case 989: param2 = "стенка";
                }
                format(str, sizeof(str), "{FFFFFF}ID данного гаража {FF8C00}%d\n",GI[garageid][gID]), strcat(string,str);
                format(str, sizeof(str), "{FFFFFF}Владелец данного гаража: {FF8C00}%s\n",GI[garageid][gOwner]), strcat(string,str);
                format(str, sizeof(str), "{FFFFFF}Совладелец данного гаража: {FF8C00}%s\n", GI[garageid][gResident]), strcat(string,str);
                format(str, sizeof(str), "{FFFFFF}Стоимость данного гаража: {FF8C00}%d\n", GI[garageid][gPrice]), strcat(string,str);
                format(str, sizeof(str), "{FFFFFF}Тип решетки данного гаража: {FF8C00}%s\n", param2), strcat(string,str);
                format(str, sizeof(str), "{FFFFFF}Состояние ворот гаража сейчас: {FF8C00}%s\n", param1), strcat(string,str);
                format(str, sizeof(str), "{FFFFFF}Изменить положение решетки гаража\n"), strcat(string,str);
                format(str, sizeof(str), "{FFFFFF}Изменить положение пикапа гаража\n"), strcat(string,str);
                format(str, sizeof(str), "{FFFFFF}Удалить данный гараж"), strcat(string,str);
                ShowPlayerDialog(playerid, 161, DIALOG_STYLE_LIST, "{0080BB}Меню гаража", string, "Выбрать", "Закрыть");
                return true;
        }
        new sendername[MAX_PLAYER_NAME];
        GetPlayerName(playerid, sendername, sizeof(sendername));
        if(!strcmp(sendername, GI[garageid][gOwner], false))//Если игрок является владельцем гаража
        {
                new str[78], string[78*4], param[8];
                switch(GI[garageid][gLock])
                {
                        case 0: param = "открыты";
                        case 1: param = "закрыты";
                }
                format(str, sizeof(str), "{FFFFFF}Состояние ворот гаража сейчас: {FF8C00}%s\n", param), strcat(string,str);
                format(str, sizeof(str), "{FFFFFF}Совладелец данного гаража: {FF8C00}%s\n", GI[garageid][gResident]), strcat(string,str);
                format(str, sizeof(str), "{FFFFFF}Продать собственность в виде гаража"), strcat(string,str);
                format(str, sizeof(str), "{FFFFFF}Отдать гараж в другие руки по доверенности"), strcat(string,str);
                ShowPlayerDialog(playerid, 178, DIALOG_STYLE_LIST, "{0080BB}Меню гаража", string, "Выбрать", "Закрыть");
                return true;
        }
        else if(!strcmp(sendername, GI[garageid][gResident], false))//Если игрок является совладельцем гаража
        {
                new str[78], string[78*2], param[8];
                switch(GI[garageid][gLock])
                {
                        case 0: param = "открыты";
                        case 1: param = "закрыты";
                }
                 format(str, sizeof(str), "{FFFFFF}Состояние ворот гаража сейчас: {FF8C00}%s\n", param), strcat(string,str);
                format(str, sizeof(str), "{FFFFFF}Отказаться от должности совладельца"), strcat(string,str);
                ShowPlayerDialog(playerid, 250, DIALOG_STYLE_LIST, "{0080BB}Меню гаража", string, "Выбрать", "Закрыть");
                return true;
        }
        else if(!strcmp(GI[garageid][gOwner], "none", false))//Если гараж находится на продаже
        {
                static const fmt_string[] = "{FFFFFF}Пожалуйста, подтвердите, действительно ли Вы хотите приобрести данный гараж?\nСтоимость этого гаража составит %d. Деньги будут списаны с Вашего счета.";
                new string[sizeof(fmt_string)+(-2+9)];
                format(string, sizeof(string), fmt_string, GI[garageid][gPrice]);
                ShowPlayerDialog(playerid, 252, DIALOG_STYLE_MSGBOX, "{0080BB}Меню гаража", string, "Нет", "Да");
                return true;
        }
        else//Если гараж в чьем-то владении, но игрок с ним никак не связан (чужое имущество)
        {
                static const fmt_string[] = "{FFFFFF}Данный гараж является частной собственностью %s.";
                new string[sizeof(fmt_string)+(-2+MAX_PLAYER_NAME)];
                format(string, sizeof(string), fmt_string, GI[garageid][gOwner]);
                ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "{0080BB}Меню гаража", string, "Хорошо", "");
                return true;
        }
}

ВНИМАНИЕ! Так как у автора этого кода используется другой диалоговый процессор, меняйте шапку диалога на свою. Например:
DLG:41 заменить на case 41: или if(dialogid == 41). Какой-то из этих двух вариантов должен подойти. 

DLG:41(playerid, response, listitem, inputtext[])
{
        if(!response)
                return true;
        if(!strlen(inputtext))
                return ShowPlayerDialog(playerid, 41, DSI, "{0080BB}Создание гаража", "{FFFFFF}Пожалуйста, введите стоимость будущего гаража.", "Готово", "Назад");
        for(new i = strlen(inputtext); i != 0; --i)//Проверка на вводимые знаки (сделано так, чтобы не было ничего, кроме цифр)
        {
                switch(inputtext[i])
                {
                   case 'А'..'Я', 'а'..'я','A'..'Z', 'a'..'z':
                           return ShowPlayerDialog(playerid, 41, DSI, "{0080BB}Создание гаража", "{FFFFFF}Пожалуйста, введите стоимость будущего гаража.", "Готово", "Назад");
                }
        }
        new price = strval(inputtext);
        if(price < 0)
                return ShowPlayerDialog(playerid, 41, DSI, "{0080BB}Создание гаража", "{FFFFFF}Пожалуйста, введите стоимость будущего гаража.", "Готово", "Назад");
        SetPVarInt(playerid, "CreatePrice", price);
        ShowPlayerDialog(playerid, 42, DIALOG_STYLE_LIST, "{0080BB}Выберите тип двери гаража", "Решетка\nСтенка", "Готово", "Назад");
        return true;
}
DLG:42(playerid, response, listitem, inputtext[])
{
        if(!response)
                return ShowPlayerDialog(playerid, 41, DSI, "{0080BB}Создание гаража", "{FFFFFF}Пожалуйста, введите стоимость будущего гаража.", "Готово", "Назад");
        switch(listitem)
        {
                case 0: SetPVarInt(playerid, "CreateType", 988);//Решетка
                case 1: SetPVarInt(playerid, "CreateType", 989);//Стенка
        }
        ShowPlayerDialog(playerid, 43, DIALOG_STYLE_MSGBOX, "{0080BB}Создание гаража", "{FFFFFF}Пожалуйста, подтвердите свое желание создать гараж.", "Да", "Нет");
        return true;
}
DLG:43(playerid, response, listitem, inputtext[])
{
        if(!response)
        {
                DP(playerid, "CreateValuet");
                DP(playerid, "CreatePrice");
                DP(playerid, "CreateType");
                return true;
        }
        ShowPlayerDialog(playerid, 1, DIALOG_STYLE_MSGBOX, "{0080BB}Создание гаража", "{FFFFFF}Сейчас Вам предстоит поставить дверь гаража в открытом положении.", "Хорошо", "");
        SetPVarInt(playerid, "CreatingGarage", 1);
        new Float:pos[3];
        GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
        new object = CreateObject(GPI(playerid, "CreateType"), pos[0] + 1, pos[1] + 1, pos[2] + 1, 0.0, 0.0, 0.0);
        EditObject(playerid, object);
        return true;
}
DLG:161(playerid, response, listitem, inputtext[])
{
        if(!response)
                return true;
        switch(listitem)
        {
                case 0: return ShowPlayerDialogGarageInfo(playerid, GetGarageID(playerid));
                case 1://Владелец гаража
                {
                    static const fmt_string[] =  "{FFFFFF}В данный момент владельцем этого гаража является %s.\nПодтвердите, Вы действительно хотите его удалить или выбрать другого владельца?";
                    new string[sizeof(fmt_string)+(-2+MAX_PLAYER_NAME)];
                        format(string, sizeof(string), fmt_string, GI[GetGarageID(playerid)][gOwner]);
                        ShowPlayerDialog(playerid, 163, DIALOG_STYLE_MSGBOX, "{0080BB}Гараж", string, "Да", "Нет");
                }
                case 2://Совладелец гаража
                {
                    static const fmt_string[] = "{FFFFFF}В данный момент совладельцем этого гаража является %s.\nПодтвердите, Вы действительно хотите его удалить или выбрать другого совладельца?";
                    new string[sizeof(fmt_string)+(-2+MAX_PLAYER_NAME)];
                        format(string, sizeof(string), fmt_string, GI[GetGarageID(playerid)][gResident]);
                        ShowPlayerDialog(playerid, 166, DIALOG_STYLE_MSGBOX, "{0080BB}Гараж", string, "Да", "Нет");
                }
                case 3://Стоимость данного гаража
                {
                    static const fmt_string[] = "{FFFFFF}В данный момент стоимость гаража составляет %d рублей.\nВы действительно хотите изменить стоимость гаража по государственной цене?";
                    new string[sizeof(fmt_string)+(-2+9)];
                    format(string, sizeof(string), fmt_string, GI[GetGarageID(playerid)][gPrice]);
                        ShowPlayerDialog(playerid, 168, DIALOG_STYLE_MSGBOX, "{0080BB}Гараж", string, "Изменить", "Назад");
                }
                case 4: ShowPlayerDialog(playerid, 174, DIALOG_STYLE_MSGBOX, "{0080BB}Гараж", "{FFFFFF}Пожалуйста, подтвердите, действительно ли Вы хотите изменить тип ворот данного гаража?", "Да", "Нет");
                case 5://Изменить состояние ворот гаража
                {
                    new garageid = GetGarageID(playerid);
                        switch(GI[garageid][gLock])
                        {
                                case 0://Если гараж открыт
                                {
                                        MoveObject(GI[garageid][gObject], GI[garageid][gdXC], GI[garageid][gdYC], GI[garageid][gdZC], 1.00);//Закрываем гараж
                                        GI[garageid][gLock] = true;//Гараж открыт значит
                                }
                                case 1://Если гараж закрыт
                                {
                                        MoveObject(GI[garageid][gObject], GI[garageid][gdXO], GI[garageid][gdYO], GI[garageid][gdZO], 1.00);
                                        GI[garageid][gLock] = false;//Гараж открыт значит
                                }
                        }
                        static const fmt_string[] = "UPDATE `garages` SET `lock` = '%d' WHERE `id` = '%d' LIMIT 1";
                        new string[sizeof(fmt_string)+(-2+1)+(-2+3)];
                        format(string, sizeof(string), fmt_string, GI[garageid][gLock], garageid+1);
                        mysql_tquery(dbHandle, string, "", "");
                        ShowPlayerDialog(playerid, garageid);
                }
                case 6://Изменить положение решетки гаража
                {
                    ShowPlayerDialog(playerid, 1, DIALOG_STYLE_MSGBOX, "{0080BB}Гараж", "{FFFFFF}Сейчас Вам предстоит поставить дверцу гаража в открытом положении.", "Хорошо", "");
                        EditObject(playerid, GI[GetGarageID(playerid)][gObject]);
                        SetPVarInt(playerid, "EditGarageDoorsObject1", 1);
                }
                case 7: ShowPlayerDialog(playerid, 176, DIALOG_STYLE_MSGBOX, "{0080BB}Гараж", "{FFFFFF}Пожалуйста, подтвердите, Вы действительно хотите изменить позицию этого гаража?", "Да", "Нет");
                case 8: ShowPlayerDialog(playerid, 177, DIALOG_STYLE_MSGBOX, "{0080BB}Гараж", "{FFFFFF}Пожалуйста, подтвердите, действительно ли Вы хотите удалить данный гараж?", "Да", "Нет");
        }
        return true;
}
DLG:163(playerid, response, listitem, inputtext[])
{
    new garageid = GetGarageID(playerid);
        if(!response) return ShowPlayerDialogGarageInfo(playerid, garageid);
        if(strcmp(GI[garageid][gOwner], "none", false))//Если гараж во владении кого-то
        {
                strmid(GI[garageid][gOwner], "none", 0, 4, MAX_PLAYER_NAME);
                static const fmt_string[] = "UPDATE `garages` SET `owner` = 'none' WHERE `id` = '%d' LIMIT 1";
                new string[sizeof(fmt_string)+(-2+3)];
                format(string, sizeof(string), fmt_string, garageid+1);
                mysql_tquery(dbHandle, string, "", "");
                ShowPlayerDialogGarageInfo(playerid, garageid);
                return true;
        }
        ShowPlayerDialog(playerid, 164, DIALOG_STYLE_INPUT, "{0080BB}Гараж", "{FFFFFF}Пожалуйста, введите nick-name будущего владельца данного жилого помещения.", "Готово", "Назад");
        return true;
}
DLG:164(playerid, response, listitem, inputtext[])
{
        new garageid = GetGarageID(playerid);
        if(!response)
        {
            static const fmt_string[] = "{FFFFFF}В данный момент владельцем этого гаража является %s.\nПодтвердите, Вы действительно хотите его удалить или выбрать другого владельца?";
                new string[sizeof(fmt_string)+(-2+MAX_PLAYER_NAME)];
                format(string, sizeof(string), fmt_string, GI[garageid][gOwner]);
                ShowPlayerDialog(playerid, 163, DIALOG_STYLE_MSGBOX, "{0080BB}Гараж", string, "Да", "Нет");
                return true;
        }
        if(!strlen(inputtext))
                return ShowPlayerDialog(playerid, 164, DIALOG_STYLE_INPUT, "{0080BB}Гараж", "{FFFFFF}Пожалуйста, введите nick-name будущего владельца данного жилого помещения.", "Готово", "Назад");
        strmid(GI[garageid][gOwner], inputtext, 0, strlen(inputtext), MAX_PLAYER_NAME);
        static const fmt_string[] = "UPDATE `garages` SET `owner` = '%s' WHERE `id` = '%d' LIMIT 1";
        new string[sizeof(fmt_string)+(-2+MAX_PLAYER_NAME)+(-2+3)];
        format(string, sizeof(string), fmt_string, inputtext, garageid+1);
        mysql_tquery(dbHandle, string, "", "");
        ShowPlayerDialogGarageInfo(playerid, garageid);
        return true;
}
DLG:166(playerid, response, listitem, inputtext[])
{
        new garageid = GetGarageID(playerid);
        if(!response)
                return ShowPlayerDialogGarageInfo(playerid, garageid);
        if(strcmp(GI[garageid][gResident], "none", false))//Если дом находится в чьем-то владении
        {
                strmid(GI[garageid][gResident], "none", 0, 4, MAX_PLAYER_NAME);
                static const fmt_string[] = "UPDATE `garages` SET `resident` = 'none' WHERE `id` = '%d' LIMIT 1";
                new string[sizeof(fmt_string)+(-2+3)];
                format(string, sizeof(string), fmt_string, garageid+1);
                mysql_tquery(dbHandle, string, "", "");
                ShowPlayerDialogGarageInfo(playerid, garageid);
                return true;
        }
        ShowPlayerDialog(playerid, 167, DIALOG_STYLE_INPUT, "{0080BB}Гараж", "{FFFFFF}Пожалуйста, введите nick-name будущего совладельца данного жилого помещения.", "Готово", "Назад");
        return true;
}
DLG:167(playerid, response, listitem, inputtext[])
{
        if(!response)
        {
                new garageid = GetGarageID(playerid);
                static const fmt_string[] = "{FFFFFF}В данный момент совладельцем этого гаража является %s.\nПодтвердите, Вы действительно хотите его удалить или выбрать другого совладельца?";
                new string[sizeof(fmt_string)+(-2+MAX_PLAYER_NAME)];
                format(string, sizeof(string), fmt_string, GI[garageid][gResident]);
                ShowPlayerDialog(playerid, 166, DIALOG_STYLE_MSGBOX, "{0080BB}Гараж", string, "Да", "Нет");
                return true;
        }
        if(!strlen(inputtext))
                return ShowPlayerDialog(playerid, 167, DIALOG_STYLE_INPUT, "{0080BB}Гараж", "{FFFFFF}Пожалуйста, введите nick-name будущего совладельца данного жилого помещения.", "Готово", "Назад");
        new garageid = GetGarageID(playerid);
        strmid(GI[garageid][gResident], inputtext, 0, strlen(inputtext), MAX_PLAYER_NAME);
        static const fmt_string[] = "UPDATE `garages` SET `resident` = '%s' WHERE `id` = '%d' LIMIT 1";
        new string[sizeof(fmt_string)+(-2+MAX_PLAYER_NAME)+(-2+3)];
        format(string, sizeof(string), fmt_string, inputtext, garageid+1);
        mysql_tquery(dbHandle, string, "", "");
        ShowPlayerDialogGarageInfo(playerid, garageid);
        return true;
}
DLG:168(playerid, response, listitem, inputtext[])
{
        if(!response)
                return ShowPlayerDialogGarageInfo(playerid, GetGarageID(playerid));
        ShowPlayerDialog(playerid, 169, DIALOG_STYLE_INPUT, "{0080BB}Гараж", "{FFFFFF}Пожалуйста, введите будущую стоимость для данного гаража.", "Готово", "Назад");
        return true;
}
DLG:169(playerid, response, listitem, inputtext[])
{
        if(!response)
        {
            new garageid = GetGarageID(playerid);
            static const fmt_string[] = "{FFFFFF}В данный момент стоимость гаража составляет %d рублей.\nВы действительно хотите изменить стоимость дома по государственной цене?";
            new string[sizeof(fmt_string)+(-2+9)];
                format(string, sizeof(string), fmt_string, GI[garageid][gPrice]);
                ShowPlayerDialog(playerid, 168, DIALOG_STYLE_MSGBOX, "{0080BB}Гараж", string, "Изменить", "Назад");
                return true;
        }
        if(!strlen(inputtext))
                return ShowPlayerDialog(playerid, 169, DIALOG_STYLE_INPUT, "{0080BB}Гараж", "{FFFFFF}Пожалуйста, введите будущую стоимость для данного гаража.", "Готово", "Назад");
        for(new i = strlen(inputtext); i != 0; --i)//Проверка на вводимые знаки (сделано так, чтобы не было ничего, кроме цифр)
        {
                switch(inputtext[i])
                {
                        case 'А'..'Я', 'а'..'я','A'..'Z', 'a'..'z':
                                return ShowPlayerDialog(playerid, 169, DIALOG_STYLE_INPUT, "{0080BB}Гараж", "{FFFFFF}Пожалуйста, введите будущую стоимость для данного гаража.", "Готово", "Назад");
                        default: continue;
                }
        }
        new garageid = GetGarageID(playerid);
        GI[garageid][gPrice] = strval(inputtext);
        static const fmt_string[] = "UPDATE `garages` SET `price` = '%d' WHERE `id` = '%d' LIMIT 1";
        new string[sizeof(fmt_string)+(-2+9)+(-2+3)];
        format(string, sizeof(string), fmt_string, strval(inputtext), garageid+1);
        mysql_tquery(dbHandle, string, "", "");
        ShowPlayerDialogGarageInfo(playerid, garageid);
        return true;
}
DLG:174(playerid, response, listitem, inputtext[])
{
        if(!response)
                return ShowPlayerDialogGarageInfo(playerid, GetGarageID(playerid));
        ShowPlayerDialog(playerid, 175, DIALOG_STYLE_MSGBOX, "{0080BB}Гараж", "{FFFFFF}Пожалуйста, выберите тип решетки для данного гаража (введя ID объекта).\nПо умолчанию объекты с ID 988 - решетка, 989 - стенка.", "Готово", "Назад");
        return true;
}
DLG:175(playerid, response, listitem, inputtext[])
{
        if(!response)
                return ShowPlayerDialog(playerid, 174, DIALOG_STYLE_MSGBOX, "{0080BB}Гараж", "{FFFFFF}Пожалуйста, подтвердите, действительно ли Вы хотите изменить тип решетки данного гаража?", "Да", "Нет");
        if(!strlen(inputtext))
                return ShowPlayerDialog(playerid, 175, DIALOG_STYLE_MSGBOX, "{0080BB}Гараж", "{FFFFFF}Пожалуйста, выберите тип решетки для данного гаража (введя ID объекта).\nПо умолчанию объекты с ID 988 - решетка, 989 - стенка.", "Готово", "Назад");
        for(new i = strlen(inputtext); i != 0; --i)//Проверка на вводимые знаки (сделано так, чтобы не было ничего, кроме цифр)
        {
                switch(inputtext[i])
                {
                        case 'А'..'Я', 'а'..'я','A'..'Z', 'a'..'z':
                                return ShowPlayerDialog(playerid, 175, DIALOG_STYLE_MSGBOX, "{0080BB}Гараж", "{FFFFFF}Пожалуйста, выберите тип решетки для данного гаража (введя ID объекта).\nПо умолчанию объекты с ID 988 - решетка, 989 - стенка.", "Готово", "Назад");
                        default:
                                continue;
                }
        }
        new garageid = GetGarageID(playerid);
        GI[garageid][gType] = strval(inputtext);
        DestroyObject(GI[garageid][gObject]);
        GI[garageid][gObject] = CreateObject(GI[garageid][gType], GI[garageid][gdXC], GI[garageid][gdYC], GI[garageid][gdZC], 0,0,0);
        static const fmt_string[] = "UPDATE `garages` SET `type` = '%d' WHERE `id` = '%d' LIMIT 1";
        new string[sizeof(fmt_string)+(-2+5)+(-2+3)];
        format(string, sizeof(string), fmt_string, strval(inputtext), garageid+1);
        mysql_tquery(dbHandle, string, "", "");
        ShowPlayerDialogGarageInfo(playerid, garageid);
        return true;
}
DLG:176(playerid, response, listitem, inputtext[])
{
    new garageid = GetGarageID(playerid);
        if(!response)
                return ShowPlayerDialogGarageInfo(playerid, garageid);
        SetPVarInt(playerid, "EditGaragePosition", 1);
        SetPVarInt(playerid, "GarageID", garageid);
        ShowPlayerDialog(playerid, 1, DIALOG_STYLE_MSGBOX, "{0080BB}Гараж", "{FFFFFF}Отлично! Теперь Ваша задача заключается в том, чтобы встать на место будущего гаража.\nПодойдите к новому месту (где хотите видеть гараж) и нажмите клавишу C.", "Хорошо", "");
        return true;
}
DLG:177(playerid, response, listitem, inputtext[])
{
    new garageid = GetGarageID(playerid);
        if(!response)
                return ShowPlayerDialogGarageInfo(playerid, garageid);
        static const fmt_string[] = "UPDATE `garages` SET `load` = '-1' WHERE `garageid` = '%d' LIMIT 1";
        new string[sizeof(fmt_string)+(-2+3)];
        format(string, sizeof(string), fmt_string, garageid+1);
        mysql_tquery(dbHandle, string, "", "");
        DestroyObject(GI[garageid][gObject]);
        DestroyDynamicPickup(GI[garageid][gPickup]);
        return true;
}
DLG:178(playerid, response, listitem, inputtext[])
{
    new garageid = GetGarageID(playerid);
        if(!response)
                return true;
        switch(listitem)
        {
                case 0://Состояние ворот гаража
                {
                        switch(GI[garageid][gLock])
                        {
                                case 0://Если гараж открыт
                                {
                                        MoveObject(GI[garageid][gObject], GI[garageid][gdXC], GI[garageid][gdYC], GI[garageid][gdZC], 1.00);//Закрываем гараж
                                        GI[garageid][gLock] = true;//Гараж открыт значит
                                }
                                case 1://Если гараж закрыт
                                {
                                        MoveObject(GI[garageid][gObject], GI[garageid][gdXO], GI[garageid][gdYO], GI[garageid][gdZO], 1.00);
                                        GI[garageid][gLock] = false;//Гараж открыт значит
                                }
                        }
                        static const fmt_string[] = "UPDATE `garages` SET `lock` = '%d' WHERE `id` = '%d' LIMIT 1";
                        new string[sizeof(fmt_string)+(-2+1)+(-2+3)];
                        format(string, sizeof(string), fmt_string, GI[garageid][gLock], garageid+1);
                        mysql_tquery(dbHandle, string, "", "");
                        ShowPlayerDialogGarageInfo(playerid, garageid);
                }
                case 1://Совладелец данного гаража
                {
                    static const fmt_string[] = "{FFFFFF}Вы действительно желаете изменить совладельца Вашего гаража?\nВ настоящий момент им является %s.";
                    new string[sizeof(fmt_string)+(-2+MAX_PLAYER_NAME)];
                        format(string, sizeof(string), fmt_string, GI[garageid][gResident]);
                        ShowPlayerDialog(playerid, 179, DIALOG_STYLE_MSGBOX, "{0080BB}Гараж", string, "Да", "Нет");
                }
                case 2://Продать собственность в виде гаража
                {
                    static const fmt_string[] = "{FFFFFF}Вы действительно желаете продать данный гараж?\nЕго стоимость составит %d рублей по государственной цене.";
                    new string[sizeof(fmt_string)+(-2+9)];
                        format(string, sizeof(string), fmt_string, GI[garageid][gPrice]);
                        ShowPlayerDialog(playerid, 182, DIALOG_STYLE_MSGBOX, "{0080BB}Гараж", string, "Да", "Нет");
                }
                case 3: return true;//Отдать гараж в другие руки по доверенности
        }
        return true;
}
DLG:179(playerid, response, listitem, inputtext[])
{
    new garageid = GetGarageID(playerid);
        if(!response)
                return ShowPlayerDialogGarageInfo(playerid, garageid);
        if(!strcmp(GI[garageid][gResident], "none", false)) ShowPlayerDialog(playerid, 180, DIALOG_STYLE_INPUT, "{0080BB}Гараж", "{FFFFFF}Введите ID игрока, которого желаете назначить совладельцем Вашего гаража.", "Готово", "Назад");
        else if(strcmp(GI[garageid][gResident], "none", false))//Если есть у гаража совладелец
        {
                strmid(GI[garageid][gResident], "none", 0, 4, MAX_PLAYER_NAME);
                static const fmt_string[] = "UPDATE `garages` SET `resident` = 'none' WHERE `id` = '%d' LIMIT 1";
                new string[sizeof(fmt_string)+(-2+3)];
                format(string, sizeof(string), fmt_string, garageid+1);
                mysql_tquery(dbHandle, string, "", "");
                ShowPlayerDialogGarageInfo(playerid, garageid);
        }
        return true;
}
DLG:180(playerid, response, listitem, inputtext[])
{
        if(!response)
        {
            static const fmt_string[] = "{FFFFFF}Вы действительно желаете изменить совладельца Вашего гаража?\nВ настоящий момент им является %s.";
            new string[sizeof(fmt_string)+(-2+MAX_PLAYER_NAME)];
                format(string, sizeof(string), fmt_string, GI[GetGarageID(playerid)][gResident]);
                ShowPlayerDialog(playerid, 179, DIALOG_STYLE_MSGBOX, "{0080BB}Гараж", string, "Да", "Нет");
                return true;
        }
        if(!strlen(inputtext))
                return ShowPlayerDialog(playerid, 180, DIALOG_STYLE_INPUT, "{0080BB}Гараж", "{FFFFFF}Введите ID игрока, которого желаете назначить совладельцем Вашего гаража.", "Готово", "Назад");
        for(new i = strlen(inputtext); i != 0; --i)//Проверка на вводимые знаки (сделано так, чтобы не было ничего, кроме цифр)
        {
                switch(inputtext[i])
                {
                        case 'А'..'Я', 'а'..'я','A'..'Z', 'a'..'z':
                                return ShowPlayerDialog(playerid, 180, DIALOG_STYLE_INPUT, "{0080BB}Гараж", "{FFFFFF}Введите ID игрока, которого желаете назначить совладельцем Вашего гаража.", "Готово", "Назад");
                        default: continue;
                }
        }
        if(!IsPlayerConnected(playerid))
                return ShowPlayerDialog(playerid, 180, DIALOG_STYLE_INPUT, "{0080BB}Гараж", "{FFFFFF}Введите ID игрока, которого желаете назначить совладельцем Вашего гаража.", "Готово", "Назад");
        SetPVarInt(playerid, "GarageSovladelecPlayerID", strval(inputtext));
        static const fmt_string[] = "{FFFFFF}Пожалуйста, подтвердите, действительно ли Вы желаете назначить %s совладельцем Вашего гаража?";
        new string[sizeof(fmt_string)+(-2+MAX_PLAYER_NAME)], sendername[MAX_PLAYER_NAME];
        GetPlayerName(strval(inputtext), sendername, sizeof(sendername));
        format(string, sizeof(string), fmt_string, sendername);
        ShowPlayerDialog(playerid, 181, DIALOG_STYLE_MSGBOX, "{0080BB}Гараж", string, "Да", "Нет");
        return true;
}
DLG:181(playerid, response, listitem, inputtext[])
{
    new garageid = GetGarageID(playerid);
        if(!response)
                return ShowPlayerDialogGarageInfo(playerid, garageid);
        new giveplayerid = GetPVarInt(playerid, "GarageCovladelecPlayerID"), sendername[MAX_PLAYER_NAME], sendername2[MAX_PLAYER_NAME];
        GetPlayerName(giveplayerid, sendername, sizeof(sendername));
        GetPlayerName(playerid, sendername2, sizeof(sendername2));
        strmid(GI[garageid][gResident], sendername, 0, MAX_PLAYER_NAME, MAX_PLAYER_NAME);
        static const fmt_str[] = "UPDATE `garages` SET `resident` = '%s' WHERE `id` = '%d' LIMIT 1";
        new str[sizeof(fmt_str)+(-2+MAX_PLAYER_NAME)+(-2+3)];
        format(str, sizeof(str), fmt_str, GI[garageid][gResident], garageid+1);
        mysql_tquery(dbHandle, str, "", "");
        SetPVarInt(giveplayerid, "SetMarkerSovladelecGarage", 1);
        SetPlayerCheckpoint(playerid, GI[garageid][gX], GI[garageid][gY], GI[garageid][gZ], 2.0);
        static const fmt_string[] = "{FFFFFF}%s Вам полномочия совладельца своего гаража.\nГараж отмечен маркером на Вашем радаре.";
        new string[sizeof(fmt_string)+(-2+MAX_PLAYER_NAME)];
        format(string, sizeof(string), fmt_string, sendername2);
        ShowPlayerDialog(giveplayerid, 0, DIALOG_STYLE_MSGBOX, "{0080BB}Получение прав совладельца", string, "Хорошо", "");
        format(string, sizeof(string), "{FFFFFF}Вы предоставили %s полномочия совладельца своего гаража.", sendername);
        ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "{0080BB}Выдача прав совладельца", string, "Хорошо", "");
        return true;
}
DLG:250(playerid, response, listitem, inputtext[])
{
        if(!response)
                return true;
        new garageid = GetGarageID(playerid);
        switch(listitem)
        {
                case 0://Открыть или закрыть ворота
                {
                        switch(GI[garageid][gLock])
                        {
                                case 0://Если гараж открыт
                                {
                                        MoveObject(GI[garageid][gObject], GI[garageid][gdXC], GI[garageid][gdYC], GI[garageid][gdZC], 1.00);//Закрываем гараж
                                        GI[garageid][gLock] = true;//Гараж открыт значит
                                }
                                case 1://Если гараж закрыт
                                {
                                        MoveObject(GI[garageid][gObject], GI[garageid][gdXO], GI[garageid][gdYO], GI[garageid][gdZO], 1.00);//Открываем гараж
                                        GI[garageid][gLock] = false;//Гараж открыт значит
                                }
                        }
                        ShowPlayerDialogGarageInfo(playerid, garageid);
                }
                case 1: ShowPlayerDialog(playerid, 251, DIALOG_STYLE_MSGBOX, "{0080BB}Меню гаража", "{FFFFFF}Нажмите кнопку «Да», если хотите отказаться от должности совладельца.\nЕсли же Вы желаете закрыть данное окно, нажмите кнопку «Нет».", "Нет", "Да");
        }
        return true;
}
DLG:251(playerid, response, listitem, inputtext[])
{
    new garageid = GetGarageID(playerid);
        if(response)
                return ShowPlayerDialogGarageInfo(playerid, garageid);
        strmid(GI[garageid][gResident], "none", 0, 4, MAX_PLAYER_NAME);
        static const fmt_string[] = "UPDATE `garages` SET `resident` = 'none' WHERE `id` = '%d' LIMIT 1";
        new string[sizeof(fmt_string)+(-2+3)];
        format(string, sizeof(string), fmt_string, garageid+1);
        ShowPlayerDialogGarageInfo(playerid, garageid);
        return true;
}
DLG:252(playerid, response, listitem, inputtext[])
{
        if(response)
                return true;
        new garageid = GetGarageID(playerid);
        if(PLAYERMONEY(playerid) < GI[garageid][gPrice])
                return ShowPlayerDialogNoMoney(playerid);
        new amount = 0, sendername[MAX_PLAYER_NAME];
        GetPlayerName(playerid, sendername, sizeof(sendername));
        for(new idx = 1; idx <= MAX_GARAGES; idx++)
        {
                if(strcmp(GI[idx][gOwner], sendername, false))
                        continue;
                amount++;
        }
        if(PLAYERADMIN(playerid) < MAX_ADMIN_LEVEL && amount >= 2)
                return SendClientMessage(playerid, 0xFF0000FF, !"К сожалению, Вы не можете больше приобрести себе гараж, поскольку у Вас их уже много.");
        strmid(GI[garageid][gOwner], sendername, 0, MAX_PLAYER_NAME, MAX_PLAYER_NAME);
        static const fmt_string[] = "UPDATE `garages` SET `owner` = '%s' WHERE `id` = '%d' LIMIT 1";
        new string[sizeof(fmt_string)+(-2+MAX_PLAYER_NAME)+(-2+3)];
        format(string, sizeof(string), fmt_string, sendername, garageid+1);
        mysql_tquery(dbHandle, string, "", "");
        ShowPlayerDialogGarageInfo(playerid, garageid);
        return true;
}

Добавляем паблик OnPlayerEditObject:

public OnPlayerEditObject(playerid, playerobject, objectid, response, Float:fX, Float:fY, Float:fZ, Float:fRotX, Float:fRotY, Float:fRotZ)
{
        if(response == 1)
        {
                if(GPI(playerid, "CreateValuet") > 0 && GPI(playerid, "CreatingGarage") == 1)//Постановка дверцы гаража в открытом положении
                {
                        EditObject(playerid, objectid);
                        ShowPlayerDialog(playerid, 1, DIALOG_STYLE_MSGBOX, "{0080BB}Создание гаража", "{FFFFFF}Сейчас Вам предстоит поставить дверь гаража в закрытом положении.", "Хорошо", "");
                        SetPVarInt(playerid, "CreatingGarage", 2);
                        SetPVarFloat(playerid, "fx", fX);
                        SetPVarFloat(playerid, "fy", fY);
                        SetPVarFloat(playerid, "fz", fZ);
                        return true;
                }
                else if(GPI(playerid, "CreateValuet") > 0 && GPI(playerid, "CreatingGarage") == 2)
                {
                        new AllGarages;
                        for(new i; i < MAX_GARAGES; i++)//Этим циклом получим ID максимального гаража на сервере
                        {
                                if(GI[i][gID] != 0) continue;
                                if(GI[i][gID] == 0 && GI[i][gLoad] == 0) continue;
                                AllGarages = i;
                                break;
                        }
                        GI[AllGarages][gID] = AllGarages;
                        GetPlayerPos(playerid, GI[AllGarages][gX], GI[AllGarages][gY], GI[AllGarages][gZ]);
                        GI[AllGarages][gdXO] = GPF(playerid, "fx");//В открытом положении
                        GI[AllGarages][gdYO] = GPF(playerid, "fy");//В открытом положении
                        GI[AllGarages][gdZO] = GPF(playerid, "fz");//В открытом положении
                        GI[AllGarages][gdXC] = fX;//В закрытом положении
                        GI[AllGarages][gdYC] = fY;//В закрытом положении
                        GI[AllGarages][gdZC] = fZ;//В закрытом положении
                        GI[AllGarages][gPrice] = GPI(playerid, "CreatePrice");
                        GI[AllGarages][gType] = GPI(playerid, "CreateType");
                        GI[AllGarages][gLock] = true;
                        format(GI[AllGarages][gOwner], MAX_PLAYER_NAME, "none");
                        format(GI[AllGarages][gResident], MAX_PLAYER_NAME, "none");
                        new str1[26], str2[26], str3[26];
                        format(str1, sizeof(str1), "%f,%f,%f", GI[AllGarages][gX], GI[AllGarages][gY], GI[AllGarages][gZ]);
                        format(str2, sizeof(str2), "%f,%f,%f", GI[AllGarages][gdXO], GI[AllGarages][gdYO], GI[AllGarages][gdZO]);
                        format(str3, sizeof(str3), "%f,%f,%f", GI[AllGarages][gdXC], GI[AllGarages][gdYC], GI[AllGarages][gdZC]);
                        static const fmt_string[] = "INSERT INTO `garages` (`garageid`, `type`, `pos`, `opos`, `cpos`, `price`) VALUES ('%d', '%d', '%s', '%s', '%s', '%s')";
                        new string[sizeof(fmt_string)+(-2+3)+(-2+5)+(-2+8)+(-2+8)+(-2+8)+(-2+9)];
                        format(string, sizeof(string), fmt_string, AllGarages, GI[AllGarages][gType], str1, str2, str3, GI[AllGarages][gPrice]);
                        mysql_tquery(dbHandle, string, "", "");
                        DeletePVar(playerid, "CreatingGarage");
                        DeletePVar(playerid, "CreateValuet");
                        DeletePVar(playerid, "CreatePrice");
                        DeletePVar(playerid, "CreateType");
                        DeletePVar(playerid, "fx");
                        DeletePVar(playerid, "fy");
                        DeletePVar(playerid, "fz");
                        DestroyObject(objectid);
                        CancelEdit(playerid);
                        for(new garageid; garageid < MAX_GARAGES; garageid++)
                        {
                                if(GI[garageid][gID] == 0 && GI[garageid][gLoad] == 1) continue;
                                if(GI[garageid][gLoad] == 0) continue;
                                DestroyObject(GI[garageid][gObject]);
                                DestroyDynamicPickup(GI[garageid][gPickup]);
                        }
                        mysql_tquery(dbHandle, "SELECT * FROM `garages`", "LoadGarages", "");//Загрузка гаражей на сервер
                        return true;
                }
                else if(GPI(playerid, "EditGarageDoorsObject1") == 1)
                {
                        EditObject(playerid, objectid);
                        ShowPlayerDialog(playerid, 1, DIALOG_STYLE_MSGBOX, "{0080BB}Гараж", "{FFFFFF}Сейчас Вам предстоит поставить дверь гаража в закрытом положении.", "Хорошо", "");
                        SetPVarInt(playerid, "EditGarageDoorsObject1", 2);
                        SetPVarFloat(playerid, "EditGarageDoorsObjectX1", fX);
                        SetPVarFloat(playerid, "EditGarageDoorsObjectY1", fY);
                        SetPVarFloat(playerid, "EditGarageDoorsObjectZ1", fZ);
                        return true;
                }
                else if(GPI(playerid, "EditGarageDoorsObject1") == 2)
                {
                        new garageid = GetGarageID(playerid);
                        GI[garageid][gdXO] = GPF(playerid, "EditGarageDoorsObjectX1");//В открытом положении
                        GI[garageid][gdYO] = GPF(playerid, "EditGarageDoorsObjectY1");//В открытом положении
                        GI[garageid][gdZO] = GPF(playerid, "EditGarageDoorsObjectZ1");//В открытом положении
                        GI[garageid][gdXC] = fX;//В закрытом положении
                        GI[garageid][gdYC] = fY;//В закрытом положении
                        GI[garageid][gdZC] = fZ;//В закрытом положении
                        DestroyObject(objectid);
                        CancelEdit(playerid);
                        new str1[26], str2[26];
                        format(str1, sizeof(str1), "%f,%f,%f", GI[garageid][gdXO], GI[garageid][gdYO], GI[garageid][gdZO]);
                        format(str2, sizeof(str2), "%f,%f,%f", GI[garageid][gdXC], GI[garageid][gdYC], GI[garageid][gdZC]);
                        static const fmt_string[] = "UPDATE `garages` SET `opos` = '%s', `cpos` = '%s' WHERE `garageid` = '%d' LIMIT 1";
                        new string[sizeof(fmt_string)+(-2+26)+(-2+26)+(-2+3)];
                        format(string, sizeof(string), fmt_string, str1, str2, garageid+1);
                        mysql_tquery(dbHandle, string, "", "");
                        for(new garageidx; garageidx <= AllGarages; garageidx++)
                        {
                                if(GI[garageidx][gID] == 0 && GI[garageidx][gLoad] == 1) continue;
                                if(GI[garageidx][gLoad] == 0) continue;
                                DestroyObject(GI[garageidx][gObject]);
                                DestroyDynamicPickup(GI[garageidx][gPickup]);
                        }
                        DeletePVar(playerid, "EditGarageDoorsObject1");
                        DeletePVar(playerid, "EditGarageDoorsObjectX1");
                        DeletePVar(playerid, "EditGarageDoorsObjectY1");
                        DeletePVar(playerid, "EditGarageDoorsObjectZ1");
                        DeletePVar(playerid, "EditGarageDoorsObjectXR1");
                        DeletePVar(playerid, "EditGarageDoorsObjectYR1");
                        DeletePVar(playerid, "EditGarageDoorsObjectZR1");
                        mysql_tquery(dbHandle, "SELECT * FROM `garages`", "LoadGarages", "");//Загружаем гаражи на сервер заново
                        return true;
                }
        }
        return true;
}

 

Добавить ко всем командам:
 

CMD:addgarage(playerid)
{
        ShowPlayerDialog(playerid, 41, DIALOG_STYLE_INPUT, "{0080BB}Создание гаража", "{FFFFFF}Пожалуйста, введите стоимость будущего гаража.", "Готово", "Назад");
        return true;
}

Ну вот и все. 

Автор всего этого кода: Elrmrnt-Kritik. 

Возможно, потом я сделаю в виде скрипта эту системку, если будут желающие ;)

НУ а если возникнут какие-то проблемы, пишите в тему. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня компилятор не компилирует после добавления этих строк

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@Коля Макаренко не добавляйте сразу все. Добавьте сначало один код, затем второй, и смотрите, после какого идет вылет. Скорее всего вы что-то не туда вставляете. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@DEST то есть нужно каждый код по отдельности добавить,скомпилировать и так каждый или как?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@Коля Макаренко примерно так. Можете сразу два вставить и смотреть после чего вылетает компилятор. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@DEST ну я в принципе знаю из за чего вылетает,но могу и ошибаться,сейчас буду проверять

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

dbHandle - название переменной, которая отвечает за ID подключения к базе данных. А Где именно посмотреть ??? напиши пример)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@veter161rus в Ongamemode MySQL_Connect если нету ищи может в stock или ещё где-то

Отредактировано пользователем MuhammadPawn

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

public OnGameModeInit()
{
    AddPlayerClass(0, -109.8683, 982.2275, 12.1494, 179.6887, 0, 0, 0, 0, 0, 0);
    SetNameTagDrawDistance(15.0);
    NOWONLINE = 0;
    //printf("OnGameModeInit() STK %d", heap);
    SetGameModeText("LOADING...");
    mysql_debug(MySQL_DEBUG);
    new bind[64];
    SendRconCommand("password "MODE_PASS"");
    SendRconCommand("weburl "MODE_URL"");
    SendRconCommand("rcon_password "MODE_RCON"");
    GetServerVarAsString("bind", bind, sizeof(bind));
    mysql_connect(SQL_HOST, SQL_USER, SQL_DB, SQL_PASS);
    //mysql_connect(SQL_HOST, SQL_USER, SQL_DB, SQL_PASS);
    if(mysql_ping() == 1) print("MySQL: Подключение к базе данных установлено."),baza = 0;
    else print("MySQL: Подключение не удалось, проверьте настройки."),baza = 1;
     mysql_set_charset("cp1251");
    mysql_query("SET NAMES 'cp1251'");
    mysql_query("SET CHARACTER SET 'cp1251'");
    mysql_query(сюда надо добавить "SELECT * FROM `garages`", "LoadGarages", "");//?????? ?? ????????? ?????? ? ??????? ?? ???? ??????. ????? ????? ? public LoadGarages.
    arm[0] = CreatePickup(1318,23,1899.3831, -1910.1772, 40.2798); // туда
    arm[1] = CreatePickup(1318,23,1893.9913, -1910.3335, 40.2798); // обратно
    car1 = TextDrawCreate(452.248901, 361.416625, "usebox");
    TextDrawLetterSize(car1, 0.000000, 0.785187);
    TextDrawTextSize(car1, 178.849197, 0.000000);
    TextDrawAlignment(car1, 1);
    TextDrawColor(car1, 0);
    TextDrawUseBox(car1, true);
    TextDrawBoxColor(car1, 102);
    TextDrawSetShadow(car1, 0);
    TextDrawSetOutline(car1, 0);
    TextDrawFont(car1, 0);
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в стоках нету

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно диалоги (DLG) Заменить на case?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@Алмас можно, тогда нужно убрать то, что стоит рядом с ними в скобках. и привести к такому виду:

case номер: 

ну и добавлять в OnDialogResponse.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!


Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.


Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу