admin Дата: Вторник, 28.06.2011, 14:29:47 | Сообщение # 1
Группа: Администраторы
Сообщений: 3869
Это мой первый [FS],в котором я выпустил npc, это было очень легко создавать, только основные математику, и здравый смысл. В общем, вы можете установить NPC, чтобы стрелять, следовать или диск для вас. функции: Code
SetNPCFollowPlayer(npcid, playerid); // Это позволит установить NPC следовать игрока. SetNPCDriveToPlayer(npcid, playerid); // Это сделает NPC следовать за игроком в автомобиле. SetNPCAttackPlayer(npcid, playerid, weapon); // Это сделает NPC атаковать игрока
Как использовать функции: (для новичков) Code
SetNPCFollowPlayer(npcid, playerid)
Code
if(strcmp("/npc", cmdtext, true, 10) == 0) { SetNPCFollowPlayer(50, playerid); return 1; } SetNPCDriveToPlayer(npcid, playerid);
Code
if(strcmp("/npc", cmdtext, true, 10) == 0) { PutNPCInVehicle(npcid,vehicleid,0); SetNPCDriveToPlayer(npcid, playerid); return 1; }
Code
if(strcmp("/npc", cmdtext, true, 10) == 0) { SetNPCShootPlayer(npcid, playerid, weapon); return 1; }
Как установить ее на свой режим игры: Скопируйте include ai_npc.inc. Положите include в папку pawno/includes. Скопируйте и вставьте эти строки в ваш режим игры: #include Code
//под OnPlayerDeath public OnPlayerDeath(playerid, killerid, reason) { AI_PlayerDeath(playerid); return 1; } public OnGameModeInit() { AI_OnGameModeInit(); }
И код готов к использованию. Видео: (оно содержит ошибку показывает) кредиты: Skorch - Создание этого [FS] Для CNPC автора Для автора MapAndreas. GetXYInFrontOfPoint(&Float, &Float:y, Float:angle, Float:distance) GetPointAngleToPoint(Float2, Float:y2, Float:X, Float:Y) DistanceCameraTargetToLocation() GetDistanceBetweenPlayers(playerid,targetplayerid) ПРИМЕЧАНИЕ: Он использует CNPC и MapAndreas плагинов. Code
/* ----------------------------------------------------------- Module - Artificial Intelligence for NPCS. Version: 0.1 Date created: 2011, 25th May. By: Skorch ----------------------------------------------------------- */ #define NPC_REACTION_TIME 400 #define TASK_FOLLOW 1 #define TASK_SHOOT 2 #define TASK_DRIVE 3 #define INVALID_TASK 0 #define MOVEMENT_ARRAY 0 #define SHOOTING_ARRAY 1 #define DRIVING_ARRAY 2 #define SHOOT_OFFSET -1.5 new Task[MAX_NPCS][3][3]; forward UpdateTasks(); forward Float:GetDistanceBetweenPlayers(playerid,targetplayerid); forward AI_PlayerDeath(playerid); stock SetNPCFollowPlayer(npcid, playerid) { Task[npcid][MOVEMENT_ARRAY][0] = TASK_FOLLOW; Task[npcid][MOVEMENT_ARRAY][1] = playerid; return true; } stock SetNPCShootPlayer(npcid, playerid, weapon) { Task[npcid][SHOOTING_ARRAY][0] = TASK_SHOOT; Task[npcid][SHOOTING_ARRAY][1] = playerid; SetNPCWeapon(npcid, weapon); return true; } stock SetNPCDriveToPlayer(npcid, playerid) { Task[npcid][DRIVING_ARRAY][0] = TASK_DRIVE; Task[npcid][DRIVING_ARRAY][1] = playerid; return true; } stock CancelAllNPCActions(npcid) { new Float:X; new Float:Y; new Float:Z; GetPlayerPos(npcid, X, Y, Z); for(new i = 0; i < 4; i++) { Task[npcid][i][0] = INVALID_TASK; Task[npcid][i][1] = INVALID_TASK; Task[npcid][i][2] = INVALID_TASK; //NPC_WalkTo(npcid, X, Y, Z, 1); } } AI_PlayerDeath(playerid) { foreach(NPC, npcid) { if(Task[npcid][SHOOTING_ARRAY][0] == TASK_SHOOT) { if(playerid == Task[npcid][SHOOTING_ARRAY][1]) { CancelAllNPCActions(npcid); } } } } AI_OnGameModeInit() { SetTimer("UpdateTasks", NPC_REACTION_TIME, true); } public OnNPCDeath(npcid,killerid,reason) { CancelAllNPCActions(npcid); DestroyNPC(npcid); } public UpdateTasks() { foreach(NPC, npcid) { if(Task[npcid][MOVEMENT_ARRAY][0] == TASK_FOLLOW) { new Float:Distance; new Float:X; new Float:Y; new Float:Z; GetPlayerPos(Task[npcid][MOVEMENT_ARRAY][1], X, Y, Z); Distance = GetDistanceBetweenPlayers(npcid, Task[npcid][MOVEMENT_ARRAY][1]); if(Distance < 3) { } else if(Distance > 2 && Distance < 5 && Task[npcid][SHOOTING_ARRAY][0] != TASK_SHOOT ) { NPC_WalkTo(npcid, X, Y, Z, 1); } else if(Distance > 5 && Distance < 10 ) { if(Task[npcid][SHOOTING_ARRAY][0] == TASK_SHOOT && IsPlayerAimingAt(npcid, X, Y, Z, 1)) { NPC_ShotAt(npcid, X, Y, Z + SHOOT_OFFSET); } else { NPC_RunTo(npcid, X, Y, Z, 1); } } else if(Distance > 10 ) { if(Task[npcid][SHOOTING_ARRAY][0] == TASK_SHOOT) { NPC_WalkTo(npcid, X, Y, Z, 1); NPC_ShotAt(npcid, X, Y, Z + SHOOT_OFFSET); } else { NPC_SprintTo(npcid, X, Y, Z, 1); } } } if(Task[npcid][SHOOTING_ARRAY][0] == TASK_SHOOT) { new Float:Distance; new Float:X; new Float:Y; new Float:Z; GetPlayerPos(Task[npcid][SHOOTING_ARRAY][1], X, Y, Z); Distance = GetDistanceBetweenPlayers(npcid, Task[npcid][SHOOTING_ARRAY][1]); if(Distance > 40 && Distance < 1000 && IsPlayerAimingAt(npcid, X, Y, Z, 1) == 0 ) { NPC_RunTo(npcid, X, Y, Z, 1); } else { NPC_ShotAt(npcid, X, Y, Z + SHOOT_OFFSET); } } if(Task[npcid][DRIVING_ARRAY][0] == TASK_DRIVE) { new Float:X; new Float:Y; new Float:Z; new Float:Distance; GetPlayerPos(Task[npcid][DRIVING_ARRAY][1], X, Y, Z); Distance = GetDistanceBetweenPlayers(npcid, Task[npcid][SHOOTING_ARRAY][1]); if(Distance > 0 && Distance < 6) { // stop } else if(Distance > 17 && Distance < 30) { NPC_DriveTo(npcid, X, Y, Z, 30, 1); } else if(Distance > 30 && Distance < 100) { NPC_DriveTo(npcid, X, Y, Z, 60, 1); } else if(Distance > 100) { NPC_DriveTo(npcid, X, Y, Z, 150, 1); } } } } public Float:GetDistanceBetweenPlayers(playerid,targetplayerid) { new Float:x1; new Float:y1; new Float:z1; new Float:x2; new Float:y2; new Float:z2; if(!IsPlayerConnected(playerid) || !IsPlayerConnected(targetplayerid)) { return -1.00; } GetPlayerPos(playerid,x1,y1,z1); GetPlayerPos(targetplayerid,x2,y2,z2); return floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2)); } Float:DistanceCameraTargetToLocation(Float:CamX, Float:CamY, Float:CamZ, Float:ObjX, Float:ObjY, Float:ObjZ, Float:FrX, Float:FrY, Float:FrZ) { new Float:TGTDistance; TGTDistance = floatsqroot((CamX - ObjX) * (CamX - ObjX) + (CamY - ObjY) * (CamY - ObjY) + (CamZ - ObjZ) * (CamZ - ObjZ)); new Float:tmpX, Float:tmpY, Float:tmpZ; tmpX = FrX * TGTDistance + CamX; tmpY = FrY * TGTDistance + CamY; tmpZ = FrZ * TGTDistance + CamZ; return floatsqroot((tmpX - ObjX) * (tmpX - ObjX) + (tmpY - ObjY) * (tmpY - ObjY) + (tmpZ - ObjZ) * (tmpZ - ObjZ)); } stock Float:GetPointAngleToPoint(Float:x2, Float:y2, Float:X, Float:Y) { new Float:DX, Float:DY; new Float:angle; DX = floatabs(floatsub(x2,X)); DY = floatabs(floatsub(y2,Y)); if (DY == 0.0 || DX == 0.0) { if(DY == 0 && DX > 0) angle = 0.0; else if(DY == 0 && DX < 0) angle = 180.0; else if(DY > 0 && DX == 0) angle = 90.0; else if(DY < 0 && DX == 0) angle = 270.0; else if(DY == 0 && DX == 0) angle = 0.0; } else { angle = atan(DX/DY); if(X > x2 && Y <= y2) angle += 90.0; else if(X <= x2 && Y < y2) angle = floatsub(90.0, angle); else if(X < x2 && Y >= y2) angle -= 90.0; else if(X >= x2 && Y > y2) angle = floatsub(270.0, angle); } return floatadd(angle, 90.0); } stock GetXYInFrontOfPoint(&Float:x, &Float:y, Float:angle, Float:distance) { x += (distance * floatsin(-angle, degrees)); y += (distance * floatcos(-angle, degrees)); } stock IsPlayerAimingAt(playerid, Float:x, Float:y, Float:z, Float:radius) { new Float:camera_x; new Float:camera_y; new Float:camera_z; new Float:vector_x; new Float:vector_y; new Float:vector_z; GetPlayerCameraPos(playerid, camera_x, camera_y, camera_z); GetPlayerCameraFrontVector(playerid, vector_x, vector_y, vector_z); new Float:vertical, Float:horizontal; switch (GetPlayerWeapon(playerid)) { case 34,35,36: { if (DistanceCameraTargetToLocation(camera_x, camera_y, camera_z, x, y, z, vector_x, vector_y, vector_z) < radius) return true; return false; } case 30,31: {vertical = 4.0; horizontal = -1.6;} case 33: {vertical = 2.7; horizontal = -1.0;} default: {vertical = 6.0; horizontal = -2.2;} } new Float:angle = GetPointAngleToPoint(0, 0, floatsqroot(vector_x*vector_x+vector_y*vector_y), vector_z) - 270.0; new Float:resize_x, Float:resize_y, Float:resize_z = floatsin(angle+vertical, degrees); GetXYInFrontOfPoint(resize_x, resize_y, GetPointAngleToPoint(0, 0, vector_x, vector_y)+horizontal, floatcos(angle+vertical, degrees)); if (DistanceCameraTargetToLocation(camera_x, camera_y, camera_z, x, y, z, resize_x, resize_y, resize_z) < radius) return true; return false; }
Источник:sa-mp.com Автор:Skorch Думаю и для вас пригодится это чтоб создавать ботов легче было
zm-jail.ru Разработка сайта samp-pawno.ru
Сообщение Это мой первый [FS],в котором я выпустил npc, это было очень легко создавать, только основные математику, и здравый смысл. В общем, вы можете установить NPC, чтобы стрелять, следовать или диск для вас. функции: Code
SetNPCFollowPlayer(npcid, playerid); // Это позволит установить NPC следовать игрока. SetNPCDriveToPlayer(npcid, playerid); // Это сделает NPC следовать за игроком в автомобиле. SetNPCAttackPlayer(npcid, playerid, weapon); // Это сделает NPC атаковать игрока
Как использовать функции: (для новичков) Code
SetNPCFollowPlayer(npcid, playerid)
Code
if(strcmp("/npc", cmdtext, true, 10) == 0) { SetNPCFollowPlayer(50, playerid); return 1; } SetNPCDriveToPlayer(npcid, playerid);
Code
if(strcmp("/npc", cmdtext, true, 10) == 0) { PutNPCInVehicle(npcid,vehicleid,0); SetNPCDriveToPlayer(npcid, playerid); return 1; }
Code
if(strcmp("/npc", cmdtext, true, 10) == 0) { SetNPCShootPlayer(npcid, playerid, weapon); return 1; }
Как установить ее на свой режим игры: Скопируйте include ai_npc.inc. Положите include в папку pawno/includes. Скопируйте и вставьте эти строки в ваш режим игры: #include Code
//под OnPlayerDeath public OnPlayerDeath(playerid, killerid, reason) { AI_PlayerDeath(playerid); return 1; } public OnGameModeInit() { AI_OnGameModeInit(); }
И код готов к использованию. Видео: (оно содержит ошибку показывает) кредиты: Skorch - Создание этого [FS] Для CNPC автора Для автора MapAndreas. GetXYInFrontOfPoint(&Float, &Float:y, Float:angle, Float:distance) GetPointAngleToPoint(Float2, Float:y2, Float:X, Float:Y) DistanceCameraTargetToLocation() GetDistanceBetweenPlayers(playerid,targetplayerid) ПРИМЕЧАНИЕ: Он использует CNPC и MapAndreas плагинов. Code
/* ----------------------------------------------------------- Module - Artificial Intelligence for NPCS. Version: 0.1 Date created: 2011, 25th May. By: Skorch ----------------------------------------------------------- */ #define NPC_REACTION_TIME 400 #define TASK_FOLLOW 1 #define TASK_SHOOT 2 #define TASK_DRIVE 3 #define INVALID_TASK 0 #define MOVEMENT_ARRAY 0 #define SHOOTING_ARRAY 1 #define DRIVING_ARRAY 2 #define SHOOT_OFFSET -1.5 new Task[MAX_NPCS][3][3]; forward UpdateTasks(); forward Float:GetDistanceBetweenPlayers(playerid,targetplayerid); forward AI_PlayerDeath(playerid); stock SetNPCFollowPlayer(npcid, playerid) { Task[npcid][MOVEMENT_ARRAY][0] = TASK_FOLLOW; Task[npcid][MOVEMENT_ARRAY][1] = playerid; return true; } stock SetNPCShootPlayer(npcid, playerid, weapon) { Task[npcid][SHOOTING_ARRAY][0] = TASK_SHOOT; Task[npcid][SHOOTING_ARRAY][1] = playerid; SetNPCWeapon(npcid, weapon); return true; } stock SetNPCDriveToPlayer(npcid, playerid) { Task[npcid][DRIVING_ARRAY][0] = TASK_DRIVE; Task[npcid][DRIVING_ARRAY][1] = playerid; return true; } stock CancelAllNPCActions(npcid) { new Float:X; new Float:Y; new Float:Z; GetPlayerPos(npcid, X, Y, Z); for(new i = 0; i < 4; i++) { Task[npcid][i][0] = INVALID_TASK; Task[npcid][i][1] = INVALID_TASK; Task[npcid][i][2] = INVALID_TASK; //NPC_WalkTo(npcid, X, Y, Z, 1); } } AI_PlayerDeath(playerid) { foreach(NPC, npcid) { if(Task[npcid][SHOOTING_ARRAY][0] == TASK_SHOOT) { if(playerid == Task[npcid][SHOOTING_ARRAY][1]) { CancelAllNPCActions(npcid); } } } } AI_OnGameModeInit() { SetTimer("UpdateTasks", NPC_REACTION_TIME, true); } public OnNPCDeath(npcid,killerid,reason) { CancelAllNPCActions(npcid); DestroyNPC(npcid); } public UpdateTasks() { foreach(NPC, npcid) { if(Task[npcid][MOVEMENT_ARRAY][0] == TASK_FOLLOW) { new Float:Distance; new Float:X; new Float:Y; new Float:Z; GetPlayerPos(Task[npcid][MOVEMENT_ARRAY][1], X, Y, Z); Distance = GetDistanceBetweenPlayers(npcid, Task[npcid][MOVEMENT_ARRAY][1]); if(Distance < 3) { } else if(Distance > 2 && Distance < 5 && Task[npcid][SHOOTING_ARRAY][0] != TASK_SHOOT ) { NPC_WalkTo(npcid, X, Y, Z, 1); } else if(Distance > 5 && Distance < 10 ) { if(Task[npcid][SHOOTING_ARRAY][0] == TASK_SHOOT && IsPlayerAimingAt(npcid, X, Y, Z, 1)) { NPC_ShotAt(npcid, X, Y, Z + SHOOT_OFFSET); } else { NPC_RunTo(npcid, X, Y, Z, 1); } } else if(Distance > 10 ) { if(Task[npcid][SHOOTING_ARRAY][0] == TASK_SHOOT) { NPC_WalkTo(npcid, X, Y, Z, 1); NPC_ShotAt(npcid, X, Y, Z + SHOOT_OFFSET); } else { NPC_SprintTo(npcid, X, Y, Z, 1); } } } if(Task[npcid][SHOOTING_ARRAY][0] == TASK_SHOOT) { new Float:Distance; new Float:X; new Float:Y; new Float:Z; GetPlayerPos(Task[npcid][SHOOTING_ARRAY][1], X, Y, Z); Distance = GetDistanceBetweenPlayers(npcid, Task[npcid][SHOOTING_ARRAY][1]); if(Distance > 40 && Distance < 1000 && IsPlayerAimingAt(npcid, X, Y, Z, 1) == 0 ) { NPC_RunTo(npcid, X, Y, Z, 1); } else { NPC_ShotAt(npcid, X, Y, Z + SHOOT_OFFSET); } } if(Task[npcid][DRIVING_ARRAY][0] == TASK_DRIVE) { new Float:X; new Float:Y; new Float:Z; new Float:Distance; GetPlayerPos(Task[npcid][DRIVING_ARRAY][1], X, Y, Z); Distance = GetDistanceBetweenPlayers(npcid, Task[npcid][SHOOTING_ARRAY][1]); if(Distance > 0 && Distance < 6) { // stop } else if(Distance > 17 && Distance < 30) { NPC_DriveTo(npcid, X, Y, Z, 30, 1); } else if(Distance > 30 && Distance < 100) { NPC_DriveTo(npcid, X, Y, Z, 60, 1); } else if(Distance > 100) { NPC_DriveTo(npcid, X, Y, Z, 150, 1); } } } } public Float:GetDistanceBetweenPlayers(playerid,targetplayerid) { new Float:x1; new Float:y1; new Float:z1; new Float:x2; new Float:y2; new Float:z2; if(!IsPlayerConnected(playerid) || !IsPlayerConnected(targetplayerid)) { return -1.00; } GetPlayerPos(playerid,x1,y1,z1); GetPlayerPos(targetplayerid,x2,y2,z2); return floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2)); } Float:DistanceCameraTargetToLocation(Float:CamX, Float:CamY, Float:CamZ, Float:ObjX, Float:ObjY, Float:ObjZ, Float:FrX, Float:FrY, Float:FrZ) { new Float:TGTDistance; TGTDistance = floatsqroot((CamX - ObjX) * (CamX - ObjX) + (CamY - ObjY) * (CamY - ObjY) + (CamZ - ObjZ) * (CamZ - ObjZ)); new Float:tmpX, Float:tmpY, Float:tmpZ; tmpX = FrX * TGTDistance + CamX; tmpY = FrY * TGTDistance + CamY; tmpZ = FrZ * TGTDistance + CamZ; return floatsqroot((tmpX - ObjX) * (tmpX - ObjX) + (tmpY - ObjY) * (tmpY - ObjY) + (tmpZ - ObjZ) * (tmpZ - ObjZ)); } stock Float:GetPointAngleToPoint(Float:x2, Float:y2, Float:X, Float:Y) { new Float:DX, Float:DY; new Float:angle; DX = floatabs(floatsub(x2,X)); DY = floatabs(floatsub(y2,Y)); if (DY == 0.0 || DX == 0.0) { if(DY == 0 && DX > 0) angle = 0.0; else if(DY == 0 && DX < 0) angle = 180.0; else if(DY > 0 && DX == 0) angle = 90.0; else if(DY < 0 && DX == 0) angle = 270.0; else if(DY == 0 && DX == 0) angle = 0.0; } else { angle = atan(DX/DY); if(X > x2 && Y <= y2) angle += 90.0; else if(X <= x2 && Y < y2) angle = floatsub(90.0, angle); else if(X < x2 && Y >= y2) angle -= 90.0; else if(X >= x2 && Y > y2) angle = floatsub(270.0, angle); } return floatadd(angle, 90.0); } stock GetXYInFrontOfPoint(&Float:x, &Float:y, Float:angle, Float:distance) { x += (distance * floatsin(-angle, degrees)); y += (distance * floatcos(-angle, degrees)); } stock IsPlayerAimingAt(playerid, Float:x, Float:y, Float:z, Float:radius) { new Float:camera_x; new Float:camera_y; new Float:camera_z; new Float:vector_x; new Float:vector_y; new Float:vector_z; GetPlayerCameraPos(playerid, camera_x, camera_y, camera_z); GetPlayerCameraFrontVector(playerid, vector_x, vector_y, vector_z); new Float:vertical, Float:horizontal; switch (GetPlayerWeapon(playerid)) { case 34,35,36: { if (DistanceCameraTargetToLocation(camera_x, camera_y, camera_z, x, y, z, vector_x, vector_y, vector_z) < radius) return true; return false; } case 30,31: {vertical = 4.0; horizontal = -1.6;} case 33: {vertical = 2.7; horizontal = -1.0;} default: {vertical = 6.0; horizontal = -2.2;} } new Float:angle = GetPointAngleToPoint(0, 0, floatsqroot(vector_x*vector_x+vector_y*vector_y), vector_z) - 270.0; new Float:resize_x, Float:resize_y, Float:resize_z = floatsin(angle+vertical, degrees); GetXYInFrontOfPoint(resize_x, resize_y, GetPointAngleToPoint(0, 0, vector_x, vector_y)+horizontal, floatcos(angle+vertical, degrees)); if (DistanceCameraTargetToLocation(camera_x, camera_y, camera_z, x, y, z, resize_x, resize_y, resize_z) < radius) return true; return false; }
Источник:sa-mp.com Автор:Skorch Думаю и для вас пригодится это чтоб создавать ботов легче было Автор - admin Дата добавления - 28.06.2011 в 14:29:47