Moin, habe eine Seperate Bratanni für Fleisch am Herd erstellt. Die Animation funktioniert auch soweit einwandfrei. Leider werden aber die Pfanne und das Fleisch nicht angezeigt. Woran kann das liegen?
In welchem Kontext wird denn diese Animation abgespielt?
Weil wie eine mob Animation ist die ja nicht benannt mit dem Namen "t_FLEISCH_Sep". Und dementsprechend wird sie ja vermutlich nicht von der engine automatisch gestartet wenn man ein mob benutzt.
Ich denke das das Einfügen von items nur bei mob oder item benutzung richtig funktioniert.
In welchem Kontext wird denn diese Animation abgespielt?
Weil wie eine mob Animation ist die ja nicht benannt mit dem Namen "t_FLEISCH_Sep". Und dementsprechend wird sie ja vermutlich nicht von der engine automatisch gestartet wenn man ein mob benutzt.
Ich denke das das Einfügen von items nur bei mob oder item benutzung richtig funktioniert.
Ach verdammt, das ist ja doof..gibts da ne Lösung ohne auf die Mob Animation zu fixieren?
Man kann grundsätzlich auch skriptseitig slotitems erstellen. Aber vielleicht ist ein mob auch der richtige Weg bei dir.
Kannst du mal möglichst detailliert schildern was passieren soll?
Also wer macht die Animation/Wann/Wie soll das Aussehen?
Man kann grundsätzlich auch skriptseitig slotitems erstellen. Aber vielleicht ist ein mob auch der richtige Weg bei dir.
Kannst du mal möglichst detailliert schildern was passieren soll?
Also wer macht die Animation/Wann/Wie soll das Aussehen?
Ich habe die Option geschaffen am Herd neben Fleisch auch Fisch zu braten. Dafür habe ich die Human Animation am Herd so geändert, dass der Held erstmal nur vor dem Herd steht. Dann bekommt man die möglichkeit via Menü Fleisch oder Fisch zu braten. Je nachdem wofür man sich entscheidet, soll ein Fisch in die Pfanne oder eben ein Stück Fleisch in die Pfanne gelegt werden. Die Animation läuft auch sauber durch, aber die Items werden halt nicht angezeigt.
EDIT:
Habe jetzt mal die Datei in T_STOVE_FLEISCHSEP umbenannt. Leider auch kein Ergebnis
Es gibt (von Sektenspinner?) etwas was da hilfreich sein könnte. Konnte es mit Forumsuche gerade nicht finden. Wenn ich heute abend am PC bin kann ich dir da ein Beispiel geben.
Es gibt (von Sektenspinner?) etwas was da hilfreich sein könnte. Konnte es mit Forumsuche gerade nicht finden. Wenn ich heute abend am PC bin kann ich dir da ein Beispiel geben.
Verwendung in DirtySwamp kann man in dem video hier https://youtu.be/lP8CWnyt6EA?list=PL...lA-q17&t=21372
sehen bei timestamp 5:56:12. Da klaut ein Gegner dem toten hero ein Questitem und nimmt es in die Hand um damit zu posieren.
Intern besteht das daraus das die "sich-bücken-und-wurschteln-Animation" in 2 Animationen aufgeteilt wurde.
Es wird die erste Animation abgespielt, dann per Skript(und AI_Function aus Lego) das item in die Hand geklebt und dann die zweite Animation abgespielt.
Code:
humans.mds:
// 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)
Code:
func void plunderItem(var int npcPtr, var int itemInstance){
var c_npc npc;
npc = MEM_PtrToInst(npcPtr);
AI_PlayAni(npc, "T_STAND_2_PLUNDERITEM");
AI_Function_II(npc, createItemInNpcRightHand, npcPtr, itemInstance);
AI_PlayAni(npc, "T_PLUNDERITEM_2_STAND");
};
Mehr code und Hilfsfunktionen:
Spoiler:(zum lesen bitte Text markieren)
Code:
// von sektenspinner
// https://forum.worldofplayers.de/forum/threads/1246810-Angeln-per-Item?p=20881281&viewfull=1#post20881281
func void RemoveSlotItem(var C_NPC slf, var string slotName) {
const int oCNpc__RemoveFromSlot = 7643760; //0x74A270
CALL_IntParam(true); //kill effect
CALL_IntParam(false); //dont drop
CALL_zStringPtrParam(slotName);
CALL__thiscall(_@(slf), oCNpc__RemoveFromSlot);
};
func void CreateSlotItem(var C_NPC slf, var string slotName, var int inst) {
CreateInvItem(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);
};
// Dirty Swamp 2.13:
func void PutInvItemInSlot(var C_NPC slf, var string slotName, var int inst) {
Npc_RemoveInvItem(slf, inst);
CreateInvItem(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);
};
func void putItemInNpcRightHand(var int npcPtr, var int itemInstance){
var c_npc npcInst;
npcInst = MEM_PtrToInst(npcPtr);
PutInvItemInSlot(npcInst, "ZS_RIGHTHAND", itemInstance);
};
func void putItemInNpcLeftHand(var int npcPtr, var int itemInstance){
var c_npc npcInst;
npcInst = MEM_PtrToInst(npcPtr);
PutInvItemInSlot(npcInst, "ZS_LEFTHAND", itemInstance);
};
func void createItemInNpcRightHand(var int npcPtr, var int itemInstance){
var c_npc npcInst;
npcInst = MEM_PtrToInst(npcPtr);
CreateSlotItem(npcInst, "ZS_RIGHTHAND", itemInstance);
};
func void createItemInNpcLeftHand(var int npcPtr, var int itemInstance){
var c_npc npcInst;
npcInst = MEM_PtrToInst(npcPtr);
CreateSlotItem(npcInst, "ZS_LEFTHAND", itemInstance);
};
func void plunderItem(var int npcPtr, var int itemInstance){
var c_npc npc;
npc = MEM_PtrToInst(npcPtr);
AI_PlayAni(npc, "T_STAND_2_PLUNDERITEM");
AI_Function_II(npc, createItemInNpcRightHand, npcPtr, itemInstance);
AI_PlayAni(npc, "T_PLUNDERITEM_2_STAND");
};
Bei der Verwendung von solchen Funktionen sind 2 Dinge zu beachten:
- Soll das item erstellt werden oder aus dem Inventar genommen werden? Soll es am Ende im Inventar landen oder verschwinden?
- Wenn man nicht vorsichtig ist kann man damit schon vorhandene slotitems überschreiben. Beispiel: Falls ein NPC eine Waffe in der rechten Hand hat und man erstellt ein neues slotitem in "ZS_RIGHTHAND", dann verschwindet die Waffe.
Wenn man keine kontrollierten Bedingungen hat kann der Spieler teilweise komisches Zeug tun(Während der Benutzung eines mobs oder während eines Dialoges eine Waffe ziehen). Das sollte man dann beachten das da nichts kaputt geht.
Geändert von Cryp18Struct (10.05.2019 um 14:29 Uhr)
Verwendung in DirtySwamp kann man in dem video hier https://youtu.be/lP8CWnyt6EA?list=PL...lA-q17&t=21372
sehen bei timestamp 5:56:12. Da klaut ein Gegner dem toten hero ein Questitem und nimmt es in die Hand um damit zu posieren.
Intern besteht das daraus das die "sich-bücken-und-wurschteln-Animation" in 2 Animationen aufgeteilt wurde.
Es wird die erste Animation abgespielt, dann per Skript(und AI_Function aus Lego) das item in die Hand geklebt und dann die zweite Animation abgespielt.
Code:
humans.mds:
// 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)
Code:
func void plunderItem(var int npcPtr, var int itemInstance){
var c_npc npc;
npc = MEM_PtrToInst(npcPtr);
AI_PlayAni(npc, "T_STAND_2_PLUNDERITEM");
AI_Function_II(npc, createItemInNpcRightHand, npcPtr, itemInstance);
AI_PlayAni(npc, "T_PLUNDERITEM_2_STAND");
};
Mehr code und Hilfsfunktionen:
Spoiler:(zum lesen bitte Text markieren)
Code:
// von sektenspinner
// https://forum.worldofplayers.de/forum/threads/1246810-Angeln-per-Item?p=20881281&viewfull=1#post20881281
func void RemoveSlotItem(var C_NPC slf, var string slotName) {
const int oCNpc__RemoveFromSlot = 7643760; //0x74A270
CALL_IntParam(true); //kill effect
CALL_IntParam(false); //dont drop
CALL_zStringPtrParam(slotName);
CALL__thiscall(_@(slf), oCNpc__RemoveFromSlot);
};
func void CreateSlotItem(var C_NPC slf, var string slotName, var int inst) {
CreateInvItem(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);
};
// Dirty Swamp 2.13:
func void PutInvItemInSlot(var C_NPC slf, var string slotName, var int inst) {
Npc_RemoveInvItem(slf, inst);
CreateInvItem(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);
};
func void putItemInNpcRightHand(var int npcPtr, var int itemInstance){
var c_npc npcInst;
npcInst = MEM_PtrToInst(npcPtr);
PutInvItemInSlot(npcInst, "ZS_RIGHTHAND", itemInstance);
};
func void putItemInNpcLeftHand(var int npcPtr, var int itemInstance){
var c_npc npcInst;
npcInst = MEM_PtrToInst(npcPtr);
PutInvItemInSlot(npcInst, "ZS_LEFTHAND", itemInstance);
};
func void createItemInNpcRightHand(var int npcPtr, var int itemInstance){
var c_npc npcInst;
npcInst = MEM_PtrToInst(npcPtr);
CreateSlotItem(npcInst, "ZS_RIGHTHAND", itemInstance);
};
func void createItemInNpcLeftHand(var int npcPtr, var int itemInstance){
var c_npc npcInst;
npcInst = MEM_PtrToInst(npcPtr);
CreateSlotItem(npcInst, "ZS_LEFTHAND", itemInstance);
};
func void plunderItem(var int npcPtr, var int itemInstance){
var c_npc npc;
npc = MEM_PtrToInst(npcPtr);
AI_PlayAni(npc, "T_STAND_2_PLUNDERITEM");
AI_Function_II(npc, createItemInNpcRightHand, npcPtr, itemInstance);
AI_PlayAni(npc, "T_PLUNDERITEM_2_STAND");
};
Bei der Verwendung von solchen Funktionen sind 2 Dinge zu beachten:
- Soll das item erstellt werden oder aus dem Inventar genommen werden? Soll es am Ende im Inventar landen oder verschwinden?
- Wenn man nicht vorsichtig ist kann man damit schon vorhandene slotitems überschreiben. Beispiel: Falls ein NPC eine Waffe in der rechten Hand hat und man erstellt ein neues slotitem in "ZS_RIGHTHAND", dann verschwindet die Waffe.
Wenn man keine kontrollierten Bedingungen hat kann der Spieler teilweise komisches Zeug tun(Während der Benutzung eines mobs oder während eines Dialoges eine Waffe ziehen). Das sollte man dann beachten das da nichts kaputt geht.
So, habe mich jetzt mal damit auseinandergesetzt.
Nochmal zum Ablauf:
Ich benutze den Herd.
Der Held steht nun erstmal nur vor dem Herd ohne bratani auzuführen.
Das Auswahlmenü erscheint.
Durch die Funktion PutinSlot kann ich nun die gewählte Zutat in der Hand erscheinen lassen. Parallel wird die eigentliche bratani ausgeführt.
Nach der bratani erscheint wieder das Auswahlmenü. Wie bekomme ich dann das Item wieder aus der Hand?
Zum entfernen des items kannst du dann RemoveSlotItem benutzten. Beziehungsweise wenn du das mit AI_Function nach der Animation machen lassen willst könntest du dir eine Funktion mit minimal anderen Parametern bauen, c_npc referenzen bekommt man irgendwie schlecht übergeben an AI_Function(deshalb der etwas komische Umweg mit pointern in putItemInNpcRightHand, weil man dann 2 integer übergibt und AI_Function_II nutzen kann).
Ungetestet aber prinzipell die richtige Richtung:
Code:
func void removeItemInNpcRightHand(var int npcPtr){
var c_npc npcInst;
npcInst = MEM_PtrToInst(npcPtr);
RemoveSlotItem(npcInst, "ZS_RIGHTHAND");
};
func void removeItemInNpcLeftHand(var int npcPtr){
var c_npc npcInst;
npcInst = MEM_PtrToInst(npcPtr);
RemoveSlotItem(npcInst, "ZS_LEFTHAND");
};
func void cookItem(var int npcPtr, var int itemInstance){
var c_npc npc;
npc = MEM_PtrToInst(npcPtr);
AI_PlayAni(npc, "BratAniErsterTeil"); // evt auch nicht, falls die bei mob Benutzung abgespielte Ani schon richtig passt
AI_Function_II(npc, createItemInNpcRightHand, npcPtr, itemInstance);
AI_PlayAni(npc, "BratAniZweiterTeil");
AI_Function_I(npc, removeItemInNpcRightHand, npcPtr); // bevor das hier gemacht wird wäre es evt. sinnvoll nachzuschauen das der hero keine Waffe gezückt hat falls das nicht unmöglich ist in der Situation
};
Wäre auch immer hilfreich wenn du deinen code postest.
Zum entfernen des items kannst du dann RemoveSlotItem benutzten. Beziehungsweise wenn du das mit AI_Function nach der Animation machen lassen willst könntest du dir eine Funktion mit minimal anderen Parametern bauen, c_npc referenzen bekommt man irgendwie schlecht übergeben an AI_Function(deshalb der etwas komische Umweg mit pointern in putItemInNpcRightHand, weil man dann 2 integer übergibt und AI_Function_II nutzen kann).
Ungetestet aber prinzipell die richtige Richtung:
Code:
func void removeItemInNpcRightHand(var int npcPtr){
var c_npc npcInst;
npcInst = MEM_PtrToInst(npcPtr);
RemoveSlotItem(npcInst, "ZS_RIGHTHAND");
};
func void removeItemInNpcLeftHand(var int npcPtr){
var c_npc npcInst;
npcInst = MEM_PtrToInst(npcPtr);
RemoveSlotItem(npcInst, "ZS_LEFTHAND");
};
func void cookItem(var int npcPtr, var int itemInstance){
var c_npc npc;
npc = MEM_PtrToInst(npcPtr);
AI_PlayAni(npc, "BratAniErsterTeil"); // evt auch nicht, falls die bei mob Benutzung abgespielte Ani schon richtig passt
AI_Function_II(npc, createItemInNpcRightHand, npcPtr, itemInstance);
AI_PlayAni(npc, "BratAniZweiterTeil");
AI_Function_I(npc, removeItemInNpcRightHand, npcPtr); // bevor das hier gemacht wird wäre es evt. sinnvoll nachzuschauen das der hero keine Waffe gezückt hat falls das nicht unmöglich ist in der Situation
};
Wäre auch immer hilfreich wenn du deinen code postest.
Haben AI_Functions nicht automatisch den Npc als self, für den die Funktion in die AI-Kette geschrieben wurde?
Hab das jetzt mal so eingebaut, leider legt er nach wie vor das Item nicht in die Hand.
Code:
//------------------------------------------------------------------------------
func void RemoveSlotItem(var C_NPC slf, var string slotName)
{
const int oCNpc__RemoveFromSlot = 7643760; //0x74A270
CALL_IntParam(true); //kill effect
CALL_IntParam(false); //dont drop
CALL_zStringPtrParam(slotName);
CALL__thiscall(_@(slf), oCNpc__RemoveFromSlot);
};
//------------------------------------------------------------------------------
func void CreateSlotItem(var C_NPC slf, var string slotName, var int inst)
{
CreateInvItem(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);
};
//-------------------------------------------------------------------------------
func void createItemInNpcRightHand(var int npcPtr, var int itemInstance)
{
var c_npc npcInst;
npcInst = MEM_PtrToInst(npcPtr);
CreateSlotItem(npcInst, "ZS_RIGHTHAND", itemInstance);
};
func void createItemInNpcLeftHand(var int npcPtr, var int itemInstance)
{
var c_npc npcInst;
npcInst = MEM_PtrToInst(npcPtr);
CreateSlotItem(npcInst, "ZS_LEFTHAND", itemInstance);
};
func void removeItemInNpcRightHand(var int npcPtr)
{
var c_npc npcInst;
npcInst = MEM_PtrToInst(npcPtr);
RemoveSlotItem(npcInst, "ZS_RIGHTHAND");
};
func void removeItemInNpcLeftHand(var int npcPtr)
{
var c_npc npcInst;
npcInst = MEM_PtrToInst(npcPtr);
RemoveSlotItem(npcInst, "ZS_LEFTHAND");
};
//-------------------------------------------------------------------------------
func void cookItem_Fleisch (var int npcPtr, var int itemInstance)
{
var c_npc npc;
npc = MEM_PtrToInst(npcPtr);
// AI_PlayAni(npc, "BratAniErsterTeil"); // evt auch nicht, falls die bei mob Benutzung abgespielte Ani schon richtig passt
AI_Function_II(npc, createItemInNpcRightHand, npcPtr, ItMi_PanFull);
AI_PlayAni(npc, "T_STOVE_FLEISCHSEP");
AI_Function_I(npc, removeItemInNpcRightHand, npcPtr); // bevor das hier gemacht wird wäre es evt. sinnvoll nachzuschauen das der hero keine Waffe gezückt hat falls das nicht unmöglich ist in der Situation
};
Und hier der Teil aus dem OnState vom Ofen
Code:
func void PC_Fleichbraten_Fleisch()
{
cookItem_Fleisch(hero, ItMi_PanFull); //Hier die volle Fleischpfanne in die Hand legen und nach Ani wieder entfernen
AI_PrintScreen ("Fleisch gebraten", -1, 41, FONT_ScreenSmall, 2);
Snd_Play ("PAN_FRYING");
CreateInvItems (hero, ItFoMutton, 1); // Fleichbraten ins Inventar
Npc_RemoveInvItems (hero, ItFoMuttonRaw , 1); // Zutaten wegnehmen
};
//-------------------------------------------------------------------------------
func void cookItem_Fleisch (var int npcPtr, var int itemInstance)
{
var c_npc npc;
npc = MEM_PtrToInst(npcPtr);
// AI_PlayAni(npc, "BratAniErsterTeil"); // evt auch nicht, falls die bei mob Benutzung abgespielte Ani schon richtig passt
AI_Function_II(npc, createItemInNpcRightHand, npcPtr, ItMi_PanFull);
AI_PlayAni(npc, "T_STOVE_FLEISCHSEP");
AI_Function_I(npc, removeItemInNpcRightHand, npcPtr); // bevor das hier gemacht wird wäre es evt. sinnvoll nachzuschauen das der hero keine Waffe gezückt hat falls das nicht unmöglich ist in der Situation
};
Und hier der Teil aus dem OnState vom Ofen
Code:
func void PC_Fleichbraten_Fleisch()
{
cookItem_Fleisch(hero, ItMi_PanFull); //Hier die volle Fleischpfanne in die Hand legen und nach Ani wieder entfernen
AI_PrintScreen ("Fleisch gebraten", -1, 41, FONT_ScreenSmall, 2);
Snd_Play ("PAN_FRYING");
CreateInvItems (hero, ItFoMutton, 1); // Fleichbraten ins Inventar
Npc_RemoveInvItems (hero, ItFoMuttonRaw , 1); // Zutaten wegnehmen
};
An der gelb markierten Stelle übergibst du eine c_npc referenz, die Funktion erwartet aber einen pointer. Wenn dir das mit pointer zu doof ist könnte man auch die Funktion cookItem verändern (siehe Lehona post) aber das muss zusammen passen.
Hier (rot markiert) sagst du ja jetzt im Endeffekt das die Pfanne in die rechte Hand soll (und das item was gebraten werden soll wird nie als slotitem erstellt[weil du ein item mit der vollen Pfanne hast?]).
Auch verwendest du nun gar nicht den Parameter "itemInstance". Meine Idee war das man als "itemInstance" eine item ID übergibt(ItFoMutton zum Beispiel).
Wenn du auch die Pfanne skriptseitig erstellen willst kannst die die zusätzlich in die linke Hand geben(oder vielleicht auch Pfanne in die rechte und Grillitem in die linke, ich weiß ja nicht wie die Animation aussieht.) Dann sparst du dir die ganzen gefüllten Pfannenitems.
Ich verweise hier mal auf einen post von Ska-Ara: https://forum.worldofplayers.de/foru...1#post25654043
Das hat mit diesem Thema nichts zu tun, ist meiner Meinung nach aber ein Beispiel für einen post wo es einem leicht fällt zu helfen. Da ist alles dabei was man braucht um den Kram bei sich einzubauen und ingame dran rumspielen zu können. Ist immer einfacher als nur forenposts zu lesen.
Paar mehr Ideen:
Code:
// Kann mit beliebigen items als Parameter aufgerufen werden Beispiel: cookItem(MEM_InstToPtr(hero), ItFoMuttonRaw);
func void cookItem(var int npcPtr, var int itemInstance)
{
var c_npc npc;
npc = MEM_PtrToInst(npcPtr);
// AI_PlayAni(npc, "BratAniErsterTeil"); // evt auch nicht, falls die bei mob Benutzung abgespielte Ani schon richtig passt
AI_Function_II(npc, createItemInNpcRightHand, npcPtr, ItMi_PanFull); // leere Pfanne in die rechte Hand
AI_Function_II(npc, createItemInNpcLeftHand, npcPtr, itemInstance); // itemtyp der als Parameter an die Funktion übergeben wurde in die linke Hand
AI_PlayAni(npc, "T_STOVE_FLEISCHSEP");
// bevor das hier gemacht wird wäre es evt. sinnvoll nachzuschauen das der hero keine Waffe gezückt hat (falls das nicht unmöglich ist in der Situation).
// oder ganz allgemein schauen was für items der hero in den Händen hält damit nichts falsches gelöscht wird falls der Spieler irgendwelchen Unfug macht
AI_Function_I(npc, removeItemInNpcRightHand, npcPtr);
AI_Function_I(npc, removeItemInNpcLeftHand, npcPtr);
// Durchaus möglich das die Pfanne und das andere item ins Inventar zurückgelegt werden. Ist wahrscheinlich nicht erwünscht und muss dann noch behandelt werden.
};
Code:
func void PC_Fleichbraten_Fleisch()
{
cookItem(MEM_InstToPtr(hero), ItFoMuttonRaw); //Hier die Pfanne in eine Hand und das Grillgut in die andere Hand, ani abspielen und alles entfernen
AI_PrintScreen ("Fleisch gebraten", -1, 41, FONT_ScreenSmall, 2);
Snd_Play ("PAN_FRYING");
// hier bin ich mir gerade nicht sicher ob notwendig, falls ja, wäre es evt. in cookItem() besser aufgehoben weil man sich da dann direkt auch um die Pfanne kümmern kann
CreateInvItems (hero, ItFoMutton, 1); // Fleichbraten ins Inventar
Npc_RemoveInvItems (hero, ItFoMuttonRaw , 1); // Zutaten wegnehmen
};
// Kann mit beliebigen items als Parameter aufgerufen werden Beispiel: cookItem(MEM_InstToPtr(hero), ItFoMuttonRaw);
func void cookItem(var int npcPtr, var int itemInstance)
{
var c_npc npc;
npc = MEM_PtrToInst(npcPtr);
// AI_PlayAni(npc, "BratAniErsterTeil"); // evt auch nicht, falls die bei mob Benutzung abgespielte Ani schon richtig passt
AI_Function_II(npc, createItemInNpcRightHand, npcPtr, ItMi_PanFull); // leere Pfanne in die rechte Hand
AI_Function_II(npc, createItemInNpcLeftHand, npcPtr, itemInstance); // itemtyp der als Parameter an die Funktion übergeben wurde in die linke Hand
AI_PlayAni(npc, "T_STOVE_FLEISCHSEP");
// bevor das hier gemacht wird wäre es evt. sinnvoll nachzuschauen das der hero keine Waffe gezückt hat (falls das nicht unmöglich ist in der Situation).
// oder ganz allgemein schauen was für items der hero in den Händen hält damit nichts falsches gelöscht wird falls der Spieler irgendwelchen Unfug macht
AI_Function_I(npc, removeItemInNpcRightHand, npcPtr);
AI_Function_I(npc, removeItemInNpcLeftHand, npcPtr);
// Durchaus möglich das die Pfanne und das andere item ins Inventar zurückgelegt werden. Ist wahrscheinlich nicht erwünscht und muss dann noch behandelt werden.
};
Code:
func void PC_Fleichbraten_Fleisch()
{
cookItem(MEM_InstToPtr(hero), ItFoMuttonRaw); //Hier die Pfanne in eine Hand und das Grillgut in die andere Hand, ani abspielen und alles entfernen
AI_PrintScreen ("Fleisch gebraten", -1, 41, FONT_ScreenSmall, 2);
Snd_Play ("PAN_FRYING");
// hier bin ich mir gerade nicht sicher ob notwendig, falls ja, wäre es evt. in cookItem() besser aufgehoben weil man sich da dann direkt auch um die Pfanne kümmern kann
CreateInvItems (hero, ItFoMutton, 1); // Fleichbraten ins Inventar
Npc_RemoveInvItems (hero, ItFoMuttonRaw , 1); // Zutaten wegnehmen
};
Okay, soweit so gut. Es funktioniert zwar aber es sind noch ein paar sachen die mich stören.
1. Die Eingefügten Items werden ja erneut im spiel erschaffen. Besser wäre einfach nur das einfügen der Items aus dem Inventar damit man nicht jedes mal neue Items erstellt.
2. Außerdem sind die eingefügten Items genau 180° verdreht. Woran kann das liegen?
3. Dann noch eine Frage:
Code:
func void cookItem_FleischOfen (var int npcPtr, var int itemInstance)
{
var c_npc npc;
npc = MEM_PtrToInst(npcPtr);
// AI_PlayAni(npc, "BratAniErsterTeil"); // evt auch nicht, falls die bei mob Benutzung abgespielte Ani schon richtig passt
AI_Function_II(npc, createItemInNpcRightHand, npcPtr, ItMi_Pan); // leere Pfanne in die rechte Hand
AI_Function_II(npc, createItemInNpcLeftHand, npcPtr, ItFoMuttonRaw); // itemtyp der als Parameter an die Funktion übergeben wurde in die linke Hand
AI_PlayAni(npc, "T_STOVE_FLEISCHSEP"); // die Animation vom eigentlichen braten
// bevor das hier gemacht wird wäre es evt. sinnvoll nachzuschauen das der hero keine Waffe gezückt hat (falls das nicht unmöglich ist in der Situation).
// oder ganz allgemein schauen was für items der hero in den Händen hält damit nichts falsches gelöscht wird falls der Spieler irgendwelchen Unfug macht
AI_Function_I(npc, removeItemInNpcRightHand, npcPtr);
AI_Function_I(npc, removeItemInNpcLeftHand, npcPtr);
// Durchaus möglich das die Pfanne und das andere item ins Inventar zurückgelegt werden. Ist wahrscheinlich nicht erwünscht und muss dann noch behandelt werden.
};
man fügt mit dieser Funktion ja die Pfanne und das Fleisch ein aber trotzdem muss man diese Funktion ja so:
1. Die Eingefügten Items werden ja erneut im spiel erschaffen. Besser wäre einfach nur das einfügen der Items aus dem Inventar damit man nicht jedes mal neue Items erstellt.
Da könntest du PutInvItemInSlot nehmen statt CreateSlotItem. (PutInvItemInSlot hatte ich weiter oben irgendwo gepostet, die Funktion prüft allerdings nicht ob der NPC die items überhaupt im inventar hat, solltest du also extern machen).
Zitat von aebo
2. Außerdem sind die eingefügten Items genau 180° verdreht. Woran kann das liegen?
okay, das ist dann eher doof. Scheint so als würde das skriptseitige erstellen anders behandelt werden als das automatische erstellen der engine wenn man ein mob benutzt.
Eine mögliche Lösung wäre die Animation zu verändern so das die Helferobjekte der slotitems einfach anders rotiert sind. Das sollte in blender recht einfach gehen (Falls du all deinen kram hochlädst so das ich das bei mir einbauen kann könnte ich das auch übernehmen).
Eine andere Möglichkeit wäre skriptseitig das item zu rotieren(falls das möglich ist und nicht einfach im nächsten frame der Animation zurückgesetzt wird). Da kann ich dir auf die schnelle aber keinen code für anbieten.
Die schlechteste und aufwändigste Lösung wäre die item meshes anders zu rotieren, aber das führt dann wahrscheinlich an anderen Stellen zu Folgefehlern.
Zitat von aebo
3. Dann noch eine Frage:
Code:
func void cookItem_FleischOfen (var int npcPtr, var int itemInstance)
{
var c_npc npc;
npc = MEM_PtrToInst(npcPtr);
// AI_PlayAni(npc, "BratAniErsterTeil"); // evt auch nicht, falls die bei mob Benutzung abgespielte Ani schon richtig passt
AI_Function_II(npc, createItemInNpcRightHand, npcPtr, ItMi_Pan); // leere Pfanne in die rechte Hand
AI_Function_II(npc, createItemInNpcLeftHand, npcPtr, ItFoMuttonRaw); // itemtyp der als Parameter an die Funktion übergeben wurde in die linke Hand
AI_PlayAni(npc, "T_STOVE_FLEISCHSEP"); // die Animation vom eigentlichen braten
// bevor das hier gemacht wird wäre es evt. sinnvoll nachzuschauen das der hero keine Waffe gezückt hat (falls das nicht unmöglich ist in der Situation).
// oder ganz allgemein schauen was für items der hero in den Händen hält damit nichts falsches gelöscht wird falls der Spieler irgendwelchen Unfug macht
AI_Function_I(npc, removeItemInNpcRightHand, npcPtr);
AI_Function_I(npc, removeItemInNpcLeftHand, npcPtr);
// Durchaus möglich das die Pfanne und das andere item ins Inventar zurückgelegt werden. Ist wahrscheinlich nicht erwünscht und muss dann noch behandelt werden.
};
man fügt mit dieser Funktion ja die Pfanne und das Fleisch ein aber trotzdem muss man diese Funktion ja so:
aufschreiben. Warum aber muss man dort nochmal eine Itemsinstance einbringen?
Ich glaube wir reden ein Stück weit aneinander vorbei. Oder dir ist nicht ganz klar wie ein Funktionsparameter funktioniert.
Du könntest dir für jeden itemtyp eine eigene Funktion schreiben. Also eine cookItem_FleischOfen() eine cookItem_FischOfen() und wenn du später noch ein anderes Item haben willst eine cookItem_WasAuchImmerOfen().
Das ist dann halt viel Aufwand und du hättest vielen code doppelt.
Was ich vorhatte war eine einzige Funktion cookItem() wo man einen Parameter übergibt welches item in der Pfanne landen soll. Ganz egal wie viele verschiedene items du in die Pfanne packen willst, du brauchst dann nur genau eine Funktion(welche eben allgemein gehalten ist).
Code:
func void cookItem(var int npcPtr, var int itemInstanceParameter)
{
var c_npc npc;
npc = MEM_PtrToInst(npcPtr);
// AI_PlayAni(npc, "BratAniErsterTeil"); // evt auch nicht, falls die bei mob Benutzung abgespielte Ani schon richtig passt
// Achtung: PutInvItemInSlot prüft nicht ob der NPC die items überhaupt im Inventar hat. Sollte also extern geprüft werden(wahrscheinlich in der condition des Dialoges?)
AI_Function_II(npc, PutInvItemInSlot, npcPtr, ItMi_Pan); // leere Pfanne in die rechte Hand
AI_Function_II(npc, PutInvItemInSlot, npcPtr, itemInstanceParameter); // itemtyp der als Parameter an die Funktion übergeben wurde in die linke Hand
AI_PlayAni(npc, "T_STOVE_FLEISCHSEP"); // die Animation vom eigentlichen braten
// bevor das hier gemacht wird wäre es evt. sinnvoll nachzuschauen das der hero keine Waffe gezückt hat (falls das nicht unmöglich ist in der Situation).
// oder ganz allgemein schauen was für items der hero in den Händen hält damit nichts falsches gelöscht wird falls der Spieler irgendwelchen Unfug macht
AI_Function_I(npc, removeItemInNpcRightHand, npcPtr);
AI_Function_I(npc, removeItemInNpcLeftHand, npcPtr);
// Du könntest das "umwandeln" der items auch direkt in diese Funktion packen(statt in die Dialogfunktion):
//if(itemInstanceParameter == ItFoMuttonRaw){
// CreateInvItems (hero, ItFoMutton, 1); // Aus rohem Fleisch wird gebratenes Fleisch
//}else if(itemInstanceParameter == ItFo_Fish){
// CreateInvItems (hero, ItFo_FishGebraten, 1);// Aus rohem Fisch wird gebratener Fisch (ItFo_FishGebraten ist ein Platzhalter, ich weis ja nicht wie deine gebratene Fisch Instanz heisst)
//}else{ // sollte nie passieren
// print(ConcatStrings("Fehler beim Bratumwandeln: keine Reaktion definiert für", IntToString(itemInstance)));
// return; // Aus der Funktion springen weil das entfernen der Zutat bisschen doof wäre wenn fehlerhafterweise hier nicht definiert ist was passieren soll
//};
// Verbrauchte Zutat entfernen(wäre wahrscheinlich falsch so, müsste noch per AI_Function eingereiht werden in die AI-Queue von hero denke ich):
//Npc_RemoveInvItems (hero, itemInstanceParameter , 1);
};
Deine mob Dialogfunktionen könnten dann einfach so aussehen:
Code:
func void PC_Fleichbraten_Fleisch()
{
cookItem(MEM_InstToPtr(hero), ItFoMuttonRaw); // rohes Fleisch in die eine Hand, Pfanne in die andere
AI_PrintScreen ("Fleisch gebraten", -1, 41, FONT_ScreenSmall, 2);
Snd_Play ("PAN_FRYING");
};
func void PC_FischBraten()
{
cookItem(MEM_InstToPtr(hero), ItFo_Fish); // Fisch in eine Hand, Pfanne in die andere
AI_PrintScreen ("Fisch gebraten", -1, 41, FONT_ScreenSmall, 2);
Snd_Play ("PAN_FRYING");
};
Hier ist immer noch ein bisschen code doppelt. Sowohl in PC_Fleichbraten_Fleisch() als auch in PC_FischBraten() wird der gleiche sound abgespielt. Falls du weisst das du immer den gleichen sound haben willst ganz egal was gebraten wird(Fleisch, Fisch, ...) dann könntest du das abspielen des sounds auch noch in die Funktion cookItem() packen statt es zweimal in diesen Funktionen stehen zu haben.
Die Duplizierung von code zu verringern ist langfristig hilfreich wenn du später mal irgendwas ändern möchtest. Weil du dann nur an einer zentralen Stelle Veränderungen vornehmen musst und nicht an X verschiedenen Stellen.
Ich glaube tatsächlich das es am einfachsten ist die Items in den Händen zu drehen. Wie du schon ganz richtig sagtest ist es an anderer Stelle bestimmt äußert haarig die Items als solche zu drehen.
Das mit dem Drehen der Items in der Animation sollte ich hinbekommen.
Das ist schön! Probier bitte mal aus ob du was kaputt machen kannst wenn du während des Kochens eine Waffe ziehst, ich kann mir schon vorstellen das das ein Problem sein könnte mit dem manipulieren der slotitems.
Das ist schön! Probier bitte mal aus ob du was kaputt machen kannst wenn du während des Kochens eine Waffe ziehst, ich kann mir schon vorstellen das das ein Problem sein könnte mit dem manipulieren der slotitems.
Nein, das ist nicht möglich. Durch das abspielen der Animation blockiert das Spiel alle anderen Funktionen. Auch ESC funktioniert nicht.
Ich hatte aber auch erst Angst, dass das rumbuggen könnte