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.
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.
@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.
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.
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?
Kommt auf die Variablen an ;-) stell mal deinn Code hier rein oder sende ihn mit per PM dann werfe ich mal einen Blick drauf
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; } } } }
@Preston Für den threadsichere parallelen Zugriff musst du das ConcurrentDictionary benutzen bzw die anderen Klassen aus dem System.Collections.Concurrent Namespace
Unglaublich...Concurrent ist toll. 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.
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.
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.
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?
[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.
Empyrion now uses Newtonsoft itself - so EmpyrionScripting have to use this now https://github.com/GitHub-TC/EmpyrionScripting/releases
[QUOTE = "ASTIC, post: 416876, member: 16593"] Empyrion now uses Newtonsoft itself - so EmpyrionScripting have to use this now https://github.com/GitHub-TC/EmpyrionScripting/releases/tag/5.9.5 [/ QUOTE] Will that fix the cargoteleporter as well?