Inventar Reihenfolge-Ordnungssystem Fehler

  • Ahoi zusammen!


    Es existiert ein Fehler den ich irgendwie nicht nachvollziehen kann.

    Es geht dabei um das Inventar System.


    Alle Gegenstände die ich aufsammeln kann, landen dort in ihrem entsprechenden Inventar-Array.


    Daher gibt es auch mehrere "ItemDataBase", (Structure) um dort einen besseren Überblick zu bekommen und das ganze viel individueller zu gestalten.

    Daher gibt es derzeit 3 Arten:

    - Sonstiges (Structure) = "InventoryMain" Array

    - Konsum (Structure) = "InventoryKonsum" Array

    - Einrichtungsgegenstand (Structure) = "InventoryEinrichtungsgegenstand" Array


    Jedes Array bzw. jedes Struct und bzw. jeder entsprechende Gegenstand der dazu gehört, hat eine Structure-Spezifische Variable die sich "Stapelbar" nennt.

    Stapelbar ist nichts anderes als ein Bool der überprüft und auch bestimmt, ob der Gegenstand im Inventar übereinander gestapelt wird.


    Dazu ein Screenshot von Beispielitems, damit das verständlicher ist:



    Auf dem Bild sieht man oben die Anzahl aller Gegenstände im Inventar = 13

    Das Gewicht (muss ich noch etwas besser anpassen)

    Die ganzen Gegenstände.

    Stapelbare Gegenstände werden daher mit einer Zahl vor dem Namen angezeigt.

    Im Falle von Stahlbarren, ist nur einer vorhanden, daher 1x Stahlbarren.

    Bei den Eisenbarren sind 4 vorhanden, daher die Zahl 4 davor.


    Alle anderen Gegenstände sind nicht stapelbar, also werden immer alleine dargestellt.

    Oberhalb des "Wegwerfen" Knopfs, erscheint dann entsprechend ein weiterer Knopf, womit man den Gegenstand benutzen kann.

    Bei dem Brustschutz und Langschwert, wäre es dann "Ausrüsten".

    Bei dem Brot "Konsumieren" und bei den Barren nichts, so wie man jetzt sieht.


    Brot = InventarKonsum-Array

    Langschwert + Rüstung + Barren + Schild = InventarMain-Array

    Einrichtungsgegenstand habe ich derzeit nicht dabei, weil der Fehler ja bereits bei Konsum schon existiert, daher ist es bei Einrichtungsgegenstand identisch.


    Das alles funktioniert perfekt und ohne Fehler.



    ----


    Jetzt zum Fehler!


    Jeder Gegenstand im Inventar hat eine Nummerierung, diese wird in MyCharacter als "InventoryButtonClicked" (Integer) ein/ausgelesen.

    Sprich, wenn ich den Gegenstand "Wegwerfen" oder "Benutzen" will, muss das Inventar wissen, welcher Gegenstand gemeint ist.

    Beispiel: Das Schild hat die Nummer 4, also weiss das Inventar das die Nummer 4 das Schild ist und kann dann auch entsprechend verwendet werden.


    Das bedeutet und das ist auch derzeit der Fehler:

    Nicht-Stapelbare Gegenstände sind folgende: (mit InventorybuttonClicked Integer Wert)

    Brot = 0

    Brot = 0

    Brot = 0

    Brustpanzer = 0

    Brustpanzer = 0

    Langschwert = 2

    Langschwert = 2

    Sonnenschild = 4

    Stahlbarren = 1

    Eisenbarren = 6



    Wie man unschwer erkennen kann, ist die Reihenfolge der Identifikation total für den Mülleimer.

    Wenn ich also Brot anklicke, kann es sein das der 1 zufälliges von den 3 Broten rauswirft (weil identisch weniger schlimm) oder aber der wirft eines von beiden Brustpanzern raus.

    Eben weil die alle die gleiche Ordnungszahl 0 haben.


    Wähle ich etwa das Sonnenschild aus (Nummer 4) rüste es aus oder werfe es weg, funktioniert das fehlerfrei. Weil die 4 nur einmal im Inventar existiert und das System auch weiss, "Aha die 4 ist das Schild, ok".



    Dieser Fehler hat sich irgendwie unbemerkt eingeschlichen und muss unbedingt korrigiert werden.


    Hier nun das Script wie das funktioniert, dieses habe ich von Anfang an und es funktioniert auch gut und richtig, nur nicht mehr jetzt.

    Aufgeteilt in 3 Bildern:



    Ich hoffe man kann das alles erkennen.


    Beim ersten Bild gibt es eine Sequence wovon 2 abgehen. Diese 2 gehen zu dem gleichen Script wie auf den Bildern, nur eben entsprechend für "Konsum" und "Einrichtungsgegenstand". Diese sind alle identisch mit diesem hier.


    Einziger unterschied ist das es bei den anderen nicht:

    MyCharacter - > ItemDataBaseStapelbarInventory -> Break ItemDataBaseStapelbar ist

    Sondern

    MyCharacter -> ItemDataBaseKonsumStapelbarInventory -> Break ItemDataBaseKonsumStapelbar

    Bei Einrichtungsgegenstände das gleiche.


    Es ist aber alles die gleiche Grundfunktion.

    Ich habe schon seeeehr viel ausprobiert und es liegt nicht an dieser Aufteilung und deren weiterführende Funktionen, sondern es gibt keinen Vergleich in der Haupt-Ordnungszahl im Inventar.

    Also die wissen auf gut Deutsch nicht, wie viele die anderen haben und ich weiss nicht wo ich das einfügen oder setzen soll, damit es eine einheitliche Nummerierung gibt.



    Es wird für jeden Gegenstand eine Art Schaltfläche mit Knopf erstellt die dann in die Inventar-Übersicht geladen wird und dort sieht es wie folgt aus.






    Ich wünsche mir, dass die ganzen Gegenstände im Inventar eine fortlaufende Nummerierung haben.

    Beginnend bei 1 und nicht 0.

    1

    2

    3

    4

    usw.


    Hoffe mir kann da wer helfen, ich möchte ungern alles über ein Struct laufen lassen, weil es einfach schon zu viel geworden ist.

    Daher muss ich das ganze aufteilen.

    Das was ich nicht verstehe ist, warum identische Gegenstände die NICHT Stapelbar sind, die gleiche Ordnungszahl haben... wenn dieser Fehler beseitigt wäre, würde alles nahezu fehlerfrei sein. Abgesehen davon das paralel die Gegenstände bei 0 anfangen.


    Brot (Konsum) = 0

    oder

    Rüstung (Sonstiges) = 0


    Also immer der erste Gegenstand aus der jeweiligen Kategorie will unbedingt die nummer 1 oder eher gesagt die 0 sein und das darf nicht sein.

  • Hoffe mir kann da wer helfen, ich möchte ungern alles über ein Struct laufen lassen

    Alles eine Frage der Planung.

    Ich hatte vor einiger Zeit mal einen einfachen Inventar-Prototypen gebaut.


    Das baute auf einem einzigen Master-Item Struct auf.

    Dort sind nur die Grundlegenden Werte hinterlegt, wie Name, Category, Icon usw.

    Aber auch ein zusätzliches DataTable(+ zugehörigem Struct) für die Item-Werte.

    Jedes Item hat eine eindeutige ID.


    Master Item Struct



    Im Master-Item-DataTable konnte ich dann jedem Item die passenden Werte geben.


    Master Item DataTable



    Die Werte für die jeweilige Category sind in einem separaten DataTable.


    Potion Stats Data



    Die Logik hat nur mit der ID gearbeitet.

    Wenn ein Item in der Spielwelt lag ist es nur eine ID und ein Mesh, im Inventar ist ein Item nur eine ID ein Icon und ein Integer mit der Anzahl. Geht man mit der Maus über ein Item wird ein extra UI eingeblendet das sich anhand der ID die nötigen Daten selbst holt. Auch die Actionbar hat nur mit der ID gearbeitet.


    Hoffe es hilft dir ein wenig bei Deinem Problem.

  • DarkFaces


    Leider nein ^^

    Aber ich verstehe schon was du damit sagen willst. Bei mir ist das System ganz anders. Mal schauen ob ich das irgendwie über die ID machen kann. Wobei zusammengezählt das Inventar als Integer und bei neuen Items +1 würde da immer eine fortlaufende Zahl ergeben. Teilweise macht es das System auch.


    Das in dem zweiten Screenshot von dir, hatte ich damals auch die Idee gehabt aber das ist nicht das was ich für mein Projekt brauche, da ich gerne alle Werte direkt im Spiel verändern möchte und somit alles Individualisieren kann.


    Eine ID wird automatisch vergeben, wenn ich den Gegenstand aufsammele. Ansonsten hat ja jedes Objekt in der Welt eine automatisch generierte, die kann man ja auch noch separat abrufen.




    Bei meinem Problem geht es mehr um die Anordnung im Inventar und nicht um die Strukturierung! (Structure)

  • Wieso gibst du dem Inventory Button nicht einfach ne ID, nicht die vom Data Table, sondern so dass jeder Inventar-Slot eine eigene Nummer hat, dein Inventar ist noch extrem einfach gehalten, aber stells dir mal so vor:


    Du hast ein Inventar mit 20 Slots, der Spieler kann die Items so verschieben wie er will, jeder Slot hat ne eigene ID, Slot 1 ist 1, Slot 20 ist 20, die ID ist gleichzeitig die gleich wie im Inventory-Array, somit drückst auf nen Button, hast sofort die richtige ID und kannst direkt das richtige Item droppen^^

  • Wieso gibst du dem Inventory Button nicht einfach ne ID, nicht die vom Data Table, sondern so dass jeder Inventar-Slot eine eigene Nummer hat, dein Inventar ist noch extrem einfach gehalten, aber stells dir mal so vor:


    Du hast ein Inventar mit 20 Slots, der Spieler kann die Items so verschieben wie er will, jeder Slot hat ne eigene ID, Slot 1 ist 1, Slot 20 ist 20, die ID ist gleichzeitig die gleich wie im Inventory-Array, somit drückst auf nen Button, hast sofort die richtige ID und kannst direkt das richtige Item droppen^^

    Und wie mache ich das?

  • Wenn ich also Brot anklicke, kann es sein das der 1 zufälliges von den 3 Broten rauswirft (weil identisch weniger schlimm) oder aber der wirft eines von beiden Brustpanzern raus.

    Eben weil die alle die gleiche Ordnungszahl 0 haben.

    Wenn die Ordnungszahlen gleich sind musst du eben noch auf ein zusätzlichen Kriterium prüfen, oder eben was eindeutiges benutzen.



    Wähle ich etwa das Sonnenschild aus (Nummer 4) rüste es aus oder werfe es weg, funktioniert das fehlerfrei. Weil die 4 nur einmal im Inventar existiert und das System auch weiss, "Aha die 4 ist das Schild, ok".

    Wenn es in einer anderen Kategorie auch ein Item mit der Ordnungszahl 4 existiert dann sollte doch das selbe verhalten wie oben auftreten?

  • Und wie mache ich das?

    Jedes mal wenn ein Item aufgehoben wird, wird es dem Inventory-Array hinzugefügt, da kannst dann den Index aus dem Add nehmen und im Create Widget fürn Button unter ID (oder Index) speichern.


    Wenn ein Item gedroppt wird, werden alle Sub Widgets (die mit dem Button) mit nem ForEachLoop, neu in die Wrapbox geladen, beim CreateWidget packst dann den Index des ForEachLoop in deine erstellte Variable rein (die gleiche wie oben beim Add).


    Um ne Variable direkt im Create Widget setzen zu können, musst in dem Widget die Variable anklicken und dann nen Haken bei "Instance Editable" und "Expose on Spawn" rein setzen^^

    Einmal editiert, zuletzt von Killerzwerg ()

  • DarkFaces


    Bei deinem System hat der Heiltrank z.B. die ID 1

    Der Heiltrank heilt 50 Punkte.


    Man hat 2 Heiltränke im Inventar, beide haben die gleiche ID 1, soweit so gut.


    Was passiert aber wenn man 2 Heiltränke mit ID 1 im Inventar hat und der eine Heilt 55 Punkte (weil verändert), der andere gewöhnlich 50 Punkte.


    Wenn du nun den 55 Punkte Heiltrank auswählen und trinken willst (als Beispiel), dann wird das System doch auch zufällig einen Heiltrank mit ID 1 benutzen oder nicht?

    Weil für das System hat "jeder" Heiltrank vom gleichen Typ die ID 1, egal ob die sich in den Werten unterscheiden.

    Es sei denn du fügst noch weitere Heiltränke hinzu, was aber letzendlich in einer Flut an Gegenstände endet.

  • Jedes mal wenn ein Item aufgehoben wird, wird es dem Inventory-Array hinzugefügt, da kannst dann den Index aus dem Add nehmen und im Create Widget fürn Button unter ID (oder Index) speichern.


    Wenn ein Item gedroppt wird, werden alle Sub Widgets (die mit dem Button) mit nem ForEachLoop, neu in die Wrapbox geladen, beim CreateWidget packst dann den Index des ForEachLoop in deine erstellte Variable rein (die gleiche wie oben beim Add).


    Um ne Variable direkt im Create Widget setzen zu können, musst in dem Widget die Variable anklicken und dann nen Haken bei "Instance Editable" und "Expose on Spawn" rein setzen^^


    So mache ich das ja auch.

    Jedes Item wird dem entsprechenden Inventar-Array hinzugefügt.

    Bei dem Widget meinst du die ID als Variable?


    Hast du da ein Screenshot von? Damit ich mir das bildlich besser vorstellen kann.


    Das blöde bei mir ist, dass die gleichnamigen Gegenstände die nicht stapelbar sind, den gleichen Integer (Index) Wert haben. Und ich weiss nicht wie ich das lösen kann.

    Denn andere Gegenstände die nicht gleich sind, sind auch fortlaufen nummeriert was auch absolut richtig ist.

  • Was passiert aber wenn man 2 Heiltränke mit ID 1 im Inventar hat und der eine Heilt 55 Punkte (weil verändert), der andere gewöhnlich 50 Punkte.

    Gute Frage, ein modifizierter Heiltrank ist ja ein Heiltrank + Modifikation.


    Die Frage ist wie weit du das Spiel treiben willst. Gibt es feste Modi-Stufen oder ist das völlig frei (zB 53 Punkte).

    Je mehr Möglichkeiten der Spieler hat um so komplexere Daten musst du im Inventar mitspeichern.


    Sind die Modifikationen in festen Stufen so das man sie in einem extra DataTable speichern kann, dann könnte man zur ID noch die Anzahl und Art der Modifikationen speichern.


    Kommt halt darauf an was du genau willst.

  • Hast du da ein Screenshot von? Damit ich mir das bildlich besser vorstellen kann.

    Keine Ahnung was da nicht verständlich ist...



    Ist aus meinem Survival, in meinem neuen Projekt ists bisschen komplizierter, das zeig ich besser nicht, das verwirrt nur noch mehr, hehe


    Das blöde bei mir ist, dass die gleichnamigen Gegenstände die nicht stapelbar sind, den gleichen Integer (Index) Wert haben. Und ich weiss nicht wie ich das lösen kann.

    Ich glaub wir reden aneinander vorbei...

    Wenn Items nicht stapelbar sind, hat jedes Item nen eigenen Slot und somit im Inventory-Array auch nen eigenen Index^^


    Slot 1 = Index 0, Slot 2 = Index 1, usw.


    Was passiert aber wenn man 2 Heiltränke mit ID 1 im Inventar hat und der eine Heilt 55 Punkte (weil verändert), der andere gewöhnlich 50 Punkte.

    Dann hat man ganz einfach je einen Slot für die 2 verschiedenen Heiltränke...

    2 Mal editiert, zuletzt von Killerzwerg ()

  • Beim Widget erstellen wie macht man da einen Integer rein?

    Also das "InventorySlot"


    Das könnte sogar das Problem sein, dass die Widgets bei mir keine Reihenfolge (Ordnung haben), da könnte der Integer helfen.


    Was ich nicht verstehe ist, was der Unterschied zwischen Slot und Index sein soll, ist das nicht das gleiche?

  • Beim Widget erstellen wie macht man da einen Integer rein?

    Also das "InventorySlot"

    Siehe oben^^



    Was ich nicht verstehe ist, was der Unterschied zwischen Slot und Index sein soll, ist das nicht das gleiche?

    Ein Slot ist ein leerer Inventar-Platz, in dem du ein Item platzieren kannst.


    Der Index ist einfach nur die Nummer an welcher Stelle etwas in einem Array steht, in nem Inventory-Array ist z.B. die 0 das erste Item, die 1 das zweite, die 2 das dritte, usw., Last Index ist das letzte Item im Array (wie der Name ja schon sagt).


    Du kannst das nennen wie du willst, nur weil ich das so nenne, muss es nicht jeder so nennen, im Endeffekt ist es in diesem Zusammenhang genau das gleiche wie der Index, du hast keine Slots welche leer sein können, bei dir sind sie alle gefüllt, somit passt bei dir auch der Index als Name, von mir aus kannst du es auch "Nummerierung" nennen, solang du weißt, was es bedeutet ist alles gut^^

  • Es funktioniert schon fast perfekt.

    Nur gibt es jetzt das Problem das die Unterschiedlichen Inventar-Gegenstände jeweils bei 0 beginnen, entsprechend in ihrer Kategorie. :(


    Sammele ich 2x Brot auf =

    Brot Index 0

    Brot Index 1


    Sammele ich zusätzlich 2x Langschwert auf =

    Langschwert Index 0

    Langschwert Index 1


    Zusammen im Inventar wie folgt:

    Brot Index 0

    Brot Index 1

    Langschwert Index 0

    Langschwert Index 1



    Wähle ich nun das Langschwert (mit Index 0 aus), dann wirf der "Brot Index 0" aus und nicht Langschwert.

    Fehler ist, weil alles bei Index 0 beginnt.

    Auch wenn ich jeweils die "Length" aller Inventare für den Index addiere, bleibt das Problem bestehen.

    Es ist also egal ob Langschwert Index 0 oder 1000 hat. (So als Beispiel, wenn ich einfach einen höheren Basis-Wert angebe).



    Jetzt haben alle Gegenstände einen fortlaufenden Index.

    Gegenstand 1 = 0

    Gegenstand 2 = 1

    Gegenstand 3 = 2

    usw.


    Aber jeweils nur für das Inventar.


    Sprich Konsumgüter fangen bei 0 an

    Einrichtungsgegenstände fangen auch bei 0 an.

    Genau so wie Waffen/Rüstungegen ebenso bei 0 beginnend.


    Wie mache ich das am sinnvollsten, damit die Reihenfolge nicht durcheinander kommt?


    Wenn ich jeweils den Inhalt der anderen Inventare (etwa durch Length) einbinde, dann wird die weiterführende Zahl entsprechend immer höher. Also nicht normal höher, sondern immer (A+B+C = ) und (= +A+B+C =) usw.

  • Hast du verschiedene Inventar Arrays die in ein einzelnes Inventar Widget geladen werden?

    Wenn ja, dann mach ein einziges Inventar Array, wo alle Items egal welcher Kategorie drin sind^^


    Mit nem Enum kannst trotzdem noch die einzelnen Kategorien unterscheiden^^

  • Ja sind 3 Inventar Arrays und die werden in ein Widget geladen. Oder viel mehr die InventarButtons (Schaltflächen in der InventorySchrollBox).

    Den Gedanken hatte ich auch das ich alles in ein einzelnes Inventar Array Packe, aber das ging bisher nicht weil die zu unterschiedlich waren.


    Ich konnte die unterschiedlichen Gegenstände aus dem gleichen Inventar nicht ansprechen (da unterschiedliche Structs)

  • Dann mach ein Main_Struct mit mehreren Sub_Structs.

    Im Main_Struct kommt das Zeug rein was die Items identifiziert, wie z.B. ItemID und in die Sub_Structs kommt alles Item relevante rein, wie z.B. die Werte^^


    Ich mach es grad genau so, jedoch ohne ItemID, weil alle Items außer den Resourcen, komplett unterschiedliche Werte haben können.




    Nicht wundern, wieso bei mir alles englisch ist, aber ich denke schon bisschen weiter, falls ich irgendwann das Spiel mit einem internationalen Team weiter entwickle, sollte alles englisch sein, weil evtl. einige kein deutsch können.

    Oder wenn ich saumäßiges Glück hab, kauft ne größere Firma das Spiel ab und die werden bestimmt auch kein deutsch können, bevor ich es also nachträglich alles übersetzen muss, mach ichs direkt...

    Was ich dir auch empfehlen würde, selbst wenn du es nur als Übungsprojekt machst, lernst immerhin auch gleich englisch mit, selbst wenn du immer in dict.cc rein gucken musst (tu ich immer noch).

    So, jetzt kennst einen Trick von nem Autodidakt, hehe^^

    2 Mal editiert, zuletzt von Killerzwerg ()

  • Kostet das nicht unnötig Leistung wenn alle Gegenstände über ein Struct laufen und alles komplett abgefragt werden muss?

    Wieso sollte es? Ich ruf das ja nicht jeden Tick neu ab...

    Ich hab auch nie gesagt, dass alle Items über ein Struct laufen, bei mir hat jedes Item sein eigenes Struct im Array, ich wüsste nicht mal wie ich unendlich viele verschiedene Items in ein einziges Struct rein machen sollte, hehe


    Das mit dem englisch ist blöd, weil es einige Begriffe gibt die mehrdeutig sind und das verwirrt sehr.

    Ich sag nicht, dass du es genau so machen musst, ich sag nur dass es klüger wäre, was du am Ende machst ist dir überlassen, dfie Mehrarbeit dann aber auch^^

    Es gibt einige Grundlegende Namen die das richtige bedeuten, sofern man ein bisschen englisch kann, sollte man das auch wissen, sollte man im deutschen schon die falschen Wörter benutzen, hat man natürlich im englischen auch keine Ahnung mehr was man benutzen soll, eine Ordnungszahl wäre z.b. laut google eine "Atomic Number", keine Ahnung wie man auf die Idee kommt, das so zu nennen, wenn es schon überall nen "Index" gibt (ist auch ein deutsches Wort)...


    Es gibt genügend Beispiele, die du einfach abschreiben könntest, statt erstmal ein eigenes Wort dafür zu "erfinden" ^^


    Außerdem müsste dann einer der dir helfen will (ja, das will ich, auch wenns nicht immer so rüber kommt), nicht immer erst Rätselraten spielen, bis er endlich kapiert hat, was jetzt was ist, hehe

    4 Mal editiert, zuletzt von Killerzwerg ()

  • Das schlimmste was man machen kann, ist Ä-Ö-Ü zu verwenden... habe ich gemacht und dann waren alle Variablen davon ungültig und kaputt... ^^


    Mit den Begrifflichkeiten ist ja auch egal, ob das jetzt A oder B sich nennt... ist doch wurst :)




    Zum Thema.


    Habe nun versucht diese ScrollBox "InventoryBox" mit einer Schaltfläche zu belegen, damit eben nur die jeweilige Gegenstands-Kategorie angezeigt wird (natürlich auch im entsprechenden Inventar).


    Sprich:

    Ein Knopf für Allgemein (InventoryMain-Array)

    Ein Knopf für Konsum (InventoryKonsum-Array)

    Ein Knopf für Einrichtungsgegenstände (InventoryEinrichtungsgegenstand-Array)


    Es wird alles richtig gefiltert, trotzdem stimmt die Ornungszahl wieder nicht.


    Habe ich 1x Brot und 1x Langschwert im Inventar (beides hat leider Index 0), dann wähle ich Brot als Beispiel aus (nachdem gefilter wurde durch den Knopf Konsum) und es wird dann Langschwert ausgeworfen und nicht das Brot.


    Ich habe keine Ahnung wie ich das lösen soll. Zumindest zählt der Index bei jeder Kategorie richtig hoch.

    Habe ich 3x Langschwert im Inventar (nicht gestapelt)

    Langschwert (index 0)

    Langschwert (index 1)

    Langschwert (index 2)


    Wähle ich Langschwert (index 1) aus und werfe dieses raus (weil es z.B. minderwertiger ist, oder eine schlechte Haltbarkeit hat) wird auch das richtige Langschwert ausgeworfen.


    Also mit den "eigenen" Gegenständen in der Kategorie funktioniert es fehlerfrei, nur nicht mit anderen gemischt :(