-- -- Tiller -- Class for all Tillers -- -- @author Stefan Geiger (mailto:sgeiger@giants.ch) -- @modified Sam Cappelle (mailto:sam@samcappelle.be) -- @date 14/08/2008 Tiller = {}; function Tiller.prerequisitesPresent(specializations) return SpecializationUtil.hasSpecialization(Cultivator,specializations); end; function Tiller:load(xmlFile) self.drumNode = Utils.indexToObject(self.rootNode, getXMLString(xmlFile, "vehicle.drum#index")); self.threshingParticleSystems1 = {}; local psName = "vehicle.threshingParticleSystem1"; Utils.loadParticleSystem(xmlFile, self.threshingParticleSystems1, psName, self.rootNode, false) self.threshingParticleSystems2 = {}; local psName = "vehicle.threshingParticleSystem2"; Utils.loadParticleSystem(xmlFile, self.threshingParticleSystems2, psName, self.rootNode, false) self.threshingParticleSystems3 = {}; local psName = "vehicle.threshingParticleSystem3"; Utils.loadParticleSystem(xmlFile, self.threshingParticleSystems3, psName, self.rootNode, false) self.threshingParticleSystems4 = {}; local psName = "vehicle.threshingParticleSystem4"; Utils.loadParticleSystem(xmlFile, self.threshingParticleSystems4, psName, self.rootNode, false) local workSound = getXMLString(xmlFile, "vehicle.workSound#file"); if workSound ~= nil and workSound ~= "" then self.workSound = createSample("workSound"); loadSample(self.workSound, workSound, false); self.workSoundPitchOffset = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.workSound#pitchOffset"), 0); self.workSoundPitchScale = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.workSound#pitchScale"), 0.05); self.workSoundPitchMax = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.workSound#pitchMax"), 2.0); end; delete(xmlFile); self.hasGroundContact = false; self.isActive = false; self.speedViolationMaxTime = 2500; self.speedViolationTimer = self.speedViolationMaxTime; return self; end; function Tiller:delete() removeContactReport(self.rootNode); Implement.delete(self); end; function Tiller:mouseEvent(posX, posY, isDown, isUp, button) Implement.mouseEvent(self, posX, posY, isDown, isUp, button); end; function Tiller:keyEvent(unicode, sym, modifier, isDown) Implement.keyEvent(self, unicode, sym, modifier, isDown); end; function Tiller:update(dt) if self.isAttached and self.isSelected then if InputBinding.hasEvent(InputBinding.IMPLEMENT_EXTRA) then self.isActive = not self.isActive; end; end; if self.isAttached and self.isActive and self.drumNode ~= nil then rotate(self.drumNode, 0.3 + (50 * self.attacherVehicle.lastSpeed), 0, 0); end; if self.hasGroundContact and self.isActive and table.getn(self.cuttingAreas) then local x,y,z = getWorldTranslation(self.cuttingAreas[1].start); local x1,y1,z1 = getWorldTranslation(self.cuttingAreas[1].width); local x2,y2,z2 = getWorldTranslation(self.cuttingAreas[1].height); Utils.updateCultivatorArea(x, z, x1, z1, x2, z2); Utils.destroyCompleteArea(x,z,x1,z1,x2,z2); end; if self.isActive then if not self.workSoundRunning then playSample(self.workSound, 0, 1.6, 0); self.workSoundRunning = true; end; end; if not self.isActive then if self.workSoundRunning then stopSample(self.workSound, 0, 1.6, 0); self.workSoundRunning = false; end; end; if self.hasGroundContact and self.isActive then Utils.setEmittingState(self.threshingParticleSystems1, true); Utils.setEmittingState(self.threshingParticleSystems2, true); Utils.setEmittingState(self.threshingParticleSystems3, true); Utils.setEmittingState(self.threshingParticleSystems4, true); end; if not self.hasGroundContact or not self.isActive then Utils.setEmittingState(self.threshingParticleSystems1, false); Utils.setEmittingState(self.threshingParticleSystems2, false); Utils.setEmittingState(self.threshingParticleSystems3, false); Utils.setEmittingState(self.threshingParticleSystems4, false); end; if self.isAttached and self.hasGroundContact then if self.attacherVehicle.lastSpeed*3600 > 20 then self.speedViolationTimer = self.speedViolationTimer - dt; if self.speedViolationTimer < 0 then self.attacherVehicle:detachImplementByObject(self); end; else self.speedViolationTimer = self.speedViolationMaxTime; end; else self.speedViolationTimer = self.speedViolationMaxTime; end; Implement.update(self, dt); end; function Tiller:draw() Implement.draw(self); if self.isActive then g_currentMission:addHelpButtonText("Kuhn Frse ausschalten", InputBinding.IMPLEMENT_EXTRA); else g_currentMission:addHelpButtonText("Kuhn Frse einschalten", InputBinding.IMPLEMENT_EXTRA); end; if math.abs(self.speedViolationTimer - self.speedViolationMaxTime) > 2 then g_currentMission:addWarning("Fahren Sie nicht zu schnell\nTempomat Stufe 1: Taste 1", 0.07+0.022, 0.019+0.029); end; end; function Tiller:onAttach(attacherVehicle) Implement.onAttach(self, attacherVehicle); addContactReport(self.rootNode, "groundContactReport", self); end; function Tiller:onDetach() Implement.onDetach(self); self.speedViolationTimer = self.speedViolationMaxTime; removeContactReport(self.rootNode); Utils.setEmittingState(self.threshingParticleSystems1, false); Utils.setEmittingState(self.threshingParticleSystems2, false); Utils.setEmittingState(self.threshingParticleSystems3, false); Utils.setEmittingState(self.threshingParticleSystems4, false); if self.workSoundRunning then stopSample(self.workSound, 0, 1.6, 0); self.workSoundRunning = false; end; end; function Tiller:groundContactReport(objectId, otherObjectId, isStart, normalForce, tangentialForce) if otherObjectId == g_currentMission.terrainRootNode then self.hasGroundContact = normalForce > 0 or tangentialForce > 0; end; end; function Utils.destroyCompleteArea(startWorldX, startWorldZ, widthWorldX, widthWorldZ, heightWorldX, heightWorldZ) local meadowId = g_currentMission.meadowId; local cuttedMeadowId = g_currentMission.cuttedMeadowId; Utils.updateDensity(meadowId, startWorldX, startWorldZ, widthWorldX, widthWorldZ, heightWorldX, heightWorldZ, 0, 0); Utils.updateDensity(cuttedMeadowId, startWorldX, startWorldZ, widthWorldX, widthWorldZ, heightWorldX, heightWorldZ, 0, 0); end;