Script v1.4.4.0
Engine v7.0.0.2
- General
- Entity
- Node
- Scenegraph
- Lighting
- Camera
- Shape
- Particle System
- Physics
- Spline
- Animation
- Overlays
- Sound
- Input
- XML
- Network
- Callbacks
- Text Rendering
- Terrain Detail
- Tire Track
- Editor
- Rendering
- String
- Math
- I3D
- Fillplanes
Foundation Reference
Storage
DescriptionClass for storagesFunctions
- onCreate
- new
- load
- delete
- readStream
- writeStream
- readUpdateStream
- writeUpdateStream
- loadFromAttributesAndNodes
- getSaveAttributesAndNodes
- allowFillType
- getFillLevel
- setFillLevel
- getFreeCapacity
- addFillType
- hourChanged
- addTipTrigger
- removeTipTrigger
- addSiloTrigger
- removeSiloTrigger
onCreate
DescriptionCreating storageDefinition
onCreate(integer id)Arguments
integer | id | node id |
15 | function 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 |
26 | end |
new
DescriptionCreating new instance of storage classDefinition
new(boolean isServer, boolean isClient)Arguments
boolean | isServer | is server |
boolean | isClient | is client |
table | self | new instance of object |
34 | function 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; |
48 | end |
load
DescriptionLoad storage attributes from objectDefinition
load(integer id, integer ownsId)Arguments
integer | id | id of object |
integer | ownsId | id of owner object |
boolean | success | success |
55 | function 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; |
81 | end |
delete
DescriptionDeleting storageDefinition
delete()Code
85 | function 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); |
92 | end |
readStream
DescriptionCalled on client side on joinDefinition
readStream(integer streamId, table connection)Arguments
integer | streamId | stream ID |
table | connection | connection |
98 | function 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 |
107 | end |
writeStream
DescriptionCalled on server side on joinDefinition
writeStream(integer streamId, table connection)Arguments
integer | streamId | stream ID |
table | connection | connection |
113 | function 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 |
121 | end |
readUpdateStream
DescriptionCalled on client side on updateDefinition
readUpdateStream(integer streamId, integer timestamp, table connection)Arguments
integer | streamId | stream ID |
integer | timestamp | timestamp |
table | connection | connection |
128 | function 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 |
141 | end |
writeUpdateStream
DescriptionCalled on server side on updateDefinition
writeUpdateStream(integer streamId, table connection, integer dirtyMask)Arguments
integer | streamId | stream ID |
table | connection | connection |
integer | dirtyMask | dirty mask |
148 | function 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 |
160 | end |
loadFromAttributesAndNodes
DescriptionLoading from attributes and nodesDefinition
loadFromAttributesAndNodes(integer xmlFile, string key)Arguments
integer | xmlFile | id of xml object |
string | key | key |
boolean | success | success |
173 | function 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; |
197 | end |
getSaveAttributesAndNodes
DescriptionGet save attributes and nodesDefinition
getSaveAttributesAndNodes(string nodeIdent)Arguments
string | nodeIdent | node ident |
string | attributes | attributes |
string | nodes | nodes |
204 | function 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; |
219 | end |
allowFillType
DescriptionReturns if storage allows fill typeDefinition
allowFillType(integer fillType)Arguments
integer | fillType | fill type |
boolean | allow | allow fill type |
225 | function Storage:allowFillType(fillType) |
226 | return self.fillTypes[fillType] ~= nil; |
227 | end |
getFillLevel
DescriptionReturns fill levelDefinition
getFillLevel(integer fillType)Arguments
integer | fillType | fill type |
float | fillLevel | fill level |
233 | function Storage:getFillLevel(fillType) |
234 | return self.fillLevels[fillType]; |
235 | end |
setFillLevel
DescriptionSet fill level of storageDefinition
setFillLevel(float fillLevel, integer fillType, table fillable)Arguments
float | fillLevel | new fill level |
integer | fillType | fill type |
table | fillable | fillable |
242 | function 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 |
258 | end |
getFreeCapacity
DescriptionReturns free capacityDefinition
getFreeCapacity(integer fillType)Arguments
integer | fillType | fill type |
float | freeCapacity | free capacity |
264 | function 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; |
269 | end |
addFillType
DescriptionAdd fill type to storageDefinition
addFillType(integer filltype)Arguments
integer | filltype | fill type to add |
274 | function 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 |
283 | end |
hourChanged
DescriptionCalled on hour changeDefinition
hourChanged()Code
287 | function 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 |
300 | end |
addTipTrigger
DescriptionAdd tip trigger to storageDefinition
addTipTrigger(table tipTrigger)Arguments
table | tipTrigger | tip trigger to add |
305 | function 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 |
314 | end |
removeTipTrigger
DescriptionRemove tip triggerDefinition
removeTipTrigger(table tipTrigger)Arguments
table | tipTrigger | tip trigger to remove |
319 | function Storage:removeTipTrigger(tipTrigger) |
320 | self.tipTriggers[tipTrigger] = nil |
321 | end |
addSiloTrigger
DescriptionAdd silo triggerDefinition
addSiloTrigger(table siloTrigger)Arguments
table | siloTrigger | silo trigger to add |
326 | function Storage:addSiloTrigger(siloTrigger) |
327 | self.siloTriggers[siloTrigger] = siloTrigger |
328 | end |
removeSiloTrigger
DescriptionRemove silo triggerDefinition
removeSiloTrigger(table siloTrigger)Arguments
table | siloTrigger | silo trigger to remove |
333 | function Storage:removeSiloTrigger(siloTrigger) |
334 | self.siloTriggers[siloTrigger] = nil |
335 | end |