Rollin'Stones - es funktioniert zwar, ABER...

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Rollin'Stones - es funktioniert zwar, ABER...

      ...etwas hab' ich noch nicht gerafft.

      Um zu prüfen, ob mein Steinauswurf an der Basis auch alles Geröll aus dem Inventar entfernt hat,
      hab' ich mir diese kleine Funktion gebastelt:

      C#-Quellcode

      1. float GetStones ()
      2. { // ermittelt die Menge der eingelagerten Steine
      3. float STONES = 0; // Default Rückgabewert
      4. var INVENTORY = new List <IMyTerminalBlock> ();
      5. GridTerminalSystem.GetBlocksOfType <IMyInventoryOwner> (INVENTORY);
      6. for (int Z = 0; Z < INVENTORY.Count; Z++)
      7. {
      8. for (int Y = 0; Y < (
      9. (
      10. INVENTORY [Z].GetInventory (0)
      11. ).GetItems ()
      12. ).Count; Y++)
      13. {
      14. if (
      15. (
      16. (
      17. INVENTORY [Z].GetInventory (0)
      18. ).GetItems () [Y]
      19. ).Content.TypeId.ToString ().Split ('_') [1] == "Ore"
      20. )
      21. {
      22. if (
      23. (
      24. (
      25. INVENTORY [Z].GetInventory (0)
      26. ).GetItems () [Y]
      27. ).Content.SubtypeName == "Stone"
      28. )
      29. {
      30. STONES += (float)
      31. (
      32. (
      33. INVENTORY [Z].GetInventory (0)
      34. ).GetItems () [Y]
      35. ).Amount;
      36. }
      37. }
      38. }
      39. }
      40. return STONES;
      41. }
      Alles anzeigen

      Funktioniert auch so, aber ich dachte eigentlich,
      dass das Casten von (IMyInventoryOwner) bei der IMyTerminalBlock-Schnittstelle (?)
      inzwischen nicht mehr notwendig wäre - oder etwa doch?

      Zuvor wollte ich die Abfrage in Zeile 8 mit "GridTerminalSystem.GetBlocks ()..." erledigen,
      was zwar problemlos kompiliert - aber einen Fehler beim ausführen geliefert hat.

      Soviel ich noch in Erinnerung habe, ist er bei den Timerblöcken hängengeblieben...
      Okay, diese haben natürlich kein Inventar,
      aber warum wird dann bei der Abfrage mit "...GetItems () [Y]).Amount;"
      nicht einfach 0 zurückgegeben, wie bei den anderen Blöcken ohne Inventar auch?

      *irritiert bin* :S

      Wahrscheinlich ist meine Frage selten dämlich und ich seh' den Wald vor lauter Bäumen nich' ...
      Kann mich da jemand aus meinen Irrungen befreien?

      space-engineers.de/attachment/…0b866643ed187216976da0da5
    • C#-Quellcode

      1. float GetStones()
      2. { // ermittelt die Menge der eingelagerten Steine
      3. float STONES = 0; // Default Rückgabewert
      4. var INVENTORY = new List<IMyTerminalBlock>();
      5. GridTerminalSystem.GetBlocksOfType<IMyInventoryOwner>(INVENTORY);
      6. for (int Z = 0; Z < INVENTORY.Count; Z++)
      7. {
      8. for (int Y = 0; Y < ((INVENTORY[Z].GetInventory(0)).GetItems()).Count; Y++)
      9. {
      10. if (INVENTORY[Z].GetInventory(0).GetItems()[Y].Content.TypeId.ToString().Contains("Ore") && INVENTORY[Z].GetInventory(0).GetItems()[Y].Content.SubtypeName == "Stone")
      11. {
      12. STONES += (float)((INVENTORY[Z].GetInventory(0)).GetItems()[Y]).Amount;
      13. }
      14. }
      15. }
      16. return STONES;
      17. }
      Alles anzeigen
      So kann man den Quellcode auch lesen (und ich hab das split mit einem contains verschönert :P). :D Bitte versuch den anständig zu formatieren, wenn du Hilfe brauchst. :)

      Folgendes: Du rufst (bei mir) in Zeile 8 GetInventory(0) auf. Im Falle eines Blocks, der kein Inventar hat, liefert das entweder null oder wirft schon eine Exception. Im ersten Fall würdest du versuchen auf einem null-Element etwas aufzurufen, was natürlich nicht geht, daher bekommst du eine Exception.
      Grundsätzlich solltest du wissen, dass es 1. die Methode HasInventory() gibt und 2. es mehrere Inventare geben kann, weshalb ich empfehlen würde auch durch alle Inventare zu gehen und nicht nur das auf dem Index 0 abzufragen. Mag sein, dass es für diesen Fall tatsächlich reicht, aber wenn etwas von Keen oder einem Modder geändert wird, musst du dann nicht erst den Fehler finden, um nachzubessern. :D
    • Bitte versuch den anständig zu formatieren, wenn du Hilfe brauchst.
      Sorry für ^^ untereinander angeordnete Klammern waren für mich so leichter zuzuordnen,
      aber stimmt schon, eigentlich ist's 'ne Spielerei... also erstmal Danke für die Antwort.

      Fangen wir von hinten an:

      ...und 2. es mehrere Inventare geben kann, weshalb ich empfehlen würde auch durch alle Inventare zu gehen und nicht nur das auf dem Index 0 abzufragen. Mag sein, dass es für diesen Fall tatsächlich reicht, aber wenn etwas von Keen oder einem Modder geändert wird, musst du dann nicht erst den Fehler finden, um nachzubessern.
      Himmel, nochmals Danke für den Hinweis! (das wär' wieder ein gesuche geworden...) :thumbup:
      Bisher ging ich davon aus, dass nur der Index 0 verwendet wird.
      Nehme an, dazu ist dann auch GetInventoryCount da...

      Grundsätzlich solltest du wissen, dass es 1. die Methode HasInventory() gibt ...
      Joah, auch mit dieser Methode hatte ich vorher experimentiert.
      Das gleiche Phänomen - so lange ich nicht IMyInventoryOwner in Zeile 8 verwende,
      gibt das 'ne Fehlermeldung.
      (obwohl HasInventory() über die IMyTerminalBlock-Schnittstelle doch auch so funktionieren sollte... (?)

      (und ich hab das split mit einem contains verschönert :P)
      Dieses arme, böse split - wird immer so diskriminierend behandelt...
      Sieht doch sooo hübsch aus :D

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von JumpinJack ()

    • JumpinJack schrieb:

      Joah, auch mit dieser Methode hatte ich vorher experimentiert.
      Das gleiche Phänomen - so lange ich nicht IMyInventoryOwner in Zeile 8 verwende,
      gibt das 'ne Fehlermeldung.
      (obwohl HasInventory() über die IMyTerminalBlock-Schnittstelle doch auch so funktionieren sollte... (?)
      Ja, hab ich mal so angenommen, dass das bei allen Blöcken geht... Vielleicht hattest du das versehentlich in der falschen Reihenfolge geprüft? Also zuerst was anderes, was fehlschlägt und dann HasInventory()... Keine Ahnung, eigentlich sollte das funktionieren.

      JumpinJack schrieb:

      Dieses arme, böse split - wird immer so diskriminierend behandelt...
      Sieht doch sooo hübsch aus
      Hmm... Naja, ist aber auch weniger Fehleranfällig. :P Wenn der Unterstrich mal nicht in der TypeId wäre, dann hättest du da eine Exception. :P Also ist es universeller und besser zu lesen. :D
    • Vielleicht hattest du das versehentlich in der falschen Reihenfolge geprüft? Also zuerst was anderes, was fehlschlägt und dann HasInventory()...
      Lass mich kurz überlegen... die HasInventory()-Anweisung müsste am Anfang der ersten for-Schleife
      gewesen sein, d.h. davor ist nur noch das INVENTORY.Count, was wiederum hätte funktionieren müssen...

      Vielleicht lag es auch einfach nur am generischen GridTerminalSystem.GetBlocks()...



      Hmm... Naja, ist aber auch weniger Fehleranfällig. Wenn der Unterstrich mal nicht in der TypeId wäre, dann hättest du da eine Exception. Also ist es universeller und besser zu lesen.
      Boah, soweit hab' ich natürlich nicht gedacht. (böses split... :evil: ) :saint: