Плагин для сервера San Andreas Multiplayer, позволяет создавать NPC не используя samp-npc.exe (каждый "стандартный" бот создается используя samp-npc.exe который требовал заметное количество оперативной памяти, в итоге большое количество "стандартных" ботов создавать нет возможности). Данные NPC создаются внутри сервера, не создавая лишних процессов, и не создавая новых сетевых соединений. Так же данные NPC имеют очень большое количество изменяемых параметров (в отличие от "стандартных" ботов), все параметры, которые синхронизирует SA-MP можно изменить, и даже больше - в плагине присутствует Nodes reader - для чтения путей навигационного графа GTA SA, ZMap reader - для чтения карты высот. Так же, в плагине сделана возможность передвижения NPC (пешком, легким бегом, быстрым бегом, на машине). И это не всё, плагин рассчитывает стрельбу игроков, для определения попаданий по NPC, проще говоря, NPC можно убивать. Но NPC так же могут стрелять (а точнее, смотреть в точку, целиться в точку и стрелять по ней).
Функционал:
cnpc.inc:
// core
native CreateNPC(npcid,npcname[]);
native DestroyNPC(npcid);
native IsValidNPC(npcid);
native KillNPC(npcid);
native SpawnNPC(npcid);
native StopNPC(npcid);
native GetNPCState(npcid);
native ToogleVisualDeath(tstate);
native FindLastFreeSlot();
// on foot controlls
native SetNPCPos(npcid,Float:X,Float:Y,Float:Z);
native GetNPCPos(npcid,&Float:X,&Float:Y,&Float:Z);
native SetNPCQuaternion(npcid,Float:X,Float:Y,Float:Z,Float:S);
native GetNPCQuaternion(npcid,&Float:X,&Float:Y,&Float:Z,&Float:S);
native SetNPCFacingAngle(npcid,Float:angle);
native Float:GetNPCFacingAngle(npcid);
native SetNPCVelocity(npcid,Float:X,Float:Y,Float:Z);
native GetNPCVelocity(npcid,&Float:X,&Float:Y,&Float:Z);
native NPC_WalkTo(npcid,Float:X,Float:Y,Float:Z,is_z_map,Float:speed=SPEED_WALK);
native NPC_RunTo(npcid,Float:X,Float:Y,Float:Z,is_z_map,Float:speed=SPEED_RUN);
native NPC_SprintTo(npcid,Float:X,Float:Y,Float:Z,is_z_map,Float:speed=SPEED_SPRINT);
native NPC_LookAt(npcid,Float:X,Float:Y,Float:Z);
native NPC_AimAt(npcid,Float:X,Float:Y,Float:Z);
native NPC_ShootAt(npcid,Float:X,Float:Y,Float:Z);
native SetNPCCameraPos(npcid,Float:X,Float:Y,Float:Z);
native GetNPCCameraPos(npcid,&Float:X,&Float:Y,&Float:Z);
native SetNPCCameraFrontVector(npcid,Float:X,Float:Y,Float:Z);
native GetNPCCameraFrontVector(npcid,&Float:X,&Float:Y,&Float:Z);
native SetNPCCameraMode(npcid,mode);
native GetNPCCameraMode(npcid);
native SetNPCWeaponState(npcid,wstate);
native GetNPCWeaponState(npcid);
native SetNPCKeys(npcid,updown,leftright,keys);
native GetNPCKeys(npcid,&updown,&leftright,&keys);
native SetNPCWeapon(npcid,weaponid);
native GetNPCWeapon(npcid);
native SetNPCWeaponSkillLevel(npcid,weapontype,level);
native GetNPCWeaponSkillLevel(npcid,weapontype);
native SetNPCHealth(npcid,Float:amount);
native Float:GetNPCHealth(npcid);
native SetNPCArmour(npcid,Float:amount);
native Float:GetNPCArmour(npcid);
native SetNPCInterior(npcid,interior);
native GetNPCInterior(npcid);
native SetNPCSpecialAction(npcid,action);
native GetNPCSpecialAction(npcid);
native SetNPCAnimationIndex(npcid,animationid);
native GetNPCAnimationIndex(npcid);
native SetNPCSkin(npcid,skin);
native GetNPCSkin(npcid);
native SetNPCSurfing(npcid,Float:X,Float:Y,Float:Z);
native GetNPCSurfing(npcid,&Float:X,&Float:Y,&Float:Z);
native SetNPCSurfingVehicle(npcid,vehicleid);
native GetNPCSurfingVehicle(npcid);
native SetNPCImpregnable(npcid,istate);
native IsNPCImpregnable(npcid);
// driver controls
native PutNPCInVehicle(npcid,vehicleid,seat);
native NPC_DriveTo(npcid,Float:X,Float:Y,Float:Z,Float:speed,is_z_map);
native SetNPCVehicleSiren(npcid,vstate);
native GetNPCVehicleSiren(npcid);
native SetNPCVehicleHealth(npcid,health);
native GetNPCVehicleHealth(npcid);
native SetNPCVehicleTrailer(npcid,trailerid);
native GetNPCVehicleTrailer(npcid);
// passanger controls
native SetNPCPassangerDriveBy(npcid,istate);
native GetNPCPassangerDriveBy(npcid);
// damage config
native SetWeaponDamageForNPC(weaponid,Float:damage);
native SetWeaponReloadTimeForNPC(weaponid,mstime);
// .rec playbacks
native StartRecordingPlayback(npcid,name[]);
native PauseRecordingPlayback(npcid);
native ContinueRecordingPlayback(npcid);
native StopRecordingPlayback(npcid);
// GTA SA paths
native Node:OpenNode(name[]);
native CloseNode(Node:nodeid);
native GetNodeHeader(Node:nodeid,&nodes,&vehicle_nodes,&ped_nodes,&navi_nodes);
native SetNodePoint(Node:nodeid,pointid);
native GetNodePoint(Node:nodeid);
native GetNodePointPos(Node:nodeid,&Float:X,&Float:Y,&Float:Z);
native GetNodePointLinkId(Node:nodeid);
native GetNodePointAreaId(Node:nodeid);
native GetNodePointWidth(Node:nodeid);
native GetNodePointLinkCount(Node:pointid);
native GetNodePointTrafficLevel(Node:nodeid);
native IsNodePointRoadBlock(Node:nodeid);
native IsNodePointBoats(Node:nodeid);
native IsNodePointEmergency(Node:nodeid);
native IsNodePointNotHighway(Node:nodeid);
native IsNodePointSpawn(Node:nodeid);
native IsNodePointRoadBlock1(Node:nodeid);
native IsNodePointParking(Node:nodeid);
native IsNodePointRoadBlock2(Node:nodeid);
native GetNodePointType(Node:nodeid);
native SetNodeLink(Node:nodeid,linkid);
native GetNodeLinkAreaId(Node:nodeid);
native GetNodeLinkNodeId(Node:nodeid);
// Nodes manager
native nodes_Init();
native nodes_Exit();
native nodes_GetNodePos(nodetype,nodeid,&Float:x,&Float:y,&Float:z);
native nodes_GetNodeAreaid(nodetype,nodeid);
native nodes_GetNodeNodeid(nodetype,nodeid);
native nodes_GetNodeLink(nodetype,nodeid,linkid);
native Float:nodes_GetNodeLinkDist(nodetype,nodeid,linkid);
native nodes_GetNodeLinkCount(nodetype,nodeid);
native nodes_GetNodeCount(nodetype);
native nodes_GetNodeid(nodetype,Float:x,Float:y,Float:z);
native nodes_GetAreaid(Float:fx,Float:fy,Float:fz);
native nodes_GetAreasFromPos(Float:startx,Float:starty,Float:endx,Float:endy,areas[64]);
native nodes_GetAreaNodeid(nodetype,areaid,nodeid);
native nodes_GetAreaNodeCount(nodetype,areaid);
// dijkstra
native dijkstra_CalcPathByNodes(areas[64],nodetype,startnodeid,endnodeid);
// node paths
native path_Destroy(pathid);
native path_GetPathNodeid(pathid,pointid);
native path_GetPathLen(pathid);
native Float:path_GetPathDist(pathid);
// zmap
native zmap_Init(filename[],mode);
native zmap_Exit();
native Float:zmap_GetZCoord(Float:x,Float:y);
native zmap_IsPointToPointLOS(Float:sx,Float:sy,Float:sz,Float:ex,Float:ey,Float:ez);
// addition
native microtime(&sec,µsec);
cnpc_controller.inc:
controller_ResetData(npcid)
controller_AddPathCoords(npcid,Float:x,Float:y,Float:z)
controller_GetPathCoordsLen(npcid)
controller_GetPathCoordsData(npcid,pointid,&Float:x,&Float:y,&Float:z)
controller_GetPathCoordsDist(npcid)
controller_DriveToByNodes(npcid,Float:x,Float:y,Float:z,Float:speed,boost)
controller_DriveToByExistPath(npcid,Float:speed,boost)
controller_DriveToByCoords(npcid,Float:speed,boost)
controller_MoveToByNodes(npcid,Float:x,Float:y,Float:z,move_type)
controller_MoveToByExistPath(npcid,move_type)
controller_MoveToByCoords(npcid,move_type)
controller_FollowPlayerByNodes(npcid,playerid,move_type)
controller_IsMoving(npcid)
cnpc_paths.inc:
paths_ResetData(npcid)
paths_CalcPathForNPC(npcid,nodetype,startnodeid,endnodeid)
paths_GetPathLen(npcid)
paths_GetPathDist(npcid)
paths_GetPathPointNodeid(npcid,pointid)
paths_GetPathPointPos(npcid,pointid,&Float:x,&Float:y,&Float:z)
Версия для SA-MP 0.3x R1-2.
Видео-презентация: