Beiträge von UncleSub

    Hallo zusammen,


    ich habe ein Problem mit der sscanf Split Funktion. Mein Problem ist, dass eine Variable nicht richtig gesplittet wird!
    Ich benutze die Funktion bei einer MySQL Abfrage. Eigentlich müsste alles so stimmen, dennoch wird eine Variable falsch gesplittet!


    Mein Pawn Code:



    new data[550];
    mysql_query("SELECT * FROM Shops");
    mysql_store_result();
    shop_count = 0; //Ja habe ich Global definiert..
    while(mysql_fetch_row(data))
    {
    printf("Raw Shop Data: \"%s\"", data);
    sscanf(data, "e<p<|>iis[32]s[64]fffii>", Shop[shop_count]);
    printf("sscanf Shop Data: \nID: %i | Type: %i | Name: %s (%s) | Owner: %s \nXYZ: %f.%f.%f | Kasse: %i | Preis: %i",
    Shop[shop_count][sID], Shop[shop_count][sTyp], Shop[shop_count][sName], GetShopTypName(Shop[shop_count][sTyp]), Shop[shop_count][sOwner], Shop[shop_count][sX], Shop[shop_count][sY],
    Shop[shop_count][sZ], Shop[shop_count][sKasse], Shop[shop_count][sPreis]);
    if(strcmp(Shop[shop_count][sOwner], "Niemand", true))
    {
    format(data, 200, "\n%s \n%s \nBesitzer%s", GetShopTypName(Shop[shop_count][sTyp]), Shop[shop_count][sName], Shop[shop_count][sOwner]);
    Shop[shop_count][sPickup] = CreateDynamicPickup(19130, 0, Shop[shop_count][sX], Shop[shop_count][sY], Shop[shop_count][sZ], 0);
    Shop[shop_count][sLabel] = CreateDynamic3DTextLabel(data, 0xFFFFFF, Shop[shop_count][sX], Shop[shop_count][sY], Shop[shop_count][sZ], 15);
    }
    else
    {
    format(data, 200, "\n%s zu verkaufen! \nPreis: %i$", GetShopTypName(Shop[shop_count][sTyp]), Shop[shop_count][sPreis]);
    Shop[shop_count][sPickup] = CreateDynamicPickup(1274, 0, Shop[shop_count][sX], Shop[shop_count][sY], Shop[shop_count][sZ], 0);
    Shop[shop_count][sLabel] = CreateDynamic3DTextLabel(data, 0xFFFFFF, Shop[shop_count][sX], Shop[shop_count][sY], Shop[shop_count][sZ], 15);
    }
    shop_count++;
    }
    mysql_free_result();



    Ich habe bereits die Rohen Daten von der Abfrage, sowie die Gesplitteten Daten printen lassen. Das Ergebnis kommt mir aber echt spanisch vor.
    Auszug aus dem Log:


    Code
    [17:52:38] Raw Shop Data: "1|1|Buyable Shop|Niemand|1534.71|-1667.83|5.89062|0|122"
    [17:52:38] sscanf Shop Data: 
    ID: 1 | Type: 1 (Burger Shot) | Name: Buyable Shop | Owner: Niemand 
    XYZ: -0.000005.1534.709960.-1667.829956 | Kasse: 0 | Preis: 122



    Wie man sieht, wird der X Wert falsch geplittet, obwohl er richtig ausgelesen wurde! Weiß jemand weiter?


    Achso, ich benutze die neueste sscanf Version.


    Mfg,
    UncleSub

    Alles klar, danke für die Infos. Dennoch habe ich dann noch ein paar kleine Fragen.


    mit SetPlayerVirtualWorld sogar.


    Wenn ich dann also einen NPC in mehreren Virtuellen Welten haben wollte, wie würde das gehen? Man kann ja nicht SetPlayerVirtualWorld(playerid, -1) oder so machen. Könnte man das so machen?:



    for(new i; i < vworldsanzahl; i++)
    {
    SetPlayerVirtualWorld(playerid, i);
    }


    Würde für mich eigentlich keinen Sinn ergeben, denn dann wird der Spieler/Bot ja immer in die Welt geswitcht, bleibt dort aber nicht, oder?


    Zu den SAMP Extensions, hört sich echt nett an, schaue ich mir mal näher an. :)


    if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid))
    {
    {
    {
    GetPlayerName(playerid, PlayerInfo[playerid][pName], MAX_PLAYER_NAME);
    PlayerInfo[playerid][pLevel] = mysql_GetInt("accounts","Level", "Name",PlayerInfo[playerid][pName]);
    PlayerInfo[playerid][pAdmin] = mysql_GetInt("accounts","AdminLevel","Name",PlayerInfo[playerid][pName]);
    //...
    printf("Spielerdaten vom Spieler %s erfolgreich aus der Datenbank geladen",SpielerName(playerid));
    }//end while
    }


    Lösch mal die unnötigen Klammern..


    Mfg

    Danke für die Antwort!

    Zu deiner 2ten Frage,jeder Bot bekommt Automatisch eine ID zugewiesen.Das heißt das sie Automatisch als ein Normaler Spieler Connecten.

    Ja das ist mir bewusst. Deswegen Frage ich dazu ja auch, ob es ein Plugin gibt, wo dies nicht der Fall ist. Ich habe mich letztens mal mit der Plugin Entwicklung beschäftigt und ich denke schon, dass es möglich wäre (z.B. durch Memory Hacking). Aber ich bin da auch noch nicht so der Experte. ^^


    EDIT: Push

    Ich werde aus deiner Klammersetzung irgendwie nicht schlau:



    if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid))
    {
    {
    {
    GetPlayerName(playerid, PlayerInfo[playerid][pName], MAX_PLAYER_NAME);
    PlayerInfo[playerid][pLevel] = mysql_GetInt("accounts","Level", "Name",PlayerInfo[playerid][pName]);
    PlayerInfo[playerid][pAdmin] = mysql_GetInt("accounts","AdminLevel","Name",PlayerInfo[playerid][pName]);
    //...
    printf("Spielerdaten vom Spieler %s erfolgreich aus der Datenbank geladen",SpielerName(playerid));
    }//end while
    }


    3x Klammer auf und 2x Klammer zu für ein if? Erklär mir das.


    Mfg,
    UncleSub

    Erstmal brauchst du das hier oben irgendwo (optional, ist aber einfacher und besser):



    // PRESSED(keys)
    #define PRESSED(%0) \
    (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))


    // HOLDING(keys)
    #define HOLDING(%0) \
    ((newkeys & (%0)) == (%0))


    // RELEASED(keys)
    #define RELEASED(%0) \
    (((newkeys & (%0)) != (%0)) && ((oldkeys & (%0)) == (%0)))


    Dann gehst du zu OnPlayerKeyStateChange und machst dort eine if Abfrage. Also du möchtest ja, dass wenn der Spieler rennt und springt, er hinfliegt. Er muss also die Leertaste und die W Taste gedrückt halten und Shift drücken.
    Also:



    if(!IsPlayerInAnyVehicle(playerid)) //Natürlich nur wenn er On Foot ist
    {
    if(HOLDING(KEY_UP) && HOLDING(KEY_SPRINT) && PRESSED(KEY_JUMP))
    {
    //Hier deinen Code z.B. ApplyAnimation, such dir eine schöne Animation aus (z.B. ApplyAnimation(playerid, "PED", "KO_shot_stom", 4.1, 0, 0, 0, 0, 0); )
    //Oder noch eine Variable setzen, dass er einmal springen darf.
    }
    }



    Mfg,
    UncleSub

    Ich erkläre dir mal ein bisschen an deinem Code, was du tust.



    for(new Kord = 0; Kord < sizeof(ATMs); Kord++)
    {
    if(IsPlayerInRangeOfPoint(playerid, 7.0, ATMs[Kord][0], ATMs[Kord][1], ATMs[Kord][2])) //Bis hierher: Du hast das Grundprinzip verstanden, ist aber nicht ganz richtig danach.
    {
    // Dialog anzeigen
    } else {
    SendClientMessage(playerid, GRAU, "Du bist an keinem Bankautomaten."); //Du würdest gespamt werden mit "Du bist an keinem Bankautomat"
    }
    break; //Das break; macht, dass die Schleife SOFORT beendet wird. Also kommt er immer nur bis zu den ersten Coords im Array.
    }


    Pack das ganze in abgeänderter Form in ein Stock (z.B. IsPlayerAtATM). Anstatt, dass du dem Spieler Nachrichten, oder den Dialog zeigst arbeitest du mit return 1/0.


    Also:



    stock IsPlayerAtATM(playerid)
    {
    for(new Kord = 0; Kord < sizeof(ATMs); Kord++)
    {
    if(IsPlayerInRangeOfPoint(playerid, 7.0, ATMs[Kord][0], ATMs[Kord][1], ATMs[Kord][2]))
    {
    return 1;
    }
    }
    return 0;
    }


    Hoffe ich konnte helfen,
    UncleSub

    Alles soweit richtig, bis auf die markierte Zeile.
    Änder diese zu:


    if(!strcmp(MD5_Hash(inputtext),speicher, false))


    Noch was zum Nachlesen dazu: Strcmp.


    Außerdem noch ein Tipp:
    Warum fragst du alle Daten vom Account ab, wenn du nur das Passwort benötigst?


    format(query, sizeof(query), "SELECT * FROM `accounts` WHERE `Name` = '%s'", PlayerName(playerid));


    Trage dort statt dem * den Spaltennamen vom Passwort ein.


    Mfg,
    UncleSub

    Kommt drauf an, welche Version du nutzt. Im Prinzip kann man nicht sagen, dass durch ein altes Plugin nichts mehr funktioniert. Es hat ja einmal funktioniert.
    Das einzige was man sagen kann, dass in neueren Plugins natürlich entdeckte Bugs entfernt wurden. Außerdem ändern sich auch Befehle und es kommen neue hinzu. Zum Beispiel das MySQL Plugin von BlueG unterstützt ab R7 nur noch Threaded Querys und hat komplett neue Funktionen.



    Generell würde ich dir raten, immer die aktuellste Version zu benutzen, da dort am wenigsten Bugs sind. Außer halt beim genannten Beispiel von BlueG's Plugin. Musst dann abwägen, was du nutzen möchtest und am besten für dich geeignet ist.


    Mfg,
    UncleSub


    new MySQL:handle;


    public OnFilterScriptInit()
    {
    handle = mysql_init(LOG_ONLY_ERRORS, 1);
    mysql_connect(SQL_HOST,SQL_USER,SQL_DATABASE,SQL_PASSWORD);
    return 1;
    }


    So sollts gehen. Kannst dir hier alle Funktionen anschaun, die das Plugin hat.


    Mfg,
    UncleSub

    Wonach siehts denn aus? Also ja ich bin Scripter und kenne mich auch ein wenig in der Plugin Entwicklung aus.


    Zu deinem Problem:
    Was wird denn nicht geladen?


    Mfg,
    UncleSub