|
-
Habe gerade herausgefunden das
einwandfrei bei den hinzugefügten Animationen funktioniert. Sehr merkwürdig
Das Wappen -Eine fantastische Spielwelt erwartet dich- -bis zu 100 Stunden Spielzeit-
-
Moin,
kann man dieses Problem mit dem *eventTag bei random animationen nicht irgendwie lösen?
Das Wappen -Eine fantastische Spielwelt erwartet dich- -bis zu 100 Stunden Spielzeit-
-
Lieber aebo,
ich fürchte du hast die syntax von gothics animationssystem nicht verstanden.
Event tags funktionieren fast ausschließlich in transitions-animationen.
Deine random-ani könntest du als transition in einen neuen state einpflegen welcher sofort wieder zurück zur ausgangsani führt.
Beispiel:
Gothic original (alles aus dem kopf! Ggf abweichende bezeichnungen):
Die transitionsani
T_stove_s0_2_s1
führt zu...
S_stove_s1
Dein eingriff:
Neue transition
T_stove_s1_2_s2
Enthält exakt die erste hälfte deiner neuen ani und führt zu...
S_stove_s2
Welche exakt den ersten frame der 2. Hälfte enthält.
Diese ani soll aber nicht sich selbst aufrufen sondern übergehen zu...
T_stove_s2_2_s1
Welche die 2. Hälfte der neuen ani enthält und zurück führt zu
S_stove_s1
Um den loop sauber zu beenden.
In den t_anis kannst du so viele event tags benutzen wie du lustig bist.
Damit sollte sich auch alles an bugs erübrigen.
"Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
-Korallenkette
-
Zitat von Bisasam
Lieber aebo,
ich fürchte du hast die syntax von gothics animationssystem nicht verstanden.
Event tags funktionieren fast ausschließlich in transitions-animationen.
Deine random-ani könntest du als transition in einen neuen state einpflegen welcher sofort wieder zurück zur ausgangsani führt.
Beispiel:
Gothic original (alles aus dem kopf! Ggf abweichende bezeichnungen):
Die transitionsani
T_stove_s0_2_s1
führt zu...
S_stove_s1
Dein eingriff:
Neue transition
T_stove_s1_2_s2
Enthält exakt die erste hälfte deiner neuen ani und führt zu...
S_stove_s2
Welche exakt den ersten frame der 2. Hälfte enthält.
Diese ani soll aber nicht sich selbst aufrufen sondern übergehen zu...
T_stove_s2_2_s1
Welche die 2. Hälfte der neuen ani enthält und zurück führt zu
S_stove_s1
Um den loop sauber zu beenden.
In den t_anis kannst du so viele event tags benutzen wie du lustig bist.
Damit sollte sich auch alles an bugs erübrigen.
Hallo liebe Bisasam,
schön das wenigstens du die syntax von gothics animationssystem verstanden hast. Dann kannst du mir ja helfen
Hier sind meine derzeitigen Animationen, ich würde dich bitten diese nach deinem Wissen anzuordnen. Danke
Code:
/////////////// Seperate Backani Npc///////////////
ani ("T_BACKTISCH_KOMPLETTBACKEN" 1 "s_BACKTISCH_S0" 0.1 0.1 M. "BACKTISCH_HUMAN.asc" F 6 194)
{
*eventTag (71 "DEF_CREATE_ITEM" "ZS_LEFTHAND" "ItFo_Water")
*eventSFX (74 "RELEASECORK" R:1000 EMPTY_SLOT )
*eventTag (94 "DEF_DESTROY_ITEM" )
*eventTag (108 "DEF_CREATE_ITEM" "ZS_RIGHTHAND" "ItMi_Teig")
*eventTag (164 "DEF_DESTROY_ITEM" )
}
// --------------------------------------------------------------------------------------------------------------
ani ("T_BACKTISCH_STAND_2_S0" 1 "s_BACKTISCH_S0" 0.1 0.0 M. "BACKTISCH_HUMAN.ASC" F 0 1)
ani ("S_BACKTISCH_S0" 1 "s_BACKTISCH_S0" 0.0 0.0 M. "BACKTISCH_HUMAN.ASC" F 2 2)
ani ("T_BACKTISCH_S0_2_STAND" 1 "" 0.1 0.1 M. "BACKTISCH_HUMAN.asc" R 0 1)
ani ("T_BACKTISCH_S0_2_S1" 1 "s_BACKTISCH_S1" 0.0 0.0 M. "BACKTISCH_HUMAN.asc" F 3 4)
ani ("S_BACKTISCH_S1" 1 "s_BACKTISCH_S1" 0.0 0.0 M. "BACKTISCH_HUMAN.asc" F 5 5)
ani ("T_BACKTISCH_S1_2_S0" 1 "s_BACKTISCH_S0" 0.1 0.1 M. "BACKTISCH_HUMAN.asc" R 3 4)
Das Wappen -Eine fantastische Spielwelt erwartet dich- -bis zu 100 Stunden Spielzeit-
-
Zuerst mal würd ich gern wissen warum die npc version nicht der des helden gleichen darf. Du könntest ansonsten die tags von oben einfach in die erste t ani unten einpflegen.
"Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
-Korallenkette
-
Zitat von Bisasam
Zuerst mal würd ich gern wissen warum die npc version nicht der des helden gleichen darf. Du könntest ansonsten die tags von oben einfach in die erste t ani unten einpflegen.
Ich habe jede Gothic animation an static und an beweglichen mobsis verändert. Beim benutzen der Mobs richtet sich der Npc/Held erstmal nur am Mobsi aus. Danach wird das Fenster der OnState erscheinen und der Spieler hat Auswahlmöglichkeiten das Mobsi zu benutzen oder es wieder zu verlassen. Wenn dann das Mobsi über eine Auswahl benutzt werden soll (Fleisch braten/backen/kochen am kochtop, etc.) spielt der Npc/Held die Animation (Meine Randomanimation) ab. Erst dann sollen zur richtigen Zeit die eventTags die Items in die Hände legen.
Soviel erstmal zum verständnis
Das Wappen -Eine fantastische Spielwelt erwartet dich- -bis zu 100 Stunden Spielzeit-
Geändert von aebo (18.06.2019 um 10:53 Uhr)
-
Hast du dann auch die Tagesablauf-Skripte abgeändert?
Deine Animation sollte dann am besten so aussehen, dass der Status von Stand bis S1 maximal das an den Herd stellen darstellt. Dann kannst du in den Zustandsskripten die entsprechenden Animationen anschalten. z.B. AI_UseMob in dem Anfang vom Zustand wo auch die Perception steht und anschließend im Loop dann die Animation z.B. T_Stove_s1_2_s2 usw. wo du die Items insertest und den Npc kochen lässt.
Wenn du den Part über die Zustände und das Dialogmenü regelst, brauchst du in der Humans.mds gar nicht so viel rummatschen.
Ich erkläre dir absichtlich welche Logik dahintersteht, da du damit auch einiges an anderen Sachen umsetzen kannst. Wenn ich dir den Code nur hinmatsche, bringt dir das nichts. Dann stehst du wieder und wieder auf der Matte ohne zu wissen wie dein eigener Code funktioniert. Bugfixing wird dann auch zur Qual.
Also noch mal zum Mitschreiben:
Deine BACKTISCH-Animation sollte bis S1 nur das hinstellen an den Tisch beinhalten ohne etwas in die Hand zu inserten. Dazu brauchst du natürlich die gefragte Animationsdatei und musst frames abzählen und gucken wie es gut aussieht.
Deine Animation von S1 übergang zu S2 sollte z.B. den Topf beinhalten.
Deine Animation von S2 Übergang zu S3 sollte dann z.B. die Pfanne beinhalten.
Und deine Animation von S3 Übergang S4 sollte dein Backgerät beinhalten.
Du kannst das so beliebig erweitern um noch mehr Kochutensilien.
Im ZS_STOVE kannst du dann deine Anpassungen vornehmen und den Npc zufällig die S1_2_S2, S2_2_S3 usw. annehmen lassen. Denk aber daran, die Rückwärts-Animationen sauber zu gestalten sodass man jederzeit von Kochtopf in Ursprungs-Bereitstellung zurückkommt.
Wichtig zu wissen: Es kann auf diese Weise vorkommen, dass ein Npc beim abbrechen des Backzustands sämtliche vorherige Animationen ausführt. Also dass er dann plötzlich den Topf rausholt und wegsteckt und ähnliches. Das kannst du unterbinden, indem du die gerade ausgeführte Animation über TA_Position speicherst und im ZS_STOVE_END nicht AI_UseMob("STOVE",-1) sondern z.B. AI_PlayAni (self,"T_BACKTISCH_S3_2_S2"), dicht gefolgt von AI_StandUpQuick(self); sodass die Mobsibenutzung ohne das vollständige Ausführen aller S-Animationen beendet wird.
Im Notfall ein bisschen rumexperimentieren und testen. Aber backups vorher nicht vergessen!
"Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
-Korallenkette
-
Zitat von Bisasam
Hast du dann auch die Tagesablauf-Skripte abgeändert?
Deine Animation sollte dann am besten so aussehen, dass der Status von Stand bis S1 maximal das an den Herd stellen darstellt. Dann kannst du in den Zustandsskripten die entsprechenden Animationen anschalten. z.B. AI_UseMob in dem Anfang vom Zustand wo auch die Perception steht und anschließend im Loop dann die Animation z.B. T_Stove_s1_2_s2 usw. wo du die Items insertest und den Npc kochen lässt.
Wenn du den Part über die Zustände und das Dialogmenü regelst, brauchst du in der Humans.mds gar nicht so viel rummatschen.
Ich erkläre dir absichtlich welche Logik dahintersteht, da du damit auch einiges an anderen Sachen umsetzen kannst. Wenn ich dir den Code nur hinmatsche, bringt dir das nichts. Dann stehst du wieder und wieder auf der Matte ohne zu wissen wie dein eigener Code funktioniert. Bugfixing wird dann auch zur Qual.
Also noch mal zum Mitschreiben:
Deine BACKTISCH-Animation sollte bis S1 nur das hinstellen an den Tisch beinhalten ohne etwas in die Hand zu inserten. Dazu brauchst du natürlich die gefragte Animationsdatei und musst frames abzählen und gucken wie es gut aussieht.
Deine Animation von S1 übergang zu S2 sollte z.B. den Topf beinhalten.
Deine Animation von S2 Übergang zu S3 sollte dann z.B. die Pfanne beinhalten.
Und deine Animation von S3 Übergang S4 sollte dein Backgerät beinhalten.
Du kannst das so beliebig erweitern um noch mehr Kochutensilien.
Im ZS_STOVE kannst du dann deine Anpassungen vornehmen und den Npc zufällig die S1_2_S2, S2_2_S3 usw. annehmen lassen. Denk aber daran, die Rückwärts-Animationen sauber zu gestalten sodass man jederzeit von Kochtopf in Ursprungs-Bereitstellung zurückkommt.
Wichtig zu wissen: Es kann auf diese Weise vorkommen, dass ein Npc beim abbrechen des Backzustands sämtliche vorherige Animationen ausführt. Also dass er dann plötzlich den Topf rausholt und wegsteckt und ähnliches. Das kannst du unterbinden, indem du die gerade ausgeführte Animation über TA_Position speicherst und im ZS_STOVE_END nicht AI_UseMob("STOVE",-1) sondern z.B. AI_PlayAni (self,"T_BACKTISCH_S3_2_S2"), dicht gefolgt von AI_StandUpQuick(self); sodass die Mobsibenutzung ohne das vollständige Ausführen aller S-Animationen beendet wird.
Im Notfall ein bisschen rumexperimentieren und testen. Aber backups vorher nicht vergessen!
Ich habe doch oben die benötigten einträge in der humans.mds eingetragen.
kannst du daraus etwas basteln?
Ich habe es versucht und bekomme leider nie ein item in die hand mit dem *eventtag
Das Wappen -Eine fantastische Spielwelt erwartet dich- -bis zu 100 Stunden Spielzeit-
-
Nochmal wegen oben genannten Problem.
ist es möglich das man diese Funktion hier so ändert, dass sie Frame basierend das Item in den Slot legt?
Code:
func void PutInvItemInSlot(var C_NPC slf, var string slotName, var int inst)
{
CreateInvItem(slf, inst);
Npc_RemoveInvItem(slf, inst);
//put in Slot
const int oCNpc__PutInSlot = 7642288; //0x749CB0
CALL_IntParam(true); //is in inventory
CALL_PtrParam(MEM_InstToPtr(item));
CALL_zStringPtrParam(slotName);
CALL__thiscall(MEM_InstToPtr(slf), oCNpc__PutInSlot);
};
Das Wappen -Eine fantastische Spielwelt erwartet dich- -bis zu 100 Stunden Spielzeit-
-
Was heißt denn "Frame basierend"? Willst du das an einem bestimmten Frame der Animation ausführen? Das geht glaube ich nicht - aus den Scripten heraus hat man ohne weiteres nicht so tiefe Einblicke in das Animationssystem.
-
Ich hatte hier:
https://forum.worldofplayers.de/foru...1#post26094471
ja schon mal meinen lustigen workaround gezeigt.
Da wollte ich in der Animation t_Plunder
Code:
// Pluendern
ani ("t_Plunder" 1 "" 0.0 0.0 M. "Hum_Pluender_A01.asc" F 0 75)
in frame 54 ein item in die Hand kleben.
Meine Lösung war dann diese Animation aufzuteilen, eben damit man mit AI_Function zum richtigen Zeitpunkt Skriptcode ausführen kann:
Code:
// Item Pluendern
ani ("t_Stand_2_PlunderItem" 1 "S_PlunderItem" 0.0 0.0 M. "Hum_Pluender_A01.asc" F 0 54)
ani ("S_PlunderItem" 1 "S_PlunderItem" 0.0 0.0 M. "Hum_Pluender_A01.asc" F 54 54)
// hier wird jetzt per Skript das Item in ZS_RIGHTHAND angeheftet
ani ("T_PlunderItem_2_Stand" 1 "" 0.0 0.0 M. "Hum_Pluender_A01.asc" F 54 75)
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|
|