Advertisement
Gamer_Z

AutoPilot

Nov 17th, 2011
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 5.83 KB | None | 0 0
  1. #include <a_samp>
  2. #include <RouteConnector>
  3. ////////////////////////////////////////////////////////////////////////////////
  4. new id[MAX_PLAYERS] = {-1,...};
  5. new CurrTarget[MAX_PLAYERS] = {0,...};
  6. new Timer[MAX_PLAYERS] = {-1,...};
  7. new interval = 75;
  8. new string[128];
  9. new Float:pos[2][3];
  10. ////////////////////////////////////////////////////////////////////////////////
  11. public OnPlayerCommandText(playerid,cmdtext[])
  12. {
  13.     if(!strcmp(cmdtext,"/car",true))
  14.     {
  15.         new Float:V[4];
  16.         GetPlayerPos(playerid,V[0],V[1],V[2]);
  17.         CreateVehicle(562,V[0],V[1],V[2],0.0,-1,-1,9999999);
  18.         return 1;
  19.     }
  20.     if(!strcmp(cmdtext,"/ap",true))
  21.     {
  22.         if(id[playerid] == -1)
  23.         CalculatePath(23833,16734,playerid);
  24.         return 1;
  25.     }
  26.     if(!strcmp(cmdtext,"/debug",true))
  27.     {
  28.         if(id[playerid] == -1)
  29.         CalculatePath(23833,16734,playerid+1000);
  30.         return 1;
  31.     }
  32.     if(!strcmp(cmdtext,"/i",true))
  33.     {
  34.         interval +=25;
  35.         format(string,128,"Interval: %d",interval);
  36.         SendClientMessage(playerid,-1,string);
  37.         return 1;
  38.     }
  39.     if(!strcmp(cmdtext,"/d",true))
  40.     {
  41.         interval-=25;
  42.         format(string,128,"Interval: %d",interval);
  43.         SendClientMessage(playerid,-1,string);
  44.         return 1;
  45.     }
  46.     return 0;
  47. }
  48. ////////////////////////////////////////////////////////////////////////////////
  49. public GPS_WhenRouteIsCalculated(routeid,node_id_array[],amount_of_nodes,distance)
  50. {
  51.     format(string,128,"Auto Pilot has been turned on captain! Nodes: %d",amount_of_nodes);
  52.     if(routeid > 999)
  53.     {
  54.         id[routeid-1000] = StoreRouteArray(amount_of_nodes,node_id_array);
  55.         Timer[routeid-1000] = SetTimerEx("AutoPilotStep",interval,1,"i",routeid-1000);
  56.         SendClientMessage(routeid-1000,-1,string);
  57.     }
  58.     else
  59.     {
  60.         id[routeid] = StoreRouteArray(amount_of_nodes,node_id_array);
  61.         Timer[routeid] = SetTimerEx("AutoPilot",interval,1,"i",routeid);
  62.         SendClientMessage(routeid,-1,string);
  63.     }
  64.     return 1;
  65. }
  66.  
  67. public OnPlayerClosestNodeIDChange(playerid,old_NodeID,new_NodeID)
  68. {
  69. //  SetVehicleVelocity(GetPlayerVehicleID(playerid),0.0,0.0,0.0);
  70.     return 1;
  71. }
  72.  
  73. forward AutoPilotStep(playerid);
  74. public AutoPilotStep(playerid)
  75. {
  76.     if(IsPlayerInAnyVehicle(playerid))
  77.     {
  78.         new vehicleid = GetPlayerVehicleID(playerid);
  79.         SetVehicleHealth(vehicleid,1000.0);
  80.         new amount;
  81.         GetNodePos(GetRouteAtPos(id[playerid],CurrTarget[playerid]++,amount),pos[0][0],pos[0][1],pos[0][2]);
  82.         SetVehiclePos(vehicleid,pos[0][0],pos[0][1],pos[0][2]+2.0);
  83.         if(amount <= (CurrTarget[playerid]+1))
  84.         {
  85.             KillTimer(Timer[playerid]);
  86.             Timer[playerid] = -1;
  87.             DeleteArray(id[playerid]);
  88.             id[playerid] = -1;
  89.             CurrTarget[playerid] = 0;
  90.         }
  91.     }
  92.     else
  93.     {
  94.         KillTimer(Timer[playerid]);
  95.         Timer[playerid] = -1;
  96.         DeleteArray(id[playerid]);
  97.         id[playerid] = -1;
  98.         CurrTarget[playerid] = 0;
  99.     }
  100. }
  101.  
  102. forward AutoPilot(playerid);
  103. public AutoPilot(playerid)
  104. {
  105.     if(IsPlayerInAnyVehicle(playerid))
  106.     {
  107.         new vehicleid = GetPlayerVehicleID(playerid);
  108.         SetVehicleHealth(vehicleid,1000.0);
  109.         if(CurrTarget[playerid] == 0)
  110.         {
  111.             CurrTarget[playerid]++;
  112.             GetNodePos(GetRouteAtPos(id[playerid],CurrTarget[playerid]),pos[0][0],pos[0][1],pos[0][2]);
  113.             SetVehiclePos(vehicleid,pos[0][0],pos[0][1],pos[0][2]+2.0);
  114.             format(string,128,"NodeID: %d\tX: %.2f Y: %.2f Z: %.2f T: %d",GetRouteAtPos(id[playerid],CurrTarget[playerid]),pos[0][0],pos[0][1],pos[0][2],CurrTarget[playerid]);
  115.             SendClientMessage(playerid,-1,string);
  116.             return 1;
  117.         }
  118.         new amount;
  119.         new nodeid = GetRouteAtPos(id[playerid],CurrTarget[playerid],amount);
  120.         if((CurrTarget[playerid]+1) >= amount)
  121.         {
  122.             KillTimer(Timer[playerid]);
  123.             Timer[playerid] = -1;
  124.             DeleteArray(id[playerid]);
  125.             id[playerid] = -1;
  126.             CurrTarget[playerid] = 0;
  127.             return 1;
  128.         }
  129.         //GetVehiclePos(vehicleid,pos[0][0],pos[0][1],pos[0][2]);
  130.         GetNodePos(nodeid,pos[1][0],pos[1][1],pos[1][2]);
  131.         format(string,128,"NodeID: %d\tX: %.2f Y: %.2f Z: %.2f T: %d",nodeid,pos[1][0],pos[1][1],pos[1][2],CurrTarget[playerid]);
  132.         if(IsPlayerInRangeOfPoint(playerid,3.0,pos[1][0],pos[1][1],pos[1][2]))
  133.         {
  134.             CurrTarget[playerid]++;
  135.             return 1;
  136.             //format(string,128,"%s IR",string);
  137.             //GetNodePos(nodeid,pos[1][0],pos[1][1],pos[1][2]);
  138.         }
  139.         SendClientMessage(playerid,-1,string);
  140.         //Now lets engage the auto pilot!
  141.         PullVehicleIntoDirection(vehicleid,pos[1][0],pos[1][1],pos[1][2],0.1);
  142.     }
  143.     else
  144.     {
  145.         KillTimer(Timer[playerid]);
  146.         Timer[playerid] = -1;
  147.         DeleteArray(id[playerid]);
  148.         id[playerid] = -1;
  149.         CurrTarget[playerid] = 0;
  150.     }
  151.     return 1;
  152. }
  153. //--------------------AUTO-PILOT-CORE-FUNCTIONS-------------------------------//
  154. stock PullVehicleIntoDirection(VehicleID,Float:X,Float:Y,Float:Z,Float:Speed)//Or DriveVehicleToDirection.. ShootVehicletodirection.. whatever
  155. {
  156.     #pragma unused Z
  157.     new Float:StartPos[3];
  158.     new Float:u[2];
  159.     GetVehiclePos(VehicleID, StartPos[0],StartPos[1],StartPos[2]);
  160.     SetVehicleZAngle(VehicleID,atan2VehicleZ(StartPos[0],StartPos[1],X,Y));
  161.     u[0] = X-StartPos[0];//deltaX
  162.     u[1] = Y-StartPos[1];//deltaY
  163.     //if(u[0] < 0.01)u[0] = 0.1;//does not fix the problem...
  164.     u[1] = u[1]/u[0];//RC = dY/dX
  165.     GetVehicleVelocity(VehicleID,StartPos[0],StartPos[1],StartPos[2]);//fix for 'flying car'
  166.     if(u[0] < 0)
  167.         SetVehicleVelocity(VehicleID,(Speed*-1.0),((Speed*u[1])*-1.0),StartPos[2]);
  168.     else
  169.         SetVehicleVelocity(VehicleID,Speed,Speed*u[1],StartPos[2]);
  170.     return 1;
  171. }
  172.  
  173. forward Float:atan2VehicleZ(Float:Xb,Float:Yb,Float:Xe,Float:Ye);// Dunno how to name it...
  174. stock Float:atan2VehicleZ(Float:Xb,Float:Yb,Float:Xe,Float:Ye)
  175. {
  176.     new Float:a = floatabs(360.0 - atan2( Xe-Xb,Ye-Yb));
  177.     if(360 > a > 180)return a;
  178.     return a-360.0;
  179. }
  180. //----------------------------------------------------------------------------//
  181.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement