Script v1.4.4.0
- Handtools
- Events
- Objects
- Placeables
- Triggers
- Utils
- Vehicles
- Specializations
- AIVehicle
- AnimatedVehicle
- ArticulatedAxis
- Attachable
- AttacherJointControl
- AttacherJoints
- BaleGrab
- BaleLoader
- Baler
- BaleWrapper
- BuiltInCutterTrailer
- BunkerSiloCompacter
- Combine
- ConveyorBelt
- Cover
- CrabSteering
- Crawler
- Cultivator
- Cutter
- Cylindered
- Drivable
- DynamicMountAttacher
- Fillable
- FillActivatable
- FillVolume
- Foldable
- ForageWagon
- FrontloaderAttacher
- FruitPreparer
- FuelTrailer
- Honk
- HookLiftContainer
- HookLiftTrailer
- Leveler
- Lights
- LivestockTrailer
- ManureBarrel
- ManureSpreader
- MixerWagon
- Motorized
- Mountable
- Mower
- NonTabbable
- Overloading
- Pickup
- Pipe
- Plough
- PowerConsumer
- RandomlyMovingParts
- ReceivingHopper
- ReverseDriving
- RidgeMarker
- Roller
- Ropes
- RotorSpreader
- SemiTrailerFront
- Shovel
- SowingMachine
- SpeedRotatingParts
- Sprayer
- Steerable
- StrawBlower
- StumpCutter
- Tedder
- TensionBelts
- Trailer
- TreePlanter
- TreePlanterActivatable
- TreeSaw
- TurnOnVehicle
- Washable
- WaterTrailer
- Weeder
- WheelRotations
- Windrower
- WoodCrusher
- WoodHarvester
- WorkArea
- WorkParticles
Engine v7.0.0.2
- General
- Entity
- Node
- Scenegraph
- Lighting
- Camera
- Shape
- Particle System
- Physics
- Spline
- Animation
- Overlays
- Sound
- Input
- XML
- Network
- Callbacks
- Text Rendering
- Terrain Detail
- Tire Track
- Editor
- Rendering
- String
- Math
- I3D
- Fillplanes
Foundation Reference
RidgeMarker
DescriptionThis is the specialization for tools which have a ridge markerFunctions
- initSpecialization
- prerequisitesPresent
- preLoad
- load
- postLoad
- readStream
- writeStream
- update
- updateTick
- draw
- canFoldRidgeMarker
- setFoldState
- onAiTurnOn
- onTurnedOff
- setRidgeMarkerState
- loadSpeedRotatingPartFromXML
- getIsSpeedRotatingPartActive
- loadWorkAreaFromXML
- getIsWorkAreaActive
initSpecialization
DescriptionCalled on specialization initializingDefinition
initSpecialization()Code
20 | function RidgeMarker.initSpecialization() |
21 | WorkArea.registerAreaType("ridgemarker"); |
22 | end |
prerequisitesPresent
DescriptionChecks if all prerequisite specializations are loadedDefinition
prerequisitesPresent(table specializations)Arguments
table | specializations | specializations |
boolean | hasPrerequisite | true if all prerequisite specializations are loaded |
28 | function RidgeMarker.prerequisitesPresent(specializations) |
29 | return SpecializationUtil.hasSpecialization(AnimatedVehicle, specializations) and SpecializationUtil.hasSpecialization(WorkArea, specializations); |
30 | end |
preLoad
DescriptionCalled before loadingDefinition
preLoad(table savegame)Arguments
table | savegame | savegame |
35 | function 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; |
42 | end |
load
DescriptionCalled on loadingDefinition
load(table savegame)Arguments
table | savegame | savegame |
47 | function 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; |
78 | end |
postLoad
DescriptionCalled after loadingDefinition
postLoad(table savegame)Arguments
table | savegame | savegame |
83 | function 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 |
88 | end |
readStream
DescriptionCalled on client side on joinDefinition
readStream(integer streamId, integer connection)Arguments
integer | streamId | streamId |
integer | connection | connection |
97 | function RidgeMarker:readStream(streamId, connection) |
98 | local state = streamReadUIntN(streamId, RidgeMarker.sendNumBits); |
99 | self:setRidgeMarkerState(state, true); |
100 | end |
writeStream
DescriptionCalled on server side on joinDefinition
writeStream(integer streamId, integer connection)Arguments
integer | streamId | streamId |
integer | connection | connection |
106 | function RidgeMarker:writeStream(streamId, connection) |
107 | streamWriteUIntN(streamId, self.ridgeMarkerState, RidgeMarker.sendNumBits); |
108 | end |
update
DescriptionCalled on updateDefinition
update(float dt)Arguments
float | dt | time since last call in ms |
128 | function 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 |
137 | end |
updateTick
DescriptionCalled on update tickDefinition
updateTick(float dt)Arguments
float | dt | time since last call in ms |
142 | function 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 |
197 | end |
draw
DescriptionCalled on drawDefinition
draw()Code
201 | function 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 |
208 | end |
canFoldRidgeMarker
DescriptionReturn if ridge markers can be foldenDefinition
canFoldRidgeMarker(integer state)Arguments
integer | state | state |
boolean | canFold | ridge markers can be folden |
214 | function 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; |
224 | end |
setFoldState
DescriptionCalled on folding state changeDefinition
setFoldState(integer direction, boolean moveToMiddle, boolean noEventSend)Arguments
integer | direction | direction |
boolean | moveToMiddle | move to middle position |
boolean | noEventSend | no event send |
231 | function RidgeMarker:setFoldState(direction, moveToMiddle, noEventSend) |
232 | if not moveToMiddle and direction > 0 then |
233 | self:setRidgeMarkerState(0, true); |
234 | end |
235 | end |
onAiTurnOn
DescriptionCalled on ai turn onDefinition
onAiTurnOn()Code
239 | function RidgeMarker:onAiTurnOn() |
240 | self:setRidgeMarkerState(0, true); |
241 | end |
onTurnedOff
DescriptionCalled on ai turn offDefinition
onTurnedOff()Code
245 | function RidgeMarker:onTurnedOff(noEventSend) |
246 | self:setRidgeMarkerState(0, true); |
247 | end |
setRidgeMarkerState
DescriptionToggle ridge marker stateDefinition
setRidgeMarkerState(integer state, boolean noEventSend)Arguments
integer | state | new state |
boolean | noEventSend | no event send |
253 | function 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 |
273 | end |
loadSpeedRotatingPartFromXML
DescriptionLoads speed rotating parts from xmlDefinition
loadSpeedRotatingPartFromXML(table speedRotatingPart, integer xmlFile, string key)Arguments
table | speedRotatingPart | speedRotatingPart |
integer | xmlFile | id of xml object |
string | key | key |
boolean | success | success |
281 | function 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; |
291 | end |
getIsSpeedRotatingPartActive
DescriptionReturns true if speed rotating part is activeDefinition
getIsSpeedRotatingPartActive(table speedRotatingPart)Arguments
table | speedRotatingPart | speedRotatingPart |
boolean | isActive | speed rotating part is active |
297 | function 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; |
306 | end |
loadWorkAreaFromXML
DescriptionLoads work areas from xmlDefinition
loadWorkAreaFromXML(table workArea, integer xmlFile, string key)Arguments
table | workArea | workArea |
integer | xmlFile | id of xml object |
string | key | key |
boolean | success | success |
314 | function 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; |
335 | end |
getIsWorkAreaActive
DescriptionReturns true if work area is activeDefinition
getIsWorkAreaActive(table workArea)Arguments
table | workArea | workArea |
boolean | isActive | work area is active |
341 | function 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; |
352 | end |