Mobs/Grundlagen/oCMobInter
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.
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.
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
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,
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.
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.
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.
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:
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.
3.1.0. - Einsetzen unseres Mobs
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.
}}
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…..
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.
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.
* 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.
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“
5.0.2 - focusName: Den zugehörigen focusName können wir ebenfalls aus der Mobeinsetzliste herauslesen
Download aus der Modderdatenbank
-
Der korrekte Name ist „MOBNAME_BENCH“
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()
Weiterführende Seiten
Ingametest