Caypеn
Компетентный
Уже почти год в очень узком кругу известно о 302-ух моих ботах которые я писал для себя и своих знакомых чтобы просто хорошо провести время и вот сегодня когда почти готов новый вид ботов не занимающих слотов, я выложу бота истребителя + ПВО.
Права принадлежат:
Бот - Полностью мой, автор Caypen.
ПВО - Взят из одного мода и переделан под себя.
И так для начала начнем делать наших истребителей.
Их будет 2
Боты работают пока что на FCNPC,но когда я или Окстайл или кто-то еще выпустят новую версию движка для ботов которые не занимают слотов, можно будет переделать.
И так начнем.
В самый верх нашего проекта.
В public OnGameModeInit()
И в остальные, по такому принципу как снизу
Автор: Caypen
Вырезал код из своего мода прямо в браузере разговаривая по скайпу,так что ,если будут ошибки обязательно сообщите о них в тему чтобы я поправил.
---------- Post added at 20:38 ---------- Previous post was at 20:36 ----------
P.s. Код лично считаю далеко не идеальным и не оптимизирвоанным ,но мне и так сходило, потому что было лень оптимизировать.
Права принадлежат:
Бот - Полностью мой, автор 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}
};
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];
}
Вырезал код из своего мода прямо в браузере разговаривая по скайпу,так что ,если будут ошибки обязательно сообщите о них в тему чтобы я поправил.
---------- Post added at 20:38 ---------- Previous post was at 20:36 ----------
P.s. Код лично считаю далеко не идеальным и не оптимизирвоанным ,но мне и так сходило, потому что было лень оптимизировать.
