Inventarsystem Buggt

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Moin,


    Und zwar habe ich ein Inventarsystem in meinem Script. Es gibt verschiedene Slots.



    enum Spielerinv
    {
    Inv,
    Menge
    }
    #define ITEMSLOTS 6
    new Inventar[MAX_PLAYERS][Spielerinv][ITEMSLOTS];

    Inventar[playerid][Inv][1] ist z.B. Die Itemid die man in Slot 1 hat, Inventar[playerid][Menge][1] die Menge dazu, usw.
    Das Ganze funktioniert auch. Das Abfragen aus der MySQL Datenbank, Hat man ein Item, usw.
    Leider funktioniert meine Funktion, die dem Spieler ein Item geben soll nicht.
    Die sieht so aus:



    GiveItem(playerid,itemid,menge)
    {
    for(new i=0; i<ITEMSLOTS; i++)
    {
    if(Inventar[playerid][Inv][i] == 0 || itemid == Inventar[playerid][Inv][i])
    {
    Inventar[playerid][Inv][i] = itemid; Inventar[playerid][Menge][i] += menge;
    return 1;
    }
    }
    return 0;
    }

    Auch hier eine Kurze Erklärung, es wird jeder Inventarslot überprüft. Dieser wird nur verwendet wenn der Slot leer ist, oder bereits das Selbe Item ist.


    Ich hoffe mir kann jemand helfen, ich sehe einfach keinen Fehler.


    MfG

  • Es so zu machen ist ein wenig Fehlerhaft.
    Falls du in Slot<2> zB ItemID<5> hast, und möchtest jetzt noch zu ItemID<5> die Menge
    3 hinzufügen. Jetzt ist aber der Slot<0> leer. Jetzt wird in Slot<0> ItemID<5> hinzugefügt
    mit der Menge 3. Jetzt hast du aber in Slot<0> und Slot<5> ItemID<5> :/.




    #define INVENTAR_EMPTY_SLOT -1
    GiveItem(playerid,itemid,menge)
    {
    new
    i;
    // erst überprüfen ob das Item schon irgendwo im Inventar liegt
    for( i = 0; i < ITEMSLOTS; i++)
    {
    if( itemid == Inventar[playerid][Inv][i] )
    {
    Inventar[playerid][Menge][i] += menge;
    return 1;
    }
    }
    // noch nicht in inventar,also neuen slot suchen
    for( i = 0; i < ITEMSLOTS; i++)
    {
    if( itemid == INVENTAR_EMPTY_SLOT )
    {
    Inventar[playerid][Inv][i] = itemid;
    Inventar[playerid][Menge][i] = menge;
    return 1;
    }
    }
    return 0;
    }


    Ich nehm bei sowas nie 0 als leer / frei an. Denn 0 kann doch bestimmt
    eine ItemID bei dir sein.
    Das mit 0 wäre nur gut, wenn du immer bei 1
    mit dem Zählen anfängst. Macht man aber meistens nicht.

  • Stimmt, das hab ich nicht bemerkt. Danke.


    Leider scheint das Hinzufügen immer noch nicht zu funktionieren.
    Hier als Beispiel einmal mein /inventar Command:



    if (strcmp("/inventar", cmdtext, true, 10) == 0)
    {
    new query[128];
    new string[256];
    new Item[ITEMSLOTS][128];
    for(new i=0; i<ITEMSLOTS; i++)
    {
    format(query, 128, "SELECT Itemname FROM itemids WHERE ID = '%d'", Inventar[playerid][Inv][i]);
    mysql_query(query);
    mysql_store_result();
    new tz[30];
    mysql_fetch_row(tz);
    format(Item[i],128,"%s",tz);
    }
    format(string,sizeof(string),"%s %d Stück \n%s %d Stück \n%s %d Stück \n%s %d Stück \n%s %d Stück \n",Item[1],Inventar[playerid][Menge][1],Item[2],Inventar[playerid][Menge][2],Item[3],Inventar[playerid][Menge][3],Item[4],Inventar[playerid][Menge][4],Item[5],Inventar[playerid][Menge][5]);
    ShowPlayerDialog(playerid,DIALOG_INVENTAR,0,"Inventar",string,"Ende","");
    return 1;
    }

    Das Seltsame ist, dass die Items angezeigt werden, wo in meinem Account eingetragen sind. Wenn ich mir aber per GiveItem ein neues Item gebe, wird es nicht beachtet, und nach dem Verlassen des Servers nicht gespeichert.
    Trage ich das Item aber Manuell ein (z.B. beim Spawn Inventar[playerid][Inv][3] = 4;) dann wird das ganze gespeichert.


    Edit: Habe nun noch bissl Rumgebastelt, mit Debugnachrichten usw...
    Das Problem lag daran dass es Das Item immer in den Slot 0 legen wollte, obwohl der garnicht existiert.
    Hab das nun so:

    GiveItem(playerid,itemid,menge)
    {
    new i;
    // erst überprüfen ob das Item schon irgendwo im Inventar liegt
    for( i = 0; i < ITEMSLOTS; i++)
    {
    if( itemid == Inventar[playerid][Inv][i] )
    {
    Inventar[playerid][Menge][i] += menge;
    return 1;
    }
    }
    // noch nicht in inventar,also neuen slot suchen
    for( i = 0; i < ITEMSLOTS; i++)
    {
    if(Inventar[playerid][Inv][i] == INVENTAR_EMPTY_SLOT && i != 0)
    {
    Inventar[playerid][Inv][i] = itemid;
    Inventar[playerid][Menge][i] = menge;
    return 1;
    }
    }
    return 0;
    }


    Etwas umständlich, aber es funktioniert.


    Danke fürdie Hilfe Goldkiller.

    Einmal editiert, zuletzt von Intrepidus ()