Page 2 of 3

Re: Automatisches Befüllen von Anhängern/containern

Posted: Sat Feb 10, 2024 7:25 pm
by Haubi
Ja gut, jetzt versteh ich, um was es geht. Ich hab das halt bei einigen selbstgebauten Produktionen so, dass die quasi auf einen Haufen produzieren. Da ist die Vorgehensweise denkbar einfach. Ich hab da ein 3D Modell von dem Haufen wo eben die passende fillType plane drauf liegt, welcher sich dann halt mit zunehmendem Füllstand der Storage von der produzierenden Anlage aus dem Boden hebt, also sichtbar wird. Die Anlage produziert also in die eingetragene Storage, und der Haufen simuliert, dass dort das jeweilige Produkt liegt. :biggrin2:

Re: Automatisches Befüllen von Anhängern/containern

Posted: Sat Feb 10, 2024 11:10 pm
by Achimobil
Also beim letzten mal wo ich unters rohr gefahren bin hat er automatisch befüllt bei meinem mod

Re: Automatisches Befüllen von Anhängern/containern

Posted: Sun Feb 11, 2024 1:26 pm
by LS-Lara
Achimobil wrote: Sat Feb 10, 2024 11:10 pm Also beim letzten mal wo ich unters rohr gefahren bin hat er automatisch befüllt bei meinem mod
Verstehe ich nicht, was da los ist :confusednew: . Komplett neues Savegame, nur Dein Mod aktiv. Silo hingestellt und Weizen reingeschüttet. Frontladerschaufel oder Anhänger in den Trigger unter das Abladerohr gefahren. Es entläd sich nicht automatisch - kommt ganz normal die GUI-Info zum Starten der Beladung mit "R" oder Gamepad.

Wenn eine automatische Entladung stattfinden würde, dann verstehe ich auch nicht diesen Hinweis in der Modbeschreibung:
Durch eine Skript Erweiterung wird der Inhalt trotzdem ohne zusätzliches Popupmenü ausgegeben, wenn man die Beladentaste des Fahrzeugs nutzt.
Die Beladetaste könnte ja gar nicht mehr gedrückt werden, wenn es schon automatisch rauskommt ???

@Regenbogenprinzessin: Wie sieht das denn bei Dir aus ? Entläd der Mod von Achimobil bei Dir automatisch ?

Re: Automatisches Befüllen von Anhängern/containern

Posted: Sun Feb 11, 2024 9:23 pm
by Regenbogenprinzessin
@Regenbogenprinzessin: Wie sieht das denn bei Dir aus ? Entläd der Mod von Achimobil bei Dir automatisch ?
Ich habe das Silo von Achimobil grad mal runtergeladen und ausprobiert. Also bei mir füllt sich die Radladerschaufel auch nicht von alleine, wenn ich drutner fahre. Er gibt mir nur die Option R für Befüllen

Re: Automatisches Befüllen von Anhängern/containern

Posted: Mon Feb 12, 2024 8:36 am
by Achimobil
Schande über mein Haupt, ihr habt recht. Ich habe mit dem Skript nur korrigiert dass es bei mehrere erlaubten Filltypes wie von giants vorgesehen ohne Auswahldialog funktioniert. R muss man trotzdem drücken.

Re: Automatisches Befüllen von Anhängern/containern

Posted: Mon Feb 12, 2024 3:09 pm
by LS-Lara
Na dann sind wir ja alle auf gleichem Stand und mein Verständnis vom Quellcode passt auch weiterhin !

So, womit man hier durchaus arbeiten kann ist die Variable "automaticFilling" die letztlich von ganz oben aus "Platform.gameplay" kommt. Per default "false" und nur bei "Platform.mobile" auf "true".

Wenn man daran rumspielt, kann man das Zeugs ohne "R" rauslaufen lassen, sobald irgendwas unter den Trigger kommt. Jetzt muss ich das nur noch ein bisschen "schön" programmieren, dann hätten wir's.

Re: Automatisches Befüllen von Anhängern/containern

Posted: Tue Feb 13, 2024 4:02 pm
by LS-Lara
So ... das wäre der Prototyp ohne Gewähr. Kann man bestimmt noch einiges dran optimieren, wenn man Lust und Zeit hat - aber funktioniert bei mir erst mal problemlos.

Code: Select all

--[[

https://forum.giants-software.com/viewtopic.php?t=204793

Source of the original code: LoadTrigger.lua by Giants Software

]]

print("------------------------------------------------------------> START LOADING SCRIPT instantLoad.lua")
InstantLoad = {}

-- adding custom nodes for XML
function InstantLoad.registerXMLPaths(schema, basePath)
    schema:register(XMLValueType.BOOL, basePath .. "#instaLoad", "Start loading instantly", false)
    schema:register(XMLValueType.BOOL, basePath .. "#instaLoadPause", "Allow to pause loading instantly", true)
end
LoadTrigger.registerXMLPaths = Utils.appendedFunction(LoadTrigger.registerXMLPaths, InstantLoad.registerXMLPaths)
print("------------------------------------------------------------> append done: InstantLoad.registerXMLPaths")

-- customized setting for automaticFilling
function InstantLoad:load(superFunc, components, xmlFile, xmlNode, i3dMappings, rootNode)
	self.rootNode = rootNode or xmlFile:getValue(xmlNode .. "#node", nil, components, i3dMappings)

	if self.rootNode == nil then
		Logging.xmlError(xmlFile, "Missing node '%s#node'", xmlNode)

		return false
	end

	self.objectsInTriggers = {}

	XMLUtil.checkDeprecatedXMLElements(xmlFile, xmlNode .. "#scrollerIndex", xmlNode .. "#scrollerNode")
	XMLUtil.checkDeprecatedUserAttribute(self.rootNode, "triggerNode", xmlFile, xmlNode .. "#triggerNode")
	XMLUtil.checkDeprecatedUserAttribute(self.rootNode, "triggerIndex", xmlFile, xmlNode .. "#triggerNode")
	XMLUtil.checkDeprecatedUserAttribute(self.rootNode, "fillLitersPerSecond", xmlFile, xmlNode .. "#fillLitersPerSecond")
	XMLUtil.checkDeprecatedUserAttribute(self.rootNode, "dischargeNode", xmlFile, xmlNode .. "#dischargeNode")
	XMLUtil.checkDeprecatedUserAttribute(self.rootNode, "fillSoundIdentifier", xmlFile, xmlNode .. "#fillSoundIdentifier")
	XMLUtil.checkDeprecatedUserAttribute(self.rootNode, "fillSoundNode", xmlFile, xmlNode .. "#fillSoundNode")
	XMLUtil.checkDeprecatedUserAttribute(self.rootNode, "scrollerIndex", xmlFile, xmlNode .. "#scrollerNode")
	XMLUtil.checkDeprecatedUserAttribute(self.rootNode, "shaderParameterName", xmlFile, xmlNode .. "#shaderParameterName")
	XMLUtil.checkDeprecatedUserAttribute(self.rootNode, "scrollerScrollSpeed", xmlFile, xmlNode .. "#scrollerScrollSpeed")
	XMLUtil.checkDeprecatedUserAttribute(self.rootNode, "fillTypeCategories", xmlFile, xmlNode .. "#fillTypeCategories")
	XMLUtil.checkDeprecatedUserAttribute(self.rootNode, "fillTypes", xmlFile, xmlNode .. "#fillTypes")
	XMLUtil.checkDeprecatedUserAttribute(self.rootNode, "autoStart", xmlFile, xmlNode .. "#autoStart")
	XMLUtil.checkDeprecatedUserAttribute(self.rootNode, "infiniteCapacity", xmlFile, xmlNode .. "#infiniteCapacity")
    -- >> check customized nodes
    XMLUtil.checkDeprecatedUserAttribute(self.rootNode, "instaLoad", xmlFile, xmlNode .. "#instaLoad")
    XMLUtil.checkDeprecatedUserAttribute(self.rootNode, "instaLoadPause", xmlFile, xmlNode .. "#instaLoadPause")
    -- <<

	local triggerNode = xmlFile:getValue(xmlNode .. "#triggerNode", nil, components, i3dMappings)

	if triggerNode == nil then
		Logging.xmlError(xmlFile, "Missing triggerNode defined in '%s'", xmlNode)

		return false
	end

	self.triggerNode = triggerNode

	addTrigger(triggerNode, "loadTriggerCallback", self)
	g_currentMission:addNodeObject(triggerNode, self)

	self.fillLitersPerMS = xmlFile:getValue(xmlNode .. "#fillLitersPerSecond", 1000) / 1000
	self.aiNode = xmlFile:getValue(xmlNode .. "#aiNode", nil, components, i3dMappings)
	self.supportsAILoading = self.aiNode ~= nil
	local dischargeNode = xmlFile:getValue(xmlNode .. "#dischargeNode", nil, components, i3dMappings)

	if dischargeNode ~= nil then
		XMLUtil.checkDeprecatedUserAttribute(dischargeNode, "width", xmlFile, xmlNode .. "#dischargeWidth")
		XMLUtil.checkDeprecatedUserAttribute(dischargeNode, "length", xmlFile, xmlNode .. "#dischargeLength")

		self.dischargeInfo = {
			name = "fillVolumeDischargeInfo",
			nodes = {}
		}
		local width = xmlFile:getValue(xmlNode .. "#dischargeWidth", 0.5)
		local length = xmlFile:getValue(xmlNode .. "#dischargeLength", 0.5)

		table.insert(self.dischargeInfo.nodes, {
			priority = 1,
			node = dischargeNode,
			width = width,
			length = length
		})
	end

	self.soundNode = createTransformGroup("loadTriggerSoundNode")

	link(dischargeNode or self.triggerNode, self.soundNode)

	if self.isClient then
		self.effects = g_effectManager:loadEffect(xmlFile, xmlNode, components, self, i3dMappings)
		self.samples = {}
		local fillSoundIdentifier = xmlFile:getValue(xmlNode .. "#fillSoundIdentifier")
		local fillSoundNode = xmlFile:getValue(xmlNode .. "#fillSoundNode", nil, components, i3dMappings)

		if fillSoundNode == nil then
			fillSoundNode = self.rootNode
		end

		local xmlSoundFile = loadXMLFile("mapXML", g_currentMission.missionInfo.mapSoundXmlFilename)

		if xmlSoundFile ~= nil and xmlSoundFile ~= 0 then
			local directory = g_currentMission.baseDirectory
			local modName, baseDirectory = Utils.getModNameAndBaseDirectory(g_currentMission.missionInfo.mapSoundXmlFilename)

			if modName ~= nil then
				directory = baseDirectory .. modName
			end

			if fillSoundIdentifier ~= nil then
				self.samples.load = g_soundManager:loadSampleFromXML(xmlSoundFile, "sound.object", fillSoundIdentifier, directory, getRootNode(), 0, AudioGroup.ENVIRONMENT, nil, nil)

				if self.samples.load ~= nil then
					link(fillSoundNode, self.samples.load.soundNode)
					setTranslation(self.samples.load.soundNode, 0, 0, 0)
				end
			end

			delete(xmlSoundFile)
		end

		self.scroller = xmlFile:getValue(xmlNode .. "#scrollerNode", nil, components, i3dMappings)

		if self.scroller ~= nil then
			self.scrollerShaderParameterName = xmlFile:getValue(xmlNode .. "#shaderParameterName", "uvScrollSpeed")
			self.scrollerSpeedX, self.scrollerSpeedY = xmlFile:getValue(xmlNode .. "#scrollerScrollSpeed", "0 -0.75")

			setShaderParameter(self.scroller, self.scrollerShaderParameterName, 0, 0, 0, 0, false)
		end
	end

	self.fillTypes = {}
	local fillTypeCategories = XMLUtil.getValueFromXMLFileOrUserAttribute(xmlFile, xmlNode, "fillTypeCategories", self.rootNode)
	local fillTypeNames = XMLUtil.getValueFromXMLFileOrUserAttribute(xmlFile, xmlNode, "fillTypes", self.rootNode)
	local fillTypes = nil

	if fillTypeCategories ~= nil and fillTypeNames == nil then
		fillTypes = g_fillTypeManager:getFillTypesByCategoryNames(fillTypeCategories, "Warning: UnloadTrigger has invalid fillTypeCategory '%s'.")
	elseif fillTypeCategories == nil and fillTypeNames ~= nil then
		fillTypes = g_fillTypeManager:getFillTypesByNames(fillTypeNames, "Warning: UnloadTrigger has invalid fillType '%s'.")
	end

	if fillTypes ~= nil then
		for _, fillType in pairs(fillTypes) do
			self.fillTypes[fillType] = true
		end
	else
		self.fillTypes = nil
	end

	self.autoStart = xmlFile:getValue(xmlNode .. "#autoStart", false)
	self.hasInfiniteCapacity = xmlFile:getValue(xmlNode .. "#infiniteCapacity", false)
	self.startFillText = g_i18n:convertText(xmlFile:getValue(xmlNode .. "#startFillText", "$l10n_action_siloStartFilling"))
	self.stopFillText = g_i18n:convertText(xmlFile:getValue(xmlNode .. "#stopFillText", "$l10n_action_siloStopFilling"))
	self.activatable = LoadTriggerActivatable.new(self)
    -- >> load customized nodes
    self.instaLoad = xmlFile:getValue(xmlNode .. "#instaLoad", false)
    self.instaLoadPause = xmlFile:getValue(xmlNode .. "#instaLoadPause", true)
    -- <<

	self.activatable:setText(self.startFillText)

	self.isLoading = false
	self.selectedFillType = FillType.UNKNOWN
    
    -- >> rework parameters
    if self.instaLoad then
        print("----------> The instaLoad is strong with this one !")
        print("----------> Pause allowed: " .. tostring(self.instaLoadPause) )
        if not self.autoStart then
            print("----------> autoStart: " .. tostring(self.autoStart) )
            print("----------> instaLoad will be disabled !")
        else
            self.automaticFilling = true
        end
    else
        self.automaticFilling = Platform.gameplay.automaticFilling
    end
    -- <<
	
	self.requiresActiveVehicle = not self.automaticFilling
	self.automaticFillingTimer = 0
    

	return true
end
LoadTrigger.load = Utils.overwrittenFunction(LoadTrigger.load, InstantLoad.load)
print("------------------------------------------------------------> overwrite done: InstantLoad:load")


-- implement optional pause
function InstantLoad:loadTriggerCallback(superFunc, triggerId, otherId, onEnter, onLeave, onStay, otherShapeId)
	local fillableObject = g_currentMission:getNodeObject(otherId)


	if fillableObject ~= nil and fillableObject ~= self.source and fillableObject.getRootVehicle ~= nil and fillableObject.getFillUnitIndexFromNode ~= nil then
		local fillTypes = self.source:getSupportedFillTypes()

		if fillTypes ~= nil then
			local foundFillUnitIndex = fillableObject:getFillUnitIndexFromNode(otherId)

			if foundFillUnitIndex ~= nil then
				local found = false

				for fillTypeIndex, state in pairs(fillTypes) do
					if state and (self.fillTypes == nil or self.fillTypes[fillTypeIndex]) and fillableObject:getFillUnitSupportsFillType(foundFillUnitIndex, fillTypeIndex) and fillableObject:getFillUnitAllowsFillType(foundFillUnitIndex, fillTypeIndex) then
						found = true

						break
					end
				end

				if not found then
					foundFillUnitIndex = nil
				end
			end

			if foundFillUnitIndex == nil then
				for fillTypeIndex, state in pairs(fillTypes) do
					if state and (self.fillTypes == nil or self.fillTypes[fillTypeIndex]) then
						local fillUnits = fillableObject:getFillUnits()

						for fillUnitIndex, fillUnit in ipairs(fillUnits) do
							if fillUnit.exactFillRootNode == nil and fillableObject:getFillUnitSupportsFillType(fillUnitIndex, fillTypeIndex) and fillableObject:getFillUnitAllowsFillType(fillUnitIndex, fillTypeIndex) then
								foundFillUnitIndex = fillUnitIndex

								break
							end
						end
					end
				end
			end

			if foundFillUnitIndex ~= nil then
				if onEnter then
					self.fillableObjects[otherId] = {
						object = fillableObject,
						fillUnitIndex = foundFillUnitIndex
					}

					fillableObject:addDeleteListener(self)
				elseif onLeave then
					self.fillableObjects[otherId] = nil

					fillableObject:removeDeleteListener(self)

					if self.isLoading and self.currentFillableObject == fillableObject then
						self:setIsLoading(false)
					end

					if fillableObject == self.validFillableObject then
						self.validFillableObject = nil
						self.validFillableFillUnitIndex = nil
					end
				end

				if self.automaticFilling then
					if not self.isLoading and next(self.fillableObjects) ~= nil and self:getIsFillableObjectAvailable() then
						self:toggleLoading()
                        -- >> allow pausing
                        if self.instaLoadPause then
                            g_currentMission.activatableObjectsSystem:addActivatable(self.activatable)
                        end
                        -- <<
					end
				elseif next(self.fillableObjects) ~= nil then
					g_currentMission.activatableObjectsSystem:addActivatable(self.activatable)
				else
					g_currentMission.activatableObjectsSystem:removeActivatable(self.activatable)
				end
			end
		end
	end
end
LoadTrigger.loadTriggerCallback = Utils.overwrittenFunction(LoadTrigger.loadTriggerCallback, InstantLoad.loadTriggerCallback)
print("------------------------------------------------------------> overwrite done: InstantLoad:loadTriggerCallback")
Funktion:
Im loadTrigger einfach neuen Parameter "instaLoad" ergänzen und auf "true" setzen.
Der Parameter "autoStart" muss ebenfalls auf "true" stehen - hab ich einfach mal so festgelegt.

Optional noch Parameter "instaLoadPause" auf "true" setzen. Damit kann man mittels "R" der Ladevorgang schnell wieder stoppen, wenn man mal versehentlich in den Trigger gefahren ist. Allerdings läuft im Hintergrund ein Timer und das Laden startet irgendwann wieder neu - daher "Pause". Man hat dann aber ein paar Sekunden Zeit, um wieder aus dem Trigger rauszufahren.


Ich hab jetzt Abrollcontainer unter die Auslässe von der Schnitzelanlage gestellt und Steine und Rübenschnitzel tröpfeln langsam rein.

Viel Spaß beim Testen !

Re: Automatisches Befüllen von Anhängern/containern

Posted: Thu Feb 15, 2024 11:49 am
by Regenbogenprinzessin
Wow! Vielen Dank, das werde ich heute gleich Mal testen sobald ich Zeit habe. Das wäre ja genial, vielen Dank für die Mühe 😲

*edit*
ok, nun muss ich doch nochmal nachfragen... ahm.. wie genau baue ich das skript ein?

Re: Automatisches Befüllen von Anhängern/containern

Posted: Thu Feb 15, 2024 8:53 pm
by Danko40
Genügt es nicht, wenn du das Script unter einem gewählten Namen im Ordner scripts abspeicherst und es noch im modDesc unter extraSourceFiles verlinkst?

Code: Select all

    <extraSourceFiles>
        <sourceFile filename="scripts/showOnlyInSilo.lua"/>
        <sourceFile filename="scripts/ScriptvonLS-Lara.lua"/>
    </extraSourceFiles>

Re: Automatisches Befüllen von Anhängern/containern

Posted: Fri Feb 16, 2024 8:48 am
by LS-Lara
Genau ! Wie Danko40 es beschrieben hat, funktioniert es. Braucht nicht zwingend in einen "scripts"-Ordner, nur der Pfad zur Datei muss halt stimmen.

Da das Script global wirkt, reicht es, das in einen einzigen beliebigen geladenen Mod zu integrieren. Sollte man auch sinnvollerweise nur einmal einbinden lassen.

Wenn Du das nur für den Rübenhäcksler nutzen möchtest, würde ich das dort einbauen. Ansonsten mach Dir doch einfach einen eigenen Mini-Mod nur mit dem Script. Benötigt dann nur 3 Dateien: die LUA, modDesc.xml und ein Icon.

Re: Automatisches Befüllen von Anhängern/containern

Posted: Fri Feb 16, 2024 2:25 pm
by Regenbogenprinzessin
hm ich hab das nun folgendermaßen versucht, einzubauen.

ne .txt datei erstellt und das skript von Lara eingefügt und die dateiendung in .lua umgeändert und "larascript.lua" genannt. Diese Datei habe ich dann in der zip Datei des zuckerrübenhäckslers im unterordner "script" gespeichert.
in der ModDesc.xml des zuckerrübenhäckslers habe ich folgenden eintrag hinzugefügt

Code: Select all

    <extraSourceFiles>
        <sourceFile filename="script/larascript.lua"/>
            </extraSourceFiles>
Und in der xml konfig des Häckslers unter Loadtrigger die beiden attribute autoStart="true" sowie "instaLoad="true" hinzugefügt

Code: Select all

<loadingStation node="loadingStation" supportsExtension="false">
      <loadTrigger triggerNode="loadingStation01" fillTypes="SUGARBEET_CUT" fillLitersPerSecond="1000" dischargeNode="dischargeNode01" autoStart="true" instaLoad="true">
        <effectNode effectNode="pipeEffect01" effectClass="PipeEffect" materialType="pipe" fadeTime="0.5" maxBending="0" shapeScaleSpread="0.8 0.8 1 0" controlPoint="3 0 0 0" />
        <effectNode effectNode="pipeEffectSmoke01" materialType="unloadingSmoke" fadeTime="0.5" />
      </loadTrigger>
      <loadTrigger triggerNode="loadingStation02" fillTypes="STONE" fillLitersPerSecond="1000" dischargeNode="dischargeNode02" autoStart="true" instaLoad="true">
        <effectNode effectNode="pipeEffect02" effectClass="PipeEffect" materialType="pipe" fadeTime="0.5" maxBending="0" shapeScaleSpread="0.8 0.8 1 0" controlPoint="3 0 0 0" />
        <effectNode effectNode="pipeEffectSmoke02" materialType="unloadingSmoke" fadeTime="0.5" />
      </loadTrigger>
Ich muss wohl irgendwas falsch gemacht haben da nichts passiert, wenn ich nun mit einem Anhänger oder container unter die Förderbänder fahre.

*edit* ahh, ich war doof. Lara hat das script ja "Instaload" scriptintern genannt. Habe alles relevante dahingehend angepasst, nun funktioniert es, ich bin so happy! :D
Habe jetzt noch von den Zuckerrübenschnitzel die füllrate pro Sekunde angepasst, sodass ein kontinuierlicher Materialfluss vom Förderband in den Hänger rieselt. Bei einem Zyklus von 295000 pro Stunde ist es eine füllrate von ~44 litern pro Sekunde.

Man man, kann mich gar nicht genug bedanken. Dass da Lara einfach so mal ein Skript her zaubert :O

Re: Automatisches Befüllen von Anhängern/containern

Posted: Fri Feb 16, 2024 2:46 pm
by LS-Lara
Theoretisch sieht das erstmal richtig aus. Was sagt denn unser Freund LOG so grundsätzlich ? Müssten einige Zeilen fürs Laden des Scriptes erscheinen.

Lass den Mod übrigens ruhig erst mal ungezipped im Mod-Ordner, solange Du daran noch werkelst (zip-Version natürlich dann rausnehmen).

Re: Automatisches Befüllen von Anhängern/containern

Posted: Fri Feb 16, 2024 2:55 pm
by LS-Lara
Regenbogenprinzessin wrote: Fri Feb 16, 2024 2:25 pm *edit* ahh, ich war doof. Lara hat das script ja "Instaload" scriptintern genannt. Habe alles relevante dahingehend angepasst, nun funktioniert es, ich bin so happy! :D
Das versteh ich nun wiederum nicht :confusednew: . Solange der Link in der ModDesc passt, ist der Dateiname der LUA egal. Oder was hast Du nun verändert ?

Re: Automatisches Befüllen von Anhängern/containern

Posted: Fri Feb 16, 2024 2:55 pm
by Regenbogenprinzessin
Ich habs zum laufen gebracht, siehe mein post edit :)
bin gerade noch am fein tunen, damit der materialfluss am zuckerrübenschnitzel-förderband kontinuierlich ist.
Das versteh ich nun wiederum nicht :confusednew: . Solange der Link in der ModDesc passt, ist der Dateiname der LUA egal. Oder was hast Du nun verändert ?
Wohl nicht, denn ich hab die von mir erstellte larascript.lua in deine "instaload.lua" umbenannt und das dann in der modesc.xml umgeändert. Danach ging es

Re: Automatisches Befüllen von Anhängern/containern

Posted: Fri Feb 16, 2024 3:02 pm
by LS-Lara
Regenbogenprinzessin wrote: Fri Feb 16, 2024 2:55 pm Wohl nicht, denn ich hab die von mir erstellte larascript.lua in deine "instaload.lua" umbenannt und das dann in der modesc.xml umgeändert. Danach ging es
Das hat keinen Einfluss. Bei mir hieß die LUA beispielsweise "instantLoad.lua". Ich vermute eher, dass vorher was beim Speichern oder Zippen nicht 100%ig sauber gelaufen ist.

Egal - Hauptsache jetzt "läuft's" :mrgreen: