[mod] Empyrion Scripting Mod

Discussion in 'Empyrion API' started by ASTIC, May 25, 2019.

Tags:
  1. ASTIC

    ASTIC Rear Admiral

    Joined:
    Dec 11, 2016
    Messages:
    1,094
    Likes Received:
    735
    1. An den Objekten in die zu dem Verzeichnis passen (CV, BA etc oder ID oder im Scriporder für alle Enties). Die "Main" Funtion wird in dem eingestellten Intervall aufegrufen aber du kannst dich auch an die Events der ModAPI hängen (die sind aber manchmal etwas zickig was die Ausführungzeit anbetrifft)
    2. Daten Zwischenspeichern kannst du in dem Dictionary welches du über "GetPersistendData()" bekommst. Es gehen natürlich auch static Objekte in deiner Klasse. Du musst dann nur bedenken das der Code in einem Playfieldprozess läuft der das Playfiel auch entladen und ein anderes bedienen kann d.h. wenn du Informationen zu einem Objekt speicherst kann dies ggf. veraltet sein
    3. Mein Code ist OpenSource also kannst du dich bedienen ;-)
     
    #201
  2. me777

    me777 Commander

    Joined:
    Aug 18, 2020
    Messages:
    406
    Likes Received:
    139
    Ich habe n Fehler auf der GitHub Seite gefunden:
    Ich habe den Ausdruck {{i18 Key 'Deutsch'}} von der GitHub seite kopiert, und das gibt n Fehler - muss das nicht {{i18n Key 'Deutsch'}} heisen?
    (taucht mehrmals in den Beispielen auf)


    Außerdem bin ich zu doof das mit den GetPersistendData() hinzubekommen.
    Ich will doch bloß die DateTime.Now.Ticks() abspeichern und im nächsten Durchlauf von den aktuellen Ticks subtrahiren. Egal was ich mache die gelesenen Werte sind immer die selben wie die aktuellen obwohl ich die erst danach setze? Da habe ich n ganz dickes Brett vorm Kopf. (es ist als ob ich das DateTime.Now Objekt abspeichere, nicht den Wert.)
    Und das scheint auch nur 1 mal zu gehen, danach bekomme ich die Daten nicht mehr geändert, auch wenn ich versuche einen Festwert reinzuspeichern bleibt der auf dem 1. Versuch hängen.
    Aber ich habe des ganze gestern vor Frust gelöscht und will es heute nochmal versuchen.
     
    #202
  3. Amenophis

    Amenophis Ensign

    Joined:
    Jul 16, 2018
    Messages:
    7
    Likes Received:
    0
    Is this possible to get and set General switches states?
     
    #203
  4. ASTIC

    ASTIC Rear Admiral

    Joined:
    Dec 11, 2016
    Messages:
    1,094
    Likes Received:
    735
    Unfortunately only indirectly via the activity of the respective blocks (weapons, shield, etc.).
    Unfortunately, it is not even possible to set it :-(
     
    #204
  5. me777

    me777 Commander

    Joined:
    Aug 18, 2020
    Messages:
    406
    Likes Received:
    139
    Ich habe das Sortier-Script soweit das ich es mal der Kritik aussetzen kann ;)
    (Ist etwas mächtiger als nur sortieren, praktisch werden Container nach der LadeListe von einer (jeweil bestimmten) Quelle befüllt, und Quelle und Ziel müssen nicht für jeden Transfer nochmal eingetragen werden)

    Was ich besser hinbekommen habe als in Handlebars ist das ich pro QuellContainer nur einmal durch die Items mus, bei meinem Handlebar war es einmal pro Transfer. (Ich bilde mir ein das durch die Container gehen braucht etwas länger als durch eine Liste zu gehen)

    Die Anweisungen für das Script kommen in ein LCD "LadeListe*" und die Ausgabe erfolgt auf "SoreterInfo*"
    Die anweisungen sind ganz einfach :p

    Jeweils eine Zeile pro Anweisung:
    @Containername wird die Quelle (auf momentaner Struktur) festgelegt.
    !StrukturID legt Zielstruktur fest; nur ! legt Ziel auf aktuelle Struktur fest, kann weggelassen werden für nur aktuelle Struktur.
    +Containername legt Ziel fest
    ID,Anzahl legt fest was verschoben werden soll.

    Das verarbeiten der Anweisungen und das Verschieben passieren nacheinender und das Verschieben nach QuellContainer gruppiert.

    Noch zu implementieren ist:
    Menge 0 für voll (ist nicht schwer, aber ich habe erst jetzt dran gedacht.)
    Pentaxid und Treibstoff Tanks befüllen.

    Was noch getestet werden muss:
    was passiert wenn das Ziel weit bzw mittel weit weg ist...
    ob es irgendwelche Probleme macht...

    Code:
    using Eleon.Modding;
    using EmpyrionScripting;
    using EmpyrionScripting.CustomHelpers;
    using EmpyrionScripting.DataWrapper;
    using EmpyrionScripting.Interface;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    
    
        public class soll
        {
            public int Id { get; set; }
            public int Zahl { get; set; }
            public string ZielStructur { get; set; }
            public string ZielContainer { get; set; }
            public string QuellContainer { get; set; }
        }
    public class quellen
    {
        public string container { get; set; }
    }
    public class ModMain
    {
        public static void Main(IScriptModData rootObject)
        {
    
            List<soll> solls = new List<soll>();
           
            List<quellen> quellens = new List<quellen>();
            if (!(rootObject is IScriptSaveGameRootData root)) return;
            if (root.E.Faction.Id == 0) return;
            var ILcds = root.CsRoot.GetDevices<ILcd>(root.CsRoot.Devices(root.E.S, "SoreterInfo*"));
            var LLLcd = root.CsRoot.GetDevices<ILcd>(root.CsRoot.Devices(root.E.S, "LadeListe*"));
            if (LLLcd.Length == 0)
            {
                WriteTo(ILcds, "kein LCD LadeListe");
                return;
            }
            LLLcd.ForEach(L =>
            {
                string quellcontainername = null;
                string zielcontainername = null;
                string zielID = root.E.Id.ToString();
                string text = L.GetText();
                string[] lines = text.Split(
                    new[] { "\r\n", "\r", "\n" },
                    StringSplitOptions.None
                );
                foreach (string line in lines)
                {
                    if (line.StartsWith("@"))
                    {
                        quellcontainername = line.Substring(1);
                        quellen Q = new quellen { container = quellcontainername };
                        //WriteTo(ILcds, $"qc {quellcontainername}");
                        if (quellens.Contains(Q))
                        {
                            continue;
                        }
                        quellens.Add(Q);
                    }
                    else if (line.StartsWith("+"))
                    {
                        zielcontainername = line.Substring(1);
                        //WriteTo(ILcds, $"zc {zielcontainername}");
                    }
                    else if (line.StartsWith("!"))
                    {
                        if (line.Length > 2)
                            zielID = line.Substring(1);
                        else
                            zielID = root.E.Id.ToString();
                        //WriteTo(ILcds, $"zstrukt {zielID} {root.CsRoot.EntitiesById(zielID).FirstOrDefault().Id}");
                    }
                    else if (quellcontainername != null && zielcontainername != null)
                    {
                        string[] values = line.Split(',');
                        if (values.Length == 2)
                        {
                            int iid = 0;
                            int ianz = 0;
                            if ((int.TryParse(values[0], out iid)) && (int.TryParse(values[1], out ianz)))
                            {
                                if (quellcontainername == null)
                                {
                                    WriteTo(ILcds, $"Fehler Quellcontainer {quellcontainername}");
                                    return;
                                }
                                if (zielcontainername == null)
                                {
                                    WriteTo(ILcds, $"Fehler Quellcontainer {zielcontainername}");
                                    return;
                                }
                                else
                                {
                                    solls.Add(new soll() { Id = iid, Zahl = ianz, QuellContainer = quellcontainername, ZielContainer = zielcontainername, ZielStructur = zielID });
                                };
                            }
                        }
                        else
                        {
                            if (line.Length > 0)
                                WriteTo(ILcds, $"Fehler: {line}");
                        }
                    }
                };
            });
            quellens.ForEach(C =>
            {
                root.CsRoot.Items(root.E.S, C.container).ForEach(I =>
                 {
                     solls.Where(s => s.QuellContainer == C.container && s.Id == I.Id).ToList().ForEach(TI =>
                     {
                         IList<IItemMoveInfo> MiList;
                         if ( TI.Zahl == 0)
                         MiList = root.CsRoot.Move(I, root.CsRoot.EntitiesById(TI.ZielStructur).FirstOrDefault().S, TI.ZielContainer);
                         else
                         MiList = root.CsRoot.Move(I, root.CsRoot.EntitiesById(TI.ZielStructur).FirstOrDefault().S, TI.ZielContainer,TI.Zahl);
                         MiList.ForEach(Mi =>
                         {
                             if (root.E.Id.ToString() == TI.ZielStructur)
                                 WriteTo(ILcds, $"verschoben:  {Mi.Count} {root.CsRoot.I18n(Mi.Id)} [{Mi.Id}] in {TI.ZielContainer}");
                             else
                                 WriteTo(ILcds, $"verschoben:  {Mi.Count} {root.CsRoot.I18n(Mi.Id)} [{Mi.Id}] in {TI.ZielContainer} auf {root.CsRoot.EntitiesById(TI.ZielStructur).FirstOrDefault().Name}");
                         });
                     });
                 });
            });
        }//ende Main//
        private static void WriteTo(ILcd[] lcds, string text)
        {
            lcds.ForEach(L => L.SetText($"{text}\n{L.GetText()}"));
        }
    }
    
    Beispiel LadeListe:
    die nimmt aus dem Container auto1 Sauerstoffkanister; bis 17 wird der Container test gefüllt und der container test im Schiff ID1024 bekommt 11 Flaschen.
    Code:
    @auto1
    +test
    2128,17
    !1024
    2128,11
    PS: mein C# ist nicht so gut, ich hab eigentlich nur C++ gelernt und das is lange her und sehr eingerostet...

    edit:
    bis jetzt macht das script genau was es soll - und ohne die ruckler die das handlebars script verursacht hat ;D
    Die Version oben ist jetzt aktualisiert, menge 0 verschiebt ohne zielmenge.
     
    #205
    Last edited: Jan 8, 2021
  6. me777

    me777 Commander

    Joined:
    Aug 18, 2020
    Messages:
    406
    Likes Received:
    139
    I want to get Data (name) about the playfield a structure with a given ID is in.
    I think getting from the global.db would be the easy way.
    But the script would need the System.Data.SQLite dll...
    Is it possible to use other libraries?

    Or is there a other way to get the database data?

    Well now as I write this I thought of another possible solutin: modify the cargoteleporter to save that info too. (and also to fix a litle problem the cargoteleporter has: rename the old file instead making a new one if faction id changes)
     
    #206
  7. ASTIC

    ASTIC Rear Admiral

    Joined:
    Dec 11, 2016
    Messages:
    1,094
    Likes Received:
    735
    In the [EGS]\Saves\Games\[Safegame]\Mods\EmpyrionScripting\CsCompilerConfiguration.json you can add assemblies in the section "AssemblyReferences" eg.
     
    #207
  8. me777

    me777 Commander

    Joined:
    Aug 18, 2020
    Messages:
    406
    Likes Received:
    139
    OK, won't do it then as it would not be compatible for others exept they also change that file... (if/when i share those)
    Already got an Idea how to do what I want by making a changed version of the cargoteleporter script.

    (deutsch)
    OK, dann lasse ich das, es währe nicht kompatibel für andere, außer sie ändern auch die datei... (wenn ich es teilen möchte)
    Ich habe schon eine Idee wie ich es mit einem verändertem cargoteleporter script erreichen kann.
     
    #208
  9. ASTIC

    ASTIC Rear Admiral

    Joined:
    Dec 11, 2016
    Messages:
    1,094
    Likes Received:
    735
    Über C# (im SavegameScript) kannst du auch die "native" ModAPI von Empyrion mit all ihren Funktionen erreichen, vielleicht wirst du ja in der API fündig
     
    #209
  10. me777

    me777 Commander

    Joined:
    Aug 18, 2020
    Messages:
    406
    Likes Received:
    139
    Ich hab überlegt, die faction id im pfad ist ja ddafür das nicht zu ner fremden pos teleportiert wird.
    mache ich etwas kaputt wenn ich die datei verschiebe wenn die gleiche entity id mit ner neuen faction id angelegt werden würde?
    oder ich lösche die falls sie leer ist. das ist fast noch ne bessere idee.

    Übrigens geht des script, jedenfalls beim CargoOut, nicht nur auf container los: auf dem lcd-demo gibts ein lcd das auch CargoOut@(...) heist und das wird auch abgefragt und bringt die "id is not a number" warnung.

    Irgendwie bekomme ich bei der modapi keinen fuß auf den boden, meinen Respekt damit zurechtzukommen.

    momentan habe ich die 2. stelle gefunden wo ich auf granit beise...
    das erste war kartenmarker setzen, aber da ham die entwickler irgendwie was verbastelt, man kann auf 3+ arten kartenmarker setzen und alle verhalten sich anders und werden teilweise nicht richtig verarbeitet...
    also hab ich mir n neues ziel gesucht: am cargoteleporter hab ich eine kleinigkeit gefunden wo ich gedacht habe ist einfach dazuzubasteln: anzeige welches ziel ausgewählt ist - das habe ich auch hinbekommen, wenn auch auf umwegen. jetzt wollte ich n lcd als ne art adressbuch mit durch ändern auswahl für den cargoteleporter. angezeigt bekomme ich mein adressbuch, aber ich kann über empyrionscripting den customname des containers nicht ändern - Ich denke in der modapi würde des gehen...
    Ich frage mich eben Ob nicht die Auswahl über ein lcd statt den containernamen nicht auch ein Lösungsansatz ist. währe auch soweit eine etwas anspruchsvollere version (für den nutzer) weil man dann strom auf der basis braucht.

    ps, sorry für mein ranting und schlechte rechtschreibung, ich bastel schon stundenlang am script rum und sollte schon im bett sein ;P
     
    #210
    Last edited: Jan 9, 2021
  11. ASTIC

    ASTIC Rear Admiral

    Joined:
    Dec 11, 2016
    Messages:
    1,094
    Likes Received:
    735
  12. Thodin O Gondrafn

    Thodin O Gondrafn Lieutenant

    Joined:
    Mar 14, 2019
    Messages:
    55
    Likes Received:
    14
    #212
  13. ASTIC

    ASTIC Rear Admiral

    Joined:
    Dec 11, 2016
    Messages:
    1,094
    Likes Received:
    735
  14. Thodin O Gondrafn

    Thodin O Gondrafn Lieutenant

    Joined:
    Mar 14, 2019
    Messages:
    55
    Likes Received:
    14
    Und wieder gab es ein Update, und wieder geht nix. Ich könnte verstehen, wenn selbst fleißige und geduldige Modder dieser "Philosophie" irgendwann den Rücken zuwenden...
    Nachtrag: Gerade auf einem anderen Server getestet, da läuft es... mea culpa. Muss wohl jetzt suchen, was kaputt gegangen ist... m)

    Nachtrag: Gefunden, es war die adminconfig.yaml
    Hier hat sich was im Syntax geändert, was ab 1.4x Auswirkung auf die Scripte hat und nur darauf ... m(
     
    #214
    Last edited: Feb 16, 2021
  15. ASTIC

    ASTIC Rear Admiral

    Joined:
    Dec 11, 2016
    Messages:
    1,094
    Likes Received:
    735
    #215
  16. Thodin O Gondrafn

    Thodin O Gondrafn Lieutenant

    Joined:
    Mar 14, 2019
    Messages:
    55
    Likes Received:
    14
  17. ASTIC

    ASTIC Rear Admiral

    Joined:
    Dec 11, 2016
    Messages:
    1,094
    Likes Received:
    735
    #217
  18. Thodin O Gondrafn

    Thodin O Gondrafn Lieutenant

    Joined:
    Mar 14, 2019
    Messages:
    55
    Likes Received:
    14
    Da auch die Suchmaschinen nichts sagen: Was macht ElevaedFactions? In der configuration.json finde ich nur den Eintrag "ElevatedGroups".
    Und eigentlich weis ich von den meisten Einträgen nicht, wofür sie sind und ob und womit ich sie ändern kann. Schau sie mir nur mit Notpad++ an ;)
    Since the search engines do not say anything: What makes ElevaedFactions? In Configuration.json, I only find the entry "ElevatedGroups". And actually I do not know from most entries, for what they are and whether and what can I change them. Look at me only with Notpad ++;)
     
    #218
  19. ASTIC

    ASTIC Rear Admiral

    Joined:
    Dec 11, 2016
    Messages:
    1,094
    Likes Received:
    735
    ElevatedGroups are also allowed to use commands that are otherwise only reserved for savegame scripts. For example "create" items in boxes.
     
    #219
  20. me777

    me777 Commander

    Joined:
    Aug 18, 2020
    Messages:
    406
    Likes Received:
    139
    Ich hab n Problem...
    Ich bin von Server auf Singeleplayer gewechselt und jetzt habe ich in meiner Homebase, einer riesen Raumstation,
    ruckler alle 10 Sekunden - was den Verdacht aufkommen lässt das mein savegame-script schuld ist.
    Auf dem Server ist das Script ganz prima gelaufen und ich habe keine ruckler gemerkt.

    das script macht für eine liste von id's und zielcontainern move befehle, von denen fast alle nichts bewegen weil genug im ziel ist.
    kann das ruckler verursachen?
     
    #220

Share This Page