[TUT] Multifrucht in eine Map einbauen

  • Tutorial: Multifrucht in eine Map einbauen

    Hallo,
    nach drei Tagen try and error und einiger Tüftelei habe ich es endlich geschafft in eine Map (Bjornholm) zusätzliche Früchte einzubauen. Mangels eines vollständigen Tutorials ist das gar nicht so einfach, wenn man kein eingefleischter Mapper ist.
    Deshalb habe ich mich nun hingesetzt und dieses Tutorial geschrieben, dieses ist NUR für den LS15 gültig.


    Voraussetzung sind Kenntnisse im Umgang mit dem Giants Editor und Notepad++.


    Dieses Tutorial darf ohne meine Genehmigung nicht weiter verbreitet werden, weder im Original noch in irgendeiner abgeänderten Form.


    Apropos Tutorial, unter anderem habe ich dies hier von Upsidedown benutzt, Teile davon werden auch benötigt.
    LS 15: Tutorial Skripts Materials MultiFruitForMaps v 1.0 Tutorials Mod für Landwirtschafts Simulator 15
    | modhoster.de

    Desweiteren benötigt man für den Transport der Früchte dann natürlich auch entweder entsprechende Fahrzeuge oder nimmt gleich den MultiFruitMod, ebenfalls von Upsidedown.
    LS 15: MultiFruit v 3.0 Scripte Mod für Landwirtschafts Simulator 15
    | modhoster.de

    Diesem Tutorial werde ich KEINE Texturen beilegen, da ich keine fremden Arbeiten zum DL anbieten will, und die Urheber der Texturen irgendwie sehr schwer aufzufinden sind.
    Ich habe die Texturen für Hafer, Roggen und Sonnenblumen aus der "Willkommen in Mecklenburg" und die Texturen für Klee und Luzerne aus der "Ackendorf 1.3"
    LS 15: Willkommen in Mecklenburg v 4.0 Multifruit Maps Mod für Landwirtschafts Simulator 15
    | modhoster.de
    LS 15: Ackendorf v 1.3 Maps Mod für Landwirtschafts Simulator 15
    | modhoster.de


    Hinweis: Wenn ihr eine Map mit den Früchten ausstattet und diese veröffentlichen wollt, kümmert Euch bitte um Freigaben für die Texturen oder besorgt Euch Texturen die frei genutzt werden können.

    Das Tutorial basiert hinsichtlich der Registrierung der Früchte auf der additionalFruitTypes.lua, welche im oben verlinkten Tutorial von Upsidedown zu finden und auch erklärt ist.

    Ich habe die einzelnen Abschnitte, welche kopiert werden müssen so ausgelegt, dass sich in der map.i3d die FileID´s eigentlich nicht mit bestehenden ID´s überschneiden sollten.
    Eingebaut werden mit diesem Tutorial die Früchte Roggen (rye), Hafer (oat), Sonnenblumen (sunflower), Luzerne und Klee.

    Die zu kopierenden Texte füge ich als Anhang in Form einer .xml Datei für den Eigengebrauch an, dann könnt ihr alles nur per Copy & Paste übernehmen.

    Bevor ihr anfangt: Bitte auch den zweiten Beitrag zuerst lesen.

    Anpassen der SampleModMap.lua
    Dieser Schritt ist im Tutorial von Upsidedown (siehe oben) erklärt. Hier wird die additionalFruittypes.lua aufgerufen. Da das sein Tutorial ist, gehe ich darauf an dieser Stelle nicht näher ein.
    Hinweis: In der Anleitung im Tutorial ist im Eintrag für die SampleModMap.lua ein anderer Pfad zur additionalFruitTypes.lua angegeben, als in meinem Abschnitt, der in der angehängten Datei ist.
    Diesen Pfad bitte prüfen und gegebenenfalls anpassen, bzw. die additionalFruitTypes.lua an den richtigen Ort kopieren.
    Dies ist "meine" Variante aus der "Anleitung.xml" im Anhang, was auch dem Screenshot mit der Ordnerstruktur entspricht:
    local additionalFruitTypesPath = Utils.getFilename('map/scripts/additionalFruitTypes.lua', baseDirectory);

    Die folgenden Einträge gehen von folgender Ordnerstruktur aus:


    Anpassen der Moddesc.xml:
    Einfügen der Texte und Übersetzungen:


    Wenn ihr den Abschnitt <l10n> schon habt, dann nur dort ergänzen.


    Nach dem </l10n> wird dann dieser Abschnitt eingefügt:

    XML
    <AdditionalFruitTypes hudDirectory="map/fruitHuds/">
    <fruitType name="oat" needsSeeding="true" allowsSeeding="true" useSeedingWidth="false" directionSnapAngle="0" minHarvestingGrowthState="4" maxHarvestingGrowthState="6" cutState="8" allowsPartialGrowthState="false" pricePerLiter="0.31" literPerSqm="1.2" massPerLiter="0.00025" seedUsagePerSqm="0.05" partOfEconomy="true" fruitMapColor="242, 255, 158, 1" hasWindrow="true" windrowPricePerLiter="0.04" windrowLiterPerSqm="2.5" windrowMassPerLiter="0.00003" forageWagonConversion="wheat" substituteBales="wheat"/> 
    <fruitType name="rye" needsSeeding="true" allowsSeeding="true" useSeedingWidth="false" directionSnapAngle="0" minHarvestingGrowthState="4" maxHarvestingGrowthState="6" cutState="8" allowsPartialGrowthState="false" pricePerLiter="0.323" literPerSqm="1.1" massPerLiter="0.00034" seedUsagePerSqm="0.05" partOfEconomy="true" fruitMapColor="70, 53, 255, 1" hasWindrow="true" windrowPricePerLiter="0.04" windrowLiterPerSqm="2.5" windrowMassPerLiter="0.00003" forageWagonConversion="wheat" substituteBales="wheat"/>
    <fruitType name="sunflower" needsSeeding="true" allowsSeeding="true" useSeedingWidth="false" directionSnapAngle="0" minHarvestingGrowthState="4" maxHarvestingGrowthState="6" cutState="8" allowsPartialGrowthState="false" pricePerLiter="0.315" literPerSqm="1.2" massPerLiter="0.00021" seedUsagePerSqm="0.08" partOfEconomy="true" fruitMapColor="176, 255, 117, 1" hasWindrow="false"/> 
    <fruitType name="luzerne" needsSeeding="true" allowsSeeding="true" useSeedingWidth="false" directionSnapAngle="0" minHarvestingGrowthState="4" maxHarvestingGrowthState="6" cutState="1" allowsPartialGrowthState="false" pricePerLiter="0.75" literPerSqm="1.3" massPerLiter="0.0003" seedUsagePerSqm="0.05" partOfEconomy="false" fruitMapColor="178, 0, 255, 1" hasWindrow="true" windrowPricePerLiter="0.04" windrowLiterPerSqm="1.25" windrowMassPerLiter="0.00003" forageWagonConversion="grass"/>
    <fruitType name="klee" needsSeeding="true" allowsSeeding="true" useSeedingWidth="false" directionSnapAngle="0" minHarvestingGrowthState="4" maxHarvestingGrowthState="6" cutState="1" allowsPartialGrowthState="false" pricePerLiter="0.75" literPerSqm="1.3" massPerLiter="0.0003" seedUsagePerSqm="0.05" partOfEconomy="false" fruitMapColor="20, 50, 255, 1" hasWindrow="true" windrowPricePerLiter="0.04" windrowLiterPerSqm="1.25" windrowMassPerLiter="0.00003" forageWagonConversion="grass"/>	
    	</AdditionalFruitTypes>


    Luzerne und Klee haben mit diesen Einträgen einen sehr hohen Ertrag beim Häckseln. Ich vermute, das wird über "literPerSqm" gesteuert. Da kenne ich mich allerdings (noch) nicht aus. Ideal wäre wenn man den Wert von Gras oder Mais kennen würde. Wem es zu viel ist kann ja mal damit spielen.


    Das war es schon in der Moddesc.xml. Speichern und fertig.


    Nun kommt die Bearbeitung der map.i3d. Vorher unbedingt eine Sicherheitskopie dieser Datei anfertigen. Wie immer.

    Änderungen in der map.i3d:

    Einfügen im Abschnitt <files>:

    Hier seht ihr auch schon, wo in welchem Ort welche Textur liegen muss. Anbei aber zur Verdeutlichung Screenshots, einfach den Pfad in der Adressleiste beachten.



    Einfügen im Abschnitt <Materials>:


    Bitte überprüfen: Die customShaderId="46" und "48" mit den Einträgen Eurer Map bei wheat vergleichen, die müssen identisch sein. Bei mir war das jetzt bei drei Maps immer identisch.
    Sollten sie nicht identisch sein, dann anpassen an die Werte von folgenden Material Einträgen:
    <Material name="foliageWheat_mat" und <Material name="wheatWindrow_mat"


    Und zuletzt im Abschnitt <FoliageMultiLayer>


    XML
    <FoliageSubLayer name="rye" densityMapTypeIndex="10" densityMapChannelOffset="4" numDensityMapChannels="4" materialId="9800" cellSize="8" viewDistance="80" objectMask="65520" distanceMapIds="38;9200;9300;9400;9500;9500;9500;9600;9700" distanceMapUnitSizes="128;128;128;128;128;128;128;128;128" atlasSize="1" atlasOffsets="1 0" numBlocksPerUnit="1.4" width="1.5" height=";0.25;0.5;0.9;1;1;1;0.9;0.13" texCoords=";0 0 0.25 0.25;0 0.5 0.25 0.5;0.25 0 0.25 1;0.5 0 0.25 1;0.5 0 0.25 1;0.5 0 0.25 1;0.75 0 0.25 0.75;0.5 0 0.25 0.144" widthVariance="0" heightVariance="0.2" horizontalPositionVariance="0.5" numStates="9" growthNumStates="8" growthStateTime="2.4e+007"/>
    <FoliageSubLayer name="rye_windrow" densityMapTypeIndex="10" densityMapChannelOffset="8" numDensityMapChannels="4" materialId="93300" cellSize="8" viewDistance="80" objectMask="65520" distanceMapIds="9500" distanceMapUnitSizes="128" repeatLastDistanceMap="true" atlasSize="1" atlasOffsets="1 0" numBlocksPerUnit="1.5" width="1.7" height="0.4;0.44;0.48;0.52;0.56;0.6;0.64;0.68;0.72;0.76;0.8;0.84;0.88;0.92;0.96" widthVariance="0" heightVariance="0.01" horizontalPositionVariance="0.1" numStates="15" blockShapeId="7"/>
    <FoliageSubLayer name="oat" densityMapTypeIndex="11" densityMapChannelOffset="4" numDensityMapChannels="4" materialId="5900" cellSize="8" viewDistance="80" objectMask="65520" distanceMapIds="38;10000;10100;10200;10300;10300;10300;10400;10500" distanceMapUnitSizes="1;128;128;128;128;128;128;128;128" atlasSize="1" atlasOffsets="1 0" numBlocksPerUnit="1.4" width="1.5" height=";0.25;0.5;0.9;1;1;1;0.9;0.13" texCoords=";0 0 0.25 0.25;0 0.5 0.25 0.5;0.25 0 0.25 1;0.5 0 0.25 1;0.5 0 0.25 1;0.5 0 0.25 1;0.75 0 0.25 0.75;0.5 0 0.25 0.144" widthVariance="0" heightVariance="0.2" horizontalPositionVariance="0.5" numStates="9" growthNumStates="8" growthStateTime="2.4e+007"/>
    <FoliageSubLayer name="oat_windrow" densityMapTypeIndex="11" densityMapChannelOffset="8" numDensityMapChannels="4" materialId="99200" cellSize="8" viewDistance="80" objectMask="65520" distanceMapIds="10300" distanceMapUnitSizes="128" repeatLastDistanceMap="true" atlasSize="1" atlasOffsets="1 0" numBlocksPerUnit="1.5" width="1.7" height="0.4;0.44;0.48;0.52;0.56;0.6;0.64;0.68;0.72;0.76;0.8;0.84;0.88;0.92;0.96" widthVariance="0" heightVariance="0.01" horizontalPositionVariance="0.1" numStates="15" blockShapeId="7"/>
    <FoliageSubLayer name="sunflower" densityMapTypeIndex="9" densityMapChannelOffset="4" numDensityMapChannels="4" materialId="56300" cellSize="8" viewDistance="80" objectMask="65520" distanceMapIds="38;10800;10900;11000;11100;11100;11100;11200;11300" distanceMapUnitSizes="128;128;128;128;128;128;128;128;128" atlasSize="1" atlasOffsets="1 0" numBlocksPerUnit="1.4" width=";0.25;0.6;1.4;1.6;1.6;1.6;1.2;1.6" height=";0.25;0.6;1.4;1.6;1.6;1.6;1.2;1.6" texCoords=";0 0 1 1" widthVariance="0" heightVariance="0.2" horizontalPositionVariance="0.5" numStates="9" growthNumStates="8" growthStateTime="2.4e+007" blockShapeId=";12;13;14;15;15;15;16;17;"/>
    <FoliageSubLayer name="klee" densityMapTypeIndex="12" densityMapChannelOffset="5" numDensityMapChannels="4" materialId="144900" cellSize="8" viewDistance="80" objectMask="65520" distanceMapIds="38;11500;11600;11700;11800;11800;11800;11900;11800" distanceMapUnitSizes="128;128;128;128;128;128;128;128;128" atlasSize="1" atlasOffsets="1 0" numBlocksPerUnit="1.2" width="1.5" height=";0.25;0.5;0.9;1;1;1;0.9;0.13" texCoords=";0 0 0.25 0.25;0 0.5 0.25 0.5;0.25 0 0.25 1;0.5 0 0.25 1;0.5 0 0.25 1;0.5 0 0.25 1;0.75 0 0.25 0.75;0.5 0 0.25 0.144" widthVariance="0" heightVariance="0.2" horizontalPositionVariance="0.5" numStates="9" growthNumStates="7" growthStateTime="1.9e+007"/>
    <FoliageSubLayer name="klee_windrow" densityMapTypeIndex="12" densityMapChannelOffset="8" numDensityMapChannels="4" materialId="79100" cellSize="8" viewDistance="80" objectMask="65520" distanceMapIds="50" distanceMapUnitSizes="128" repeatLastDistanceMap="true" atlasSize="1" atlasOffsets="1 0" numBlocksPerUnit="1.2" width="1.3" height="0.4;0.44;0.48;0.52;0.56;0.6;0.64;0.68;0.72;0.76;0.8;0.84;0.88;0.92;0.96" widthVariance="0" heightVariance="0.01" horizontalPositionVariance="0.1" numStates="15" blockShapeId="7"/>
    <FoliageSubLayer name="luzerne" densityMapTypeIndex="13" densityMapChannelOffset="5" numDensityMapChannels="4" materialId="65700" cellSize="8" viewDistance="80" objectMask="65520" distanceMapIds="38;12200;12300;12400;12500;12500;12500;12600;12700" distanceMapUnitSizes="128;128;128;128;128;128;128;128;128" atlasSize="1" atlasOffsets="1 0" numBlocksPerUnit="1.2" width="1.4" height=";0.25;0.5;0.9;1;1;1;0.9;0.13" texCoords=";0 0 0.25 0.25;0 0.5 0.25 0.5;0.25 0 0.25 1;0.5 0 0.25 1;0.5 0 0.25 1;0.5 0 0.25 1;0.75 0 0.25 0.75;0.5 0 0.25 0.144" widthVariance="0" heightVariance="0.2" horizontalPositionVariance="0.5" numStates="9" growthNumStates="7" growthStateTime="1.9e+007"/>
    <FoliageSubLayer name="luzerne_windrow" densityMapTypeIndex="13" densityMapChannelOffset="8" numDensityMapChannels="4" materialId="75100" cellSize="8" viewDistance="80" objectMask="65520" distanceMapIds="50" distanceMapUnitSizes="128" repeatLastDistanceMap="true" atlasSize="1" atlasOffsets="1 0" numBlocksPerUnit="1.2" width="1.3" height="0.4;0.44;0.48;0.52;0.56;0.6;0.64;0.68;0.72;0.76;0.8;0.84;0.88;0.92;0.96" widthVariance="0" heightVariance="0.01" horizontalPositionVariance="0.1" numStates="15" blockShapeId="7"/>

    Wichtig im Bereich FoliageSubLayer:
    In den Zeilen mit rye_windrow oat_windrow klee_windrow und luzerne_windrow den Eintrag bei blockShapeId kontrollieren. In meinem obigen Beispiel ist dies die 7. Diese Zahl muss mit der blockShapeID bei wheat_windrow identisch sein. Sonst sieht die Schwad bescheiden aus (um es mal harmlos auszudrücken).


    Das ist der Abschnitt, der mit folgenden Zeilen beginnt:

    XML
    <InfoLayer name="infoLayer" fileId="36" numChannels="4"/>
            <FoliageMultiLayer densityMapId="37" numChannels="12" numTypeIndexChannels="4">
              <FoliageSubLayer name="wheat" densityMapTypeIndex="1" densityMapChannelOffset="4" numDensityMapChannels="4"

    ACHTUNG: Wenn ihr nach dem Einbau mehr als 12 Früchte habt, muss numChannels="12" in numChannels="16" geändert werden.


    Das war es dann schon.

    Nachdem die map.i3d geändert wurde, die Map einmal mit dem GE laden und speichern. Im Scriptfenster sollten dabei keine Fehler erscheinen.

    Zuletzt muss man dann natürlich bei den Silos und Verkaufsstellen die Früchte und Price Multiplier eintragen:

    Man kann dann auch noch so genannte Material Holder einbauen, dies ist im oben genannten Tutorial von UpdsideDown erklärt. Diese dienen dazu, dass auch die richtigen Füllplanen und Partikelanimationen genutzt werden und nicht die von Weizen und Raps. Da ich auch hier wieder nicht die Besitzrechte der i3d Dateien kenne, habe ich auf das hochladen der Dateien verzichtet.
    Diese sind im Ordner "multiFruit" (Screenshot ganz oben) der "Willkommen in Mecklenburg* zu finden. Ein Beispiel für "oat" ist aber auch beim Tutorial von Upsidedown dabei.


    An dieser Stelle nochmals vielen Dank an Upsidedown für das oben genannte Tutorial.

  • Nun möchte ich noch auf einige Details eingehen, als Beispiel dient Roggen.

    Wenn man sich wie ich die Einträge aus einer Map kopiert, schaut das zusammengefasst so aus:

    Zu beachten ist dabei:
    - die FileId von 92 bis 98
    - diese kommt dann auch im Material bei Texture fileID="98" vor.
    - die MaterialId="98", diese kommt im FoliageSubLayer auch vor.
    - die distanceMapIds="38;92;93;94;95;95;95;96;97" -- Diese Zahlen entsprechen den FileID's der entsprechenden Texturen.

    Wobei hier die erste Zahl immer dem ersten Wert des FoliageSubLayer von "wheat" entsprechen muss, typischerweise ist es eben die 38.
    Ist der Wert wie auf der Heimenkirch Map anders, dann muss der auch bei den distanceMapIds geändert werden.

    Wie ihr an meinem obigen Beispiel im ersten Beitrag gesehen habt, sind dort die gleichen Einträge so:


    Wie ihr seht, habe ich alle Zahlen um zwei Nullen erweitert. Das ist wichtig, damit die ganzen IDs beim einfügen in eine andere Map nicht doppelt belegt sind, sonst hagelt es Fehler im GE.
    Nachdem man die Map im GE geladen und gespeichert hat, werden die Zahlen vom GE angepasst.

    Also wichtig nochmals, wenn ihr eine weitere Frucht einbauen wollt müsst ihr für folgende Einträge hohe IDs vergeben.

    - fileID im Abschnitt Files
    - MaterialID im Abschnitt Material
    - distanceMapIds im Abschnitt FoliageSubLayer.
    - blockShapeID kontrollieren


    Bei den Schwaden von Luzerne und Klee - zu erkennen am "windrow" im Namen ist es immer nur eine distanceMapID, normalerweise die 50, kann man sich aber auch beim FoliageSubLayer für "grass_windrow" abschauen.

    Ich hoffe, ihr könnt mit dem kleinen Tutorial etwas anfangen.

    Am Schluss sollte es ingame dann so ausschauen:


    Patrick

    • Offizieller Beitrag

    Vielen Herzlichen Dank für dieses geile Tutorial!

    Ich habe seit dem LS 11 in einige Maps schon neue Früchte eingebaut, allerdings meistens nach dem "try and error" prinzip, da viele der Tutorials einfach unvollständig waren. Vor allem wenn die FileID's zickig waren musste regelmäßig gegoogelt werden. Und das die auch für die DistanceMaps verwendet werden, hatte ich ebenfalls keine Ahnung...

    Schade finde ich einzig und allein (aber die Kritik geht Richtung Giants, nicht an dich), das für den Einbau neuer Früchte noch kein einheitlicher Standard geschaffen wurde, der es evtl. ermöglicht, eine Schnittstelle zwischen Feldfrucht und Erntevorsatz herzustellen. Beziehe mich hier in erster Linie auf die Einzugsanimationen beim Mähdrescher. Denn entweder bekommt man es hin (bzw. die Erlaubnis), die Schneidwerksanimation umzubasteln, das die Textur im Schneidwerk zur Textur aufm Feld passt, oder man erntet Mais und bekommt Sonnenblumenkerne raus... Zukunftsmusik, von der ich schon lange träume...

    Kann mich nur nochmal wiederholen: Geiles Tutorial !!! :easypeasy::held:

  • Hallo Patrick,

    erstmal großes Lob für das sehr schöne Tutorial! Das beste, wenn es um Fruchteinbau geht. Wenn man sich daran hält, sollte es keine Probleme geben. Um auf deine Fragen einzugehen:

    Luzerne und Klee haben mit diesen Einträgen einen sehr hohen Ertrag beim Häckseln. Ich vermute, das wird über "literPerSqm" gesteuert.


    Das stimmt.

    Ideal wäre wenn man den Wert von Gras oder Mais kennen würde. Wem es zu viel ist kann ja mal damit spielen.


    Mais und Gras haben standardmäßig 1.2 bei der "literPerSqm" angegeben, ist also eigendlich nicht viel um.. Aber zur Not kann man ja bei Luzerne und Klee mit dem Wert noch weiter runter gehen, bis man zufrieden ist.. :D

    MFG Ifko 8)

  • Einfach nur TOLL :thumbup:
    Anfangs hatte ich mir schwer getan es zu begreifen und ein Thema erstellt nach dem ich es schon drei mal versucht hatte (hatte immer 2 fehler gemacht), im Thema Patrick hast du mir super geholfen und als ich dein TUT dann erst richtig begriffen habe war es ganz einfach und ich mache es schon bei einer zweiten map wie du es mir geraten hast :)
    Auf jeden Fall ist ein SUPER TUT und vielen vielen dank das es so Leute wie dich gibt Patrick die so etwas erstellen und zur verfügung stellen !

    gLg Martin