Community Forum

Green Mowing Lua

Forum Overview >> Farming Simulator 19

CategoryFarming Simulator 19
Created20.04.2019 14:29


Sven M. (fsven) (SvenFendt13) 20.04.2019 14:29
Hello,
I converted the Green Mowing Script from FS17 to FS19. In FS17 it was possible to mow the grain in the green state, but if I use the Script in FS19 it doesn't work. Does anyone have experience with scripting here?
Here's the script:
GreenMowing = {};
GreenMowing.SCALE_FACTOR = 0.2;

function GreenMowing.prerequisitesPresent(specializations)
return true;
end;

function GreenMowing:load(savegame)
self.processMowerAreas = Utils.overwrittenFunction(self.processMowerAreas, GreenMowing.processMowerAreas);
self.setEffectEnabled = Utils.overwrittenFunction(self.setEffectEnabled, GreenMowing.setEffectEnabled);
self.updateEffectFillTypes = GreenMowing.updateEffectFillTypes;

local fruitTypesStr = Utils.getNoNil(getXMLString(self.xmlFile, "vehicle.mower#fruitTypes"), "wheat barley oat grass");
local fruitTypes = FruitUtil.getFruitTypesByNames(fruitTypesStr, "Warning ("..self.configFileName.."): Mower has invalid fruitType '%s'.");

self.fruitTypes = {};
if fruitTypes ~= nil then
for _,fruitType in pairs(fruitTypes) do
self.fruitTypes[fruitType] = true;
end;
end;
end;

function GreenMowing:postLoad(savegame)
end;

function GreenMowing:delete()
end;

function GreenMowing:mouseEvent(posX, posY, isDown, isUp, button)
end;

function GreenMowing:keyEvent(unicode, sym, modifier, isDown)
end;

function GreenMowing:update(dt)
end;

function GreenMowing:draw()
end;

function GreenMowing:processMowerAreas(superFunc, workAreas, numWorkAreas, dropAreas, numDropAreas, remainingWindrowToDrop)
local pickedUpWindrow = 0;
local numDropAreasUsed = 0;

for i=1, numWorkAreas do
local area = workAreas[i];

local x0 = area.x;
local z0 = area.z;
local x1 = area.x1;
local z1 = area.z1;
local x2 = area.x2;
local z2 = area.z2;

for fruitType,_ in pairs(self.fruitTypes) do
if Utils.getFruitArea(fruitType, x0,z0, x1,z1, x2,z2, true, true) > 0 then
local areaPixelsSum, _, sprayFactor, ploughFactor, growthState = Utils.cutFruitArea(fruitType, x0,z0, x1,z1, x2,z2, true, true, true);
if areaPixelsSum > 0 then
local multi;
if fruitType == FruitUtil.FRUITTYPE_GRASS then
multi = g_currentMission:getHarvestScaleMultiplier(sprayFactor, 1);
else
multi = g_currentMission:getHarvestScaleMultiplier(sprayFactor, ploughFactor);
end;

areaPixelsSum = areaPixelsSum * multi;
end;

local fillType;

local desc = FruitUtil.fruitIndexToDesc[fruitType];
local minHarvestGrowthState;
if desc.ssOriginalMinHarvestingGrowthState == nil and growthState >= desc.minHarvestingGrowthState then
fillType = FruitUtil.fruitTypeToWindrowFillType[Grass_windrow];
minHarvestGrowthState = desc.minHarvestingGrowthState;
elseif desc.ssOriginalMinHarvestingGrowthState ~= nil and growthState >= desc.ssOriginalMinHarvestingGrowthState then
fillType = FruitUtil.fruitTypeToWindrowFillType[Grass_windrow];
minHarvestGrowthState = desc.ssOriginalMinHarvestingGrowthState;
end;

if fillType == nil then
fillType = FruitUtil.fruitTypeToWindrowFillType[FruitUtil.FRUITTYPE_GRASS];
minHarvestGrowthState = desc.ssOriginalMinHarvestingGrowthState;
if minHarvestGrowthState == nil then
minHarvestGrowthState = desc.minHarvestingGrowthState;
end;
end;


local pixelToSqm = g_currentMission:getFruitPixelsToSqm();
local sqm = areaPixelsSum * pixelToSqm;

local fruitToWindrow = FruitUtil.fruitTypeToWindrowFillType[fruitType];
if fruitToWindrow == nil then
fruitToWindrow = FruitUtil.fruitTypeToWindrowFillType[FruitUtil.FRUITTYPE_GRASS];
end;
local lpsqm = FruitUtil.getFillTypeLiterPerSqm(fruitToWindrow, 1);

if growthState > minHarvestGrowthState then
local dist = minHarvestGrowthState - growthState;
lpsqm = lpsqm * (1 - (GreenMowing.SCALE_FACTOR * dist));
end;

local litersChanged = sqm * lpsqm;

if area.dropArea ~= nil then
dropAreas[area.dropArea].valueAccum = dropAreas[area.dropArea].valueAccum + litersChanged;
dropAreas[area.dropArea].lastFillType = dropAreas[area.dropArea].fillTypeToDrop;
dropAreas[area.dropArea].fillTypeToDrop = fillType;
else
if not area.dropWindrow then
pickedUpWindrow = pickedUpWindrow + litersChanged;
else
local lx_2 = 0.5*(area.x2 - area.x);
local lz_2 = 0.5*(area.z2 - area.z);
local sx = area.x + lx_2;
local sz = area.z + lz_2;
local ex = area.x1 + lx_2;
local ez = area.z1 + lz_2;
local sy = getTerrainHeightAtWorldPos(g_currentMission.terrainRootNode, sx,0,sz);
local ey = getTerrainHeightAtWorldPos(g_currentMission.terrainRootNode, ex,0,ez);

local toDrop = remainingWindrowToDrop + litersChanged;
local dropped, lineOffset = TipUtil.tipToGroundAroundLine(self, toDrop, fillType, sx,sy,sz, ex,ey,ez, 0, nil, self.mowerLineOffset, false, nil, false);
self.mowerLineOffset = lineOffset;
remainingWindrowToDrop = remainingWindrowToDrop + (toDrop - dropped);
end;
end;
end;
end;
end;

local unitLength = TipUtil.densityToWorldMap;

for i=1, numDropAreas do
local area = dropAreas[i];
local widthX = area.x1 - area.x;
local widthZ = area.z1 - area.z;
local widthLength = Utils.vector2Length(widthX, widthZ);
local widthLength_2 = 0.5 * widthLength;

local widthX_norm = widthX / widthLength;
local widthZ_norm = widthZ / widthLength;
local middleX = 0.5 * (area.x1 + area.x);
local middleZ = 0.5 * (area.z1 + area.z);

local sx = middleX + ( widthX_norm * math.max(0, widthLength_2 - unitLength) );
local sz = middleZ + ( widthZ_norm * math.max(0, widthLength_2 - unitLength) );

local ex = middleX - ( widthX_norm * math.max(0, widthLength_2 - unitLength) );
local ez = middleZ - ( widthZ_norm * math.max(0, widthLength_2 - unitLength) );

local sy = getTerrainHeightAtWorldPos(g_currentMission.terrainRootNode, sx,0,sz);
local ey = getTerrainHeightAtWorldPos(g_currentMission.terrainRootNode, ex,0,ez);

local toDrop = area.valueAccum;
local fillType = area.fillTypeToDrop;
if fillType ~= area.lastFillType then
self:updateEffectFillTypes();
end;

local dropped, lineOffset = TipUtil.tipToGroundAroundLine(self, toDrop, fillType, sx,sy,sz, ex,ey,ez, 0, nil, area.mowerLineOffset, false, nil, false);
area.mowerLineOffset = lineOffset;

area.valueAccum = area.valueAccum - dropped;
area.value = dropped;

if dropped > 0 then
numDropAreasUsed = numDropAreasUsed + 1;
end;
end;

return numDropAreasUsed, pickedUpWindrow, remainingWindrowToDrop
end;

function GreenMowing:setEffectEnabled(superFunc, mowerEffect, isActive)
if superFunc ~= nil then
superFunc(self, mowerEffect, isActive);
end;

if self.isClient and isActive then
local dropAreas = self:getTypedWorkAreas(WorkArea.AREATYPE_MOWERDROP);
EffectManager:setFillType(mowerEffect.effects, dropAreas[mowerEffect.mowerCutArea].fillTypeToDrop);
end;
end;

function GreenMowing:updateEffectFillTypes()
if self.isClient then
local dropAreas = self:getTypedWorkAreas(WorkArea.AREATYPE_MOWERDROP);
for _, mowerEffect in pairs(self.mower.effects) do
EffectManager:setFillType(mowerEffect.effects, dropAreas[mowerEffect.mowerCutArea].fillTypeToDrop);
end;
end;
end;

Bilbo Beutlin (BBeutlin) 20.04.2019 14:38
What did you "convert"? The script is still FS17 style and not compatible to FS19. Functions have changed and there are lots of new things to consider for porting to FS19.

Begin with an easier project before working on such a complex one.

Sven M. (fsven) (SvenFendt13) 20.04.2019 16:15
Ok thanks


Note: Log in to post. Create a new account here.