SE C# Blöcke zählen Script

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

    • SE C# Blöcke zählen Script

      Hallo zusammen,

      ich versuche das Scripte schreiben in C# zu lernen. Ich habe etwas Excel vba Vorerfahrung also kann es sein, dass ich einige C# Begriffe falsch verwende. Jedenfalls ist das erste Script, welches Terminal Blöcke zählt und das Ergebnis auf einem LCD postet geschafft.

      Nun bin ich leider etwas stecken geblieben und komme nicht weiter. Ich möchte nicht nur die Terminal Blöcke zählen, sondern alle für den Bau des Grids verwendeten Blöcke/Cubes, also inklusive Armor, Tubes etc. Ich habe dazu eine Liste deklariert über IMyCubeBlock, aber die Methode GetBlocksOfType lässt sich nicht anwenden darauf. 8|

      Kann mir jemand sagen wie ich auf "nicht Terminal Blöcke" zugreifen kann bzw. wie ich das gesamte Grid auszählen kann?

      Gruß
    • Du nimmst das Feld "CubeGrid" von nem CubeBlock (z.B. GridTerminalSystem.Blocks[0]) und trägst alle Blöcke mit CubeGrid.GetCubeBlock() im Bereich von CubeGrid.Min bis CubeGrid.Max in einen HashSet ein (keine List, damit du keine doppelten Einträge hast). Am Ende lässt du dir einfach den Count vom HashSet zurückgeben. Keine Ahnung ob das wirklich funktioniert, aber ich denke das wäre eine Möglichkeit, da ich kein Feld kenne, das alle Blöcke hat.
      Wobei du die Vector3I vermutlich eher von einem String parsen musst, da Vector3I.X,Y,Z meines Wissens nach (vielleicht wurde es inzwischen behoben) alle Vector3I.X zurückgeben.
    • Kein Ding. :D Frag ruhig nochmal nach, wenn du irgendwo nicht weiterkommst. ;)

      Nochmal kurz in Worten ohne die technischen Details ausgedrückt: Du schaust wie groß das Schiff ist und packst dann alle Blöcke, die du für die jeweiligen Koordinaten findest, in eine Liste, die keine doppelten Werte zulässt und fragst dann ab wie viele Elemente die Liste enthält.
    • Mit dem Code bin ich noch nicht viel weiter gekommen, da mir Basics fehlen. Es ist aber wie ein Puzzle und ich werde das noch knacken ;). Ich habe ich mich erstmal bei einem C++ Aufbaukurs eingetragen, um die Grundsyntax besser verstehen zu lernen. Ich nehme das Angebot trotzdem gerne an und Frage dich. :)

      Allerdings ist das ein anderes Threatthema. ;)

      BG

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von ameaeth ()

    • Hey Spce,

      ich habe meine Liste Terminal Blocks. Jetzt will ich zählen, wie viele von jeder Sorte in dieser Liste enthalten sind. Dazu will ich jeden Interface Namen (z.B. IMyInteriorLight) aus der IMyTerminalBlock Klasse mit der Liste abgleichen. Ich habe mir gedacht dazu ein zweidimensionales Array [x][y] zu verwenden, falls es geht*, das auf [x] die Interface Namen als string und auf [y] dazu die Stückzahl als integer gespeichert werden.
      Als erstes muss ich jedoch die Liste der Interface Namen in den Code bekommen. Alle möglichen per Hand einzutragen möchte ich vermeiden, wenn möglich. Kann ich alle [x] irgendwie aus IMyTerminalBlock oder IMyFunctionalBlock entnehmen?

      BG

      *Vllt. mit auto array[x]{y] oder so? Falls nicht, nehme ich jeweils separat ein string und ein int array.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von ameaeth ()

    • Ich persönlich würde ein Dictionary anstatt eines Arrays nehmen, da das besser zu handhaben ist (Key: Sandbox.Common.ObjectBuilders.Definitions.SerializableDefinitionId, Value: int). Dann gehst du vor wie folgt: Du überprüfst für die CubeBlocks einfach, ob ihre IMyCubeBlock.BlockDefinition im Dictionary enthalten ist. Im Dictionary hinterlegst du alle SerializableDefinitionIds der Blöcke aus deiner Liste und hast jeweils einen Zähler. Sollte die Id vorhanden sein, erhöhst du den Zähler, wenn nicht, musst du die Id dem Dictionary hinzufügen. Wenn du etwas ausgeben willst, kannst du sogar auf den SubtypeName der Id zugreifen, was vielleicht auch nicht verkehrt ist.