//##############################################################################
//### Система гаражей by Storn ###
//##############################################################################
#include <a_samp>
#include <a_mysql>
#include <sscanf2>
#include <zcmd>
#define MYSQL_HOST "host.gta24host.ru"//Хост базы данных
#define MYSQL_USER "user28306"//Пользователь MYSQL
#define MYSQL_PASS "Lazarev1985"//Пароль MYSQL
#define MYSQL_DB "user28306"//Название базы данных
#define TABLE_GARAGE "garage"//Название таблицы с гаражами
#define MAX_GARAGE 200//Максимальное количество гаражей на сервере (можно увеличить/уменьшить)
#define D_GAR 2016//ID диалога гаражей
#define COORD1 2346.0945,-234.7822,-32.5000//Координата по умолчанию (место где игрок появится при входе в гараж)
new ALLGARAGE = 0;
new Query[2000];
new str[250];
enum gInfo
{
gID,
gOwner[24],
gPrice,
gInter,
gVirtual,
Float:gX1,
Float:gY1,
Float:gZ1,
Float:gX2,
Float:gY2,
Float:gZ2,
Float:gR2,
Float:gX3,
Float:gY3,
Float:gZ3,
Float:gR3,
Float:gX4,
Float:gY4,
Float:gZ4,
gLock,
gUL,
Text3D:gText,
gPickup
}
new Garage[MAX_GARAGE][gInfo];
{
ConnectMySQL(), LoadGarage();
CreateObject(5248,2346.1000977,-230.0000000,-33.7999992,0.0000000,0.0000000,0.0000000);//Гараж CreateObject(3508,2347.0000000,-230.5000000,-33.5000000,0.0000000,0.0000000,58.0000000);//Дно гаража return true;
}
{
DisconnectMySQL();
return true;
}
{
switch(dialogid)
{
case D_GAR:
{
if(!response
) return DeletePVar(playerid
, "G_ID"); if(!strcmp(Garage
[id
][gOwner
], "None", true)) //если продается {//Купить гараж
new nick[24];
if(GetPlayerGarage
(playerid
) != 0) return SendClientMessage(playerid
, -1, "У Вас уже есть гараж!"); strmid(Garage
[id
][gOwner
], nick
, 0, strlen(nick
), 24);//Записываем ник игрока
SetGarageStr(id, "Owner", Garage[id][gOwner]);
format(str
, 144, "Вы успешно купили гараж номер %d за %d рублей. Используйте /garagemenu для управления гаражом!После рестарта пикап пропадет:Жмите Alt и продолжайте!", id
, Garage
[id
][gPrice
]); UpdateGarage(id);
}
else//Если куплен
{//Войти в гараж
if(Garage
[id
][gUL
] > 0) PlayAudioStreamForPlayer(playerid
, "http://www.zaycev.fm:9001/rnb/ZaycevFM(128)", 0.0, 0.0, 0.0, 50.0, 0); }
return true;
}
case D_GAR+1://1. Заехать / Выехать\n2. Просмотр информации о гараже\n3. Закрыть / открыть гараж\n4. Продажа гаража государству\n5. Продажа гаража игроку\n6. Покупка улучшений для гаража
{
if(!response) return false;
if(GetPlayerGarage
(playerid
) == 0) return SendClientMessage(playerid
, -1, "У Вас нет гаража."); switch(listitem)
{
case 0:
{
{
Garage[i][gX2] = 2346;
Garage[i][gY2] = -230.5;
Garage[i][gZ2] = -32.4;
Garage[i][gR2] = 180;
if(Garage
[i
][gUL
] > 0) PlayAudioStreamForPlayer(playerid
, "http://www.zaycev.fm:9001/rnb/ZaycevFM(128)", 0.0, 0.0, 0.0, 50.0, 0); }
else if(IsPlayerInRangeOfPoint(playerid
, 10.0, Garage
[i
][gX2
], Garage
[i
][gY2
], Garage
[i
][gZ2
]))//Выезжаем из гаража {
}
}
case 1:
{
if(!response) return false;
format(str
, sizeof(str
), "{ffffff}Номер гаража: %d\n{ffffff}Стоимость гаража %d\n{ffffff}Уровень улучшений %d", i
, Garage
[i
][gPrice
], Garage
[i
][gUL
]); ShowPlayerDialog(playerid
, D_GAR
+2, DIALOG_STYLE_MSGBOX, "Информация о гараже", str
, "Назад", ""); return true;
}
case 2:
{
if(!response) return false;
{
if(Garage
[i
][gLock
] == 0) return SendClientMessage(playerid
, -1, "Вы закрыли гараж!"), SetGarageInter
(i
, "Lock", 1), Garage
[i
][gLock
] = 1; else SendClientMessage(playerid
, -1, "Вы открыли гараж!"), SetGarageInter
(i
, "Lock", 0), Garage
[i
][gLock
] = 0; }
return true;
}
case 3: format(str
, sizeof(str
), "{FFFFFF}Вы хотите продать гараж государству за %d рублей?", Garage
[i
][gPrice
]/2), ShowPlayerDialog(playerid
, D_GAR
+3, DIALOG_STYLE_MSGBOX, "Вопрос", str
, "Да", "Нет"); case 4: ShowPlayerDialog(playerid
, D_GAR
+4, DIALOG_STYLE_INPUT, "Внимание", "Введите через запятую ID игрока и цену.\n\nПример: 18, 90000", "Далее", "Отмена"); case 5:
{
if(Garage
[i
][gUL
] == 0) return ShowPlayerDialog(playerid
, D_GAR
+5, DIALOG_STYLE_LIST, "Улучшения для гаража", "1. Магнитофон [1000 руб.]\n2. Набор инструментов [10000 руб.]\n3. Перекраска [15000 руб.]", "Купить", "Отмена"); else if(Garage
[i
][gUL
] == 1) return ShowPlayerDialog(playerid
, D_GAR
+5, DIALOG_STYLE_LIST, "Улучшения для гаража", "1. Магнитофон [КУПЛЕНО]\n2. Набор инструментов [10000 руб.]\n3. Перекраска [15000 руб.]", "Купить", "Отмена"); else if(Garage
[i
][gUL
] == 2) return ShowPlayerDialog(playerid
, D_GAR
+5, DIALOG_STYLE_LIST, "Улучшения для гаража", "1. Магнитофон [КУПЛЕНО]\n2. Набор инструментов [КУПЛЕНО]\n3. Перекраска [15000 руб.]", "Купить", "Отмена"); else if(Garage
[i
][gUL
] == 3) return SendClientMessage(playerid
, -1, "Все улучшения приобретены!"); }
}
return true;
}
case D_GAR+2:
{
if(!response) return false;
return ShowPlayerDialog(playerid
, D_GAR
+1, DIALOG_STYLE_LIST, "Панель управления", "1. Заехать / Выехать\n2. Просмотр информации о гараже\n3. Закрыть / открыть гараж\n4. Продажа гаража государству\n5. Продажа гаража игроку\n6. Покупка улучшений для гаража", "Выбрать", "Отмена"); }
case D_GAR+3:
{
if(!response
) return SendClientMessage(playerid
, -1, "Вы отказались продавать гараж!"); Garage
[i
][gUL
] = 0, strmid(Garage
[i
][gOwner
], "None", 0, strlen("None"), 24); SetGarageInter(i, "UL", 0), SetGarageStr(i, "Owner", Garage[i][gOwner]);
UpdateGarage(i);
return true;
}
case D_GAR+4:
{
if(!response) return false;
if(!strlen(inputtext
)) return ShowPlayerDialog(playerid
, D_GAR
+4, DIALOG_STYLE_INPUT, "Внимание", "Введите через запятую ID игрока и цену.\n\nПример: 18, 90000", "Далее", "Отмена"); new id, price;
if(sscanf(inputtext
, "p<,>dd", id
, price
)) return ShowPlayerDialog(playerid
, D_GAR
+4, DIALOG_STYLE_INPUT, "Внимание", "Введите через запятую ID игрока и цену.\n\nПример: 18, 90000", "Далее", "Отмена"); if(!ProxDetector
(15.0, playerid
, id
)) return SendClientMessage(playerid
, -1, "Игрок находится далеко от Вас."); if(GetPlayerGarage
(id
) != 0) return SendClientMessage(playerid
, -1, "У игрока уже есть гараж!"); if(price
< 1 || price
> 5000000) return SendClientMessage(playerid
, -1, "Укажите цену от 1 до 5000000!");
new pname[24], pnames[24];
format(str
, 144, "%s предлагает Вам купить гараж №%d за %d рублей.", i
, pname
, price
);
format(str
, 144, "Вы предложили %s купить Ваш гараж за %d руб.", pnames
, price
), SendClientMessage(playerid
, -1, str
); return true;
}
case D_GAR+5:
{
if(!response) return false;
switch(listitem)
{
case 0:
{
if(Garage
[i
][gUL
] > 0) return SendClientMessage(playerid
, -1, "Это улучшение уже куплено!"); Garage[i][gUL]++, SetGarageInter(i, "UL", Garage[i][gUL]);
}
case 1:
{
if(Garage
[i
][gUL
] > 1) return SendClientMessage(playerid
, -1, "Это улучшение уже куплено!"); Garage[i][gUL]++, SetGarageInter(i, "UL", Garage[i][gUL]);
}
case 2:
{
if(Garage
[i
][gUL
] > 2) return SendClientMessage(playerid
, -1, "Это улучшение уже куплено!"); GivePlayerMoney(playerid
, -15000), SendClientMessage(playerid
, -1, "Вы приобрели данное улучшение! Теперь вы сможете перекрашивать транспорт в гараже (/paintcar)"); Garage[i][gUL]++, SetGarageInter(i, "UL", Garage[i][gUL]);
}
}
return true;
}
case D_GAR+6:
{
if(!response) return false;
new i
= GetPVarInt(playerid
, "GAR_ID"), Float:POS
[4]; switch(listitem)
{
case 0: ShowPlayerDialog(playerid
, D_GAR
+7, DIALOG_STYLE_INPUT, "Изменение цены", "{ffffff}Введите новую цену для гаража:", "Далее", "Отмена"); case 1: ShowPlayerDialog(playerid
, D_GAR
+8, DIALOG_STYLE_MSGBOX, "Предупреждение", "{ffffff}Вы уверены, что хотите продать гараж государству?", "Да", "Нет"); case 2: ShowPlayerDialog(playerid
, D_GAR
+9, DIALOG_STYLE_INPUT, "Изменение владельца", "{ffffff}Введите ник нового владельца:", "Далее", "Отмена"); case 3:
{
Garage[i][gX1] = POS[0], Garage[i][gY1] = POS[1], Garage[i][gZ1] = POS[2];
SetGarageFloat(i, "X1", POS[0]), SetGarageFloat(i, "Y1", POS[1]), SetGarageFloat(i, "Z1", POS[2]);
UpdateGarage
(i
), SendClientMessage(playerid
, -1, "Координаты входа в гараж изменены!"); }
case 4:
{
Garage[i][gX4] = POS[0], Garage[i][gY4] = POS[1], Garage[i][gZ4] = POS[2];
SetGarageFloat(i, "X4", POS[0]), SetGarageFloat(i, "Y4", POS[1]), SetGarageFloat(i, "Z4", POS[2]);
UpdateGarage
(i
), SendClientMessage(playerid
, -1, "Координаты выхода из гаража изменены!"); }
case 5:
{
Garage[i][gX2] = POS[0], Garage[i][gY2] = POS[1], Garage[i][gZ2] = POS[2], Garage[i][gR2] = POS[3];
SetGarageFloat(i, "X2", POS[0]), SetGarageFloat(i, "Y2", POS[1]), SetGarageFloat(i, "Z2", POS[2]), SetGarageFloat(i, "R2", POS[3]);
SendClientMessage(playerid
, -1, "Теперь при въезде в гараж транспорт будет появляться на этом месте!"); }
case 6:
{
Garage[i][gX3] = POS[0], Garage[i][gY3] = POS[1], Garage[i][gZ3] = POS[2], Garage[i][gR3] = POS[3];
SetGarageFloat(i, "X3", POS[0]), SetGarageFloat(i, "Y3", POS[1]), SetGarageFloat(i, "Z3", POS[2]), SetGarageFloat(i, "R3", POS[3]);
SendClientMessage(playerid
, -1, "Теперь при выезде из гаража транспорт будет появляться на этом месте!"); }
case 7:
{
if(Garage
[i
][gLock
] == 0) return SendClientMessage(playerid
, -1, "Вы закрыли гараж!"), SetGarageInter
(i
, "Lock", 1), Garage
[i
][gLock
] = 1; else SendClientMessage(playerid
, -1, "Вы открыли гараж!"), SetGarageInter
(i
, "Lock", 0), Garage
[i
][gLock
] = 0; }
}
return true;
}
case D_GAR+7:
{
if(!response) return false;
if(!strlen(inputtext
)) return ShowPlayerDialog(playerid
, D_GAR
+7, DIALOG_STYLE_INPUT, "Изменение цены", "Введите новую цену для гаража:", "Далее", "Отмена"); if(price
< 1) return ShowPlayerDialog(playerid
, D_GAR
+7, DIALOG_STYLE_INPUT, "Изменение цены", "Введите новую цену для гаража:", "Далее", "Отмена"); Garage
[i
][gPrice
] = price
, SetGarageInter
(i
, "Price", price
), SendClientMessage(playerid
, -1, "Стоимость гаража изменена!"), UpdateGarage
(i
); return true;
}
case D_GAR+8:
{
if(!response) return false;
SetGarageStr(i, "Owner", Garage[i][gOwner]);
UpdateGarage(i);
return true;
}
case D_GAR+9:
{
if(!response) return false;
if(!strlen(inputtext
)) return ShowPlayerDialog(playerid
, D_GAR
+9, DIALOG_STYLE_INPUT, "Изменение владельца", "{ffffff}Введите ник нового владельца:", "Далее", "Отмена"); strmid(Garage
[i
][gOwner
], inputtext
, 0, strlen(inputtext
), 24); SetGarageStr(i, "Owner", Garage[i][gOwner]);
UpdateGarage(i);
return true;
}
}
return 1;
}
{
if(newkeys == KEY_WALK)
{
for(new i = 1; i <= ALLGARAGE; i++)
{
{
if(!strcmp(Garage
[i
][gOwner
], "None", true)) {
format(str
, sizeof(str
), "{ffffff}Гараж номер %d продается!\nГосударственная стоимость гаража состовляет %d рублей.", i
, Garage
[i
][gPrice
]); ShowPlayerDialog(playerid
, D_GAR
, DIALOG_STYLE_MSGBOX, "Гараж продается!", str
, "Купить", "Отмена"); }
else
{
format(str
, sizeof(str
), "{ffffff}Номер гаража: %d\nВладелец данного гаража %s.\nГосударственная стоимость гаража состовляет %d рублей.", i, Garage[i][gOwner], Garage[i][gPrice]);
ShowPlayerDialog(playerid
, D_GAR
, DIALOG_STYLE_MSGBOX, "Гараж куплен!", str
, "Войти", "Отмена"); }
}
{
SetPlayerPos(playerid
, Garage
[id
][gX1
], Garage
[id
][gY1
], Garage
[id
][gZ1
]); }
}
}
else if(newkeys == KEY_YES)
{
{
SendClientMessage(playerid
, -1, "Вы успешно купили гараж! Используйте: /garagemenu"); new names[24];
SetGarageStr(i, "Owner", Garage[i][gOwner]);
}
}
else if(newkeys == KEY_NO)
{
{
}
}
return 1;
}
stock ProxDetector(Float:radi, playerid, targetid)
{
{
new Float:PX, Float:PY, Float:PZ;
new Float:oldposx, Float:oldposy, Float:oldposz;
new Float:tempposx, Float:tempposy, Float:tempposz;
tempposx = (oldposx -PX);
tempposy = (oldposy -PY);
tempposz = (oldposz -PZ);
if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi)))
{
return true;
}
}
return false;
}
stock ConnectMySQL()
{
mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DB, MYSQL_PASS);
if(mysql_errno()) print(" Подключение к базе не успешно"); else print(" Подключение к базе успешно"); }
stock DisconnectMySQL
() return mysql_close(), print("База данных успешно отключена!");//Отключаемся от БД
stock GetPlayerGarage(playerid)
{
new names[24];
new gar = 0;
for(new i = 1; i <= ALLGARAGE; i++)
{
if(!strcmp(Garage
[i
][gOwner
], names
, true)) gar
++, SetPVarInt(playerid
, "PlayerGarage", i
); }
return gar;
}
stock SetGarageInter(idx, stolb[], znach)
{
format(Query
, 120, "UPDATE "TABLE_GARAGE
" SET %s = '%d' WHERE ID = '%d' LIMIT 1", stolb
, znach
, idx
); return mysql_query(query);
}
stock SetGarageFloat(idx, stolb[], Float:znach)
{
format(Query
, 120, "UPDATE "TABLE_GARAGE
" SET %s = '%f' WHERE ID = '%d' LIMIT 1", stolb
, znach
, idx
); return mysql_query(query);
}
stock SetGarageStr(idx, stolb[], znach[])
{
format(Query
, 120, "UPDATE "TABLE_GARAGE
" SET %s = '%s' WHERE ID = '%d' LIMIT 1", stolb
, znach
, idx
); return mysql_query(query);
}
stock UpdateGarage(idx)
{
Garage
[idx
][gPickup
] = CreatePickup(1239, 23, Garage
[idx
][gX1
], Garage
[idx
][gY1
], Garage
[idx
][gZ1
]); if(!strcmp(Garage
[idx
][gOwner
],"None",true)) {
format(str
, 100, "{FFFFFF}Гараж №%d продается!\nСтоимость: %d", idx
, Garage
[idx
][gPrice
]); Garage
[idx
][gText
] = Create3DTextLabel(str
, -1, Garage
[idx
][gX1
], Garage
[idx
][gY1
], Garage
[idx
][gZ1
], 10.0, 0, 1); }
else
{
format(str
, 100, "{FFFFFF}Гараж №%d куплен!\nВладелец %s\nСтоимость: %d", idx
, Garage
[idx
][gOwner
], Garage
[idx
][gPrice
]); Garage
[idx
][gText
] = Create3DTextLabel(str
, -1, Garage
[idx
][gX1
], Garage
[idx
][gY1
], Garage
[idx
][gZ1
], 10.0, 0, 1); }
return true;
}
stock LoadGarage()
{
new query[2000];
mysql_query("SELECT * FROM `"TABLE_GARAGE"` ORDER BY `"TABLE_GARAGE"`.`ID` ASC ");
mysql_store_result();
for(new i = 1; i <= ALLGARAGE; i++)
{
}
if(mysql_num_rows() > 0)
{
for(new idx = 1; idx <= mysql_num_rows(); idx++)
{
mysql_fetch_row(query);
sscanf(query
, "p<|>is[24]iiiffffffffffffffii", Garage[idx][gID],
Garage[idx][gOwner],
Garage[idx][gPrice],
Garage[idx][gInter],
Garage[idx][gVirtual],
Garage[idx][gX1],
Garage[idx][gY1],
Garage[idx][gZ1],
Garage[idx][gX2],
Garage[idx][gY2],
Garage[idx][gZ2],
Garage[idx][gR2],
Garage[idx][gX3],
Garage[idx][gY3],
Garage[idx][gZ3],
Garage[idx][gR3],
Garage[idx][gX4],
Garage[idx][gY4],
Garage[idx][gZ4],
Garage[idx][gLock],
Garage[idx][gUL]);
ALLGARAGE++;
if(!strcmp(Garage
[idx
][gOwner
],"None",true))//Если продается {
format(str
, 100, "{FFFFFF}Гараж №%d продается!\nСтоимость: %d", idx
, Garage
[idx
][gPrice
]); Garage
[idx
][gText
] = Create3DTextLabel(str
, -1, Garage
[idx
][gX1
], Garage
[idx
][gY1
], Garage
[idx
][gZ1
], 10.0, 0, 1); Garage
[idx
][gPickup
] = CreatePickup(1239, 23, Garage
[idx
][gX1
], Garage
[idx
][gY1
], Garage
[idx
][gZ1
]); }
else//Если куплен
{
format(str
, 100, "{FFFFFF}Гараж №%d куплен!\nВладелец %s\nСтоимость: %d", idx
, Garage
[idx
][gOwner
], Garage
[idx
][gPrice
]); Garage
[idx
][gText
] = Create3DTextLabel(str
, -1, Garage
[idx
][gX1
], Garage
[idx
][gY1
], Garage
[idx
][gZ1
], 10.0, 0, 1); Garage
[idx
][gPickup
] = CreatePickup(1239, 23, Garage
[idx
][gX1
], Garage
[idx
][gY1
], Garage
[idx
][gZ1
]); }
}
}
mysql_free_result();
print("\n----------------------------------"); return printf("Было загружено %d гаражей.", ALLGARAGE
); }
CMD:addgarage(playerid, params[])//Создать гараж
{
ALLGARAGE++;
new i = ALLGARAGE;
new Float:POS[3];
strmid(Garage
[i
][gOwner
], "None", 0, strlen("None"), MAX_PLAYER_NAME); Garage[i][gPrice] = params[0], Garage[i][gInter] = i, Garage[i][gVirtual] = i;
Garage[i][gX1] = POS[0], Garage[i][gY1] = POS[1], Garage[i][gZ1] = POS[2];
Garage[i][gX4] = 2346.09, Garage[i][gY4] = -234.782, Garage[i][gZ4] = -32.5;
format(str
, 100, "{FFFFFF}Гараж №%d продается!\nСтоимость: %d", i
, Garage
[i
][gPrice
]); Garage
[i
][gText
] = Create3DTextLabel(str
, -1, Garage
[i
][gX1
], Garage
[i
][gY1
], Garage
[i
][gZ1
], 10.0, 0, 1); Garage
[i
][gPickup
] = CreatePickup(1239, 23, Garage
[i
][gX1
], Garage
[i
][gY1
], Garage
[i
][gZ1
]); format(Query
, 1000, "INSERT INTO "TABLE_GARAGE
" (ID, Owner, Price) VALUES ('%i', '%s', '%i')", i
, Garage
[i
][gOwner
], Garage
[i
][gPrice
]); mysql_query(query);
SetGarageFloat(i, "X1", POS[0]), SetGarageFloat(i, "Y1", POS[1]), SetGarageFloat(i, "Z1", POS[2]);
SetGarageInter(i, "Inter", i), SetGarageInter(i, "Virtual", i);
format(str
, sizeof(str
), "Гараж #%d успешно добавлен. Стоимость: %d", i
, Garage
[i
][gPrice
]); SendClientMessage(playerid
, -1, "Теперь измените координаты появления транспорта при выезде из гаража (/edgarage)."); return true;
}
COMMAND:garagemenu(playerid, params[])
{
if(GetPlayerGarage
(playerid
) == 0) return SendClientMessage(playerid
, -1, "У Вас нет гаража!"); ShowPlayerDialog(playerid
, D_GAR
+1, DIALOG_STYLE_LIST, "Панель управления", "1. Заехать / Выехать\n2. Просмотр информации о гараже\n3. Закрыть / открыть гараж\n4. Продажа гаража государству\n5. Продажа гаража игроку\n6. Покупка улучшений для гаража", "Выбрать", "Отмена"); return true;
}
COMMAND:edgarage(playerid, params[])//ПУ администратора
{
if(params
[0] > ALLGARAGE
) return format(str
, 144, "Максимальный ID гаража: %d.", ALLGARAGE
), SendClientMessage(playerid
, -1, str
); ShowPlayerDialog(playerid
, D_GAR
+6, DIALOG_STYLE_LIST, "Панель управления администратора", "1. Изменить цену\n2. Продать гараж\n3. Изменить владельца\n4. Изменить координаты входа\n5. Изменить координаты выхода\n6. Изменить место появления транспорта при въезде в гараж\n7. Изменить место появления транспорта при выезде из гаража\n8. Открыть / закрыть гараж", "Далее", "Отмена"); return true;
}
COMMAND:repaircar(playerid)//Ремонт авто в гараже
{
if(Garage
[id
][gUL
] < 2) return SendClientMessage(playerid
, -1, "Необходимо приобрести улучшение второго уровня!"); return true;
}
COMMAND:paintcar(playerid, params[])//Перекраска авто в гараже
{
if(Garage
[id
][gUL
] < 3) return SendClientMessage(playerid
, -1, "Необходимо приобрести улучшение третьего уровня!"); if(sscanf(params
, "dd", params
[0], params
[1])) return SendClientMessage(playerid
, -1, "Используйте: /paintcar [цвет 1][цвет 2]"); if(params
[0] > 256 || params
[1] > 256) return SendClientMessage(playerid
, -1, "ID цвета 1 или цвета 2 должен быть не более 256!"); return true;
}