Automatisierte Änderung v. Mapobjekten [v0.1 24.02.12]

  • Willkommen zur zweiten Runde im Kampf gegen zeitraubende Tätigkeiten beim Modden.


    Inzwischen dürfte sich herausgestellt haben, dass ich der Programmierer-Zunft alle Ehre mache, und zwar durch Faulheit. Ja, Programmierer machen nicht gerne Dinge mehrmals, wenn es der Rechenknecht tun kann. Und so hat es mich als Helfer- und Courseplay-Poweruser relativ bald gelangweilt, dass ich auf Maps entweder per Hand oder bestenfalls per Suchen & Ersetzen die Collisionen von Zäunen und ähnlichen Störfaktoren entfernen musste.


    Also habe ich kurzerhand wieder dem foxe ein paar kurze Anweisungen gegeben und jetzt wühlt der sich in nicht mal einer Sekunde durch eine 30MB große map01.i3d ;)


    Was braucht ihr?
    eine entpackte Map (von der ihr eine Sicherheitskopie habt. GLAUBT ES MIR HALT ENDLICH! ;) )
    Den XML-Editor foxe: http://www.firstobject.com/dn_editor.htm
    Mein angehängtes Script collision.foal (Zip entpacken)


    Was ist genau zu tun?

    • Zuerst öffnet ihr die Map im Giants Editor und markiert euer Hindernis. Im Beispiel ist das der Zaun "fence01_end". Den Namen notiert ihr euch bitte.
    • Jetzt den GE wieder schließen und dafür den foxe öffnen
    • map01.i3d in foxe öffnen
    • collision.foal in foxe öffnen
    • im Bereich //Variablen eintragen die nötigen Dinge eintragen. Beschreibung unten*
    • Taste F9 drücken
    • im Ausgabe Fenster rechte Maustaste -> Open in document window
    • neues Dokument wieder als map01.i3d abspeichern
    • map01.i3d wieder im GE öffnen und nochmals speichern (das ist nötig, weil der GE die neuen Einträge an eine bestimmte Position verschiebt)

    In meinem Beispiel will ich also dem folgenden "Shape" die collision austreiben:

    XML
    <Shape name="fence01_end" translation="751.345 86.1245 556.557" rotation="0 -0 5.75525" static="true" clipDistance="305" nodeId="4915" materialIds="79" shapeId="117" castsShadows="true" receiveShadows="true"/>


    Dazu sind folgende Einträge im Script nötig:

    Code
    //Variablen eintragen
    str tagName = "Shape"; // suche in XML-Tag z.B. Shape
    str attributeFind = "name"; // zu suchendes Attribut
    str attributeValueFind = "fence01_end"; // zu suchender Attribut-Wert
    str attributeChange = "collision"; // zu änderndes Attribut
    str attributeValue = "false"; // neuer Wert
    //Ende Variablen eintragen


    Die ersten drei Variablen beschreiben, was bzw. wo gesucht wird. Suche einen Eintrag Shape der das Attribut name mit dem Wert fence01_end enthält.
    Die weiteren zwei Variablen beschreiben, was im gefundenen Eintrag geändert werden soll. Ändere/Erstelle Attribut collision mit dem Wert false.
    Hier zeigt sich wieder der Vorteil des foxe, da er das Attribut ändert, wenn es schon vorhanden ist, oder anderenfalls erstellt.


    Einen Stolperstein habe ich entdeckt: In meiner Map gibt es verschiedene Objekte, die den Namen g0 tragen. Ich möchte aber nur die ändern, die als Baum in Erscheinung treten. Dazu gebe ich EINEM Objekt im GE einen anderen Namen (testbaum) und speichere ab.


    Dann suche ich im foxe per Edit->Find nach "testbaum" und schaue was dieses Shape für eine shapeId hat. Jetzt kann ich statt nach dem Namen nach der shapeId suchen, die auf jeden Fall eindeutig ist.


    XML
    <Shape name="testbaum" translation="890.313 94.676 569.103" rotation="-180 -48.6047 -180" scale="2 1.3 2" clipDistance="400" nodeId="4518" materialIds="83" shapeId="40" castsShadows="true" receiveShadows="true"/>


    Die Suchwerte lauten dann entsprechend so:

    Code
    //Variablen eintragen
    str tagName = "Shape"; // suche in XML-Tag z.B. Shape
    str attributeFind = "shapeId"; // zu suchendes Attribut
    str attributeValueFind = "40"; // zu suchender Attribut-Wert



    Ich habe es jetzt mal collision.foal genannt, weil es mein Hauptanwendungsgebiet ist. Man kann natürlich auch alle anderen Attribute damit manipulieren.



    Viel Spaß!

  • Ich muss sagen diese nützliche kleinen Tools finde ich echt klasse von dir...


    Ich hätte da noch eine Idee, die ziemlich Zeitraubend und zermürbend ist wie ich finde......


    Wäre es nicht auch möglich über so eine art, die ClipDistance zu verändern??? Ich finde das ist bei manchen sachen immer ne endlose fummellei..


    Naja bis dahin weiter so....


    Lg


    Marco

  • Na klar, da kannst du gleich dieses hier verwenden und die Variablen entsprechend ändern:


    Code
    //Variablen eintragen
    str tagName = "Shape"; // suche in XML-Tag z.B. Shape
    str attributeFind = "name"; // zu suchendes Attribut
    str attributeValueFind = "fence01_end"; // zu suchender Attribut-Wert
    str attributeChange = "clipDistance"; // zu änderndes Attribut
    str attributeValue = "500"; // neuer Wert
    //Ende Variablen eintragen
  • Moin,


    alles sehr schick. :thumbsup: , Hab noch einen kleinen Vorschlag. Es geht hierbei um die Distancen der einzelnen Objekte. Alle Objekte die im GE eine Distance von 100000 haben, also quasi unendlich, erscheinen ja im Notepad garnicht. Dies zu ändern ist zeit und arbeitsintensiv, wenn mans vorher vergessen hat. Sicherlich funzt dies über das exportieren, abändern und wieder importieren.


    Aber vielleicht findest du ja eine Möglichkeit.



    mfg

  • Hmm, ich weiß nicht ob ich dich richtig verstehe, aber wenn das Attribut clipDistance noch nicht vorhanden ist, wird es mit diesem Tool erstellt.


    Edit:
    Ich denke du willst ALLEN Shapes, die noch KEINE clipDistance haben, eine verpassen, oder?


    Edit2:
    Folgendes Scipt weist allen Shapes eine clipDistance zu, die noch keine haben!
    [expander]

    [/expander]

  • Ich habe mir hier jetzt alles sorgfälltig durchgelesen, aber irgendwie versteh ich das ganze noch nicht so recht.
    Ich habe jetzt den "TannenbaumNormalMiddle" von diesen sind sehr viele auf der map verbaut, bei diesen würde ich jetzt gerne die Collision entfernen.
    Die ID geht von 3853-4197 wo muss ich jetzt was im foxe eingeben?

  • Da solltest du dir mal gedanken über deine Lesetechnik machen. Wenn ich im Beispiel die colli von "fence01_end" entferne, was musst du dann wohl machen, wenn du "TannenbaumNormalMiddle" bearbeiten willst? ;)


    Code
    //Variablen eintragen
    str tagName = "Shape"; // suche in XML-Tag z.B. Shape
    str attributeFind = "name"; // zu suchendes Attribut
    str attributeValueFind = "TannenbaumNormalMiddle"; // zu suchender Attribut-Wert
    str attributeChange = "collision"; // zu änderndes Attribut
    str attributeValue = "false"; // neuer Wert
    //Ende Variablen eintragen

  • Hab da auch mal2 Wünsche. :D Könnte man das so umschreiben, das es jedes Mapobjekt ( nur Objekte, keine Transformgroups) auf Clip Distance 800 setzt? Wenn ja wie? :D
    2. Wie muss das aussehen, wenn ich jedem Objekt, das keine Colli hat die Collision static geben möchte damit? Es soll aber nur den Objekten diese verpassen, die keine Colli besitzen.


    MfG Michi

  • Hab da auch mal2 Wünsche. Könnte man das so umschreiben, das es jedes Mapobjekt ( nur Objekte, keine Transformgroups) auf Clip Distance 800 setzt? Wenn ja wie?

    Alles was ich mit diesem Skript bearbeite sind Shapes, sprich Objekte. TransformGroups werden nicht angetastet. Du kannst also die Version aus Post #7 mit dem Wert 800 verwenden.

    2. Wie muss das aussehen, wenn ich jedem Objekt, das keine Colli hat die Collision static geben möchte damit? Es soll aber nur den Objekten diese verpassen, die keine Colli besitzen.

    static kenne ich nur im Zusammenhang mit Rigid Body. Colli kann nur true oder false sein ?(

  • Ich blick da so nicht durch -.- Ich will das so machen wie TommyR, der soll allen Bäumen denen noch keine ClipDistance zugeordnet ist eine ClipDistance zuordnen doch ich versteh das nicht so ganz :thumbdown:


    EDIT: Hat doch geklappt :thumbup:

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!