Beiträge von UncleSub

    format(string,sizeof(string),"Name: %s\nLevel: %d\nGeld: %d\nAdminlevel: %d\nKills: %d\nDeaths: %d\nKD-Rate: %.2f\n\nSollten Fehler vorliegen, melde dich bei einem Admin.","Okay","Abbrechen",pname,Spieler[playerid][Level],GetPlayerMoney(playerid),Spieler[playerid][Admin],Spieler[playerid][Kills],Spieler[playerid][Deaths],kdrate);


    format(string,sizeof(string),"Name: %s\nLevel: %d\nGeld: %d\nAdminlevel: %d\nKills: %d\nDeaths: %d\nKD-Rate: %.2f\n\nSollten Fehler vorliegen, melde dich bei einem Admin.",pname,Spieler[playerid][Level],GetPlayerMoney(playerid),Spieler[playerid][Admin],Spieler[playerid][Kills],Spieler[playerid][Deaths],kdrate);

    Sicher das das nicht nur dein Editor so falsch angibt?


    Der Test mit strcmp war ja ebenfalls negativ und außerdem ist hinterher der Hash, der mit dem salt und key gebildet wird nicht der selbe, wie der der beim Register gespeichert wird.


    Edit:
    Ich verschlüssel die Strings nun vorher und speicher sie stattdessen in einer SQLite Datenbank. So scheint es zu funktionieren.

    hast du das ganze schon mit strcmp verglichen oder nur mal ausgegeben weil da kann es gut sein das manche werte nicht richtig ausgegeben wurden.
    Zu dem was ist das für eine Verschlüsslung ? und du kannst auch fgetchar noch verwenden und utf8 aktivieren


    Nein, habe ich noch nicht. Gute Idee, mache ich sofort.
    Das ist ein cryptographisch sicherer zufälliger String, den ich für das Passwort Hashen benutze.
    Das mit fgetchar probier ich dann auch mal.


    Edit:
    Die Strings sind nicht identisch, nach speichern und laden:



    Code:



    main()
    {
    new key[128], salt[128], File:salttext, loadedsalt[128], loadedkey[128];
    crypto_random(salt, sizeof(salt));
    crypto_random(key, sizeof(key));
    print("Random Strings erstellt.");
    printf("%s\r\n%s", salt, key);
    salttext = fopen("testsalt.txt", io_write);
    if(salttext)
    {
    format(salt, 270, "%s\r\n%s", salt, key);
    fwrite(salttext, salt);
    fclose(salttext);
    }
    print("Strings gespeichert");
    salttext = fopen("testsalt.txt", io_read);
    if(salttext)
    {
    fread(salttext, loadedsalt);
    fread(salttext, loadedkey);
    fclose(salttext);
    }
    print("Strings geladen");
    printf("%s\r\n%s", loadedsalt, loadedkey);
    print("Vergleiche Strings");
    if(!strcmp(salt, loadedsalt)) print("Salts sind identisch");
    else print("Salts nicht identisch");
    if(!strcmp(key, loadedkey)) print("Key identisch");
    else print("Key nicht identisch");
    }


    Und mit fgetchar wird nichts geladen?!

    Moin zusammen,


    ich habe ein Problem mit der Funktion fread. Diese liest nämlich bei mir fehlerhafte Werte aus.


    Bsp.:

    Code
    //Gespeichert wird:
    Kó,ßÖjg6ÿcõ·îÑFUÀ :NWâ'±ä:Ñp*²Îßse¶.Õ£Íâ(MP±ë¥ÒbÃÎåǭƸU¡n?A±	aôuv¯m<Þùa.o£fú)_{
    ·¯­ ÅôJäåÚ(>|| ÎCÀjÇ`ÕÑgIõäw-J@³NF+¶ýôï[ÇÛ:(¤ÃèD¸ò±÷ÞßYÕ²íÖÿÅt§ärÿÑøsp%å^¯Y]óÁÆhTÐ1JÆ{_`*si
    //Geladen wird:
    Kó,ˆßÖjg…6ÿc‰õ„·îÑFUÀ :NWâ•'±ä:Ñp*²Îߘ‰se€¶–.Õ£Íâ(MP±„ë¥Ò‰bÃÎåǭƸU¡n?A±™	‡aôuv¯m<Þùa.o£fú)_{
    ·¯­ Åô“JäåÚ(>|| ÎCÀˆjdž`ÕÑgI†õäw-J@–³NF€+¶ýôï[ÇÛ:(¤ÃèD¸ò±÷ÞßYÕ²íÖÿÅt§ärÿÑ‘øs›p%å‡^¯YŠ]óÁÆhTÐ1JÆ{_`*s†i


    Der Code:

    //Speichern
    format(string, 128, "/UserSalts/%s_salt.txt", SpielerName(playerid));
    salttext = fopen(string, io_write);
    if(salttext)
    {
    format(string, 270, "%s\r\n%s", salt, key);
    fwrite(salttext, string);
    fclose(salttext);
    }



    //Laden
    format(string, 128, "/UserSalts/%s_salt.txt", SpielerName(playerid));
    salttext = fopen(string, io_read);
    if(salttext)
    {
    fread(salttext, salt);
    fread(salttext, key);
    fclose(salttext);
    print(salt);
    print(key);
    }


    Ich hoffe jemand weiß was, was ich tun kann, denn diese Werte müssen richtig geladen werden, ansonsten kann man sich nicht einloggen.

    Zu dem mit SQLite:


    Du verletzt ein Constraint (= Zwangsbedingung). Weil ich die Tabellenstruktur kenne, würde ich sagen, dass du versuchst zwei Zeilen mit selben Wert für die Primary Key Spalte einzufügen.


    Das letzte:


    Das mit return's in Schleifen hab ich dir schon 100000x erklärt.
    Aber da dies drin ist kann ich dir eine Diagnose geben:
    Weil ja, wenn kein Auto existiert, der Dialog kommt und der Dialog eig auch kommen sollte, wenn ein Auto existiert (wegen dem return), wird irgendetwas entweder an dem format oder strcat nicht funktionieren. (Schlecht erklärt aber ist so)
    Mach mal prints um festzustellen woran es liegt.

    Danke für dein Feedback UncleSub, wir arbeiten auch an einem neuen Design, ebenfalls war das, was du angesprochen hast nur die "Beta Phase".
    Wir arbeiten aber dran! :)


    Bitte. Das mit der Beta war mir klar, ich wollte das nur ansprechen, damit ihr euch noch verbessert!


    heben sich nur in der Leistung ab, Beispielsweise vCPU, RAM und HDD


    Dann fände ich es bspw. schön, wenn z.B. dort wo man die V-Server kauft darunter immer steht, welche Leistung dieses Paket hat.

    Wirklich alles in allem Top!
    Die Server an sich sind schnell und leistungsstark. Der Support nett und kompetent.
    Die Bearbeitungszeit sind zudem auch relativ niedrig, ließe sich bestimmt noch verbessern, aber für den Anfang wirklich sehr gut.
    Bei allen Problemen wurde mir geholfen, egal wie speziell der Wunsch war.
    Das Control Panel finde ich nicht ganz so gut gelungen. Daran könnte man bestimmt noch was machen. (Zu dunkel, unübersichtlich, Server Config ändern verbessern)
    Ihr habt jetzt jedenfalls einen Kunden mehr!


    Eine kleine Frage noch:
    Ich fände es schön, wenn man sehen könnte, welche Vorzüge welches V-Server Paket besitzt. Inwiefern hebt sich z.B. Paket "Small" von "Professional" oder "Business" ab?

    Stimmt das so? Denn ich hatte nie Probleme mit Laggs oder Sonstigem ..


    Solange nur wenige Spieler spielen (oder nur du) merkt man eher weniger. Aber trotzdem ist das mit mysql_Get sehr Ressourcenfressend. Ich kann davon nur abraten.
    Grund:
    Pawn unterstützt keine Multi-Threads (= mehrere Aufgaben gleichzeitig Ausführen), sondern führt jede Aufgabe nacheinander aus. Wenn eine Anfrage an eine MySQL Datenbank bspweise gesendet wird, wartet der Server auf eine Antwort. Bei mehreren Anfragen (Querys) führt dies zu laggs, sogar im schlimmsten Fall zum Totalausfall. Der Server kann in der Zeit z.B. auch keine Synchronisationsaufgaben erledigen!
    Deswegen würde ich auf diese "Hilfsfunktionen" verzichten.

    Mir ist außerdem aufgefallen, dass du Model ID's und vehicleid's verwechselst. Du musst beim erstellen des Fahrzeuges die carid in einer Variable speichern und dann die anderen Variablen unter diesem Index speichern.
    Bsp.:

    new carid = CreateVehicle(...);
    FCarInfo[carid][cFarbe1] = color1;

    Du gehst das falsch an. So wie du bereits dein Array aufgebaut hast, wird das leider nichts. Du benötigst ein Multidimensionales Array. So, wie du es jetzt hast, könntest du dir höchsten ein Auto erstellen (andernfalls werden die Variablen überschrieben).
    Also dann statt


    new FCarInfo[FCarDaten];


    dies hier


    new FCarInfo[MAX_VEHICLES][FCarDaten];


    Demnach müsstest du dann das Erstellen/Laden/Speichern anpassen (Probier es erstmal nochmal selber). Falls du dabei Hilfe benötigst, schreib einfach nochmal. :thumbup:


    Edit:
    Außerdem noch folgendes:



    if(sscanf(params,"diid",carid,color1,color2,frakid)) return SendClientMessage(playerid,COLOR_HELLGRAU,"Benutze: /cfc [VehicleID] [Farbe 1] [Farbe 2] [FraktionID]"); //carid ist wahrscheinlich die Model ID
    GetPlayerPos(playerid,X,Y,Z);
    GetVehiclePos(carid,vX,vY,vZ);//?? Von der Model ID brauchst du nicht die Pos. Falls die Model ID zufällig ein vorhandenes Vehicle ist..Kriegst du die Pos davon
    CreateVehicle(carid,X,Y,Z,Angle,color1,color2,-1);
    fCarID[playerid] = carid;//Wenn müsstest du die tatsächliche vehicleid, nicht das Model setzen, bringt so nichts
    CreateFraktionAuto(carid,frakid);//siehe oben
    FCarInfo[cFarbe1] = color1;
    FCarInfo[cFarbe2] = color2;
    FCarInfo[cPosX] = vX;//falsche pos
    FCarInfo[cPosY] = vY;//falsche pos
    FCarInfo[cPosZ] = vZ;//falsche pos
    FCarInfo[cPosAngle] = vAngle;//nirgendwo gesetzt

    Also deine include mit dem code wo du hier gepostet hast funktioniert auch


    Okay. Das ist gut zu wissen.
    Dann bedanke ich mich mal für dein geteste und gehe davon aus, dass es an etwas anderem liegt.
    Falls mein Freund sagt, dass es nicht funktioniert, editiere ich das hier noch mal. Ansonsten bedanke ich mich bei allen!

    Hm also ich habs nochmal mit deiner include probiert heir ist das selbe das es problem los funktioniert , mal so eine frage testest du das direkt auf deinem server oder erstmal local.


    Lokal. Die Include die man downloaden kann ist aber nicht die, mit der ich teste.
    Ich werde mal einen Freund bitten, ob er das bei sich testen kann. Falls es dort funktioniert, liegt es an etwas anderem.

    Hmm..Das ist natürlich äußerst Mysteriös.


    seit dem du die rotation geändert hast was ja sinnlose ist das es deswegen doppelt erstellt wird.


    Ja, seitdem ich dort das geändert habe. Ich habe dies gemacht, da der Blitzer sonst in die Falsche Richtung ausgerichtet ist, was eigentlich nicht so schlimm wäre, wenn ich nicht jetzt eingefügt hätte, dass der Blitzer erkennt, ob man vor oder hinter dem Blitzer ist. Wenn man dann von einem frontblitzenden Blitzer, der einen aber mit der hinterseite blitzt, geblitzt wird, ist das schon merkwürdig..

    schonmal gedebuggt beim laden?
    Wenn ich es richtig verstanden hab dann stellen die sich alle an einer stelle ne?


    1. Habe bereits beim Laden prints eingefügt, weil ich dachte, dass evtl die Funktion 2x aufgerufen wird o.Ä., es scheint richtig zu sein. Die Rotation hab ich auch geprintet, aber die Werte sind auch richtig.
    2. Die Objekte sind an der selben Stelle (2 Stück), eins in der richtigen Rotation, das andere 180° gedreht.


    Edit:
    Ebenfalls merkwürdig ist, dass nach einem gmx alles ohne Probleme geladen und erstellt wird. Doch nach einem kompletten aus- und einschalten werden an den Stellen immer die 2 Objekte erstellt..

    Du musst uns mehr aus dem Script zeigen. besonders auch den teil wo das Objekt gedreht wird. auf der aktuellen Grundlage lässt sich kein Fehler feststellen.


    Blitzer Erstellen, dies funktioniert:



    stock CreateBlitzer(Float:x, Float:y, Float:z, Float:rz, MaxSpeed, Winkel = NORMAL_BLITZER)
    {
    for(new i; i < MAX_U_BLITZER; i++)
    {
    if(uBlitzer[i][ubErstellt] == false)
    {
    #if !defined BLITZER_NO_SAVE
    new string[256];
    format(string, sizeof(string), "INSERT INTO `Blitzer` (`bID`, `bX`, `bY`, `bZ`, `bRZ`, `bMaxSpeed`, `bWinkel`) VALUES ('%i', '%f', '%f', '%f', '%f', '%i', '%i')", i, x, y, z, rz, MaxSpeed, Winkel);
    db_free_result(db_query(BlitzerDB, string));
    #endif
    uBlitzer[i][ubObject] = CreateDynamicObject(18880, x, y, z-1.2, 0.0, 0.0, (rz-180));
    uBlitzer[i][ubGebiet] = CreateDynamicRectangle(x-10, y-10, x+10, y+10);
    uBlitzer[i][ubID] = i;
    uBlitzer[i][ubX] = x;
    uBlitzer[i][ubY] = y;
    uBlitzer[i][ubZ] = z;
    uBlitzer[i][ubAng] = rz;
    uBlitzer[i][ubMaxSpeed] = MaxSpeed;
    uBlitzer[i][ubWinkel] = Winkel;
    uBlitzer[i][ubErstellt] = true;
    return i;
    }
    }
    return print(">>> [Uncles Blitzer] FEHLER: Beim erstellen vom Blitzer ist ein Fehler aufgetreten. (MAX_U_BLITZER zu klein?) <<<") & 0;
    }


    Blitzer Laden:



    stock LoadBlitzer()
    {
    new rows, buffer[24], DBResult:result, slot;
    result = db_query(BlitzerDB, "SELECT * FROM `Blitzer`");
    rows = db_num_rows(result);
    if(rows == 0) return print("* 0 Blitzer geladen *");
    for(new i; i < rows; i++)
    {
    db_get_field(result, 0, buffer, sizeof(buffer)), slot = strval(buffer), uBlitzer[slot][ubID] = slot;
    db_get_field(result, 1, buffer, sizeof(buffer)), uBlitzer[slot][ubX] = floatstr(buffer);
    db_get_field(result, 2, buffer, sizeof(buffer)), uBlitzer[slot][ubY] = floatstr(buffer);
    db_get_field(result, 3, buffer, sizeof(buffer)), uBlitzer[slot][ubZ] = floatstr(buffer);
    db_get_field(result, 4, buffer, sizeof(buffer)), uBlitzer[slot][ubAng] = floatstr(buffer);
    db_get_field(result, 5, buffer, sizeof(buffer)), uBlitzer[slot][ubMaxSpeed] = strval(buffer);
    db_get_field(result, 6, buffer, sizeof(buffer)), uBlitzer[slot][ubWinkel] = strval(buffer);
    uBlitzer[slot][ubObject] = CreateDynamicObject(18880, uBlitzer[slot][ubX], uBlitzer[slot][ubY], uBlitzer[slot][ubZ]-1.2, 0.0, 0.0, (uBlitzer[slot][ubAng]-180));
    uBlitzer[slot][ubGebiet] = CreateDynamicRectangle(uBlitzer[slot][ubX]-10, uBlitzer[slot][ubY]-10, uBlitzer[slot][ubX]+10, uBlitzer[slot][ubY]+10);
    uBlitzer[slot][ubErstellt] = true;
    db_next_row(result);
    }
    db_free_result(result);
    printf("* %i Blitzer geladen *", rows);
    return 1;
    }


    Ich hoffe hier hat noch irgendwer eine Ahnung, was falsch ist.


    Edit: Push (Letztes bearbeiten/Letzter Beitrag: 25.06.2013, 19:36)
    Es scheint so, als ob hier niemand eine brauchbare Lösung hat. Vielleicht weiß ja einer der Experten weiter: Kaliber: Beavis: @BlackAce: IPrototypeI: und die anderen halt (Sorry, dass ich euch direkt anspreche, aber ich bräuchte mal eine Lösung des Problems..)

    mysql_real_escape_string(Is, Is); //Fehlerzeile


    Das wegmachen, da Is nur ein Integer ist und mysql_real_escape_string nur aus Strings Schadcode entfernt.

    Klar! Das ist einfach nur eine SQL. Diese mysql_Get.. Hilfsfunktionen machen nichts anderes, doch sind, falls man mehrere Dinge laden will, sehr Ressourcenfressend.
    Falls du Interesse an Ressourcenfreundlichem Scripten hat, kannst du dir ja dazu Tutorials anlesen.


    Zu der SQL:
    Das UPDATE Statement Updated immer Daten in einer Tabelle. Bei UPDATE ist es so, dass die generelle SQL so aussieht:


    SQL
    UPDATE `TabellenName` SET `Spalte`='Wert'


    Daran kann man auch dann noch eine WHERE Bedingung ansetzen. Bsp.:


    SQL
    UPDATE `Accounts` SET `Level`='2' WHERE `Name`='UncleSub'


    Diese SQL Updated in der Tabelle Accounts die Spalte Level auf 2, wo der Name UncleSub ist.