Beiträge von Jeffry

    Jeffry du weisst auch nicht was du willst? erst schreibst du das mit .cfg und jetzt das..


    Das mit der server.cfg war ja auch korrekt. Ebenso ist es korrekt, dass das R5 nicht die mysql_init benutzt.


    Hätte es nicht an seinem Code gelegen (wohl ein falscher geladen), dann hätte er das falsche Plugin für den GameMode gehabt (nicht die Version, sondern von einem anderen Entwickler).
    Woran sieht man das? mysql_init wird vom StrickenKid Plugin genutzt: http://wiki.sa-mp.com/wiki/MySQL_Plugin#mysql_init

    Kannst du nochmal deine Datenbank und deinen Log leeren und den Befehl nochmal eingeben, bzw. zweimal? Und wenn möglich auch nochmal den Befehl und die zwei stocks dazu, wie sie momentan sind?
    Das ist so durcheinander hier, etwas Ordnung wäre gut. Den Log brauche ich um die Vorgänge zu verfolgen, warum es "verzögert" erstellt wird.

    b_id war an der falschen Stelle im Format.


    format(string,300,"\
    {00E49A}ID: {FEFEFE}%d\n\
    {00E49A}Besitzer: {FEFEFE}%s\n\
    {00E49A}Teilhaber: {FEFEFE}%s\n{00E49A}\n\
    {00E49A}Beschreibung: {FEFEFE}%s\n\
    {00E49A}Kasse: {FEFEFE}%d",
    bInfo[id][b_id],bInfo[id][b_besitzer],bInfo[id][b_teilhaber],bInfo[id][b_bs],bInfo[id][b_kasse]);


    So müsste es klappen.

    Jetzt war ja die Rede davon die Index ID abzufragen - wenn dem so ist, dann ist "pickupid" doch der falsche Vergleichsparameter, oder?


    Ich habe es dir jetzt mal umgebastelt und versucht, deinen Style so weit wie möglich beizubehalten, damit du es auch noch verstehst und nachvollziehen kannst.
    Testen kann ich es leider nicht, da ich es ja nicht kompilieren kann, den Part musst du übernehmen.


    Falls es nicht klappt, beschreibe bitte was nicht klappt. Bei so langen Codes ist es immer schwer es auf Anhieb ohne es zu kompilieren und testen hinzubekommen.


    Spoiler anzeigen
    public OnGameModeInit()
    {
    BF_WEAPON[0] = CreateDynamicPickup(342, 1, 120.5242, 1934.8777, 22.7578, 7, -1, -1, 100.0); //Grenade
    BF_WEAPON[1] = CreateDynamicPickup(342, 1, 279.4142, 1829.5718, 21.4766, 7, -1, -1, 100.0); //Grenade
    BF_WEAPON[2] = CreateDynamicPickup(342, 1, 116.2530, 1875.0065, 22.4375, 7, -1, -1, 100.0); //Grenade
    BF_WEAPON[3] = CreateDynamicPickup(342, 1, 136.4600, 1874.9723, 22.4375, 7, -1, -1, 100.0); //Grenade
    BF_WEAPON[4] = CreateDynamicPickup(360, 1, 189.9938, 1940.4785, 17.6406, 7, -1, -1, 100.0); //Heat Seeker
    BF_WEAPON[5] = CreateDynamicPickup(360, 1, 206.2279, 1932.8312, 23.2422, 7, -1, -1, 100.0); //Heat Seeker
    BF_WEAPON[6] = CreateDynamicPickup(360, 1, 144.0044, 1850.1791, 25.2610, 7, -1, -1, 100.0); //Heat Seeker
    BF_WEAPON[7] = CreateDynamicPickup(360, 1, 211.4619, 1809.8109, 25.1172, 7, -1, -1, 100.0); //Heat Seeker
    BF_WEAPON[8] = CreateDynamicPickup(360, 1, 146.3869, 1907.3638, 26.3924, 7, -1, -1, 100.0); //Heat Seeker
    BF_WEAPON[9] = CreateDynamicPickup(360, 1, 197.3199, 1835.0059, 23.2422, 7, -1, -1, 100.0); //Heat Seeker

    new Random = random(sizeof(RandomSpawnsBF_Minigun));
    BF_WEAPON[10] = CreateDynamicPickup(362, 1, RandomSpawnsBF_Minigun[Random][0], RandomSpawnsBF_Minigun[Random][1], RandomSpawnsBF_Minigun[Random][2], 7, -1, -1, 100.0);
    MapIcon_Minigun = CreateDynamicMapIcon(RandomSpawnsBF_Minigun[Random][0], RandomSpawnsBF_Minigun[Random][1], RandomSpawnsBF_Minigun[Random][2], 23, C_TURQUOISE, 7, -1, -1, 250.0);
    return DM_OnGameModeInit();
    }

    Spoiler anzeigen
    forward DM_OnGameModeInit();
    #if defined _ALS_OnGameModeInit
    #undef OnGameModeInit
    #else
    #define _ALS_OnGameModeInit
    #endif
    #define OnGameModeInit DM_OnGameModeInit

    Spoiler anzeigen
    public OnPlayerPickUpDynamicPickup(playerid, pickupid)
    {
    if(pickupid == BF_WEAPON[0] || pickupid == BF_WEAPON[1] || pickupid == BF_WEAPON[2] || pickupid == BF_WEAPON[3])
    {
    GivePlayerWeapon(playerid, GRENADE, 3);
    DestroyDynamicPickup(pickupid);
    printf("%i aufgenommen.", pickupid);
    }
    else if(pickupid == BF_WEAPON[4] || pickupid == BF_WEAPON[5] || pickupid == BF_WEAPON[6] || pickupid == BF_WEAPON[7] || pickupid == BF_WEAPON[8] || pickupid == BF_WEAPON[9])
    {
    GivePlayerWeapon(playerid, HEAT_SEEKER, 1);
    DestroyDynamicPickup(pickupid);
    printf("%i aufgenommen.", pickupid);
    }
    else if(pickupid == BF_WEAPON[10]) //Minigun Event
    {
    new stringDE[128],
    stringEN[128],
    MinigunWielder[MAX_PLAYER_NAME];
    GetPlayerName(playerid, MinigunWielder, sizeof(MinigunWielder));
    format(stringDE, sizeof(stringDE), "»DEATHMATCH« {%06x}%s "#C_DM_E"hat die Minigun aufgenommen! Nehmt euch in Acht!", GetPlayerColor(playerid) >>> 8, MinigunWielder);
    format(stringEN, sizeof(stringEN), "»DEATHMATCH« {%06x}%s "#C_DM_E"has picked up the minigun! Watch out!", GetPlayerColor(playerid) >>> 8, MinigunWielder);
    SendLanguageMessage(playerid, C_DM, stringDE, stringEN);
    GivePlayerWeapon(playerid, MINIGUN, 250);
    DestroyDynamicPickup(pickupid);
    DestroyDynamicMapIcon(MapIcon_Minigun);
    printf("%i aufgenommen.", pickupid);
    }
    for(new i = 0; i < 11; i++)
    {
    switch (i)
    {
    case 0..9:
    {
    if(pickupid == BF_WEAPON[i])
    {
    SetTimerEx("PickupRespawn", 60*1000, false, "i", i);
    BF_WEAPON[i] = -1;
    }
    }
    case 10:
    {
    if(pickupid == BF_WEAPON[i])
    {
    SetTimer("MinigunRespawn", 3*60*1000, false);
    BF_WEAPON[i] = -1;
    }
    }
    }
    }
    return _OnPlayerPickUpDynamicPickup(playerid, pickupid);
    }

    Spoiler anzeigen
    forward _OnPlayerPickUpDynamicPickup(playerid, pickupid);
    #if defined ALS_OnPlayerPickUpDynamicPickup
    #undef OnPlayerPickUpDynamicPickup
    #else
    #define ALS_OnPlayerPickUpDynamicPickup
    #endif
    #define OnPlayerPickUpDynamicPickup _OnPlayerPickUpDynamicPickup

    Spoiler anzeigen
    forward PickupRespawn(index);
    public PickupRespawn(index)
    {
    switch(index)
    {
    case 0: BF_WEAPON[0] = CreateDynamicPickup(342, 1, 120.5242, 1934.8777, 22.7578, 7, -1, -1, 100.0); //Grenade
    case 1: BF_WEAPON[1] = CreateDynamicPickup(342, 1, 279.4142, 1829.5718, 21.4766, 7, -1, -1, 100.0); //Grenade
    case 2: BF_WEAPON[2] = CreateDynamicPickup(342, 1, 116.2530, 1875.0065, 22.4375, 7, -1, -1, 100.0); //Grenade
    case 3: BF_WEAPON[3] = CreateDynamicPickup(342, 1, 136.4600, 1874.9723, 22.4375, 7, -1, -1, 100.0); //Grenade
    case 4: BF_WEAPON[4] = CreateDynamicPickup(360, 1, 189.9938, 1940.4785, 17.6406, 7, -1, -1, 100.0); //Heat Seeker
    case 5: BF_WEAPON[5] = CreateDynamicPickup(360, 1, 206.2279, 1932.8312, 23.2422, 7, -1, -1, 100.0); //Heat Seeker
    case 6: BF_WEAPON[6] = CreateDynamicPickup(360, 1, 144.0044, 1850.1791, 25.2610, 7, -1, -1, 100.0); //Heat Seeker
    case 7: BF_WEAPON[7] = CreateDynamicPickup(360, 1, 211.4619, 1809.8109, 25.1172, 7, -1, -1, 100.0); //Heat Seeker
    case 8: BF_WEAPON[8] = CreateDynamicPickup(360, 1, 146.3869, 1907.3638, 26.3924, 7, -1, -1, 100.0); //Heat Seeker
    case 9: BF_WEAPON[9] = CreateDynamicPickup(360, 1, 197.3199, 1835.0059, 23.2422, 7, -1, -1, 100.0); //Heat Seeker
    }
    printf("Index %d respawnt", index);
    return 1;
    }

    Spoiler anzeigen
    forward MinigunRespawn();
    public MinigunRespawn()
    {
    new Random = random(sizeof(RandomSpawnsBF_Minigun));
    BF_WEAPON[10] = CreateDynamicPickup(362, 1, RandomSpawnsBF_Minigun[Random][0], RandomSpawnsBF_Minigun[Random][1], RandomSpawnsBF_Minigun[Random][2], 7, -1, -1, 100.0);
    MapIcon_Minigun = CreateDynamicMapIcon(RandomSpawnsBF_Minigun[Random][0], RandomSpawnsBF_Minigun[Random][1], RandomSpawnsBF_Minigun[Random][2], 23, C_TURQUOISE, 7, -1, -1, 250.0);
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerVirtualWorld(i) == 7)
    {
    GameTextForPlayer(i, "~r~Minigun Event!", 3000, 4);
    SendLanguageMessage(i, C_DM, "»DEATHMATCH« Die Minigun wurde gespawnt! Schnapp sie dir!", "»DEATHMATCH« The minigun has been spawned! Go get it!");
    }
    }
    printf("Minigun respawnt.");
    return 1;
    }

    Ich möchte dass die letzten Bestrafungen eines Spielers ausgelesen und notiert werden.


    Ich erkläre dir erst mal wie du vorgehst, dann versuchst du es selbst, und falls du Probleme hast kannst du gerne nachfragen.


    • Datei öffnen und mit while(fread(...)) durchlesen. Bei jedem Schleifendurchgang eine Variable +1 machen. Wenn du durch bist, weißt du wie viele Zeilen der Log hat.
    • Die Datei schließen.
    • Die Datei wieder öffnen und wieder durchlesen. Eine zweite Variable hochzählen, und wenn diese Variable größer ist als die Anzahl der Zeilen (erste Variable) minus 25, dann speicherst du die ausgelesene Zeile in deine Text-Variable (String).


    An sich: Zeilen zählen => Zeilen durchgehen und erst ab (zeilen-25) ausgeben.


    Falls du Probleme mit dem Code hast einfach melden.

    Fängt dein AUTO_INCREMENT bei 0 an?
    Wenn ja:
    format(q,256,"SELECT * FROM `Cardealers` WHERE `ID` = '%d'",id+1);


    zu:
    format(q,256,"SELECT * FROM `Cardealers` WHERE `ID` = '%d'",id);


    Ich hatte dir das geändert, weil eigentlich bei allen die ID bei 1 anfängt, wenn sie was mit MySQL machen.

    Geht auch nicht :/


    UpdateBiz(id)
    {
    new string[300];
    if(bInfo[id][b_pickup] != -1)
    {
    DestroyPickup(bInfo[id][b_pickup]);
    bInfo[id][b_pickup] = -1;
    }
    if(bInfo[id][b_text] != Text3D:-1)
    {
    Delete3DTextLabel(bInfo[id][b_text]);
    bInfo[id][b_text] = Text3D:-1;
    }
    if(!strlen(bInfo[id][b_besitzer]))
    {
    //Kein Besitzer
    bInfo[id][b_pickup] = CreatePickup(1272,1,bInfo[id][bx],bInfo[id][by],bInfo[id][bz],-1);
    format(string,300,"\
    {00E49A}ID: {FEFEFE}%d\n\
    {00E49A}Besitzer: {FEFEFE}-unbekannt-\n\
    {00E49A}Teilhaber: {FEFEFE}-unbekannt-\n\
    {00E49A}Kaufpreis: {FEFEFE}%d\n\
    {00E49A}Beschreibung: {FEFEFE}%s\n\
    {00E49A}Kasse: {FEFEFE}%d\n\n\
    Dieses Business steht zum Verkauf, gebe /buybiz ein um das\n Business zu kaufen.",
    bInfo[id][b_id],bInfo[id][b_preis],bInfo[id][b_bs],bInfo[id][b_kasse]);
    bInfo[id][b_text] = Create3DTextLabel(string,COLOR_BLAU,bInfo[id][bx],bInfo[id][by],bInfo[id][bz],10,0,1);
    }
    else
    {
    //Besitzer
    bInfo[id][b_pickup] = CreatePickup(1272,1,bInfo[id][bx],bInfo[id][by],bInfo[id][bz],-1);
    format(string,300,"\
    {00E49A}ID: {FEFEFE}%d\n\
    {00E49A}Besitzer: {FEFEFE}%s\n\
    {00E49A}Teilhaber: {FEFEFE}%s\n{00E49A}\n\
    {00E49A}Beschreibung: {FEFEFE}%s\n\
    {00E49A}Kasse: {FEFEFE}%d",
    bInfo[id][b_besitzer],bInfo[id][b_teilhaber],bInfo[id][b_id],bInfo[id][b_bs],bInfo[id][b_kasse]);
    bInfo[id][b_text] = Create3DTextLabel(string,COLOR_BLAU,bInfo[id][bx],bInfo[id][by],bInfo[id][bz],10,0,1);
    }
    return 1;
    }


    Und zusätzlich bei OnGameModeInit ganz als erstes:
    for(new id=0; id<sizeof(bInfo); id++)
    {
    bInfo[id][b_pickup] = -1;
    bInfo[id][b_text] = Text3D:-1;
    }



    Wenn du genau hinschaust, dann siehst du, dass da zwei Labels an der gleichen Stelle sind. Warum? Weill Labels und Pickups auch eine ID 0 haben. Fragst du nun ab, "if(bInfo[id][b_text])" ist das wie "if(0)" und das ist false, also wird das Label nicht entfernt, sondern es wird ein neues erstellt.

    Eigentlich ist das im R38 nicht anders, da du ja nichts auslesen lässt, sondern nur schreibst.
    Du kannst ganz normal mysql_query nutzen, oder du nimmst die etwas bessere Variante mit mysql_tquery: http://wiki.sa-mp.com/wiki/MySQL/R33#mysql_tquery
    Der Rest (also das query selbst) bleibt identisch. Ein Callback musst du gar keins angeben (einfach "" setzen).


    Falls es nicht klappt, oder du nicht weißt wie poste am besten mal den Code den du von deiner R5 Version hast, welcher funktioniert.

    Manyula:
    Ich weiß, dass es sich mit dem was ich zuerst gesagt habe widerspricht. Das liegt daran, dass ich übersehen habe, dass du das Pickup beim Aufnehmen entfernst (fehlerfrei bin ich leider auch nicht :D).
    Der Code würde nur dann Sinn geben, wenn du das Pickup nicht, oder erst später, löschst, so wie ich es mir fälschlicherweise gedacht habe.


    Sorry um die Verwirrung. Ich mache dir das heute Abend richtig, falls du es nicht selbst schaffst.

    stock LoadCarDealer(id)
    {
    new q[256];
    format(q,256,"SELECT * FROM `Cardealers` WHERE `ID` = '%d'",id+1);
    mysql_query(q);
    mysql_store_result();
    if(mysql_num_rows() == 1) {
    new str[512];
    while(mysql_fetch_row(str)) {
    for(new i;i<MAX_AUTOHAUS;i++) {
    if(AHInfo[i][zCreated])continue;
    new string[256];
    sscanf(str, "e<p<|>ds[32]fffds[24]dd>",AHInfo[i]);
    if((!strcmp(AHInfo[i][zOwner],"Niemand",true))) {
    AHInfo[i][zPickup]=CreatePickup(1273,1,AHInfo[i][zPosX],AHInfo[i][zPosY],AHInfo[i][zPosZ],0);
    format(string,128,"** %s **\nDieses Autohaus ist zu verkaufen!\nPreis: %s€\nLevel: %d\nAutohaus kaufen: /buybiz",AHInfo[i][zName],inspoints(AHInfo[i][zPrice]),AHInfo[i][zLevel]);
    AHInfo[i][zLabel]=Create3DTextLabel(string,COLOR_AHLABEL,AHInfo[i][zPosX],AHInfo[i][zPosY],AHInfo[i][zPosZ],10,0,0);
    AHInfo[i][zCreated] = true;
    } else {
    AHInfo[i][zPickup]=CreatePickup(1272,1,AHInfo[i][zPosX],AHInfo[i][zPosY],AHInfo[i][zPosZ],0);
    format(string,128,"** %s **\nBesitzer: %s",AHInfo[i][zName],AHInfo[i][zOwner]);
    AHInfo[i][zLabel]=Create3DTextLabel(string,COLOR_AHLABEL,AHInfo[i][zPosX],AHInfo[i][zPosY],AHInfo[i][zPosZ],10,0,0);
    AHInfo[i][zCreated] = true;
    }
    return 1; //Hat gefehlt, wie gesagt.
    }
    }
    mysql_free_result();
    }
    return 1;
    }

    Ja, dann muss mach der strcmp Abfrage (die nach sscanf) auch ein return 1 hin (also nach dem else Teil). Dann dürfte das auch gehen.


    Es muss so sein, weil wenn das Objekt geladen ist, muss der Loop ja nicht weiter laufen, es ist ja erstellt. Sonst wird es nur nochmal erstellt.

    Oh, dann sieht es schlecht aus. Da kann ich mir nur noch vorstellen, dass es an der bewegenden Kamera liegt, dass SAMP das Objekt in dem Modus nicht anzeigt.


    Wenn du die AddFire Funktion mal postest, dann teste ich es morgen mal bei mir, oder jemand anderes hier, falls ich noch nicht zu Hause bin.

    Jetzt ist der Log auch vollständig.
    LoadCarDealer(i);
    Zu
    return LoadCarDealer(i);


    format(q,256,"SELECT * FROM `Cardealers` WHERE `ID` = '%d'",id);
    Zu
    format(q,256,"SELECT * FROM `Cardealers` WHERE `ID` = '%d'",id+1);

    Wenn im Log nur ein INSERT steht, dann wird auch nur eins gemacht. Hast du schonmal versucht, die Datenbank bzw die Tabelle neu zu erstellen?


    Wie sieht denn die Tabelle aus, wenn die Daten gespeichert worden sind?
    Leere zuvor auch noch den Log, damit du da nichts durcheinander bringst, sondern alles auf einmal hast und poste ihn dann gegebenenfalls nochmal.