Space Engineers

Space Engineers

45 ratings
StationManagmentSystem v1.3
By BelaOkuma
Kurze Beschreibung zu meinem Script.
   
Award
Favorite
Favorited
Unfavorite
Wo finde ich das Script
Das Script kannst Du hier abonnieren:

SMS 1.4
Script Modus
Nachdem das Script in den Programmierbaren Block geladen wurde läuft es ohne Timer.
Es gibt 3 Modies in denen das Script laufen kann.

Modus
Beschränkungen
Empfehlung
SHIP
Nur das Grid des Schiffes werden angezeigt
Geeignet für Schiffe
SHIP_PLUS
Grid des Schiffes und die an Dockingports angedockten Schiffe werden Angezeigt
Geeignet für Schiffe mit Dockmöglichkeiten (Trägerschiffe)
STATION
Alle Grids werden angezeigt
Geeignet für Stationen

Aktuell sucht sich das Script den optimalen Modus selbst.
// runningmodes: enum ScriptMode {AUTO,SHIP,SHIP_PLUS,STATION}; ScriptMode s_mode=ScriptMode.AUTO;
Man kann aber auch einen bestimmten Modus erzwingen:
ScriptMode s_mode=ScriptMode.SHIP;
ScriptMode s_mode=ScriptMode.SHIP_PLUS;
ScriptMode s_mode=ScriptMode.STATION;
Terminals

Terminals dienen zur Anzeige von verschiedenen Informationen die
durch die Schaltkonsole mit den vier Tasten über ein kontextsensitives Menu
beeinflusst werden können. Es können mehrere Terminals auf der Basis verteilt
werden, etwa bei den Landepads und/oder Maschinenraum, Lager etc.
So kann man leicht schnell benötigte Infos aufrufen.

Einrichtung:

Um das LCD als Terminal zu definieren den Namen
erweitern mit:

... (sms,terminal:A1)

A1 ist die ID des Terminals und sollte nicht doppelt vorkommen.
Sie besteht aus einem Buchstaben und einer Ziffer und wird
benötigt um die Zuordnung der Funktionstasten (Schaltkonsole)
zu den Terminals zu ermöglichen.

Um Doppelte IDs zu vermeiden am besten in das Suchfeld "sms,terminal" eingeben.
Nun werden alle Terminals die schon vorhanden sind angezeigt.

Einrichtung der Funktionstasten:

Die Tasten der Schaltkonsole so konfigurieren:
  • Taste 1 -> Programmierbarer Block wo SMS läuft -> Ausführen
    A1:1
  • Taste 2 -> Programmierbarer Block wo SMS läuft -> Ausführen
    A1:2
  • Taste 3 -> Programmierbarer Block wo SMS läuft -> Ausführen
    A1:3
  • Taste 4 -> Programmierbarer Block wo SMS läuft -> Ausführen
    A1:4

Nach einer bestimmten Zeit (Voreingestellt ist 120s) kehrt das Terminal zum Hauptmenu zurück.
Diese Zeit kann man für alle Terminals verändern im Script selbst:

... // time to return to the mainmenu (global) in sec. // 0 = never return const int KEEPMENU=120; ...

oder für jedes Terminal separat im Namen:
... (sms,terminal:A1,keepmenu:60)

Ein Wert von '0' lässt das Terminal nie zurückkehren.
Das gilt für beide Varianten.

Kopfzeile und Hauptmenutext können global für alle Terminals nun
auch angepasst werden, im Script selbst:

... // terminal headline const string tHeadLine="@maingridname,,Welcome to SMS v1.1h,,@time,/,@date"; // terminal mainpage const string tMainPage="\ninvman(sort,style 3)"; ...

LCDs
Damit SMS Infos auf dem Lcd anzeigen kann den Namen erweitern mit:

... (sms,infolcd)

Die sichtbare Zeilenanzahl wird dynamisch festgelegt und geändert.
Man kann aber auch mit "lines:x" eine feste Zeilenanzahl vorschreiben.

... (sms,infolcd,lines:15)

möchte man die Anzeige auf ein zweites und drittes Lcd erweitern
den Namen der Lcds darunter ergänzen mit:

... (sms,linklcd)

Die LCDs sollten direkt untereinander platziert werden.

Was angezeigt werden soll (Kommandos) schreibt man dann in CustomData

Displays
Alle Displays von den Vanilla Blöcken können angesteuert werden.

Bei den Blöcken mit nur einem Display ist die Einrichtung genau so wie bei den LCDs.
Also zum Beispiel der Flugsitz und der Kontrollsitz.


Bei Blöcken mit mehreren Displays muss die Einrichtung komplett in CustomData erfolgen.
Das Setup beginnt mit:
@display (sms,infolcd:x)
und endet mit:
@enddisplay

Alle Zeilen dazwischen sind dann die Kommandos.

"x" bezeichnet die Nummer des Displays. Es ist die gleiche wie in der Liste im "K"-Menu des Blockes, beginnt aber mit "0". Ansonsten kennt ihr die Syntax von den LCDs. Man kann hier auch die "lines:xx" Option benutzen.

Hier ein Beispiel für das zweite Display auf dem das Kommando "thrust" ausgeführt werden soll:

@display (sms,infolcd:1) thrust(style 1) @enddisplay

Um in einem InfoLcd alle Display die angesteuert werden anzuzeigen gibt es jetzt ein Command.

displays


Die Zahl sind die Instruktionen die benötigt wurde um das aktuelle Bild zu erzeugen.
Kommandos
Die Kommandos schreibt man in CustomData des LCDs.

Format:

Kommando [Filter] (Optionen)

Für Filter siehe Rubrik "Filter".

Die einzelnen Kommandos sind:

batterys
reactors
tanks
Hydrogen- und Oxygentanks
refinerys
oreprio
Zeigt die Prioritäten in der Erzverarbeitung an
resources
Zeigt Erze und Barren übersichtlicher an.
assemblers
airvents
jumpdrives
gasgenerators
Sauerstoffgeneratoren
cargocontainers
connectors
inventory
oxygen
hydrogen
solar
wind
cargo
invman
Informationen über Container die von SMS sortiert werden sollen
energy
energy_p
Anzeige nur Energieproduzenten
energy_r
Zeigt an wie lange die Energiereserven noch reichen, ähnlich "powertime" von MMaster
dockings
Informationen über angedockte Schiffe
speed
Zeigt die Geschwindigkeit des Schiffes an, wenn gewünscht auch in KmH und Mph. (style 1-4,kmh,mph)
mass
Zeigt die Masse des Schiffes an (style 1-4)
gravity
Zeigt die aktuelle Gravitation an (style 1-4)

Die Kommandos können mit Optionen beeinflusst werden.
Filter []
Um nur bestimmte Blöcke bzw. Items anzuzeigen kann ein Filter verwendet werden.
Der wird in eckigen Klammern direkt hinter das Kommando geschrieben.

batterys
zeigt alle Batterien an.

Mehrere Filter werden durch Komma getrennt.
mit führendem '-' werden sie ausgelassen.

Beispiele:
Alle Batterien, außer "Batterie 5a"
batterys[*,-5a]

Alle Lichtbogenöfen und die "Raffinerie 5"
refinerys[Licht,Raffinerie 5]

Alle Raffinerien die "Basis" im Namen haben
refinerys[Basis]

Es ist auch möglich Blöcke oder Items eines gedockten Schiffes anzeigen zu lassen:
batterys[dock:Alpha]

...oder...
inventory[dock:Alpha](all,block)
Optionen ()
Sind in runde Klammern zu setzen und es kann nur ein Klammerpaar geben. Mehrere Optionen sind mit Komma zu trennen.

Allgemein:

gridname
Gruppiert die angezeigten Elemente nach Grids

maingrid
Zeigt nur Elemente auf dem Grid des Programmierbaren Blocks an
auf dem das SMS Script läuft.

lcdgrid
Zeigt nur Elemente auf dem Grid des LCDs an.

noline
Blendet die Linien aus

notitle
Blendet die Title aus

noheadline
Blendet die Kopfzeile aus

nomessage
Blendet die Warnungen aus

noerror
Blendet die Fehleranzeige aus

sort
Sortiert aufsteigend nach Namen

sort back
Sortiert absteigend nach Namen

sort amount
Sortiert aufsteigend nach Menge
(Nur inventory und oreprio)

sort amountback
Sortiert absteigend nach Menge
(Nur inventory und oreprio)

sort mass
Sortiert aufsteigend nach Masse
(Nur inventory)

sort massback
Sortiert absteigend nach Masse
(Nur inventory)

sort volume
Sortiert aufsteigend nach Volumen
(Nur inventory)

sort volumeback
Sortiert absteigend nach Volumen
(Nur inventory)

style x
Verschiedene Anzeigeschablonen
x=1-4
Standart ist 2

col x
Anzahl der Spalten
x=1-4
Standart ist 1, bei Inventory 2

Für tanks:

hydrogen oxygen
Welche Art von Tanks soll angezeigt werden

"inventory"
Für inventory gibt es folgende Optionen:

ore ingot component h-bottle o-bottle tools weapons kits datapads cash ammo

Wenn Ihr die Items der DailyNeedsSurvivalMod anzeigen lassen wollt.

food

Dazu müßt Ihr die Mod am Anfang des Scriptes freigeschaltet haben.

Mit diesen legt man fest welche Items angezeigt werden sollen.

Oder man möchte alles anzeigen, dann gibt es die Option "all".

inventory(all)


Möchte man Items ausschliessen einfach ein '-' davor.
Zum Beispiel alles ausser Erze und Barren:
inventory(all,-ore,-ingot)

Mehrere Optionen sind auch möglich.
Wobei die Reihenfolge der Optionen entscheidend ist.

Zum Beispiel:
inventory(ore,ingot)
...oder...
inventory(ingot,ore)
Auch das würde gehen, auch wenn es keinen Sinn macht.
inventory(cash,cash,cash)

Wenn man die Gruppierung der einzelnen Items nicht möchte
gibt es die Option "block":
block

Ein Beispiel, mit und ohne "block" Option:

inventory(h-bottle,o-bottle)
inventory(h-bottle,o-bottle,block)

Man kann auch eine der neuen Macro-Optionen nehmen:

Alle Flaschen:
inventory(bottles)

Umfasst Tools, Flaschen, Datapads und Kits (Med- und Power-)
inventory(utils)

Eine andere Möglichkeit der Anzeige bieten die Optionen "fillbar" und "zero"

inventory(component,fillbar,zero)


So hat man den Bestand der Komponenten besser im Blick und kann schnell
nachproduzieren wenn etwas alle wird. Geht aber auch mit Erzen und Barren etc.

Wenn man wissen möchte welche Komponenten und wieviel gerade produziert wird
kann man das mit der "assembly"-Option anzeigen lassen. Vorraussetzung ist das auf dem selben Grid mein Script PIM läuft.

Über die "table"-Option kann man die Anzeige genauer beeinflussen.
Es werden dann nur Felder angezeigt die in den Optionen stehen.

Mögliche Felder sind:
  • name
  • fillbar
  • ratio
  • amount
  • max
  • volume
  • mass
  • assembly

Hier ein Beispiel für Komponenten:

"energy", "energy_p" und "energy_r"
Mit "energy" (alles) und "energy_p" (nur Erzeuger) lässt man Informationen über den Energiehaushalt anzeigen.

energy energy_p

Es gibt hier 4 Arten von Items:
Tag
Art
stored
Energie die gespeichert wurde
available
theoretisch maximal verfügbare Energie
output
Energieoutput der Erzeuger
consumption
Energieaufnahme der Verbraucher

Unterschied zwischen "available" und "output":

Ein Windrad kann "theoretisch" bis zu 400kW liefern. Ja nach Standort (höhe über NN sowie Abstand zu anderen Objekten) erzeugt es aber vielleicht nur 330kW (available), also 82,5%. Die Abgabe (output) ist dann die tatsächliche momentane Energieeinspeisung ins Netz (zb. 33kW von 330kW also 10%).
Anderes Beispiel mit Batterien, 10 große Batterien können bis zu 120MW Strom liefern. Wenn jedoch 2 davon aus sind ist "available" nur 96MW(80%). Was die Batterien dann letztendlich abgeben bzw. an "output" haben hängt von den Verbrauchern ab. Also wenn die Reaktoren immer aus sind ist das "available" von Reaktoren immer 0kW bzw. 0%.
Ich hoffe ich konnte das richtig erklären warum ich diese Einteilung gebildet habe.

Ohne Optionen werden immer alle 4 Sektionen angezeigt.
line(*) energy(sort)

Möchte man nur die Verbraucher haben...
energy(sort,consumption)

...oder Abgabe und gespeicherte Energie:
energy(sort,output,stored)

Man kann auch die neue "table"-Option nehmen, für eine bessere Übersicht:
energy(style 4,sort,output,stored,table)

Die "gridname" Option geht hier auch.
energy(style 3,sort,table,stored,available,output,gridname)




Mit dem "energy_p" Kommando werden nur Energieerzeuger angezeigt, zusätzlich
mit der Übersicht "Total". Und fest sortiert. Habe mich hier etwas am "power"/"powerV" Kommando von MMaster orientiert. Vielleicht findet der eine oder andere dies Übersicht besser.

energy_p(style 4)

Auch hier geht die Tabellenform:
energy_p(table)

Hinweis:
"style 3" und "style 4" mit allen Sektionen sind nur für Breite LCDs geeignet, sonst wird die Tabelle nicht richtig dargestellt.

Mit "energy_r" wir die Reichweite der gespeicherten Energie angezeigt, ähnlich dem "powertime" Befehl von MMaster.
Es gibt keine Optionen und es wird nur eine Zeile angezeigt.
energy_r

Man kann "energy" auch als Option für die Kommandos mit Physischen Blöcken benutzen.
Dabei werden alle Energieoptionen die die entsprechenden Blöcke haben ausgegeben.
jumpdrives(energy)

batterys(energy)

Es können aber auch mit den obigen "Art"-Optionen nur bestimmte angezeigt werden.
batterys(energy,consumption)

Zusätzlich oder auch alleine wird mit der "onoff"-Option angezeigt ob der Block an oder aus ist.
Mit Energy-Option:
jumpdrives(energy,onoff)

"onoff"-Option alleine:
refinerys(onoff)
"thrust", "trust_e" und "thrust_w"
Mit "thrust" wird der aktuelle Schub der einzelnen Triebwerkstypen angezeigt.

thrust


Dabei bezeichnet die Direction die Richtung in der die Triebwerke feuern. Also "Downward" ist dann der Auftrieb. Das Kürzel in eckigen Klammern kann hier auch in der "sort" Option benutzt werden um die Anzeige neu zu sortieren bzw. nur bestimmte anzuzeigen. Die Kürzel müssen direkt hintereinander geschrieben werden.

thrust(sort y-z+z-)

Es werden Blöcke für jede Art von Triebwerken angezeigt (Ion, Atmo etc.). Mit der Option "summary" wird der Schub von allen Triebwerken zusammengerechnet.

thrust(summary)

"thrust_e" zeigt die Triebwerkseffizienz, die Atmotriebwerke z.B. funktionieren nur in der Atmosphäre und je höher man kommt desto geringer ist die Effizienz der Atmos.

Die Triebwerke können auf Planeten nur bis zu einer bestimmten Masse das Schiff in der Luft halten. Damit man den Punkt nicht verpasst bei welcher das Schiff nicht mehr in Schwebe bleibt gibt es das "thrust_w" Kommando. Hier kann ebenfalls über "sort xx" die Anzeige beeinflusst werden.
Die Einheit ist hier Kilogramm und ein Prozentwert größer 100% zeigt an das das Gewicht in die entsprechende Richtung gehalten werden kann.

thrust_e thrust_w


"speed"
Mit dem Kommando "speed" wird die Geschwindigkeit des Schiffes angezeigt.
speed
Die Art der Anzeige kann mit der "style"-Option beeinflusst werden.
Außerdem kann die Anzeige nicht nur in "m/s" erfolgen, sondern auch in KmH.
speed(style 3,kmh)
Sowie auch in Meilen pro Stunde.
speed(style 3,mph)
Auch diese Kombination wäre möglich:
speed(style 1,noline) speed(style 1,noline,kmh) speed(style 3,noline,mph)
Hier werden dann alle drei Einheiten ausgegeben.
"writex" und "line"
Mit "writex" kann eigener Text auf den LCDs angezeigt werden.
Dieser Text wird in runde Klammern geschrieben und in Segmente unterteilt.
diese Segmente werden durch Komma voneinander getrennt.
Segmente die nur Leerzeichen enthalten werden aufgefüllt bis die Zeile voll ist.

Ein Beispiel:

writex(Links, ,Rechts)


Die leeren Segmente werden immer zu gleichen Teilen aufgefüllt.
Somit kann man leicht Text zentrieren.

writex( ,<<< Zentrierter Text >>>, )


Man kann noch dynamische Felder einbinden.
Diese Felder haben einen Namen und beginnen mit "@"

Hier eine Liste der möglichen Felder:
  • @maingridname
    Der Name des Grids auf dem das Script läuft.
  • @time
    Aktuelle reale Zeit.
  • @date
    Aktuelles Datum, amerikanisches Format.
  • @dateger
    Aktuelles Datum, deutsches Format

Beispiel:
writex(@time, ,@dateger) writex( ,Willkommen auf der,@maingridname, )


Wenn man nach "@" nur ein Zeichen schreibt und danach "(filled)" wird die
Zeile mit diesem Zeichen aufgefüllt:

Beispiel:

writex(@=(filled),Reactors,@=(filled)) reactors(style 3)


Man kann auch die Linie nur 70% der Breite anzeigen lassen:
writex(,@=(70%),)

Möchte man eine durchgehende Linie zeichnen gibt es das "Line" Kommando.
line

Damit wird eine Linie mit dem Minus Zeichen erzeugt.
Man kann auch jedes beliebig andere Zeichen nehmen:
line(*) line(=)
Informationen über angedockte Schiffe
Mit dem Kommando
dockings
zeigt man alle Docks an. Welches Schiff hat gedockt und ein paar weitere Informationen.

Die Verbinder die als Dockport fungieren sollen müssen darauf vorbereitet werden.
Den Namen der Verbinder ergänzen mit:

...(sms,dock:xxxx)

xxxx ist ein kurzer Name , zum Beispiel "Pad Alpha".

Man kann sich auch die Batterien und das Inventar das jeweils angedockten Schiffes anzeigen lassen
batterys[dock:Alpha] inventory[dock:Alpha](all,block)

9 Comments
BelaOkuma  [author] 16 Jan @ 6:23am 
Sorry, daran habe ich natürlich nie gedacht. ;)

SMS

Danke für die Info….
retrogoon 12 Jan @ 6:45am 
Ich zäume das Pferd mal anders herum auf... ich hab diesen Guide durch's Spotlight gefunden und dein Script klingt gut, ich hab, jetzt am ende, nur noch eine Frage:

Wo bekomme ich das Script?

es ist hier nirgends verlinkt und wenn man im WorkShop " StationManagmentSystem " oder " Station Managment System " eingibt findet man eine menge nur nicht dein Script, schade eigentlich.
BelaOkuma  [author] 11 Apr, 2021 @ 11:56pm 
Vielen Dank.

Ich schreibe die Anleitung zuerst in Deutsch und übersetze es dann mit Deepl, in der Hoffnung das man es auch lesen kann. ;)
KiteMG 11 Apr, 2021 @ 1:14pm 
@BelaOkuma Danke für die deutsche Erklärung!
TableruChan 16 Nov, 2019 @ 3:22am 
That's very weird @John Shepard
I don't want to hate on you but it sounds ... is this even german ?
John Shepard 1 Oct, 2019 @ 4:48pm 
@BelaOkuma Don't worry, my Deutch isn't that great either so XD

The script works well, I've tested, it's just a bit difficult to follow in Deutch.


Ich Sprechen Deutch Obwohl!



Danke Schon Fur den Script.
BelaOkuma  [author] 1 Oct, 2019 @ 3:50am 
Hello,

Thank you for your reaction. I am happy that my script attracts attention.
I immediately translated the description, corrected it with Deepl and something else. My English is not very good, but I give my best.
Description comes next.
John Shepard 1 Oct, 2019 @ 2:00am 
Come for the German Memes...

Stay for the German Memes
Ihatethispart3 2 Aug, 2019 @ 1:52pm 
uh
SI