Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Мануал Система радаров

Статус
В этой теме нельзя размещать новые ответы.

Сергей|DEMON91052

Компетентный
Всем привет когда то я писал систему радаров, сейчас решил поделится ею. Радаров можно добавлять из самой игры через команду.

Для работы системы нам понадобятся два плагина, 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;
}
Это запрос в базу данных, для того что бы загрузить радары, обычно ее добавляют в OnGameModeInit :
PHP:
mysql_function_query(mysql,"SELECT * FROM "TOTAL_RADAR"", true, "OnLoadRadarCallback", "");
Этот код отвечает за добавление самих радаров. Вставляем в OnPlayerEditObject :
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;
}
Вот таблица SQL (Огромное спасибо Brendan )
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;
Если что то будет не понятно то пишите отвечу. Тему создавал через телефон, т.е. все вырезки и т.д. через него же. А почему через телефон, а потому что я в армии!
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу