LUADOC - Farming Simulator 17

Printable Version

Storage

Description
Class for storages
Functions

onCreate

Description
Creating storage
Definition
onCreate(integer id)
Arguments
integeridnode id
Code
15function Storage:onCreate(id)
16 local storage = Storage:new(g_server ~= nil, g_client ~= nil);
17 if storage:load(id, true) then
18 g_currentMission:addOnCreateLoadedObjectToSave(storage);
19 g_currentMission:addOnCreateLoadedObject(storage);
20 storage:register(true);
21 g_currentMission:addStorage(storage);
22 g_currentMission.environment:addHourChangeListener(storage);
23 else
24 storage:delete();
25 end
26end

new

Description
Creating new instance of storage class
Definition
new(boolean isServer, boolean isClient)
Arguments
booleanisServeris server
booleanisClientis client
Return Values
tableselfnew instance of object
Code
34function Storage:new(isServer, isClient, customMt)
35 local mt = customMt;
36 if mt == nil then
37 mt = Storage_mt;
38 end
39
40 local self = Object:new(isServer, isClient, mt);
41
42 self.tipTriggers = {}
43 self.siloTriggers = {}
44
45 self.rootNode = 0;
46
47 return self;
48end

load

Description
Load storage attributes from object
Definition
load(integer id, integer ownsId)
Arguments
integeridid of object
integerownsIdid of owner object
Return Values
booleansuccesssuccess
Code
55function Storage:load(id, ownsId)
56 self.rootNode = id;
57 self.ownsRootNode = ownsId;
58
59 self.storageName = Utils.getNoNil(getUserAttribute(id, "storageName"), "Storage");
60 self.capacity = Utils.getNoNil( getUserAttribute(id, "capacityPerType"), 50000);
61 self.costsPerFillLevelAndDay = Utils.getNoNil( getUserAttribute(id, "costsPerFillLevelAndDay"), 0);
62
63 self.fillTypes = {};
64 self.sortedFillTypes = {};
65 self.fillLevels = {};
66
67 self.loadedValues = {}
68
69 self.movingNode = Utils.indexToObject(id, getUserAttribute(id, "movingIndex"));
70 if self.movingNode ~= nil then
71 local minY, maxY = Utils.getVectorFromString(getUserAttribute(id, "moveMinMaxY"));
72 local _,y,_ = getTranslation(self.movingNode);
73 self.moveMinY = Utils.getNoNil(minY, y);
74 self.moveMaxY = Utils.getNoNil(maxY, y);
75 end
76 self.saveId = Utils.getNoNil(getUserAttribute(id, "saveId"), "Storage_"..getName(id));
77
78 self.storageDirtyFlag = self:getNextDirtyFlag();
79
80 return true;
81end

delete

Description
Deleting storage
Definition
delete()
Code
85function Storage:delete()
86 g_currentMission:removeOnCreateLoadedObjectToSave(self);
87 if self.ownsRootNode and self.rootNode ~= 0 and entityExists(self.rootNode) then
88 delete(self.rootNode);
89 end
90 g_currentMission.environment:removeHourChangeListener(self);
91 Storage:superClass().delete(self);
92end

readStream

Description
Called on client side on join
Definition
readStream(integer streamId, table connection)
Arguments
integerstreamIdstream ID
tableconnectionconnection
Code
98function Storage:readStream(streamId, connection)
99 Storage:superClass().readStream(self, streamId, connection);
100 for _, fillType in ipairs(self.sortedFillTypes) do
101 local fillLevel = 0
102 if streamReadBool(streamId) then
103 fillLevel = streamReadFloat32(streamId);
104 end
105 self:setFillLevel(fillLevel, fillType);
106 end
107end

writeStream

Description
Called on server side on join
Definition
writeStream(integer streamId, table connection)
Arguments
integerstreamIdstream ID
tableconnectionconnection
Code
113function Storage:writeStream(streamId, connection)
114 Storage:superClass().writeStream(self, streamId, connection);
115 for _, fillType in ipairs(self.sortedFillTypes) do
116 local fillLevel = self.fillLevels[fillType]
117 if streamWriteBool(streamId, fillLevel > 0) then
118 streamWriteFloat32(streamId, fillLevel);
119 end
120 end
121end

readUpdateStream

Description
Called on client side on update
Definition
readUpdateStream(integer streamId, integer timestamp, table connection)
Arguments
integerstreamIdstream ID
integertimestamptimestamp
tableconnectionconnection
Code
128function Storage:readUpdateStream(streamId, timestamp, connection)
129 Storage:superClass().readUpdateStream(self, streamId, timestamp, connection);
130 if connection:getIsServer() then
131 if streamReadBool(streamId) then
132 for _, fillType in ipairs(self.sortedFillTypes) do
133 local fillLevel = 0
134 if streamReadBool(streamId) then
135 fillLevel = streamReadFloat32(streamId);
136 end
137 self:setFillLevel(fillLevel, fillType);
138 end
139 end
140 end
141end

writeUpdateStream

Description
Called on server side on update
Definition
writeUpdateStream(integer streamId, table connection, integer dirtyMask)
Arguments
integerstreamIdstream ID
tableconnectionconnection
integerdirtyMaskdirty mask
Code
148function Storage:writeUpdateStream(streamId, connection, dirtyMask)
149 Storage:superClass().writeUpdateStream(self, streamId, connection, dirtyMask);
150 if not connection:getIsServer() then
151 if streamWriteBool(streamId, bitAND(dirtyMask, self.storageDirtyFlag) ~= 0) then
152 for _, fillType in ipairs(self.sortedFillTypes) do
153 local fillLevel = self.fillLevels[fillType]
154 if streamWriteBool(streamId, fillLevel > 0) then
155 streamWriteFloat32(streamId, fillLevel);
156 end
157 end
158 end
159 end
160end

loadFromAttributesAndNodes

Description
Loading from attributes and nodes
Definition
loadFromAttributesAndNodes(integer xmlFile, string key)
Arguments
integerxmlFileid of xml object
stringkeykey
Return Values
booleansuccesssuccess
Code
173function Storage:loadFromAttributesAndNodes(xmlFile, key)
174 local i = 0;
175 while true do
176 local siloKey = string.format(key .. ".node(%d)", i);
177 if not hasXMLProperty(xmlFile, siloKey) then
178 break;
179 end
180 local fillTypeStr = getXMLString(xmlFile, siloKey.."#fillType");
181 local fillLevel = math.max(Utils.getNoNil(getXMLFloat(xmlFile, siloKey.."#fillLevel"), 0), 0);
182 local fillType = FillUtil.fillTypeNameToInt[fillTypeStr];
183 if fillType ~= nil then
184 if self.fillLevels[fillType] ~= nil then
185 self:setFillLevel(fillLevel, fillType, nil);
186 else
187 print("Warning: Filltype '"..fillTypeStr.."' not supported by Storage "..getName(self.rootNode));
188 end
189 else
190 print("Error: Invalid filltype '"..fillTypeStr.."'");
191 end
192
193 i = i + 1;
194 end
195
196 return true;
197end

getSaveAttributesAndNodes

Description
Get save attributes and nodes
Definition
getSaveAttributesAndNodes(string nodeIdent)
Arguments
stringnodeIdentnode ident
Return Values
stringattributesattributes
stringnodesnodes
Code
204function Storage:getSaveAttributesAndNodes(nodeIdent)
205 local attributes = "";
206 local nodes = "";
207
208 local n = 0;
209 for fillType, fillLevel in pairs(self.fillLevels) do
210 if n > 0 then
211 nodes = nodes .. "\n";
212 end
213 local fillTypeName = FillUtil.fillTypeIntToName[fillType];
214 nodes = nodes .. ' <node fillType="'..tostring(fillTypeName)..'" fillLevel="'..tostring(fillLevel)..'" />';
215 n = n + 1;
216 end
217
218 return attributes, nodes;
219end

allowFillType

Description
Returns if storage allows fill type
Definition
allowFillType(integer fillType)
Arguments
integerfillTypefill type
Return Values
booleanallowallow fill type
Code
225function Storage:allowFillType(fillType)
226 return self.fillTypes[fillType] ~= nil;
227end

getFillLevel

Description
Returns fill level
Definition
getFillLevel(integer fillType)
Arguments
integerfillTypefill type
Return Values
floatfillLevelfill level
Code
233function Storage:getFillLevel(fillType)
234 return self.fillLevels[fillType];
235end

setFillLevel

Description
Set fill level of storage
Definition
setFillLevel(float fillLevel, integer fillType, table fillable)
Arguments
floatfillLevelnew fill level
integerfillTypefill type
tablefillablefillable
Code
242function Storage:setFillLevel(fillLevel, fillType, fillable)
243 fillLevel = Utils.clamp(fillLevel, 0, self.capacity);
244 if self.fillLevels[fillType] ~= nil and fillLevel ~= self.fillLevels[fillType] then
245 self.fillLevels[fillType] = fillLevel;
246 --print("CurrentFillLevel: " .. fillLevel .. " " .. fillType);
247
248 if self.isServer then
249 self:raiseDirtyFlags(self.storageDirtyFlag);
250 end
251
252 if self.movingNode ~= nil then
253 local x,y,z = getTranslation(self.movingNode);
254 local y = self.moveMinY + (self.moveMaxY - self.moveMinY)*Utils.clamp(self.fillLevels[fillType], 0, self.capacity)/(self.capacity);
255 setTranslation(self.movingNode, x,y,z);
256 end
257 end
258end

getFreeCapacity

Description
Returns free capacity
Definition
getFreeCapacity(integer fillType)
Arguments
integerfillTypefill type
Return Values
floatfreeCapacityfree capacity
Code
264function Storage:getFreeCapacity(fillType)
265 if self.fillLevels[fillType] ~= nil then
266 return math.max(self.capacity - self.fillLevels[fillType], 0);
267 end
268 return 0;
269end

addFillType

Description
Add fill type to storage
Definition
addFillType(integer filltype)
Arguments
integerfilltypefill type to add
Code
274function Storage:addFillType(fillType)
275 if fillType ~= nil and fillType ~= FillUtil.FILLTYPE_UNKNOWN then
276 if self.fillTypes[fillType] == nil then
277 self.fillTypes[fillType] = fillType
278 table.insert(self.sortedFillTypes, fillType)
279 table.sort(self.sortedFillTypes);
280 end
281 self.fillLevels[fillType] = Utils.getNoNil(self.fillLevels[fillType], 0)
282 end
283end

hourChanged

Description
Called on hour change
Definition
hourChanged()
Code
287function Storage:hourChanged()
288 if self.isServer then
289 local difficultyMultiplier = g_currentMission.missionInfo.buyPriceMultiplier;
290 local fillLevelFactor = difficultyMultiplier * self.costsPerFillLevelAndDay / 24;
291
292 local costs = 0;
293 for fillType,fillLevel in pairs(self.fillLevels) do
294 costs = costs + fillLevel * fillLevelFactor;
295 end
296
297 g_currentMission:addSharedMoney(-costs, "propertyMaintenance");
298 g_currentMission:addMoneyChange(-costs, EconomyManager.MONEY_TYPE_PROPERTY_MAINTENANCE);
299 end
300end

addTipTrigger

Description
Add tip trigger to storage
Definition
addTipTrigger(table tipTrigger)
Arguments
tabletipTriggertip trigger to add
Code
305function Storage:addTipTrigger(tipTrigger)
306 self.tipTriggers[tipTrigger] = tipTrigger
307 if tipTrigger ~= nil and tipTrigger.acceptedFillTypes ~= nil then
308 for fillType, enabled in pairs(tipTrigger.acceptedFillTypes) do
309 if enabled then
310 self:addFillType(fillType)
311 end
312 end
313 end
314end

removeTipTrigger

Description
Remove tip trigger
Definition
removeTipTrigger(table tipTrigger)
Arguments
tabletipTriggertip trigger to remove
Code
319function Storage:removeTipTrigger(tipTrigger)
320 self.tipTriggers[tipTrigger] = nil
321end

addSiloTrigger

Description
Add silo trigger
Definition
addSiloTrigger(table siloTrigger)
Arguments
tablesiloTriggersilo trigger to add
Code
326function Storage:addSiloTrigger(siloTrigger)
327 self.siloTriggers[siloTrigger] = siloTrigger
328end

removeSiloTrigger

Description
Remove silo trigger
Definition
removeSiloTrigger(table siloTrigger)
Arguments
tablesiloTriggersilo trigger to remove
Code
333function Storage:removeSiloTrigger(siloTrigger)
334 self.siloTriggers[siloTrigger] = nil
335end