Сергей|DEMON91052
Компетентный
Всем привет когда то я писал систему радаров, сейчас решил поделится ею. Радаров можно добавлять из самой игры через команду.
Для работы системы нам понадобятся два плагина, streamer, mysql r-38, scanff и командный процессор ( они в принципе одинаковые)
Ну начнем!!))
В начало мода:
В OnPlayerDisconnect :
Это загрузка радара из базы данных:
Если у Вас есть эти коллбеки то просто добавте содержимое если нету то просто вставьте эти строки:
Это запрос в базу данных, для того что бы загрузить радары, обычно ее добавляют в OnGameModeInit :
Этот код отвечает за добавление самих радаров. Вставляем в OnPlayerEditObject :
Этот коллбэк отвечает за саму выдачу штрафа, просто вставьте в конец мода:
Вот и сама команда для добавления радара, у меня она написана на командном процессоре + scanff
Вот таблица SQL (Огромное спасибо Brendan )
Если что то будет не понятно то пишите отвечу. Тему создавал через телефон, т.е. все вырезки и т.д. через него же. А почему через телефон, а потому что я в армии!
Для работы системы нам понадобятся два плагина, streamer, mysql r-38, scanff и командный процессор ( они в принципе одинаковые)
Ну начнем!!))
В начало мода:
PHP:
#define MAX_RADARS 50
#define publics:%0(%1) forward %0(%1); public %0(%1)
#define SFCM(%0,%1,%2) do{ new msg[141]; format(msg,141,%2); SendClientMessage(%0,%1,msg); } while(FALSE)
#define SCM SendClientMessage
#define TOTAL_RADAR "`radar`"
new RadarIterator[MAX_RADARS];
new radariter;
#define foreachRadar(%0) for(new _i, %0=RadarIterator[_i]; _i <radariter; %0=RadarIterator[++_i])
enum rInfo{
rid,
Float:rX,
Float:rY,
Float:rZ,
Float:rRZ,
Float:rR,
rSpeed,
rObj
};
new RadarInfo[MAX_RADARS][rInfo];
new TOTALRADAR;
new RadarTimer[MAX_PLAYERS];
new RadarShtraf[MAX_PLAYERS];
new RadarMaxSpeed[MAX_RADARS];
В OnPlayerDisconnect :
PHP:
if(RadarTimer[playerid]!=0){
RadarShtraf[playerid] = 0;
KillTimer(RadarTimer[playerid]);
}
PHP:
publics: OnLoadRadarCallback()
{
new time = GetTickCount();
new r, f;
cache_get_data(r, f);
for(new i = 0; i < r; i++)
{
RadarInfo[i][rid] = cache_get_field_content_int(i, "id", mysql);
RadarInfo[i][rX] = cache_get_field_content_float(i, "x", mysql);
RadarInfo[i][rY] = cache_get_field_content_float(i, "y", mysql);
RadarInfo[i][rZ] = cache_get_field_content_float(i, "z", mysql);
RadarInfo[i][rRZ] = cache_get_field_content_float(i, "rz", mysql);
RadarInfo[i][rR] = cache_get_field_content_float(i, "rad", mysql);
RadarInfo[i][rSpeed] = cache_get_field_content_int(i, "speed", mysql);
RadarInfo[i][rObj] = CreateObject(18880, RadarInfo[i][rX], RadarInfo[i][rY], RadarInfo[i][rZ], 0.0, 0.0, RadarInfo[i][rRZ]);
new int = CreateDynamicSphere(RadarInfo[i][rX], RadarInfo[i][rY], RadarInfo[i][rZ], RadarInfo[i][rR], 0, 0, -1);
//Iter_Add(RadarIterator, int);
RadarIterator[radariter++]=int;
RadarMaxSpeed[int]=RadarInfo[i][rSpeed];
TOTALRADAR++;
}
printf("[Загрузка: %d радаров, потрачено %d (ms)", TOTALRADAR,GetTickCount() - time);
return 1;
}
Если у Вас есть эти коллбеки то просто добавте содержимое если нету то просто вставьте эти строки:
PHP:
public OnPlayerEnterDynamicArea(playerid, areaid)
{
foreachRadar(i)
{
if(areaid == i)
{
if(IsPlayerInAnyVehicle(playerid) && GetPlayerState(playerid) == 2)
{
//if(IsAPlane(GetPlayerVehicleID(playerid)) || IsABoat(GetPlayerVehicleID(playerid)) || IsABike(GetPlayerVehicleID(playerid))) break; // это условие проверяет не сидите ли вы в самолете, лодке или велике!!!
RadarTimer[playerid] = SetTimerEx("CallBackRadar",500,true,"ii",playerid,areaid);
}
break;
}
}
return true;
}
public OnPlayerLeaveDynamicArea(playerid, areaid)
{
foreachRadar(i){
if(areaid == i){
RadarShtraf[playerid] = 0;
KillTimer(RadarTimer[playerid]);
break;
}
}
return true;
}
PHP:
mysql_function_query(mysql,"SELECT * FROM "TOTAL_RADAR"", true, "OnLoadRadarCallback", "");
PHP:
if(response == EDIT_RESPONSE_FINAL){// player clicked on savе
if(GetPVarInt(playerid, "addrad") == 1){
RadarInfo[TOTALRADAR][rid] = TOTALRADAR;
RadarInfo[TOTALRADAR][rX] = fX;
RadarInfo[TOTALRADAR][rY] = fY;
RadarInfo[TOTALRADAR][rZ] = fZ;
RadarInfo[TOTALRADAR][rRZ] = fRotZ;
RadarInfo[TOTALRADAR][rSpeed] = GetPVarInt(playerid, "speed");
mysql_format(mysql, MySqlStr, sizeof(MySqlStr), "INSERT INTO "TOTAL_RADAR" (`x`, `y`, `z`, `rz`, `speed`) VALUES ('%f', '%f', '%f', '%f', '%i')",fX,fY,fZ,fRotZ,RadarInfo[TOTALRADAR][rSpeed]);
mysql_function_query(mysql, MySqlStr, true, "", "");
new int = CreateDynamicSphere(fX,fY,fZ, 100, 0, 0, -1);
//Iter_Add(RadarIterator, int);
RadarIterator[radariter++]=int;
RadarMaxSpeed[int] = RadarInfo[TOTALRADAR][rSpeed];
DeletePVar(playerid, "addrad");
DeletePVar(playerid, "speed");
}
}
else if(response == EDIT_RESPONSE_CANCEL){// player cancelled (ESC)
DestroyObject(objectid);
if(GetPVarInt(playerid, "addrad")==1) {
TOTALRADAR--;
DeletePVar(playerid, "addrad");
DeletePVar(playerid, "speed");
}
}
else if(response == EDIT_RESPONSE_UPDATE){// player moved the object (edition did not stop at all)
SetObjectPos(objectid, fX, fY, fZ);
SetObjectRot(objectid, fRotX, fRotY, fRotZ);
}
PHP:
publics: CallBackRadar(playerid,area){
if(RadarShtraf[playerid] == 0){
if(IsACop(playerid) && PlayerInfo[playerid][pMember] == 4) return true; // проверяем в какой организации находится игрок
new speed = SpeedVehicle(playerid); // записываем в переменную скорость автомобиля (возможно у Вас будет другая функция на скорость автомобиля)
if(speed >= RadarMaxSpeed[area]+10){
new shtraf = ( speed - RadarMaxSpeed[area]) * RadarMaxSpeed[area]; // вычисление штрафа, скорость авто вычитаем от максимальной скорости и все это умножаем на максимальную скорость. Пример: скорость = 100, а максимальная на данном участке 60, штраф будет 2400 вирт.
PlayerInfo[playerid][pCash] -= shtraf; // отнимвем у игрока деньги за шраф
RadarShtraf[playerid] = 1; // это для того что бы повторно не выписало нам штраф)
SFCM(playerid,-1,"[ДПС] Вы нарушили скоростной режим на %d м/ч. Штраф: %d!",speed-RadarMaxSpeed[area],shtraf); // сообщаем игроку о штрафе.
}
}
return true;
}
Вот и сама команда для добавления радара, у меня она написана на командном процессоре + scanff
PHP:
CMD:addradar(playerid, params[]){
if(AdLevel[playerid] < 1) return true; // проверяем есть ли у игрока админ права
if(sscanf(params, "i", params[0])) return SCM(playerid, COLOR_GREY, "{F74848}» Введите{FFFFFF}: /addradar [скорость]");
new Float:X, Float:Y, Float:Z;
SetPVarInt(playerid, "addrad", 1);
SetPVarInt(playerid, "speed", params[0]);
GetPlayerPos(playerid, X, Y, Z);
TOTALRADAR++;
RadarInfo[TOTALRADAR][rObj] = CreateObject(18880, X+1, Y+1, Z+1, 0.0,0.0,0.0);
EditObject(playerid, RadarInfo[TOTALRADAR][rObj]);
return true;
}
PHP:
CREATE TABLE IF NOT EXISTS `radar` (
`rid` int(11) NOT NULL,
`rX` float NOT NULL,
`rY` float NOT NULL,
`rZ` float NOT NULL,
`rRZ` float NOT NULL,
`rR` float NOT NULL,
`rSpeed` int(11) NOT NULL,
`rObj` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Последнее редактирование:
