113 | function ExtendedWeedControl:overwriteGameFunctions(pfModule) |
114 | |
115 | pfModule:overwriteGameFunction(FSDensityMapUtil, "setSowingWeedArea", function(superFunc, startWorldX, startWorldZ, widthWorldX, widthWorldZ, heightWorldX, heightWorldZ) |
116 | superFunc(startWorldX, startWorldZ, widthWorldX, widthWorldZ, heightWorldX, heightWorldZ) |
117 | |
118 | local weedSystem = g_currentMission.weedSystem |
119 | |
120 | if weedSystem:getMapHasWeed() then |
121 | local functionData = FSDensityMapUtil.functionCache.setSowingWeedArea |
122 | |
123 | if functionData ~= nil then |
124 | self:updateDensityMapFilter() |
125 | |
126 | if self.filtersInitilized then |
127 | if self.weedFilterDense == nil or self.weedFilterSparse == nil then |
128 | local weedMapId, weedFirstChannel, weedNumChannels = weedSystem:getDensityMapData() |
129 | self.weedFilterDense = DensityMapFilter.new(weedMapId, weedFirstChannel, weedNumChannels, g_currentMission.terrainRootNode) |
130 | self.weedFilterDense:setValueCompareParams(DensityValueCompareType.EQUAL, functionData.denseState) |
131 | |
132 | self.weedFilterSparse = DensityMapFilter.new(weedMapId, weedFirstChannel, weedNumChannels, g_currentMission.terrainRootNode) |
133 | self.weedFilterSparse:setValueCompareParams(DensityValueCompareType.EQUAL, functionData.sparseState) |
134 | end |
135 | |
136 | local weedModifier = functionData.weedModifier |
137 | weedModifier:setParallelogramWorldCoords(startWorldX, startWorldZ, widthWorldX, widthWorldZ, heightWorldX, heightWorldZ, DensityCoordType.POINT_POINT_POINT) |
138 | |
139 | self:clearWeedArea(weedModifier, self.weedFilterDense) |
140 | self:clearWeedArea(weedModifier, self.weedFilterSparse) |
141 | end |
142 | end |
143 | end |
144 | end) |
145 | |
146 | pfModule:overwriteGameFunction(FieldManager, "setFieldGround", function(superFunc, _self, field, ...) |
147 | local ret = superFunc(_self, field, ...) |
148 | |
149 | if field == nil or field.fieldDimensions == nil then |
150 | return false |
151 | end |
152 | |
153 | self:updateDensityMapFilter() |
154 | |
155 | if self.filtersInitilized then |
156 | local numDimensions = getNumOfChildren(field.fieldDimensions) |
157 | for i=1, numDimensions do |
158 | local dimWidth = getChildAt(field.fieldDimensions, i-1) |
159 | local dimStart = getChildAt(dimWidth, 0) |
160 | local dimHeight = getChildAt(dimWidth, 1) |
161 | |
162 | local x, _, z = getWorldTranslation(dimStart) |
163 | local x1, _, z1 = getWorldTranslation(dimWidth) |
164 | local x2, _, z2 = getWorldTranslation(dimHeight) |
165 | |
166 | if _self.weedModifier ~= nil then |
167 | _self.weedModifier:setParallelogramWorldCoords(x, z, x1, z1, x2, z2, DensityCoordType.POINT_POINT_POINT) |
168 | self:clearWeedArea(_self.weedModifier) |
169 | end |
170 | end |
171 | end |
172 | |
173 | return ret |
174 | end) |
175 | |
176 | -- always use a new random seed while cheating field to see different variations |
177 | pfModule:overwriteGameFunction(FieldManager, "consoleCommandSetFieldFruit", function(superFunc, fieldManager, ...) |
178 | self.filtersInitilized = false |
179 | return superFunc(fieldManager, ...) |
180 | end) |
181 | |
182 | pfModule:overwriteGameFunction(AIImplement, "getAILookAheadSize", function(superFunc, vehicle) |
183 | local size = superFunc(vehicle) |
184 | |
185 | -- extend size for weeders and herbicide spraying |
186 | -- use greater size for weeder size the work width is normally smaller |
187 | |
188 | if vehicle.spec_weeder ~= nil then |
189 | return math.max(size, 6) |
190 | end |
191 | |
192 | if vehicle.spec_sprayer ~= nil then |
193 | if vehicle.spec_sprayer.workAreaParameters.sprayFillType == FillType.HERBICIDE then |
194 | return math.max(size, 4) |
195 | end |
196 | end |
197 | |
198 | return size |
199 | end) |
200 | |
201 | pfModule:overwriteGameFunction(Sprayer, "processSprayerArea", function(superFunc, vehicle, workArea, dt) |
202 | self.lastUseSpotSpraying = vehicle.getIsSpotSprayEnabled ~= nil and vehicle:getIsSpotSprayEnabled() |
203 | return superFunc(vehicle, workArea, dt) |
204 | end) |
205 | |
206 | pfModule:overwriteGameFunction(FSDensityMapUtil, "updateHerbicideArea", function(superFunc, startWorldX, startWorldZ, widthWorldX, widthWorldZ, heightWorldX, heightWorldZ, groundType) |
207 | local numPixels, totalNumPixels = superFunc(startWorldX, startWorldZ, widthWorldX, widthWorldZ, heightWorldX, heightWorldZ, groundType) |
208 | |
209 | local weedSystem = g_currentMission.weedSystem |
210 | if weedSystem:getMapHasWeed() then |
211 | local functionData = FSDensityMapUtil.functionCache.updateHerbicideArea |
212 | |
213 | if functionData ~= nil and functionData.weedFilters ~= nil then |
214 | -- allow preventive spraying only on regular sprayers without spot spraying |
215 | if self.lastUseSpotSpraying then |
216 | functionData.weedFilters[1]:setValueCompareParams(DensityValueCompareType.EQUAL, 0) |
217 | functionData.weedFilters[2]:setValueCompareParams(DensityValueCompareType.EQUAL, 0) |
218 | else |
219 | functionData.weedFilters[1]:setValueCompareParams(DensityValueCompareType.EQUAL, 1) |
220 | functionData.weedFilters[2]:setValueCompareParams(DensityValueCompareType.EQUAL, 2) |
221 | end |
222 | end |
223 | end |
224 | |
225 | return numPixels, totalNumPixels |
226 | end) |
227 | end |
92 | function ExtendedWeedControl:setWeedNoiseParameters(minOctave1, numOctave1, persistence1, rangeMin1, rangeMax1, minOctave2, numOctave2, persistence2, rangeMin2, rangeMax2) |
93 | minOctave1, numOctave1, persistence1, rangeMin1, rangeMax1, minOctave2, numOctave2, persistence2, rangeMin2, rangeMax2 = tonumber(minOctave1), tonumber(numOctave1), tonumber(persistence1), tonumber(rangeMin1), tonumber(rangeMax1), tonumber(minOctave2), tonumber(numOctave2), tonumber(persistence2), tonumber(rangeMin2), tonumber(rangeMax2) |
94 | |
95 | self.minOctave1, self.numOctave1, self.persistence1, self.rangeMin1, self.rangeMax1 = minOctave1 or self.minOctave1, numOctave1 or self.numOctave1, persistence1 or self.persistence1, rangeMin1 or self.rangeMin1, rangeMax1 or self.rangeMax1 |
96 | self.minOctave2, self.numOctave2, self.persistence2, self.rangeMin2, self.rangeMax2 = minOctave2 or self.minOctave2, numOctave2 or self.numOctave2, persistence2 or self.persistence2, rangeMin2 or self.rangeMin2, rangeMax2 or self.rangeMax2 |
97 | |
98 | log("Weed Noise Parameters:") |
99 | log(string.format(" minOctave1 %.2f, numOctave1 %.2f, persistence1 %.2f, rangeMin1 %d, rangeMax1 %d", self.minOctave1, self.numOctave1, self.persistence1, self.rangeMin1, self.rangeMax1)) |
100 | log(string.format(" minOctave2 %.2f, numOctave2 %.2f, persistence2 %.2f, rangeMin2 %d, rangeMax2 %d", self.minOctave2, self.numOctave2, self.persistence2, self.rangeMin2, self.rangeMax2)) |
101 | |
102 | self.filtersInitilized = false |
103 | end |