Don't like ads? PRO users don't see any ads ;-)
Guest

AutoGangschaltung

By: a guest on May 5th, 2012  |  syntax: PAWN  |  size: 9.93 KB  |  hits: 17  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. /*
  2.         Scriptinformation:
  3.  
  4.         @ Author(s):        <NicoAiko>
  5.  
  6.         @ Version:          <0.1>
  7.  
  8.         @ Type:             <Include>
  9.  
  10.         @ Language(s):      <German>
  11. */
  12.  
  13. #include <a_samp>
  14. #include <Farben>
  15.  
  16. #define function:%0(%1) \
  17.                 forward %0(%1); \
  18.                 public %0(%1)
  19.  
  20. #define MAX_MODELID 211
  21.  
  22. /*
  23.  
  24. native n_VehicleInit(Hoch,Runter);
  25. native n_OnVehicleSpawn(vehicleid);
  26. native n_OnPlayerStateChange(playerid,newstate,oldstate);
  27. native n_OnPlayerKeyStateChange(playerid,newkeys,oldkeys);
  28. native SetVehicleModelMaxGangSpeed(modelid,BackGang,Gang1,Gang2=-1,Gang3=-1,Gang4=-1,Gang5=-1,Gang6=-1);
  29. native GetVehicleModelMaxSpeed(vehicleid,&BackGang,&Gang1,&Gang2,&Gang3,&Gang4,&Gang5,&Gang6);
  30. native GetVehicleModelMaxGangSpeed(vehicleid);
  31. native GetVehicleATMGang(vehicleid);
  32.  
  33. */
  34.  
  35. new n_Gang[MAX_VEHICLES] = -1;
  36. new n_Max_Speed_Gang_Timer[MAX_VEHICLES];
  37. new n_Max_Gang_Speed[MAX_MODELID][7]; // [0] = Rückwärts [1] - [6] = 1 - 6
  38.  
  39. new n_GangRunterKey;
  40. new n_GangHochKey;
  41.  
  42. function:n_VehicleInit(Hoch,Runter)
  43. {
  44.         print(" - Gangschaltungs-System -\n");
  45.         print(" -    made by NicoAiko   -\n");
  46.         print(" -   (c) ~~ NicoAiko ~~  -\n");
  47.         print(" -       -  2012  -      -");
  48.         for(new i = 0; i < MAX_MODELID; i++)
  49.         {
  50.             n_Max_Gang_Speed[i][0] = 0;
  51.             n_Max_Gang_Speed[i][1] = 0;
  52.             n_Max_Gang_Speed[i][2] = 0;
  53.             n_Max_Gang_Speed[i][3] = 0;
  54.             n_Max_Gang_Speed[i][4] = 0;
  55.             n_Max_Gang_Speed[i][5] = 0;
  56.             n_Max_Gang_Speed[i][6] = 0;
  57.         }
  58.         for(new i = 0; i < MAX_VEHICLES; i++)
  59.         {
  60.             n_Gang[i] = -1;
  61.         }
  62.         n_GangHochKey = Hoch;
  63.         n_GangRunterKey = Runter;
  64.         return 1;
  65. }
  66.  
  67. function:n_OnVehicleSpawn(vehicleid)
  68. {
  69.         n_Gang[vehicleid] = -1;
  70.         return 1;
  71. }
  72.  
  73. function:n_OnPlayerStateChange(playerid,newstate,oldstate)
  74. {
  75.         new vehicleid = GetPlayerVehicleID(playerid);
  76.     if(newstate == PLAYER_STATE_DRIVER)
  77.     {
  78.                 n_Max_Speed_Gang_Timer[vehicleid] = SetTimerEx("UpdateVehicleState",500,1,"i",vehicleid);
  79.     }
  80.     if(oldstate == PLAYER_STATE_DRIVER)
  81.     {
  82.         KillTimer(n_Max_Speed_Gang_Timer[vehicleid]);
  83.     }
  84.     return 1;
  85. }
  86.  
  87. function:UpdateVehicleState(vehicleid)
  88. {
  89.         new modelid = GetVehicleModel(vehicleid);
  90.         new engine,rest[6];
  91.         GetVehicleParamsEx(vehicleid,engine,rest[0],rest[1],rest[2],rest[3],rest[4],rest[5]);
  92.         if(engine && n_Gang[vehicleid] == -1)
  93.         { n_Gang[vehicleid] = 1; }
  94.         if(!engine && n_Gang[vehicleid] > -1)
  95.         { n_Gang[vehicleid] = -1; }
  96.         if(GetVehicleModelMaxGangSpeed(vehicleid))
  97.         {
  98.                 if(GetVehicleATMGang(vehicleid) < 3)
  99.                 {
  100.                         new Float:x[2],Float:y[2];
  101.                         n_GetXYFrontTheVehicle(vehicleid,x[0],y[0],10);
  102.                         n_GetXYBehindTheVehicle(vehicleid,x[1],y[1],10);
  103.                         SetTimerEx("BackOrFrontVehicle",500,0,"dffff",vehicleid,x[0],y[0],x[1],y[1]);
  104.                 }
  105.                 if(n_GetSpeed(vehicleid) >= GetVehicleModelMaxGangSpeed(vehicleid))
  106.                 {
  107.                     n_SetSpeed(vehicleid,GetVehicleModelMaxGangSpeed(vehicleid));
  108.                 }
  109.                 if(n_GetSpeed(vehicleid) < n_Max_Gang_Speed[modelid-400][GetVehicleATMGang(vehicleid)-1] && GetVehicleATMGang(vehicleid) > 1)
  110.                 { SetVehicleGangDown(vehicleid); }
  111.         }
  112.         return 1;
  113. }
  114.  
  115. function:BackOrFrontVehicle(vehicleid,Float:nx0,Float:ny0,Float:nx1,Float:ny1)
  116. {
  117.         new Float:x,Float:y,Float:z;
  118.         GetVehiclePos(vehicleid,x,y,z);
  119.         if(GetVehicleDistanceFromPoint(vehicleid,nx0,ny0,z) > GetVehicleDistanceFromPoint(vehicleid,nx1,ny1,z) && n_Gang[vehicleid] > 0)
  120.         { n_Gang[vehicleid] = 0; return 1; }
  121.         else if(GetVehicleDistanceFromPoint(vehicleid,nx0,ny0,z) < GetVehicleDistanceFromPoint(vehicleid,nx1,ny1,z) && n_Gang[vehicleid] == 0)
  122.         { n_Gang[vehicleid] = 1; return 1; }
  123.         return 1;
  124. }
  125.  
  126. function:n_OnPlayerKeyStateChange(playerid,newkeys,oldkeys)
  127. {
  128.         if(newkeys & n_GangHochKey)
  129.         {
  130.             if(!IsPlayerInAnyVehicle(playerid)) return 1;
  131.             if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return 1;
  132.             new vehicleid = GetPlayerVehicleID(playerid);
  133.             if(!IsVehicleAbleToGangHoch(vehicleid)) return 1; // Fragt ab, ob das Fahrzeug in der Lage ist mit der derzeitigen Geschwindigkeit (siehe die Funktion) hochzuschalten
  134.             SetVehicleGangUp(vehicleid);
  135.             return 1;
  136.         }
  137.         if(newkeys & n_GangRunterKey)
  138.         {
  139.             if(!IsPlayerInAnyVehicle(playerid)) return 1;
  140.             if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return 1;
  141.             new vehicleid = GetPlayerVehicleID(playerid);
  142.             if(!IsVehicleAbleToGangRunter(vehicleid)) return 1;
  143.             SetVehicleGangDown(vehicleid);
  144.             return 1;
  145.         }
  146.         return 1;
  147. }
  148.  
  149. function:IsVehicleAbleToGangHoch(vehicleid)
  150. {
  151.         new modelid = GetVehicleModel(vehicleid);
  152.         new gang = GetVehicleATMGang(vehicleid);
  153.         if(gang == 6) return 0;
  154.         switch(gang)
  155.         {
  156.             case 0: return 1;
  157.             case 1..3:
  158.             {
  159.                 if(n_GetSpeed(vehicleid) < (n_Max_Gang_Speed[modelid-400][gang+1]/3)*2) return 0;
  160.                 else return 1;
  161.             }
  162.             case 4,5:
  163.             {
  164.                 if(n_GetSpeed(vehicleid) < floatround((n_Max_Gang_Speed[modelid-400][gang+1]/5)*2.5)) return 0;
  165.                 else return 1;
  166.             }
  167.             default: return 0;
  168.         }
  169.         return 1;
  170. }
  171.  
  172. function:IsVehicleAbleToGangRunter(vehicleid)
  173. {
  174.         new modelid = GetVehicleModel(vehicleid);
  175.         new gang = GetVehicleATMGang(vehicleid);
  176.         if(gang == 1) return 0;
  177.         switch(gang)
  178.         {
  179.             case 0: return 0;
  180.             case 2,3:
  181.             {
  182.                 if(n_GetSpeed(vehicleid) > (n_Max_Gang_Speed[modelid-400][gang-1]/3)*2) return 1;
  183.                 else return 0;
  184.             }
  185.             case 4..6:
  186.             {
  187.                 if(n_GetSpeed(vehicleid) > floatround((n_Max_Gang_Speed[modelid-400][gang-1]/5)*2.5)) return 1;
  188.                 else return 0;
  189.             }
  190.             default: return 0;
  191.         }
  192.         return 1;
  193. }
  194.  
  195. SetVehicleGangDown(vehicleid)
  196.         return n_Gang[vehicleid]--;
  197.        
  198. SetVehicleGangUp(vehicleid)
  199.         return n_Gang[vehicleid]++;
  200.  
  201. stock SetVehicleModelMaxGangSpeed(modelid,BackGang,Gang1,Gang2=-1,Gang3=-1,Gang4=-1,Gang5=-1,Gang6=-1) // MUST STAY stock!!
  202. {
  203.         if(modelid < 400 || modelid > 611) { printf("Fehler! Die angegebene ModelID ist unter 400 oder über 611! Angegeben: %d",modelid); return 0; }
  204.         if(Gang1 <= 10) { printf("Error! Gang 1 darf NICHT kleiner als 10 km/h sein!!!"); return 0; }
  205.         if(BackGang <= 10) { printf("Error! Rückwärtsgang darf NICHT kleiner als 10 km/h sein!!!"); return 0; }
  206.         n_Max_Gang_Speed[modelid-400][0] = BackGang;
  207.         n_Max_Gang_Speed[modelid-400][1] = Gang1;
  208.         if(Gang2 <= -1)
  209.         {
  210.                 n_Max_Gang_Speed[modelid-400][2] = -1;
  211.                 n_Max_Gang_Speed[modelid-400][3] = -1;
  212.                 n_Max_Gang_Speed[modelid-400][4] = -1;
  213.                 n_Max_Gang_Speed[modelid-400][5] = -1;
  214.                 n_Max_Gang_Speed[modelid-400][6] = -1;
  215.                 return 1;
  216.         }
  217.         else n_Max_Gang_Speed[modelid-400][2] = Gang2;
  218.         if(Gang3 <= -1)
  219.         {
  220.             n_Max_Gang_Speed[modelid-400][3] = -1;
  221.                 n_Max_Gang_Speed[modelid-400][4] = -1;
  222.                 n_Max_Gang_Speed[modelid-400][5] = -1;
  223.                 n_Max_Gang_Speed[modelid-400][6] = -1;
  224.                 return 1;
  225.         }
  226.         else n_Max_Gang_Speed[modelid-400][3] = Gang3;
  227.         if(Gang4 <= -1)
  228.         {
  229.             n_Max_Gang_Speed[modelid-400][4] = -1;
  230.                 n_Max_Gang_Speed[modelid-400][5] = -1;
  231.                 n_Max_Gang_Speed[modelid-400][6] = -1;
  232.                 return 1;
  233.         }
  234.         else n_Max_Gang_Speed[modelid-400][4] = Gang4;
  235.         if(Gang5 <= -1)
  236.         {
  237.                 n_Max_Gang_Speed[modelid-400][5] = -1;
  238.                 n_Max_Gang_Speed[modelid-400][6] = -1;
  239.                 return 1;
  240.         }
  241.         else n_Max_Gang_Speed[modelid-400][5] = Gang5;
  242.         if(Gang6 <= -1) n_Max_Gang_Speed[modelid-400][6] = -1;
  243.         else n_Max_Gang_Speed[modelid-400][6] = Gang6;
  244.         return 1;
  245. }
  246.  
  247. function:n_GetXYBehindTheVehicle(vehicleid, &Float:x, &Float:y, Float:distance)
  248. {
  249.         new Float:a;
  250.         GetVehiclePos(vehicleid,x,y,a);
  251.     GetVehicleZAngle(vehicleid,a);
  252.         x -= (distance * floatsin(-a,degrees));
  253.         y -= (distance * floatcos(-a,degrees));
  254.         return 1;
  255. }
  256.  
  257. function:n_GetXYFrontTheVehicle(vehicleid, &Float:x, &Float:y, Float:distance)
  258. {
  259.         new Float:a;
  260.         GetVehiclePos(vehicleid,x,y,a);
  261.     GetVehicleZAngle(vehicleid,a);
  262.         x += (distance * floatsin(-a,degrees));
  263.         y += (distance * floatcos(-a,degrees));
  264.         return 1;
  265. }
  266.  
  267. function:Float:GetDistanceBetweenPoints(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2) {
  268.         return floatsqroot(floatpower(x1 - x2, 2) + floatpower(y1 - y2, 2) + floatpower(z1 - z2, 2)); }
  269.  
  270. function:GetVehicleModelMaxSpeed(vehicleid,&BackGang,&Gang1,&Gang2,&Gang3,&Gang4,&Gang5,&Gang6)
  271. {
  272.         new modelid = GetVehicleModel(vehicleid);
  273.         if(n_Max_Gang_Speed[modelid-400][0] <= 0) // Gang 1 (Hier fragt er ab, ob es verändert wurde)
  274.         /* Wenn die maximale Geschwindigkeit nicht verändert wurde bzw. nicht angegeben wurde, dann ist sie 0!
  275.            Hat ein Fahrzeug z.B. 4 Gänge sind 4 davon über -1! Gang 5 & 6 wären dann -1! */
  276.         {
  277.             BackGang = 0,
  278.             Gang1 = 0,
  279.             Gang2 = 0,
  280.             Gang3 = 0,
  281.             Gang4 = 0,
  282.                 Gang5 = 0,
  283.                 Gang6 = 0;
  284.                 return 1;
  285.         }
  286.         BackGang = n_Max_Gang_Speed[modelid-400][0];
  287.         Gang1 = n_Max_Gang_Speed[modelid-400][1];
  288.         Gang2 = n_Max_Gang_Speed[modelid-400][2];
  289.         Gang3 = n_Max_Gang_Speed[modelid-400][3];
  290.         Gang4 = n_Max_Gang_Speed[modelid-400][4];
  291.         Gang5 = n_Max_Gang_Speed[modelid-400][5];
  292.         Gang6 = n_Max_Gang_Speed[modelid-400][6];
  293.         return 1;
  294. }
  295.  
  296. function:GetVehicleModelMaxGangSpeed(vehicleid)
  297. {
  298.     new n_MaxGangSpeed[7],n_ATMGang,modelid;
  299.     modelid = GetVehicleModel(vehicleid);
  300.         GetVehicleModelMaxSpeed(vehicleid,n_MaxGangSpeed[0],n_MaxGangSpeed[1],n_MaxGangSpeed[2],n_MaxGangSpeed[3],n_MaxGangSpeed[4],n_MaxGangSpeed[5],n_MaxGangSpeed[6]);
  301.         n_ATMGang = GetVehicleATMGang(vehicleid);
  302.         return n_Max_Gang_Speed[modelid-400][n_ATMGang];
  303. }
  304.  
  305. function:GetVehicleATMGang(vehicleid)
  306. {
  307.         return n_Gang[vehicleid];
  308. }
  309.  
  310. function:n_GetSpeed(vehicleid)
  311. {
  312.         new Float:x,Float:y,Float:z;
  313.         new Float:speed;
  314.         GetVehicleVelocity(vehicleid,x,y,z);
  315.         speed = floatsqroot(x*x+y*y+z*z) * 200;
  316.         new realspeed = floatround(speed);
  317.         return realspeed;
  318. }
  319. function:n_SetSpeed(vehicleid,Float:speed)
  320. {
  321.         new Float:x[2],Float:y[2],Float:z[2],Float:angle;
  322.         GetVehicleVelocity(vehicleid,x[0],y[0],z[0]);
  323.         GetVehiclePos(vehicleid,x[1],y[1],z[1]);
  324.         GetVehicleZAngle(vehicleid,angle);
  325.         angle = 360 - angle;
  326.         x[0] = (floatsin(angle,degrees) * (speed/200) + floatcos(angle, degrees) * 0 + x[1]) - x[1];
  327.         y[0] = (floatcos(angle,degrees) * (speed/200) + floatsin(angle, degrees) * 0 + y[1]) - y[1];
  328.         SetVehicleVelocity(vehicleid,x[0],y[0],z[0]);
  329.         return 1;
  330. }