True bzw. False Ausgabe speichern/laden

  • Hi,


    ich stehe mal wieder vor einem Problem bei dem ich nicht weiter komme.
    Ich habe ein Script geschrieben bei dem man eine Taste drückt und eine Aktion ausgelöst wird.


    Beispiel:
    Taste K gedrückt = Objekt sichtbar (True)
    Nochmal Taste K gedrückt = Objekt unsichtbar (False)


    Das Ganze ist in einen Schlepper verbaut!


    Ich möchte es jetzt gerne so haben:


    - Taste K gedrückt = Objekt sichtbar = True
    - Spiel gespeichert
    - Spiel geladen = Objekt sichtbar = True ohne erneuten Tastendruck


    Leider habe ich keinen Plan wie ich das realisieren kann.


    Ich habe mir einige Scripts (z.B operatinHours) angeguckt, die offensichtlich Werte speichern aber ich verstehe die Funktionsweise nicht.
    Muss ich dafür eine neue xml Datei anlegen? Kann ich eine bestehende Datei z.B die careerSavegame.xml verwenden?


    Kann mir da mal jemand Hilfe leisten?


    lg
    Webby

  • Dafür gibt es im LS zwei spezielle Methoden, die beim Speichern bzw. Laden aufgerufen werden.


    [lua]
    function Class:loadFromAttributesAndNodes(xmlFile, key, resetVehicles)
    local vBool = getXMLBool(xmlFile, key.."#vBool");
    if vBool ~= nil then
    self.vBool = vBool;
    end;
    return BaseMission.VEHICLE_LOAD_OK;
    end;


    function Class:getSaveAttributesAndNodes(nodeIdent)
    local attributes = ""
    if self.vBool ~= nil then
    attributes = 'vBool="'.. self.vBool ..'"';
    end;
    return attributes, nil;
    end;
    [/lua]


    self.vBool ist die Variable. die gespeichert werden soll. Nach Möglichkeit solltest du das XML-Attribut gleich benennen :)


    MfG

  • Danke für deine schnelle Antwort!

    Nach Möglichkeit solltest du das XML-Attribut gleich benennen


    Wenn ich ehrlich bin, weiß ich nicht was du mit XML-Attribut meinst.


    Hab das mal eingebaut aber der Wert wird nicht gespeichert.
    ich habe lediglich (zum Testen)
    function Class:loadFromAttributesAndNodes(xmlFile, key, resetVehicles)
    und
    function Class:getSaveAttributesAndNodes(nodeIdent)
    in
    function myClass:getSaveAttributesAndNodes(nodeIdent)
    umbenannt.

  • Hey,


    sofern deine Klasse myClass heißt, ist dies genau richtig. Class sollte genau wie self.vBool als Platzhalter dienen. Letzteres musst du ebenfalls noch in allen Fällen mit deiner Variable tauschen, damit das speichern funktioniert - logisch.


    Vielleicht noch etwas tiefer in die Theorie:
    Jede Specialization eines Mods kann die Methoden loadFromAttributesAndNodes() und getSaveAttributesAndNodes() beinhalten. Beim Speichervorgang wird getSaveAttributesAndNodes() in jeder Specialization nacheinander aufgerufen. Aus den gesamten Rückgabewerten (String) der einzelnen Methoden wird ein großer String erzeugt, der schlussendlich in der vehicles.xml gespeichert wird.


    In Zeile 12 aus meinem Quellcode würden wir also dem Hauptstring folgenden Teilstring hinzufügen vBool="true" (könnte auch false sein, je nachdem welchen Wert self.vBool hat ;))


    So würde beispielsweise aus :

    XML
    <vehicle id="2" filename="data/vehicles/steerable/kramer/kramerKL200.xml" isAbsolute="true" fuelFillLevel="24">
    <component1 position="-40 125.03494262695 -51.999923706055" rotation="3.1388788223267 3.6418890658751e-007 -3.1415913105011" />
    </vehicle>


    das :


    XML
    <vehicle id="2" filename="data/vehicles/steerable/kramer/kramerKL200.xml" isAbsolute="true" fuelFillLevel="24" vBool="true">
    <component1 position="-40 125.03494262695 -51.999923706055" rotation="3.1388788223267 3.6418890658751e-007 -3.1415913105011" />
    </vehicle>


    Du siehst hier, vBool ist das XML-Attribut, was ich eben angesprochen habe :D


    In der Methode loadFromAttributesAndNodes() suchst du in der Zeile 2 gezielt nach dem Wert des XML-Attributes vBool. Gibt es dieses nicht, ist der Wert automatisch nil. Sofern der Wert nicht nil ist, wird der Wert deiner Variable (self.vBool) gleich dem ausgelesenen Wert gesetzt :)


    MfG

  • Da er von einem Objekt gesprochen hat, würde ich jetzt mal als Einfall Doppelreifen nennen, dann könnte das ganze doch so aussehen:


    [lua]
    self.wheel1 = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.Doppelreifen.reifen1#index"));
    self.wheel1 = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.Doppelreifen.reifen2#index"));
    self.status = Utils.getNoNil(getXMLBool(xmlFile, "vehicle.Doppelreifen#value"), true);
    [/lua]


    XML
    <Doppelreifen value = "false">
    <reifen1 index = "1"/>
    <reifen2 index = "2"/>
    </Doppelreifen>


    Und mit deinem Code zum Speichern und Laden, würde es dann an dem Beispiel Doppelreifen so aussehen:


    [lua] function Class:loadFromAttributesAndNodes(xmlFile, key, resetVehicles)
    local vStatus = getXMLBool(xmlFile, key.."#vStatus");
    if vStatus ~= nil then
    self.status = vStatus;
    end;
    return BaseMission.VEHICLE_LOAD_OK;
    end;


    function Class:getSaveAttributesAndNodes(nodeIdent)
    local attributes = ""
    if self.status ~= nil then
    attributes = 'vStatus="'.. vStatus ..'"';
    end;
    return attributes, nil;
    end; [/lua]


    Ist das so richtig???

  • Hi,


    FIAT80-90DT
    Also so wie ich das lese sollte alles passen.
    Wenn ich das Spiel speichere geht auch alles glatt, es wird nur kein vBool Eintrag in die vehicle.xml geschrieben Oo


    Ich werde das Gefühl nicht los, das da irgendwas im funktion load Bereich nicht stimmt.
    Hier mal der Bereich:
    [lua]
    function balloonWheels:load(xmlFile)
    ...
    self.vBool = false;
    self.balloonWheelsState = false;
    end;
    [/lua]


    Bluebaby210
    Wenn ich es mit:
    [lua]self.status = Utils.getNoNil(getXMLBool(xmlFile, "vehicle.balloonWheels#value"), true);[/lua]
    ...und in der xml Datei das hier schreibe:

    XML
    <balloonWheels value="false">
    <wheelToBalloonRearLeft index="0>3" />
    <wheelToBalloonRearRight index="0>2" />
    <wheelToBalloonFrontLeft index="0>1|0" />
    <wheelToBalloonFrontRight index="0>0|0" />
    </balloonWheels>


    bekomme ich einen lua error:
    attempt to concatenate global 'vStatus' (a nil value)


    Der Fehler bezieht sich auf Zeile 105 im Code welche so aussieht:
    [lua]
    attributes = 'vStatus="'.. vStatus ..'"';
    [/lua]


    Ich denke ich hänge das Script einfach mal an.
    Irgendwie muss das doch funktionieren.


    lg
    Webby

  • Ist ja auch logisch, dass nichts gespeichert wird, da du die locale variable vStatus speicherst, die es nicht gibt :)


    Des Weitern ist mir nicht ganz schlüssig, was du mit der Variable self.status vorhast? Diese ist eigentlich völlig überflüssig ^^.
    Sonst siehts in der load()-Methode ganz okay aus...


    [lua]


    function balloonWheels:loadFromAttributesAndNodes(xmlFile, key, resetVehicles)
    local balloonWheelsState = getXMLBool(xmlFile, key.."#balloonWheelsState"); -- hier lesen wir die vehicles.xml aus und überprüfen ob das balloonWheelsState-Attribut vorhanden ist und geben der lokalen Variable balloonWheelsState den ausgelesenen Wert mit.
    if balloonWheelsState ~= nil then -- ist der Wert nicht nil(also das Attribut ist vorhanden mit true oder false)....
    self.balloonWheelsState = balloonWheelsState; -- ... setzen wir den Wert der Variable self.balloonWheelsState gleich der lokalen Variable balloonWheelsState, also dem ausgelesenen Wert. Dies ist praktisch der selbe Vorgang wie bei einem Tastendruck, nur dass der Wert fest vorgeschrieben ist (eben so, wie er gespeichert wurde)
    end;
    return BaseMission.VEHICLE_LOAD_OK;
    end;


    function balloonWheels:getSaveAttributesAndNodes(nodeIdent)
    local attributes = "" -- hier erzeugen wir zunächst einen leeren String.
    if self.balloonWheelsState ~= nil then -- Ist die Variable self.ballonState nicht nil (sondern true oder false)...
    attributes = 'balloonWheelsState="'.. self.balloonWheelsState ..'"'; --... schreiben wir in den leeren String einen neuen String.
    -- du müsstest dir vorstellen, dass der String nun wiefolgt aussieht :
    -- attributes = 'balloonWheelState="true"'
    -- ODER WENN self.balloonWheelState = false ist
    -- attributes = 'balloonWheelState="false"'
    -- Dieser Teilstring wird also dem Hauptstring hinzugefügt und in der XML gespeichert :)
    end;
    return attributes, nil;
    end;


    [/lua]

  • Morgen,


    ich hab das schon verstanden Fiat. ich verstehe nur nicht warum ich immer noch einen Error kriege Oo
    Was das self.status angeht, ka :D
    Es war schon sehr spät, wahrscheinlich blickte ich gar nichts mehr^^


    Ich hab das mal versucht, was du angehängt hast aber leider auch hier:

    Code
    attempt to concatenate field 'balloonWheelsState' (a boolean value)


    sobald ich versuche zu speichern...


    Hab jetzt auch mal den Statuskram von Bluebaby raus geworfen und auch den extra value Wert aus der fahrzeug.xml.
    Leider der gleiche Fehler, kann es sein, das sich das Script mit einigen anderen nicht verträgt?
    Es sind noch ESLimiter/OpHour Kombi und Waschbar verbaut.


    lg
    Webby

  • Wenn du magst, kann ich mal über deinen gesamten Mod schauen. Eigentlich mache ich das nicht, aber mich hat jetzt der Ehrgeiz gepackt :D


    EDIT :
    ahhh, typisch ich xD.


    Eine boolsche-Variable, also ein Wahrheitswert kann man nicht ohne weiteres in einen String verwandeln, da habe ich nicht aufgepasst :D


    Zeile 105 in meinem angehängten Script müsste wiefolgt aussehen :


    [lua]attributes = ' balloonWheelsState="'.. tostring(self.balloonWheelsState) ..'"';[/lua]
    So wird aus dem boolschen Wert ein String konvertiert, der anschließend mit dem Rest verbunden werden kann :)


    MfG

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!