172 | function BaleUnloadTrigger:baleTriggerCallback(triggerId, otherId, onEnter, onLeave, onStay, otherShapeId) |
173 | if self.isEnabled then |
174 | local object = g_currentMission:getNodeObject(otherId) |
175 | if object ~= nil then |
176 | if object:isa(Bale) then |
177 | if onEnter then |
178 | local fillType = object:getFillType() |
179 | |
180 | if self.target:getIsFillTypeAllowed(fillType) |
181 | and self.target:getIsFillTypeSupported(fillType) |
182 | and self.target:getIsToolTypeAllowed(ToolType.BALE) then |
183 | self:raiseActive() |
184 | table.addElement(self.balesInTrigger, object) |
185 | end |
186 | elseif onLeave then |
187 | for index, bale in ipairs(self.balesInTrigger) do |
188 | if bale == object then |
189 | table.remove(self.balesInTrigger, index) |
190 | break |
191 | end |
192 | end |
193 | end |
194 | else |
195 | -- automatic bale laoder unloading for mobile version |
196 | if Platform.gameplay.automaticBaleDrop then |
197 | if object:isa(Vehicle) then |
198 | if SpecializationUtil.hasSpecialization(BaleLoader, object.specializations) then |
199 | if onEnter then |
200 | table.addElement(self.baleLoadersInTrigger, object) |
201 | self:raiseActive() |
202 | elseif onLeave then |
203 | for index, baleLoader in ipairs(self.baleLoadersInTrigger) do |
204 | if baleLoader == object then |
205 | table.remove(self.baleLoadersInTrigger, index) |
206 | break |
207 | end |
208 | end |
209 | end |
210 | end |
211 | end |
212 | end |
213 | end |
214 | end |
215 | end |
216 | end |
44 | function BaleUnloadTrigger:load(components, xmlFile, xmlNode, target, i3dMappings, rootNode) |
45 | self.triggerNode = xmlFile:getValue(xmlNode .. "#triggerNode", nil, components, i3dMappings) |
46 | if self.triggerNode ~= nil then |
47 | if not CollisionFlag.getHasFlagSet(self.triggerNode, CollisionFlag.TRIGGER_DYNAMIC_OBJECT) then |
48 | Logging.xmlError(xmlFile, "Bale trigger '%s' does not have Bit '%d' (%s) set", xmlNode .. "#triggerNode", CollisionFlag.getBit(CollisionFlag.TRIGGER_DYNAMIC_OBJECT), "TRIGGER_DYNAMIC_OBJECT") |
49 | return false |
50 | end |
51 | addTrigger(self.triggerNode, "baleTriggerCallback", self) |
52 | else |
53 | return false |
54 | end |
55 | |
56 | self.deleteLitersPerMS = xmlFile:getValue(xmlNode .. "#deleteLitersPerSecond", 4000) / 1000 |
57 | |
58 | if target ~= nil then |
59 | self:setTarget(target) |
60 | end |
61 | |
62 | self.isEnabled = true |
63 | |
64 | return true |
65 | end |
98 | function BaleUnloadTrigger:update(dt) |
99 | BaleUnloadTrigger:superClass().update(self, dt) |
100 | |
101 | if self.isServer then |
102 | for index, bale in ipairs(self.balesInTrigger) do |
103 | if bale ~= nil and bale.nodeId ~= 0 then |
104 | if bale:getCanBeSold() then -- keep currently mounted bales in list, so they are handled once free |
105 | if bale.dynamicMountJointIndex == nil then |
106 | local fillType = bale:getFillType() |
107 | local fillLevel = bale:getFillLevel() |
108 | local fillInfo = nil |
109 | |
110 | local delta = bale:getFillLevel() |
111 | if self.deleteLitersPerMS ~= nil then |
112 | delta = self.deleteLitersPerMS * dt |
113 | end |
114 | |
115 | if delta > 0 then |
116 | delta = self.target:addFillUnitFillLevel(bale:getOwnerFarmId(), 1, delta, fillType, ToolType.BALE, fillInfo) |
117 | bale:setFillLevel(fillLevel - delta) |
118 | local newFillLevel = bale:getFillLevel() |
119 | if newFillLevel < 0.01 then |
120 | if fillType == FillType.COTTON then |
121 | local total = g_currentMission:farmStats(self:getOwnerFarmId()):updateStats("soldCottonBales", 1) |
122 | g_achievementManager:tryUnlock("CottonBales", total) |
123 | end |
124 | |
125 | bale:delete() |
126 | table.remove(self.balesInTrigger, index) |
127 | break |
128 | end |
129 | end |
130 | end |
131 | end |
132 | else |
133 | table.remove(self.balesInTrigger, index) |
134 | end |
135 | end |
136 | |
137 | for index, baleLoader in ipairs(self.baleLoadersInTrigger) do |
138 | if baleLoader:getIsAutomaticBaleUnloadingAllowed() then |
139 | local bales = baleLoader:getLoadedBales() |
140 | local unloadingAllowed = false |
141 | for i, bale in ipairs(bales) do |
142 | local fillType = bale:getFillType() |
143 | |
144 | if self.target:getIsFillTypeAllowed(fillType) |
145 | and self.target:getIsFillTypeSupported(fillType) |
146 | and self.target:getIsToolTypeAllowed(ToolType.BALE) then |
147 | unloadingAllowed = true |
148 | break |
149 | end |
150 | end |
151 | |
152 | if unloadingAllowed then |
153 | baleLoader:startAutomaticBaleUnloading() |
154 | end |
155 | end |
156 | end |
157 | |
158 | if #self.balesInTrigger > 0 or #self.baleLoadersInTrigger > 0 then |
159 | self:raiseActive() |
160 | end |
161 | end |
162 | end |