[mod] Empyrion Scripting Mod

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

  1. ASTIC

    ASTIC Captain

    Joined:
    Dec 11, 2016
    Messages:
    819
    Likes Received:
    862
    Nachtrag: Ganz genau laufen ALLE Scripte nur auf im spiel geladene Strukturen sobald das DSL eine Struktur entlädt und auf Proxy setzt und natürlich auch, wenn das ganze Playfield nicht aktiv/entladen wurde werden die Scripte nicht mehr für die jeweiligen Strukturen ausgeführt.
     
    #141
  2. Preston

    Preston Lieutenant

    Joined:
    Jul 6, 2017
    Messages:
    96
    Likes Received:
    20
    Aber entlädt DSL nicht alle Strukturen außerhalb der Sichtweite von Spielern? Also wäre es damit nicht egal ob der Playfieldserver läuft oder nicht? Nach deiner Beschreibung würde ich schlussfolgern das Scripts auf leeren Servern immer anhalten.
     
    #142
  3. ASTIC

    ASTIC Captain

    Joined:
    Dec 11, 2016
    Messages:
    819
    Likes Received:
    862
    Auf leeren Server - ja - werden die Scripte von der Mod nicht mehr angetriggert.
     
    #143
  4. Preston

    Preston Lieutenant

    Joined:
    Jul 6, 2017
    Messages:
    96
    Likes Received:
    20
    @ASTIC
    Meine DLL habe ich versucht so generisch zu schreiben, dass sie durchaus für viele nützlich sein könnte.

    Willst du sie mit in die Mod als "Standard Scripts" einbauen oder kann/soll ich sie woanders online stellen?
    Ich wollte jetzt nicht unbedingt selbst eine Seite auf GitHub aufmachen.
    Das scheint mir etwas übertrieben. ;)

    Ich würde dann noch eine kleine "readme" mit Bedienungs- und Installations- Anleitung schreiben.
     
    #144
  5. ASTIC

    ASTIC Captain

    Joined:
    Dec 11, 2016
    Messages:
    819
    Likes Received:
    862
    Ich kann das in das Reprository übernehmen
    https://github.com/GitHub-TC/EmpyrionScripting-Collection
    bzw wir können das auch hier (im Scriptforum) zum Download anbieten.
     
    #145
  6. Preston

    Preston Lieutenant

    Joined:
    Jul 6, 2017
    Messages:
    96
    Likes Received:
    20
    Ich bin gerade dabei ein paar Punkte den letzten Feinschliff zu verpassen.
    Dabei habe ich verschiedene Code-Teile per Kommentar aktiviert oder deaktiviert.

    Dabei habe ich festegestellt, dass mein Server deutlich stabiler startet/läuft je weniger statische Variablen ich verwende.
    Speicherüberlauf ist es nicht, die Speicherauslastung ist stabil.
    Ich habe mir das noch nicht näher im Code angeschaut, aber statistisch allgemein scheinen die "Probleme" beim Handling von statischen Variablen zuzunehmen. Kann es da Timing-Probleme geben?
    Bekommen verschiedene script-dateien parallele threads?
     
    #146
    Last edited: Aug 21, 2020
  7. ASTIC

    ASTIC Captain

    Joined:
    Dec 11, 2016
    Messages:
    819
    Likes Received:
    862
    Kommt auf die Variablen an ;-) stell mal deinn Code hier rein oder sende ihn mit per PM dann werfe ich mal einen Blick drauf
     
    #147
  8. Preston

    Preston Lieutenant

    Joined:
    Jul 6, 2017
    Messages:
    96
    Likes Received:
    20
    Die Passage die ich in Verdacht habe ist folgende.
    Die Idee ist, dass ich Script-Intervall-Übergreifend verschiedene Informationen über Geräte speichern will, um im Script auch darstellen können wenn etwas fehlt. Zum Beispiel ein zerstörtes Device das von "GetDevices" nicht mehr gefunden werden kann. Und auch für zeitaufwendige Daten die nicht bei jedem Durchlauf neu ermittelt werden müssen.

    Um das "zentral" verwalten zu können habe ich die Klasse "PersistentDataStorage" erstellt.
    Alle Add- und Get- Aufrufe erfolgen erst nach einem TryGet-check. Trotzdem werden immer mal wieder (sparodisch, bis jetzt nicht gezielt reproduzierbar) IndexOutOfBounds Exception in der Klasse geworfen.

    Ich habe jetzt schon alle meine "Script.(Methode).Run()" aufrufe in eine einzelne .cs Datei zusammengezogen um Parallälität zu vermeiden.
    Außerdem habe ich in der Methode "GetVesselDataStorage" ein "lock" eingefügt.
    Ich werde Morgen mal testen wie stabil das jetzt läuft.

    Code:
    namespace PersistentDataStorage
        {
            using CpuInfCpu = Scripts.CpuInfCpu;
            using CpuInfDev = Scripts.CpuInfDev;
            using CpuInfHll = Scripts.CpuInfHll;
            public static class PersistentDataStorage
            {
                private static readonly Dictionary<int, VesselDataStorage> registeredVesselsList = new Dictionary<int, VesselDataStorage>();
                private class VesselDataStorage
                {
                    public Dictionary<String, int> RegisteredDeviceCountByGroupTag = new Dictionary<string, int>();
                    public Dictionary<VectorInt3, CpuInfDev.RegisteredDeviceDataSet> RegisteredDeviceDataByPosition =
                        new Dictionary<VectorInt3, CpuInfDev.RegisteredDeviceDataSet>();
                    public Dictionary<VectorInt3, CpuInfCpu.RegisteredCpuDataSet> RegisteredCpuDataByPosition =
                        new Dictionary<VectorInt3, CpuInfCpu.RegisteredCpuDataSet>();
                    public CpuInfHll.RegisteredStructureDataSet RegisteredStructureData = new CpuInfHll.RegisteredStructureDataSet();
                }
                public static void Reset()
                {
                    registeredVesselsList.Clear();
                }
                public static int GetRegisteredDeviceCountByGroupTag(IEntityData E, String sGroupTag, int iNewCount)
                {
                    VesselDataStorage vesselData = GetVesselDataStorage(E);
                    if (!vesselData.RegisteredDeviceCountByGroupTag.TryGetValue(sGroupTag, out int iRegisteredCount))
                    {
                        iRegisteredCount = iNewCount;
                        vesselData.RegisteredDeviceCountByGroupTag.Add(sGroupTag, iRegisteredCount);
                    }
                    else
                    {
                        iRegisteredCount = Math.Max(iNewCount, iRegisteredCount);
                        vesselData.RegisteredDeviceCountByGroupTag[sGroupTag] = iRegisteredCount;
                    }
                    return iRegisteredCount;
                }
                public static Dictionary<VectorInt3, CpuInfDev.RegisteredDeviceDataSet> GetRegisteredDevicesList(IEntityData E)
                {
                    VesselDataStorage vesselData = GetVesselDataStorage(E);
                    return vesselData.RegisteredDeviceDataByPosition;
                }
                public static Dictionary<VectorInt3, CpuInfCpu.RegisteredCpuDataSet> GetRegisteredCpusList(IEntityData E)
                {
                    VesselDataStorage vesselData = GetVesselDataStorage(E);
                    return vesselData.RegisteredCpuDataByPosition;
                }
                public static CpuInfHll.RegisteredStructureDataSet GetRegisteredStructureDataSet(IEntityData E)
                {
                    VesselDataStorage vesselData = GetVesselDataStorage(E);
                    return vesselData.RegisteredStructureData;
                }
                private static VesselDataStorage GetVesselDataStorage(IEntityData E)
                {
                    lock (registeredVesselsList)
                    {
                        if (!registeredVesselsList.TryGetValue(E.Id, out VesselDataStorage vesselData))
                        {
                            vesselData = new VesselDataStorage();
                            registeredVesselsList.Add(E.Id, vesselData);
                        }
                        return vesselData;
                    }
                }
            }
        }
    
     
    #148
  9. ASTIC

    ASTIC Captain

    Joined:
    Dec 11, 2016
    Messages:
    819
    Likes Received:
    862
    @Preston Für den threadsichere parallelen Zugriff musst du das ConcurrentDictionary benutzen bzw die anderen Klassen aus dem
    System.Collections.Concurrent Namespace
     
    #149
    Preston likes this.
  10. Preston

    Preston Lieutenant

    Joined:
    Jul 6, 2017
    Messages:
    96
    Likes Received:
    20
    Unglaublich...Concurrent ist toll. :D Ich hab alle Dictionaries in der Klasse auf "Concurrent" geändert und alle nicht-Collections mit "lock" gesichert und es läuft. Der Server startet fast immer auf anhieb und es stürzt nix mehr ab wenn er erstmal läuft.
    Ich würde sagen die verbleibenden Startprobleme gehen auf Eleons Konto. :)

    Ich glaube es ist sinnvoll die lib mit im Repository anzubieten statt losgelöst von der Mod. Ich habe die Dateien mal angehängt.
     

    Attached Files:

    #150
    ASTIC likes this.
  11. ASTIC

    ASTIC Captain

    Joined:
    Dec 11, 2016
    Messages:
    819
    Likes Received:
    862
    Yep ... cool gemacht
    hast du auch noch ein Demo Schiff/Basis dazu?
    Schau dir GitHub mal an, der Vorteil, wenn du dort deine Sachen hochlädst das andere daran mitarbeiten könnten und du gleichzeitig eine Versionskontrolle und Ablage für die "Release"-Dateien hast du kannst dann hier und vom Steamworkshop einfach per Url darauf verweisen.
     
    #151
  12. Preston

    Preston Lieutenant

    Joined:
    Jul 6, 2017
    Messages:
    96
    Likes Received:
    20
    Ich glaube ich muss mir mal anschauen wie Github funktioniert. Ich habe gesehen das Visual Studio dafür eine Schnittstelle hat...wenn ich das richtig überflogen habe. :)

    Ich habe das bisher auf meinen Vessels getestet. Die sind aber nicht für eine Demo geeignet. Ich bau da mal was.
     
    #152
    Homunk and ASTIC like this.
  13. Preston

    Preston Lieutenant

    Joined:
    Jul 6, 2017
    Messages:
    96
    Likes Received:
    20
    #153
    Homunk likes this.
  14. Preston

    Preston Lieutenant

    Joined:
    Jul 6, 2017
    Messages:
    96
    Likes Received:
    20
    Eleon scheint mit 1.1.5 etwas umbenannt zu haben:

    [​IMG]

    "Newtonsoft" scheint nicht mehr da zu sein. :rolleyes:
     
    #154
  15. Ostentatiou5

    Ostentatiou5 Ensign

    Joined:
    Aug 9, 2020
    Messages:
    12
    Likes Received:
    5
    With the 1.1.5 update today, I have a couple of issues. The CargoOut is not working. Also, the recycle is removing the structure, but it doesn't go into the cargo box, the contents just disappear.

    Any suggestions?
     
    #155
  16. Ostentatiou5

    Ostentatiou5 Ensign

    Joined:
    Aug 9, 2020
    Messages:
    12
    Likes Received:
    5
    [QUOTE = "Preston, post: 416864, member: 21247"] Eleon seems to have renamed something with 1.1.5:

    "Newtonsoft" doesn't seem to be there anymore. : rolleyes:[/ QUOTE]

    I. think that's what's broken the cargo teleporter as well.
     
    #156
  17. ASTIC

    ASTIC Captain

    Joined:
    Dec 11, 2016
    Messages:
    819
    Likes Received:
    862
    I will take a look on this...
     
    #157
  18. ASTIC

    ASTIC Captain

    Joined:
    Dec 11, 2016
    Messages:
    819
    Likes Received:
    862
    #158
    Last edited: Aug 24, 2020
    Ostentatiou5 likes this.
  19. Ostentatiou5

    Ostentatiou5 Ensign

    Joined:
    Aug 9, 2020
    Messages:
    12
    Likes Received:
    5
    #159
  20. ASTIC

    ASTIC Captain

    Joined:
    Dec 11, 2016
    Messages:
    819
    Likes Received:
    862
    #160
    Preston likes this.

Share This Page