====== Mobs/Grundlagen/oCMobInter ======
Wer keine decompilierten Anis hat, der kann meistens anstatt *.asc -> *.mdl und anstatt *.mds -> *.msb verwenden. Das gilt auch für die Mob-Einsetzliste. Es macht wenig Sinn, Dateien die man nicht hat, einzutragen und aufzurufen.
**Download, 81,0 Megabyte** (ZaphodBeeblebrox) "**G2**" Decompilierte Animationen
[[http://simple-creators.de/space/files/Animationen/gothic2_decompilierte_animationen.rar]]
oder Dateien ins ASC-Format selbst decompilieren -> [[:gothicsourcer|]]
===== Grundwissen Mobs =====
**Man unterscheidet bei den Mobs zuerst mal 3 Arten.**
* **Dynamisches Mob** - das ist ein Mob, bei dem sich bei Benutzung des Mobs nicht nur der NPC bewegt, sondern auch das Mob selbst animiert ist, wie zum Bsp. - der Schleifstein der sich ja bei der Benutzung dreht und die Gestänge und das Pedal. Bei diesem Mob wird als //Visual:Name_des_Mobs.**MDS**// eingesetzt.\\
* Ein dynamisches Mob erkennt man ausserdem noch an den 3 Dateien (falls man decompiliert hat)
- BEISPIELMOB_01.ASC
- BEISPIELMOB_01.MDS
- BEISPIELMOB_01_USE.ASC
* welche ihr im Ordner "_work\data\anims\asc_beispielmob" findet.
* **Statisches Mob**, wie zum Bsp. das Bett, bei dem der NPC sich bewegt (er legt sich hinein), aber am Bett selbst bewegt sich nichts. Bei diesem Mob wird als //Visual:Name_des_Mobs.**ASC**// eingesetzt.
* Das statische Mob besitzt nur eine
- BEISPIELMOB_01_ASC
* welche sich normalerweise im Ordner "_work\data\anims\asc_static\asc_beispielmob" befinden sollte.
* **Info Mob**, das man nur im Focus zu haben braucht und eine Info bekommt. Bsp. Ladenschild, Wegweiser. Die Info wird allerdings nicht geprinted bei gezogener Waffe.\\ Ihr klickt im Spacer_**Object**_Fenster auf oCVob(abstract)->oCMob und setzt jetzt **als Visual ein beliebiges Vob** ein, Bsp das Visual eines Wegweisers. Im Objectfenster habt ihr die Auswahl "MOB" und tragt dort unter "focusName:MOBNAME_BLTROLL" ein.\\ Danach geht ihr in die Datei **"Text.d"** und tragt dort ein, am besten ganz oben:\\
//My ModdingFocusNames
const string MOBNAME_BLTROLL = "Zum schwarzen Troll"; //Wegweiser
* Und weil es keine Regel ohne Ausnahme gibt.... Manchmal wird für ein eigentlich "Statisches Mob eine Mob.MDS" geschrieben, obwohl sich am Mob nichts bewegt, da in dieser Mob.MDS zB. PFX Effecte die zu bestimmten Framezahlen ein und ausgeschaltet werden sollen oder Sounds scripten kann. Natürlich nur, wenn beim erststellen des Mobs im 3DS-Prog ein entsprechender Bip 01 Fire, oder Bip 01 Sound eingebaut wurde.
===== 1. Kleine Kategorienkunde =====
1.0.0 - Wir suchen uns ein Mob aus der Mob-Einsetzliste aus. Wer noch keine Liste hat, **Download** aus der Modderdatenbank
*[[http://www.worldofgothic.de/?go=moddb&action=view&fileID=795&cat=9&page=0&order=0]]
Wir wählen uns ein Mob aus. Der Einfachheit halber nehmen wir für den Anfang ein "Statisches Mob" und ich habe für das Beispiel die Bank gewählt,
* BENCH_NW_OW_01.ASC
da diese den eigentlichen Normen eines Mobsis entspricht - Normalfall -. **Bett** und ähnliche **spezielle Mobs** sollten nicht als Beispiel herangezogen werden, da das Sonderfälle sind.
* Was sagt uns der Name des Mobs der in Teilstücke mit Underlines unterteilt ist?
* **BENCH**_NW_OW_01.ASC
* BENCH_ sagt **uns** dass dieses Mob zur Kategorie der Bänke gehört
* BENCH_ sagt der **Engine** dass für dieses Mob die speziell dafür in der Humans.mds eingetragene Humans_Ani verwendet werden soll und alle Teile-Anis die daraus kompiliert werden, für alle Bänke die mit "Bench_" im MobName beginnen, nutzbar sind.
* Bench_ in der Namensgebung vorne kann man jetzt für alle Bänke benutzen die erstellt wurden, egal ob aus Holz, aus Stein oder ob jemand eine Holzkiste zum draufsitzen gemacht hat. Es muss lediglich die Sitzhöhe und der Abstand zwischen dem Sitzmöbel und dem Punkt an dem der Hero zum Mob startet identisch sein.
* BENCH_**NW_OW**_01.ASC - Das sind Informationen zur Unterscheidung von Mobs gleicher Baureihe
* NW_OW - Dieses Mob gibt es in der New_World und in der Old_World
* BENCH_NW_OW**_01**.ASC
* _01 es könnte mehrere dieser Bänke in dieser Bauform geben,
* _01 vielleicht Holzbank
* _02 vielleicht Steinbank
* BENCH_NW_OW_01.**ASC**
*.ASC, wenn das Mob als *.ASC eingefügt wird ist es ein statisches Mob.
* Wir haben sozusagen immer einen Bezeichner der die "Bank" __BENCH___NW_OW_01.ASC des Mobs definiert und dahinter wird das in dieser Kategorie befindliche Mob spezifiziert (**nicht zu verwechseln mit den MobClasses**) Somit können alle bauartgleichen Bänke vorne mit Bench_ beginnen, ohne dass man eine neue Hum_Ani erstellen muss, oder Einträge in der Humans.mds einfügen.
* Ein MOB_NAME ohne mindestens eine Underline Unterbrechung des Namens funktioniert nicht, da die Anis des Players in der Humans.Mds zum Beispiel folgendermassen heissen:
* t_**bench**_stand_2_S0 (das ist die erste Ani dieses Mobs). Das Wort BENCH im MOB_NAME unserer Bank ist durch ein _Underline abgetrennt. Was dann noch dahinter steht liegt im Gusto des Mobsi_Erbauers.
**Dass das erste Teilstück des Mobnamens grundsätzlich die zugehörige Hum_Ani definiert, gilt für statische, als auch für dynamische Mobs**
===== 2. Mob_Classes =====
2.0.0 - Die Klassifikation eine Mobs, es gibt beispielsweise:
* ocMobIntern Bsp. "Bank"
* oCMobSwitch Bsp. "Schalter"
* oCMobContainer Bsp. "Truhe"
* u.s.w.......
entnehmt ihr bitte ebenfalls der oben angesprochenen Mob_Einsetzliste (1.0.0)
===== 3. Einsetzen =====
3.0.0 - Wir starten den Spacer und öffnen die von uns zu bearbeitende Zen
* 3.0.1 - Wir nehmen uns das Objekt_**Pages**_Fenster vor, setzen dort einen Haken in das Kästchen "hold" und stellen "**danach**" mit den kleinen Pfeilbuttons die Zeit auf 12:00.\\
* Jetzt ist die Zeit im Spacer angehalten und wenn unsere Arbeit länger dauert, wird es weder Tag noch Nacht, noch wird es regnen, oder sonst sich was verändern. Man kann da natürlich jede beliebige Zeit anwählen, aber mittags ist es eben am hellsten.
{{:quickstart:spacer:timehold.jpg|}}
3.1.0. - Einsetzen unseres Mobs
* 3.1.1 - Jetzt wenden wir uns dem Objectfenster zu das sich folgendermassen darstellt:
{{:quickstart:spacer:obpage_neutral.jpg|}}
* 3.1.2 - Wir schauen in der unter 1.0.0 beschriebenen MOB_EINSETZLISTE nach, zu was für einer Klasse das Mob BENCH_NW_OW_01_ASC gehört (unsere Bank) und stellen fest, dass das ein oCMobInter ist.
* 3.1.3 - Wir gehen zum Objektfenster zurück und klicken uns über oCVob(abstrakt) -> oCMob -> zu oCMobInter durch, und das sollte jetzt auch im Objectfenster farbig unterlegt sein.
* 3.1.3a - Der Weg zum aussuchen der Mob-Classes führt immer über oCVob(abstrakt) -> oCMob ->......weitere Auswahl
{{:quickstart:spacer:ocmobinter.jpg|}}
* 3.1.4 - Wir klicken mit der rechten Maustaste auf eine **freie** Stelle im Spacerfenster. Unbedingt darauf achten, dass man dabei nicht ein schon vorhandenes Vob, Mob, oder sonst etwas anklickt und aktiviert. Ansonsten ist unser Mob ein Child von dem was wir gerade mit dem Klick ins Spacerfenster aktiviert haben.Es erscheint das kleine Vobfenster.
{{:quickstart:spacer:smallvobfenster.jpg|}}
* 3.1.5 - Wir klicken mit der linken Maustaste auf "Insert(oCMobInter)"
* 3.1.6 - Es erscheint das Koordinatenkreuz mit der Bezeichnung oCMobinter im Hauptfenster des Spacers
{{:quickstart:spacer:ko_kreuz.jpg|{{:quickstart:spacer:ko_kreuz.jpg|}}}}
* Das Opjektfenster hat sich verändert, es hat sich gewandelt zum Einstellungsfenster eines oCMobInter
{{:quickstart:spacer:ko_objekt.jpg|}}
* Das Objekt_**List**_Fenster hat sich verändert. In der Titelzeile steht jetzt oCMobInter und ein vob 1 oCMobInter ist eingetragen neben einem "grünen" Punkt. Dieser Punkt wandelt sich zur Farbe "rot" nach dem nächsten Speichervorgang. Momentan dient er uns zum leichteren Auffinden unseres einzusetzenden Objektes.
{{:quickstart:spacer:ko_list.jpg|}}
3.2.0 - Zum Einsetzen unseres ausgewählten Mobs nehmen wir den Visualnamen, den wir aus unserer Mobeinsetzliste (siehe 1.0.0) ausgewählt haben, in unserem Falle "BENCH_NW_OW_01.ASC" und klicken im Objektfenster auf Visual.....
{{:quickstart:spacer:00_foto.jpg|}}
* 3.2.1 - Wir tragen ganz unten im Fenster "File", der Objektfensters den Namen unseres Mobs ein, in unserem Beispielfalle "BENCH_NW_OW_01.ASC"........
{{:quickstart:spacer:01_foto.jpg|}}
* 3.2.2 - klicken auf den Button "Apply"......
{{:quickstart:spacer:02_foto.jpg|}}
* 3.2.3- unser Mob erscheint im Hauptfenster des Spacers....
{{:quickstart:spacer:03_foto.jpg|}}
* 3.2.4- Der Eintrag im Object_**List**_Fenster hat sich verändert und
{{:quickstart:spacer:04_foto.jpg|}}
* 3.2.5 - wir geben unserer Bank einen aussagekräftigen "VobName" im Objectfenster....
{{:quickstart:spacer:05_foto.jpg|}}
* 3.2.6 - klicken wiederum auf den Button "Apply".....
* 3.2.7 - und wieder hat sich auch der Eintrag im Objekt_**List**_Fenster verändert.
{{:quickstart:spacer:06_foto.jpg|}}
* WArum tun wir das? Weil es .....
* komfortabel ist, wenn man an der Bank etwas verändern will und einige Bänke im Spiel hat. über das Fenster die entsprechende Bank auszuwählen und mit einem Doppelklick transportiert euch der Spacer genau da hin, egal wie gross die Welt ist.....
* Wenn man ein Mobsi später per Script aufrufen will, dann hat das schon einen spezifizierten Vobname.
* Ist aber kein muss.
===== 4. Positionieren =====
4.0.0 - Jetzt wird es an der Zeit, unser Mob dahin zu verfrachten wo wir das haben wollen.
* 4.0.1 - In unserem Beispielfalle, setze ich es längs an die wand, links neben das Torgatter. Dazu müssen wir auf das Mob klicken und wenn um unsere Bank ein roter Linienquader erscheint, dann ist es aktiviert/angewählt.
{{:quickstart:spacer:insert_bench.jpg|}}
* 4.0.2 - Um in den "Move-Modus" zu kommen, drücken wir entweder die Taste "M" (Tastatur), worauf in der senkrechten Buttonleiste der MOVE_BUTTON aktiviert wird, oder aber wir klicken mit der Maus auf den MOVE_BUTTON in dieser Leiste.
{{:quickstart:spacer:07_foto.jpg|}}
* 4.0.3 - Zum verschieben des Mobs benutzen wir die
* Tataturtasten A/Y = auf/ab
* Pfeiltasten links/rechts = links/rechts
* Pfeiltasten vorw./rückw. = vorwärts/rückwärts
* 4.0.4 - Zum verdrehen des Mobs alle 3 Achsen benutzen wir die
* Tasten 1.Achse = Pos1/Ende
* Tasten 2.Achse = Einf/Bildauf
* Tasten 3.Achse = Entf/Bildab
* 4.1.0 - Um unser Beispielmob zu setzen, müssen wir nicht drauf achten, mit welcher Seite wir die Bank an die Wand stellen, oder prinzipiell aufstellen, da alle Mod-Kit Bänke von 2 Seiten funktionieren. Das heisst man kann von jeder Längs-Seite aus gesehen drauf sitzen.\\
* Das Gegenbeispiel wäre zum Beispiel ein Alchemietisch, der nur von der Frontseite aus benutzt werden kann.
* 4.1.1 - Wenn wir das Mob in die von uns vorgesehene Position gebracht haben....
{{:quickstart:spacer:08_foto.jpg|}}
* 4.1.2 - schalten wir den Move-Modus wieder aus indem wir entweder die Tastaturtaste "M" drücken, oder aber mit der Maus in der senkrechten Button-Leiste den Move-Button deaktivieren (siehe 4.0.2.)
* **Erst danach betätigen wir den Button "Apply"**. Wenn ihr vorher den Button "Apply" betätigt und der Move-Modus ist noch eingeschaltet, dann springt euer Mob wieder an den ursprünglichen Ort zurück, an dem es eingesetzt wurde und ihr müsst noch mal neu positionieren.
===== 5. Einstellungen =====
5.0.0 - Als nächstes tätigen wir die Einstellungen für unser Mob
* **5.0.1 - Kollision**, dazu wählen wir das Mobsi mit einem Mausklick im Spacer Hauptfenster oder im Objekt_List_Fenster an, so dass der "Rote Linienquader" (Der Fachmann nennt den **Bounding Box**) zu sehen ist.
* Die Bounding Box gibt die Grösse an, über die sich die Kollisionsausmasse erstrecken. Es hat also nicht nur die Form der Bank Kollision gegenüber Npc, Movern (die von solchen Boundingboxen mit Kollision blockirt werden), etc. ..sondern der komplette rotumrandete Klotz.
* In diesem unserem Beispielfalle sollte die Boundingbox der Bank keinesfalls die Boundingbox des Movergatters tangieren, da sonst das Gatter nicht mehr aufgeht.
* Wenn ihr der Bank keine Kollision gebt, dann laufen Npc´s einfach durch die Bank durch und klettern nicht drüber.
* Die Sitzanimation eines Npc, wenn dieser das Mob benutzt, hält diesen in der korrekten Sitzposition auf der Bank, auch wenn ihr dem Mob keine Kollision gegeben hättet.
* Mobs deaktivieren immer, über die Zeitdauer der Benutzung die Kollision.
* Es kann also nicht als Mass-Stab genommen werden, dass wenn ein Mob funktioniert, dass die Kollision eingeschaltet ist.
* Wir doppelklicken mit der Maus auf den Eintrag cdDyn:FALSE im Objektfenster, der sich daraufhin in cdDyn:TRUE umwandelt
* Ihr könnt auch mit Einfachklick nur die Einstellung cdDyn aktivieren (farblich unterlegt) und anschliessend unten links einen Haken für cdDyn setzen. Das ergebnis ist bei beiden Varianten das selbe (Siehe Bild unterhalb.)
* Anschliessend klicken wir auf den Button "Apply"
{{:quickstart:spacer:09_foto.jpg|}}
* **5.0.2 - focusName:** Den zugehörigen focusName können wir ebenfalls aus der Mobeinsetzliste herauslesen
* **Download** aus der Modderdatenbank
*[[http://www.worldofgothic.de/?go=moddb&action=view&fileID=795&cat=9&page=0&order=0]]
* Der korrekte Name ist "MOBNAME_BENCH"
{{:quickstart:spacer:10_foto.jpg|}}
* Ihr könntet aber auch einen eigenen MOBNAME_xxx erstellen. Beispielsweise könnte das die Meditationsbank der Wassermagier sein
* Dazu öffnet man die Datei Text.d und zur besseren übersicht solltet ihr ganz oben eine Abteilung für euch schaffen, Bsp. MyModding FocusNames.
//MyModding FocusNames
const string MOBNAME_KDWBENCH = "Meditationsbank der Wassermagier";
* **5.0.3 - owner/ownerGuild:** Das scheint mir eher ein Spacerthema zu sein, da es Owner/OwnerGuild ja nicht nur für Mobs gibt. Bitte die WIKI´s für Spacer durchsehen. Das würde hier jetzt zu weit führen.
* Meine Erfahrungen aus G1 sind eben so, dass das eben nicht immer funktioniert und der Npc dessen Truhe du gerade knackst, eben nicht immer herbeigeeilt kommt, sondern eben nur oftmals. Zuverlässig ist etwas anderes!
* **5.0.3a - conditionFunc:** Wenn das die Meditationsbank der Wassermagier wäre würde ich das mit einem Script lösen. Das ist 100% zuverlässig. Den Aufruf des Scriptes schreibt man in die Zeile conditionFunc: B_KDWBANK(GROSS_SCHRIFT). Da der __conditionFunc vor dem onStateFunc gelesen__ wird, könnt ihr beides auch noch entsprechen kombinieren.\\Hier das Script dazu:
func int b_kdwbank ()
{
if (Npc_IsPlayer(self))
{
if (self.guild == GIL_KDW) // ob Hero Wassermagier ist
{
return TRUE; // wenn ja, darf er hinsitzen
}
else // wenn nicht
{
PrintScreen ("Diese Bank ist den Wassermagiern vorbehalten", -1, YPOS_LOGENTRY, FONT_Screen, 3);
return FALSE;
};
}
else // Falls ein Wassermagier im Game den TA_SITBENCH hat, darf der ebenfalls hinsitzen
{
return TRUE;
};
};
* **5.0.4 - triggerTarget:** Damit könnt ihr das Mob im Spacer mit einem anderen Objekt verlinken. Die Auslösung erfolgt durch das Benutzen. Bspw. könnte man den vobName eines Movers in das triggerTarget eines Mob schreiben. Dann bildet sich im Spacer eine "__blaue Linie__" zwischen dem Mob und dem Mover und wenn das Mob benutzt wird, wird der Mover ausgelöst.
* **5.0.5 - useWithItem:** Damit kann man vorschreiben, dass ein Mob nur benutzt werden kann, wenn man ein bestimmtes Item besitzt. Beispiel Alchemietisch->ItMi_Flask oder einen Eisenrohling zum Schmiedefeuer....
* **5.0.6 - onStatFunc:** Wird in den meisten fällen benutzt um den Mobsi-Dialog aufzurufen. Man kann natürlich mit dem Aufruf auch andere Dinge scripten und aufrufen. Die Eigenart dabei ist, dass im Spacer zum Beispiel der Aufruf im onStateFunc zum Bsp. TRUHE_OPEN benannt wird, in einem Script, wo dann steht was passieren soll, muss hinter dem Aufruf ein _S1 gescriptet werden.\\ Bsp: func void TRUHE_OPEN_S1()
* **5.0.7 - Sonstiges:** Alle diese Einträge im Spacer bitte in Grossbuchstaben machen - in zugehörigen Scripten ist das nicht notwendig.
* conditionFunc wird von der Engine immer vor onStateFunc gelesen.
====== Weiterführende Seiten ======
Ausnahme oCMobFire -> [[quickstart:spacer:mobsplatzieren:ocmobfire|]]
Ausnahme oCMobBed -> [[quickstart:spacer:mobsplatzieren:ocmobbed|]]
Ausnahme oCMobSwitch -> [[quickstart:spacer:mobsplatzieren:ocmobswitch|]]
Ausnahme oCMobItemSlot -> [[quickstart:spacer:mobsplatzieren:ocmobitemslot|]]
Ausnahme oCMobContainer -> [[quickstart:spacer:mobsplatzieren:ocmobcontainer|]]
====== Ingametest ======
{{youtube>c-93C4APrYo?medium}}
20160210(dlz)