Beiträge von J0a9

    Hallo,


    ich habe eine Frage bezüglich des Randoms...
    Folgendes habe ich vor, es sollen 3 Zahlen per Random "gelost" werden. ( Sprich Zahl: 1, Zahl: 2, Zahl 3).
    Mein Problem ist Random gibt mir nur 0 und 1 aus...


    Code:

    Code
    new zufall = random(2);
    printf("Zufallzahl: %i", zufall);
    
    
    if(Enum_Info[i]EnumArt] == 0)
    {
        // etc...
    }


    Laut SA:MP Wiki steht:

    Code
    A random number ranging from 0 to max-1.
    
    
    new value = random(5);
    // 'value' might be 0, 1, 2, 3 or 4. 5 possible values.


    Meine Frage daher zählt Random jetzt ab '0' oder ab '1'?
    Weil der rest der Funktion funktioniert dann auch nicht wenn Random falsche Zahlen ausgibt...


    Kann mir einer weiterhelfen?
    Vielen Dank im vorraus ;)

    Achso, mit strval. Dann %d.
    format(query, sizeof(query), "SELECT * FROM accounts WHERE IP LIKE '%d.%d.%d.%%'", strval(zahl[0]), strval(zahl[1]), strval(zahl[2]));

    ah okey :)
    Für was steht am ende das "%%"?


    Wo muss ich eigentlich festlegen, wenn er diese IP Range gefunden hat und der Spieler mit nem anderen Namen draufkommt das er gekickt wird?
    Z.B. hier?

    Ins format darfst du natürlich nicht 127.0.0.% schreiben, sondern %s.%s.%s.%%.

    Code
    format(query, sizeof(query), "SELECT * FROM accounts WHERE IP LIKE '%s.%s.%s.%%'", strval(zahl[0]), strval(zahl[1]), strval(zahl[2]));


    Print:


    Code
    [21:35:14] Zahl 1: 127
    [21:35:14] Zahl 2: 0
    [21:35:14] Zahl 3: 0
    [21:35:14] Zahl 4: 1
    [21:35:14] SELECT * FROM accounts WHERE IP LIKE '955r...'


    Ich hab gerade den überblick verloren ;(
    Jetzt printet der mir komplett was falsches aus ...

    gut mit dem Split funktioniert das eeendlich :D


    Eine Frage habe ich noch und zwar folgendes wird geprintet:

    SQL
    SELECT * FROM accounts WHERE IP = '127.0.0.'


    In der Datebank ist die IP 127.0.0.2 aber man kann sich dennoch registrieren wenn man mit der IP 127.0.0.1...
    Stimmt was mit der Range-IP abfrage nicht?

    Nutze die Variante mit dem Split, das ist ohnehin besser, da man nicht für jede Kleinigkeit ein Plugin bzw. eine komplexe Include nutzen sollte.

    ich werde trotzdem später nach dem Fehler schauen woran es lag...


    Würde die Splitfunktion jetzt so lauten?

    Code
    split(SpielerIP(playerid), zahl, '.');

    Dann entferne das obige wieder.
    Versuche die sscanf Include an erste Stelle der ganzen Includes zu setzen, es scheint als tritt ein Konflikt mit einer anderen Include auf.


    Falls das auch nicht geht, nutze die Version mit dem split anstatt sscanf, oder finde heraus, in welcher Include ebenfalls ein Hook auf OnNPCModeInit angewendet wird und entferne diese. Eventuell kann der Hook auch bearbeitet werden, sodass er mit sscanf kompatibel ist. Poste den eventuell, falls du ihn findest (Suche nach OnNPCModeInit, etwas mit ein paar #define's)

    Habe alle Includes geprüft ist aber nichts mit OnNPCModeInit gefunden...
    Sobald ich forward OnNPCModeInit(); setze und den Server starte steht "Run time error 19: "File or function is not found".


    Ich habe auch nochmal alles erneut enpackt, bekomme aber immer diese Fehlermeldung....
    Geht das nicht mit der älteren sscanf version?

    Code
    C:\Users\Test\Desktop\Ordner\pawno\include\sscanf2.inc(69) : warning 235: public function lacks forward declaration (symbol "OnNPCModeInit")
    C:\Users\Test\Desktop\Ordner\pawno\include\sscanf2.inc(78) : error 004: function "SSCANF_OnNPCModeInit" is not implemented

    Ähm nach dem folgenden Code bekomme ich nun folgende Meldung...

    Beachte, dass du dann die sscanf Funktion aus deinem Code entfernen musst.

    ja das habe ich gemacht.
    Eine Frage, habe jetzt sscanf gedownloadet eingefügt und compilet bekomme aber einen Warning...
    Warningmeldung: include\sscanf2.inc(73) : warning 235: public function lacks forward declaration (symbol "OnNPCModeInit")
    Muss ich NPC modes auch downloaden und in die Ordner einfügen?

    Als String prüft er doch auch komplett die IP also auch die letzten Zahlen.

    ja wenn du aber die IP "manipulierst" oder router neustartest verändert sich meist die letzten 3 Zahlen.
    So da bringt dann der stringvergleich nichts denn der würde ja prüfen ob die jetztige IP exakt mit der registrierten IP übereinstimmt. Der würde dann bei den letzten Range IP nicht mehr weiterprüfen...
    Deshalb möchte ich die IP gesplittet haben und dann bis auf die letzte Range prüfen ...


    Nur beim splitten komme ich nicht weiter...

    Lass dir die IP mal per print ausgeben. Ist dort eventuell auch alles 0?

    Ja habe es geprintet, es wird aber nicht 0 angezeigt.
    Folgendes habe ich gemacht:


    Code
    stock SpielerIP(playerid)
    {
    	new getip[16];
    	GetPlayerIp(playerid,getip,sizeof(getip));
    	return getip;
    }


    Code
    new query[56], zahl[4];
    sscanf(SpielerIP(playerid), "p<.>iiii", zahl[0], zahl[1], zahl[2], zahl[3]);
    printf("Zahl 1: %i", zahl[0]);
    printf("Zahl 2: %i", zahl[1]);
    printf("Zahl 3: %i", zahl[2]);
    printf("Zahl 4: %i", zahl[3]);
    format(query, sizeof(query), "SELECT * FROM tabelle WHERE IP = '%i.%i.%i.'", zahl[0], zahl[1], zahl[2]);
    printf(query);
    mysql_function_query(dbhandle, query, true, "NextStep", "i", playerid);


    So habe ich es versucht, auch die Zahlen printen lassen aber es ist immer nur 0...



    //Edit:


    Habe mal was versucht, ich weiß sscanf wäre besser aber hier bekomme ich Werte und nicht ständig 0,

    Code
    new query[56], zahl[4][16];
    split(SpielerIP(playerid), zahl, '.');
    printf("Zahl 1: %i", zahl[0]);
    printf("Zahl 2: %i", zahl[1]);
    printf("Zahl 3: %i", zahl[2]);
    printf("Zahl 4: %i", zahl[3]);
    format(query, sizeof(query), "SELECT * FROM tabelle WHERE IP = '%i.%i.%i.'", zahl[0], zahl[1], zahl[2]);
    printf(query);
    mysql_function_query(dbhandle, query, true, "NextStep", "i", playerid);

    Hier wird mir folgendes geprintet:

    Code
    [11:54:46] Zahl 1: 49
    [11:54:46] Zahl 2: 48
    [11:54:46] Zahl 3: 48
    [11:54:46] Zahl 4: 49
    [11:54:46] SELECT * FROM accounts WHERE IP = '49.48.48.'

    Ok.
    Splitte die IP so:
    new zahl[4];sscanf(ip, "p<.>iiii", zahl[0], zahl[1], zahl[2], zahl[3]);


    Dann hast du dort die einzelnen Zahlen drin stehen und kannst die vergleichen.


    Bei vielen ändern sich übrigens die hinteren beiden Ranges der IP.


    muss ich vorher format verwenden?
    Wenn ich es printe werden nur "." angezeigt.


    Code
    new query[56], zahl[4], ip[16];
    GetPlayerIp(playerid, ip, sizeof(ip));
    sscanf(ip, "p<.>iiii", zahl[0], zahl[1], zahl[2], zahl[3]);
    format(query, sizeof(query), "SELECT * FROM tabelle WHERE IP = '%s.%s.%s'", zahl[0], zahl[1], zahl[2]);
    mysql_function_query(dbhandle, query, true, "CheckTabelle", "i", playerid);


    oder vergleiche ich den split grad komplett falsch? ?(:whistling:


    //Edit:
    verbessert von:
    format(query, sizeof(query), "SELECT * FROM accounts WHERE IP = '%s.%s.%s'", zahl[0], zahl[1], zahl[2]);


    zu:
    format(query, sizeof(query), "SELECT * FROM accounts WHERE IP = '%i.%i.%i'", zahl[0], zahl[1], zahl[2]);


    jedoch wird nun folgendes geprintet:


    SQL
    SELECT * FROM tabelle WHERE IP = '0.0.0'

    Warum willst du die IP eigentlich splitten?

    Weil ich die IP's aus er Datenbank vergleichen möchte und die letzten 3 Ziffern ja meist anders sind.
    Deshalb möchte ich bis zum 3. Punkt gesplittet haben und aus der Datenbankvergleichen.
    Nur ich habe bis jetzt nicht viele Funktion von split gescriptet, deshalb bräuchte ich da etwas hilfe ^^


    Kurzes beispiel:
    IP-registriert: 127.0.0.1
    er connected neu aber mit ner anderen ip: 127.0.0.2



    bis zur rot markierten Zahl möchte ich aus der Datenbank vergleichen...



    sscanf ist hier besser, das ist auf sowas optimiert.

    Wäre das dann so?

    Code
    new ip[16], ergebnis[10];
    GetPlayerIp(playerid, ip, sizeof(ip));
    sscanf(".", "ip<i>[3]", ergebnis);





    @Mystogan warum erstellst du nicht einfach paar defines?
    Wäre das eventuell nicht einfacher? z.B. könntest du Version einfacher ändern und musst nicht in der Datenbank umändern...

    Hab den Fehler gefunden...
    das mit den "accounts" war schon richtig aber ich hatte darunter den nächsten Query was noch in eine andere Tabelle den Spieler einfügen soll, dieses bin ich grad am umlegen.


    Dank dir @Jeffry, ich dachte anfangs das ich bei der MySQL Struktur etwas falsches gemacht habe :)



    Habe noch eine Frage, vielleicht könntest dabei kurz helfen.
    Ich möchte die IP adresse des Users splitten... ( bin noch neu was der Funktion split angeht...)


    Würde das folgendermaßen funktionieren?

    Code
    stock SplitIP(playerid)
    {
    	new SplitIP[3], ip[16];
    	GetPlayerIp(playerid, ip, sizeof(ip));
    	if(strval(SplitIP[1] && SplitIP[2] == ip))
    	return //was würde er returnen?
    }

    oder wäre das mit sscanf besser?

    Screenshot was beim Registrieren eingetragen wurde:
    Screenshot (271).png


    und print schreibt folgendes aus:
    [15:26:38] INSERT INTO accounts (IP, Name, Passwort, Registrierungsdatum) VALUES ('127.0.0.1', 'Test2', MD5('testen123'), '10.7.2016').


    Wenn der MySQL Statement beim print 1x ausgeschrieben wird, erstellt er den account doppelt....
    Aber warum?

    gut, dachte "AUTO_INCREMENT" wäre falsch.


    Accounts werden so eingetragen:


    Habe sogar die print funktion hinzugefügt, in der Konsole steht es nur einmal...