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

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

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

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

Мануал Управляемые авиационные бомбы для Beagle

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

<BaRReT[T]>

Новичок
Сделал управляемые авиабомбы для самолёта "Beagle". Всего 4 бомбы, реализовано с помощью кликабельных текстдравов.

Подвесок под бомбы (макс. кол-во бомб): 4
Количество одновременно отображаемых целей: 6
Дальность обнаружения цели: 500

Видео:

И так, сам код:

Ко всем define:

Код:
#define MAX_JETS 10
#define MAX_LANDVEH 100
Ко всем forward:

Код:
forward SecondTimer();
К текстдравам:

Код:
new Text:Textdraw0[MAX_PLAYERS];
new Text:Textdraw1[MAX_PLAYERS];
new Text:Textdraw2[MAX_PLAYERS][5];
new Text:Textdraw7[MAX_PLAYERS];
К глобальным переменным:

Код:
enum jInfo    {
	Jet,
	Rockets[4],
	Rocket,
	Target[6],
	Target2[4],
	Targets,
	RStatus[4],
	RImpulse[4]
};
enum cInfo  {
	Aiming
};
new CarInfo[MAX_LANDVEH][cInfo];
new JetInfo[MAX_JETS][jInfo];
new JetID[MAX_JETS];
new Timer;
new LandVeh[MAX_LANDVEH];
new VehName[212][] = {
	"Landstalker","Bravura","Buffalo","Linerunner","Perrenial","Sentinel","Dumper","Firetruck","Trashmaster","Stretch","Manana","Infernus",
	"Voodoo","Pony","Mule","Cheetah","Ambulance","Leviathan","Moonbeam","Esperanto","Taxi","Washington","Bobcat","Mr.Whoopee","BF Injection",
	"Hunter","Premier","Enforcer","Securicar","Banshee","Predator","Bus","Rhino","Barracks","Hotknife","Trailer","Previon","Coach","Cabbie",
	"Stallion","Rumpo","RC Bandit","Romero","Packer","Monster","Admiral","Squalo","Seasparrow","Pizzaboy","Tram","Trailer","Turismo","Speeder",
	"Reefer","Tropic","Flatbed","Yankee","Caddy","Solair","Berkley's RC Van","Skimmer","PCJ-600","Faggio","Freeway","RC Barron","RC Raider",
	"Glendale","Oceanic","Sanchez","Sparrow","Patriot","Quad","Coastguard","Dinghy","Hermes","Sabre","Rustler","Zr-350","Walton","Regina",
	"Comet","BMX","Burrito","Camper","Marquis","Baggage","Dozer","Maverick","News Chopper","Rancher","FBI Rancher","Virgo","Greenwood",
	"Jetmax","Hotring","Sandking","Blista Compact","Police Maverick","Boxville","Benson","Mesa","RC Goblin","Hotring A","Hotring B",
	"Bloodring Banger","Rancher","Super GT","Elegant","Journey","Bike","Mountain Bike","Beagle","Cropdust","Stunt","Tanker","RoadTrain",
	"Nebula","Majestic","Buccaneer","Shamal","Hydra","FCR-900","NRG-500","HPV1000","Cement Truck","Tow Truck","Fortune","Cadrona","FBI Truck",
	"Willard","Forklift","Tractor","Combine","Feltzer","Remington","Slamvan","Blade","Freight","Streak","Vortex","Vincent","Bullet","Clover",
	"Sadler","Firetruck","Hustler","Intruder","Primo","Cargobob","Tampa","Sunrise","Merit","Utility","Nevada","Yosemite","Windsor","Monster A",
	"Monster B","Uranus","Jester","Sultan","Stratum","Elegy","Raindance","RC Tiger","Flash","Tahoma","Savanna","Bandito","Freight","Trailer",
	"Kart","Mower","Duneride","Sweeper","Broadway","Tornado","AT-400","DFT-30","Huntley","Stafford","BF-400","Newsvan","Tug","Trailer A","Emperor",
	"Wayfarer","Euros","Hotdog","Club","Trailer B","Trailer C","Andromada","Dodo","RC Cam","Launch","Police Car","Police Car",
	"Police Car","Police Ranger","Picador","S.W.A.T.","Alpha","Phoenix","Glendale","Sadler","L Trailer A","L Trailer B",
	"Stair Trailer","Boxville","Farm Plow","U Trailer"
};
new IsInJet[MAX_PLAYERS];
А так же нам понадобятся следующие функции:

Код:
stock Float:GetPointAngleToPoint(Float:x1, Float:y1, Float:x2, Float:y2)
{
    return -atan2(x1 - x2,y1 - y2);
}
stock Float:GetPointDistanceToPointEx(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2)
{
    return floatsqroot(floatpower(floatabs(floatsub(x2, x1)), 2) + floatpower(floatabs(floatsub(y2, y1)), 2) + floatpower(floatabs(floatsub(z2, z1)), 2));
}
stock IsPointInSphere(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2, radius)
{
    return (GetPointDistanceToPointEx(x1, y1, z1, x2, y2, z2) < radius);
}
stock IsALand(vid)
{
	if(!IsAPlane(vid) && !IsABoat(vid)) return 1;
	return 0;
}
stock IsAPlane(vid)
{
	switch(GetVehicleModel(vid))
	{
	    case 417,425,447,460,469,476,487,488,497,511..513,519,520,548,553,563,577,592,593: return 1;
	}
	return 0;
}
stock IsABoat(vid)
{
	switch(GetVehicleModel(vid))
	{
	    case 472,473,493,495,484,430,453,452,446,454:return 1;
	}
	return 0;
}
В OnPlayerKeyStateChange:

Код:
	if(newkeys == 128)
	{
	    if(GetVehicleModel(GetPlayerVehicleID(playerid)) == 511) SelectTextDraw(playerid, 0xFF0000FF);
	}
В OnPlayerStateChange:

Код:
if(newstate == PLAYER_STATE_DRIVER)
	{
	    if(GetVehicleModel(GetPlayerVehicleID(playerid)) == 511)
	    {
	        IsInJet[playerid] = GetPlayerVehicleID(playerid);
	        TextDrawShowForPlayer(playerid,Textdraw0[playerid]);
	        TextDrawShowForPlayer(playerid,Textdraw1[playerid]);
	        TextDrawShowForPlayer(playerid,Textdraw2[playerid][0]);
	        TextDrawShowForPlayer(playerid,Textdraw2[playerid][1]);
	        TextDrawShowForPlayer(playerid,Textdraw2[playerid][2]);
	        TextDrawShowForPlayer(playerid,Textdraw2[playerid][3]);
	        TextDrawShowForPlayer(playerid,Textdraw2[playerid][4]);
	        TextDrawShowForPlayer(playerid,Textdraw7[playerid]);
		}
	}
	else if(oldstate == PLAYER_STATE_DRIVER)
	{
	    if(IsInJet[playerid])
	    {
	        IsInJet[playerid] = 0;
	        TextDrawHideForPlayer(playerid,Textdraw0[playerid]);
	        TextDrawHideForPlayer(playerid,Textdraw1[playerid]);
	        TextDrawHideForPlayer(playerid,Textdraw2[playerid][0]);
	        TextDrawHideForPlayer(playerid,Textdraw2[playerid][1]);
	        TextDrawHideForPlayer(playerid,Textdraw2[playerid][2]);
	        TextDrawHideForPlayer(playerid,Textdraw2[playerid][3]);
	        TextDrawHideForPlayer(playerid,Textdraw2[playerid][4]);
	        TextDrawHideForPlayer(playerid,Textdraw7[playerid]);
		}
	}
В OnGameModeInit включим таймер и создадим несколько машин для теста:

Код:
	Timer = SetTimer("SecondTimer",200,1);
	LandVeh[0] = CreateVehicle(520,50,50,10,0,6,2,600);
	LandVeh[1] = CreateVehicle(402,50,70,10,0,6,2,600);
	LandVeh[2] = CreateVehicle(402,50,90,10,0,6,2,600);
	LandVeh[3] = CreateVehicle(403,50,100,10,0,6,2,600);
	LandVeh[4] = CreateVehicle(404,50,110,10,0,6,2,600);
	LandVeh[5] = CreateVehicle(472,-50,90,10,0,6,2,600);
	LandVeh[6] = CreateVehicle(404,-40,90,10,0,6,2,600);
	LandVeh[7] = CreateVehicle(405,-45,90,10,0,6,2,600);
ps, всю наземную технику желательно добавлять в LandVeh. Делал этот скрипт давно, и уже не помню зачем так сделал xD

В OnPlayerConnect:

Код:
Textdraw0[playerid] = TextDrawCreate(440.000000, 130.000000, "1");
	TextDrawBackgroundColor(Textdraw0[playerid], 255);
	TextDrawFont(Textdraw0[playerid], 1);
	TextDrawLetterSize(Textdraw0[playerid], 0.000000, 15.000000);
	TextDrawColor(Textdraw0[playerid], -1);
	TextDrawSetOutline(Textdraw0[playerid], 0);
	TextDrawSetProportional(Textdraw0[playerid], 1);
	TextDrawSetShadow(Textdraw0[playerid], 1);
	TextDrawUseBox(Textdraw0[playerid], 1);
	TextDrawBoxColor(Textdraw0[playerid], 120);
	TextDrawTextSize(Textdraw0[playerid], 600.000000, 0.000000);

	Textdraw1[playerid] = TextDrawCreate(440.000000, 130.000000, "_____Targets");
	TextDrawBackgroundColor(Textdraw1[playerid], 255);
	TextDrawFont(Textdraw1[playerid], 2);
	TextDrawLetterSize(Textdraw1[playerid], 0.500000, 2.000000);
	TextDrawColor(Textdraw1[playerid], -1);
	TextDrawSetOutline(Textdraw1[playerid], 0);
	TextDrawSetProportional(Textdraw1[playerid], 1);
	TextDrawSetShadow(Textdraw1[playerid], 1);
	TextDrawUseBox(Textdraw1[playerid], 1);
	TextDrawBoxColor(Textdraw1[playerid], 255);
	TextDrawTextSize(Textdraw1[playerid], 600.000000, 0.000000);

	Textdraw2[playerid][0] = TextDrawCreate(440.000000, 170.000000, "Not found");
	TextDrawBackgroundColor(Textdraw2[playerid][0], 255);
	TextDrawFont(Textdraw2[playerid][0], 2);
	TextDrawLetterSize(Textdraw2[playerid][0], 0.300000, 1.000000);
	TextDrawColor(Textdraw2[playerid][0], -1);
	TextDrawSetOutline(Textdraw2[playerid][0], 0);
	TextDrawSetProportional(Textdraw2[playerid][0], 1);
	TextDrawSetShadow(Textdraw2[playerid][0], 1);
	TextDrawUseBox(Textdraw2[playerid][0], 1);
	TextDrawBoxColor(Textdraw2[playerid][0], 255);
	TextDrawTextSize(Textdraw2[playerid][0], 600.000000, 10.0);

	Textdraw2[playerid][1] = TextDrawCreate(440.000000, 184.000000, "Not found");
	TextDrawBackgroundColor(Textdraw2[playerid][1], 255);
	TextDrawFont(Textdraw2[playerid][1], 2);
	TextDrawLetterSize(Textdraw2[playerid][1], 0.300000, 1.000000);
	TextDrawColor(Textdraw2[playerid][1], -1);
	TextDrawSetOutline(Textdraw2[playerid][1], 0);
	TextDrawSetProportional(Textdraw2[playerid][1], 1);
	TextDrawSetShadow(Textdraw2[playerid][1], 1);
	TextDrawUseBox(Textdraw2[playerid][1], 1);
	TextDrawBoxColor(Textdraw2[playerid][1], 255);
	TextDrawTextSize(Textdraw2[playerid][1], 600.000000, 10.0);

	Textdraw2[playerid][2] = TextDrawCreate(440.000000, 198.000000, "Not found");
	TextDrawBackgroundColor(Textdraw2[playerid][2], 255);
	TextDrawFont(Textdraw2[playerid][2], 2);
	TextDrawLetterSize(Textdraw2[playerid][2], 0.300000, 1.000000);
	TextDrawColor(Textdraw2[playerid][2], -1);
	TextDrawSetOutline(Textdraw2[playerid][2], 0);
	TextDrawSetProportional(Textdraw2[playerid][2], 1);
	TextDrawSetShadow(Textdraw2[playerid][2], 1);
	TextDrawUseBox(Textdraw2[playerid][2], 1);
	TextDrawBoxColor(Textdraw2[playerid][2], 255);
	TextDrawTextSize(Textdraw2[playerid][2], 600.000000, 10.0);

	Textdraw2[playerid][3] = TextDrawCreate(440.000000, 212.000000, "Not found");
	TextDrawBackgroundColor(Textdraw2[playerid][3], 255);
	TextDrawFont(Textdraw2[playerid][3], 2);
	TextDrawLetterSize(Textdraw2[playerid][3], 0.300000, 1.000000);
	TextDrawColor(Textdraw2[playerid][3], -1);
	TextDrawSetOutline(Textdraw2[playerid][3], 0);
	TextDrawSetProportional(Textdraw2[playerid][3], 1);
	TextDrawSetShadow(Textdraw2[playerid][3], 1);
	TextDrawUseBox(Textdraw2[playerid][3], 1);
	TextDrawBoxColor(Textdraw2[playerid][3], 255);
	TextDrawTextSize(Textdraw2[playerid][3], 600.000000, 10.0);

	Textdraw2[playerid][4] = TextDrawCreate(440.000000, 226.000000, "Not found");
	TextDrawBackgroundColor(Textdraw2[playerid][4], 255);
	TextDrawFont(Textdraw2[playerid][4], 2);
	TextDrawLetterSize(Textdraw2[playerid][4], 0.300000, 1.000000);
	TextDrawColor(Textdraw2[playerid][4], -1);
	TextDrawSetOutline(Textdraw2[playerid][4], 0);
	TextDrawSetProportional(Textdraw2[playerid][4], 1);
	TextDrawSetShadow(Textdraw2[playerid][4], 1);
	TextDrawUseBox(Textdraw2[playerid][4], 1);
	TextDrawBoxColor(Textdraw2[playerid][4], 255);
	TextDrawTextSize(Textdraw2[playerid][4], 600.000000, 10.0);

	Textdraw7[playerid] = TextDrawCreate(440.000000, 252.000000, "Rockets: 4");
	TextDrawBackgroundColor(Textdraw7[playerid], 255);
	TextDrawFont(Textdraw7[playerid], 2);
	TextDrawLetterSize(Textdraw7[playerid], 0.300000, 1.000000);
	TextDrawColor(Textdraw7[playerid], -1);
	TextDrawSetOutline(Textdraw7[playerid], 0);
	TextDrawSetProportional(Textdraw7[playerid], 1);
	TextDrawSetShadow(Textdraw7[playerid], 1);
	TextDrawUseBox(Textdraw7[playerid], 1);
	TextDrawBoxColor(Textdraw7[playerid], 255);
	TextDrawTextSize(Textdraw7[playerid], 600.000000, 0.000000);
	
	TextDrawSetSelectable(Textdraw2[playerid][0], true);
	TextDrawSetSelectable(Textdraw2[playerid][1], true);
	TextDrawSetSelectable(Textdraw2[playerid][2], true);
	TextDrawSetSelectable(Textdraw2[playerid][3], true);
	TextDrawSetSelectable(Textdraw2[playerid][4], true);
В любое место, главное не в другую функцию/паблик:

Код:
public SecondTimer()
{
	new Float:x,Float:y,Float:z;
	new Float:x1,Float:y1,Float:z1;
	new jetid;
	for(new i=0;i<MAX_JETS;i++)
	{
	    for(new a=0;a<4;a++)
	    {
	        if(JetInfo[i][RStatus][a] != 1) continue;
			GetObjectPos(JetInfo[i][Rockets][a],x,y,z);
			GetVehiclePos(JetInfo[i][Target2][a],x1,y1,z1);
			JetInfo[i][RImpulse][a] -= 0.5;
			
			new Float:angle[2];
			angle[0] = 90-GetPointAngleToPoint(y,z,y1,z1);
			angle[1] = 270+GetPointAngleToPoint(x,y,x1,y1);
			SetObjectRot(JetInfo[i][Rockets][a],0,angle[0],angle[1]);
			MoveObject(JetInfo[i][Rockets][a],x1,y1,z1,80);
			
			if(JetInfo[i][RImpulse][a] < 1)
			{
			    JetInfo[i][RStatus][a] = 2;
			    JetInfo[i][Target2][a] = 0;
				DestroyObject(JetInfo[i][Rockets][a]);
				CreateExplosion(x,y,z,6,5.0);
			}
			if(GetPointDistanceToPointEx(x1,y1,z1,x,y,z) < 15)
			{
			    JetInfo[i][RStatus][a] = 2;
			    JetInfo[i][Target2][a] = 0;
				DestroyObject(JetInfo[i][Rockets][a]);
				CreateExplosion(x,y,z,6,5.0);
			}
		}
	}
	for(new playerid=0;playerid<MAX_PLAYERS;playerid++)
	{
	    if(!IsPlayerConnected(playerid) || GetVehicleModel(GetPlayerVehicleID(playerid)) != 511) continue;
		jetid = JetID[GetPlayerVehicleID(playerid)];
		GetVehiclePos(GetPlayerVehicleID(playerid),x1,y1,z1);
		for(new i=0;i<6;i++)
		{
			if(!JetInfo[jetid][Target][i])
			{
			    for(new a=0;a<MAX_LANDVEH;a++)
			    {
			        if(!IsALand(LandVeh[a])) continue;
			        GetVehiclePos(LandVeh[a],x,y,z);
			        if(IsPointInSphere(x,y,z,x1,y1,z1,500) && CarInfo[LandVeh[a]][Aiming] != GetPlayerVehicleID(playerid))
			        {
                        CarInfo[LandVeh[a]][Aiming] = GetPlayerVehicleID(playerid);
						JetInfo[jetid][Target][i] = LandVeh[a];

						new str[64];
						format(str,sizeof(str), "%d. %s(%d)",i+1,VehName[GetVehicleModel(LandVeh[a])-400],floatround(GetPointDistanceToPointEx(x,y,z,x1,y1,z1)));
						TextDrawSetString(Textdraw2[playerid][i],str);
						break;
					}
				}
			}
			else
			{
   				GetVehiclePos(JetInfo[jetid][Target][i],x,y,z);
       			if(IsPointInSphere(x,y,z,x1,y1,z1,500))
		        {
					new str[64];
					format(str,sizeof(str), "%d. %s(%d)",i+1,VehName[GetVehicleModel(JetInfo[jetid][Target][i])-400],floatround(GetPointDistanceToPointEx(x,y,z,x1,y1,z1)));
					TextDrawSetString(Textdraw2[playerid][i],str);
				}
				else
				{
				    TextDrawSetString(Textdraw2[playerid][i],"Not Found");
        			CarInfo[JetInfo[jetid][Target][i]][Aiming] = -1;
					JetInfo[jetid][Target][i] = -1;
				}
			}
		}
	}
	return 1;
}
В OnPlayerClickTextDraw:

Код:
if(_:clickedid != INVALID_TEXT_DRAW)
 	{
 	    for(new i=0;i<6;i++)
		{
			if(clickedid == Textdraw2[playerid][i])
    		{
    		    new jit = JetID[GetPlayerVehicleID(playerid)];
				if(!JetInfo[jit][Target][i]) return SendClientMessage(playerid,-1,"Цель не найдена!");
				new Float:x,Float:y,Float:z;
				GetVehiclePos(JetInfo[jit][Target][i],x,y,z);
				new Float:x1,Float:y1,Float:z1,Float:r;
				GetVehiclePos(JetInfo[jit][Jet],x1,y1,z1);
				if(z1 < 50) return SendClientMessage(playerid,-1,"Слишком маленькая высота!");
				GetVehicleZAngle(JetInfo[jit][Jet],r);
				for(new a=0;a<4;a++)
				{
				    if(JetInfo[jit][RStatus][a]) continue;
				    new str[16];
				    JetInfo[jit][Target2][a] = JetInfo[jit][Target][i];
				    JetInfo[jit][RStatus][a] = 1;
				    JetInfo[jit][Rocket]--;
				    JetInfo[jit][RImpulse][a] = 100;
				    DestroyObject(JetInfo[jit][Rockets][a]);
					new Float:angle;
					angle = 90-GetPointAngleToPoint(y,z,y1,z1);
                    JetInfo[jit][Rockets][a] = CreateObject(3786,x1,y1,z1-2,0,angle,GetPointAngleToPoint(x,y,x1,y1)+270);
				    format(str,sizeof(str), "Rockets: %d",JetInfo[jit][Rocket]);
				    
				    TextDrawSetString(Textdraw7[playerid],str);
					MoveObject(JetInfo[jit][Rockets][a],x,y,z,80);
					break;
				}
    		}
		}
	}
Тестовая команда для создания самолёта с готовыми авиабомбами, с помощью неё сможете сами реализовать добавление самолётов в игру:

Код:
CMD:cjet(playerid,params[])
{
	GivePlayerWeapon(playerid,24,5);
	new Float:x,Float:y,Float:z,Float:r;
	GetPlayerFacingAngle(playerid,r);
	GetPlayerPos(playerid,x,y,z);
	for(new i=0;i<MAX_JETS;i++)
	{
	    if(!JetInfo[i][Jet])
	    {
	        JetInfo[i][Jet] = CreateVehicle(511,x,y,z,r,0,0,600);
	        JetID[JetInfo[i][Jet]] = i;
	        JetInfo[i][Rocket] = 4;
	        JetInfo[i][Rockets][0] = CreateObject(3786,0,0,0,0,0,0);
	        JetInfo[i][Rockets][1] = CreateObject(3786,0,0,0,0,0,0);
	        JetInfo[i][Rockets][2] = CreateObject(3786,0,0,0,0,0,0);
	        JetInfo[i][Rockets][3] = CreateObject(3786,0,0,0,0,0,0);
			
			JetInfo[i][RStatus][0] = 0;
			JetInfo[i][RStatus][1] = 0;
			JetInfo[i][RStatus][2] = 0;
			JetInfo[i][RStatus][3] = 0;
			
			AttachObjectToVehicle(JetInfo[i][Rockets][0],JetInfo[i][Jet],5.4,-0.8,0,0,178,90);
			AttachObjectToVehicle(JetInfo[i][Rockets][1],JetInfo[i][Jet],8.4,-0.8,0,0,178,90);
			AttachObjectToVehicle(JetInfo[i][Rockets][2],JetInfo[i][Jet],-5.4,-0.8,0,0,178,90);
			AttachObjectToVehicle(JetInfo[i][Rockets][3],JetInfo[i][Jet],-8.4,-0.8,0,0,178,90);
			PutPlayerInVehicle(playerid,JetInfo[i][Jet],0);
			break;
		}
	}
	return 1;
}
ps, забыл сказать, для работы потребуются инклуды: zcmd и sscanf

Всё, пробуйте :bu:
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу