LUADOC - Farming Simulator 22

Script v1_7_1_0

Engine v1_7_1_0

Foundation Reference

EnvironmentalScoreTillage

Parent
EnvironmentalScoreValue
Functions

addWorkedArea

Description
Definition
addWorkedArea()
Code
125function EnvironmentalScoreTillage:addWorkedArea(farmlandId, area, type)
126 local farmlandData = self:getFarmlandData(farmlandId)
127 if farmlandData.workedAreaByType[EnvironmentalScoreTillage.TYPE_NONE] == math.huge then
128 local farmland = g_farmlandManager:getFarmlandById(farmlandId)
129 if farmland ~= nil and farmland.totalFieldArea ~= nil then
130 farmlandData.totalFieldArea = farmland.totalFieldArea * 10000
131 farmlandData.workedAreaByType[EnvironmentalScoreTillage.TYPE_NONE] = farmlandData.totalFieldArea
132 end
133 end
134
135 local changedHa = MathUtil.areaToHa(area, g_currentMission:getFruitPixelsToSqm()) * 10000 -- 4096px are mapped to 2048m
136
137 local toRemove = changedHa
138 while toRemove > 0 do
139 local changed = false
140 for i=0, #farmlandData.workedAreaByType - 1 do
141 if i ~= type then
142 if farmlandData.workedAreaByType[i] > 0 and toRemove > 0 then
143 local change = changedHa / (#farmlandData.workedAreaByType - 1)
144 farmlandData.workedAreaByType[i] = math.max(farmlandData.workedAreaByType[i] - change, 0)
145 toRemove = toRemove - change
146 changed = true
147 end
148 end
149 end
150
151 if not changed then
152 break
153 end
154 end
155
156 if toRemove > 0 then
157 farmlandData.workedAreaByType[type] = farmlandData.workedAreaByType[type] - toRemove
158 end
159
160 farmlandData.workedAreaByType[type] = farmlandData.workedAreaByType[type] + changedHa
161end

getScore

Description
Definition
getScore()
Code
54function EnvironmentalScoreTillage:getScore(farmlandId)
55 local farmlandData = self:getFarmlandData(farmlandId)
56
57 if farmlandData.clientScore ~= nil then
58 return farmlandData.clientScore
59 end
60
61 local scorePct = 0
62 if farmlandData.totalFieldArea > 0 then
63 for i=0, #farmlandData.workedAreaByType do
64 scorePct = scorePct + (math.min(farmlandData.workedAreaByType[i] / farmlandData.totalFieldArea, 1) * self.typeWeights[i])
65 end
66 else
67 scorePct = self.typeWeights[EnvironmentalScoreTillage.TYPE_NONE]
68 end
69
70 return math.min(scorePct, 1)
71end

initFarmlandData

Description
Definition
initFarmlandData()
Code
75function EnvironmentalScoreTillage:initFarmlandData()
76 return {
77 totalFieldArea = 0,
78 workedAreaByType = {
79 [EnvironmentalScoreTillage.TYPE_NONE] = math.huge,
80 [EnvironmentalScoreTillage.TYPE_DEEP_CULTIVATION] = 0,
81 [EnvironmentalScoreTillage.TYPE_FLAT_CULTIVATION] = 0,
82 [EnvironmentalScoreTillage.TYPE_DIRECT_PLANTING] = 0,
83 }
84 }
85end

loadFarmlandData

Description
Definition
loadFarmlandData()
Code
89function EnvironmentalScoreTillage:loadFarmlandData(data, xmlFile, key)
90 data.totalFieldArea = xmlFile:getFloat(key .. "#totalFieldArea", data.totalFieldArea)
91 data.workedAreaByType[EnvironmentalScoreTillage.TYPE_NONE] = xmlFile:getFloat(key .. "#workedAreaNone", data.workedAreaByType[EnvironmentalScoreTillage.TYPE_NONE])
92 data.workedAreaByType[EnvironmentalScoreTillage.TYPE_DEEP_CULTIVATION] = xmlFile:getFloat(key .. "#workedAreaDeep", data.workedAreaByType[EnvironmentalScoreTillage.TYPE_DEEP_CULTIVATION])
93 data.workedAreaByType[EnvironmentalScoreTillage.TYPE_FLAT_CULTIVATION] = xmlFile:getFloat(key .. "#workedAreaFlat", data.workedAreaByType[EnvironmentalScoreTillage.TYPE_FLAT_CULTIVATION])
94 data.workedAreaByType[EnvironmentalScoreTillage.TYPE_DIRECT_PLANTING] = xmlFile:getFloat(key .. "#workedAreaDirect", data.workedAreaByType[EnvironmentalScoreTillage.TYPE_DIRECT_PLANTING])
95end

loadFromXML

Description
Definition
loadFromXML()
Code
39function EnvironmentalScoreTillage:loadFromXML(xmlFile, key, baseDirectory, configFileName, mapFilename)
40 if not EnvironmentalScoreTillage:superClass().loadFromXML(self, xmlFile, key, baseDirectory, configFileName, mapFilename) then
41 return false
42 end
43
44 return true
45end

new

Description
Definition
new()
Code
22function EnvironmentalScoreTillage.new(pfModule, customMt)
23 local self = EnvironmentalScoreValue.new(pfModule, customMt or EnvironmentalScoreTillage_mt)
24
25 self.xmlKey = "tillage"
26
27 self.typeWeights = {
28 [EnvironmentalScoreTillage.TYPE_NONE] = 0.5,
29 [EnvironmentalScoreTillage.TYPE_DEEP_CULTIVATION] = 0,
30 [EnvironmentalScoreTillage.TYPE_FLAT_CULTIVATION] = 0.5,
31 [EnvironmentalScoreTillage.TYPE_DIRECT_PLANTING] = 1,
32 }
33
34 return self
35end

overwriteGameFunctions

Description
Definition
overwriteGameFunctions()
Code
165function EnvironmentalScoreTillage:overwriteGameFunctions(pfModule)
166 if g_server ~= nil then
167 pfModule:overwriteGameFunction(Cultivator, "processCultivatorArea", function(superFunc, vehicle, ...)
168 local realArea, area = superFunc(vehicle, ...)
169
170 if realArea > 0 and vehicle.getPFStatisticInfo ~= nil then
171 local _, _, farmlandId = vehicle:getPFStatisticInfo()
172 if farmlandId ~= nil then
173 self:addWorkedArea(farmlandId, realArea, vehicle.spec_cultivator.useDeepMode and EnvironmentalScoreTillage.TYPE_DEEP_CULTIVATION or EnvironmentalScoreTillage.TYPE_FLAT_CULTIVATION)
174 end
175 end
176
177 return realArea, area
178 end)
179
180 pfModule:overwriteGameFunction(SowingMachine, "processSowingMachineArea", function(superFunc, vehicle, ...)
181 local realArea, area = superFunc(vehicle, ...)
182
183 if realArea > 0 and vehicle.getPFStatisticInfo ~= nil then
184 local _, _, farmlandId = vehicle:getPFStatisticInfo()
185 if farmlandId ~= nil then
186 if vehicle.spec_sowingMachine.useDirectPlanting then
187 self:addWorkedArea(farmlandId, realArea, EnvironmentalScoreTillage.TYPE_DIRECT_PLANTING)
188 end
189 end
190 end
191
192 return realArea, area
193 end)
194
195 pfModule:overwriteGameFunction(FertilizingSowingMachine, "processSowingMachineArea", function(superFunc, vehicle, ...)
196 local realArea, area = superFunc(vehicle, ...)
197
198 if realArea > 0 and vehicle.getPFStatisticInfo ~= nil then
199 local _, _, farmlandId = vehicle:getPFStatisticInfo()
200 if farmlandId ~= nil then
201 if vehicle.spec_sowingMachine.useDirectPlanting then
202 self:addWorkedArea(farmlandId, realArea, EnvironmentalScoreTillage.TYPE_DIRECT_PLANTING)
203 end
204 end
205 end
206
207 return realArea, area
208 end)
209 end
210end

readFarmlandDataFromStream

Description
Definition
readFarmlandDataFromStream()
Code
111function EnvironmentalScoreTillage:readFarmlandDataFromStream(data, streamId, connection)
112 local score = MathUtil.round(streamReadUIntN(streamId, 8) / 255, 2)
113 data.clientScore = score
114end

saveFarmlandData

Description
Definition
saveFarmlandData()
Code
99function EnvironmentalScoreTillage:saveFarmlandData(data, xmlFile, key)
100 if data.workedAreaByType[EnvironmentalScoreTillage.TYPE_NONE] ~= math.huge then
101 xmlFile:setFloat(key .. "#totalFieldArea", data.totalFieldArea)
102 xmlFile:setFloat(key .. "#workedAreaNone", data.workedAreaByType[EnvironmentalScoreTillage.TYPE_NONE])
103 xmlFile:setFloat(key .. "#workedAreaDeep", data.workedAreaByType[EnvironmentalScoreTillage.TYPE_DEEP_CULTIVATION])
104 xmlFile:setFloat(key .. "#workedAreaFlat", data.workedAreaByType[EnvironmentalScoreTillage.TYPE_FLAT_CULTIVATION])
105 xmlFile:setFloat(key .. "#workedAreaDirect", data.workedAreaByType[EnvironmentalScoreTillage.TYPE_DIRECT_PLANTING])
106 end
107end

update

Description
Definition
update()
Code
49function EnvironmentalScoreTillage:update(dt)
50end

writeFarmlandDataToStream

Description
Definition
writeFarmlandDataToStream()
Code
118function EnvironmentalScoreTillage:writeFarmlandDataToStream(data, streamId, connection)
119 local score = self:getScore(data.farmlandId)
120 streamWriteUIntN(streamId, score * 255, 8)
121end