Script v1_7_1_0
- AI
- Animals
- Collections
- Contracts
- Debug
- Economy
- Elements
- EnvironmentalScore
- EnvironmentalScore
- EnvironmentalScoreHerbici...
- EnvironmentalScoreNitroge...
- EnvironmentalScorePH
- EnvironmentalScoreSoilSam...
- EnvironmentalScoreTillage
- EnvironmentalScoreValue
- Errors
- Events
- GUI
- Handtools
- Hud
- I3d
- Input
- Jobs
- Maps
- Materials
- Misc
- Objects
- Parameters
- Placeables
- Placement
- Player
- Shop
- Sounds
- Specialization
- Specializations
- StateMachine
- Statistics
- Tasks
- Triggers
- Utils
- Vehicles
Engine v1_7_1_0
- AI
- Animation
- Camera
- Entity
- Fillplanes
- general
- General
- I3D
- Input
- Lighting
- Math
- Network
- Node
- NoteNode
- Overlays
- Particle System
- Physics
- Rendering
- Scenegraph
- Shape
- Sound
- Spline
- String
- Terrain Detail
- Text Rendering
- Tire Track
- VoiceChat
- XML
Foundation Reference
EnvironmentalScoreTillage
ParentEnvironmentalScoreValueFunctions
- addWorkedArea
- getScore
- initFarmlandData
- loadFarmlandData
- loadFromXML
- new
- overwriteGameFunctions
- readFarmlandDataFromStream
- saveFarmlandData
- update
- writeFarmlandDataToStream
addWorkedArea
DescriptionDefinitionaddWorkedArea()Code
125 | function 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 |
161 | end |
getScore
DescriptionDefinitiongetScore()Code
54 | function 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) |
71 | end |
initFarmlandData
DescriptionDefinitioninitFarmlandData()Code
75 | function 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 | } |
85 | end |
loadFarmlandData
DescriptionDefinitionloadFarmlandData()Code
89 | function 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]) |
95 | end |
loadFromXML
DescriptionDefinitionloadFromXML()Code
39 | function 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 |
45 | end |
new
DescriptionDefinitionnew()Code
22 | function 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 |
35 | end |
overwriteGameFunctions
DescriptionDefinitionoverwriteGameFunctions()Code
165 | function 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 |
210 | end |
readFarmlandDataFromStream
DescriptionDefinitionreadFarmlandDataFromStream()Code
111 | function EnvironmentalScoreTillage:readFarmlandDataFromStream(data, streamId, connection) |
112 | local score = MathUtil.round(streamReadUIntN(streamId, 8) / 255, 2) |
113 | data.clientScore = score |
114 | end |
saveFarmlandData
DescriptionDefinitionsaveFarmlandData()Code
99 | function 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 |
107 | end |
update
DescriptionDefinitionupdate()Code
49 | function EnvironmentalScoreTillage:update(dt) |
50 | end |
writeFarmlandDataToStream
DescriptionDefinitionwriteFarmlandDataToStream()Code
118 | function EnvironmentalScoreTillage:writeFarmlandDataToStream(data, streamId, connection) |
119 | local score = self:getScore(data.farmlandId) |
120 | streamWriteUIntN(streamId, score * 255, 8) |
121 | end |