LUADOC - Farming Simulator 19

FarmlandManager

Description
This class handles all basic functionality for land ownership
Parent
AbstractManager
Functions

addStateChangeListener

Description
Adds a farmland state change listener
Definition
addStateChangeListener(table listener)
Arguments
tablelistenerstate listener
Code
403function FarmlandManager:addStateChangeListener(listener)
404 if listener ~= nil and listener.onFarmlandStateChanged ~= nil then
405 self.stateChangeListener[listener] = listener
406 end
407end

convertWorldToLocalPosition

Description
Converts world to local position
Definition
convertWorldToLocalPosition(float worldPosX, float worldPosZ)
Arguments
floatworldPosXworld position x
floatworldPosZworld position z
Return Values
floatlocalPosXlocal position x
floatlocalPosZlocal position z
Code
386function FarmlandManager:convertWorldToLocalPosition(worldPosX, worldPosZ)
387 local terrainSize = g_currentMission.terrainSize
388 return math.floor(self.localMapWidth * (worldPosX+terrainSize*0.5) / terrainSize),
389 math.floor(self.localMapHeight * (worldPosZ+terrainSize*0.5) / terrainSize)
390end

delete

Description
Deletes farm land manager
Definition
delete()
Code
250function FarmlandManager:delete()
251end

getFarmlandById

Description
Gets farmland by id
Definition
getFarmlandById(integer farmlandId)
Arguments
integerfarmlandIdfarmland id
Return Values
tablefarmlandfarmland object
Code
351function FarmlandManager:getFarmlandById(farmlandId)
352 return self.farmlands[farmlandId]
353end

getFarmlandIdAtWorldPosition

Description
Gets farmland id at given world position
Definition
getFarmlandIdAtWorldPosition(float worldPosX, float worldPosZ)
Arguments
floatworldPosXworld position x
floatworldPosZworld position z
Return Values
integerfarmlandIdfarmland id. if 0, world position is no valid/buyable farmland
Code
291function FarmlandManager:getFarmlandIdAtWorldPosition(worldPosX, worldPosZ)
292 local localPosX, localPosZ = self:convertWorldToLocalPosition(worldPosX, worldPosZ)
293 return getBitVectorMapPoint(self.localMap, localPosX, localPosZ, 0, self.numberOfBits)
294end

getFarmlandOwner

Description
Gets farmland owner
Definition
getFarmlandOwner(integer farmlandId)
Arguments
integerfarmlandIdfarmland id
Return Values
integerfarmIdid of farm. Returns 0 if land is not owned by anyone
Code
278function FarmlandManager:getFarmlandOwner(farmlandId)
279 if farmlandId == nil or self.farmlandMapping[farmlandId] == nil then
280 return FarmlandManager.NO_OWNER_FARM_ID
281 end
282
283 return self.farmlandMapping[farmlandId]
284end

getFarmlands

Description
Gets all farmlands
Definition
getFarmlands()
Return Values
tablefarmlandsall available farmlands
Code
358function FarmlandManager:getFarmlands()
359 return self.farmlands
360end

getIsOwnedByFarmAtWorldPosition

Description
Checks if farm owns given world position
Definition
getIsOwnedByFarmAtWorldPosition(integer farmId, float worldPosX, float worldPosZ)
Arguments
integerfarmIdfarm id
floatworldPosXworld position x
floatworldPosZworld position z
Return Values
booleanisOwnedtrue if farm owns world position point, else false
Code
266function FarmlandManager:getIsOwnedByFarmAtWorldPosition(farmId, worldPosX, worldPosZ)
267 if farmId == FarmlandManager.NO_OWNER_FARM_ID or farmId == nil then
268 return false
269 end
270 local farmlandId = self:getFarmlandIdAtWorldPosition(worldPosX, worldPosZ)
271 return self.farmlandMapping[farmlandId] == farmId
272end

getIsValidFarmlandId

Description
Checks if given farmland-id is valid
Definition
getIsValidFarmlandId(integer farmlandId)
Arguments
integerfarmlandIdfarmland id
Return Values
booleanisValidtrue if id is valid, else false
Code
311function FarmlandManager:getIsValidFarmlandId(farmlandId)
312 if farmlandId == nil or farmlandId == 0 or farmlandId < 0 then
313 return false
314 end
315 if self:getFarmlandById(farmlandId) == nil then
316 return false
317 end
318 return true
319end

getLocalMap

Description
Gets farmland bit vector handle
Definition
getLocalMap()
Return Values
integermapHandleid of bitvector
Code
256function FarmlandManager:getLocalMap()
257 return self.localMap
258end

getOwnedFarmlandIdsByFarmId

Description
Gets list of owned farmland ids for given farm
Definition
getOwnedFarmlandIdsByFarmId(integer farmId)
Arguments
integerfarmIdfarm id
Return Values
farmlandIdstablelist of farmland ids owned by given farm id
Code
370function FarmlandManager:getOwnedFarmlandIdsByFarmId(id)
371 local farmlandIds = {}
372 for farmlandId, farmId in pairs(self.farmlandMapping) do
373 if farmId == id then
374 table.insert(farmlandIds, farmlandId)
375 end
376 end
377 return farmlandIds
378end

initDataStructures

Description
Initialize data structures
Definition
initDataStructures()
Code
27function FarmlandManager:initDataStructures()
28 self.farmlands = {}
29 self.sortedFarmlandIds = {}
30 -- mapping table farmland id to farm id
31 self.farmlandMapping = {}
32 self.localMap = nil
33 self.localMapWidth = 0
34 self.localMapHeight = 0
35 self.numberOfBits = 8
36 self.stateChangeListener = {}
37end

loadFarmlandData

Description
Load data on map load
Definition
loadFarmlandData()
Return Values
booleantrueif loading was successful else false
Code
51function FarmlandManager:loadFarmlandData(xmlFile)
52 local filename = Utils.getFilename(getXMLString(xmlFile, "map.farmlands#densityMapFilename"), g_currentMission.baseDirectory)
53
54 -- number of channels for farmland bit vector
55 self.numberOfBits = Utils.getNoNil(getXMLInt(xmlFile, "map.farmlands#numChannels"), 8)
56 self.pricePerHa = Utils.getNoNil(getXMLFloat(xmlFile, "map.farmlands#pricePerHa"), 60000)
57
58 FarmlandManager.NOT_BUYABLE_FARM_ID = 2^self.numberOfBits-1
59
60 -- load a bitvector
61 self.localMap = createBitVectorMap("FarmlandMap")
62 local success = loadBitVectorMapFromFile(self.localMap, filename, self.numberOfBits)
63 if not success then
64 print("Warning: Loading farmland file '"..tostring(filename).."' failed!")
65 return false
66 end
67
68 self.localMapWidth, self.localMapHeight = getBitVectorMapSize(self.localMap)
69
70 local farmlandSizeMapping = {}
71 local farmlandCenterData = {}
72 local numOfFarmlands = 0
73 local maxFarmlandId = 0
74 local missingFarmlandDefinitions = false
75 for x = 0, self.localMapWidth - 1 do
76 for y = 0, self.localMapHeight - 1 do
77 local value = getBitVectorMapPoint(self.localMap, x, y, 0, self.numberOfBits)
78
79 if value > 0 then
80 if self.farmlandMapping[value] == nil then
81 farmlandSizeMapping[value] = 0
82 farmlandCenterData[value] = {sumPosX=0, sumPosZ=0}
83 self.farmlandMapping[value] = FarmlandManager.NO_OWNER_FARM_ID
84 numOfFarmlands = numOfFarmlands + 1
85 maxFarmlandId = math.max(value, maxFarmlandId)
86 end
87
88 farmlandSizeMapping[value] = farmlandSizeMapping[value] + 1
89 farmlandCenterData[value].sumPosX = farmlandCenterData[value].sumPosX + (x-0.5)
90 farmlandCenterData[value].sumPosZ = farmlandCenterData[value].sumPosZ + (y-0.5)
91 else
92 missingFarmlandDefinitions = true
93 end
94 end
95 end
96
97 if missingFarmlandDefinitions then
98 print("Warning: Farmland-Ids not set for all pixel in farmland-infoLayer!")
99 end
100
101 local isNewSavegame = not g_currentMission.missionInfo.isValid
102
103 local i = 0
104 while true do
105 local key = string.format("map.farmlands.farmland(%d)", i)
106 if not hasXMLProperty(xmlFile, key) then
107 break
108 end
109
110 local farmland = Farmland:new()
111 if farmland:load(xmlFile, key) and self.farmlands[farmland.id] == nil and self.farmlandMapping[farmland.id] ~= nil then
112 self.farmlands[farmland.id] = farmland
113 table.insert(self.sortedFarmlandIds, farmland.id)
114
115 local shouldAddDefaults = isNewSavegame and g_currentMission.missionInfo.hasInitiallyOwnedFarmlands and not g_currentMission.missionDynamicInfo.isMultiplayer
116 if farmland.defaultFarmProperty and shouldAddDefaults and g_currentMission:getIsServer() then
117 self:setLandOwnership(farmland.id, FarmManager.SINGLEPLAYER_FARM_ID)
118 end
119 else
120 if self.farmlandMapping[farmland.id] == nil then
121 print("Error: Farmland-Id " .. tostring(farmland.id) .. " not defined in farmland ownage file '"..filename.."'. Skipping farmland definition!")
122 end
123 if self.farmlands[farmland.id] ~= nil then
124 print("Error: Farmland-id '"..tostring(farmland.id).."' already exists! Ignore it!")
125 end
126 farmland:delete()
127 end
128
129 i = i + 1
130 end
131
132 for index, _ in pairs(self.farmlandMapping) do
133 if index ~= FarmlandManager.NOT_BUYABLE_FARM_ID and self.farmlands[index] == nil then
134 print("Error: Farmland-Id " .. tostring(index) .. " not defined in farmland xml file!")
135 end
136 end
137
138 local transformFactor = g_currentMission.terrainSize / self.localMapWidth
139 local pixelToSqm = transformFactor*transformFactor
140
141 for id, farmland in pairs(self.farmlands) do
142 local ha = MathUtil.areaToHa(farmlandSizeMapping[id], pixelToSqm)
143 farmland:setArea(ha)
144
145 local posX = ((farmlandCenterData[id].sumPosX / farmlandSizeMapping[id]) - self.localMapWidth*0.5) * transformFactor
146 local posZ = ((farmlandCenterData[id].sumPosZ / farmlandSizeMapping[id]) - self.localMapHeight*0.5) * transformFactor
147 self.farmlands[id]:setFarmlandIndicatorPosition(posX, posZ)
148 end
149
150 g_messageCenter:subscribe(MessageType.FARM_DELETED, self.farmDestroyed, self)
151
152 if g_currentMission:getIsServer() then
153 if g_addCheatCommands then
154 -- master user only cheats (will be added in setMasterUserLocal too)
155 addConsoleCommand("gsBuyFarmland", "Buys farmland with given id", "consoleCommandBuyFarmland", self)
156 addConsoleCommand("gsBuyAllFarmlands", "Buys all farmlands", "consoleCommandBuyAllFarmlands", self)
157 addConsoleCommand("gsSellFarmland", "Sells farmland with given id", "consoleCommandSellFarmland", self)
158 addConsoleCommand("gsSellAllFarmlands", "Sells all farmlands", "consoleCommandSellAllFarmlands", self)
159 end
160 end
161
162 return true
163end

loadFromXMLFile

Description
Load farmland ownage data from xml savegame file
Definition
loadFromXMLFile(string filename)
Arguments
stringfilenamexml filename
Code
216function FarmlandManager:loadFromXMLFile(xmlFilename)
217 if xmlFilename == nil then
218 return false
219 end
220
221 local xmlFile = loadXMLFile("farmlandXML", xmlFilename)
222 if xmlFile == 0 then
223 return false
224 end
225
226 local farmlandCounter = 0
227 while true do
228 local key = string.format("farmlands.farmland(%d)", farmlandCounter)
229 local farmlandId = getXMLInt(xmlFile, key .. "#id")
230 if farmlandId == nil then
231 break
232 end
233 local farmId = getXMLInt(xmlFile, key .. "#farmId")
234 if farmId > FarmlandManager.NO_OWNER_FARM_ID then
235 self:setLandOwnership(farmlandId, farmId)
236 end
237
238 farmlandCounter = farmlandCounter + 1
239 end
240
241 delete(xmlFile)
242
243 g_farmManager:mergeFarmlandsForSingleplayer()
244
245 return true
246end

loadMapData

Description
Load data on map load
Definition
loadMapData()
Return Values
booleantrueif loading was successful else false
Code
43function FarmlandManager:loadMapData(xmlFile)
44 FarmlandManager:superClass().loadMapData(self)
45 return XMLUtil.loadDataFromMapXML(xmlFile, "farmlands", g_currentMission.baseDirectory, self, self.loadFarmlandData)
46end

new

Description
Creating manager
Definition
new()
Return Values
tableinstanceinstance of object
Code
20function FarmlandManager:new(customMt)
21 local self = AbstractManager:new(customMt or FarmlandManager_mt)
22 return self
23end

removeStateChangeListener

Description
Removes a farmland state change listener
Definition
removeStateChangeListener(table listener)
Arguments
tablelistenerstate listener
Code
412function FarmlandManager:removeStateChangeListener(listener)
413 if listener ~= nil then
414 self.stateChangeListener[listener] = nil
415 end
416end

saveToXMLFile

Description
Write farmland ownage data to savegame file
Definition
saveToXMLFile(string xmlFilename)
Arguments
stringxmlFilenamefile path
Return Values
booleantrueif loading was successful else false
Code
192function FarmlandManager:saveToXMLFile(xmlFilename)
193 -- save farmland to xml
194 local xmlFile = createXMLFile("farmlandsXML", xmlFilename, "farmlands")
195 if xmlFile ~= nil then
196 local index = 0
197 for farmlandId, farmId in pairs(self.farmlandMapping) do
198 local farmlandKey = string.format("farmlands.farmland(%d)", index)
199 setXMLInt(xmlFile, farmlandKey.."#id", farmlandId)
200 setXMLInt(xmlFile, farmlandKey.."#farmId", Utils.getNoNil(farmId, FarmlandManager.NO_OWNER_FARM_ID))
201 index = index + 1
202 end
203
204 saveXMLFile(xmlFile)
205 delete(xmlFile)
206
207 return true
208 end
209
210 return false
211end

setLandOwnership

Description
Sets farm land ownership
Definition
setLandOwnership(integer farmlandId, integer farmId)
Arguments
integerfarmlandIdfarm land id
integerfarmIdfarm id. set farmid to 0 to sell farm land
Code
325function FarmlandManager:setLandOwnership(farmlandId, farmId)
326 if not self:getIsValidFarmlandId(farmlandId) then
327 return false
328 end
329 if farmId == nil or farmId < FarmlandManager.NO_OWNER_FARM_ID or farmId == FarmlandManager.NOT_BUYABLE_FARM_ID then
330 return false
331 end
332
333 local farmland = self:getFarmlandById(farmlandId)
334 if farmland == nil then
335 print("Warning: Farmland not defined in map!")
336 return
337 end
338
339 self.farmlandMapping[farmlandId] = farmId
340 farmland.isOwned = farmId ~= FarmlandManager.NO_OWNER_FARM_ID
341
342 for _, listener in pairs(self.stateChangeListener) do
343 listener:onFarmlandStateChanged(farmlandId, farmId)
344 end
345end

unloadMapData

Description
Unload data on mission delete
Definition
unloadMapData()
Code
167function FarmlandManager:unloadMapData()
168 removeConsoleCommand("gsBuyFarmland")
169 removeConsoleCommand("gsBuyAllFarmlands")
170 removeConsoleCommand("gsSellFarmland")
171 removeConsoleCommand("gsSellAllFarmlands")
172
173 g_messageCenter:unsubscribeAll(self)
174
175 if self.localMap ~= nil then
176 delete(self.localMap)
177 self.localMap = nil
178 end
179 if (self.farmlands ~= nil) then
180 for _, farmland in pairs(self.farmlands) do
181 farmland:delete()
182 end
183 end
184
185 FarmlandManager:superClass().unloadMapData(self)
186end