144 | function ManureSensorLinkageData:getClonedManureSensorNode(typeName) |
145 | for i=1, #self.sensorData do |
146 | local sensorData = self.sensorData[i] |
147 | if sensorData.type:upper() == typeName:upper() then |
148 | local clonedData = table.copy(sensorData, 10) |
149 | clonedData.node = clone(sensorData.node, false, false, false) |
150 | setTranslation(clonedData.node, 0, 0, 0) |
151 | setRotation(clonedData.node, 0, 0, 0) |
152 | setScale(clonedData.node, 1, 1, 1) |
153 | |
154 | return clonedData |
155 | end |
156 | end |
157 | end |
57 | function ManureSensorLinkageData:loadLinkageData(loadVehicleData, loadSensorData) |
58 | local filename = Utils.getFilename("ManureSensorLinkageData.xml", ManureSensorLinkageData.BASE_DIRECTORY) |
59 | |
60 | local xmlFile = XMLFile.load("ManureSensorLinkageData", filename, ManureSensorLinkageData.xmlSchema) |
61 | if xmlFile ~= nil then |
62 | self.configurationPrice = xmlFile:getValue("manureSensorLinkageData.configuration#price", 0) |
63 | |
64 | if loadVehicleData ~= false then |
65 | self.linkageData = {} |
66 | xmlFile:iterate("manureSensorLinkageData.vehicles.vehicle", function(index, key) |
67 | local vehicleData = {} |
68 | vehicleData.filename = xmlFile:getValue(key .. "#filename") |
69 | if vehicleData.filename ~= nil then |
70 | vehicleData.linkNodes = {} |
71 | |
72 | xmlFile:iterate(key .. ".linkNode", function(_, linkNodeKey) |
73 | local linkNode = {} |
74 | linkNode.nodeName = xmlFile:getValue(linkNodeKey .. "#node") |
75 | linkNode.typeName = xmlFile:getValue(linkNodeKey .. "#type", "DEFAULT"):upper() |
76 | linkNode.translation = xmlFile:getValue(linkNodeKey .. "#translation", "0 0 0", true) |
77 | linkNode.rotation = xmlFile:getValue(linkNodeKey .. "#rotation", "0 0 0", true) |
78 | linkNode.scale = xmlFile:getValue(linkNodeKey .. "#scale", "1 1 1", true) |
79 | |
80 | table.insert(vehicleData.linkNodes, linkNode) |
81 | end) |
82 | end |
83 | |
84 | table.insert(self.linkageData, vehicleData) |
85 | end) |
86 | end |
87 | |
88 | if loadSensorData ~= false then |
89 | local sensorsFilename = xmlFile:getValue("manureSensorLinkageData.sensors#filename") |
90 | if sensorsFilename ~= nil then |
91 | sensorsFilename = Utils.getFilename(sensorsFilename, ManureSensorLinkageData.BASE_DIRECTORY) |
92 | g_i3DManager:loadI3DFileAsync(sensorsFilename, true, true, ManureSensorLinkageData.onSensorDataLoaded, self, {xmlFile}) |
93 | else |
94 | xmlFile:delete() |
95 | end |
96 | else |
97 | xmlFile:delete() |
98 | end |
99 | end |
100 | |
101 | self.dataLoaded = true |
102 | |
103 | return true |
104 | end |
108 | function ManureSensorLinkageData:onSensorDataLoaded(i3dNode, failedReason, args) |
109 | local xmlFile = unpack(args) |
110 | if i3dNode ~= 0 then |
111 | xmlFile:iterate("manureSensorLinkageData.sensors.sensor", function(index, key) |
112 | local sensorData = {} |
113 | sensorData.node = xmlFile:getValue(key .. "#node", nil, i3dNode) |
114 | if sensorData.node ~= nil then |
115 | sensorData.type = xmlFile:getValue(key .. "#type", "DEFAULT") |
116 | |
117 | table.insert(self.sensorData, sensorData) |
118 | end |
119 | end) |
120 | |
121 | for i=1, #self.sensorData do |
122 | unlink(self.sensorData[i].node) |
123 | end |
124 | |
125 | delete(i3dNode) |
126 | end |
127 | |
128 | xmlFile:delete() |
129 | end |
161 | function ManureSensorLinkageData:overwriteGameFunctions(pfModule) |
162 | -- Reload linkage data while reloading vehicles to get the latest data |
163 | pfModule:overwriteGameFunction(FSBaseMission, "consoleCommandReloadVehicle", function(superFunc, mission, resetVehicle, radius) |
164 | self:loadLinkageData(true, false) |
165 | |
166 | return superFunc(mission, resetVehicle, radius) |
167 | end) |
168 | |
169 | pfModule:overwriteGameFunction(StoreItemUtil, "getConfigurationsFromXML", function(superFunc, xmlFile, key, baseDir, customEnvironment, isMod, storeItem) |
170 | local configurations, defaultConfigurationIds = superFunc(xmlFile, key, baseDir, customEnvironment, isMod, storeItem) |
171 | |
172 | if not self.dataLoaded then |
173 | self:loadLinkageData(true) |
174 | end |
175 | local vehicleData = self:getManureSensorLinkageData(xmlFile.filename) |
176 | if vehicleData ~= nil then |
177 | if configurations == nil then |
178 | configurations = {} |
179 | end |
180 | |
181 | if defaultConfigurationIds == nil then |
182 | defaultConfigurationIds = {} |
183 | end |
184 | |
185 | configurations["manureSensor"] = { |
186 | [1] = {["isDefault"] = true, |
187 | ["name"] = g_i18n:getText("configuration_valueNo"), |
188 | ["index"] = 1, |
189 | ["dailyUpkeep"] = 0, |
190 | ["saveId"] = "1", |
191 | ["isSelectable"] = true, |
192 | ["price"] = 0, |
193 | ["nameCompareParams"] = {}, |
194 | }, |
195 | [2] = {["isDefault"] = false, |
196 | ["name"] = g_i18n:getText("configuration_valueYes"), |
197 | ["index"] = 2, |
198 | ["dailyUpkeep"] = 0, |
199 | ["saveId"] = "2", |
200 | ["isSelectable"] = true, |
201 | ["price"] = self.configurationPrice, |
202 | ["nameCompareParams"] = {}, |
203 | }, |
204 | } |
205 | end |
206 | |
207 | |
208 | return configurations, defaultConfigurationIds |
209 | end) |
210 | end |
214 | function ManureSensorLinkageData:registerXMLPaths(schema) |
215 | schema:register(XMLValueType.STRING, "manureSensorLinkageData.sensors#filename", "Link to i3d filename containing the sensors") |
216 | schema:register(XMLValueType.STRING, "manureSensorLinkageData.sensors.sensor(?)#type", "Type of sensor (DEFAULT)") |
217 | schema:register(XMLValueType.NODE_INDEX, "manureSensorLinkageData.sensors.sensor(?)#node", "Path to sensor node") |
218 | |
219 | schema:register(XMLValueType.STRING, "manureSensorLinkageData.vehicles.vehicle(?)#filename", "Last part of vehicle filename") |
220 | schema:register(XMLValueType.STRING, "manureSensorLinkageData.vehicles.vehicle(?).linkNode(?)#node", "Name of node in i3d mapping") |
221 | schema:register(XMLValueType.STRING, "manureSensorLinkageData.vehicles.vehicle(?).linkNode(?)#type", "Type of node to link (DEFAULT)") |
222 | schema:register(XMLValueType.VECTOR_TRANS, "manureSensorLinkageData.vehicles.vehicle(?).linkNode(?)#translation", "Translation offset from node", "0 0 0") |
223 | schema:register(XMLValueType.VECTOR_ROT, "manureSensorLinkageData.vehicles.vehicle(?).linkNode(?)#rotation", "Rotation offset from node", "0 0 0") |
224 | schema:register(XMLValueType.VECTOR_SCALE, "manureSensorLinkageData.vehicles.vehicle(?).linkNode(?)#scale", "Scale of sensor node", "1 1 1") |
225 | |
226 | schema:register(XMLValueType.FLOAT, "manureSensorLinkageData.configuration#price", "Price of crop sensor config", 0) |
227 | end |