Bren
Умник
Решил выложить система радаров, которую делал для одного уже не активного проекта.
Похожие работы уже есть, но в них нет такого функционала.
Похожие работы уже есть, но в них нет такого функционала.
Возможности
- Добавление радаров прям на сервере или в phpMyAdmin.
- Редактирование и удаление созданных радаров.
- Изменение лимита скорости.
- Изменение радиуса действия.
- Изменение скорости срабатывания.
- Изменение суммы штрафа.
- Просмотр подробной информации о радаре
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Требования: plugins / Includes
Код:
MySQL R41-4
sscanf2
Streamer
mdialog
Список изменений:
- Полностью обновил код системы радаров.
- Добавил возможность создание, удаление и редактирование радаров прям из игры.
- Добавил возможность подключить систему радаров как модульную систему.
- Добавил обнуление статистики срабатываний и обнуление статистики штрафов.
- Добавил новые команды такие как /radarlist, /radartp, /radarcreate /radardelete.
- Добавил define для простой настройки дальности отображение 3D текст и самой дистанции объекта.
- Добавил возможность создание, удаление и редактирование радаров прям из игры.
- Добавил возможность подключить систему радаров как модульную систему.
- Добавил обнуление статистики срабатываний и обнуление статистики штрафов.
- Добавил новые команды такие как /radarlist, /radartp, /radarcreate /radardelete.
- Добавил define для простой настройки дальности отображение 3D текст и самой дистанции объекта.
Установка:
- Удалите старую систему радаров если она есть.
- Скачайте архив Car Radar System.zip и разархивируйте его.
- Поместите файл CarRadarSystem.inc из архива в папку include.
- Добавьте файл radars.sql в свою базу Таблицы MySQL.
- Откройте ваш мод, и добавьте после всех new строчку - #include <CarRadarSystem.inc>
- Откройте загруженный файл CarRadarSystem.inc, и через поиск заменить все переменные MysqlConnectID на своё название MySQL:handle
- Опять открыть свой мод, и в OnGameModeInit вставляем запрос на загрузку радаров -
Pawn:
mysql_tquery(/*тут используйте свою переменную mysql connect (MySQL:handle) */, "SELECT * FROM radars", "AutoRadarLoad");
Готово!
Таблица MySQL
Код:
CREATE TABLE `radars` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`Pos` varchar(80) NOT NULL COMMENT 'x, y, z, rx, ry, rz',
`VirtualWorld` int(10) NOT NULL,
`Interior` int(10) NOT NULL,
`Range` float NOT NULL COMMENT 'радиус действия',
`SpeedLimit` int(3) NOT NULL COMMENT 'лимит скорости',
`Fine` int(10) NOT NULL COMMENT 'сумма штрафа',
`Triggers` int(10) NOT NULL DEFAULT '0' COMMENT 'Общие количество нарушений',
`TotalFines` int(10) NOT NULL DEFAULT '0' COMMENT 'Общяя сумма штрафов',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Спосок команды
/radarlist - Настройки радаров
/radarcreate - Создать новый радар
/radardelete - Удалить радар
/radartp - Телепортироваться к радару
/radarcreate - Создать новый радар
/radardelete - Удалить радар
/radartp - Телепортироваться к радару
Весь код целиком
Код:
/*Creator: @Bren828 - 2022.12.29*/
#define CAR_RADAR_MAX 200
#define CAR_RADAR_OBJECT_STREAM_DISTANCE 200.0
#define CAR_RADAR_3DTEXT_STREAM_DISTANCE 15.0
enum CARRADAR_EN
{
rsRadarID,
Float:rsPos[6],
rsVirtualWorld,
rsInterior,
Float:rsRange,
rsSpeedLimit,
rsFine,
rsTriggers,
rsTotalFines,
rsObjects,
rsSphere,
Text3D:rsText3D
}
new CarRadarSystem[CAR_RADAR_MAX][CARRADAR_EN];
enum CARRADAR_PLAYER_EN
{
crpPage,
crpPage_Button_Back,
crpRadarSlotID[20],
crpLineID,
crpEditRadar
}
new CarRadarSystemPlayer[MAX_PLAYERS][CARRADAR_PLAYER_EN];
/*
public OnGameModeInit()
{
mysql_tquery(MysqlConnectID, "SELECT * FROM radars", "AutoRadarLoad");
return 1;
}
*/
forward AutoRadarLoad();
public AutoRadarLoad()
{
new rows;
cache_get_row_count(rows);
if(!rows) return print("Радары не загружены!");
new string[76+10], RadarMax;
for(new x; x < rows; x ++)
{
if(RadarMax >= CAR_RADAR_MAX)
{
print(">> Увеличьте define 'CAR_RADAR_MAX' !");
break;
}
cache_get_value_name_int(x, "id", CarRadarSystem[RadarMax][rsRadarID]);
cache_get_value_name(x, "Pos", string);
sscanf(string, "p<,>a<f>[6]", CarRadarSystem[RadarMax][rsPos]);
cache_get_value_name_int(x, "VirtualWorld", CarRadarSystem[RadarMax][rsVirtualWorld]);
cache_get_value_name_int(x, "Interior", CarRadarSystem[RadarMax][rsInterior]);
cache_get_value_name_float(x, "Range", CarRadarSystem[RadarMax][rsRange]);
cache_get_value_name_int(x, "SpeedLimit", CarRadarSystem[RadarMax][rsSpeedLimit]);
cache_get_value_name_int(x, "Fine", CarRadarSystem[RadarMax][rsFine]);
cache_get_value_name_int(x, "Triggers", CarRadarSystem[RadarMax][rsTriggers]);
cache_get_value_name_int(x, "TotalFines", CarRadarSystem[RadarMax][rsTotalFines]);
CarRadarSystem[RadarMax][rsObjects] = CreateDynamicObject(18880, CarRadarSystem[RadarMax][rsPos][0], CarRadarSystem[RadarMax][rsPos][1], CarRadarSystem[RadarMax][rsPos][2], CarRadarSystem[RadarMax][rsPos][3], CarRadarSystem[RadarMax][rsPos][4], CarRadarSystem[RadarMax][rsPos][5], CarRadarSystem[RadarMax][rsVirtualWorld], CarRadarSystem[RadarMax][rsInterior], -1, CAR_RADAR_OBJECT_STREAM_DISTANCE, CAR_RADAR_OBJECT_STREAM_DISTANCE);
CarRadarSystem[RadarMax][rsSphere] = CreateDynamicSphere(CarRadarSystem[RadarMax][rsPos][0], CarRadarSystem[RadarMax][rsPos][1], CarRadarSystem[RadarMax][rsPos][2], CarRadarSystem[RadarMax][rsRange], CarRadarSystem[RadarMax][rsVirtualWorld], CarRadarSystem[RadarMax][rsInterior]);
if(CarRadarSystem[RadarMax][rsSpeedLimit] == 0) format(string, sizeof(string), "Радар скорости {00FF00}№%d{FF0000}\nОтключен", RadarMax+1);
else format(string, sizeof(string), "Радар скорости {00FF00}№%d{FFFFFF}\nМаксимальная скорость: {00FF00}%d (км/ч)", RadarMax+1, CarRadarSystem[RadarMax][rsSpeedLimit]);
CarRadarSystem[RadarMax][rsText3D] = CreateDynamic3DTextLabel(string, -1, CarRadarSystem[RadarMax][rsPos][0], CarRadarSystem[RadarMax][rsPos][1], CarRadarSystem[RadarMax][rsPos][2]+6.0, 15.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, CarRadarSystem[RadarMax][rsVirtualWorld], CarRadarSystem[RadarMax][rsInterior], -1, CAR_RADAR_3DTEXT_STREAM_DISTANCE);
RadarMax ++;
}
printf("-> Загружено %d радаров", RadarMax);
return 1;
}
CMD:radartp(playerid, params[])//телепорт по радарам
{
if(sscanf(params, "d", params[0])) return SendClientMessage(playerid, -1, "/radartp [Номер радара]");
if(params[0] < 1 || params[0] > CAR_RADAR_MAX)
{
new string[26+10];
format(string, sizeof(string), "Номер радара от 1 до %d", CAR_RADAR_MAX);
return SendClientMessage(playerid, -1, string);
}
if(CarRadarSystem[params[0]][rsRadarID] == 0) return SendClientMessage(playerid, -1, "Радара с данным номером нет.");
SetPlayerVirtualWorld(playerid, CarRadarSystem[params[0]-1][rsVirtualWorld]);
SetPlayerInterior(playerid, CarRadarSystem[params[0]-1][rsInterior]);
SetPlayerPos(playerid, CarRadarSystem[params[0]-1][rsPos][0]+0.5, CarRadarSystem[params[0]-1][rsPos][1]+0.5, CarRadarSystem[params[0]-1][rsPos][2]+1.7);
return 1;
}
CMD:radarcreate(playerid, params[])//создать новый радар
{
new Float:Range, SpeedLimit, Fine;
if(sscanf(params, "fdd", Range, SpeedLimit, Fine)) return SendClientMessage(playerid, -1, "/radarcreate [Радиус] [Лимит скорости] [Сумма штрафа]");
if(Range < 1.0) return SendClientMessage(playerid, -1, "Неверный радиус");
if(SpeedLimit < 1) return SendClientMessage(playerid, -1, "Неверная скорость");
if(Fine < 0) return SendClientMessage(playerid, -1, "Неверная сумма");
new newSlot = -1;
for(new x; x < CAR_RADAR_MAX; x ++)
{
if(CarRadarSystem[x][rsRadarID] != 0) continue;
newSlot = x;
break;
}
if(newSlot == -1) return SendClientMessage(playerid, -1, "Увеличьте define 'MAX_RADAR' !");
new string[144+ 28+ 10+10+10+10+10], Float:x, Float:y, Float:z, Float:ang, World = GetPlayerVirtualWorld(playerid), Interior = GetPlayerInterior(playerid);
GetPlayerPos(playerid, x, y, z);
GetPlayerFacingAngle(playerid, ang);
z -= 1.2;
mysql_format(MysqlConnectID, string, sizeof(string),
"INSERT INTO radars (`Pos`,`VirtualWorld`,`Interior`,`Range`,`SpeedLimit`,`Fine`) VALUE ('%.2f,%.2f,%.2f, 0.0,0.0,%.2f','%d','%d','%f','%d','%d')",
x, y, z,ang, World, Interior, Range, SpeedLimit, Fine);
new Cache:result = mysql_query(MysqlConnectID, string);
if(!cache_is_valid(result))
{
SendClientMessage(playerid, -1, "Ошибка Mysql создания радара");
cache_delete(result);
return 1;
}
new IDMqs = cache_insert_id();
cache_delete(result);
CarRadarSystem[newSlot][rsRadarID] = IDMqs;
CarRadarSystem[newSlot][rsPos][0] = x;
CarRadarSystem[newSlot][rsPos][1] = y;
CarRadarSystem[newSlot][rsPos][2] = z;
CarRadarSystem[newSlot][rsPos][3] = 0.0;
CarRadarSystem[newSlot][rsPos][4] = 0.0;
CarRadarSystem[newSlot][rsPos][5] = ang;
CarRadarSystem[newSlot][rsVirtualWorld] = World;
CarRadarSystem[newSlot][rsInterior] = Interior;
CarRadarSystem[newSlot][rsRange] = Range;
CarRadarSystem[newSlot][rsSpeedLimit] = SpeedLimit;
CarRadarSystem[newSlot][rsFine] = Fine;
CarRadarSystem[newSlot][rsTriggers] = 0;
CarRadarSystem[newSlot][rsTotalFines] = 0;
CarRadarSystem[newSlot][rsObjects] = CreateDynamicObject(18880, CarRadarSystem[newSlot][rsPos][0], CarRadarSystem[newSlot][rsPos][1], CarRadarSystem[newSlot][rsPos][2], CarRadarSystem[newSlot][rsPos][3], CarRadarSystem[newSlot][rsPos][4], CarRadarSystem[newSlot][rsPos][5], CarRadarSystem[newSlot][rsVirtualWorld], CarRadarSystem[newSlot][rsInterior], -1, CAR_RADAR_OBJECT_STREAM_DISTANCE, CAR_RADAR_OBJECT_STREAM_DISTANCE);
CarRadarSystem[newSlot][rsSphere] = CreateDynamicSphere(CarRadarSystem[newSlot][rsPos][0], CarRadarSystem[newSlot][rsPos][1], CarRadarSystem[newSlot][rsPos][2], CarRadarSystem[newSlot][rsRange], CarRadarSystem[newSlot][rsVirtualWorld], CarRadarSystem[newSlot][rsInterior]);
if(CarRadarSystem[newSlot][rsSpeedLimit] == 0) format(string, sizeof(string), "Радар скорости {00FF00}№%d{FF0000}\nОтключен", newSlot+1);
else format(string, sizeof(string), "Радар скорости {00FF00}№%d{FFFFFF}\nМаксимальная скорость: {00FF00}%d (км/ч)", newSlot+1, CarRadarSystem[newSlot][rsSpeedLimit]);
CarRadarSystem[newSlot][rsText3D] = CreateDynamic3DTextLabel(string, -1, CarRadarSystem[newSlot][rsPos][0], CarRadarSystem[newSlot][rsPos][1], CarRadarSystem[newSlot][rsPos][2]+6.0, 15.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, CarRadarSystem[newSlot][rsVirtualWorld], CarRadarSystem[newSlot][rsInterior], -1, CAR_RADAR_3DTEXT_STREAM_DISTANCE);
SetPlayerPos(playerid, x+0.5, y+0.5, z+1.2);
format(string, sizeof(string), "Вы создали радар под номером %d", newSlot+1);
SendClientMessage(playerid, -1, string);
return 1;
}
CMD:radardelete(playerid, params[])//удалить радар
{
if(sscanf(params, "d", params[0])) return SendClientMessage(playerid, -1, "/radarcreate [Номер радара]");
if(params[0] < 1 || params[0] > CAR_RADAR_MAX) return SendClientMessage(playerid, -1, "Неверный номер радара");
if(CarRadarSystem[params[0]-1][rsRadarID] == 0) return SendClientMessage(playerid, -1, "Радара с данным номером нет.");
new string[38+10];
mysql_format(MysqlConnectID, string, sizeof(string), "DELETE FROM radars WHERE id=%d LIMIT 1", CarRadarSystem[params[0]-1][rsRadarID]),
mysql_query(MysqlConnectID, string);
CarRadarSystem[params[0]-1][rsRadarID] = 0;
DestroyDynamicObject(CarRadarSystem[params[0]-1][rsObjects]);
DestroyDynamicArea(CarRadarSystem[params[0]-1][rsSphere]);
DestroyDynamic3DTextLabel(CarRadarSystem[params[0]-1][rsText3D]);
format(string, sizeof(string), "Вы удалили радар под номером %d", params[0]);
SendClientMessage(playerid, -1, string);
return 1;
}
CMD:radarlist(playerid, params[])//удалить радар
{
CarRadarSystemPlayer[playerid][crpPage] = 0;
CarRadarSystemPlayer[playerid][crpPage_Button_Back] = 0;
Dialog_Show(playerid, Dialog:RadarSystemList);
return 1;
}
DialogCreate:RadarSystemList(playerid)
{
new string[(50 * 20) + 50], speedT[17] = "{f44747}Отключен", slot[2];
strcat(string, "{FFFFFF}Номер\t{FFFFFF}Скорость\t{FFFFFF}Штраф\t\n");
for(new x = (20*CarRadarSystemPlayer[playerid][crpPage]); x < CAR_RADAR_MAX; x ++)
{
if(CarRadarSystem[x][rsRadarID] == 0) continue;
if(slot[0] <= 19)
{
if(CarRadarSystem[x][rsSpeedLimit] >= 1) format(speedT, sizeof(speedT), "%d", CarRadarSystem[x][rsSpeedLimit]);
format(string, sizeof(string), "%s Радар %d\t%s\t$%d\n", string,x+1, speedT, CarRadarSystem[x][rsFine]);
CarRadarSystemPlayer[playerid][crpRadarSlotID][slot[0]] = x;
speedT = "{f44747}Отключен";
if(x >= CAR_RADAR_MAX-1)
{
if(CarRadarSystemPlayer[playerid][crpPage] >= 1)
{
slot[1] = 1;
strcat(string, "< Назад\n");
CarRadarSystemPlayer[x][crpPage_Button_Back] = slot[0]+2;
}
break;
}
}
slot[0] ++;
if(slot[0] >= 21)
{
slot[1] = 1;
strcat(string, "> Дальше\n");
if(CarRadarSystemPlayer[playerid][crpPage] >= 1) strcat(string, "< Назад\n");
break;
}
}
if(slot[0] == 0) return Dialog_Message(playerid, "Список радаров", "{FFFFFF}Нет созданных радаров.", "Закрыть");
if(CarRadarSystemPlayer[playerid][crpPage] >= 1 && slot[1] == 0)
{
strcat(string, "< Назад\n");
CarRadarSystemPlayer[playerid][crpPage_Button_Back] = slot[0]+1;
}
Dialog_Open(playerid, Dialog:RadarSystemList, DIALOG_STYLE_TABLIST_HEADERS, "Список радаров", string, "Выбрать", "Отмена");
return 1;
}
DialogResponse:RadarSystemList(playerid, response, listitem, inputtext[])
{
if(!response) return 1;
switch(listitem)
{
case 20:
{
if(CarRadarSystemPlayer[playerid][crpPage_Button_Back] >= 1 && CarRadarSystemPlayer[playerid][crpPage_Button_Back] == listitem+1 && CarRadarSystemPlayer[playerid][crpPage] >= 1)
{
CarRadarSystemPlayer[playerid][crpPage] --;
CarRadarSystemPlayer[playerid][crpPage_Button_Back] = 0;
}
else CarRadarSystemPlayer[playerid][crpPage] ++;
return Dialog_Show(playerid, Dialog:RadarSystemList);
}
case 21:
{
if(CarRadarSystemPlayer[playerid][crpPage] <= 0) return 1;
CarRadarSystemPlayer[playerid][crpPage] --;
return Dialog_Show(playerid, Dialog:RadarSystemList);
}
default:
{
if(CarRadarSystemPlayer[playerid][crpPage_Button_Back] >= 1 && CarRadarSystemPlayer[playerid][crpPage_Button_Back] == listitem+1 && CarRadarSystemPlayer[playerid][crpPage] >= 1)
{
CarRadarSystemPlayer[playerid][crpPage] --;
CarRadarSystemPlayer[playerid][crpPage_Button_Back] = 0;
return Dialog_Show(playerid, Dialog:RadarSystemList);
}
CarRadarSystemPlayer[playerid][crpLineID] = CarRadarSystemPlayer[playerid][crpRadarSlotID][listitem];
Dialog_Show(playerid, Dialog:RadarSystemEdit);
return 1;
}
}
return 1;
}
DialogCreate:RadarSystemEdit(playerid)
{
Dialog_Open(playerid, Dialog:RadarSystemEdit, DIALOG_STYLE_LIST, "Действия",
"Информация о радаре\n\
Изменить лимит скорости\n\
Изменить штраф за превышение\n\
Сбросить количество срабатываний\n\
Сбросить количество штрафов\n\
Телепорт к радару\n\
Редактировать положение\n\
Удалить радар",
"Выбрать", "Назад");
return 1;
}
DialogResponse:RadarSystemEdit(playerid, response, listitem, inputtext[])
{
if(!response) return Dialog_Show(playerid, Dialog:RadarSystemList);
new slot = CarRadarSystemPlayer[playerid][crpLineID];
if(CarRadarSystem[slot][rsRadarID] == 0) return 1;
switch(listitem)
{
case 0:
{
new string[170+10+4+10+10+10];
format(string, sizeof(string),
"{FFFFFF}Номер радара\t\t\t%d\n\
Радиус действия\t\t%.1f метров\n\
Лимит скорости\t\t%d\n\
Штраф за превышения\t$%d\n\
Сработал\t\t\t%d раз(a)\n\
Общяя сумма штрафов\t$%d",
slot+1,
CarRadarSystem[slot][rsRange],
CarRadarSystem[slot][rsSpeedLimit],
CarRadarSystem[slot][rsFine],
CarRadarSystem[slot][rsTriggers],
CarRadarSystem[slot][rsTotalFines]);
Dialog_Open(playerid, Dialog:RadarSystemEdit_Info, DIALOG_STYLE_MSGBOX, "Информация о радаре", string, "Закрыть", "Назад");
return 1;
}
case 1:
{
Dialog_Open(playerid, Dialog:RadarSystemEdit_LimitSpeed, DIALOG_STYLE_INPUT, "Изменить лимит скорости", "{FFFFFF}Введите новый лимит скорости:\nДля отключение радара используйте число 0", "Изменить", "Назад");
return 1;
}
case 2:
{
Dialog_Open(playerid, Dialog:RadarSystemEdit_Fine, DIALOG_STYLE_INPUT, "Изменить штраф за превышение", "{FFFFFF}Введите новый штраф за превышение:", "Изменить", "Назад");
return 1;
}
case 3:
{
new string[48+10];
CarRadarSystem[slot][rsTriggers] = 0;
mysql_format(MysqlConnectID, string, sizeof(string), "UPDATE radars SET Triggers=0 WHERE id=%d LIMIT 1", CarRadarSystem[slot][rsRadarID]);
mysql_tquery(MysqlConnectID, string);
SendClientMessage(playerid, -1, "Вы сбросили количество срабатываний.");
Dialog_Show(playerid, Dialog:RadarSystemEdit);
return 1;
}
case 4:
{
new string[50+10];
CarRadarSystem[slot][rsTotalFines] = 0;
mysql_format(MysqlConnectID, string, sizeof(string), "UPDATE radars SET TotalFines=0 WHERE id=%d LIMIT 1", CarRadarSystem[slot][rsRadarID]);
mysql_tquery(MysqlConnectID, string);
SendClientMessage(playerid, -1, "Вы сбросили общую сумму штрафов.");
Dialog_Show(playerid, Dialog:RadarSystemEdit);
return 1;
}
case 5, 6:
{
if(listitem == 5 || listitem == 6 && !IsPlayerInRangeOfPoint(playerid, 20.0, CarRadarSystem[slot][rsPos][0], CarRadarSystem[slot][rsPos][1], CarRadarSystem[slot][rsPos][2]))
{
SetPlayerVirtualWorld(playerid, CarRadarSystem[slot][rsVirtualWorld]);
SetPlayerInterior(playerid, CarRadarSystem[slot][rsInterior]);
SetPlayerPos(playerid, CarRadarSystem[slot][rsPos][0]+0.5, CarRadarSystem[slot][rsPos][1]+0.5, CarRadarSystem[slot][rsPos][2]+1.7);
}
if(listitem == 6)
{
CarRadarSystemPlayer[playerid][crpEditRadar] = slot+1;
EditDynamicObject(playerid, CarRadarSystem[slot][rsObjects]);
}
return 1;
}
case 7:
{
new str[10];
format(str, sizeof(str), "%d", CarRadarSystemPlayer[playerid][crpLineID]+1);
callcmd::radardelete(playerid, str);
return 1;
}
}
return 1;
}
DialogResponse:RadarSystemEdit_Info(playerid, response, listitem, inputtext[])
{
if(!response) return Dialog_Show(playerid, Dialog:RadarSystemEdit);
return 1;
}
DialogResponse:RadarSystemEdit_LimitSpeed(playerid, response, listitem, inputtext[])
{
if(!response) return Dialog_Show(playerid, Dialog:RadarSystemEdit);
if(strval(inputtext) < 0 || strval(inputtext) > 400) return Dialog_Open(playerid, Dialog:RadarSystemEdit_LimitSpeed, DIALOG_STYLE_INPUT, "Изменить лимит скорости", "{FFFFFF}Введите новый лимит скорости:\nДля отключение радара используйте число 0\n{FF0000}Лимит скорости от 0 до 400 км!", "Изменить", "Назад");
new string[76+10+10], slot = CarRadarSystemPlayer[playerid][crpLineID];
if(CarRadarSystem[slot][rsRadarID] == 0) return 1;
CarRadarSystem[slot][rsSpeedLimit] = strval(inputtext);
mysql_format(MysqlConnectID, string, sizeof(string), "UPDATE radars SET SpeedLimit=%d WHERE id=%d LIMIT 1", strval(inputtext), CarRadarSystem[slot][rsRadarID]);
mysql_tquery(MysqlConnectID, string);
format(string, sizeof(string), "Вы изменили скорость на %d км.", strval(inputtext));
SendClientMessage(playerid, -1, string);
if(CarRadarSystem[slot][rsSpeedLimit] == 0) format(string, sizeof(string), "Радар скорости {00FF00}№%d{FF0000}\nОтключен", slot+1);
else format(string, sizeof(string), "Радар скорости {00FF00}№%d{FFFFFF}\nМаксимальная скорость: {00FF00}%d (км/ч)", slot+1, CarRadarSystem[slot][rsSpeedLimit]);
UpdateDynamic3DTextLabelText(CarRadarSystem[slot][rsText3D], -1, string);
Dialog_Show(playerid, Dialog:RadarSystemEdit);
return 1;
}
DialogResponse:RadarSystemEdit_Fine(playerid, response, listitem, inputtext[])
{
if(!response) return Dialog_Show(playerid, Dialog:RadarSystemEdit);
if(strval(inputtext) < 0 || strval(inputtext) > 50000000) return Dialog_Open(playerid, Dialog:RadarSystemEdit_Fine, DIALOG_STYLE_INPUT, "Изменить штраф за превышение", "{FFFFFF}Введите новый штраф за превышение:\n{FF0000}Максимальный штраф от $0 до $50 000 000!", "Изменить", "Назад");
new string[45+10+10], slot = CarRadarSystemPlayer[playerid][crpLineID];
if(CarRadarSystem[slot][rsRadarID] == 0) return 1;
CarRadarSystem[slot][rsFine] = strval(inputtext);
mysql_format(MysqlConnectID, string, sizeof(string), "UPDATE radars SET Fine=%d WHERE id=%d LIMIT 1", strval(inputtext), CarRadarSystem[slot][rsRadarID]);
mysql_tquery(MysqlConnectID, string);
format(string, sizeof(string), "Вы изменили сумму штрафа на на $%d", strval(inputtext));
SendClientMessage(playerid, -1, string);
Dialog_Show(playerid, Dialog:RadarSystemEdit);
return 1;
}
public OnPlayerEditDynamicObject(playerid, objectid, response, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz)
{
if(CarRadarSystemPlayer[playerid][crpEditRadar] != 0 && (response == EDIT_RESPONSE_FINAL || response == EDIT_RESPONSE_CANCEL))
{
new slot = CarRadarSystemPlayer[playerid][crpEditRadar]-1;
CarRadarSystemPlayer[playerid][crpEditRadar] = 0;
if(CarRadarSystem[slot][rsRadarID] == 0) return 1;
if(response == EDIT_RESPONSE_CANCEL)
{
SetDynamicObjectPos(objectid, CarRadarSystem[slot][rsPos][0], CarRadarSystem[slot][rsPos][1], CarRadarSystem[slot][rsPos][2]);
SetDynamicObjectRot(objectid, CarRadarSystem[slot][rsPos][3], CarRadarSystem[slot][rsPos][4], CarRadarSystem[slot][rsPos][5]);
}
else if(response == EDIT_RESPONSE_FINAL)
{
new string[74+ 43+10];
CarRadarSystem[slot][rsPos][0] = x;
CarRadarSystem[slot][rsPos][1] = y;
CarRadarSystem[slot][rsPos][2] = z;
CarRadarSystem[slot][rsPos][3] = rx;
CarRadarSystem[slot][rsPos][4] = ry;
CarRadarSystem[slot][rsPos][5] = rz;
SetDynamicObjectPos(objectid, x, y, z);
SetDynamicObjectRot(objectid, rx, ry, rz);
DestroyDynamic3DTextLabel(CarRadarSystem[slot][rsText3D]);
if(CarRadarSystem[slot][rsSpeedLimit] == 0) format(string, sizeof(string), "Радар скорости {00FF00}№%d{FF0000}\nОтключен", slot+1);
else format(string, sizeof(string), "Радар скорости {00FF00}№%d{FFFFFF}\nМаксимальная скорость: {00FF00}%d (км/ч)", slot+1, CarRadarSystem[slot][rsSpeedLimit]);
CarRadarSystem[slot][rsText3D] = CreateDynamic3DTextLabel(string, -1, CarRadarSystem[slot][rsPos][0], CarRadarSystem[slot][rsPos][1], CarRadarSystem[slot][rsPos][2]+6.0, 15.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, CarRadarSystem[slot][rsVirtualWorld], CarRadarSystem[slot][rsInterior], -1, CAR_RADAR_3DTEXT_STREAM_DISTANCE);
mysql_format(MysqlConnectID, string, sizeof(string), "UPDATE radars SET Pos='%.2f,%.2f,%.2f, %.2f,%.2f,%.2f' WHERE id=%d LIMIT 1",
x, y, z, rx, ry, rz,
CarRadarSystem[slot][rsRadarID]);
mysql_tquery(MysqlConnectID, string);
}
return 1;
}
return 1;
}
public OnPlayerEnterDynamicArea(playerid, areaid)
{
if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER && GetPlayerVehicleID(playerid) >= 1)
{
new slot = -1, vehicleid = GetPlayerVehicleID(playerid);
for(new x; x < CAR_RADAR_MAX; x ++)
{
if(CarRadarSystem[x][rsRadarID] == 0) continue;
if(CarRadarSystem[x][rsSphere] != areaid) continue;
if(GetVehicleSpeed(vehicleid) < CarRadarSystem[x][rsSpeedLimit]) break;
slot = x;
break;
}
if(slot != -1)
{
new string[63+10+10+10];
if(GetPlayerMoney(playerid) > CarRadarSystem[slot][rsFine])//вид штрафа.
{
GivePlayerMoney(playerid, -CarRadarSystem[slot][rsFine]);
CarRadarSystem[slot][rsTotalFines] += CarRadarSystem[slot][rsFine];//общая сумма штрафов
if(GetPlayerWantedLevel(playerid) <= 5) SetPlayerWantedLevel(playerid, GetPlayerWantedLevel(playerid)+1); //розыск за нарушение
format(string, sizeof(string), "Вы получили штраф в размере $%d, за превышение скорость на %d км/ч", CarRadarSystem[slot][rsFine], GetVehicleSpeed(vehicleid)-CarRadarSystem[slot][rsSpeedLimit]);
SendClientMessage(playerid, -1, string);
}
else if(GetPlayerWantedLevel(playerid) <= 5) //розыск за нарушение
{
SetPlayerWantedLevel(playerid, GetPlayerWantedLevel(playerid)+1);
SendClientMessage(playerid, -1, "Ва были объявлены в розыск за превышение скорости!");
}
CarRadarSystem[slot][rsTriggers] ++;//количество срабатываний
mysql_format(MysqlConnectID, string, sizeof(string), "UPDATE radars SET Triggers=%d,TotalFines=%d WHERE id=%d LIMIT 1", CarRadarSystem[slot][rsTriggers], CarRadarSystem[slot][rsTotalFines], CarRadarSystem[slot][rsRadarID]);
mysql_tquery(MysqlConnectID, string);
}
}
return 1;
}
Нужны плагины
Сам код
Таблица MySQL
Готово!
Готовый GameMode для теста:
Таблица:
Автор: Bren
Код:
MySQL R41-4
sscanf2
Streamer
Сам код
В самый верх мода
В OnGameModeInit
Загружаем все радары
В OnPlayerEnterDynamicArea
В OnDialogResponse
В самый конец мода добавляем public
И последние 2 stock тоже в конец
Для отображение списка, используйте вызов паблика со следующими значениями:
Необязательная команда для телепорта по радарам
PHP:
#define MAX_RADAR 15// максимальное количество радаров
new RadarValue[MAX_PLAYERS][3], RadarValueLine[MAX_PLAYERS][20], RadarCheck[MAX_RADAR][6], Text3D:RadarText3D[MAX_RADAR], RadarMax;
В OnGameModeInit
Загружаем все радары
PHP:
mysql_tquery(/*тут используйте свою переменную mysql connect, у меня это: */MysqlConnectID, "SELECT * FROM radars", "OnRadarAll", "dd", 0, 0); //загружаем радары
В OnPlayerEnterDynamicArea
PHP:
if(areaid >= RadarCheck[0][4] && areaid <= RadarCheck[RadarMax-1][4] && GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
{
new vehicleid = GetPlayerVehicleID(playerid), slot = -1, string[81];
if(vehicleid <= 0) return 1;
for(new x; x < RadarMax; x ++)//поиск нужного радара. Если у вас много радаров, и вы не желаете использовать цикл. Можете хранить ID радара в отдельной переменной.
{
if(areaid != RadarCheck[x][4]) continue;
slot = x;
break;
}
if(slot == -1 || RadarCheck[slot][0] == 0 || GetVehicleSpeed(vehicleid) < RadarCheck[slot][0]) return 1;
if(GetPlayerMoney(playerid) > RadarCheck[slot][1])//вид штрафа.
{
GivePlayerMoney(playerid, -RadarCheck[slot][1]);
RadarCheck[slot][3] += RadarCheck[slot][1];//общая сумма штрафов
if(GetPlayerWantedLevel(playerid) <= 5) SetPlayerWantedLevel(playerid, GetPlayerWantedLevel(playerid)+1); //розыск за нарушение
format(string, sizeof(string), "Вы получили штраф в размере $%d, за превышение скорость на %d км/ч", RadarCheck[slot][1], GetVehicleSpeed(vehicleid)-RadarCheck[slot][0]);
SendClientMessage(playerid, -1, string);
}
else if(GetPlayerWantedLevel(playerid) <= 5) //розыск за нарушение
{
SetPlayerWantedLevel(playerid, GetPlayerWantedLevel(playerid)+1);
SendClientMessage(playerid, -1, "Вам были объявлены в розыск за превышение скорости!");
}
RadarCheck[slot][2] ++;//количество срабатываний
mysql_format(MysqlConnectID, string, sizeof(string), "UPDATE radars SET Caught=%d,FineAll=%d WHERE id=%d", RadarCheck[slot][2], RadarCheck[slot][3], RadarCheck[slot][5]);
mysql_tquery(MysqlConnectID, string);
}
В OnDialogResponse
PHP:
case 3102:
{
if(!response) return 1;
switch(listitem)
{
case 20:
{
if(RadarValue[playerid][1] >= 1 && RadarValue[playerid][1] == listitem+1 && RadarValue[playerid][0] >= 1)
{
RadarValue[playerid][0] --;
RadarValue[playerid][1] = 0;
}
else RadarValue[playerid][0] ++;
return OnRadarAll(playerid, 1, 0);
}
case 21:
{
if(RadarValue[playerid][0] <= 0) return 1;
RadarValue[playerid][0] --;
return OnRadarAll(playerid, 1, 0);
}
default:
{
if(RadarValue[playerid][1] >= 1 && RadarValue[playerid][1] == listitem+1 && RadarValue[playerid][0] >= 1)
{
RadarValue[playerid][0] --;
RadarValue[playerid][1] = 0;
return OnRadarAll(playerid, 1, 0);
}
RadarValue[playerid][2] = RadarValueLine[playerid][listitem];
return ShowPlayerDialog(playerid, 3103, DIALOG_STYLE_LIST, "Действия", "- Информация о радаре\n- Изменить лимит скорости\n- Изменить штраф за превышение\n- Отметить местонахождение на карте", "Выбрать", "Назад");
}
}
return 1;
}
case 3103:
{
if(!response) return OnRadarAll(playerid, 1, 0);
switch(listitem)
{
case 0:
{
new string[40+10];
format(string, sizeof(string), "SELECT * FROM radars WHERE id=%d LIMIT 1", RadarValue[playerid][2]);
return mysql_tquery(MysqlConnectID, string, "OnRadarAll", "dd", playerid, 3);
}
case 1: return ShowPlayerDialog(playerid, 3104, DIALOG_STYLE_INPUT, "Изменить лимит скорости", "{FFFFFF}Введите новый лимит скорости:\nДля отключение радара используйте число 0", "Дальше", "Назад");
case 2: return ShowPlayerDialog(playerid, 3106, DIALOG_STYLE_INPUT, "Изменить штраф за превышение", "{FFFFFF}Введите новый штраф за превышение:", "Дальше", "Назад");
case 3:
{
for(new x; x < RadarMax; x ++)
{
if(RadarValue[playerid][2] != RadarCheck[x][5]) continue;
new Float:Pos[3];
GetDynamicPos(STREAMER_TYPE_AREA, RadarCheck[x][4], Pos[0], Pos[1], Pos[2]);
SetPlayerCheckpoint(playerid, Pos[0], Pos[1], Pos[2], 6.0);//Контрольная точка не отключается при достижении её. Обычно вы тут должны использовать свою систему GPS
break;
}
return ShowPlayerDialog(playerid, 3107, DIALOG_STYLE_MSGBOX, "Отметить местонахождение на карте", "{FFFFFF}Местонахождение радара отмечено на карте.", "Назад", "Закрыть");
}
}
return 1;
}
case 3104:
{
if(!response) return ShowPlayerDialog(playerid, 3103, DIALOG_STYLE_LIST, "Действия", "- Информация о радаре\n- Изменить лимит скорости\n- Изменить штраф за превышение\n- Отметить местонахождение на карте", "Выбрать", "Назад");
if(strval(inputtext) != 0 && (strval(inputtext) < 60 || strval(inputtext) > 200)) return ShowPlayerDialog(playerid, 3104, DIALOG_STYLE_INPUT, "Изменить лимит скорости", "{FFFFFF}Введите новый лимит скорости:\nДля отключение радара используйте число 0\n{FF0000}Лимит скорости от 60 до 200 км!", "Дальше", "Назад");
for(new x; x < RadarMax; x ++)//обновление скорости
{
if(RadarValue[playerid][2] != RadarCheck[x][5]) continue;
RadarCheck[x][0] = strval(inputtext);
OnRadarAll(playerid, 4, x);//обновление 3DText
break;
}
new string[65];
mysql_format(MysqlConnectID, string, sizeof(string), "UPDATE radars SET SpeedLimit=%d WHERE id=%d", strval(inputtext), RadarValue[playerid][2]);
mysql_tquery(MysqlConnectID, string);
format(string, sizeof(string), "{FFFFFF}Вы изменили лимит скорости на {00FF00}%d {FFFFFF}км", strval(inputtext));
return ShowPlayerDialog(playerid, 3105, DIALOG_STYLE_MSGBOX, "Изменить лимит скорости", string, "Назад", "Закрыть");
}
case 3105:
{
if(!response) return 1;
return OnRadarAll(playerid, 1, 0);
}
case 3106:
{
if(!response) return ShowPlayerDialog(playerid, 3103, DIALOG_STYLE_LIST, "Действия", "- Информация о радаре\n- Изменить лимит скорости\n- Изменить штраф за превышение\n- Отметить местонахождение на карте", "Выбрать", "Назад");
if(strval(inputtext) < 100 || strval(inputtext) > 3000) return ShowPlayerDialog(playerid, 3106, DIALOG_STYLE_INPUT, "Изменить штраф за превышение", "{FFFFFF}Введите новый штраф за превышение:\n{FF0000}Максимальный штраф от $100 до $3 000!", "Дальше", "Назад");
for(new x; x < RadarMax; x ++)//обновление цены штрафа
{
if(RadarValue[playerid][2] != RadarCheck[x][5]) continue;
RadarCheck[x][1] = strval(inputtext);
OnRadarAll(playerid, 4, x);//обновление 3DText
break;
}
new string[63+10];
mysql_format(MysqlConnectID, string, sizeof(string), "UPDATE radars SET Fine=%d WHERE id=%d", strval(inputtext), RadarValue[playerid][2]);
mysql_tquery(MysqlConnectID, string);
format(string, sizeof(string), "{FFFFFF}Вы изменили штраф за превышение скорости на {00FF00}$%d", strval(inputtext));
return ShowPlayerDialog(playerid, 3105, DIALOG_STYLE_MSGBOX, "Изменить штраф за превышение", string, "Назад", "Закрыть");
}
case 3107:
{
if(!response) return 1;
return ShowPlayerDialog(playerid, 3103, DIALOG_STYLE_LIST, "Действия", "- Информация о радаре\n- Изменить лимит скорости\n- Изменить штраф за превышение\n- Отметить местонахождение на карте", "Выбрать", "Назад");
}
В самый конец мода добавляем public
PHP:
forward OnRadarAll(playerid, line, line2);
public OnRadarAll(playerid, line, line2)
{
new rows, slot[6];
switch(line)
{
case 0://загрузка
{
cache_get_row_count(rows);
if(!rows) return print("Радары не загружены!");
new Float:Pos[6], string[100], Range;
for(new x; x < rows; x ++)
{
if(RadarMax >= MAX_RADAR)
{
print(">> MAX_RADAR!!");
break;
}
cache_get_value_name_int(x, "id", RadarCheck[RadarMax][5]);
cache_get_value_name(x, "Pos", string);
sscanf(string, "p<,>a<f>[6]", Pos);
cache_get_value_name_int(x, "Range", Range);
cache_get_value_name_int(x, "SpeedLimit", RadarCheck[RadarMax][0]);
cache_get_value_name_int(x, "Fine", RadarCheck[RadarMax][1]);
cache_get_value_name_int(x, "Caught", RadarCheck[RadarMax][2]);
cache_get_value_name_int(x, "FineAll", RadarCheck[RadarMax][3]);
RadarCheck[RadarMax][4] = CreateDynamicSphere(Pos[0], Pos[1], Pos[2], float(Range), 0, 0);
CreateDynamicObject(18880, Pos[0], Pos[1], Pos[2], Pos[3], Pos[4], Pos[5], 0, 0, -1, 250.0, 250.0);
if(RadarCheck[RadarMax][0] == 0) format(string, sizeof(string), "Радар скорости {00FF00}№%i{FF0000}\nОтключен", RadarMax+1);
else format(string, sizeof(string), "Радар скорости {00FF00}№%i{FFFFFF}\nМаксимальная скорость: {00FF00}%d (км/ч)", RadarMax+1, RadarCheck[RadarMax][0]);
RadarText3D[RadarMax] = CreateDynamic3DTextLabel(string, -1, Pos[0], Pos[1], Pos[2]+6.0, 15.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, 0, 0, -1, 15.0);
RadarMax ++;
}
return printf("-> Загружено %d радаров", RadarMax);
}
case 1://показ списка
{
new string[49+20];
if(line2 == 1)//первый показ с обнулением
{
RadarValue[playerid][0] = 0;
RadarValue[playerid][1] = 0;
}
format(string, sizeof(string), "SELECT id,SpeedLimit,Fine FROM radars LIMIT %d,%d", 20*RadarValue[playerid][0], 20*RadarValue[playerid][0]+21);
return mysql_tquery(MysqlConnectID, string, "OnRadarAll", "dd", playerid, 2);
}
case 2:
{
cache_get_row_count(rows);
if(!rows) return ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Список радаров", "{FFFFFF}Радар не найден!", "Закрыть", "");
new string[50*20 +39+50];
strcat(string, "{FFFFFF}Номер\t{FFFFFF}Скорость\t{FFFFFF}Штраф\t\n");
for(new x; x < rows; x ++)
{
slot[0] ++;
if(slot[0] <= 20)
{
if(x >= rows)
{
if(RadarValue[playerid][0] >= 1)
{
slot[1] = 1;
strcat(string, "< Назад\n");
RadarValue[playerid][1] = slot[0]+1;
}
break;
}
cache_get_value_name_int(x, "id", slot[2]);
cache_get_value_name_int(x, "SpeedLimit", slot[3]);
cache_get_value_name_int(x, "Fine", slot[4]);
if(slot[3] == 0) format(string, sizeof(string), "%s- Радар %d\t{f44747}Отключен\t$%d\n", string, slot[0], slot[4]);
else format(string, sizeof(string), "%s- Радар %d\t%d\t$%d\n", string, slot[0], slot[3], slot[4]);
RadarValueLine[playerid][slot[0]-1] = slot[2];
}
else
{
slot[1] = 1;
if(RadarValue[playerid][0] >= 1) strcat(string, "> Дальше\n< Назад");
else strcat(string, "> Дальше\n");
break;
}
}
if(slot[0] == 0) return ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Список радаров", "{FFFFFF}Радар не найден!", "Закрыть", "");
if(RadarValue[playerid][0] >= 1 && slot[1] == 0)
{
strcat(string, "< Назад\n");
RadarValue[playerid][1] = slot[0]+1;
}
return ShowPlayerDialog(playerid, 3102, DIALOG_STYLE_TABLIST_HEADERS, "Список радаров", string, "Выбрать", "Назад");
}
case 3:
{
cache_get_row_count(rows);
if(!rows) return ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Информация о радаре", "{FFFFFF}Радар не найден!", "Закрыть", "");
new string[201];
cache_get_value_name_int(0, "id", slot[0]);
cache_get_value_name_int(0, "Range", slot[1]);
cache_get_value_name_int(0, "SpeedLimit", slot[2]);
cache_get_value_name_int(0, "Fine", slot[3]);
cache_get_value_name_int(0, "Caught", slot[4]);
cache_get_value_name_int(0, "FineAll", slot[5]);
format(string, sizeof(string),
"{FFFFFF}Номер радара\t\t%d\n\
Радиус действия\t%d метров\n\
Лимит скорости\t%d\n\
Штраф за превышения\t$%d\n\
Сработал\t\t%d раз(a)\n\
Общяя сумма штрафов\t$%d",
slot[0], slot[1], slot[2], slot[3], slot[4], slot[5]);
return ShowPlayerDialog(playerid, 3107, DIALOG_STYLE_MSGBOX, "Информация о радаре", string, "Назад", "Закрыть");
}
case 4://обновление 3dText
{
new string[82];
if(RadarCheck[line2][0] == 0) format(string, sizeof(string), "Радар скорости {00FF00}№%i{FF0000}\nОтключен", line2+1);
else format(string, sizeof(string), "Радар скорости {00FF00}№%i{FFFFFF}\nМаксимальная скорость: {00FF00}%d (км/ч)", line2+1, RadarCheck[line2][0]);
return UpdateDynamic3DTextLabelText(RadarText3D[line2], -1, string);
}
}
return 1;
}
И последние 2 stock тоже в конец
PHP:
stock GetDynamicPos(type, id, &Float:x, &Float:y, &Float:z)
{
Streamer_GetFloatData(type, id, E_STREAMER_X, x);
Streamer_GetFloatData(type, id, E_STREAMER_Y, y);
return Streamer_GetFloatData(type, id, E_STREAMER_Z, z);
}
stock GetVehicleSpeed(vehicleid)
{
if(vehicleid <= 0) return 0;
new Float:Pos[3];
GetVehicleVelocity(vehicleid, Pos[0], Pos[1], Pos[2]);
return floatround(floatsqroot(((Pos[0]*Pos[0])+(Pos[1]*Pos[1]))+(Pos[2]*Pos[2]))*180.0);
}
Для отображение списка, используйте вызов паблика со следующими значениями:
PHP:
OnRadarAll(playerid, 1, 1);
Необязательная команда для телепорта по радарам
PHP:
CMD:tpradar(playerid, params[])// Pawn.CMD
{
if(sscanf(params, "d", params[0])) return SendClientMessage(playerid, -1, "/tpradar [id радара]");
if(params[0] < 1 || params[0] > RadarMax) return SendClientMessage(playerid, -1, "Неверный ID радара! от 1 ++");
new Float:Pos[3];
GetDynamicPos(STREAMER_TYPE_AREA, RadarCheck[params[0]-1][4], Pos[0], Pos[1], Pos[2]);
return SetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
}
Таблица MySQL
PHP:
CREATE TABLE `radars` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`Pos` varchar(80) NOT NULL COMMENT 'x, y, z, rx, ry, rz',
`Range` int(2) NOT NULL DEFAULT '20' COMMENT 'радиус действия',
`SpeedLimit` int(3) NOT NULL DEFAULT '105' COMMENT 'лимит скорости',
`Fine` int(10) NOT NULL DEFAULT '100' COMMENT 'сумма штрафа',
`Caught` int(10) NOT NULL DEFAULT '0' COMMENT 'Общие количество нарушений',
`FineAll` int(10) NOT NULL DEFAULT '0' COMMENT 'Общяя сумма штрафов',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Готово!
Готовый GameMode для теста:
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Таблица:
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Автор: Bren
Автор: Bren
Вложения
-
25.9 KB Просмотры: 25
Последнее редактирование:
