Script für variable Arbeitsbreite eines Güllefasses

  • Hi,


    ich bin dabei das Standard Güllefass (Zunhammer 18.500) aus dem Landwirtschaftssimulator etwas zu bearbeiten um es etwas realistischer und detaillierter zu machen.


    Die Eigenschaften in der Fahrzeug.xml und der modDesk habe ich bereits durchgekaut. Nun wollte ich ein kleines Skript schreiben, dass es einem ermöglicht die Arbeitsbreite des Fasses inGame zu variieren.


    Zu diesem Zweck habe ich folgendes aufgesetzt:


    workingWidth.lua
    [expander]


    Das ganze habe ich natürlich in der Fahrzeug.xml hinterlegt



    Code
    <vehicle>
    ...
    <workingArea>
    <startIndex index="0>6|0"/>
    <widthIndex index="0>6|1"/>
    </workingArea>
    ...
    </vehicle>

    [/expander]


    und zu guter letzt auch in die modDesc eingetragen auch mit Hilfetext:




    Kann mir bitte jemand weiterhelfen? Ich sitze hier schon Stunden und komm einfach nicht weiter. Eigentlich müsste das Script doch hinhauen oder? Also der Index Wert passt mit dem in der i3d überein. Hab ich irgendetwas übersehen oder vergessen? Ich finde einfach keinen Fehler.


    Ich wäre wirklich froh wenn mir jemand weiterhelfen könnte. Ich versuche gerade mir das Skripten etwas beizubringen.



    Vielen Dank schonmal

  • Das kann so nie funktionieren. Die workAreas sind Parallelogramme. Ein Parallelogramm kann durch minimal 3 Punkte definiert werden. Du ließt/nutzt aber nur 2. Dir fehlt also mindestens ein Punkt, in diesem Fall der heightIndex. Der hat übrigens nix mit Höhe auf der Y-Achse zu tun, da das Parallelogramm der workArea nur in der X-Z Ebene existiert.


    Du brauchst die Indizes auch gar nicht neu einlesen. Du kannst gleich auf self.workAreas[1].start und analog width und height zugreifen. Bzw wenn du mehrere workAreas hast, müsstest du mit einer Schleife rüber gehen, aber bei einer variablen Breite macht es Sinn nur eine workArea zu verwenden.




    Falls du ein funktionierendes Beispiel mit schrittweiser Verstellung in einem bestimmten Bereich brauchst, kannst du dir das mal angucken (aktuellste Version, WorkAreaManipulation.lua) -> http://fs-uk.com/forum/index.php?topic=167755.0

  • Vielen Dank, ich hab dir die WorkAreaManipulation.lua angeschaut. Naja was soll ich sagen nen Teil kann ich nachvollziehen, einen anderen wieder nicht... so jetzt wollte ich erstmal ein einfaches Script schreiben, um überhaupt mal was in den LS15 zu bekommen. Dabei bin ich auf ein YouTube Tutorial gestoßen. Dieses ist für den LS11 gedacht und Skaliert die Räder.


    Das ganze habe ich einmal in den sampleMod des LS15 eingebaut:


    [expander]

    [/expander]



    Das ganze habe ich natürlich auch in die modDesc eingebaut:
    [expander]

    [/expander]


    Und die entsprechenden Einträge in der Fahrzeug.xml sind auch vorhanden:


    [expander]

    [/expander]



    So nun hab ich wie ihr seht in der modDesc sogar noch einen Hilfetext hinterlegt. Wenn ich das Spiel und den Mod lade, passiert aber einfach gar nichts. Keine log Fehlermeldung... nichts... Ich kann den Mod zwar kaufen und Fahren, aber es ist weder der Hilfetext vorhanden, noch kann ich die Reifen skalieren...


    Wenn ich das ganze Skript in den LS11 einbaue, funktionert es aber einwandfrei... also Schreibfehler kann ja keiner vorhanden sein. Ich weiß echt nicht mehr weiter...


    Ich hoffe ihr könnt mir weiterhelfen... würde wirklich gern bisschen was übers Scripten lernen :) Vielleicht kann mir ja einer bisschen Nachhilfe geben. Villeicht findet sich ja auch jemand, der mir persönlich das Scripten etwas beibringen kann :) ich lerne eigentlich seher schnell und bringe mir auch sehr viel selber bei, aber beim Scripten tue ich mir grade noch sehr schwer.



    Ich bedanke mich schonmal im Vorraus

  • also das in der Hilfebox nichts angezeigt wird ist klar, da der l10n-Text nur für die Optionen (Steuerung umbelegen,..) gilt. Um einen Hilfetext in die Box zu bekommen musst du
    [lua]g_currentMission:addHelpButtonText(g_i18n:getText("TASTE_SCALE"), InputBinding.TASTE_SCALE);[/lua]
    in den draw()-Teil des Scripts einfügen.


    Das nichts gescaled wird könnte daran liegen, dass beim LS15 die Reifen per Script geladen werden und nicht mehr in der i3d vorhanden sind.

  • Grad nur mit Handy online, daher eine kurze Antwort.


    Das Tut gibt es auch hier im Tutorial Bereich, da stehen auch gleich ein paar Anmerkungen dazu was z.b die Abfragen if xxx == true then betrifft. Wenn dann gleich richtig lernen und verstehen.


    Aber, ein Fehler ist in der moddesc bzw vehicles.xml datei, der vehicleType, dort steht "tractor", also Standart type, somit funktionieren nur standart skripte bzw werden sogar, wenn mich nicht alles täuscht, nur die standart spezis geladen.
    Einfach in der moddesc und xml den vehicle type umbenennen in z.b "meinModSchlepper",.bei beiden unbedingt den gleichen type verwenden, daher ist zu empfehlen, z.b in der moddesc schreiben und in die xml des schleppers dann kopieren, denn die beiden Namen müssen gleich sein!
    Dann nochmal testen.

  • Dabei fällt mir jetzt dann auch mal auf das der vehicleType in der Moddesc gar nicht passt, der steht ja noch auf ManureBarrel und hat dann nur eine Spezi, nämlich deine wheelScale.


    Dazu hatte ich ja schon gesagt, Standart Types laden nur die Standart Spezis. Willst du also einen Mod machen, der nur auf Standart läuft, brauchst du den vehicleType in der moddesc gar nicht angeben, da er bereits die orginalen Types und deren Spezis kennt.


    D.h du musst für eigene Scripte immer einen eigenen vehicleType anlegen, wie das geht, hatte ich bereits gesagt. Dazu muss der LS dann wissen, welche Spezis dein Mod besitzt, damit der Ls dann auch weiß, welche Werte aus der XML geladen werden müssen. Hast du also z.B die Spezi "trailer" eingetragen, dann erst werden die Kipp Animationen ausgelesen.


    Welches Fahrzeug welche Spezis hat, kannst du hier nachlesen:
    http://forum.giants-software.c…php?f=827&t=69284#p552016


    Bei den Standartfahrzeugen also immer wieder mal nachsehen welcher vehicleType das jeweils ist, einfach in die xml sehen und du weißt woran du bist.
    Wenn dein Mod mehr funktionen haben soll, so kannst du die Spezis natürlich auch ergänzen, z.B in einen LKW mit Ladefläche dann z.B die Spezis eines trailers eintragen.


    Dabei kann es dann auch immer wieder zu einem Error kommen: "Not all.... are full filled", sprich, nicht alle Bedingungen sind erfüllt. Das heißt dann einfach das du eine Spezi verwendest, die eine andere vorraussetzt, die du nicht verbaut hast.
    Beispiel Trailer Spezi, diese braucht die "fillable" Spezi. Kannst du aber immer in der Script Docu nachlesen, welche Spezis dann jeweils benötigt werden:
    [lua]function Trailer.prerequisitesPresent(specializations)
    return SpecializationUtil.hasSpecialization(Fillable, specializations);
    end;
    [/lua]
    Heißt bei der Trailer Spezi wird die fillable vorrausgesetzt.


    http://www.ls-mods.de/scriptDocumentation.php

  • Vielen Dank nochmal für deine Hilfe. Bin schon ein ganzes Stück weitergekommen und kann bei meinem Fass jetzt in Game die Arbeitsbreite ändern. Jetzt muss ich noch ergänzen, dass das ganze nur zwischen 10 und 18 Metern geht, aber das sollte relativ leicht mit einer "ehile" Funktion implementierbar sein.


    Bisher sieht das ganze so aus:


    [lua] if self:getIsActiveForInput() then
    if InputBinding.isPressed(InputBinding.TASTE_INCREASE) then
    increase = true;
    end;
    if InputBinding.isPressed(InputBinding.TASTE_DECREASE) then
    decrease = true;
    end;
    end;

    if increase == true then
    setTranslation(self.workAreas[1].start, startx - 0.1, starty, startz);
    setTranslation(self.workAreas[1].width, widthx + 0.1, widthy, widthz);
    setTranslation(self.workAreas[1].height, heightx - 0.1, heighty, heightz);
    end;

    if decrease == true then
    setTranslation(self.workAreas[1].start, startx + 0.1, starty, startz);
    setTranslation(self.workAreas[1].width, widthx - 0.1, widthy, widthz);
    setTranslation(self.workAreas[1].height, heightx + 0.1, heighty, heightz);
    end;[/lua]



    Davor wird natürlich noch die aktuelle Position der workArea abgefragt. Wie gesagt, soweit funktionert es schonmal :)


    Nun hätte ich noch eine Frage bzw. ein Problem:


    Das ganze geht ziemlich schnell. Wenn ich die Taste zum erhöhen der Arbeitsbreite drücke geht es ziemlich schnell hoch, klar weil es ja in jedem Frame +0.1 geht. Kann ich irgendwie erreichen, dass das ganze nur jeden 10. Frame oder so aufgerufen wird?


    Grüße

  • Du kannst das ganze im updateTick() durchführen, ist dann etwas langsamer, aber auch lange noch nicht jeder 10.Frame.


    Aber du kannst es ja bei jedem Frame ändern lassen, ist ja nicht das Problem. Das Problem ist bei dir ja scheinbar eher das es zu schnell erhöht wird. In dem Fall machst du es einfach wie ich bei meinem Bankkonto, nämlich den Punkt einfach weiter nach Links schieben... anstatt +0.1/ -0.1, einfach + 0.01/ -0.01, schon geht es 10 mal langsamer ;)

  • Haha :D


    Ich wollte ja dass es in 0,2m Schritten geht aber halt langsamer. Wenn ich z.B. 0,001 schreiben würde, dann würde die Einstellung meiner Meinung nach einfach zuabgestuft erfolgen.


    Ich hab das ganze jetzt umgangen, in dem ich eine Art Taktgeber eingebaut hab, das funktioniert wunderbar ;)


    [lua]self.stroke = self.stroke + 1;

    if self.stroke > 10 then
    self.stroke = 0;
    end;

    if self.stroke == 10 then
    if increase == true then
    setTranslation(self.workAreas[1].start, startx + 0.1, starty, startz);
    setTranslation(self.workAreas[1].width, widthx - 0.1, widthy, widthz);
    setTranslation(self.workAreas[1].height, heightx + 0.1, heighty, heightz);
    end;

    if decrease == true then
    setTranslation(self.workAreas[1].start, startx - 0.1, starty, startz);
    setTranslation(self.workAreas[1].width, widthx + 0.1, widthy, widthz);
    setTranslation(self.workAreas[1].height, heightx - 0.1, heighty, heightz);
    end;
    end;[/lua]


    So wird das ganze jetzt nur jeden jeden 11. Frame verschoben.

  • Du kannst das ganze im updateTick() durchführen


    Input Abfragen gehören im Normalfall im update().



    Generell zum Code:
    Aus Perfomance-Gründen empfiehlt es sich hasEvent() zu benutzen anstatt isPressed(). Lässt sich dann zwar nicht in einer flüssigen Bewegung "animieren", das funktioniert mit der aktuellen Implementation aber auch nicht und ist für diese Anwendung denk ich auch nicht notwendig. Eher sogar hinderlich, weil man schnell übers Ziel hinausschießt. Und wenns irgendwann mal im MP funktionieren soll, dann ist es erst Recht unpassend.


    Anstatt Flags zu benutzen, kannst du auch gleich die TGs verschieben. Mag sich bei zwei Flags wohl nicht bemerkbar machen, aber wenn man so weiter scriptet, wird man das irgendwann bei der Performance merken. Oder gleich in eine Funktion auslagern. Wenns mal im MP funktionieren soll ohnehin Voraussetzung.


    Hast du dir mal überlegt was passiert, wenn die workArea auf der z-Achse gespiegelt ist? Oder wie bei einigen Standardmaschinen eine der Punkte auf der x-Achse auf 0 liegt? Hint: Mit Multiplikation hast du das Problem nicht.

  • So um das ganze etwas realistischer zu machen, wollte ich abhängig davon, auf welche Frucht man Güllefährt, die Ausbringmenge anpassen. Dazu ist es zuerst natürlich einmal erforderlich, zu wissen, auf welcher Pflanze man sich gerade befindet.


    Dazu hab ich hier im forum und auch in anderen Foren etwas rumgesucht.


    Jetz hab ich folgenden Code verfasst:


    [lua]
    local sx,sy,sz = getWorldTranslation(self.workAreas[1].start);
    local wx,wy,wz = getWorldTranslation(self.workAreas[1].width);
    local hx,hy,hz = getWorldTranslation(self.workAreas[1].height);


    self.fruit = Utils.getFruitArea(FruitUtil.FRUITTYPE_GRASS, sx, sz, wx, wz, hx, hz);
    renderText(0.90, 0.65, 0.018, self.fruit);[/lua]


    normalerweise müsste sich doch der Ausgabewert ändern wenn ich auf Gras fahre oder? Auf jeden Fall bekomm ich als Ausgabe immer "nil" egal wo ich fahre...

Jetzt mitmachen!

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