Welcome to Keen Software House Forums! Log in or Sign up to interact with the KSH community.
  1. You are currently browsing our forum as a guest. Create your own forum account to access all forum functionality.

Anfänger Script

Discussion in 'German Community Discussion' started by Verx, Jan 22, 2018.

Thread Status:
This last post in this thread was made more than 31 days old.
  1. Verx Trainee Engineer

    Messages:
    3
    Hallo Zusammen,
    ich Spiele seit einiger Zeit schon SE im Überleben Modus und jetzt bin an einem Punkt angekommen. Wo ich anfange selbst zu scripte. Leider klappt das nur bedingt. Kann einer von euch mein denk Fehler finden.

    Das Script soll meine Display beschreiben wenn ich in der Nähe von Sensor bin mit Hallo Verx und wenn ich nicht da bin Warten auf Verx beschreiben. So jetzt steht da immer hallo Verx. Ich glaube in der If Zeile stimmt was nicht ganz.

    Danke schon mal im Vorraus.

    -------------

    void Main()
    {
    IMyTextPanel display1 = GridTerminalSystem.GetBlockWithName("LCDTUEREN1") as IMyTextPanel;
    IMyTextPanel display2 = GridTerminalSystem.GetBlockWithName("LCDTUEREN2") as IMyTextPanel;
    IMyTextPanel display3 = GridTerminalSystem.GetBlockWithName("LCDTUEREN3") as IMyTextPanel;
    IMyTextPanel display4 = GridTerminalSystem.GetBlockWithName("LCDTUEREN4") as IMyTextPanel;
    IMyTextPanel display5 = GridTerminalSystem.GetBlockWithName("LCDTUEREN5") as IMyTextPanel;
    IMyTextPanel display6 = GridTerminalSystem.GetBlockWithName("LCDTUEREN6") as IMyTextPanel;
    IMyTextPanel display7 = GridTerminalSystem.GetBlockWithName("LCDTUEREN7") as IMyTextPanel;
    IMyTextPanel display8 = GridTerminalSystem.GetBlockWithName("LCDTUEREN8") as IMyTextPanel;
    IMySensorBlock sensor1 = GridTerminalSystem.GetBlockWithName("SensosText") as IMySensorBlock;

    if (sensor1.IsActive){
    display1.WritePublicText("Hello Verx") ;
    display2.WritePublicText("Hello Verx") ;
    display3.WritePublicText("Hello Verx") ;
    display4.WritePublicText("Hello Verx") ;
    display5.WritePublicText("Hello Verx") ;
    display6.WritePublicText("Hello Verx") ;
    display7.WritePublicText("Hello Verx") ;
    display8.WritePublicText("Hello Verx") ;
    }

    else {
    display1.WritePublicText("Warten auf Verx") ;
    display2.WritePublicText("Warten auf Verx") ;
    display3.WritePublicText("Warten auf Verx") ;
    display4.WritePublicText("Warten auf Verx") ;
    display5.WritePublicText("Warten auf Verx") ;
    display6.WritePublicText("Warten auf Verx") ;
    display7.WritePublicText("Warten auf Verx") ;
    display8.WritePublicText("Waren auf Verx") ;
    }
    }

    ---------------------------
     
  2. glubbfreund Trainee Engineer

    Messages:
    12
    Hey... bin selbst neu hier aber hierbei kann ich dir helfen. Das ingame skripten hat sich tatsächlich als eine Meiner Lieblingsbeschäftigungen herausgestellt :woot:

    Die Eigenschaft IsActive gibt dir in diesem Fall immer True zurück solange du diese Geräte nicht ausschaltest .. denke ich zumindest:) versuchs mal mit:

    List<MyDetectedEntityInfo> entities = new MyDetectedEntityInfo();
    sensor1.DetectedEntities(entities);
    if(entities.Count > 0) {
    display1.WritePublicText("Hello Verx") ;
    ...
    }
    else {
    display1.WritePublicText("Warten auf Verx") ;
    ...
    }

    und stell den Sensor selbst entsprechend auf Player ein.
    Im übrigen könntest du dir auch alle LCDs mit der Bezeichnung XY in eine Liste laden statt alle einzeln anzusprechen. eine Liste ist das was du da oben in meinem Beispiel siehst, eine Liste kann mehrerer Werte eines Typs - in deinem Fall IMyTextPanel aufnehmen. Ich hoffe ich konnte dir helfen.
     
  3. Verx Trainee Engineer

    Messages:
    3
    Hallo glubbfreund,

    ja das hat mir sehr geholfen. Jetzt läuft alles wie es soll. Dass mit den Listen erstellen ist mir zwar noch nicht garz klar, ich lese mich da einfach ein.
     
  4. glubbfreund Trainee Engineer

    Messages:
    12
    IMyTextPanel display1 = GridTerminalSystem.GetBlockWithName("LCDTUEREN1") as IMyTextPanel;
    IMyTextPanel display2 = GridTerminalSystem.GetBlockWithName("LCDTUEREN2") as IMyTextPanel;
    IMyTextPanel display3 = GridTerminalSystem.GetBlockWithName("LCDTUEREN3") as IMyTextPanel;
    IMyTextPanel display4 = GridTerminalSystem.GetBlockWithName("LCDTUEREN4") as IMyTextPanel;
    IMyTextPanel display5 = GridTerminalSystem.GetBlockWithName("LCDTUEREN5") as IMyTextPanel;
    IMyTextPanel display6 = GridTerminalSystem.GetBlockWithName("LCDTUEREN6") as IMyTextPanel;
    IMyTextPanel display7 = GridTerminalSystem.GetBlockWithName("LCDTUEREN7") as IMyTextPanel;
    IMyTextPanel display8 = GridTerminalSystem.GetBlockWithName("LCDTUEREN8") as IMyTextPanel;

    ist relativ viel schreibarbeit und wenn du neue LCDs erstellst musst du jedes mal den Code anpassen. Im Prinzip ist das ja eine Liste von IMyTextPanel Objekten die du da erstellt hast - nur eben manuell :)
    Eine Liste ist im Hintergrund eine Klasse die im .NET Framework mitgeliefert wird und du kannst Sie verwenden (wenn du möchtest). Damit die Liste nicht jedes Mal neu geschrieben werden muss und jeden beliebigen Datentyp aufnehmen kann (Ganzzahl, Zeichenkette, Irgendein Objekt z.B. IMyTextPanel - von dem Microsoft ja sicherlich nichts weiß) sind Listen "generisch", daher diese komischen eckigen Klammern.

    List<IRGENDEINDATENTYP> NAMEDERLISTE = new List<IRGENDEINDATENTYP>();

    Darin wird einfach der Datentyp angegeben, also:

    List<IMyTextPanel> lcds = new List<IMyTextPanel>();
    GridTerminalSystem.SearchBlocksOfName("LCDTUEREN", lcds);// SearchBlocksOfName sucht nach Blöcken in der dieser angegebene String enthalten ist (LCDTUEREN) und speichert diese in der Liste lcds.

    jetzt hast du diese Liste von LCDs und kannst diese einfach durchlaufen. Dafür gibt es eine Schleife namens foreach:

    if(entities.Count > 0) {
    foreach(IMyTextPanel lcd in lcds) // Gehe jedes Element in lcds durch und benenne es als IMyTextPanel lcd innerhalb der geschweiften Klammern .. also innerhalb der Schleife
    {
    lcd.WritePublicText("Hello Verx") ; // das wird solange ausgeführt wie deine Liste lang ist
    }
    }

    Als kleine Einführung.... vielleicht macht dir das ja Spaß und du hast bald ein neues Hobby :)
     
  5. Verx Trainee Engineer

    Messages:
    3
    THX a lot. Ja da ganze mach mir super Spaß. ich Programmier ein bisschen in C und in der abgewandelte form für den Arduino. Da konnte ich schon ziemlich viel Verzücktes Zeugsmachen. Meine Codes sind halt immer ziemlich einfach gewesen. Dass mit den Listen Schreiben, ist eine super Sachen. Das wird alle meine Scrips um mind. die hälfe reduzieren.
     
Thread Status:
This last post in this thread was made more than 31 days old.