Beiträge von Kaliber

    ich hoffe ich finde hier einen der mir hilft , der mir per Teamspeak helfen kann etc...

    Nah, TeamSpeak ist immer nur die Letzte Option.


    Pack mal unter OnGameModeInit mysql_log(ALL);.


    Dann wird ein Ordner erstellt Namens logs (nicht in den scriptfiles, sondern 1 drüber..wieso auch immer).


    Und dort, kannst du dann genau verfolgen, was deine Datenbank macht, bzw zensiere dort das Passwort und poste mal den Log ^^

    e_fuel = maxFuel - random(8)

    Wieso machst du es nicht so?! :D



    Wie lasse ich die Ränge z.b als Erster einzeigen:

    Hatte da mal was geschrieben gehabt:


    Verwende diese Include: https://raw.githubusercontent.…d-sort/master/md-sort.inc


    Und dann so:


    Schau mal..so sieht meine Code aus..


    ...siehst du den Unterschied?


    Bei dir ist keine if-Abfrage..nur ein break..was keinen Sinn macht...


    //Edit:
    Und sag mal willst du mich hier trollen oder so?! :D



    PCar[playerid][d][P_MID] = GetPlayerVehicleID(playerid);

    Ich sagte, du sollst es ersetzen..und nicht das GetVehicleModel drum herum löschen...

    öfters
    benutzen kann.

    Das habe ich doch auch erklärt, du änderst einfach den Token:


    StartGenerateUniqueRandomNumber(playerid, handle, NUMBER_PLATE_POOL, 1);


    und dann kannst du im Callback:


    //Edit:



    irgendwie geht das nicht.

    Was machst du da auch?! Wieso änderst du den Code?
    Warum löschst du einfach ein break und die if-Abfrage in der Schleife?!
    Wieso packst du in die andere Funktion eine Schleife mit i die vorher gar nicht da war?!?!
    Nutze dort einfach: GetPlayerVehicleID(playerid) anstatt Autohausauto1[i], du hast ja schon vorher gecheckt, ob er da wirklich drinnen sitzt.


    So kann das natürlich nicht funktionieren...wenn da keine Code-Logik dahinter steht..


    Nimm doch einfach den Code, wie ich ihn geschrieben hatte...

    Schreibst das dann einfach so:


    C
    for(new d; d < sizeof(PCar[]); d++)
    {
    	if(PCar[playerid][d][P_MID] == 0)
    	{
    		//Prüfe, ob Fahrzeug existiert. Wenn nicht, nutze den Slot und lege das Fahrzeug an.
    		SetPVarInt(playerid,"_tmp_veh",d);
    		StartGenerateUniqueRandomNumber(playerid, handle, NUMBER_PLATE_POOL, 0);
    		break;
    	}
    }


    Und der ganze Rest, kommt dann in das Callback, z.B. so:


    Und dann packst das einfach alles in die Funktion:



    Zu deiner 1. Frage mit dem Enter, schreib das mal so:



    Zu deiner 2. Frage naja, was heißt Fehler, es ist halt komplett unnötig, du verwendest ja diese Dinge nicht.
    Solltest du so schreiben:



    Diese 15 bezieht sich übrigens nicht auf die Anzahl der Einträge, sondern auf die Länge.
    Sprich du hast X, Y, Z, A, aber da sagst du nein, du hast nicht 4, sondern 15. Der Ganze Rest ist halt 0.

    Du hast nicht richtig gelesen.


    Das startet nur die Generierung.


    Du musst dass dann im Callback zuweisen.



    Das ist asynchron, so wie eben ein mysql Query.


    Habe ich ja oben alles erklärt ^^

    Wo steht das?


    Wie sieht denn deine Funktion aus zum Erstellen des Pools?


    //Edit: Wie öffnest du auch die Datenbank? Das ist doch nicht phpmyadmin?


    Es kann auch sein, dass dir nur 1000 angezeigt werden.
    Kannst ja mal SELECT COUNT(*) FROM `t_0` machen, ich wette, da steht dann 8998.

    Für die Kennzeichen/Telefonnummer würde ich einfach aufsteigende Zahlenfolge nutzen.

    Das freut mich :)


    Selbst ein Index ist wahrscheinlich overkill, wenn wir von 1000 Zahlen reden, aber gut.

    Ja, das versuche ich dir ja gerade zu vermitteln.
    Desweiteren kannst du in Pawn nicht mal dynamisch Speicher allozieren, also würde das so gar nicht gehen.
    Schon gar nicht bei mehreren Pools.
    (Ja Memory Plugin außen vor, dennoch hat man dann noch O(n) Zugriffe auf das Array)

    Wenn man für die Zufallszahl einen Index erstellt, dann ist der Check auf Duplikate relativ schnell

    Wie willst du das machen?
    Du musst ja trotzdem alle vorherigen Zahlen durchgehen, dein Ansatz ist der naive Ansatz, wie oben erklärt.
    Und wenn du einen Pool von 10.000 Zahlen hast, dann viel Spaß. Dein Array musst du ja auch irgendwie deklarieren und das bezieht auch Speicher.



    da es sonst zu viel Speicher frisst.

    Nah jede Zahl frisst nur 4 Bytes.
    Also selbst wenn du einen Pool aus 1.000.000 Zahlen hast, frisst das ((1.000.000*4)/1024) = 3.906,25kB = ~4MB


    Also das ist ein RIESEN Pool, ich wüsste nicht, wofür man so viele eindeutig zufällige Zahlen bräuchte und man benötigt nur 4MB, was jeder Rechner locker zur Verfügung hat, immerhin Reden wir hier nicht von RAM, sondern von Festplattenspeicher.
    Und wenn ich überlege, dass heute sogar Handys Teil schon 1TB haben (Galaxy S10 mit 1TB Speicher) sollte das mit den 4MB kein Problem sein ^^

    Hallo Brotfische,


    ich bin es mal wieder *nerv nerv* mit einem neuen Include.
    Inspiriert durch diesen Thread: Kennzeichen System / Polizei KFZ Akte


    Es geht, wie der Titel es schon vermuten lässt um "Eindeutig zufällige Zahlen".


    Aber was heißt das eigentlich?
    Nun, wenn man z.B. die Funktion random(n) verwendet, dann erhält man zufällige Zahlen im Intervall von [0, n-1]. (Also zum Beispiel random(100) gibt uns die Zahlen von 0-99.)
    So, verwenden wir diese Funktion jetzt noch einmal, dann erhalten wir mit Pech, die Selbe Zahl wie zuvor.
    Das ist natürlich ärgerlich, wenn man jetzt Telefonnummern vergibt oder eindeutige Kennzeichen haben will.


    Naive Lösung?
    Eine naive Lösung wäre jetzt, eine Zahl zu generieren und dann zu speichern.
    Anschließend alle Nachfolgenden generierten Zahlen durch die, die schon erstellt wurden zu iterieren und zu schauen, ob es bereits schon so eine Zahl gibt.
    Falls dem so ist, eine neue generieren. Ansonsten hat man ja seine eindeutige Zahl gefunden.
    Problem: Der Aufwand wird immer größer (je mehr Zahlen man generiert hat) und das will man gerade im Laufenden betrieb natürlich nicht. (O(n^x) n=Wie viele Zahlen es bereits gibt. x=Wie viele Versuche benötigt werden, eine zu finden, die noch nich existiert.)


    Meine Lösung?
    Es ist einfacher, einen Zahlen Pool abzubilden.
    Sprich man will eine zufällige Zahl von 0-1000, dann speichert man einfach alle 1000 Zahlen in einer Datenbank.
    Anschließend wird einfach eine zufällig ausgewählt und aus der Liste gelöscht (das heißt, je mehr verwendet werden, desto kleiner wird der Speicherplatz bedarf.)
    Das bedeutet, egal wie viele Zahlen man hat, es ist immer gleich schnell (O(1)).


    Das Gute hier ist noch, dass man Multi-Threaded querys nutzen kann (nur in MySQL, nicht SQLite), dann wird das eh ausgelagert alles und beeinflusst 0 den Server.


    MySQL VS SQLite
    Ich habe 2 Versionen geschrieben.
    Definitiv zu präferieren wäre hier die MySQL Version (aber für die, die kein MySQL haben und das benötigen, habe ich eine SQLite Version geschrieben).


    MySQL
    Wie oben schon erwähnt, können wir hier Multi-Threaded Querys nutzen und das Asynchron gestalten.
    Somit läuft hier alles sehr schnell und glatt.


    SQLite
    Hier belastet das die Server-Laufzeit. (Gerade der Server-Start, wenn die Pools inistialisiert werden, kann das (je nach Größe der Pools) bis zu einer Minute dauern.)
    Die spätere Generierung dauert ~0.5ms. Also nicht soo viel, aber doch schon etwas, gerade wenn man hintereinander mehrere Zahlen generiert.


    Beispiele
    MySQL Version


    SQLite Version


    Was passiert, wenn der Pool leer ist?
    Dann ist der status wie schon gezeigt -1.
    Allerdings, wenn beim Server Restart immer noch das CreateRandomPool steht, wird dieser automatisch wieder aufgefüllt.


    Download


    Wer die MySQL Version verwenden will, da ist die Neuste MySQL Version (R41) nötig!


    MySQL - Version - Links:


    SQLite - Version - Links:


    Wichtige Hinweise / Mögliche Errors


    Schlusswort
    Ich hoffe das Include ist für den ein oder anderen nützlich.


    Bei Fragen oder Anregungen, stehe ich euch wie immer gerne zur Verfügung.


    Viel Spaß weiterhin beim skripten :)


    Mit freundlichen Grüßen
    Euer Kalle :P