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

12 posts in this topic

Guest stibs
Новичок

Как понятно из названия, представлю к вашему вниманию систему гаражей на 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. 

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

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

Share this post


Link to post
Share on other sites
Коля Макаренко
Новичок

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

Share this post


Link to post
Share on other sites
DEST
Maintainer

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

Share this post


Link to post
Share on other sites
Коля Макаренко
Новичок

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

 

Share this post


Link to post
Share on other sites
Коля Макаренко
Новичок

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

Share this post


Link to post
Share on other sites
veter161rus
Новичок

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

Share this post


Link to post
Share on other sites
MuhammadPawn
Великий Гуру

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

Edited by MuhammadPawn

Share this post


Link to post
Share on other sites
veter161rus
Новичок

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);
 

Share this post


Link to post
Share on other sites
DEST
Maintainer

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

case номер: 

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.