Guest stibs Новичок Новичок Posted July 25, 2017 · Report post Как понятно из названия, представлю к вашему вниманию систему гаражей на 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. Возможно, потом я сделаю в виде скрипта эту системку, если будут желающие НУ а если возникнут какие-то проблемы, пишите в тему. 0 Share this post Link to post Share on other sites
Коля Макаренко Новичок 0 Новичок Posted November 2, 2017 · Report post У меня компилятор не компилирует после добавления этих строк 0 Share this post Link to post Share on other sites
DEST Maintainer 1,034 Maintainer Posted November 3, 2017 · Report post @Коля Макаренко не добавляйте сразу все. Добавьте сначало один код, затем второй, и смотрите, после какого идет вылет. Скорее всего вы что-то не туда вставляете. 0 Share this post Link to post Share on other sites
Коля Макаренко Новичок 0 Новичок Posted November 5, 2017 · Report post @DEST то есть нужно каждый код по отдельности добавить,скомпилировать и так каждый или как? 0 Share this post Link to post Share on other sites
DEST Maintainer 1,034 Maintainer Posted November 5, 2017 · Report post @Коля Макаренко примерно так. Можете сразу два вставить и смотреть после чего вылетает компилятор. 0 Share this post Link to post Share on other sites
Коля Макаренко Новичок 0 Новичок Posted November 5, 2017 · Report post @DEST ну я в принципе знаю из за чего вылетает,но могу и ошибаться,сейчас буду проверять 0 Share this post Link to post Share on other sites
veter161rus Новичок 0 Новичок Posted December 22, 2017 · Report post dbHandle - название переменной, которая отвечает за ID подключения к базе данных. А Где именно посмотреть ??? напиши пример) 0 Share this post Link to post Share on other sites
MuhammadPawn Великий Гуру 248 Великий Гуру Posted December 22, 2017 (edited) · Report post @veter161rus в Ongamemode MySQL_Connect если нету ищи может в stock или ещё где-то Edited December 22, 2017 by MuhammadPawn 0 Share this post Link to post Share on other sites
veter161rus Новичок 0 Новичок Posted December 22, 2017 · Report post 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); 0 Share this post Link to post Share on other sites
veter161rus Новичок 0 Новичок Posted December 22, 2017 · Report post в стоках нету 0 Share this post Link to post Share on other sites
Алмас Новичок 0 Новичок Posted January 25, 2018 · Report post Можно диалоги (DLG) Заменить на case? 0 Share this post Link to post Share on other sites
DEST Maintainer 1,034 Maintainer Posted January 25, 2018 · Report post @Алмас можно, тогда нужно убрать то, что стоит рядом с ними в скобках. и привести к такому виду: case номер: ну и добавлять в OnDialogResponse. 1 Share this post Link to post Share on other sites