Advertisement
Guest User

Gangschaltung v0.3

a guest
Mar 11th, 2013
320
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 12.58 KB | None | 0 0
  1. /*
  2.     Scriptinformation:
  3.  
  4.     @ Author(s):        <NicoAiko>
  5.  
  6.     @ Version:          <0.3>
  7.  
  8.     @ Type:             <Include>
  9.  
  10.     @ Language(s):      <German>
  11.    
  12.     @ Changelog:
  13.  
  14.         v0.3:
  15.             - Schaltkeys sind nun Spielerbedingt auswählbar
  16.  
  17.         v0.2:
  18.        
  19.             - Hooking eingefügt (D.h. keine Installation mehr nötig)
  20.             - Rückwärtsgangbeschränkung aufgrund von Bugs entfernt
  21.             - Schaltkeys vom Spiel aus bestimmbar
  22.  
  23.         v0.1:
  24.        
  25.             - Release
  26.  
  27.     @ Bugs:
  28.    
  29.         - Keine bekannt!
  30. */
  31.  
  32. #include <a_samp>
  33.  
  34. #define MAX_MODELID 211
  35.  
  36. /*
  37.  
  38. native SetModelMaxGearSpeed(modelid,Gang1,Gang2=-1,Gang3=-1,Gang4=-1,Gang5=-1,Gang6=-1);
  39. native GetModelMaxSpeed(modelid,&Gang1,&Gang2,&Gang3,&Gang4,&Gang5,&Gang6);
  40. native GetVehicleModelMaxGearSpeed(vehicleid);
  41. native GetVehicleATMGear(vehicleid);
  42. native SetPlayerVehicleGearKeys(playerid, Hoch, Runter);
  43.  
  44. */
  45.  
  46. new n_Gang[MAX_VEHICLES] = -1,
  47.     n_Max_Speed_Gang_Timer[MAX_VEHICLES],
  48.     n_Max_Gang_Speed[MAX_MODELID][6] // [0] = 1, [2] - [5] = 2 - 6
  49.  
  50. ;
  51. // Es gibt keinen MaxSpeed für den Rückwärtsgang aber trotzdem noch den Rückwärtsgang an sich!
  52.  
  53. new n_StandardUpKey[MAX_PLAYERS]        = KEY_ANALOG_UP,
  54.     n_StandardDownKey[MAX_PLAYERS]      = KEY_ANALOG_DOWN
  55.    
  56. ;
  57.  
  58. forward n_VehicleInit();
  59. forward n_OnVehicleSpawn(vehicleid);
  60. forward n_OnPlayerStateChange(playerid,newstate,oldstate);
  61. forward n_OnPlayerKeyStateChange(playerid,newkeys,oldkeys);
  62.  
  63. public OnGameModeInit()
  64. {
  65.     print(" - Gangschaltungs-System -\n");
  66.     print(" -          v0.3         -\n");
  67.     print(" -    made by NicoAiko   -\n");
  68.     print(" -   (c) ~~ NicoAiko ~~  -\n");
  69.     print(" -       -  2013  -      -");
  70.     for(new i = 0; i < MAX_MODELID; i++)
  71.     {
  72.         n_Max_Gang_Speed[i][0] = 0;
  73.         n_Max_Gang_Speed[i][1] = 0;
  74.         n_Max_Gang_Speed[i][2] = 0;
  75.         n_Max_Gang_Speed[i][3] = 0;
  76.         n_Max_Gang_Speed[i][4] = 0;
  77.         n_Max_Gang_Speed[i][5] = 0;
  78.     }
  79.     for(new i = 0; i < MAX_VEHICLES; i++)
  80.     {
  81.         n_Gang[i] = -1;
  82.     }
  83.     return CallLocalFunction("n_VehicleInit","");
  84. }
  85. public OnVehicleSpawn(vehicleid)
  86. {
  87.     n_Gang[vehicleid] = -1;
  88.     return CallLocalFunction("n_OnVehicleSpawn","i",vehicleid);
  89. }
  90. public OnPlayerStateChange(playerid,newstate,oldstate)
  91. {
  92.     new vehicleid = GetPlayerVehicleID(playerid);
  93.     if(newstate == PLAYER_STATE_DRIVER)
  94.     {
  95.         n_Max_Speed_Gang_Timer[vehicleid] = SetTimerEx("UpdateVehicleState",500,1,"i",vehicleid);
  96.     }
  97.     if(oldstate == PLAYER_STATE_DRIVER)
  98.     {
  99.         KillTimer(n_Max_Speed_Gang_Timer[vehicleid]);
  100.     }
  101.     return CallLocalFunction("n_OnPlayerStateChange","iii",playerid,newstate,oldstate);
  102. }
  103. public OnPlayerKeyStateChange(playerid,newkeys,oldkeys)
  104. {
  105.     if(newkeys & n_StandardUpKey[playerid] && !(oldkeys & n_StandardUpKey[playerid]))
  106.     {
  107.         if(!IsPlayerInAnyVehicle(playerid)) return 1;
  108.         if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return 1;
  109.         new vehicleid = GetPlayerVehicleID(playerid);
  110.         if(!IsVehicleAbleToGearUp(vehicleid)) return 1; // Fragt ab, ob das Fahrzeug in der Lage ist mit der derzeitigen Geschwindigkeit (siehe die Funktion) hochzuschalten
  111.         SetVehicleGearUp(vehicleid);
  112.     }
  113.     if(newkeys & n_StandardDownKey[playerid] && !(oldkeys & n_StandardDownKey[playerid]))
  114.     {
  115.         if(!IsPlayerInAnyVehicle(playerid)) return 1;
  116.         if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return 1;
  117.         new vehicleid = GetPlayerVehicleID(playerid);
  118.         if(!IsVehicleAbleToGearDown(vehicleid)) return 1;
  119.         SetVehicleGearDown(vehicleid);
  120.     }
  121.     return CallLocalFunction("n_OnPlayerKeyStateChange","iii",playerid,newkeys,oldkeys);
  122. }
  123.  
  124. forward UpdateVehicleState(vehicleid);
  125. public UpdateVehicleState(vehicleid)
  126. {
  127.     new modelid = GetVehicleModel(vehicleid);
  128.     new engine,rest[6];
  129.     GetVehicleParamsEx(vehicleid,engine,rest[0],rest[1],rest[2],rest[3],rest[4],rest[5]);
  130.     if(engine && n_Gang[vehicleid] == -1)
  131.     { n_Gang[vehicleid] = 1; }
  132.     if(!engine && n_Gang[vehicleid] > -1)
  133.     { n_Gang[vehicleid] = -1; }
  134.     if(GetVehicleModelMaxGearSpeed(vehicleid))
  135.     {
  136.         if(GetVehicleATMGear(vehicleid) < 3)
  137.         {
  138.             new Float:x[2],Float:y[2];
  139.             n_GetXYFrontTheVehicle(vehicleid,x[0],y[0],10);
  140.             n_GetXYBehindTheVehicle(vehicleid,x[1],y[1],10);
  141.             SetTimerEx("BackOrFrontVehicle",250,0,"dffff",vehicleid,x[0],y[0],x[1],y[1]);
  142.         }
  143.         if(n_GetSpeed(vehicleid) >= GetVehicleModelMaxGearSpeed(vehicleid))
  144.         {
  145.             n_SetSpeed(vehicleid,GetVehicleModelMaxGearSpeed(vehicleid));
  146.         }
  147.         if(n_GetSpeed(vehicleid) < n_Max_Gang_Speed[modelid-400][GetVehicleATMGear(vehicleid)-1] && GetVehicleATMGear(vehicleid) > 1)
  148.         { SetVehicleGearDown(vehicleid); }
  149.     }
  150.     return 1;
  151. }
  152.  
  153. forward BackOrFrontVehicle(vehicleid, Float:nx0, Float:ny0, Float:nx1, Float:ny1);
  154. public BackOrFrontVehicle(vehicleid,Float:nx0,Float:ny0,Float:nx1,Float:ny1)
  155. {
  156.     new Float:x,Float:y,Float:z;
  157.     GetVehiclePos(vehicleid,x,y,z);
  158.     if(GetVehicleDistanceFromPoint(vehicleid,nx0,ny0,z) > GetVehicleDistanceFromPoint(vehicleid,nx1,ny1,z) && n_Gang[vehicleid] > 0)
  159.     { n_Gang[vehicleid] = 0; return 1; }
  160.     else if(GetVehicleDistanceFromPoint(vehicleid,nx0,ny0,z) < GetVehicleDistanceFromPoint(vehicleid,nx1,ny1,z) && n_Gang[vehicleid] == 0)
  161.     { n_Gang[vehicleid] = 1; return 1; }
  162.     return 1;
  163. }
  164.  
  165. forward IsVehicleAbleToGearUp(vehicleid);
  166. public IsVehicleAbleToGearUp(vehicleid)
  167. {
  168.     new modelid = GetVehicleModel(vehicleid);
  169.     new gang = GetVehicleATMGear(vehicleid);
  170.     if(gang == 6) return 0;
  171.     switch(gang)
  172.     {
  173.         case 0: return 1;
  174.         case 1..3:
  175.         {
  176.             if(n_GetSpeed(vehicleid) < (n_Max_Gang_Speed[modelid-400][gang+1]/3)*2) return 0;
  177.             else return 1;
  178.         }
  179.         case 4,5:
  180.         {
  181.             if(n_GetSpeed(vehicleid) < floatround((n_Max_Gang_Speed[modelid-400][gang+1]/5)*2.5)) return 0;
  182.             else return 1;
  183.         }
  184.         default: return 0;
  185.     }
  186.     return 1;
  187. }
  188.  
  189. forward IsVehicleAbleToGearDown(vehicleid);
  190. public IsVehicleAbleToGearDown(vehicleid)
  191. {
  192.     new modelid = GetVehicleModel(vehicleid);
  193.     new gang = GetVehicleATMGear(vehicleid);
  194.     if(gang == 1) return 0;
  195.     switch(gang)
  196.     {
  197.         case 0: return 0;
  198.         case 2,3:
  199.         {
  200.             if(n_GetSpeed(vehicleid) > (n_Max_Gang_Speed[modelid-400][gang-1]/3)*2) return 1;
  201.             else return 0;
  202.         }
  203.         case 4..6:
  204.         {
  205.             if(n_GetSpeed(vehicleid) > floatround((n_Max_Gang_Speed[modelid-400][gang-1]/5)*2.5)) return 1;
  206.             else return 0;
  207.         }
  208.         default: return 0;
  209.     }
  210.     return 1;
  211. }
  212.  
  213. SetVehicleGearDown(vehicleid)
  214.     return n_Gang[vehicleid]--;
  215.  
  216. SetVehicleGearUp(vehicleid)
  217.     return n_Gang[vehicleid]++;
  218.  
  219. stock SetModelMaxGearSpeed(modelid,Gang1,Gang2=-1,Gang3=-1,Gang4=-1,Gang5=-1,Gang6=-1) // MUST STAY stock!!
  220. {
  221.     if(modelid < 400 || modelid > 611) { printf("Fehler! Die angegebene ModelID ist unter 400 oder über 611! Angegeben: %d",modelid); return 0; }
  222.     if(Gang1 <= 10) { printf("Error! Gang 1 darf NICHT kleiner als 10 km/h sein!!!"); return 0; }
  223.     n_Max_Gang_Speed[modelid-400][0] = Gang1;
  224.     if(Gang2 <= 0)
  225.     {
  226.         n_Max_Gang_Speed[modelid-400][1] = -1;
  227.         n_Max_Gang_Speed[modelid-400][2] = -1;
  228.         n_Max_Gang_Speed[modelid-400][3] = -1;
  229.         n_Max_Gang_Speed[modelid-400][4] = -1;
  230.         n_Max_Gang_Speed[modelid-400][5] = -1;
  231.         return 1;
  232.     }
  233.     else n_Max_Gang_Speed[modelid-400][1] = Gang2;
  234.     if(Gang3 <= 0)
  235.     {
  236.         n_Max_Gang_Speed[modelid-400][2] = -1;
  237.         n_Max_Gang_Speed[modelid-400][3] = -1;
  238.         n_Max_Gang_Speed[modelid-400][4] = -1;
  239.         n_Max_Gang_Speed[modelid-400][5] = -1;
  240.         return 1;
  241.     }
  242.     else n_Max_Gang_Speed[modelid-400][2] = Gang3;
  243.     if(Gang4 <= 0)
  244.     {
  245.         n_Max_Gang_Speed[modelid-400][3] = -1;
  246.         n_Max_Gang_Speed[modelid-400][4] = -1;
  247.         n_Max_Gang_Speed[modelid-400][5] = -1;
  248.         return 1;
  249.     }
  250.     else n_Max_Gang_Speed[modelid-400][3] = Gang4;
  251.     if(Gang5 <= 0)
  252.     {
  253.         n_Max_Gang_Speed[modelid-400][4] = -1;
  254.         n_Max_Gang_Speed[modelid-400][5] = -1;
  255.         return 1;
  256.     }
  257.     else n_Max_Gang_Speed[modelid-400][4] = Gang5;
  258.     if(Gang6 <= 0) n_Max_Gang_Speed[modelid-400][5] = -1;
  259.     else n_Max_Gang_Speed[modelid-400][5] = Gang6;
  260.     return 1;
  261. }
  262.  
  263. forward n_GetXYBehindTheVehicle(vehicleid, &Float:x, &Float:y, Float:distance);
  264. public n_GetXYBehindTheVehicle(vehicleid, &Float:x, &Float:y, Float:distance)
  265. {
  266.     new Float:a;
  267.     GetVehiclePos(vehicleid,x,y,a);
  268.     GetVehicleZAngle(vehicleid,a);
  269.     x -= (distance * floatsin(-a,degrees));
  270.     y -= (distance * floatcos(-a,degrees));
  271.     return 1;
  272. }
  273.  
  274. forward n_GetXYFrontTheVehicle(vehicleid, &Float:x, &Float:y, Float:distance);
  275. public n_GetXYFrontTheVehicle(vehicleid, &Float:x, &Float:y, Float:distance)
  276. {
  277.     new Float:a;
  278.     GetVehiclePos(vehicleid,x,y,a);
  279.     GetVehicleZAngle(vehicleid,a);
  280.     x += (distance * floatsin(-a,degrees));
  281.     y += (distance * floatcos(-a,degrees));
  282.     return 1;
  283. }
  284.  
  285. forward Float:GetDistanceBetweenPoints(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2);
  286. public Float:GetDistanceBetweenPoints(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2) {
  287.     return floatsqroot(floatpower(x1 - x2, 2) + floatpower(y1 - y2, 2) + floatpower(z1 - z2, 2));
  288. }
  289.  
  290. forward GetModelMaxSpeed(modelid,&Gang1,&Gang2,&Gang3,&Gang4,&Gang5,&Gang6);
  291. public GetModelMaxSpeed(modelid,&Gang1,&Gang2,&Gang3,&Gang4,&Gang5,&Gang6)
  292. {
  293.     if(n_Max_Gang_Speed[modelid-400][0] <= 0) // 1.Gang (Hier fragt er ab, ob es verändert wurde)
  294.     /* Wenn die maximale Geschwindigkeit nicht verändert wurde bzw. nicht angegeben wurde, dann ist sie 0!
  295.        Hat ein Fahrzeug z.B. 4 Gänge sind 4 davon über -1! Gang 5 & 6 wären dann -1! */
  296.     {
  297.         Gang1 = 0,
  298.         Gang2 = 0,
  299.         Gang3 = 0,
  300.         Gang4 = 0,
  301.         Gang5 = 0,
  302.         Gang6 = 0;
  303.         return 1;
  304.     }
  305.     Gang1 = n_Max_Gang_Speed[modelid-400][0];
  306.     Gang2 = n_Max_Gang_Speed[modelid-400][1];
  307.     Gang3 = n_Max_Gang_Speed[modelid-400][2];
  308.     Gang4 = n_Max_Gang_Speed[modelid-400][3];
  309.     Gang5 = n_Max_Gang_Speed[modelid-400][4];
  310.     Gang6 = n_Max_Gang_Speed[modelid-400][5];
  311.     return 1;
  312. }
  313.  
  314. forward GetVehicleModelMaxGearSpeed(vehicleid);
  315. public GetVehicleModelMaxGearSpeed(vehicleid)
  316. {
  317.     new n_MaxGangSpeed[6],n_ATMGang,modelid;
  318.     modelid = GetVehicleModel(vehicleid);
  319.     GetModelMaxSpeed(modelid,n_MaxGangSpeed[0],n_MaxGangSpeed[1],n_MaxGangSpeed[2],n_MaxGangSpeed[3],n_MaxGangSpeed[4],n_MaxGangSpeed[5]);
  320.     n_ATMGang = GetVehicleATMGear(vehicleid);
  321.     if(n_ATMGang <= 0) { return -1; }
  322.     else return n_Max_Gang_Speed[modelid-400][n_ATMGang];
  323. }
  324.  
  325. forward ResetModelMaxSpeed(modelid);
  326. public ResetModelMaxSpeed(modelid)
  327. {
  328.     n_Max_Gang_Speed[modelid-400][0] = -1;
  329.     n_Max_Gang_Speed[modelid-400][1] = -1;
  330.     n_Max_Gang_Speed[modelid-400][2] = -1;
  331.     n_Max_Gang_Speed[modelid-400][3] = -1;
  332.     n_Max_Gang_Speed[modelid-400][4] = -1;
  333.     n_Max_Gang_Speed[modelid-400][5] = -1;
  334.     return;
  335. }
  336.  
  337. forward GetVehicleATMGear(vehicleid);
  338. public GetVehicleATMGear(vehicleid)
  339. {
  340.     return n_Gang[vehicleid];
  341. }
  342.  
  343. forward SetPlayerVehicleGearKeys(playerid, Hoch, Runter);
  344. public SetPlayerVehicleGearKeys(playerid, Hoch, Runter)
  345. {
  346.     if(n_IsAValidKey(Hoch))
  347.     {
  348.         n_StandardUpKey[playerid] = Hoch;
  349.     }
  350.     if(n_IsAValidKey(Runter))
  351.     {
  352.         if(Runter != Hoch)
  353.         {
  354.             n_StandardDownKey[playerid] = Runter;
  355.             return 1;
  356.         }
  357.         else return -1;
  358.     }
  359.     return 0;
  360. }
  361.  
  362. forward n_GetSpeed(vehicleid);
  363. public n_GetSpeed(vehicleid)
  364. {
  365.     new Float:x,Float:y,Float:z;
  366.     new Float:speed;
  367.     GetVehicleVelocity(vehicleid,x,y,z);
  368.     speed = floatsqroot(x*x+y*y+z*z) * 200;
  369.     new realspeed = floatround(speed);
  370.     return realspeed;
  371. }
  372.  
  373. forward n_SetSpeed(vehicleid,Float:speed);
  374. public n_SetSpeed(vehicleid,Float:speed)
  375. {
  376.     new Float:x[2],Float:y[2],Float:z[2],Float:angle;
  377.     GetVehicleVelocity(vehicleid,x[0],y[0],z[0]);
  378.     GetVehiclePos(vehicleid,x[1],y[1],z[1]);
  379.     GetVehicleZAngle(vehicleid,angle);
  380.     angle = 360 - angle;
  381.     if(GetVehicleATMGear(vehicleid) > 0)
  382.     {
  383.         x[0] = (floatsin(angle,degrees) * (speed/200) + floatcos(angle, degrees) * 0 + x[1]) - x[1];
  384.         y[0] = (floatcos(angle,degrees) * (speed/200) + floatsin(angle, degrees) * 0 + y[1]) - y[1];
  385.         SetVehicleVelocity(vehicleid,x[0],y[0],z[0]);
  386.     }
  387.     return 1;
  388. }
  389.  
  390. forward n_IsAValidKey(Key);
  391. public n_IsAValidKey(Key)
  392. {
  393.     switch(Key)
  394.     {
  395.         case -128,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,65536,131072,262144: return 1;
  396.         default: return 0;
  397.     }
  398.     return 0;
  399. }
  400.  
  401. #if defined _ALS_OnGameModeInit
  402.     #undef OnGameModeInit
  403. #else
  404.     #define _ALS_OnGameModeInit
  405. #endif
  406. #define OnGameModeInit n_VehicleInit
  407.  
  408. #if defined _ALS_OnVehicleSpawn
  409.     #undef OnVehicleSpawn
  410. #else
  411.     #define _ALS_OnVehicleSpawn
  412. #endif
  413. #define OnVehicleSpawn n_OnVehicleSpawn
  414.  
  415. #if defined _ALS_OnPlayerStateChange
  416.     #undef OnPlayerStateChange
  417. #else
  418.     #define _ALS_OnPlayerStateChange
  419. #endif
  420. #define OnPlayerStateChange n_OnPlayerStateChange
  421.  
  422. #if defined _ALS_OnPlayerKeyStateChange
  423.     #undef OnPlayerKeyStateChange
  424. #else
  425.     #define _ALS_OnPlayerKeyStateChange
  426. #endif
  427. #define OnPlayerKeyStateChange n_OnPlayerKeyStateChange
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement