Kleanthes´ Patching for Dummies
(like himself)

4. Items

4.1. Art (S)
4.1.1. Spezifikationen für Art (S) Graphiken
4.1.2. Einstellungen der Art (S) Tiles mittels Tiledata
4.1.3. Bearbeitung der Tiledata (S) in größerem Ausmaß
4.2. Anziehbare Items
4.2.1. Gumps (nonAnim)
4.2.2. Gumps (anim)
4.2.3. Neue Kleidung einpatchen - Schritt für Schritt
4.2.4. Die Layer
4.3. Container
4.4. Sitzgelegenheiten

4.1. Art (S)

Wie gewohnt lädt man die Art ein und klickt anschließend auf die Registerkarte "Art (S)" (wobei das S für Static steht). Auch hier ist eine lange Liste zu sehen, wie schon von Art (M) gewohnt und genau wie dort funktioniert auch Suchen, etc. Diese Liste enthält alle "Static Arts" oder auch "Item Art", also alle Graphiken die nicht für die Map sind, sondern für Gegenstände.

Hier gibt es zwei nützliche kleine Buttons, nämlich "Nacors krasser Lochbutton" und "Sedins krasser Lochbutton". Beide erstellen eine Textdatei, in welcher ihr eine Liste der freien Slots findet. Der einzige Unterschied ist, dass Sedins Variante jeden freien Slot einzeln ausgibt während Nacors Variante, Lücken von mehreren Slots zu einem Bereich zusammenfasst (also euch z.B. sagt "Es gibt eine Lücke bei 0xDF, die 2 Slots groß ist"). Schaut euch die Textfiles einfach einmal an, dann erkennt ihr das sicher sofort.
Sedins Button ist insb. dann interessant, wenn ihr die Autopatch-Funtkion (s. ...) nutzen wollt.

4.1.1. Spezifikationen für Art (S) Graphiken

Für Art (S) Graphiken stehen, wenn ihr den Standard UO-Client benutzt, genau wie für Art (M) Graphiken 16384 Slots zur Verfügung (von 0x0 bis 0x3FFF). Benutzt ihr den Palanthir-Client, könnt ihr auch die Slots ab 0x4000 verwenden.

Interessant zu wissen ist vermutlich, dass sowohl die Art (M) als auch die Art (S) in denselben Dateien gespeichert werden, nämlich Art.mul bzw. Artidx.mul. In dieser Datei stehen die Art (M) einfach vor den Art (S) Graphiken. Deshalb gibt es neben der schon erwähnten (relativen) ID (0x0 bis 0x3FFF) auch eine "absolute" ID, welche die Position innerhalb der Art.mul Datei angibt: Für Art (M) Tiles ist die absolute ID mit der relativen identisch, da diese ja am Anfang beginnen. Für Art (S) Tiles ist diese die relative ID des Tiles plus 0x4000 (16384), da die Art (S) Tiles ja nach den Art (M) Tiles in der Datei stehen.
In
InsideUO findet ihr die absolute ID unter "Details" als "Overall Index".

Bezüglich 15-Bit Graphiken gilt ebenso das gleiche wie bezüglich Art (M). Ein wichtiger Unterschied ist jedoch, dass es keine Höhenbeschränkung der Graphik gibt, d.h. die Graphiken sind zwar immer noch 44 Pixel breit (und um 45° gedreht), aber sie können auch mehr (oder weniger) als 44 Pixel hoch sein. Solltet ihr etwas brauchen, was breiter ist als 44 Pixel, so setzt man es normalerweise im Spiel aus zwei (oder mehr) Items zusammen, siehe zum Beispiel die Feuerstellen und Kamine ab 0x8CF.

4.1.2. Einstellungen der Art (S) Tiles mittels Tiledata

Genauso wie bei der Art (M) könnt ihr auch für die Art (S) weitere Einstellungen in der Tiledata.mul vornehmen, allerdings stehen hier weitaus mehr Möglichkeiten zur Verfügung. Hierfür wählt ihr einfach die Registerkarte "Tiledata (S)" für die Art (S) (genau wie ihr in "Tiledata (M)" die Einstellungen für die Art (M) Tiles vornehmen konntet).

Hier eine Übersicht über die Optionen:

Bezeichnung Bedeutung
Name Der Standard-Name der Art
AnimID Die dazugehörige Animation (für Kleidung, Waffen, Reittiere, etc.)
Weight Gewicht (ist in den meisten Emulatoren serverseitig einstellbar)
Height Höhe - eine normale Mauer, die 1 Stockwerk hoch ist, hat für gewöhnlich eine Hohe von 20. Dies entspricht der Höhe im Spiel selbst (Z-Level). Bei Containern ist Height das "Contains" (was immer das bedeutet)
Quality Kann man das Item anziehen, steht in Quality der Layer, auf dem es liegt (diese Einstellung kann für jedes Item durch den Server geändert werden) Bei Lichtquellen ist die Quality die ID des Lichts
Quantity ?
Hue Farbe (wird normalerweise eh vom Server bestimmt)
Unknown 1-5 Unbekannt eben, bisher konnte keiner einen Sinn feststellen

Auch in der Tiledata (S) gibt es Flags, die man setzen kann. Die meisten Bedeutungen sind selbsterklärend, manche hingegen etwas wirr oder gar unbekannt. Die einfachste Art und Weise festzustellen, welche Flags man setzen sollte, wenn man ein neues Item hinzufügt, ist, sich ein ähnliches, (vorzugsweise original OSI-) Item zu suchen und von diesem die Flags zu kopieren. Natürlich kann man sich auch gedanklich die einzelnen Flags überlegen, aber meistens ist die andere Methode wesentlich sinnvoller, sicherer und schneller.

Hier mal eine Liste mit den bekannten Bedeutungen der Flags:

Bezeichnung Bedeutung
Background Wird ggf. hinter Objekten ohne Background gezeichnet (so dass z.B. Blumen hinter Möbeln gezeichnet werden, wenn sie z.B. beide auf 0 stehen).
Weapon Waffen, Schilde, Rüstungen
Transparent Durchsichtig (?) wird bei z.B. Bannern, Flaggen, etc. verwendet
Translucent Lichtdurchlässig (?)
Wall Wand
Damaging Macht Schaden (theoretisch?)
Impassable Unpassierbar, man kann nicht drüber/durch laufen (Wände, etc.)
Liquid Flüssig (ähnlich wie Art (M))
Unknown1 ?
Surface Oberfläche - Man kann darauf stehen
Bridge ? Verbindet evtl. unterschiedliche Höhen
Generic Gegenstand ist stapelbar
Window Durchsichtig
No Shoot Man kann nicht durchschießen
A Ein "a" wird dem Gegenstandsnamen ggf. vorangestellt ("a tree")
An Ein "an" (beides für deutsche Shards sinnlos)
Mongen ?
Foliage Blätterwerk, wird ggf. Ausgeblendet
Partialhue Gegenstand wird nur teilweise gefärbt, wenn Hue geändert wird, nämlich NUR die grauen Pixel der Graphik. Alle "bunten" Pixel bleiben erhalten. Grau ist alles, bei dem alle drei Werte der RGB-Skala gleich sind.
Unknown2 ?
Map ?
Container Gegenstand ist ein Container
Wearable Kann angezogen warden
Lightsource Ist eine Lichtquelle
Animation Besitzt eine Item-Animation, diese wird in der AnimData.mul festgelegt, indem bei der entsprechenden ID etwas eingetragen wird. Hat NICHTS mit Kleidung, etc. zu tun.
No Diagonal ?
Unknown3 ?
Armor Rüstung (theoretisch, praktisch hat es kaum eine)
Roof Dach, wird ggf. weggeblendet
Door Tür
Stairs Back Treppen von vorne nach hinten (oder umgekehrt)
Stairs Right Treppen von links nach rechts (oder umgekehrt)

Es ist mit Hilfe der Cliloc-Dateien möglich, den Namen anzupassen ohne die Tiledata zu verändern, alle anderen Einstellungen bleiben dann aber natürlich erhalten.

4.1.3. Bearbeitung der Tiledata (S) in größerem Ausmaß

Auch hier existiert die Möglichkeit, die Einstellungen aller Tiles in einem Textfile zu speichern, in Excel zu bearbeiten und wieder zu laden. Insbesondere wenn man alle "A" entfernen will, ist das sehr hilfreich (s. 3.4.2. Bearbeitung der Tiledata (M) in größerem Ausmaß)

4.2. Anziehbare Items

Prinzipiell kann gesagt werden, dass der Server bei einem getragenen Gegenstand ausschließlich die Art-ID an die Clients sendet. Wie die Animation und das dazu gehörige Paperdoll-Gump aussehen, muss der Client selbst anhand seiner Dateien entscheiden.

Damit der Client weiß, welche Daten er zu verwenden hat, ist die Angabe einer AnimID in der Tiledata (S) nötig. Sucht zum Beispiel mal nach einem beliebigen Kleidungsstück (Pants, Dress, etc.) und ihr werdet sehen, dass bei jenen ein Wert hierfür im entsprechenden Feld eingetragen ist.
Diese Einstellung bestimmt, welche Animation beim Charakter angezeigt wird, wenn er einen Gegenstand mit dieser ArtID angezogen hat.

Welches Gump angezeigt wird, wenn eine bestimmte Animation benutzt wird, ist nicht über irgendeine Einstellung variabel, sondern wird durch eine feste Formel anhand der AnimID bestimmt.

4.2.1. Gumps (nonAnim)

Nur als kurzer Einwurf, weil es gerade in die Reihenfolge passt:

Geht nun einmal kurz in die Settings und ladet die Gump-Dateien ein. Dann klickt auf "Gump (nonAnim) und schaut es euch an.

Non-Anim Gumps sind alle Gumps, die nicht mit einem bestimmten Kleidungsstück, Waffe, etc. verknüpft sind. Dazu gehören Splashscreen, Dialogfelder, etc.

Hierzu ist wenig zu sagen, einfach reinladen und abspeichern, weitere Einstellungen sind nicht notwendig, die non-Anim Gumps sind wirklich nur Bilder, die im Client auch so angezeigt werden. Meistens dienen sie als Formulare, Schilder, etc.

4.2.2. Gumps (anim)

Im Bereich "Gumps (anim)" können wir einen Eintrag anklicken und es wird uns nicht nur das Bild angezeigt, sondern als kleiner Text unten rechts neben der Liste auch die dazu gehörige Animations-ID. Und nun ist auch die Formel klar:

GumpID = AnimationsID + 50.000 (bzw. hexadezimal 0xC350)

Der gesamte Prozess läuft also so ab:
1. Der Server sendet die Art (S) ID.
2. Der Client sucht sich die passende AnimID aus der Tiledata (S)
3. Der Client berechnet aus dieser AnimID die passende GumpID
4. Nun kann alles angezeigt werden.

Optional kann übrigens für jedes Item auch eine weibliche Version eingepatcht werden, hierfür muß nur an der entsprechende Stelle (nämlich AnimationsID + 60.000) das entsprechende weibl. Gump eingefügt werden. Der Client erkennt dieses dann automatisch und zeigt es bei weiblichen Charakteren an, falls es nicht vorhanden ist, nimmt er das männliche.

Es ist für den Anfang wichtig zu wissen, dass die Animationen für Kleidung, Waffen, etc. erst ab 0x190 (400) beginnen, davor sind die Kreaturen (Monster, Tiere, etc.). Alles nach 0x190 bzw. 0x193 kommt, sind die Charanimationen, 0x190 ist übrigens der männliche Mensch, 0x191 der weibliche, 0x192 und 0x193 die Geister-Animationen (in diesen vier Slots dürft ihr übrigens NIEMALS etwas einpatchen, die werden speziell verwendet).
Die Monster-Animationen und die Charanimationen sind übrigens inkompatibel, d.h. ihr braucht auch gar nicht versuchen, ein Gump mit einer AnimID < 190 zu verbinden.

Erst ab GumpID 0xC4E4, bzw. AnimID 0x194 könnt ihr also richtig anfangen. Hinweis: Bei 0x3E8 könnt ihr in der Anim.mul auch gleich wieder aufhören, denn weiter liest der normale Ultima Online Client nicht. Wieder eine total willkührliche Beschränkung von OSI.

4.2.3. Neue Kleidung einpatchen - Schritt für Schritt

Im Normalfall hat man, wenn man neue Kleidung einfügen will, primär ein neues Gump und will dieses mit einem neuen (oder vorhandenen) Itemgraphik (Art (S)) und einer vorhandenen Animation verknüpfen. Eigene Animationen hat normalerweise selten jemand (aber falls doch, kommen wir später - s. 9. Animationen 2: Anim*.mul / Anim*.idx - dazu, wie man die einpatcht).

Schritt 1: Einpatchen in die Art (S)

Wie das geht, solltet ihr ja nun herausgefunden haben. Ihr patcht einfach ein neues Bild in die Art.mul ein, das dann später euer Item darstellen soll, wenn es in der Welt herumliegt.

Schritt 2: Füllen eines freien Gump-Slots

Wir suchen uns einen freien Gump-Slot, der größer ist als 0xC4E4 und laden dort unser neues Gump hinein.

Schritt 3: Kopieren der Animation

Wir wählen unser Gump aus und klicken noch einmal mit der rechten Maustaste darauf. Hier wählen wir nun "Copy existing Animation" aus. Es kommt nun eine Abfrage, in welcher wir die gewünsche AnimID eingeben. Daraufhin kopiert der Mulpatcher diese Animation automatisch an die neue, richtige Stelle (also an die Stelle mit AnimID = GumID - 50.000). Interessantes Detail am Rande: Es wird nur in der Anim*.idx kopiert (also quasi ein Querverweis angelegt und nicht wirklich die ganze Animation neu kopiert, so dass hier nicht megabyteweise redundante Daten erscheinen, keine Sorge). Falls ihr ganz perfekt sein wollt, könnt ihr noch die weibliche Version des Gumps an der entsprechenden Stelle (AnimID + 60.000) einfügen.

Hinweis: Vergesst nicht, dass die Animation hierbei direkt verändert wird, macht also lieber vorher ein Backup!

Schritt 4: Anpassen der Tiledata

Nun existiert also eine Animation an der richtigen Stelle. Wenn ihr nicht rechnen wollt, merkt euch einfach die AnimID, die euch bei eurem Gump angezeigt wird, denn diese müssen wir nun in der Tiledata für unser Art (S) Tile unter "AnimID" eintragen und dabei auch gleich "Wearable" anklicken und das richtige Layer in "Quality" eingeben.

Schritt 5: Speichern

Unter Settings nun Art, Tiledata und Gumps speichern. Fertig.

4.2.4. Die Layer

Und hier, der Komplettheit halber, die einzelnen Layer für die Gegenstände, die angezogen werden können:

Layer Beschreibung
1 Hand links
2 Hand rechts
3 Schuhe
4 Hose
5 Hemd
6 Helm
7 Handschuhe
8 Ring
9 Licht
10 Halskette
11 Haare
12 Schürze, halb
13 Rüstung (Brust)
14 Armreif
15 "hidden" (unbekannt)
16 Bart
17 Tunika
18 Ohrringe
19 Rüstung (Arme)
20 Umhang
21 Rucksack (speziell)
22 Robe
23 Kleid/Kilt
24 Rüstung (Beine)
25 Reittier

4.3. Container

Container werden einfach als Item eingepatcht und das Flag "Container" eingestellt. Welches Bild erscheinen soll, wenn der Container geöffnet wird, entscheidet immer der Server, hierfür müsst ihr hier gar nichts einstellen, nur in euren Skripten.
Wenn das Flag "Container" nicht gesetzt wurde, könnt ihr den Gegenstand im Normalfall auch nicht serverseitig zu einem Container machen, d.h. ihr könnt nicht einfach in einem Stuhl einfach ein Geheimfach einscripten, dafür müsst ihr hier "Container" einstellen.

Die Größe des Containers - also die Fläche, in die man etwas hineinlegen kann - wird für gewöhnlich serverseitig - also über die Skripte bestimmt. Bei RunUO existiert hierfür "Bounds" in der Klasse "Container". Die einzelnen Items haben auch wiederum Bounds, die ihre Größe festlegen, diese werden in der Datei bounds.bin festgelegt.

4.4. Sitzgelegenheiten

Apropos Sitzgelegenheiten: Die sind im OSI-Client hardcoded, ihr könnt keine neuen hinzufügen, außer ihr überschreibt die bereits vorhandenen mit anderen Graphiken. Bad luck. Der Palanthir-Client kann hier etwas mehr, hier sind die Sitzgelegenheiten über ein Config-File einstellbar.