Advertisement
JeffryUGP

[FS] Fraktions-Fahrzeug-System Beispielscript

Mar 13th, 2015
610
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 15.53 KB | None | 0 0
  1. /*============================================================================================================================*
  2. * Credits: Dieser Filterscript "Fraktions-Fahrzeug-System" wurde von Jeffry erstellt!                                         *
  3. *                                                                                                                             *
  4. *                                                                                                                             *
  5. * Made in March 2015 - Update: 2019/12.                                                                                       *
  6. *                                                                                                                             *
  7. * Rechte des Benutzers:                                                                                                       *
  8. *                                                                                                                             *
  9. * -Es ist erlaubt diesen Filterscript zu modifizieren, solange keine Credits entfernt werden.                                 *
  10. * -Es ist erlaubt diesen Filterscript neu zu veröffentlichen, solange keine Credits entfernt werden.                          *
  11. *                                                                                                                             *
  12. * -Es ist nicht erlaubt dies als sein eigenes Werk darzustellen oder zu verkaufen.                                            *
  13. * -Es ist nicht erlaubt Credits zu entfernen.                                                                                 *
  14. *                                                                                                                             *
  15. * Danke.                                                                                                                      *
  16. * Viel Spaß.                                                                                                                  *
  17. *                                                                                                                             *
  18. *=============================================================================================================================*/
  19. #include <a_samp>
  20. #include <a_mysql>
  21. #include <ocmd>
  22.  
  23. new MySQL:handle;
  24.  
  25. enum playerEnum {
  26.     pFraction
  27. };
  28. new PlayerInfo[MAX_PLAYERS][playerEnum];
  29.  
  30. #define MAX_FRAC_VEHICLES 10
  31. enum fracVehEnum {
  32.     e_modelID,
  33.     Float:e_x,
  34.     Float:e_y,
  35.     Float:e_z,
  36.     Float:e_a,
  37.     e_color1,
  38.     e_color2,
  39.     e_fracID,
  40.     e_vID
  41. };
  42. new fracVehicle[MAX_FRAC_VEHICLES][fracVehEnum];
  43.  
  44. public OnFilterScriptInit()
  45. {
  46.     //mysql_log();  //<- Kommentar vor mysql_log entfernen um den MySQL Debug-Modus zu aktivieren
  47.     handle = mysql_connect("127.0.0.1", "root", "test", "");
  48.     LoadFracVehicles();
  49.     SetTimer("SaveAllFracVehs", 60000, true); //Timer wird alle 60 Sekunden ausgeführt
  50.     return 1;
  51. }
  52.  
  53. public OnFilterScriptExit()
  54. {
  55.     SaveAllFracVehs();
  56.     mysql_close(handle);
  57.     return 1;
  58. }
  59.  
  60. public OnPlayerExitVehicle(playerid, vehicleid)
  61. {
  62.     SaveFracVehCheck(vehicleid);
  63.     return 1;
  64. }
  65.  
  66. public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
  67. {
  68.     //Eine Schleife durch alle Fraktions-Fahrzeuge
  69.     for(new i=0; i<MAX_FRAC_VEHICLES; i++)
  70.     {
  71.         //Wenn die vehicleid die gleiche ist, wie die des Fraktions-Fahrzeugs
  72.         if(fracVehicle[i][e_vID] == vehicleid)
  73.         {
  74.             //Jetzt brauchen wir die Variable, mit der Dein vorher bereits existierendes Fraktions-System arbeitet.
  75.             //Ich nehme jetzt einfach eine Beispiel-Variable, diese musst Du selbst mit der ersetzen,
  76.             //die Dein System verwendet.
  77.             //Es geht um diese Variable: PlayerInfo[playerid][pFraction]
  78.             if(PlayerInfo[playerid][pFraction] != fracVehicle[i][e_fracID])
  79.             {
  80.                 //Wenn der Spieler nicht in der Fraktion ist, die das Fahrzeug verwenden darf,
  81.                 //dann darf er es nicht betreten.
  82.                 TogglePlayerControllable(playerid, false);
  83.                 TogglePlayerControllable(playerid, true);
  84.                 SendClientMessage(playerid, 0xFF0000FF, "Du bist nicht in der Fraktion, die dieses Fahrzeug verwenden darf.");
  85.             }
  86.             break; //Es gibt ja keine zwei gleichen Fahrzeuge
  87.         }
  88.     }
  89.     return 1;
  90. }
  91.  
  92. CreateFVTable()
  93. {
  94.     new query[512];
  95.     format(query, sizeof(query), "CREATE TABLE IF NOT EXISTS `FracVehicles` (");
  96.     format(query, sizeof(query), "%s`ID` int(11) NOT NULL PRIMARY KEY,", query);
  97.     format(query, sizeof(query), "%s  `ModelID` int(11) NOT NULL DEFAULT '0',", query);
  98.     format(query, sizeof(query), "%s  `PosX` float NOT NULL DEFAULT '0',", query);
  99.     format(query, sizeof(query), "%s  `PosY` float NOT NULL DEFAULT '0',", query);
  100.     format(query, sizeof(query), "%s  `PosZ` float NOT NULL DEFAULT '0',", query);
  101.     format(query, sizeof(query), "%s  `PosA` float NOT NULL DEFAULT '0',", query);
  102.     format(query, sizeof(query), "%s  `Color1` int(11) NOT NULL DEFAULT '0',", query);
  103.     format(query, sizeof(query), "%s  `Color2` int(11) NOT NULL DEFAULT '0',", query);
  104.     format(query, sizeof(query), "%s  `FracID` int(11) NOT NULL DEFAULT '-1'", query);
  105.     format(query, sizeof(query), "%s) ENGINE=InnoDB DEFAULT CHARSET=latin1;", query);
  106.  
  107.     //handle = die Connection Handle ID die vor mysql_connect steht.
  108.     mysql_tquery(handle, query);
  109.     return 1;
  110. }
  111.  
  112. LoadFracVehicles()
  113. {
  114.     CreateFVTable();
  115.     //handle = die Connection Handle ID die vor mysql_connect steht.
  116.     //Es wird ein SELECT Query an die Datenbank gesendet, diese gibt über das Callback LoadFracVehicles_Data
  117.     //die Daten im Cache zurück.
  118.     mysql_tquery(handle, "SELECT * FROM FracVehicles ORDER BY ID ASC", "LoadFracVehicles_Data");
  119.     return 1;
  120. }
  121.  
  122. forward LoadFracVehicles_Data();
  123. public LoadFracVehicles_Data()
  124. {
  125.     //Deklaration neuer temporärer Variablen:
  126.     new rows, id, createdVehs;
  127.  
  128.     //Anzahl der gelesenen Datensätze abfragen:
  129.     cache_get_row_count(rows);
  130.  
  131.     //Schleife durch alle Datensätze:
  132.     for(new i=0; i<rows; i++)
  133.     {
  134.         //Fahrzeug existiert in der Datenbank, wir laden die Daten jetzt aus dem Cache.
  135.         cache_get_value_name_int(i, "ID", id);
  136.  
  137.         //Um Fehler bei der Verarbeitung zu vermeiden:
  138.         if(id < 0 || id >= MAX_FRAC_VEHICLES) continue;
  139.  
  140.         //Danach die restlichen Daten laden. Unser Index (der Wert mit dem wir auf das
  141.         //Fahrzeug in der Datenbank zugreifen) ist die "ID".
  142.         cache_get_value_name_int(i, "ModelID", fracVehicle[id][e_modelID]);
  143.         cache_get_value_name_float(i, "PosX", fracVehicle[id][e_x]);
  144.         cache_get_value_name_float(i, "PosY", fracVehicle[id][e_y]);
  145.         cache_get_value_name_float(i, "PosZ", fracVehicle[id][e_z]);
  146.         cache_get_value_name_float(i, "PosA", fracVehicle[id][e_a]);
  147.         cache_get_value_name_int(i, "Color1", fracVehicle[id][e_color1]);
  148.         cache_get_value_name_int(i, "Color2", fracVehicle[id][e_color2]);
  149.         cache_get_value_name_int(i, "FracID", fracVehicle[id][e_fracID]);
  150.  
  151.         //Zur Sicherheit fragen wir hier nun ab, ob das angegebene Modell auch existiert,
  152.         //sollte das nicht der Fall sein, dann wird das Fahrzeug nicht erstellt.
  153.         if(fracVehicle[id][e_modelID] >= 400 && fracVehicle[id][e_modelID] <= 611)
  154.         {
  155.             //Nachdem das Fahrzeug geladen wurde, wird es erstellt.
  156.             fracVehicle[id][e_vID] = CreateVehicle(fracVehicle[id][e_modelID], fracVehicle[id][e_x], fracVehicle[id][e_y], fracVehicle[id][e_z], fracVehicle[id][e_a], fracVehicle[id][e_color1], fracVehicle[id][e_color2], -1);
  157.         }
  158.         else
  159.         {
  160.             //Falls eine nicht existierende Model-ID angegeben wurde, geben wir eine Information aus.
  161.             printf("[Error] Model-ID %d existiert nicht (ID: %d).", fracVehicle[id][e_modelID], id);
  162.         }
  163.  
  164.         //Zur Sicherheit fragen wir noch ab, ob das Fahrzeug-Limit noch nicht überschritten wurde.
  165.         //Existiert ein Fahrzeug mit der höchsten ID, dann kann kein weiteres mehr erstellt werden.
  166.         if(GetVehicleModel(MAX_VEHICLES-1) != 0) return print("Es können keine weiteren Fahrzeuge geladen werden, Limit (MAX_VEHICLES) erreicht.");
  167.  
  168.         //Zur weiteren Sicherheit prüfen wir noch, ob die maximale Anzahl an Fraktions-Fahrzeugen erreicht ist.
  169.         createdVehs++;
  170.         if(createdVehs == MAX_FRAC_VEHICLES) return print("Es können keine weiteren Fahrzeuge geladen werden, Limit (MAX_FRAC_VEHICLES) erreicht.");
  171.     }
  172.     return 1;
  173. }
  174.  
  175. forward SaveAllFracVehs();
  176. public SaveAllFracVehs()
  177. {
  178.     //Deklaration neuer temporärer Variablen:
  179.     new query[256];
  180.  
  181.     //Schleife durch alle Fraktions-Fahrzeuge
  182.     for(new i=0; i<MAX_FRAC_VEHICLES; i++)
  183.     {
  184.         //Wenn das Fahrzeug existiert
  185.         if(fracVehicle[i][e_modelID] >= 400 && fracVehicle[i][e_modelID] <= 611)
  186.         {
  187.             //Wir fragen die Position des Fahrzeugs ab:
  188.             GetVehiclePos(fracVehicle[i][e_vID], fracVehicle[i][e_x], fracVehicle[i][e_y], fracVehicle[i][e_z]);
  189.             GetVehicleZAngle(fracVehicle[i][e_vID], fracVehicle[i][e_a]);
  190.  
  191.             //Und wir erstellen das Query:
  192.             format(query, sizeof(query), "UPDATE FracVehicles SET ModelID = '%d', PosX = '%f', PosY = '%f', PosZ = '%f', PosA = '%f', Color1 = '%d', Color2 = '%d', FracID = '%d' WHERE ID = '%d'",
  193.             fracVehicle[i][e_modelID], fracVehicle[i][e_x], fracVehicle[i][e_y], fracVehicle[i][e_z], fracVehicle[i][e_a], fracVehicle[i][e_color1], fracVehicle[i][e_color2], fracVehicle[i][e_fracID], i);
  194.             //handle = die Connection Handle ID die vor mysql_connect steht.
  195.             mysql_tquery(handle, query);
  196.         }
  197.     }
  198.     return 1;
  199. }
  200.  
  201. stock SaveFracVehCheck(vehicleid)
  202. {
  203.     //Deklaration neuer temporärer Variablen:
  204.     new query[256];
  205.  
  206.     //Schleife durch alle Fraktions-Fahrzeuge
  207.     for(new i=0; i<MAX_FRAC_VEHICLES; i++)
  208.     {
  209.         //Wenn die vehicleid die gleiche ist, wie die des Fraktions-Fahrzeugs
  210.         if(fracVehicle[i][e_vID] == vehicleid)
  211.         {
  212.             //Wir fragen die Position des Fahrzeugs ab:
  213.             GetVehiclePos(fracVehicle[i][e_vID], fracVehicle[i][e_x], fracVehicle[i][e_y], fracVehicle[i][e_z]);
  214.             GetVehicleZAngle(fracVehicle[i][e_vID], fracVehicle[i][e_a]);
  215.  
  216.             //Und wir erstellen das Query:
  217.             format(query, sizeof(query), "UPDATE FracVehicles SET ModelID = '%d', PosX = '%f', PosY = '%f', PosZ = '%f', PosA = '%f', Color1 = '%d', Color2 = '%d', FracID = '%d' WHERE ID = '%d'",
  218.             fracVehicle[i][e_modelID], fracVehicle[i][e_x], fracVehicle[i][e_y], fracVehicle[i][e_z], fracVehicle[i][e_a], fracVehicle[i][e_color1], fracVehicle[i][e_color2], fracVehicle[i][e_fracID], i);
  219.             //handle = die Connection Handle ID die vor mysql_connect steht.
  220.             mysql_tquery(handle, query);
  221.             return 1; //Es gibt ja keine zwei gleichen Fahrzeuge
  222.         }
  223.     }
  224.     return 0; //Fahrzeug ist kein Fraktions-Fahrzeug
  225. }
  226.  
  227. stock strtok(const string[], &index) //©Jeffry
  228. {
  229.     new result[20], length = strlen(string), i = index;
  230.     while ((i < length) && (string[i] == ' ')) i++;
  231.     strmid(result,string,i,((index = strfind(string, " ", false, i)) == -1) ? (index = length) : (index) , 20);
  232.     index++;
  233.     return result;
  234. }
  235.  
  236. stock IsNumeric(string[])
  237. {
  238.     for (new i = 0, j = strlen(string); i < j; i++)
  239.     {
  240.         if ((string[i] > '9' || string[i] < '0')) return 0;
  241.     }
  242.     return 1;
  243. }
  244.  
  245. ocmd:fferstellen(playerid, params[])
  246. {
  247.     //Zuerst fragen wir ab, ob wir noch Fahrzeuge erstellen können
  248.     if(GetVehicleModel(MAX_VEHICLES-1) != 0) return SendClientMessage(playerid, 0xFF0000FF, "Es können keine weiteren Fahrzeuge erstellt werden, Limit (MAX_VEHICLES) erreicht.");
  249.  
  250.     //Wir deklarieren die benötigten temporären Variablen.
  251.     new tmp[20], idx, model, fID, color1 = -1, color2 = -1;
  252.  
  253.     //Anschließend teilen wir mit strtok die eingegebenen Paramater auf und wandeln sie in eine Zahl um.
  254.     //Falls etwas falsches eingegeben wurde, geben wir eine entsprechende Meldung zurück.
  255.     tmp = strtok(params, idx);
  256.     if(!strlen(tmp) || !IsNumeric(tmp)) return SendClientMessage(playerid, 0xFF0000FF, "Verwendung: /fferstellen [Model] [FraktionsID] [opt:Farbe1] [opt:Farbe2]");
  257.     model = strval(tmp);
  258.     //Eine solche Abfrage kann man auch für nachfolgende FraktionsID (fID) machen, falls gewünscht.
  259.     if(model < 400 || model > 611) return SendClientMessage(playerid, 0xFF0000FF, "Error: Model ID existiert nicht.");
  260.     tmp = strtok(params, idx);
  261.     if(!strlen(tmp) || !IsNumeric(tmp)) return SendClientMessage(playerid, 0xFF0000FF, "Verwendung: /fferstellen [Model] [FraktionsID] [opt:Farbe1] [opt:Farbe2]");
  262.     fID = strval(tmp);
  263.     tmp = strtok(params, idx);
  264.     if(strlen(tmp) && IsNumeric(tmp)) color1 = strval(tmp);
  265.     tmp = strtok(params, idx);
  266.     if(strlen(tmp) && IsNumeric(tmp)) color2 = strval(tmp);
  267.  
  268.     //Sind alle Parameter korrekt übergeben worden, dann suchen wir uns einen freien Index in den wir das Fraktions-Fahrzeug speichern können.
  269.     for(new i=0; i<MAX_FRAC_VEHICLES; i++)
  270.     {
  271.         //Frei:
  272.         if(fracVehicle[i][e_vID] == 0)
  273.         {
  274.             //Daten werden übergeben
  275.             new Float:x, Float:y, Float:z, Float:a;
  276.             GetPlayerPos(playerid, x, y, z);
  277.             GetPlayerFacingAngle(playerid, a);
  278.             fracVehicle[i][e_modelID] = model;
  279.             fracVehicle[i][e_x] = x;
  280.             fracVehicle[i][e_y] = y;
  281.             fracVehicle[i][e_z] = z;
  282.             fracVehicle[i][e_a] = a;
  283.             fracVehicle[i][e_color1] = color1;
  284.             fracVehicle[i][e_color2] = color2;
  285.             fracVehicle[i][e_fracID] = fID;
  286.  
  287.             //und anschließend in die Datenbank geschrieben.
  288.             new query[256];
  289.             format(query, sizeof(query), "INSERT INTO FracVehicles (ID, ModelID, PosX, PosY, PosZ, PosA, Color1, Color2, FracID) VALUES ('%d', '%d', '%f', '%f', '%f', '%f', '%d', '%d', '%d')",
  290.             i, fracVehicle[i][e_modelID], fracVehicle[i][e_x], fracVehicle[i][e_y], fracVehicle[i][e_z], fracVehicle[i][e_a], fracVehicle[i][e_color1], fracVehicle[i][e_color2], fracVehicle[i][e_fracID]);
  291.             mysql_tquery(handle, query);
  292.  
  293.             //Zuletzt wird dann noch das Fahrzeug erstellt und der Spieler in das Fahrzeug gesetzt.
  294.             fracVehicle[i][e_vID] = CreateVehicle(fracVehicle[i][e_modelID], fracVehicle[i][e_x], fracVehicle[i][e_y], fracVehicle[i][e_z], fracVehicle[i][e_a], fracVehicle[i][e_color1], fracVehicle[i][e_color2], -1);
  295.             PutPlayerInVehicle(playerid, fracVehicle[i][e_vID], 0);
  296.             return SendClientMessage(playerid, 0x00FF00FF, "Fahrzeug gespeichert.");
  297.         }
  298.     }
  299.     return SendClientMessage(playerid, 0xFF0000FF, "Error: Limit für Fraktions-Fahrzeuge erreicht.");
  300. }
  301.  
  302. ocmd:ffloeschen(playerid, params[])
  303. {
  304.     //Wir deklarieren die benötigte temporäre Variable.
  305.     new vid;
  306.  
  307.     //Wenn der Spieler keine Vehicle-ID eingibt wird die gelöscht, in der sich der Spieler befindet,
  308.     //ansonsten die eingegebene ID.
  309.     if(!IsNumeric(params) || !strlen(params)) return SendClientMessage(playerid, 0xFF0000FF, "Error: Nutze: /ffloeschen [Vehicle ID]");
  310.     vid = strval(params);
  311.  
  312.     if(vid <= 0) return SendClientMessage(playerid, 0xFF0000FF, "Error: Vehicle-ID ist kein Fraktions-Fahrzeug.");
  313.  
  314.     for(new i=0; i<MAX_FRAC_VEHICLES; i++)
  315.     {
  316.         //Eingegebene ID und die des Fraktions-Fahrzeugs stimmen überein.
  317.         if(fracVehicle[i][e_vID] == vid)
  318.         {
  319.             //Daten werden entfernt
  320.             fracVehicle[i][e_modelID] = 0;
  321.             fracVehicle[i][e_x] = 0.0;
  322.             fracVehicle[i][e_y] = 0.0;
  323.             fracVehicle[i][e_z] = 0.0;
  324.             fracVehicle[i][e_a] = 0.0;
  325.             fracVehicle[i][e_color1] = 0;
  326.             fracVehicle[i][e_color2] = 0;
  327.             fracVehicle[i][e_fracID] = -1;
  328.  
  329.             //und anschließend in der Datenbank gelöscht.
  330.             new query[128];
  331.             format(query, sizeof(query), "DELETE FROM FracVehicles WHERE ID = '%d'", i);
  332.             mysql_tquery(handle, query);
  333.  
  334.             DestroyVehicle(fracVehicle[i][e_vID]);
  335.             fracVehicle[i][e_vID] = 0;
  336.             return SendClientMessage(playerid, 0x00FF00FF, "Fahrzeug gelöscht.");
  337.         }
  338.     }
  339.     return SendClientMessage(playerid, 0xFF0000FF, "Error: Vehicle-ID ist kein Fraktions-Fahrzeug.");
  340. }
  341.  
  342. ocmd:parken(playerid)
  343. {
  344.     if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, 0xFF0000FF, "Du bist in keinem Fahrzeug.");
  345.     new vehicleid = GetPlayerVehicleID(playerid);
  346.     if(SaveFracVehCheck(vehicleid)) return SendClientMessage(playerid, 0x00FF00FF, "Fahrzeug geparkt.");
  347.     else return SendClientMessage(playerid, 0xFF0000FF, "Dieses Fahrzeug kann nicht geparkt werden.");
  348. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement