Kennzeichen System / Polizei KFZ Akte

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Kennzeichen System / Polizei KFZ Akte

    Ich bin gerade dabei ein Kennzeichen System zu erstellen.
    Kennzeichen werden gesetzt, gespeichert, geladen. Nur gibt es jetzt folgende Probleme.

    Wenn man sein Auto zulassen will, sieht es bei mir so aus:

    Quellcode

    1. new KZ = random(9999);

    Quellcode

    1. new string[50];
    2. format(string, sizeof(string), "LS-%d",PCar[playerid][d][P_KZ]);
    3. SetVehicleNumberPlate(PCar[playerid][d][P_VID],string);
    Was, wenn es eine Zahl doppelt gibt und jemand mit einem Befahl das Fahrzeug Orten möchte?



    Ich bräuchte auch noch Hilfe einen Befehl zu erstellen (habe noch nie mit params gearbeitet) damit ein Checkpoint gesetzt wird wo das Fahrzeug mit dem Kennzeichen ist.
    Befehl sollte so aussehen: /locatecar LS-2848 -> Timer der gesetzt wird -> Nach einer Zeit wird der Checkpoint gesetzt. (Der Spieler muss aber in einem Polizei Fahrzeug sein)



    Quellcode

    1. ocmd:locatecar(playerid,params[])
    2. {
    3. return 1;
    4. }

    Freue mich über jegliche Hilfe :)

    Ich weiß, dass ich weiß, dass ich nichts weiß.
  • Erstmal 2 Fragen:

    1. Soll jedes Fahrzeug ein zufälliges Kennzeichen erhalten? Oder nur LSPD Cars?
    2. Sollen die Kennzeichen bei jedem Serverstart neu generiert werden oder gespeichert & geladen werden?


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
  • BrightLeaN schrieb:

    Was, wenn es eine Zahl doppelt gibt und jemand mit einem Befahl das Fahrzeug Orten möchte?
    Einfach checken ob es die Zahl bereits gibt und dann eine neue Random Zahl auswählen?

    Zum Befehl:

    PAWN-Quellcode

    1. ocmd:locatecar(playerid,params[])
    2. {
    3. new kennzeichen[8];
    4. if(!IsPlayerCop(playerid)) return SendClientMessage(playerid, -1, "Du musst ein Cop sein um diesen Befehl zu verwenden.");
    5. if(!IsPlayerInCopCar(playerid)) return SendClientMessage(playerid, -1, "Du musst dich in einem Polizeifahrzeug befinden.");
    6. if(sscanf(params, "s[8]",kennzeichen)) return SendClientMessage(playerid, -1, "/locatecar [Kennzeichen]");
    7. new car = FindCarByPlate(kennzeichen);
    8. if(car == -1) return SendClientMessage(playerid, -1, "Es wurde kein Fahrzeug mit diesem Kennzeichen gefunden.");
    9. new Float:x,Float:y,Float:z;
    10. GetVehiclePos(car, x, y, z);
    11. SetPlayerCheckpoint(playerid, x, y, z, 10.0);
    12. SetTimerEx("DestroyLocateCarCP", 30000, false, "ii", playerid, car);
    13. return 1;
    14. }
    15. forward DestroyLocateCarCP(playerid, car);
    16. public DestroyLocateCarCP(playerid, car)
    17. {
    18. DisablePlayerCheckpoint(plaýerid);
    19. new Float:x,Float:y,Float:z;
    20. GetVehiclePos(car, x, y, z);
    21. SetPlayerCheckpoint(playerid, x, y, z, 10.0);
    22. return 1;
    23. }
    24. FindCarByPlate(kennzeichen[])
    25. {
    26. new vehicleid;
    27. for(new i; i<GetPlayerPoolSize();i++)
    28. {
    29. if(!strcmp(PCar[i][d][P_KZ],kennzeichen, true)) //<--- Fahrzeugabfrage vom Kennzeichen des Autos vom Spieler i
    30. {
    31. return PCar[i][d][P_VID];
    32. }
    33. }
    34. return -1;
    35. }
    Alles anzeigen


    Musst einige Sachen an deins noch weiter anpassen, da ich nix über dein Script weiß.
    Ich helfe zu allen Fragen bezüglich PAWN Scripting gerne weiter.
    Ich biete auch einen Scripting Service an: Scripting Service

    Konversation: Konversation starten

    Discord: LeonMrBonnie#2251

  • Jetzt blicke ich da durch. Er findet meine Kennzeichen nicht

    Diese sehen wie folgt aus LS-258 z.B


    PAWN-Quellcode

    1. ocmd:locatecar(playerid,params[])
    2. {
    3. new kennzeichen[8];
    4. //if(!IsPlayerCop(playerid)) return SendClientMessage(playerid, -1, "Du musst ein Cop sein um diesen Befehl zu verwenden.");
    5. //if(!IsPlayerInCopCar(playerid)) return SendClientMessage(playerid, -1, "Du musst dich in einem Polizeifahrzeug befinden.");
    6. if(sscanf(params, "s[8]",kennzeichen)) return SendClientMessage(playerid, -1, "/locatecar [Kennzeichen]");
    7. new car = FindCarByPlate(kennzeichen);
    8. if(car == -1) return SendClientMessage(playerid, -1, "Es wurde kein Fahrzeug mit diesem Kennzeichen gefunden.");
    9. new Float:x,Float:y,Float:z;
    10. GetVehiclePos(car, x, y, z);
    11. SetPlayerCheckpoint(playerid, x, y, z, 10.0);
    12. SetTimerEx("DestroyLocateCarCP", 3000, false, "ii", playerid, car);
    13. return 1;
    14. }
    15. forward DestroyLocateCarCP(playerid, car);
    16. public DestroyLocateCarCP(playerid, car)
    17. {
    18. DisablePlayerCheckpoint(playerid);
    19. new Float:x,Float:y,Float:z;
    20. GetVehiclePos(car, x, y, z);
    21. SetPlayerCheckpoint(playerid, x, y, z, 10.0);
    22. return 1;
    23. }
    24. FindCarByPlate(kennzeichen[])
    25. {
    26. for(new i; i<GetPlayerPoolSize();i++)
    27. {
    28. for(new d = 0; d < sizeof(PCar[]); d++)
    29. {
    30. if(!strcmp(PCar[i][d][P_KZ],kennzeichen, true)) //<--- Fahrzeugabfrage vom Kennzeichen des Autos vom Spieler i
    31. {
    32. return PCar[i][d][P_VID];
    33. }
    34. }
    35. }
    36. return -1;
    37. }
    Alles anzeigen
    //EDIT in der Variable P_KZ wird nur die Zahl gespeichert, wie baue ich das mit ein, dass man es mit LS- angeben muss?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von BrightLeaN ()

  • BrightLeaN schrieb:

    FindCarByPlate
    Nur mal aus Spaß, dass kann zu einer gefährlichen Funktion werden ^^

    Im worst worst case, sind 500 Spieler online und alle 9999 Autos vergeben.

    Und wir wollen blöderweise eins der letzten Autos checken.

    Das macht 500*9999 String Abfragen, das sind 4.999.500 :D

    Spoiler anzeigen
    Spoiler anzeigen

    C-Quellcode

    1. //Speedtest
    2. new t = GetTickCount();
    3. new a[] ="Dies ist ein Test",b[] = "Dies ist a test";
    4. for(new i; i<500; i++)
    5. {
    6. for(new j; j<9999; j++)
    7. {
    8. if(!strcmp(a,b)) continue;
    9. }
    10. }
    11. printf("%dms",GetTickCount()-t);
    Alles anzeigen


    Resultat: ~930ms


    Das bedeutet, dein Server würde für ne Sekunde hängen, spammt man den Befehl, wäre er quasi unspielbar und down xD
    Wenn, dann solltest du direkt mit Zahlen arbeiten :D (mit Zahlen sind es immer noch ~200ms)

    Der Witz aber ist, dass der Code nicht einmal funktioniert. Denn wenn der Spieler, dem das Kennzeichen gehört nicht online ist, kann das Auto nicht zugeordnet werden.
    Es wäre hier viel effizienter einen einfachen MySQL Query zu nutzen, mit dem du prüfst, zu wem das eindeutige Kennzeichen gehört :)




    10.000 eindeutig zufällige Zahlen effizient zu generieren, die sich nicht wiederholen, ist gar nicht mal so trivial in Pawn.
    Mir fällt mir ein, entweder y_iterate zu nutzen, oder besser ein eigenes System zu entwickeln.
    Sprich du hast eine Datenbank mit 10.000 Einträgen. Dann wählst du random(n) (wo n die Anzahl der Einträge in der Datenbank ist) aus und löschst diese.
    Dann bist du kannst du dir immer sicher sein, dass das eindeutig ist, und das super effizient.


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
  • oder besser ein eigenes System zu entwickeln.
    Sprich du hast eine Datenbank mit 10.000 Einträgen. Dann wählst du random(n) (wo n die Anzahl der Einträge in der Datenbank ist) aus und löschst diese.
    Dann bist du kannst du dir immer sicher sein, dass das eindeutig ist, und das super effizient.
    uiiui hört sich alles sehr kompliziert an, kann mir das gerade nicht vorstellen.
    Dachte es wäre nicht so schwer so etwas zu machen.