Script v1.7.1.0
- AI
- Animals
- Contracts
- Debug
- Economy
- Effects
- Events
- Farms
- GUI
- Handtools
- I3d
- Materials
- Misc
- Objects
- AnimatedMapObject
- AnimatedObject
- AnimatedObjectEvent
- Bale
- Basketball
- Bga
- BgaSellStation
- BunkerSilo
- BuyingStation
- DigitalDisplay
- DogBall
- HelpIcons
- LoadingStation
- NightIllumination
- Nightlight2
- NightlightFlicker
- PhysicsObject
- Rotator
- SellingStation
- SimParticleSystem
- Storage
- StorageSystem
- SunAdmirer
- TourIcons
- UnloadingStation
- VehicleSellingPoint
- WildlifeSpawner
- 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
Storage
DescriptionStorage is an object that stores different fillTypesParent
ObjectFunctions
- delete
- empty
- farmDestroyed
- getFillLevel
- getFreeCapacity
- getIsFillTypeSupported
- hourChanged
- load
- loadFromXMLFile
- new
- readStream
- readUpdateStream
- saveToXMLFile
- setFillLevel
- writeStream
- writeUpdateStream
delete
DescriptionDeleting storageDefinition
delete()Code
80 | function Storage:delete() |
81 | if self.rootNode ~= 0 and entityExists(self.rootNode) then |
82 | delete(self.rootNode) |
83 | end |
84 | |
85 | g_currentMission.environment:removeHourChangeListener(self) |
86 | g_messageCenter:unsubscribeAll(self) |
87 | |
88 | Storage:superClass().delete(self) |
89 | end |
empty
DescriptionDefinitionempty()Code
215 | function Storage:empty() |
216 | for fillType, _ in pairs(self.fillLevels) do |
217 | self.fillLevels[fillType] = 0 |
218 | if self.isServer then |
219 | self:raiseDirtyFlags(self.storageDirtyFlag) |
220 | end |
221 | end |
222 | end |
farmDestroyed
DescriptionDefinitionfarmDestroyed()Code
308 | function Storage:farmDestroyed(farmId) |
309 | if self:getOwnerFarmId() == farmId then |
310 | for fillType, accepted in pairs(self.fillTypes) do |
311 | if accepted then |
312 | self:setFillLevel(0, fillType) |
313 | end |
314 | end |
315 | end |
316 | end |
getFillLevel
DescriptionReturns fill levelDefinition
getFillLevel(integer fillType)Arguments
integer | fillType | fill type |
float | fillLevel | fill level |
236 | function Storage:getFillLevel(fillType) |
237 | return self.fillLevels[fillType] or 0 |
238 | end |
getFreeCapacity
DescriptionReturns free capacityDefinition
getFreeCapacity(integer fillType)Arguments
integer | fillType | fill type |
float | freeCapacity | free capacity |
263 | function Storage:getFreeCapacity(fillType) |
264 | if self.fillLevels[fillType] ~= nil then |
265 | return math.max(self.capacityPerFillType - self.fillLevels[fillType], 0) |
266 | end |
267 | return 0 |
268 | end |
getIsFillTypeSupported
DescriptionReturns if storage allows fill typeDefinition
getIsFillTypeSupported(integer fillType)Arguments
integer | fillType | fill type |
boolean | allow | allow fill type |
228 | function Storage:getIsFillTypeSupported(fillType) |
229 | return self.fillTypes[fillType] == true |
230 | end |
hourChanged
DescriptionCalled on hour changeDefinition
hourChanged()Code
276 | function Storage:hourChanged() |
277 | if self.isServer then |
278 | local difficultyMultiplier = g_currentMission.missionInfo.buyPriceMultiplier |
279 | local fillLevelFactor = difficultyMultiplier * self.costsPerFillLevelAndDay / 24 |
280 | |
281 | local costs = 0 |
282 | for _, fillLevel in pairs(self.fillLevels) do |
283 | costs = costs + fillLevel * fillLevelFactor |
284 | end |
285 | |
286 | g_currentMission:addMoney(-costs, self:getOwnerFarmId(), MoneyType.PROPERTY_MAINTENANCE, true) |
287 | end |
288 | end |
load
DescriptionLoad storage attributes from objectDefinition
load(integer id)Arguments
integer | id | id of object |
boolean | success | success |
38 | function Storage:load(id, xmlFile, key) |
39 | self.rootNode = id |
40 | |
41 | self.capacityPerFillType = getXMLFloat(xmlFile, key .. "#capacityPerFillType") or 100000 |
42 | self.costsPerFillLevelAndDay = getXMLFloat(xmlFile, key .. "#costsPerFillLevelAndDay") or 0 |
43 | |
44 | self.fillTypes = {} |
45 | self.fillLevels = {} |
46 | self.sortedFillTypes = {} |
47 | |
48 | local fillTypeCategories = getXMLString(xmlFile, key .. "#fillTypeCategories") |
49 | local fillTypeNames = getXMLString(xmlFile, key .. "#fillTypes") |
50 | local fillTypes |
51 | |
52 | if fillTypeCategories ~= nil and fillTypeNames == nil then |
53 | fillTypes = g_fillTypeManager:getFillTypesByCategoryNames(fillTypeCategories, "Warning: '"..tostring(key).. "' has invalid fillTypeCategory '%s'.") |
54 | elseif fillTypeCategories == nil and fillTypeNames ~= nil then |
55 | fillTypes = g_fillTypeManager:getFillTypesByNames(fillTypeNames, "Warning: '"..tostring(key).. "' has invalid fillType '%s'.") |
56 | else |
57 | print("Warning: '"..tostring(key).. "' a 'Storage' entry needs either the 'fillTypeCategories' or 'fillTypes' attribute.") |
58 | return false |
59 | end |
60 | |
61 | for _,fillType in pairs(fillTypes) do |
62 | self.fillTypes[fillType] = true |
63 | end |
64 | |
65 | for fillType,_ in pairs(self.fillTypes) do |
66 | table.insert(self.sortedFillTypes, fillType) |
67 | self.fillLevels[fillType] = 0 |
68 | end |
69 | table.sort(self.sortedFillTypes) |
70 | |
71 | self.storageDirtyFlag = self:getNextDirtyFlag() |
72 | |
73 | g_messageCenter:subscribe(MessageType.FARM_DELETED, self.farmDestroyed, self) |
74 | |
75 | return true |
76 | end |
loadFromXMLFile
DescriptionLoading from attributes and nodesDefinition
loadFromXMLFile(integer xmlFile, string key)Arguments
integer | xmlFile | id of xml object |
string | key | key |
boolean | success | success |
166 | function Storage:loadFromXMLFile(xmlFile, key) |
167 | self:setOwnerFarmId(Utils.getNoNil(getXMLInt(xmlFile, key .. "#farmId"), AccessHandler.EVERYONE), true) |
168 | |
169 | local i = 0 |
170 | while true do |
171 | local siloKey = string.format(key .. ".node(%d)", i) |
172 | if not hasXMLProperty(xmlFile, siloKey) then |
173 | break |
174 | end |
175 | |
176 | local fillTypeStr = getXMLString(xmlFile, siloKey.."#fillType") |
177 | local fillLevel = math.max(Utils.getNoNil(getXMLFloat(xmlFile, siloKey.."#fillLevel"), 0), 0) |
178 | local fillTypeIndex = g_fillTypeManager:getFillTypeIndexByName(fillTypeStr) |
179 | |
180 | if fillTypeIndex ~= nil then |
181 | if self.fillLevels[fillTypeIndex] ~= nil then |
182 | self:setFillLevel(fillLevel, fillTypeIndex, nil) |
183 | else |
184 | print("Warning: Filltype '"..fillTypeStr.."' not supported by Storage "..getName(self.rootNode)) |
185 | end |
186 | else |
187 | print("Error: Invalid filltype '"..fillTypeStr.."'") |
188 | end |
189 | |
190 | i = i + 1 |
191 | end |
192 | |
193 | return true |
194 | 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 |
22 | function Storage:new(isServer, isClient, customMt) |
23 | local self = Object:new(isServer, isClient, customMt or Storage_mt) |
24 | |
25 | self.unloadingStations = {} |
26 | self.loadingStations = {} |
27 | |
28 | self.rootNode = 0 |
29 | self.foreignSilo = false |
30 | |
31 | return self |
32 | end |
readStream
DescriptionCalled on client side on joinDefinition
readStream(integer streamId, table connection)Arguments
integer | streamId | stream ID |
table | connection | connection |
95 | function Storage:readStream(streamId, connection) |
96 | Storage:superClass().readStream(self, streamId, connection) |
97 | |
98 | for _, fillType in ipairs(self.sortedFillTypes) do |
99 | local fillLevel = 0 |
100 | if streamReadBool(streamId) then |
101 | fillLevel = streamReadFloat32(streamId) |
102 | end |
103 | self:setFillLevel(fillLevel, fillType) |
104 | end |
105 | 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 |
127 | function Storage:readUpdateStream(streamId, timestamp, connection) |
128 | Storage:superClass().readUpdateStream(self, streamId, timestamp, connection) |
129 | if connection:getIsServer() then |
130 | if streamReadBool(streamId) then |
131 | for _, fillType in ipairs(self.sortedFillTypes) do |
132 | local fillLevel = 0 |
133 | if streamReadBool(streamId) then |
134 | fillLevel = streamReadFloat32(streamId) |
135 | end |
136 | self:setFillLevel(fillLevel, fillType) |
137 | end |
138 | end |
139 | end |
140 | end |
saveToXMLFile
DescriptionDefinitionsaveToXMLFile()Code
198 | function Storage:saveToXMLFile(xmlFile, key, usedModNames) |
199 | setXMLInt(xmlFile, key.."#farmId", self:getOwnerFarmId()) |
200 | |
201 | local index = 0 |
202 | for fillTypeIndex, fillLevel in pairs(self.fillLevels) do |
203 | if fillLevel > 0 then |
204 | local fillLevelKey = string.format("%s.node(%d)", key, index) |
205 | local fillTypeName = g_fillTypeManager:getFillTypeNameByIndex(fillTypeIndex) |
206 | setXMLString(xmlFile, fillLevelKey.."#fillType", fillTypeName) |
207 | setXMLFloat(xmlFile, fillLevelKey.."#fillLevel", fillLevel) |
208 | index = index + 1 |
209 | end |
210 | end |
211 | end |
setFillLevel
DescriptionSet fill level of storageDefinition
setFillLevel(float fillLevel, integer fillType)Arguments
float | fillLevel | new fill level |
integer | fillType | fill type |
248 | function Storage:setFillLevel(fillLevel, fillType) |
249 | fillLevel = MathUtil.clamp(fillLevel, 0, self.capacityPerFillType) |
250 | if self.fillLevels[fillType] ~= nil and fillLevel ~= self.fillLevels[fillType] then |
251 | self.fillLevels[fillType] = fillLevel |
252 | |
253 | if self.isServer then |
254 | self:raiseDirtyFlags(self.storageDirtyFlag) |
255 | end |
256 | end |
257 | end |
writeStream
DescriptionCalled on server side on joinDefinition
writeStream(integer streamId, table connection)Arguments
integer | streamId | stream ID |
table | connection | connection |
111 | function Storage:writeStream(streamId, connection) |
112 | Storage:superClass().writeStream(self, streamId, connection) |
113 | |
114 | for _, fillType in ipairs(self.sortedFillTypes) do |
115 | local fillLevel = self.fillLevels[fillType] |
116 | if streamWriteBool(streamId, fillLevel > 0) then |
117 | streamWriteFloat32(streamId, fillLevel) |
118 | end |
119 | end |
120 | 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 |
147 | function Storage:writeUpdateStream(streamId, connection, dirtyMask) |
148 | Storage:superClass().writeUpdateStream(self, streamId, connection, dirtyMask) |
149 | if not connection:getIsServer() then |
150 | if streamWriteBool(streamId, bitAND(dirtyMask, self.storageDirtyFlag) ~= 0) then |
151 | for _, fillType in ipairs(self.sortedFillTypes) do |
152 | local fillLevel = self.fillLevels[fillType] |
153 | if streamWriteBool(streamId, fillLevel > 0) then |
154 | streamWriteFloat32(streamId, fillLevel) |
155 | end |
156 | end |
157 | end |
158 | end |
159 | end |