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

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

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

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

Мануал Бот истребитель + ПВО.

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

Caypеn

Компетентный
Уже почти год в очень узком кругу известно о 302-ух моих ботах которые я писал для себя и своих знакомых чтобы просто хорошо провести время и вот сегодня когда почти готов новый вид ботов не занимающих слотов, я выложу бота истребителя + ПВО.

Права принадлежат:
Бот - Полностью мой, автор Caypen.
ПВО - Взят из одного мода и переделан под себя.

И так для начала начнем делать наших истребителей.
Их будет 2
Боты работают пока что на FCNPC,но когда я или Окстайл или кто-то еще выпустят новую версию движка для ботов которые не занимают слотов, можно будет переделать.
И так начнем.

В самый верх нашего проекта.
PHP:
#define MAX_BOTS 2 (( сколько максимум ботов юзаем ))

new AirPlane[MAX_BOTS];
new AirPlane_Count;
#define AllAirPlanes(%0) for(new ouf, %0=AirPlane[ouf]; ouf <AirPlane_Count; %0=AirPlane[++ouf])
new goodSkins[] = {134, 135, 162,168,182,79};
new ZombieString[128];
new maniac[MAX_BOTS];
new IsPlayerDeath[MAX_PLAYERS];
new Nuc[MAX_BOTS];new spawn[MAX_PLAYERS];
new vrag[MAX_PLAYERS];
new Float:POSOFHUNTER[3][3];
new zombies_health[MAX_PLAYERS];
new Float:RandomZSpawns[][] =  // Это места спавна истребителей
{
	{2768.3191,2775.9666,10.8203},
	{1516.2811,2915.6509,8.0404},
	{2076.4016,1821.6676,10.8203},
	{598.7019,878.0272,-42.9609}
};
В public OnGameModeInit()
PHP:
for(new i = 0;i < MAX_BOTS;i++)
	{

		Nuc[i] = -1;// указываем что ракета не выпущена
		new rand = random(sizeof(goodSkins));// выбираем случайный скин
		new skinid = goodSkins[rand];
		format(ZombieString,sizeof(ZombieString),"Zombie_%d",i);
		maniac[i] = FCNPC_Create(ZombieString);
		new rands = random(sizeof(RandomZSpawns));
		FCNPC_Spawn(maniac[i],skinid,RandomZSpawns[rands][0],RandomZSpawns[rands][1],RandomZSpawns[rands][2]);
		FCNPC_SetHealth(maniac[i],200);
		spawn[maniac[i]] = 1;
		killed++;
		if(i == 0 || i == 1)
		{
			SetTimerEx("TheHunter", ZTimerSpeed, 1, "d", i);
			SetPlayerColor(maniac[i], 0x009F00AA);
			AirPlane[AirPlane_Count++]=i;
			SetTimerEx("AntiAirNPC", 500, 1, "d", i);
			format(ZombieString,24,"aircraft_%d",i);
			SetPlayerName(maniac[i], ZombieString);
			continue;
		}
		/*OnFoot[OnFoot_Count++]=i;
		timer[i] = SetTimerEx("ZombieAtaca", ZTimerSpeed, 1, "d", i);
		SetPlayerColor(maniac[i], 0xFF0000AA); ЭТО НАМ ПОКА ЧТО НЕ НУЖНО ИБО У НАС ТОЛЬКО ИСТРЕБИТЕЛИ */
	}
И в остальные, по такому принципу как снизу
PHP:
public OnPlayerConnect(playerid)
{
	vrag[playerid] = -1;
	IsPlayerDeath[playerid] = 0;
	return true;
}
public OnPlayerDeath(playerid, killerid, reason)
{
	vrag[playerid] = -1;
	if (IsPlayerNPC(playerid)) return true;
	IsPlayerDeath[playerid] = 1;
	return true;
}
public OnPlayerSpawn(playerid)
{
	if (IsPlayerNPC(playerid)) return true;
	IsPlayerDeath[playerid] = 0;
	return true;
}
public FCNPC_OnSpawn(npcid)
{
	vrag[npcid] = -1;
	for(new i = 0;i < MAX_BOTS;i++)
	{
		if(vrag[maniac[i]] == npcid)
		{
			vrag[maniac[i]] = -1;
		}
	}
	return true;
}
GetClosestPlayAir(npcidNotP,npcid,Float:object_x, Float:object_y, Float:object_z)
{
	new Float:min_dis = 99999.99,
Float:player_dis,
	player = INVALID_PLAYER_ID;
	for (new i=0;i< MAX_BOTS;i++)
	{
		if(spawn[maniac[i]] == 0) continue;
		if(maniac[i] == npcid) continue;
		if(!IsPlayerInRangeOfPoint(maniac[i],150.0,object_x, object_y, object_z))
		{
			if(vrag[maniac[i]] == npcid)
			{
				vrag[maniac[i]] = -1;
			}
			continue;
		}

		if(vrag[maniac[i]] != npcid)continue;
		player_dis = GetPlayerDistanceFromPoint(maniac[i], object_x, object_y, object_z);
		if (player_dis < min_dis)
		{
			min_dis = player_dis;
			player = maniac[i];
		}
	}
	foreach (playerid)
	{
		if (GetPlayerState(playerid) == PLAYER_STATE_SPECTATING) continue;
		if (GetPlayerInterior(playerid)) continue; // Обрати внимание какой вид имеют стандартные функции!
		if (IsPlayerDeath[playerid] == 1 || afkk[playerid] == 1) continue; // А где сами функции и почему имена у них разные? И предыдущий комментарий сюда применим.
		if(!IsPlayerInRangeOfPoint(playerid,150.0,object_x, object_y, object_z))
		{
			if(vrag[playerid] == npcid)
			{
				vrag[playerid] = -1;
			}
			continue;
		}

		if(vrag[playerid] != npcid) continue;
		player_dis = GetPlayerDistanceFromPoint(playerid, object_x, object_y, object_z);
		if (player_dis < min_dis)
		{
			min_dis = player_dis;
			player = playerid;
		}
	}
	//	if(npcid == 299) {printf("ID 299 ищет себе %d",player);}
	if(player != INVALID_PLAYER_ID) return player;

/*	AllVehicles(i) ПОКА ЧТО НЕ НУЖНО
	{
		if(spawn[maniac[i]] == 0) continue;
		if(maniac[i] == npcid) continue;
		if(!IsPlayerInRangeOfPoint(maniac[i],150.0,object_x, object_y, object_z)) continue;
		player_dis = GetPlayerDistanceFromPoint(maniac[i], object_x, object_y, object_z);
		if (player_dis < min_dis)
		{
			min_dis = player_dis;
			player = maniac[i];
		}
	}*/
	//в радиусе танков и ***ни нет
	foreach (playerid)
	{
		if (GetPlayerState(playerid) == PLAYER_STATE_SPECTATING) continue;
		if (GetPlayerInterior(playerid)) continue; // Обрати внимание какой вид имеют стандартные функции!
		if (IsPlayerDeath[playerid] == 1 || afkk[playerid] == 1) continue; // А где сами функции и почему имена у них разные? И предыдущий комментарий сюда применим.
		if(!IsPlayerInRangeOfPoint(playerid,150.0,object_x, object_y, object_z)) continue;
		new weapon =GetPlayerWeapon(playerid);
		if(weapon < 20 || weapon> 38)continue;
		player_dis = GetPlayerDistanceFromPoint(playerid, object_x, object_y, object_z);
		if (player_dis < min_dis)
		{
			min_dis = player_dis;
			player = playerid;
		}
	}
/*	AllGuns(i) ПОКА ЧТО НЕ НУЖНО
	{
		if(spawn[maniac[i]] == 0) continue;
		if(maniac[i] == npcid) continue;
		if(!IsPlayerInRangeOfPoint(maniac[i],150.0,object_x, object_y, object_z)) continue;
		//	new weapon = FCNPC_GetWeapon(maniac[i]);
		//	if(weapon < 20 || weapon> 38)continue;
		player_dis = GetPlayerDistanceFromPoint(maniac[i], object_x, object_y, object_z);
		if (player_dis < min_dis)
		{
			min_dis = player_dis;
			player = maniac[i];
		}
	}*/
	//	if(npcid == 299) {printf("ID 299 ищет себе %d 2",player);}
	if(player != INVALID_PLAYER_ID)return player;
	//никого в радиусе с оружием нет,идем дальше

	foreach (playerid)
	{
		if (GetPlayerState(playerid) == PLAYER_STATE_SPECTATING) continue;
		if (GetPlayerInterior(playerid)) continue; // Обрати внимание какой вид имеют стандартные функции!
		if (IsPlayerDeath[playerid] == 1 || afkk[playerid] == 1) continue; // А где сами функции и почему имена у них разные? И предыдущий комментарий сюда применим.
		player_dis = GetPlayerDistanceFromPoint(playerid, object_x, object_y, object_z);
		if (player_dis < min_dis)
		{
			min_dis = player_dis;
			player = playerid;
		}
	}
	for (new i=0;i< MAX_BOTS;i++)
	{
		if(spawn[maniac[i]] == 0) continue;
		if(maniac[i] == npcid) continue;
		player_dis = GetPlayerDistanceFromPoint(maniac[i], object_x, object_y, object_z);
		if (player_dis < min_dis)
		{
			min_dis = player_dis;
			player = maniac[i];
		}
	}
	return player;
}
FindAGoodPlaceForAirlplaneRaket(npcid,Float:object_x, Float:object_y,Float:object_z,Float:Angle)
{
	new Float:NeWXY[2];
	GetXYInFrontOfPoint2(object_x, object_y, NeWXY[0], NeWXY[1], Angle, 55.0);
	if(IsTherRaket(NeWXY[0], NeWXY[1], object_z))
	{
		GetXYInFrontOfPoint(object_x, object_y, NeWXY[0], NeWXY[1], Angle, 55.0);
		if(IsTherRaket(NeWXY[0], NeWXY[1], object_z))
		{
			GetXYInFrontOfPoint2(object_x, object_y, NeWXY[0], NeWXY[1], Angle+90, 55.0);
			if(IsTherRaket(NeWXY[0], NeWXY[1], object_z))
			{
				GetXYInFrontOfPoint2(object_x, object_y, NeWXY[0], NeWXY[1], Angle-90, 55.0);
				FCNPC_GoTo(npcid,NeWXY[0], NeWXY[1], object_z,MOVE_TYPE_DRIVE,3.5,0);
				return true;
			}
			else
			{
				FCNPC_GoTo(npcid,NeWXY[0], NeWXY[1], object_z,MOVE_TYPE_DRIVE,3.5,0);
				return true;
			}
		}
		else
		{
			FCNPC_GoTo(npcid,NeWXY[0], NeWXY[1], object_z,MOVE_TYPE_DRIVE,3.5,0);
			return true;
		}
	}
	else
	{
		FCNPC_GoTo(npcid,NeWXY[0], NeWXY[1], object_z,MOVE_TYPE_DRIVE,3.5,0);
	}
	return true;

}
IsTherRaket(Float:object_x, Float:object_y, Float:object_z)
{
	for(new x = 0;x < MAX_BOTS;x++)
	{
		if(Nuc[x] == -1)continue;
		new Float:ObjPos[3];
		GetObjectPos(Nuc[x],ObjPos[0],ObjPos[1],ObjPos[2]);
		if ( (floatabs(ObjPos[0]-object_x) + floatabs(ObjPos[1]-object_y) + floatabs(ObjPos[2]-object_z) )<30)
		{
			return true;
		}
	}
	return 0;
}
GetXYInFrontOfPoint2(Float:x, Float:y, &Float:x2, &Float:y2, Float:A, Float:distance)
{
	x2 = x + (distance * floatsin(-A, degrees));
	y2 = y + (distance * floatcos(-A, degrees));
}
GetXYInFrontOfPoint(Float:x, Float:y, &Float:x2, &Float:y2, Float:A, Float:distance)
{
	x2 = x + (distance * floatsin(-(A+180), degrees));
	y2 = y + (distance * floatcos(-(A+180), degrees));
}
void TheHunter(i)
{
	if(spawn[maniac[i]] == 0) return true;
	new playerid228,Float:pcor[3];
	for(new a = 0; a < 4; a ++)
	{
		for(new n = 0; n < 4; n++)
		{
			new Float:ObjPos[3];
			GetObjectPos(missles[a][n],ObjPos[0],ObjPos[1],ObjPos[2]);
			if(IsPlayerInRangeOfPoint(maniac[i],50.0,ObjPos[0],ObjPos[1],ObjPos[2]))
			{
				new Float:Angle;
				GetVehicleZAngle(FCNPC_GetVehicleID(maniac[i]), Angle);
				FindAGoodPlaceForAirlplane(maniac[i], POSOFHUNTER[i][0], POSOFHUNTER[i][1], POSOFHUNTER[i][2],Angle);
				return true;
			}
		}
	}
	for(new x = 0;x < MAX_BOTS;x++)
	{
		if(Nuc[x] == -1)continue;
		if(x == i)continue;
		new Float:ObjPos[3];
		GetObjectPos(Nuc[x],ObjPos[0],ObjPos[1],ObjPos[2]);
		if(IsPlayerInRangeOfPoint(maniac[i],50.0,ObjPos[0],ObjPos[1],ObjPos[2]))
		{
			new Float:Angle;
			GetVehicleZAngle(FCNPC_GetVehicleID(maniac[i]), Angle);
			FindAGoodPlaceForAirlplaneRaket(maniac[i], POSOFHUNTER[i][0], POSOFHUNTER[i][1], POSOFHUNTER[i][2],Angle);
			return true;
		}
	}// автор Caypen

	playerid228 = GetClosestPlayAir(i,maniac[i],POSOFHUNTER[i][0], POSOFHUNTER[i][1], POSOFHUNTER[i][2]);
	//  printf("ищу врага");
	if(playerid228 !=INVALID_PLAYER_ID)
	{
		GetPlayerPos(playerid228,pcor[0],pcor[1],pcor[2]);
		itisnotaman[i] = 0;
	}
	else
	{
		pcor[0] = 214.0959;
		pcor[1] = 1872.9375;
		pcor[2] = 13.1406;
		itisnotaman[i] = 1;
	}
	if(!IsPlayerInRangeOfPoint(maniac[i],150.0,pcor[0],pcor[1],pcor[2]))
	{
		FCNPC_GetZGround(pcor[0],pcor[1],pcor[2]);
		new Float:Visota=75;
		FCNPC_GoTo(maniac[i],pcor[0],pcor[1],pcor[2]+Visota,MOVE_TYPE_DRIVE,3.5,0);
		return true;
	}
	else
	{
		FCNPC_Stop(maniac[i]);
		if(itisnotaman[i] == 1) return true;
		if(Nuc[i]!=-1)
		{
			FCNPC_StopAim(maniac[i]);
			return true;
		}

		FCNPC_AimAt(maniac[i],pcor[0],pcor[1],pcor[2],1);
		new Float:Angle=FCNPC_GetAngle(maniac[i]);

		if(Angle < 0 || Angle > 360) return true;

		vrag[maniac[i]] = playerid228;


		Angle += 270;
		POSOFHUNTER[i][2] += 1;


		POSOFHUNTER[i][0] += (1 * floatsin(-Angle, degrees));
		POSOFHUNTER[i][1] += (1 * floatcos(-Angle, degrees));

		Nuc[i] = CreateObject(3790,POSOFHUNTER[i][0], POSOFHUNTER[i][1], POSOFHUNTER[i][2],0,0,Angle,300.00);
		Angle += 90;

		MoveObjectWithAcceleration( Nuc[i], 30, 100, pcor[0],pcor[1],pcor[2]+0.5, 4500 );
	}
	return true;
}
void AntiAirNPC(i) // автор
{
	FCNPC_GetPosition(maniac[i],POSOFHUNTER[i][0],POSOFHUNTER[i][1],POSOFHUNTER[i][2]);
	if(NoAirPlane(maniac[i]))
	{
		for(new a = 0; a < 4; a ++)
		{
			new Float:an,Float:x,Float:y,Float:z,Float:x2,Float:y2,Float:z2;
			GetObjectRot(pvo[a],x,y,z);
			GetObjectPos(pvo[a],x2,y2,z2);
			new Float:f=(y2-POSOFHUNTER[i][1])/(x2-POSOFHUNTER[i][0]);
			an = atan(f);
			if(POSOFHUNTER[i][0] < x2)
			{
				SetObjectRot(pvo[a],x,y,an+90);
			}
			else if(POSOFHUNTER[i][0] > x2)
			{
				SetObjectRot(pvo[a],x,y,an-90);
			}
			for(new n = 0; n < 4; n++)
			{
				if(missles[a][n] == -1)
				{
					missles[a][n] = CreateObject(345,anti_air_origins[a][0],anti_air_origins[a][1],anti_air_origins[a][2],0.0,0.0,0.0);
					MoveObjectWithAcceleration( missles[a][n], 40, 115, POSOFHUNTER[i][0],POSOFHUNTER[i][1],POSOFHUNTER[i][2], 5500 );
				}
			}
		}
	}
	return true;
}
void MoveObjectWithAcceleration( objectid, Float: startSpeed, Float: endSpeed, Float: x, Float: y, Float: z, accelerationTime )
{
	//	printf("MoveObjectWithAcceleration(%d , %f, %f, %f, %f ,%f, %d",objectid, startSpeed, endSpeed, x, y, z, accelerationTime);
	if( !IsValidObject( objectid ) )return ;

	new Float: newSpeed = ( endSpeed + startSpeed ) / 10 + startSpeed ;

	if( newSpeed >= endSpeed )
	return ;

	MoveObject( objectid, x, y, z, newSpeed );

	SetTimerEx( "MoveObjectWithAcceleration", accelerationTime / 10, false, "ifffffi", objectid, newSpeed, endSpeed, x, y, z, accelerationTime );
	return ;
}
public OnObjectMoved(objectid)
{
	new Float: n1[3];
	GetObjectPos(objectid,n1[0],n1[1],n1[2]);
	DestroyObject(objectid);
	for(new a = 0; a < 4; a ++)
	{
		for(new n = 0; n < 4; n++)
		{
			if(missles[a][n] == objectid)
			{
				missles[a][n] = -1;
				break;
			}
		}
	}
	CreateExplosion(n1[0],n1[1],n1[2],7,30.0);
	for(new i = 0;i < MAX_BOTS;i++)
	{
		if(Nuc[i] == objectid)
		{
			Nuc[i] = -1;
			Destroy(30.0, maniac[i],n1[0],n1[1],n1[2]);
			return true;
		}
	}
	Destroy(30.0, -1,n1[0],n1[1],n1[2]);
	return 1;
}
GetIDOfNPCID(npcid)
{
	for (new i=0;i< MAX_BOTS;i++)
	{
		if(npcid== maniac[i]) return i;
	}
	return -1;
}
Destroy(Float:radius = 30.0, playerid,Float:x,Float:y,Float:z)
{
	new Float:dist;
	new Id;
	if(playerid != -1)
	{
		Id = GetIDOfNPCID(playerid);
	}
	for (new i=0;i< MAX_BOTS;i++)
	{
		if(spawn[maniac[i]] == 0) continue;
		dist = GetPlayerDistanceFromPoint(maniac[i], x, y, z);
		if(dist < radius)
		{
		//	SetPVarInt(maniac[i],"Peregruzen",CurrentTimer + 1); пока что не нужно
			FCNPC_StopAim(maniac[i]);
			FCNPC_Stop(maniac[i]);
		//	ApplyAnimation(maniac[i], "FIGHT_C","HitC_3", 4.0, 0, 0, 0, 0, 0, 1); пока что не нужно
		}
		new amount;
		if(dist < radius / 16){ amount = 400;}
		else if(dist < radius / 8){  amount = 200;}
		else if(dist < radius / 4){ amount = 100;}
		else if(dist < radius / 2){ amount = 50;}
		else if(dist < radius){ amount = 25;}
		else continue;
		new veh = FCNPC_GetVehicleID(maniac[i]);
		if(veh != INVALID_VEHICLE_ID)
		{
			new Float:vehp;
			GetVehicleHealth(veh, vehp);
			if(vehp-amount <= 250)
			{
				SetVehicleHealth(veh, 0);
				FCNPC_Kill(maniac[i]);
				SendDeathMessage(INVALID_PLAYER_ID, maniac[i], 51);
				continue;
			}
			SetVehicleHealth(veh, vehp-amount);
			continue;
		}
		SetHealth(maniac[i],GetHealth(maniac[i]) -amount,INVALID_PLAYER_ID,51);
	}
	return 1;
}
SetHealth(npcid,amount,Atakoval = INVALID_PLAYER_ID,weaponid =WEAPON_COLLISION)
{
	if(amount < 1)
	{
		FCNPC_Kill(npcid);
		zombies_health[npcid] = 0;
		SendDeathMessage(Atakoval, npcid, weaponid);
		return true;
	}
	zombies_health[npcid] =amount;
	return true;
}
GetHealth(npcid)
{
	return zombies_health[npcid];
}
Автор: Caypen

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

---------- Post added at 20:38 ---------- Previous post was at 20:36 ----------

P.s. Код лично считаю далеко не идеальным и не оптимизирвоанным ,но мне и так сходило, потому что было лень оптимизировать.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу