In Zusammenarbeit mit Gottfried entstand die nun vorgestellte Technik, ein beliebiges Item als zusätzliche 1H Waffe zu heften. Das kann nun ein Schild oder eine Waffe sein aber denkbar sind hier auch Rüstungsteile wie Stiefel oder Armschienen.
Prinzip
In der Item Instanz wird das mainflag wie bei einer 1H Waffe als ITEM_KAT_NF gesetzt und zusätzlich wird flags = ITEM_SHIELD gesetzt. Das bewirkt nun, das man zwei 1H Waffen unabhängig anlegen kann.
In der Equip Funktion wird nun durch ein AI_PlayAni(self, "T_SHIELD_EQUIP_1"); eine Animation ausgeführt, welche einen PFX Effekt anheftet. Dieser PFX Effekt dient lediglich dazu, das Item sichtbar an einen Slot, in diesem Fall das Schild an den Rücken zu heften.
In der UnEquip Funktion wird nun wiederum eine AI_PlayAni gestartet, welche das Item(PFX) wieder entfernt. Um nun das Item (Schild) beim Waffe ziehen an den linken Arm (beliebiger Slot) zu binden, wird in der Equip Funktion zusätzlich eine OverlayMds initialisiert. In der OverlayMds wird nun bei der Schwert ziehen Animation (t_Run_2_1h) der zuvor an den Rücken geheftete PFX entfernt (*eventPFXStop) und ein zusätzlicher PFX an den linken Arm geheftet. In der UnEquip Funktion wird wiederum die OverlayMds entfernt und dabei der PFX an dem linken Arm gestoppt.
Man benötigt also zwei PFX Effekte. Einer ist für das sichtbar machen an dem Rücken und einer für das Tragen an der linken Hand. Diese werden in der Equip Funktion gestartet bez. gestoppt und in der UnEquip Funktion ebenso gestoppt bez. gestartet. Man benötigt leider zwei PFX Effekte, weil die Slot-Haltepunkte unterschiedlich sind.
Die Item Instance
Code:
const int Shield_01_TProtEdge = 20;
const int Shield_01_TProtBlunt = 20;
const int Shield_01_TProtPoint = 20;
const int Shield_01_TProtFire = 20;
const int Shield_01_TProtMagic = 20;
instance ItAr_Shield_01 (C_Item)
{
name = "Schild";
mainflag = ITEM_KAT_NF;
flags = ITEM_SHIELD;
value = 850;
visual = "schild_01.3DS";
material = MAT_METAL;
on_equip = Shield_Equip_01;
on_unequip = Shield_UnEquip_01;
description = name;
TEXT[1] = NAME_Prot_Magic;
COUNT[1] = Shield_01_TProtMagic;
TEXT[2] = NAME_Prot_Fire;
COUNT[2] = Shield_01_TProtFire;
TEXT[3] = NAME_Prot_Point;
COUNT[3] = Shield_01_TProtPoint;
TEXT[4] = NAME_Prot_Edge;
COUNT[4] = Shield_01_TProtEdge;
TEXT[5] = NAME_Value;
COUNT[5] = value;
// Inventar Ansicht an das Schild anpassen
inv_rotx = 1;
inv_roty = 0;
inv_rotz = 90;
INV_ZBIAS = 170;
};
func void Shield_Equip_01() {
// Schutzwerte beim anlegen erhöhen
self.protection [PROT_EDGE] += Shield_01_TProtEdge; // Schutzwerte wie beim Ring der Unbezwingbarkeit
self.protection [PROT_BLUNT] += Shield_01_TProtEdge;
self.protection [PROT_POINT] += Shield_01_TProtPoint;
self.protection [PROT_FIRE] += Shield_01_TProtFire;
self.protection [PROT_MAGIC] += Shield_01_TProtMagic;
// Schild an den Rücken heften Ani ist in der humanS.mds
AI_PlayAni(self, "T_SHIELD_EQUIP_1");
// dazugehörige Overlay Anis laden zuständig für das Anlegen/Ablegen des Schildes an den Arm
Mdl_ApplyOverlayMds(self, "Hum_Schild_01.mds");
};
func void Shield_UnEquip_01() {
// Schutzwerte beim ablegen reduzieren
self.protection [PROT_EDGE] -= Shield_01_TProtEdge;
self.protection [PROT_BLUNT] -= Shield_01_TProtEdge;
self.protection [PROT_POINT] -= Shield_01_TProtPoint;
self.protection [PROT_FIRE] -= Shield_01_TProtFire;
self.protection [PROT_MAGIC] -= Shield_01_TProtMagic;
// Schild am Rücken wieder entfernen
AI_PlayAni(self, "T_UNEQUIPARMOR_1");
// Overlay wieder entfernen
Mdl_RemoveOverlayMds(self, "Hum_Schild_01.mds");
};
Eintrag in der HumanS.mds
Code:
ani("t_shield_equip_1" 1 "s_walk" 0.5 0.5 M. "Hum_EatFood_A03.asc" F 1 1) // t_shield_equip_1 Ani
{
*eventPFX(1 4 "PFX_SCHILD_01" "BIP01 SPINE2" ATTACH) // Heftet den PFX an den Rücken
}
ani("T_UnequipArmor_1" 1 "s_walk" 0.5 0.5 M. "Hum_EatFood_A03.asc" F 1 1)
{
*eventPFXStop(1 4) // Stoppt den PFX an dem Rücken
}
Die OverlayMDS
Der Code muss als Hum_Schild_01.mds im _work\Anims Ordner abgespeichert werden.
Code:
// hum Schild
Model ("HuS")
{
meshAndTree ("Hum_Body_Naked0.ASC" DONT_USE_MESH)
aniEnum
{
// Schwert ziehen
ani ("t_Run_2_1h" 1 "s_1h" 0.0 0.0 M. "Hum_1hSDrawT0_A01_Schild.asc" F 1 2)
{
*eventPFXStop (1 4) // stoppt den PFX, Schild verschwindet am Rücken
}
ani ("s_1h" 1 "s_1h" 0.0 0.0 M. "Hum_1hSDrawT0_A01_Schild.asc" F 3 3)
ani ("t_1h_2_1hRun" 1 "s_1hRun" 0.0 0.0 M. "Hum_1hSDrawT0_A01_Schild.asc" F 4 15)
{
*eventTag (4 "DEF_FIGHTMODE" "1H")
*eventTag (4 "DEF_DRAWSOUND")
*eventPFX (4 4 "PFX_SCHILD_01_A" "BIP01 L FOREARM" ATTACH ) // PFX wird in der linken Hand gestartet
}
// Schwert wegstecken
ani ("t_1hRun_2_1h" 1 "s_1h" 0.0 0.0 M. "Hum_1hSDrawT0_A01_Schild.asc" R 4 15)
{
*eventTag (4 "DEF_UNDRAWSOUND")
*eventTag (4 "DEF_FIGHTMODE" "")
*eventPFXStop (4 4) // PFX wird in der linken Hand gestoppt
}
ani ("t_1h_2_Run" 1 "" 0.0 0.0 M. "Hum_1hSDrawT0_A01_Schild.asc" R 1 2)
{
*eventPFX (1 4 "PFX_SCHILD_01" "BIP01 SPINE2" ATTACH ) // PFX wird an dem Rücken geheftet und eben gestartet
}
}
}
Probleme
Wenn man während dem Laufen eine Waffe zieht und wieder weg steckt kann man mit dieser Methode leider kein Schild binden. Das liegt an der Methode, wie die Engine die Waffe beim Laufen zieht.
Wenn man ein Mobsi benutzt wird das Schild beim Mobsi verlassen nicht wieder geheftet. Das wird wohl oder übel so bleiben, da man unmöglich alle Mobis Anis dahingehend verändern kann. Wenn man die Waffe wieder zieht, ist das Schild auch wieder korrekt am am Rücken, also ist das Problem rein optisch...
Die bereitgestellten Daten beinhalten keine neuen Schildkampfanimationen. Es werden also die normalen 1H Anis genommen. Um diesen Schildkampf individuell zu gestalten, werden also noch Schildkampfanis benötigt und jedes Modteam, welches diese Techniken verwendet kann hier der Kreativität freien Lauf lassen
Sehr solide Arbeit. Gratuliere. Das Video sieht sehr vielversprechend aus.
Schön, dass Ihr das der Allgemeinheit zur Verfügung stellt. Da werden sicher einige Modteams von profitieren. Auch wenn ich es nicht benötige, muss ich trotzdem fragen, ob eine Adaption auf Gothic I mögl. ist?
Sehr solide Arbeit. Gratuliere. Das Video sieht sehr vielversprechend aus.
Schön, dass Ihr das der Allgemeinheit zur Verfügung stellt. Da werden sicher einige Modteams von profitieren.
Es kamen eben Anfragen, sowohl im Editing als auch per PN. Es wäre irgendwie blöd und auch unfair, wenn wir das nur wenigen geben würden.
Zitat von Der Ahnungslose
Auch wenn ich es nicht benötige, muss ich trotzdem fragen, ob eine Adaption auf Gothic I mögl. ist?
Ob es in gothic 1 funktioniert müsstest du versuchen. Es müsste aber auch in G1 funktionieren, höchstens die PFX Definitionen könnten problematisch sein.
Die gefährlichste aller Weltanschauungen ist die Weltanschauung der Leute, welche die Welt nicht angeschaut haben.
Alexander von Humboldt
Die bereitgestellten Daten beinhalten keine neuen Schildkampfanimationen. Es werden also die normalen 1H Anis genommen. Um diesen Schildkampf individuell zu gestalten, werden also noch Schildkampfanis benötigt und jedes Modteam, welches diese Techniken verwendet kann hier der Kreativität freien Lauf lassen
Hab’s mal getestet und es klappt, bis auf:
Wenn ich den Schild wieder unequipe wird der Schild nicht entfernt er bleibt am Rücken. Hab ich da einen Fehler beim Kopieren der Dateien gemacht oder muss ich da noch etwas ergänzen?
Ich habe es auch getestet, doch habe ich ein anderes Problem. Der Schild bleibt bei mir ständig am Arm hängen, auch wenn ich ihn wieder im Inventar ablege.
Hab’s mal getestet und es klappt, bis auf:
Wenn ich den Schild wieder unequipe wird der Schild nicht entfernt er bleibt am Rücken. Hab ich da einen Fehler beim Kopieren der Dateien gemacht oder muss ich da noch etwas ergänzen?
Zitat von blackpirate
Ich habe es auch getestet, doch habe ich ein anderes Problem. Der Schild bleibt bei mir ständig am Arm hängen, auch wenn ich ihn wieder im Inventar ablege.
Überprüft bitte nochmal die Einträge in der HumanS.mds
Um die Änderungen in der HumanS.mds wirksam werden zu lassen, muss die HUMANS.MSB im _compiled Ordner gelöscht werden.
Das wäre eine mögliche Fehlerquelle.
Die gefährlichste aller Weltanschauungen ist die Weltanschauung der Leute, welche die Welt nicht angeschaut haben.
Alexander von Humboldt
Problem sind die Anis T_1HMove_2_Move und umgekehrt, wenn man das Schwert per "1" wegsteckt, dann bleibt der Schild am Arm und wenn man es im Laufen zieht, dann bleibt es am Rücken, soweit meine Tests. Außerdem klappt das Ablegen bei mir auch noch nicht.
Problem sind die Anis T_1HMove_2_Move und umgekehrt, wenn man das Schwert per "1" wegsteckt, dann bleibt der Schild am Arm und wenn man es im Laufen zieht, dann bleibt es am Rücken, soweit meine Tests. Außerdem klappt das Ablegen bei mir auch noch nicht.
Mit der "1" funktioniert es leider noch nicht, da wird noch nicht zwischen den beiden "1" unterschieden...
es wird beim Ablegen genauer gesagt die t_1hmove_2_move verwendet und diese ist intern und deshalb wird nur das Schwert abgelegt aber nicht zusätzlich das Schild.
Das An und ablegen funktioniert nur mit den Standard Tasten, also mit der Leertaste oder mittlere Maustaste.
EDIT
Das Problem ist die t_1hmove_2_move. Diese Übergangsani ist zwar in der HumanS.mds definiert aber es gibt keine move definition. Diese ist eben irgendwie intern geregelt. Wenn ich nun in diesen beiden Anis also t_move_2_1hmove und t_1hmove_2_move den PFX starte bez. stoppe, dann bleibt das Schild trotzdem dauerhaft gebunden. Dann hat man zwei Schilde und das ist noch blöder.
Es fehlt also konkret die move Ani und zwar als vollwertiger Stage. Eine nachträgliche Definition in der mds bringt leider nichts...
Die gefährlichste aller Weltanschauungen ist die Weltanschauung der Leute, welche die Welt nicht angeschaut haben.
Alexander von Humboldt
Geändert von Zaphod Beeblebrox (05.06.2011 um 11:34 Uhr)
Ich habe seltsamerweise immer einen Call-Stack bei den Animationen in der HumanS.mds. Das ist mir sehr rätselhaft, ist nämlich nicht die erste Animation, die ich verwende. Der Call-Stack passiert, wenn ich den Code am Anfang (nach Bewegungs - Modi) setze. Wenn ich ihn weiter nach unten setze, z.B. nach den Walk-anis, dann passiert nichts. Allerdings werden dann auch die Anis nicht gefunden (ich kann sie nicht per Konsole aufrufen (not Found) und werden auch nicht abgespielt -> Schield ist nicht zu sehen). Ich habe sonst alles richtig eingetragen, OverlyMds erstellt, aber es will einfach nicht gehen.
Ich habe im Anhang mal den zSpy-Bericht reingetan.
Ich habe seltsamerweise immer einen Call-Stack bei den Animationen in der HumanS.mds. Das ist mir sehr rätselhaft, ist nämlich nicht die erste Animation, die ich verwende. Der Call-Stack passiert, wenn ich den Code am Anfang (nach Bewegungs - Modi) setze. Wenn ich ihn weiter nach unten setze, z.B. nach den Walk-anis, dann passiert nichts. Allerdings werden dann auch die Anis nicht gefunden (ich kann sie nicht per Konsole aufrufen (not Found) und werden auch nicht abgespielt -> Schield ist nicht zu sehen). Ich habe sonst alles richtig eingetragen, OverlyMds erstellt, aber es will einfach nicht gehen.
Ich habe im Anhang mal den zSpy-Bericht reingetan.
Grüße
Neconspictor
Das deutet darauf hin, das die Anis nicht gefunden werden.
Erstelle im _work\data\Anims Ordner einen neuen und kopiere dorthin alle asc und mds Dateien.
lösche dann die HumanS.msb und alle hum_schild*.*
Die gefährlichste aller Weltanschauungen ist die Weltanschauung der Leute, welche die Welt nicht angeschaut haben.
Alexander von Humboldt
Danke für deine Unterstützung, Zaphod Beeblebrox !
Ich habe die HUM_BODY_NAKED0 zwar schon (daran lag es also nicht), ich habe aber dafür durch Zufall selbst rausgefunden woran es lag:
Komischerweise kommt Gothic durcheinander bei Kommentaren (die ausgeklammert sind!), wenn sie hinter einer Code-Zeile stehen. Du hast ja Kommentare für die anis geschrieben (z.B. ani("t_shield_equip_1" 1 "s_walk" 0.5 0.5 M. "Hum_EatFood_A03.asc" F 1 1) // t_shield_equip_1 Ani) aber da kommt der Fehler auf. Wenn in der Zeile kein Code steht, wo der Kommentar
steht, gibt es keine Probleme. Ich denke mal, dass ich hier der einzige bin bis jetzt, der diesen Fehler hatte, denn anscheinend funktioniert es bei euch.
Na ja, vielleicht hilft es irgend Jemandem ja mal
Und eins sag ich euch: Wenn mein Gothic so weiter macht, dann bring ich es noch um
Mir ist gerade aufgefallen, dass das Event *eventTag nicht im wiki erklärt wird.
Was genau kann man damit machen? Mir ist aufgefallen, dass du es zum abspielen von Sounddateien (*eventTag (4 "DEF_DRAWSOUND")) hernimmst, aber auch um den Fightmode zu wechseln (*eventTag (4 "DEF_FIGHTMODE" "1H")). Hat dieses Event irgendwelche Vorzüge, oder kann man es einfach für alles Mögliche verwenden? Sound kann man doch auch mit *eventSXF wiedergeben.
Mir ist gerade aufgefallen, dass das Event *eventTag nicht im wiki erklärt wird.
Was genau kann man damit machen? Mir ist aufgefallen, dass du es zum abspielen von Sounddateien (*eventTag (4 "DEF_DRAWSOUND")) hernimmst, aber auch um den Fightmode zu wechseln (*eventTag (4 "DEF_FIGHTMODE" "1H")). Hat dieses Event irgendwelche Vorzüge, oder kann man es einfach für alles Mögliche verwenden? Sound kann man doch auch mit *eventSXF wiedergeben.
Der *eventTag dient als Auslöser für so ziemlich alles. Man kann damit Items heften PFX Effekte starten und stoppen, Sounds starten usw.
Suche am besten mal die HumanS.mds nach dem Tag und dann wird denke ich klar, was damit alles möglich ist.
Die gefährlichste aller Weltanschauungen ist die Weltanschauung der Leute, welche die Welt nicht angeschaut haben.
Alexander von Humboldt