Inventar System

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
  • Guten Morgen liebe Community,


    ja ich bin es mal wieder mit einem System welches aus Langeweile entstanden ist.
    Einige haben sich gefragt...wie macht man sowas...das geht doch gar nicht...
    Hier mal ein ganz simples Inventar System:


    [tabmenu]


    [tab='Allgemeine Informationen','http://forum.sa-mp.de/wcf/icon/infoM.png']
    [subtab='Funktionen','http://forum.gamerzhost.de/wcf/icon/codeS.png']
    (Im Sub-Tab Beispiele, ist zu allen Funktionen ein Beispiel gemacht !)
    Es gibt folgende Funktionen:


    GivePlayerItem(playerid, item[]); //Gibt dem Spieler in Item
    ResetPlayerItems(playerid); //Resettet alle Items von einem Spieler
    DeletePlayerItem(playerid, item[]); //Löscht ein bestimmtes Item aus dem Inventar
    GetItem(playerid,slot,name[],len); //Hier wird das Item in diesem Slot wiedergegeben
    [subtab='Beispiele','http://www.damen-eishockey.de/images/lampe.gif']
    //Hier nun einige Beispiele
    GivePlayerItem(playerid, "Butter"); //Der Spieler trägt nun Butter mit sich (wird in den Slot 0 getan)


    DeletePlayerItem(playerid, "Butter"); //Hier hätte man jetzt die Butter entfernt


    //Angenommen wir hätten Butter nicht entfernt, sähe das so aus mit dem ausgeben:
    new items[1];
    GetItem(playerid,0,items[0],6); // Die 6 = Länge von dem Wort "Butter" = 6 Buchstaben
    printf("Dieses Item trägt der Spieler mit sich: %s",items[0]);
    [subtab='Zusätzliche Sachen','http://www.rezepte-guru.de/template/images/icon_stern.gif']
    Es gibt insgesamt vordefiniert 10 Slots, dies kann man verändern und zwar so:


    #define MAX_SLOTS 15 //Jetzt hätte man 15 Slots frei
    #include <Inventar>
    [subtab='Download','http://www.projekt-deutsch.de/templates/cback/images/download.gif']
    Source-Code: Pastebin
    Direkter Download: Mediafire
    [/tabmenu]


    PS: Wenn der Slot MAX_SLOTS erreicht wird, werden einfach keine Items mehr hinzugefügt !


    Wünsche euch viel Spaß beim testen :)


    mfg. :thumbup:


    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

    6 Mal editiert, zuletzt von Kaliber ()

  • Kannst Du mir mal erklären was das machen soll, ich begreifs echt nicht. Warum ein retvalue, wenn er nicht benutzt werden kann - Unabhängig davon, ob das Item erfolgreich oder nicht erfolgreich erstellt worden ist returnst Du denselben Wert?



    stock GivePlayerItem(playerid, item[]) {
    new slot = GetFreeSlot(playerid);
    if(slot == -1) return 0xF;
    format(Item[playerid][slot],32,item);
    return 0xF;
    }


    Item wird erfolgreich erstellt -> retvalue 0xF
    Item wird nicht erfolgreich erstellt, da GetFreeSlot -1 returnt -> retvalue 0xF


    Ich würde eigentlich gerne wissen, wie GivePlayerItem abgelaufen ist, ohne gleich GetItem benutzen zu müssen. Würd mich über ne Erklärung freuen. Besser was 100% korrektes zu releasen als was halbfertiges, bei Unklarheiten PN ;)


    Gruss

  • Danke für eure Feedbacks, freut mich, dass es euch gefällt :)


    annst Du mir mal erklären was das machen soll, ich begreifs echt nicht. Warum ein retvalue, wenn er nicht benutzt werden kann - Unabhängig davon, ob das Item erfolgreich oder nicht erfolgreich erstellt worden ist returnst Du denselben Wert?


    Der Wert, der returnt wird ist in diesem Fall irrelevant, es muss nur etwas returnt werden !
    Denn wenn slot == -1 ist, muss der Code beendet werden und da ich an dieser Stelle returne muss ich auch am Ende returnen, ich könnte auch mit if und else arbeiten, aber ich fand mit return gehts auch :D


    Ich würde eigentlich gerne wissen, wie GivePlayerItem abgelaufen ist, ohne gleich GetItem benutzen zu müssen.


    ? Schau mal in den Beispiel Tab ^^


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Kaliber dann schreib doch:



    if(foobar == -1) return;


    Oder was schöner ist, hau das ganze in ne if Abfrage (im Code returnen ist nicht so schön). Also zB so:



    GivePlayerItem(playerid, item[])
    {
    new slot = GetFreeSlot(playerid)
    if(slot != INVALID_SLOT)
    {
    format(Item[playerid][slot],32,item);
    }
    }


    INVALID_SLOT kannste als globale Konstante definieren, denn man kann raten, was -1 bedeutet, eine Stringbezeichnung ist da schon viel eindeutiger


  • Ja, das könnte ich tun, macht das aber jetzt so den Unterschied :huh:


    mfg. ^^

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Kaliber
    Schlussendlich ist alles möglich. Ich sprech aber aus eigener Erfahrung. Irgendwann haste ein C Projekt mit 15'000 Zeilen und merkst, dass dies und jenes nicht stimmt, veränderst returnvalues und schlussendlich haste ein Stück Scheisse und kannst Teile neu schreiben. Sprich Du erleichterst dir das Leben, wenn Du dir einen einheitlichen Stil angewöhnst. Auch anderen Entwicklern kannste so das Leben leichter machen (namentlich in Open-Source Projekten)


    Ich würde es zB so machen. Grund für das Grosschreiben der globalen Werte ist, dass sie globale Werte darstellen. Ich verwende bewusst kein #define, da dieses nur begrenzt typensicher ist:



    // Global
    new INVALID_SLOT = -1;
    new VALID_SLOT_ACTION = 1;


    GivePlayerItem(playerid, item[])
    {
    new slot = GetFreeSlot(playerid)
    if(slot != INVALID_SLOT)
    {
    format(Item[playerid][slot],32,item);
    return VALID_SLOT_ACTION; // Oder alternativ die slotid
    }
    return INVALID_SLOT;
    }


    Gruss

  • Sorry das ich mich grade Dumm anstelle aber versteh ich grade nicht also das ist ein Inventar System wo halt Sachen gespeichert sind aber wie speicher ich etwas wird es automatisch oder wie ähhh?. SORRY!



    Mit freundlichen Grüßen

  • Sorry das ich mich grade Dumm anstelle aber versteh ich grade nicht also das ist ein Inventar System wo halt Sachen gespeichert sind aber wie speicher ich etwas wird es automatisch oder wie ähhh?. SORRY!



    Mit freundlichen Grüßen


    Nein, die Sachen werden nicht automatisch gespeichert, aber du kannst das ganz simpel speichern...


    Halt mit deinem Speicherungssystem und GetItem(playerid, slot); Das sähe dann so aus (Beispiel mit dini):


    dini_Set(Spielerdatei,"Item1",GetItem(playerid,0));
    dini_Set(Spielerdatei,"Item2",GetItem(playerid,1));
    //usw bis MAX_SLOTS erreicht ist


    Coole Sache,würdest du mir sowas als Kofferraumsystem machen gg Taschengeld?


    Was genau meinst du...erkläre das mal genauer ;)



    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Achso verstehe danke!

  • Warum machst du bitte nichts ordentlich?


    Dass du static verstanden hast, find ich sogar gut :D
    Nur was mich irgendwie ankotzt ist, das du Systeme schreibst sie päsentierst, aber nicht drüber nachdenkst, sie sinnvoll zu gestalten.


    Beispiel:
    stock GetItem(playerid,slot) {
    if(slot > MAX_SLOTS) return ERROR;
    return Item[playerid][slot];
    }
    Das wird erfolgreich sein immer, egal was kommt, ob ich jetzt über dem "Limit" liege oder nicht.
    Was nützt es, wenn der Rückgabewert "Fehler" ist?
    Weißt du warum kalcor die Funktion GetPlayerName so gestaltet hat wie er es getan hat?


    Nicht weil er keinen anderen Lösungsweg wusste oder weil PAWN da einwenig rummeckert.
    Sondern, weil man damit wunderbar auch prüfen kann, ob der Spieler auch online ist.


    sprich if(GetPlayerName(playerid,name,MAX_PLAYER_NAME)) // wenn online - was dann?


    Das auf dein "Sytsem" zu übertragen wäre überhaupt nicht das Problem.
    Du gibst dann nicht "Fehler" zurück, sondern 0.


    Funktionsheader würde dann so aussehen
    stock GetItem(playerid,slot, name[],len)
    Es ist viel einfacher zu handhaben, als das
    if(!strcmp(GetItem(playerid,25),"Fehler"))


    Man kann es direkt weiterverarbeiten ohne unnötiges Format.
    Auch eins der Gründe warum der Spielername stock - kompletter Müll ist :P


    Dazu ist deine Deklaration, absoulut belustigend :D
    static ...,ERROR[32]="FEHLER",INVALID_SLOT=-1;
    Warum es dem Compiler in Mund schütten, wenn man auch den RAM belasten kann? :rolleyes:


    Item[playerid][s] = "";
    Ein ganz schlimmer Fehler, der dir das "beigebracht" hat - gehört verprügelt.
    Du sorgst hier nur für memory leaks.


    Nutze gleich format oder strdel, dafür sind diese da :thumbup:


    Auch wenn ich mich wiederhole, denk bitte nächstesmal einfach deine Systeme durch,
    nicht das man beim anschauen schon Kopfschmerzen bekommt ;(

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Wieso wird der Dialog nicht angezeigt?


    new string[256];
    format(string,sizeof(string),"%s\n%s\n%s\n%s\n%s",GetItem(playerid,1),GetItem(playerid,2),GetItem(playerid,3),GetItem(playerid,4),GetItem(playerid,5));
    ShowPlayerDialog(playerid,DialogInventar,DIALOG_STYLE_LIST,"Dein Inventar",string,"Ok","Abbrechen");


    - Tomsen

  • Unglaubliche 32 Zeilen Effektivcode und trotzdem noch so viel Mist. Das grenzt schon an die Möglichkeit des Unmöglichen. Und für sowas erhält man noch positive Bewertungen? Die Leute haben sich den Code wahrscheinlich nichtmal angeschaut. Ich meine... wenn du wenigstens noch eine tolle Speicherung oder sowas hättest... aber das ist total sinnlos.