Portal-Zone Gothic-Zone Gothic II-Zone Gothic 3-Zone Gothic 4-Zone Modifikationen-Zone Download-Zone Foren-Zone RPG-Zone Almanach-Zone Spirit of Gothic

 

Seite 1 von 5 12345 Letzte »
Ergebnis 1 bis 20 von 98
  1. Homepage besuchen Beiträge anzeigen #1 Zitieren
    Exodus Avatar von Sektenspinner
    Registriert seit
    Jul 2004
    Ort
    Karlsruhe
    Beiträge
    7.827
     
    Sektenspinner ist offline

    [Werkzeug] zSlang: Eine Skriptsprache für Spacerprobleme

    Zielsetzung

    Ich habe die Skriptsprache zSlang zur Lösung von mechanischen Aufgaben im Zusammenhang mit ZEN Dateien entworfen, die im Spacer nur unter großem Aufwand zu bewältigen wären.

    In zSlang ist zum Beispiel folgendes bequem möglich:
    • Strukturierter Zugriff auf alle Vobs und Waypoints einer ZEN Datei inklusive aller ihrer Eigenschaften.
    • Auswahl genau der Objekte in bestimmten geometrischen Bereichen, etwa zwecks kontrollierter Zerschneidung der Welt.
    • Verschiebung von Objekten anhand vorgegebener Referenzpunkte.
    • (Fast) vollautomatisches setzen von Kollisionsflags (cdDyn).
    Da zSlang eine Skriptsprache und kein spezialisiertes Werkzeug ist, sind die Anwendungen aber nicht darauf beschränkt. Grundsätzlich ist zSlang dort einsetzbar, wo die Arbeit mit dem Spacer repetitiv wird und keiner grafischen Ansicht der Welt bedarf.

    Abgrenzung

    Sicherlich wird man mit zSlang keine Skript schreiben können, die eine Welt automatisch verspacern. Zum einen ist das Spacern eine kreative Arbeit und kaum in einem mechanischem Skript zu fassen, zum anderen ermöglicht zSlang keinen Zugriff auf Meshes. Mit anderen Worten: Aus zSlang betrachtet ist eine Welt eine Sammlung abstrakter Objekte im Raum, die sich lediglich durch ein paar einfachen Eigenschaften auszeichnen, nicht aber durch ihre Geometrie; sie ist für zSlang unsichtbar.

    Demonstrations- / Tutorialvideos

    Wer sich unter dem gesagten nichts vorstellen kann, wird nach Ansehen der Tutorialvideos sicher besser verstehen worauf zSlang abziehlt:


    Download


    Ich hoffe es blieben nicht allzuviele Fehler unentdeckt; das Projekt habe ich in der letzten Woche doch sehr energisch seinem Ende entgegengepeitscht.
    Problemberichte, Fragen und Kommentaren sind natürlich jederzeit willkommen.


    EDIT:
    Nützliche Erweiterungen und Skripte
    Für Spieler:
    Velaya # Velaya in English # Exodus Demo # Irrwichtel
    Tools für Modder:
    DiaDepp # DOPA-PARTER # zSlang
    Scripte für Modder:
    Ikarus Skriptpaket # Floats # Broadcasts
    Geändert von Milky-Way (03.08.2017 um 17:26 Uhr)

  2. Beiträge anzeigen #2 Zitieren
    Gotor Avatar von OldCoin
    Registriert seit
    Jun 2010
    Ort
    bei Bremen und auf Sythera
    Beiträge
    4.940
     
    OldCoin ist offline
    Ich fand dein Tool schon auf dem Moddertreffen klasse und denke nach wie vor, dass es für viele Modder einen ungemein hohen Nutzwert hat.
    Wie bereits erwähnt, hätte ich es erst vor wenigen Wochen für zigtausend Vobs zur Kollisionsumstellung mehr als gut gebrauchen können.
    Doch auch in Zukunft sind für mich mindestens zwei Einsatzmöglichkeiten hochinteressant, denn eine Welt wandelt sich nun mal, und dieses Tool gibt mir nun die Möglichkeit, dies sehr zügig (und ohne Frust!) bewerkstelligen zu können.

    Ein wirklich feines Tool. Und die drei Videos sind auch gut verständlich.

    Das Sythera-Mod-Team sucht derzeit nur noch einen weiteren netten Kollegen / Kollegin zur Erstellung von Gebäude-Meshs. Weitere Infos in der Jobbörse.

  3. Homepage besuchen Beiträge anzeigen #3 Zitieren
    Clockwork Origins Avatar von Bonne6
    Registriert seit
    Jun 2004
    Ort
    Erlangen
    Beiträge
    11.826
     
    Bonne6 ist offline
    Hab's auch gleich mal runtergeladen, hab dir ja ein erstes Anwendungsszenario für uns am Sonntag auf der Fahrt zum Bahnhof genannt, Kollision wird auch nochmal gecheckt, wobei ich noch Regeln für die neuen Vobs einfügen muss Aber auch mir hat die Vorstellung auf dem Moddertreff sehr gefallen, wird sehr nützlich sein das ganze Tool.

  4. Beiträge anzeigen #4 Zitieren
    Serima Avatar von Fisk2033
    Registriert seit
    Dec 2010
    Ort
    Dresden
    Beiträge
    5.802
     
    Fisk2033 ist offline
    Hi Sekti,
    erst habe ich gedacht.. Naja mit Ikarus kommst du noch lange nicht klar, also brauchst du dir das garnicht erst anzuschauen. Gerade die Art des Videos hat mir,aber sehr geholfen das zu verstehen. Leider ist die Welt für mein Moddingprojekt zu klein um vieles davon wirklich zu nutzen. Aber gerade die Kollisionen(die ich gerne mal vergesse) kann man so gut überprüfen, und mal schauen was ich noch so für mich entdecke.

    Also riesen fürs schreiben und super erklären von zSlang!!

  5. Homepage besuchen Beiträge anzeigen #5 Zitieren
    Gothic Reloaded Mod Avatar von ThielHater
    Registriert seit
    Nov 2006
    Beiträge
    6.991
     
    ThielHater ist offline
    Eine gute Idee wurde optimal umgesetzt und ausreichend dokumentiert - genau das, was man von einem Modding Tool erwartet.

    Ich bin mir sicher, dass ich dieses Tool irgendwann mal brauchen werde und auch für andere Modder, dürfte es den ein oder anderen Anwendungsfall geben, an den bisher noch gar nicht gedacht wurde.
    "Weltmacht mit drei Buchstaben?" – Fred & Günther



  6. Beiträge anzeigen #6 Zitieren
    Auserwählter Avatar von Nincompoop
    Registriert seit
    Aug 2006
    Ort
    Berlin
    Beiträge
    6.340
     
    Nincompoop ist gerade online
    Super Sache und tolle Erklärung. Man weiß praktisch sofort wie es funktioniert.

  7. Beiträge anzeigen #7 Zitieren
    Schwertmeister
    Registriert seit
    May 2009
    Beiträge
    924
     
    Umfi ist offline
    Kann es sein, dass die Videos nicht mehr auf Youtube verfügbar sind?

  8. Beiträge anzeigen #8 Zitieren
    Serima Avatar von Fisk2033
    Registriert seit
    Dec 2010
    Ort
    Dresden
    Beiträge
    5.802
     
    Fisk2033 ist offline
    Ja, bei mir gehen sie auch nicht mehr

  9. Homepage besuchen Beiträge anzeigen #9 Zitieren
    Exodus Avatar von Sektenspinner
    Registriert seit
    Jul 2004
    Ort
    Karlsruhe
    Beiträge
    7.827
     
    Sektenspinner ist offline
    Danke für den Hinweis, jetzt sollte es wieder gehen.

    Das hing damit zusammen, dass Google mir ungewollt einen Google+ Account untergejubelt hat (da klickt man einmal auf die falsch Schaltfläche...) und beim Löschen des Google+ Accounts wurden dann alle Videos als privat getagt. So ein Quatsch.
    Für Spieler:
    Velaya # Velaya in English # Exodus Demo # Irrwichtel
    Tools für Modder:
    DiaDepp # DOPA-PARTER # zSlang
    Scripte für Modder:
    Ikarus Skriptpaket # Floats # Broadcasts
    Geändert von Sektenspinner (12.05.2013 um 18:09 Uhr)

  10. Beiträge anzeigen #10 Zitieren
    Serima Avatar von Fisk2033
    Registriert seit
    Dec 2010
    Ort
    Dresden
    Beiträge
    5.802
     
    Fisk2033 ist offline
    Zitat Zitat von Sektenspinner Beitrag anzeigen
    Danke für den Hinweis, jetzt sollte es wieder gehen.

    Das hing damit zusammen, dass Google mir ungewollt einen Google+ Account untergejubelt hat (da klickt man einmal auf die falsch Schaltfläche...) und beim Löschen des Google+ Accounts wurden dann alle Videos als privat getagt. So ein Quatsch.
    Danke fürs wieder öffentlich machen. Ja Youtube bzw. Google macht nur Mist mit diesem Google+. Dauernd wollen die,dass ich meinen echten Namen bzw. den vom Google+ Account nehme(obwohl ich keinen G+ Account habe)

  11. Beiträge anzeigen #11 Zitieren
    Schwertmeister
    Registriert seit
    May 2009
    Beiträge
    924
     
    Umfi ist offline
    Danke, das du dich darüm gekümmert hast.

    Habe mein Problem aber auch ohne die Videos gelöst.

    Ich muss noch meinen Lob für das Programm aussprechen.
    Hat mir ne Menge Ärger im Spacer erspart.

  12. Beiträge anzeigen #12 Zitieren
    Abenteurer Avatar von Muddy
    Registriert seit
    Feb 2009
    Beiträge
    61
     
    Muddy ist offline
    Auch aus Richtung der Gothic Multiplayer-Entwicklung möchte ich meinen Dank für die nützliche Skriptsprache aussprechen.

    Grüße
    Hier geht's zum Steckbrief
    Und hier zum Portrait

  13. Beiträge anzeigen #13 Zitieren
    Schwertmeister Avatar von Christopher25
    Registriert seit
    Jul 2006
    Ort
    NRW
    Beiträge
    824
     
    Christopher25 ist offline
    Die Idee und die Umsetzung ist total klasse.
    Ich finde deine Begeisterung und deinen Einsatz einfach Spitze.
    Ich bin zwar persönlich kein großer Fan von C++ aber ich gebe dir meinen Hut gerne ab =)
    Das mit der Collision ist Spitze. Vorallem muss man jetzt nie einen Gedanken drum geben, ob man jetzt
    das oder jenes Item gesetzt hat oder nicht.
    Was mir auch aufgefallen ist, ist dass nicht nur die Collision gesetzt wird, sondern auch ob es ein staticVob ist oder nicht.

  14. Beiträge anzeigen #14 Zitieren
    Abenteurer Avatar von Muddy
    Registriert seit
    Feb 2009
    Beiträge
    61
     
    Muddy ist offline
    Hiho,

    Gibt es in zSlang die Möglichkeit, direkt in Dateien abzuspeichern bzw. könnte man das nachträglich noch hinzufügen, falls nicht vorhanden? Die Ausgabe und das Kopieren Textausgaben im Lua-Interpreter-Programm verlangsamt bei großen Anfragen doch deutlich den Prozess, besonders, wenn man gerne für andere Postprozessorprogramme ein spezielles Format abspeichern möchte.
    Hier geht's zum Steckbrief
    Und hier zum Portrait

  15. Beiträge anzeigen #15 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.204
     
    Milky-Way ist offline
    Ich habe für LoA in letzter Zeit recht viel mit zSlang gemacht. Tolle Sache!
    Die Aufgabenstellung war folgende:
    Wir haben eine riesige .zen, die aufgeteilt werden soll. Sie war es mal, aber ihre Einzelteile sind verloren gegangen. Daher haben wir mit Kerrax das gesamte Weltmesh aus der .zen in Blender geladen und es zerschnitten. Anschließend müssen nun die Objekte der großen .zen in die einzelnen .zen Dateien.
    Ein erstes Mal wurde das auf einem Moddertreffen von Sektenspinner mit / für Zuben02 gemacht, daher ist bei zSlang auch schon genau solch ein Beispiel-Skript zu finden.
    Hier mussten wir das nun noch einige Male mehr machen und dabei ist das ein oder andere Skript entstanden (für zSlang und Python 3.4).

    Für den Fall, dass es noch mal gemacht werden muss, habe ich intern meine genutzten Skripte gezeigt, aber vielleicht ist ja irgendetwas daraus auch für andere interessant oder nützlich. Zeit, das noch anders zu dokumentieren oder zusammenzufassen habe ich gerade nicht. Sollte etwas unklar sein oder nicht funktionieren, einfach hier im Thema nachfragen!

    Aus unserem Forum kopiert, hoffentlich verständlich:


    - Die große .zen habe ich mit folgendem zSlang-Skript vorbereitet. Ist sogar ganz brauchbar kommentiert. Zusammengefasst: Die Kinder der Level-Meshes werden verschoben, weil ich die Level-Meshes später löschen möchte (die Kinder aber nicht). Die Kinder von Pfx-Effekten werden verschoben, weil Pfx-Kinder im Spacer gerne wandern / ihre Position verändern (was nicht gewünscht ist). Außerdem werden "leere" Vobs gelöscht. Aus irgendeinem Grund hatten wir sehr, sehr viele unbrauchbar gewordene Vobs. (im niedrigen 4 stelligen Bereich) Hier das Skript:
    Code:
    #include<stdlib.zsl>
    
    /* Dieses Skript bereitet die Welt vor.
     * Kinder von Level-Vobs werden verschoben (weil die Levelvobs kaputt sind und später wegkommen).
     * Kinder von pfx'en werden ebenfalls verschoben.
     * Eventuell sind diese für das Einfrieren des Spiels an manchen Stellen verantwortlich.
     * Vermutet wurde das u.a. beim Nebelturm in Gothic 1.
     * Zudem werden leere Vobs (Vobs ohne visual) gelöscht. Diese sind - vermutlich - zu nichts mehr zu gebrauchen.
     */
    
    func void main()
    {
    	/* Load the world */
    	Info("Loading World");
    	WLD_Load("WORLD.ZEN");
    	
    	
    	/* ----- flatten at level vobs ----- */
    	
    	/* Search for all levels */
    	
    	var object allLevels[] = CVT_SelToArr(WLD_GetVobsOfClass("zCVobLevelCompo"));	// get all levels
    	
    	Info("Found " + allLevels.size + " vobs of type zCVobLevelCompo");
    	
    	Info("Starting to go through levels");
    	foreach level in allLevels
    	{
    		var selection sel = WLD_GetDescendants(level);
    		/*Info("level has " + sel.size + " descendants");*/
    		WLD_FlattenVobtreeAt(level);
    		/*WLD_DeleteGentle(level);*/
    	}
    	Info("Done with level vobs");
    	
    	
    	/* ----- flatten at pfx ----- */
    	
    	/* Search for all pfx */
    	
    	var object allPfx[] = CVT_SelToArr(WLD_GetVobsOfClass("zCPFXControler"));	// get all pfx
    	
    	Info("Found " + allPfx.size + " vobs of type zCPFXControler");
    	
    	Info("Starting to go through pfx");
    	foreach pfx in allPfx
    	{
    		var selection sel = WLD_GetDescendants(pfx);
    		/*Info("Pfx has " + sel.size + " descendants");*/
    		WLD_FlattenVobtreeAt(pfx);
    		/*WLD_DeleteGentle(pfx);*/
    	}
    	Info("Done with pfx vobs");
    	
    	
    	/* ----- delete empty vobs ----- */
    	
    	var int num_EmptyVobs = 0;
    	
    	var object allVobs[] = CVT_SelToArr(WLD_GetVobsOfClass("zCVob"));	// get all vobs
    	
    	Info("Found " + allVobs.size + " vobs of type zCVob");
    	
    	Info("Starting to go through vobs");
    	foreach vob in allVobs
    	{
    		if ((vob.name.length == 0)
    		&& (vob.visual.length == 0))
    		{
    			/* Info("empty vob found"); */
    			num_EmptyVobs += 1;
    			Info(vob.visual);
    			WLD_DeleteGentle(vob);
    		}
    	}
    	Info("Done deleting " + num_EmptyVobs + " empty vobs");
    	
    	WLD_Save("World.ZEN");
    }
    - Das Aufteilen basiert dann auf diesem Skript, das nahezu identisch zum zSlang-Beispiel-Skript ist. Kommentare eher bescheiden, größtenteils Original-Kommentare mit meinen bunt vermischt. "--ZENLARGE--" ist die Welt-zen, die alle Objekte beinhaltet, "--ZENSMALL--" ist die abgesteckte Teil-zen, in die die passenden Objekte rein sollen. Das sieht komisch aus, hängt mit dem nächsten Punkt zusammen.
    Code:
    #include<stdlib.zsl>
    
    /* Dies ist ein Skript das ich verwendet habe um die LOA Welt zu zerschneiden.
     * Genauer: Die Wüste soll in einer ZEN landen und der Rest in einer anderen ZEN.
     * Milky hat zu diesem Zweck bereits Waypoints in der Welt platziert,
     * die die Wüste umschließen. Die Waypoints heißen WUESTE_001, WUESTE_002, usw.
     * Sie bilden einen (nicht notwendig konvexes) Polygon. */
    
    func void main() {
    
    	var string smallPart = "--ZENSMALL--";
    
        /* lade den Weltteil */
    	WLD_Load(smallPart);
    	/* füge die restlichen Objekte hinzu */
        WLD_Merge("--ZENLARGE--");
    
        
        /* Hier suche ich die Waypoints zusammen, die Milky gesetzt hat
         * und speichere sie im Array randPunkt ab. */
        var object randPunkte[];
        for(var int i = 1; ; i += 1) {
            /* Hier wird aus der Zahl "i" ein String der die Zahl
             * repräsentiert und mindestens drei Stellen hat
             * (zum Beispiel wird aus 7 der String "007").
             * Hätte Zuben in den Waypointnamen keine führenden Nullen
             * wäre dieser Schritt unnötig gewesen. */
            var string name = i;
            //while(name.length < 3) { name = "0" + name; }
            
            /* Der Waypoint wird gesucht. Ich wusste nicht wieviele Waypoints
             * Zuben letztendlich verwendet hat, daher mache ich weiter, bis
             * kein Waypoint mehr gefunden wird (durch prüfen ob der
             * Rückgabewert von WLD_GetObject Null war oder nicht). */
            var object o = WLD_GetObject("X" + name);
            if (!o) {
                /* Ich gebe aus, wieviele Waypoints ich gefunden habe. */
                Info("Last WP Index: " + (i-1));
                break;
            }
            
            /* Der Waypoint wurde gefunden, er wird in das Array eingefügt. */
            randPunkte |= o;
        }
        
        /* Ich wähle alle Objekte aus, die im von den Waypoints
         * beschriebenen Bereich liegen. */
        var selection sel = HULL_SelectByHull(HULL_Polygon(randPunkte));
        
        /* Die Waypoints waren nur Hilfswaypoints, ich möchte sie entfernen.
         * Leider nimmt WLD_Delete nur Selektionen, keine Arrays.
         * Ich entferne die Waypoints die ich lösche aus der Selektion,
         * sonst wird später versucht auf ein Objekt zuzugreifen, was gar nicht
         * existiert! */
        var selection randPunkteSel = CVT_ArrToSel(randPunkte);
        sel -= randPunkteSel;
        WLD_Delete(randPunkteSel);
        
        /* Im Grunde passiert hier in etwa folgendes:
         *   WLD_SaveSelection("test_wueste.ZEN", sel);
         *   WLD_SaveSelection("test_keinewueste.ZEN", WLD_GetAll() - sel);
         * Allerdings ist WLD_SplitWorld etwas klüger:
         * Waypoints die an der Grenze sind, das heißt Waypoints in der Selektion,
         * die mit einem Waypoint verbunden sind, der nicht in der Selektion ist
         * oder umgekehrt, landen in beiden Welten. Nach Ausführung eines Spacermakros
         * werden diese Welten sowieso wieder verschmolzen.
         * Ohne diese Spezialbehandlung der Grenzwaypoints
         * würde das Wegenetz auseinandergerissen. */
        WLD_SplitWorld(sel, smallPart, "--ZENLARGE--");
    }
    - Ich habe ein Python-Skript geschrieben, das die Weltenteilung basierend auf dem obigen Skript automatisch für alle Teil-zens ausführt. Dafür wird das Skript immer wieder angepasst auf die nächste Welt und die sich langsam entleerende Gesamt-zen wird vom output in den input Ordner kopiert, damit sie weiter entleert wird (und Objekte nicht am Ende in 2 Welten sein können).
    Geschrieben für Python 3.4 - da Pfade angepasst werden müssen, müsste man also die Python-Version bei sich installiert haben. Lässt sich sicher auch halbwegs leicht in andere Sprachen übersetzen. (Oder dieselben Aktionen von Hand durchführen) Gut mit Kommentaren bestückt, denke ich.
    Code:
    # import stuff
    import os
    import shutil
    import subprocess
    from time import strftime, time
    
    # define constants
    _DELETE_TEMP = False
    _path = "D:\\Gothic\\zSlang" # path to my zSlang directory
    _dirIn = "input" # this should be a directory that zSlang checks for files - relative to _path
    _dirOut = "output" # this should be the directory that zSlang saves files to - relative to _path
    _scriptFile = "LoA_Weltenteilung_py.zsl" # zSlang script to be executed - relative to _path
    _PLACEHOLDER_SMALL = "--ZENSMALL--" # string to be replaced with file name of small .zen in the zSlang script
    _PLACEHOLDER_LARGE = "--ZENLARGE--" # string to be replaced with file name of large .zen in the zSlang script
    _largeFile = "WORLD.ZEN" # the .zen file containing the objects at the start of execution
    
    # list of files into which the objects of WORLD.ZEN should be put
    fileNames = ["Academy.ZEN", "BanditsCamp.ZEN", "Environs.ZEN", "FreecampOrcland.ZEN",
             "Harbour.ZEN", "IceLandscape.ZEN", "OrinsFarm.ZEN", "Swamp.ZEN", "Town.ZEN"]
    # end of fileNames list
    
    
    
    # creates a new script that can be used to put objects into currentFile.
    # returns the file name of the new file.
    def prepareScript(currentFile):
        
        # carefully open the zSlang script template
        with open(_scriptFile) as f:
            s = f.read() # read the script template
            s = s.replace(_PLACEHOLDER_SMALL, currentFile) # put in first file
            s = s.replace(_PLACEHOLDER_LARGE, _largeFile) # put in second file
        # ... template file is closed
        
        fileName = "_" + currentFile + ".zsl" # the new script file with everything put in place
        
        # create output file, overwriting existing file
        with open(fileName, "w") as file_out:
            # write output file
            file_out.write(s)
        # done with output
        
        return fileName # return the name of the zSlang script
    # end prepareScript
    
    def main():
        
        # start of main function
        print ("Start of the main function at: " + strftime("%H:%M:%S"))
        start_time = time()
        
        # change the working directory to my zSlang path
        os.chdir(_path)
        
        for fileName in fileNames:
            print ("start working with " + fileName + " at: " + strftime("%H:%M:%S"))
            # get the script to put all objects into this .zen
            zScript = prepareScript(fileName)
            
            # execute this script
            subprocess.call(["zSlangInterpreter.exe", zScript])
            # automatically waits until execution is finished
            
            # copy the large file back to input directory for the next .zen to use
            shutil.copyfile(os.path.join(_dirOut,_largeFile), os.path.join(_dirIn,_largeFile))
            # note that copyfile overwrites (which is the desired behavior)
            
            # delete the temporary script file if desired
            if _DELETE_TEMP:
                os.remove(zScript)
            # done deleting temporary script
            
        # end for each file
        
        print ("Start of the main function at: " + strftime("%H:%M:%S"))
        print("it took " + str("{0:.2f}".format(time() - start_time)) + " seconds")
    # end main function
    
    
    # call main function
    main()
    - Am Ende hat man also die ganzen Teil-zens mit Objekten bestückt und eine letzte WORLD.zen mit restlichen Objekten. Diese Welt sollte man sich dann noch anschauen, ob auch alles erwischt wurde. Darin enthalten sind aber auch WP, die ebenfalls in Teilwelten sind. (Notwendig, damit man sich nicht das Wegnetz zerreißt) Ich habe ein Python-Skript geschrieben, dass überprüft, ob diese WP auch alle in den anderen .zen zu finden sind (um sicherzugehen, dass wirklich keine WP verloren gingen). Wieder Python 3.4.
    Zur Vorbereitung braucht man also die Reste-zen als uncompiled (ascii) gespeichert (-> Spacer), sowie alle anderen Welten zusammen (-> Macro) ebenfalls als uncompiled (ascii) gespeichert. Dadurch sind es nur zwei Textdateien und ich schaue, ob die WP-Namen der einen (Reste-zen) auch in der anderen (zusammengesetzte zen) zu finden sind. Das ganze ist nicht gerade Ressourcen-schonend umgesetzt, aber bei nicht allzu riesiger Größe sollte es nicht mehr als 1 oder 2 Minuten dauern. Code:
    Code:
    # script to test whether all WP in first file also exist in second file
    # .zen need to be saved uncompiled (ASCII)
    
    import os
    from time import strftime, time
    
    _path = "D:\\Test" # path to my zSlang directory
    _largeFile = "WORLD.ZEN" # the large file with the individual parts combined again
    _smallFile = "rest.zen" # the remaining stuff. Hopefully all WP are also in _largeFile
    
    _PROPERTY = "wpName=string:"
    
    def main():
        
        # number of WP not in large file
        c_misWP = 0
        
        # start of main function
        print ("Start of the main function at: " + strftime("%H:%M:%S"))
        start_time = time()
        
        # go to right directory
        os.chdir (_path)
        
        # open large file
        with open (_largeFile) as largeFile:
            s_full = largeFile.read()
        # done reading large file
        
        # open small file
        with open(_smallFile) as smallFile:
            
            # go through all lines of smallFile
            for line in smallFile:
                
                # if the line is a WP name
                if _PROPERTY in line:
                    
                    # then get the WP name
                    wpName = line.split(_PROPERTY)[1]
                    print(wpName)
                    # and check whether the WP is in the full file
                    foundWP = False
                    with open(_largeFile) as largeFile:
                        for largeLine in largeFile:
                            if _PROPERTY in largeLine:
                                if (wpName == largeLine.split(_PROPERTY)[1]):
                                    print(largeLine.split(_PROPERTY)[1])
                                    foundWP=True
                                # end if wpName in largeLine
                            # end if string is in largeLine
                        # end lines of _largeFile
                    # end open _largeFile
                    
                    if foundWP == False:
                        print ("ERROR: WP not found!")
                        c_misWP += 1
                    # end if WP not found
                    
                # end if line is WP
            # end for each line
        # end open small file
        
        print ("Found " + str(c_misWP) + " WP that are only in small file")
        print("it took " + str("{0:.2f}".format(time() - start_time)) + " seconds")
        
    # end main function
    
    
    # call the function
    main()
    - Am Ende habe ich dann in einer .zen noch recht viele LevelCompo-Vobs, die ich gar nicht haben möchte (nervige Fehlermeldungen über fehlende Meshes). Diese Vobs sammeln sich wohl in der Teil-zen an, die am Koordinaten-Ursprung liegt. Man kann sie von Hand im Spacer löschen (nach jedem Löschen die Vob-Liste aktualisieren -> Refresh, sonst stürzt der Spacer ab), ist aber bei langer Vobliste und vielen ( >10) Objekten äußerst langweilig und auch fehleranfällig. Stattdessen hier ein weiteres zSlang-Skript. Basierend auf der Welten-Teilung sammle ich alle LevelCompo-Objekte ein und Teile die Welt basierend auf dieser Selektion. Die LevelCompos auf die Reste-Rampe, alles andere bleibt in der .zen zurück
    Code:
    #include<stdlib.zsl>
    
    
    func void main () {
    	
    	var string world = "Environs.zen";
    	
    	/* ----- Load the world ----- */
    	WLD_Load(world);
    	
    	
    	/* ----- select all level vobs ----- */
    	var object allLevels[] = CVT_SelToArr(WLD_GetVobsOfClass("zCVobLevelCompo"));	// get all levels
    	
    	/* convert list to selection */
    	var selection selLevel = CVT_ArrToSel(allLevels);
    	
    	/* save the level vobs and the rest separaterly */
    	WLD_SplitWorld(selLevel, "levelVobs.ZEN", world);
    	
    }
    - Nun haben wir also die Teil-zens, aber dort sind keine LevelCompo Objekte. (Dafür bei meiner Herangehensweise immerhin die kompilierten Meshes in der .zen.) Spacer-Makros sind langsam und da ich ja gar nicht neu kompilieren brauche (was macht der Spacer eigentlich ohne "compile world" im Makro?), ein weiteres zSlang-Skript, mit dem ich jede .zen mit einer bis auf ein LevelCompo Vob leere .zen merge. Das Skript könnte man sicher auch automatisch für alle Welten ausführen lassen, ich habe dafür aber nichts geschrieben, sondern nach jeder .zen die Datei kurz angepasst. (Ich war recht sicher, dass ich diesen Schritt nur einmal machen muss.) Im Skript beachten, dass ich meine Strings basierend auf einem eigenen Namens-Schema generiere.
    Code:
    #include<stdlib.zsl>
    
    
    func void main () {
    	
    	var string worldName = "Harbour";
    	
    	// load world
    	WLD_Load (worldName + ".ZEN");
    	
    	// add part of the world that contains the WP
    	WLD_Merge ("LOA_WORLD_" + worldName + ".ZEN");
    
    	
    	// save the main world together with the new WP
    	WLD_Save (worldName + ".ZEN");
    }
    Ich denke, das ist alles brauchbare, was ich an Skripten geschrieben habe.
    Geändert von Milky-Way (31.01.2015 um 11:25 Uhr)

  16. Beiträge anzeigen #16 Zitieren
    Veteran
    Registriert seit
    Jan 2012
    Beiträge
    681
     
    Frank-95 ist offline
    Can zSlang import 3ds too? Because I would like to merge and compile fast some groups of 3ds seperately. (fore example newworld_part_city_p01.3ds and newworld_part_city_p02.3ds to newworld_part_city.zen) ?

  17. Beiträge anzeigen #17 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.204
     
    Milky-Way ist offline
    zSlang does not touch mesh data at all, it simply copies the (compiled) data from an imported .zen into the exported .zen.

  18. Beiträge anzeigen #18 Zitieren
    Veteran
    Registriert seit
    Jan 2012
    Beiträge
    681
     
    Frank-95 ist offline
    Ok but since he can load compile zen, mesh included, since there are function like loadmeshwithout vobs, I thought it could load also the mesh by itself

  19. Beiträge anzeigen #19 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.204
     
    Milky-Way ist offline
    I don't think zSlang can compile a mesh. It can load a compiled mesh and delete the vobs, but that does not require re-compiling the mesh. Instead, it just copies the mesh data and deletes all vobs / does not copy them. Vob-Info is fairly "readable" which made it possible to create something like zSlang in the first place.

  20. Beiträge anzeigen #20 Zitieren
    Veteran
    Registriert seit
    Jan 2012
    Beiträge
    681
     
    Frank-95 ist offline
    Ok I've got every empty small zen I need, with the same zCLevelCompo of the large file.

    Probably I've missed something, but how can I load vobs from a specific composition and save them in another zen?

    Logic:
    Code:
    #include<stdlib.zsl>
    
    
    func void main ()
    { 
            WLD_LoadWithoutMesh(bigworld.zen) //it should be faster, shouldn't it?
    
            //create zCLevelCompoArray
            /* In this way?? */
            var object allLevels[] = CVT_SelToArr(WLD_GetVobsOfClass("zCVobLevelCompo"));
    
            //close(bigworld.zen) /*WLD_Destroy?*/
    
           var string smallZens[n];
           smallZens[I] = "smalzenI.zen";
    
           foreach smallzenX in SmallZens
           {
                   WLD_Load("smallzenX.zen");
                   foreach vob in allLevels[smallZenx]
                   {
                           /*save vob in smallzenX*/
                   }
                   /*close the world*/
           }
    }
    Sintax and types errors apart ( ) I hope the logic is clear. Is it possible with zSlang? I can also open zen one by one and run the script, but the question was about how to save a vob into a mesh from an array, and if WLD_GetVobs returns also lights and freepoints.

    Thanks

Seite 1 von 5 12345 Letzte »

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
Impressum | Link Us | intern
World of Gothic © by World of Gothic Team
Gothic, Gothic 2 & Gothic 3 are © by Piranha Bytes & Egmont Interactive & JoWooD Productions AG, all rights reserved worldwide