LUADOC - Farming Simulator 17

Printable Version

Script v1.4.4.0

Engine v7.0.0.2

Foundation Reference

RidgeMarker

Description
This is the specialization for tools which have a ridge marker
Functions

initSpecialization

Description
Called on specialization initializing
Definition
initSpecialization()
Code
20function RidgeMarker.initSpecialization()
21 WorkArea.registerAreaType("ridgemarker");
22end

prerequisitesPresent

Description
Checks if all prerequisite specializations are loaded
Definition
prerequisitesPresent(table specializations)
Arguments
tablespecializationsspecializations
Return Values
booleanhasPrerequisitetrue if all prerequisite specializations are loaded
Code
28function RidgeMarker.prerequisitesPresent(specializations)
29 return SpecializationUtil.hasSpecialization(AnimatedVehicle, specializations) and SpecializationUtil.hasSpecialization(WorkArea, specializations);
30end

preLoad

Description
Called before loading
Definition
preLoad(table savegame)
Arguments
tablesavegamesavegame
Code
35function RidgeMarker:preLoad(savegame)
36 self.canFoldRidgeMarker = RidgeMarker.canFoldRidgeMarker;
37 self.loadWorkAreaFromXML = Utils.overwrittenFunction(self.loadWorkAreaFromXML, RidgeMarker.loadWorkAreaFromXML);
38 self.loadSpeedRotatingPartFromXML = Utils.overwrittenFunction(self.loadSpeedRotatingPartFromXML, RidgeMarker.loadSpeedRotatingPartFromXML);
39 self.getIsSpeedRotatingPartActive = Utils.overwrittenFunction(self.getIsSpeedRotatingPartActive, RidgeMarker.getIsSpeedRotatingPartActive);
40 self.getIsWorkAreaActive = Utils.overwrittenFunction(self.getIsWorkAreaActive, RidgeMarker.getIsWorkAreaActive);
41 self.setRidgeMarkerState = RidgeMarker.setRidgeMarkerState;
42end

load

Description
Called on loading
Definition
load(table savegame)
Arguments
tablesavegamesavegame
Code
47function RidgeMarker:load(savegame)
48
49 local inputButtonStr = getXMLString(self.xmlFile, "vehicle.ridgeMarker#inputButton");
50 if inputButtonStr ~= nil then
51 self.ridgeMarkerInputButton = InputBinding[inputButtonStr];
52 end
53 self.ridgeMarkerInputButton = Utils.getNoNil(self.ridgeMarkerInputButton, InputBinding.IMPLEMENT_EXTRA4);
54
55 self.ridgeMarkers = {};
56 local i = 0;
57 while true do
58 local key = string.format("vehicle.ridgeMarkers.ridgeMarker(%d)", i);
59 if not hasXMLProperty(self.xmlFile, key) then
60 break;
61 end
62 if table.getn(self.ridgeMarkers) >= RidgeMarker.numMaxStates-1 then
63 print("Error: RidgeMarker.load too many rigdeMarker states. Only "..(RidgeMarker.numMaxStates-1).." states are supported");
64 break;
65 end
66 local ridgeMarker = {};
67 ridgeMarker.animName = getXMLString(self.xmlFile, key .. "#animName");
68 table.insert(self.ridgeMarkers, ridgeMarker);
69 i = i + 1;
70 end
71 self.numRigdeMarkers = table.getn(self.ridgeMarkers);
72
73 self.ridgeMarkerMinFoldTime = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.ridgeMarkers#foldMinLimit"), 0);
74 self.ridgeMarkerMaxFoldTime = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.ridgeMarkers#foldMaxLimit"), 1);
75 self.foldDisableDirection = getXMLInt(self.xmlFile, "vehicle.ridgeMarkers#foldDisableDirection");
76 self.ridgeMarkerOnlyActiveWhenLowered = Utils.getNoNil(getXMLBool(self.xmlFile, "vehicle.ridgeMarkers#onlyActiveWhenLowered"), true);
77 self.ridgeMarkerState = 0;
78end

postLoad

Description
Called after loading
Definition
postLoad(table savegame)
Arguments
tablesavegamesavegame
Code
83function RidgeMarker:postLoad(savegame)
84 for _, ridgeMarker in pairs(self.ridgeMarkers) do
85 self:playAnimation(ridgeMarker.animName, -1, nil, true);
86 AnimatedVehicle.updateAnimationByName(self, ridgeMarker.animName, 99999999);
87 end
88end

readStream

Description
Called on client side on join
Definition
readStream(integer streamId, integer connection)
Arguments
integerstreamIdstreamId
integerconnectionconnection
Code
97function RidgeMarker:readStream(streamId, connection)
98 local state = streamReadUIntN(streamId, RidgeMarker.sendNumBits);
99 self:setRidgeMarkerState(state, true);
100end

writeStream

Description
Called on server side on join
Definition
writeStream(integer streamId, integer connection)
Arguments
integerstreamIdstreamId
integerconnectionconnection
Code
106function RidgeMarker:writeStream(streamId, connection)
107 streamWriteUIntN(streamId, self.ridgeMarkerState, RidgeMarker.sendNumBits);
108end

update

Description
Called on update
Definition
update(float dt)
Arguments
floatdttime since last call in ms
Code
128function RidgeMarker:update(dt)
129 if self.isClient and self:getIsActiveForInput(true) and self.numRigdeMarkers > 0 then
130 if InputBinding.hasEvent(self.ridgeMarkerInputButton) then
131 local newState = (self.ridgeMarkerState + 1) % (self.numRigdeMarkers+1);
132 if self:canFoldRidgeMarker(newState) then
133 self:setRidgeMarkerState(newState);
134 end
135 end
136 end
137end

updateTick

Description
Called on update tick
Definition
updateTick(float dt)
Arguments
floatdttime since last call in ms
Code
142function RidgeMarker:updateTick(dt)
143 if self:getIsActive() and self.numRigdeMarkers > 0 then
144 if self.isServer and (not self.ridgeMarkerOnlyActiveWhenLowered or self:isLowered(false)) then
145 local typedWorkAreas = self:getTypedWorkAreas(WorkArea.AREATYPE_RIDGEMARKER);
146 local ploughWorkAreas = {};
147 local cultivatorWorkAreas = {};
148 for _, workArea in pairs(typedWorkAreas) do
149 if self:getIsWorkAreaActive(workArea) then
150 local x,_,z = getWorldTranslation(workArea.startTest);
151 if g_currentMission:getIsFieldOwnedAtWorldPos(x,z) then
152 local x1,_,z1 = getWorldTranslation(workArea.widthTest);
153 local x2,_,z2 = getWorldTranslation(workArea.heightTest);
154
155 local cultivatorArea = Utils.getDensityWithValue(g_currentMission.terrainDetailId, g_currentMission.terrainDetailTypeFirstChannel, g_currentMission.terrainDetailTypeNumChannels, g_currentMission.cultivatorValue, x, z, x1, z1, x2, z2);
156 local ploughArea = Utils.getDensityWithValue(g_currentMission.terrainDetailId, g_currentMission.terrainDetailTypeFirstChannel, g_currentMission.terrainDetailTypeNumChannels, g_currentMission.ploughValue, x, z, x1, z1, x2, z2);
157
158 local x,_,z = getWorldTranslation(workArea.start);
159 local x1,_,z1 = getWorldTranslation(workArea.width);
160 local x2,_,z2 = getWorldTranslation(workArea.height);
161 local sowingArea = Utils.getDensityWithValue(g_currentMission.terrainDetailId, g_currentMission.terrainDetailTypeFirstChannel, g_currentMission.terrainDetailTypeNumChannels, g_currentMission.sowingValue, x, z, x1, z1, x2, z2);
162
163 -- ignore non-field areas
164 if sowingArea > 0 or cultivatorArea > 0 or ploughArea > 0 then
165 local wx,wz = x1-x, z1-z;
166 local hx,hz = x2-x, z2-z;
167
168 local worldToDensity = g_currentMission.terrainDetailMapSize / g_currentMission.terrainSize;
169 x = math.floor(x*worldToDensity+0.5)/worldToDensity;
170 z = math.floor(z*worldToDensity+0.5)/worldToDensity;
171
172 x1, z1 = x+wx, z+wz;
173 x2, z2 = x+hx, z+hz;
174
175 local workAreasSend = ploughWorkAreas
176 if cultivatorArea < ploughArea then
177 workAreasSend = cultivatorWorkAreas
178 end
179
180 table.insert(workAreasSend, {x,z,x1,z1,x2,z2});
181 end
182 end
183 end
184 end
185 if table.getn(ploughWorkAreas) > 0 then
186 local dx,_,dz = localDirectionToWorld(Utils.getNoNil(self.sowingDirectionNode, self.rootNode), 0, 0, 1);
187 local angle = Utils.convertToDensityMapAngle(Utils.getYRotationFromDirection(dx, dz), g_currentMission.terrainDetailAngleMaxValue);
188 Plough.processPloughAreas(self, ploughWorkAreas, true, true, angle);
189 end
190 if table.getn(cultivatorWorkAreas) > 0 then
191 local dx,_,dz = localDirectionToWorld(Utils.getNoNil(self.sowingDirectionNode, self.rootNode), 0, 0, 1);
192 local angle = Utils.convertToDensityMapAngle(Utils.getYRotationFromDirection(dx, dz), g_currentMission.terrainDetailAngleMaxValue);
193 Cultivator.processCultivatorAreas(self, cultivatorWorkAreas, true, true, angle);
194 end
195 end
196 end
197end

draw

Description
Called on draw
Definition
draw()
Code
201function RidgeMarker:draw()
202 if self.numRigdeMarkers > 0 and self:getIsActiveForInput(true) then
203 local newState = (self.ridgeMarkerState + 1) % (self.numRigdeMarkers+1);
204 if self:canFoldRidgeMarker(newState) then
205 g_currentMission:addHelpButtonText(g_i18n:getText("action_toggleRidgeMarker"), self.ridgeMarkerInputButton, nil, GS_PRIO_NORMAL);
206 end
207 end
208end

canFoldRidgeMarker

Description
Return if ridge markers can be folden
Definition
canFoldRidgeMarker(integer state)
Arguments
integerstatestate
Return Values
booleancanFoldridge markers can be folden
Code
214function RidgeMarker:canFoldRidgeMarker(state)
215 if self.foldAnimTime ~= nil and (self.foldAnimTime < self.ridgeMarkerMinFoldTime or self.foldAnimTime > self.ridgeMarkerMaxFoldTime) then
216 return false;
217 end
218
219 if state ~= 0 and not self.moveToMiddle and self.foldDisableDirection ~= nil and (self.foldDisableDirection == self.foldMoveDirection or self.foldMoveDirection == 0) then
220 return false;
221 end
222
223 return true;
224end

setFoldState

Description
Called on folding state change
Definition
setFoldState(integer direction, boolean moveToMiddle, boolean noEventSend)
Arguments
integerdirectiondirection
booleanmoveToMiddlemove to middle position
booleannoEventSendno event send
Code
231function RidgeMarker:setFoldState(direction, moveToMiddle, noEventSend)
232 if not moveToMiddle and direction > 0 then
233 self:setRidgeMarkerState(0, true);
234 end
235end

onAiTurnOn

Description
Called on ai turn on
Definition
onAiTurnOn()
Code
239function RidgeMarker:onAiTurnOn()
240 self:setRidgeMarkerState(0, true);
241end

onTurnedOff

Description
Called on ai turn off
Definition
onTurnedOff()
Code
245function RidgeMarker:onTurnedOff(noEventSend)
246 self:setRidgeMarkerState(0, true);
247end

setRidgeMarkerState

Description
Toggle ridge marker state
Definition
setRidgeMarkerState(integer state, boolean noEventSend)
Arguments
integerstatenew state
booleannoEventSendno event send
Code
253function RidgeMarker:setRidgeMarkerState(state, noEventSend)
254 if noEventSend == nil or noEventSend == false then
255 if g_server ~= nil then
256 g_server:broadcastEvent(RidgeMarkerSetStateEvent:new(self, state), nil, nil, self);
257 else
258 g_client:getServerConnection():sendEvent(RidgeMarkerSetStateEvent:new(self, state));
259 end
260 end
261 -- fold last state
262 if self.ridgeMarkerState ~= 0 then
263 local animTime = self:getAnimationTime(self.ridgeMarkers[self.ridgeMarkerState].animName);
264 self:playAnimation(self.ridgeMarkers[self.ridgeMarkerState].animName, -1, animTime, true);
265 end
266 self.ridgeMarkerState = state;
267
268 -- unfold new state
269 if self.ridgeMarkerState ~= 0 then
270 local animTime = self:getAnimationTime(self.ridgeMarkers[self.ridgeMarkerState].animName);
271 self:playAnimation(self.ridgeMarkers[self.ridgeMarkerState].animName, 1, animTime, true);
272 end
273end

loadSpeedRotatingPartFromXML

Description
Loads speed rotating parts from xml
Definition
loadSpeedRotatingPartFromXML(table speedRotatingPart, integer xmlFile, string key)
Arguments
tablespeedRotatingPartspeedRotatingPart
integerxmlFileid of xml object
stringkeykey
Return Values
booleansuccesssuccess
Code
281function RidgeMarker:loadSpeedRotatingPartFromXML(superFunc, speedRotatingPart, xmlFile, key)
282 if superFunc ~= nil then
283 if not superFunc(self, speedRotatingPart, xmlFile, key) then
284 return false;
285 end
286 end
287 speedRotatingPart.ridgeMarkerAnim = getXMLString(xmlFile, key .. "#ridgeMarkerAnim");
288 speedRotatingPart.ridgeMarkerAnimTimeMax = Utils.getNoNil(getXMLFloat(xmlFile, key .. "#ridgeMarkerAnimTimeMax"), 0.99);
289
290 return true;
291end

getIsSpeedRotatingPartActive

Description
Returns true if speed rotating part is active
Definition
getIsSpeedRotatingPartActive(table speedRotatingPart)
Arguments
tablespeedRotatingPartspeedRotatingPart
Return Values
booleanisActivespeed rotating part is active
Code
297function RidgeMarker:getIsSpeedRotatingPartActive(superFunc, speedRotatingPart)
298 if speedRotatingPart.ridgeMarkerAnim ~= nil and self:getAnimationTime(speedRotatingPart.ridgeMarkerAnim) < speedRotatingPart.ridgeMarkerAnimTimeMax then
299 return false;
300 end
301
302 if superFunc ~= nil then
303 return superFunc(self, speedRotatingPart);
304 end
305 return true;
306end

loadWorkAreaFromXML

Description
Loads work areas from xml
Definition
loadWorkAreaFromXML(table workArea, integer xmlFile, string key)
Arguments
tableworkAreaworkArea
integerxmlFileid of xml object
stringkeykey
Return Values
booleansuccesssuccess
Code
314function RidgeMarker:loadWorkAreaFromXML(superFunc, workArea, xmlFile, key)
315 local retValue = true;
316 if superFunc ~= nil then
317 retValue = superFunc(self, workArea, xmlFile, key)
318 end
319
320 local startTest = Utils.indexToObject(self.components, getXMLString(xmlFile, key .."#startIndexTest"));
321 local widthTest = Utils.indexToObject(self.components, getXMLString(xmlFile, key .."#widthIndexTest"));
322 local heightTest = Utils.indexToObject(self.components, getXMLString(xmlFile, key .."#heightIndexTest"));
323 if startTest ~= nil and widthTest ~= nil and heightTest ~= nil then
324 workArea.startTest = startTest;
325 workArea.widthTest = widthTest;
326 workArea.heightTest = heightTest;
327 workArea.animName = getXMLString(xmlFile, key .. "#animName");
328
329 if workArea.type == WorkArea.AREATYPE_DEFAULT then
330 workArea.type = WorkArea.AREATYPE_RIDGEMARKER;
331 end
332 end
333
334 return retValue;
335end

getIsWorkAreaActive

Description
Returns true if work area is active
Definition
getIsWorkAreaActive(table workArea)
Arguments
tableworkAreaworkArea
Return Values
booleanisActivework area is active
Code
341function RidgeMarker:getIsWorkAreaActive(superFunc, workArea)
342 if workArea.type == WorkArea.AREATYPE_RIDGEMARKER then
343 if self:getAnimationTime(workArea.animName) < 0.99 then
344 return false;
345 end
346 end
347
348 if superFunc ~= nil then
349 return superFunc(self, workArea);
350 end
351 return true;
352end