LUADOC - Farming Simulator 19

HusbandryModulePallets

Description
This class handles water in husbandry
Parent
HusbandryModuleBase
XML Configuration Parameters
placeable.husbandry.pallet#spawnNodepallet spawn node index
placeable.husbandry.pallet#spawnAreaSizeXspawn area size for the pallet
placeable.husbandry.pallet#spawnAreaSizeZspawn area size for the pallet
placeable.husbandry.pallet#fillTypefilltype for the pallet
placeable.husbandry.pallet#filenamefilename for the pallet (ex: "$data/objects/pallets/woolPallet.i3d")
placeable.husbandry.pallet#size

Functions

getFilltypeInfos

Description
Definition
getFilltypeInfos()
Code
248function HusbandryModulePallets:getFilltypeInfos()
249 local result = {}
250 local fillType = g_fillTypeManager:getFillTypeByIndex(self.palletFillTypeIndex)
251
252 table.insert(result, {fillType=fillType, fillLevel=self:getFillLevel(self.palletFillUnitIndex), capacity=0})
253
254 return result
255end

load

Description
Loads data from xml
Definition
load(table xmlFile, string xmlKey, table rootNode)
Arguments
tablexmlFilehandle
stringxmlKeyfrom which to read the configuration
tablerootNodeof the husbandry
Return Values
booleantrueif loading was successful else false
Code
52function HusbandryModulePallets:load(xmlFile, configKey, rootNode, owner, baseDirectory)
53 local result = HusbandryModulePallets:superClass().load(self, xmlFile, configKey, rootNode, owner, baseDirectory)
54
55 if result ~= true then
56 return false
57 end
58 if not hasXMLProperty(xmlFile, configKey) then
59 return false
60 end
61
62 self.palletSpawnerStartNode = I3DUtil.indexToObject(rootNode, getXMLString(xmlFile, configKey .. "#startNode"))
63 self.palletSpawnerWidthNode = I3DUtil.indexToObject(rootNode, getXMLString(xmlFile, configKey .. "#widthNode"))
64 self.palletSpawnerHeightNode = I3DUtil.indexToObject(rootNode, getXMLString(xmlFile, configKey .. "#heightNode"))
65
66 local xw, yw, zw = getTranslation(self.palletSpawnerWidthNode)
67 if xw == 0.0 or math.abs(yw) > 0.001 or math.abs(zw) > 0.001 then
68 g_logManager:devWarning(string.format("Warning: width node of husbandry module pallets has incorrect parameters x(%.3f), y(%.3f), z(%.3f).", xw, yw, zw))
69 return false
70 end
71 local xh, yh, zh = getTranslation(self.palletSpawnerHeightNode)
72 if math.abs(xh) > 0.001 or math.abs(yh) > 0.001 or zh == 0.0 then
73 g_logManager:devWarning(string.format("Warning: height node of husbandry module pallets has incorrect parameters x(%.3f), y(%.3f), z(%.3f).", xh, yh, zh))
74 return false
75 end
76
77 self.palletSpawnerNode = self.palletSpawnerStartNode
78 self.palletSpawnerAreaSizeX = xw
79 self.palletSpawnerAreaSizeZ = zh
80
81 local fillTypeStr = getXMLString(xmlFile, configKey .. "#fillType")
82 self.palletFillTypeIndex = g_fillTypeManager:getFillTypeIndexByName(fillTypeStr)
83 self.palletConfigFilename = Utils.getNoNil(getXMLString(xmlFile, configKey .. "#filename"), "")
84 self.palletConfigFilename = Utils.getFilename(self.palletConfigFilename, self.baseDirectory)
85 self.palletFillUnitIndex = getXMLFloat(xmlFile, configKey .. "#fillUnitIndex")
86 self.sizeWidth, self.sizeLength, _, _ = StoreItemUtil.getSizeValues(self.palletConfigFilename, "vehicle", 0, {})
87
88 -- In the backend, use the fill levels synchronization for MP sync
89 self.fillLevels[self.palletFillTypeIndex] = 0.0
90
91 self.palletSpawnerFillDelta = 0
92 self.numObjectsInPalletSpawnerTrigger = 0
93
94 return self.palletSpawnerNode ~= nil and self.palletFillTypeIndex ~= nil and self.palletConfigFilename ~= "" and self.palletFillUnitIndex ~= nil
95end

loadFromXMLFile

Description
Loads information from attributes and node. Retrives from xml file information.
Definition
loadFromXMLFile(table xmlFile, string key)
Arguments
tablexmlFileXML file handler
stringkeyXML base key
Code
199function HusbandryModulePallets:loadFromXMLFile(xmlFile, key)
200 HusbandryModulePallets:superClass().loadFromXMLFile(self, xmlFile, key)
201
202 self.palletSpawnerFillDelta = Utils.getNoNil(getXMLFloat(xmlFile, key.."#palletFillDelta"), self.palletSpawnerFillDelta)
203end

onIntervalUpdate

Description
Update pallets production
Definition
onIntervalUpdate(float dayToInterval)
Arguments
floatdayToInterval
Code
100function HusbandryModulePallets:onIntervalUpdate(dayToInterval)
101 HusbandryModulePallets:superClass().onIntervalUpdate(self, dayToInterval)
102 local totalNumAnimals = self.owner:getNumOfAnimals()
103
104 if self.singleAnimalUsagePerDay > 0 and totalNumAnimals > 0 then
105 local productivity = self.owner:getGlobalProductionFactor()
106 local fillDelta = productivity * totalNumAnimals * self.singleAnimalUsagePerDay * dayToInterval
107
108 self.palletSpawnerFillDelta = self.palletSpawnerFillDelta + fillDelta
109
110 if productivity > 0 and self.palletSpawnerFillDelta > 0 then
111 -- check if last pallet is still valid
112 if self.currentPallet ~= nil then
113 if self.currentPallet:getFillUnitFreeCapacity(self.palletFillUnitIndex) < 0.001 then
114 self.currentPallet = nil
115 end
116 end
117
118 if self.currentPallet ~= nil then
119 if not entityExists(self.currentPallet.rootNode) then
120 self.currentPallet = nil
121 else
122 local x, _, z = localToLocal(self.currentPallet.rootNode, self.palletSpawnerNode, 0,0,0)
123 if x < 0 or z < 0 or x > self.palletSpawnerAreaSizeX or z > self.palletSpawnerAreaSizeZ then
124 self.currentPallet = nil
125 end
126 end
127 end
128
129 -- check if there is a pallet which can be filled
130 if self.currentPallet == nil then
131 self.availablePallet = nil
132 local x,y,z = localToWorld(self.palletSpawnerNode, 0.5 * self.palletSpawnerAreaSizeX, 0, 0.5 * self.palletSpawnerAreaSizeZ)
133 local rx,ry,rz = getWorldRotation(self.palletSpawnerNode)
134 local nbShapesOverlap = overlapBox(x, y - 5, z, rx, ry, rz, 0.5 * self.palletSpawnerAreaSizeX, 10, 0.5 * self.palletSpawnerAreaSizeZ, "palletSpawnerCollisionTestCallback", self, nil, true, false, true)
135 if self.availablePallet ~= nil then
136 self.currentPallet = self.availablePallet
137 end
138 end
139
140 if self.currentPallet == nil then
141 local rx, ry, rz = getWorldRotation(self.palletSpawnerNode)
142 local x, y, z = getWorldTranslation(self.palletSpawnerNode)
143 local canCreatePallet = false
144
145 local widthHalf = self.sizeWidth * 0.5
146 local heightHalf = self.sizeLength * 0.5
147
148 for dx = widthHalf, self.palletSpawnerAreaSizeX - widthHalf, widthHalf do
149 for dz = heightHalf, self.palletSpawnerAreaSizeZ - heightHalf, widthHalf do
150 x, y, z = localToWorld(self.palletSpawnerNode, dx, 0, dz)
151 self.palletSpawnerCollisionObjectId = 0
152 local nbShapesOverlap = overlapBox(x, y - 5, z, rx, ry, rz, widthHalf, 10.0, heightHalf, "palletSpawnerCollisionTestCallback", self, nil, true, false, true)
153 if self.palletSpawnerCollisionObjectId == 0 then
154 canCreatePallet = true
155 break
156 end
157 end
158 if canCreatePallet then
159 break
160 end
161 end
162
163 if canCreatePallet and self.palletSpawnerFillDelta > HusbandryModulePallets.fillLevelThresholdForDeletion then
164 self.currentPallet = g_currentMission:loadVehicle(self.palletConfigFilename, x, nil, z, 1.2, ry, true, 0, Vehicle.PROPERTY_STATE_OWNED, self.owner:getOwnerFarmId(), nil, nil)
165 end
166 end
167
168 if self.currentPallet ~= nil then
169 self.palletSpawnerFillDelta = self.currentPallet:addFillUnitFillLevel(self.owner:getOwnerFarmId(), self.palletFillUnitIndex, self.palletSpawnerFillDelta, self.palletFillTypeIndex, ToolType.UNDEFINED)
170
171 -- Set the fill level for syncing with clients
172 self:setFillLevel(self.palletFillUnitIndex, self:getCurrentPalletFillLevel())
173 elseif self.palletSpawnerFillDelta > HusbandryModulePallets.fillLevelThresholdForDeletion then
174 self:showSpawnerBlockedWarning()
175 end
176 end
177 end
178end

palletSpawnerCollisionTestCallback

Description
Test that object colliding with pallet is a vehicle handling pallets and is not full
Definition
palletSpawnerCollisionTestCallback(integer transformId)
Arguments
integertransformIdscenegraph id from colliding object
Return Values
boolistrue if available Pallet has been assigned with a vehicle object
Code
215function HusbandryModulePallets:palletSpawnerCollisionTestCallback(transformId)
216 if transformId ~= g_currentMission.terrainRootNode and transformId ~= self.palletSpawnerNode and not Utils.getNoNil(getUserAttribute(transformId, "allowPalletSpawning"), false) then
217 self.palletSpawnerCollisionObjectId = transformId
218
219 local object = g_currentMission:getNodeObject(transformId)
220 if object ~= nil and object.isa ~= nil and object:isa(Vehicle) and object.typeName == "pallet" then
221 if object:getFillUnitFillLevel(self.palletFillUnitIndex) < object:getFillUnitCapacity(self.palletFillUnitIndex) then
222 local x, _, z = localToLocal(object.rootNode, self.palletSpawnerNode, 0, 0, 0)
223
224 if not ((x < 0) or (z < 0) or (x > self.palletSpawnerAreaSizeX) or (z > self.palletSpawnerAreaSizeZ)) then
225 self.availablePallet = object
226 end
227 end
228 end
229 end
230
231 return self.availablePallet == nil
232end