_=[[ toggleAnimParts.lua -------------------------------------------------------------------------------------------------------------------- Author: Sven777b (ICQ#95176001) Version 1.0 - 12.04.2010 Version 1.3 - 19.04.2010 Version 1.4 - 30.07.2011 Version 1.5 - 11.08.2011 26/10/16 : convert for Farming Simulator 17 by Frabel ls modding frei verwendbar - keine erlaubnis nötig | free for use - no permission needed. Modifikationen erst nach Rücksprache! | modifications only with my permission. Hinweis: das Kopieren von Sourcecode ist strafbar nach UrhG §2.1 -------------------------------------------------------------------------------------------------------------------- Fahrzeug XML: ================================================================= id : frei vergebener Name - ist gleichzeitig Bezeichner für l10n Text und InputBinding showHelp : true/false - Hilfetext anzeigen oder nicht rotMin/rotMax : rotation auf 3 Achsen transMin/transMax : bewegung auf 3 Achsen scaleMin/scaleMax : skalierung auf 3 Achsen - alles kombinierbar moveTime : Laufzeit in Sekunden in der die Bewegung abgeschlossen wird. autoReturn : true/false - wenn true, dann kehrt die Animation zurück sobald der Knopf losgelassen wird. permRotAxis : 1-3 - rotiert das Objekt permanent um die angegebene Achse. moveTime definiert dabei die Zeit für eine 360° Umdrehung. listenTo : übergeht das InputBinding und reagiert stattdessen auf die angegebene Variable. So kann man eine Bewegung zum Beispiel ans Licht koppeln isMovingTool : true/false - wenn true wird das zugehörige movingTool aktualisiert um so eine Kollision oder Zylinder mit zu bewegen. ================================================================= moddesc: Abschnitt : Abschnitt : (für jedes InputBinding sollte ein passender Text in l10n angelegt werden welcher auch als Hilfetext dient) Dachfenster roofwindow (die InputBindings müssen ebenfalls definiert werden) ]] toggleAnimatedParts = {}; function toggleAnimatedParts.prerequisitesPresent(specializations) return true; end; function toggleAnimatedParts:load(savegame) self.toggle = SpecializationUtil.callSpecializationsFunction("toggle"); self.animParts = {}; local c = 0; while true do local baseString = string.format("vehicle.animParts.animPart(%d)#",c); local index = getXMLString(self.xmlFile,baseString.."index"); local id = getXMLString(self.xmlFile,baseString.."id"); local listenTo = getXMLString(self.xmlFile,baseString.."listenTo"); if index == nil or id == nil or (InputBinding[id] == nil and listenTo == nil) then break; end; local part = {}; part.index = Utils.indexToObject(self.components, index); part.id = id; part.listenTo = listenTo; local rotMin = getXMLString(self.xmlFile,baseString.."rotMin"); local rotMax = getXMLString(self.xmlFile,baseString.."rotMax"); if rotMin ~= nil and rotMax ~= nil then local x,y,z = Utils.getVectorFromString(rotMin); part.rotMin = {math.rad(Utils.getNoNil(x,0)),math.rad(Utils.getNoNil(y,0)),math.rad(Utils.getNoNil(z,0))}; local x,y,z = Utils.getVectorFromString(rotMax); part.rotMax = {math.rad(Utils.getNoNil(x,0)),math.rad(Utils.getNoNil(y,0)),math.rad(Utils.getNoNil(z,0))}; end; local transMin = getXMLString(self.xmlFile,baseString.."transMin"); local transMax = getXMLString(self.xmlFile,baseString.."transMax"); if transMin ~= nil and transMax ~= nil then local x,y,z = Utils.getVectorFromString(transMin); part.transMin = {Utils.getNoNil(x,0),Utils.getNoNil(y,0),Utils.getNoNil(z,0)}; local x,y,z = Utils.getVectorFromString(transMax); part.transMax = {Utils.getNoNil(x,0),Utils.getNoNil(y,0),Utils.getNoNil(z,0)}; end; local scaleMin = getXMLString(self.xmlFile,baseString.."scaleMin"); local scaleMax = getXMLString(self.xmlFile,baseString.."scaleMax"); if scaleMin ~= nil and scaleMax ~= nil then local x,y,z = Utils.getVectorFromString(scaleMin); part.scaleMin = {Utils.getNoNil(x,1),Utils.getNoNil(y,1),Utils.getNoNil(z,1)}; local x,y,z = Utils.getVectorFromString(scaleMax); part.scaleMax = {Utils.getNoNil(x,1),Utils.getNoNil(y,1),Utils.getNoNil(z,1)}; end; local permRotAxis = getXMLInt(self.xmlFile,baseString.."permRotAxis"); if permRotAxis ~= nil then if permRotAxis >= 1 and permRotAxis <= 3 then part.permRotAxis = permRotAxis; end; end; part.moveTime = Utils.getNoNil(getXMLFloat(self.xmlFile,baseString.."moveTime"),1)*1000; part.helpText = Utils.getNoNil(getXMLBool(self.xmlFile, baseString.."showHelp"),false); part.autoReturn = Utils.getNoNil(getXMLBool(self.xmlFile, baseString.."autoReturn"),false); part.isMovingTool = Utils.getNoNil(getXMLBool(self.xmlFile, baseString.."isMovingTool"),false); part.toMax = false; part.move = false; table.insert(self.animParts,part); c=c+1; end; end; function toggleAnimatedParts:delete() end; function toggleAnimatedParts:mouseEvent(posX, posY, isDown, isUp, button) end; function toggleAnimatedParts:keyEvent(unicode, sym, modifier, isDown) end; function toggleAnimatedParts:update(dt) if self:getIsActiveForInput() then for nr,part in ipairs(self.animParts) do if not part.autoReturn then if InputBinding.hasEvent(InputBinding[part.id]) then self:toggle(nr,not part.toMax); end; else if InputBinding.isPressed(InputBinding[part.id]) then if not part.toMax then self:toggle(nr,true); end; else if part.toMax then self:toggle(nr,false); end; end; end; end; end; if self:getIsActive() then for _,part in ipairs(self.animParts) do if part.listenTo ~= nil then if self[part.listenTo] then part.toMax = true; part.move = true; else part.toMax = false; end; end; if part.move then part.move = false; if part.rotMin ~= nil then local curRot = {getRotation(part.index)}; local newRot = Utils.getMovedLimitedValues(curRot, part.rotMax, part.rotMin, 3, part.moveTime, dt, not part.toMax); setRotation(part.index, unpack(newRot)); for i=1,3 do if math.abs(newRot[i]-curRot[i]) > 0.001 then part.move = true; end; end; end; if part.transMin ~= nil then local curTrans = {getTranslation(part.index)}; local newTrans = Utils.getMovedLimitedValues(curTrans, part.transMax, part.transMin, 3, part.moveTime, dt, not part.toMax); setTranslation(part.index, unpack(newTrans)); for i=1,3 do if math.abs(newTrans[i]-curTrans[i]) > 0.001 then part.move = true; end; end; end; if part.scaleMin ~= nil then local curScale = {getScale(part.index)}; local newScale = Utils.getMovedLimitedValues(curScale, part.scaleMax, part.scaleMin, 3, part.moveTime, dt, not part.toMax); setScale(part.index, unpack(newScale)); for i=1,3 do if math.abs(newScale[i]-curScale[i]) > 0.001 then part.move = true; end; end; end; if part.permRotAxis ~= nil then local spd = ((2*math.pi) / part.moveTime) * dt; local newRot = {0,0,0}; newRot[part.permRotAxis] = spd; rotate(part.index, unpack(newRot)); part.move = part.toMax; end; if part.isMovingTool then self:setMovingToolDirty(part.index); end; end; end; end; end; function toggleAnimatedParts:updateTick(dt) end; function toggleAnimatedParts:draw() if self:getIsActiveForInput() then for _,part in ipairs(self.animParts) do if part.helpText then g_currentMission:addHelpButtonText(g_i18n:getText(part.id), InputBinding[part.id]); end; end; end; end; function toggleAnimatedParts:toggle(id,state,nes) toggleAnimEvent.sendEvent(self,id,state,nes); self.animParts[id].toMax = state; self.animParts[id].move = true; end; function toggleAnimatedParts:readStream(streamId, connection) for nr,part in ipairs(self.animParts) do local state = streamReadBool(streamId); self:toggle(nr,state,true); end; end; function toggleAnimatedParts:writeStream(streamId, connection) for nr,part in ipairs(self.animParts) do streamWriteBool(streamId,part.toMax); end; end; toggleAnimEvent = {}; toggleAnimEvent_mt = Class(toggleAnimEvent, Event); InitEventClass(toggleAnimEvent, "toggleAnimEvent"); function toggleAnimEvent:emptyNew() local self = Event:new(toggleAnimEvent_mt); self.className="toggleAnimEvent"; return self; end; function toggleAnimEvent:new(object, id, state) local self = toggleAnimEvent:emptyNew() self.object = object; self.id = id; self.state = state; return self; end; function toggleAnimEvent:readStream(streamId, connection) self.object = networkGetObject(streamReadInt32(streamId)); self.id = streamReadInt8(streamId); self.state = streamReadBool(streamId); self:run(connection); end; function toggleAnimEvent:writeStream(streamId, connection) streamWriteInt32(streamId, networkGetObjectId(self.object)); streamWriteInt8(streamId, self.id); streamWriteBool(streamId, self.state); end; function toggleAnimEvent:run(connection) self.object:toggle(self.id,self.state, true); if not connection:getIsServer() then g_server:broadcastEvent(toggleAnimEvent:new(self.object, self.id, self.state), nil, connection, self.object); end; end; function toggleAnimEvent.sendEvent(vehicle, id, state, nes) if nes == nil or nes == false then if g_server ~= nil then g_server:broadcastEvent(toggleAnimEvent:new(vehicle, id, state), nil, nil, vehicle); else g_client:getServerConnection():sendEvent(toggleAnimEvent:new(vehicle, id, state)); end; end; end;