Script v1.7.1.0
- AI
- Animals
- Contracts
- Debug
- Economy
- Effects
- Events
- Farms
- GUI
- Handtools
- I3d
- Materials
- Misc
- Objects
- Placeables
- Player
- Shop
- Sounds
- Specializations
- Triggers
- Utils
- Vehicles
- Weather
Engine v1.7.1.0
- AI
- Animation
- Camera
- Entity
- Fillplanes
- General
- I3D
- Input
- Lighting
- Math
- Network
- Node
- Overlays
- Particle System
- Physics
- Rendering
- Scenegraph
- Shape
- Sound
- Spline
- String
- Terrain Detail
- Text Rendering
- Tire Track
- XML
- general
Foundation Reference
FarmlandManager
DescriptionThis class handles all basic functionality for land ownershipParent
AbstractManagerFunctions
- addStateChangeListener
- convertWorldToLocalPosition
- delete
- getFarmlandById
- getFarmlandIdAtWorldPosition
- getFarmlandOwner
- getFarmlands
- getIsOwnedByFarmAtWorldPosition
- getIsValidFarmlandId
- getLocalMap
- getOwnedFarmlandIdsByFarmId
- initDataStructures
- loadFarmlandData
- loadFromXMLFile
- loadMapData
- new
- removeStateChangeListener
- saveToXMLFile
- setLandOwnership
- unloadMapData
addStateChangeListener
DescriptionAdds a farmland state change listenerDefinition
addStateChangeListener(table listener)Arguments
table | listener | state listener |
403 | function FarmlandManager:addStateChangeListener(listener) |
404 | if listener ~= nil and listener.onFarmlandStateChanged ~= nil then |
405 | self.stateChangeListener[listener] = listener |
406 | end |
407 | end |
convertWorldToLocalPosition
DescriptionConverts world to local positionDefinition
convertWorldToLocalPosition(float worldPosX, float worldPosZ)Arguments
float | worldPosX | world position x |
float | worldPosZ | world position z |
float | localPosX | local position x |
float | localPosZ | local position z |
386 | function 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) |
390 | end |
delete
DescriptionDeletes farm land managerDefinition
delete()Code
250 | function FarmlandManager:delete() |
251 | end |
getFarmlandById
DescriptionGets farmland by idDefinition
getFarmlandById(integer farmlandId)Arguments
integer | farmlandId | farmland id |
table | farmland | farmland object |
351 | function FarmlandManager:getFarmlandById(farmlandId) |
352 | return self.farmlands[farmlandId] |
353 | end |
getFarmlandIdAtWorldPosition
DescriptionGets farmland id at given world positionDefinition
getFarmlandIdAtWorldPosition(float worldPosX, float worldPosZ)Arguments
float | worldPosX | world position x |
float | worldPosZ | world position z |
integer | farmlandId | farmland id. if 0, world position is no valid/buyable farmland |
291 | function FarmlandManager:getFarmlandIdAtWorldPosition(worldPosX, worldPosZ) |
292 | local localPosX, localPosZ = self:convertWorldToLocalPosition(worldPosX, worldPosZ) |
293 | return getBitVectorMapPoint(self.localMap, localPosX, localPosZ, 0, self.numberOfBits) |
294 | end |
getFarmlandOwner
DescriptionGets farmland ownerDefinition
getFarmlandOwner(integer farmlandId)Arguments
integer | farmlandId | farmland id |
integer | farmId | id of farm. Returns 0 if land is not owned by anyone |
278 | function 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] |
284 | end |
getFarmlands
DescriptionGets all farmlandsDefinition
getFarmlands()Return Values
table | farmlands | all available farmlands |
358 | function FarmlandManager:getFarmlands() |
359 | return self.farmlands |
360 | end |
getIsOwnedByFarmAtWorldPosition
DescriptionChecks if farm owns given world positionDefinition
getIsOwnedByFarmAtWorldPosition(integer farmId, float worldPosX, float worldPosZ)Arguments
integer | farmId | farm id |
float | worldPosX | world position x |
float | worldPosZ | world position z |
boolean | isOwned | true if farm owns world position point, else false |
266 | function 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 |
272 | end |
getIsValidFarmlandId
DescriptionChecks if given farmland-id is validDefinition
getIsValidFarmlandId(integer farmlandId)Arguments
integer | farmlandId | farmland id |
boolean | isValid | true if id is valid, else false |
311 | function 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 |
319 | end |
getLocalMap
DescriptionGets farmland bit vector handleDefinition
getLocalMap()Return Values
integer | mapHandle | id of bitvector |
256 | function FarmlandManager:getLocalMap() |
257 | return self.localMap |
258 | end |
getOwnedFarmlandIdsByFarmId
DescriptionGets list of owned farmland ids for given farmDefinition
getOwnedFarmlandIdsByFarmId(integer farmId)Arguments
integer | farmId | farm id |
farmlandIds | table | list of farmland ids owned by given farm id |
370 | function 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 |
378 | end |
initDataStructures
DescriptionInitialize data structuresDefinition
initDataStructures()Code
27 | function 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 = {} |
37 | end |
loadFarmlandData
DescriptionLoad data on map loadDefinition
loadFarmlandData()Return Values
boolean | true | if loading was successful else false |
51 | function 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 |
163 | end |
loadFromXMLFile
DescriptionLoad farmland ownage data from xml savegame fileDefinition
loadFromXMLFile(string filename)Arguments
string | filename | xml filename |
216 | function 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 |
246 | end |
loadMapData
DescriptionLoad data on map loadDefinition
loadMapData()Return Values
boolean | true | if loading was successful else false |
43 | function FarmlandManager:loadMapData(xmlFile) |
44 | FarmlandManager:superClass().loadMapData(self) |
45 | return XMLUtil.loadDataFromMapXML(xmlFile, "farmlands", g_currentMission.baseDirectory, self, self.loadFarmlandData) |
46 | end |
new
DescriptionCreating managerDefinition
new()Return Values
table | instance | instance of object |
20 | function FarmlandManager:new(customMt) |
21 | local self = AbstractManager:new(customMt or FarmlandManager_mt) |
22 | return self |
23 | end |
removeStateChangeListener
DescriptionRemoves a farmland state change listenerDefinition
removeStateChangeListener(table listener)Arguments
table | listener | state listener |
412 | function FarmlandManager:removeStateChangeListener(listener) |
413 | if listener ~= nil then |
414 | self.stateChangeListener[listener] = nil |
415 | end |
416 | end |
saveToXMLFile
DescriptionWrite farmland ownage data to savegame fileDefinition
saveToXMLFile(string xmlFilename)Arguments
string | xmlFilename | file path |
boolean | true | if loading was successful else false |
192 | function 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 |
211 | end |
setLandOwnership
DescriptionSets farm land ownershipDefinition
setLandOwnership(integer farmlandId, integer farmId)Arguments
integer | farmlandId | farm land id |
integer | farmId | farm id. set farmid to 0 to sell farm land |
325 | function 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 |
345 | end |
unloadMapData
DescriptionUnload data on mission deleteDefinition
unloadMapData()Code
167 | function 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) |
186 | end |