Portal-Zone Gothic-Zone Gothic II-Zone Gothic 3-Zone Gothic 4-Zone Modifikationen-Zone Download-Zone Foren-Zone RPG-Zone Almanach-Zone Spirit of Gothic

 

Seite 1 von 2 12 Letzte »
Ergebnis 1 bis 20 von 31
  1. Beiträge anzeigen #1 Zitieren
    Ritter Avatar von aebo
    Registriert seit
    Oct 2008
    Beiträge
    1.278
     
    aebo ist offline

    Proglem mit *eventTag

    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?

    /////////////// Seperate Bratanni FLEISCH///////////////

    ani ("t_FLEISCH_Sep" 1 "s_FLEISCH_S0" 0.1 0.0 M. "Hum_Stove_A01.asc" F 5 86)
    {
    *eventTag (6 "DEF_INSERT_ITEM" "ZS_RIGHTHAND" "ITMI_PAN")
    *eventTag (6 "DEF_CREATE_ITEM" "ZS_LEFTHAND" "ITFOMUTTONRAW")
    *eventTag (86 "DEF_DESTROY_ITEM")
    }
    Das Wappen
    -Eine fantastische Spielwelt erwartet dich-
    -bis zu 100 Stunden Spielzeit-

  2. Beiträge anzeigen #2 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline
    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.

  3. Beiträge anzeigen #3 Zitieren
    Ritter Avatar von aebo
    Registriert seit
    Oct 2008
    Beiträge
    1.278
     
    aebo ist offline
    Zitat Zitat von Cryp18Struct Beitrag anzeigen
    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?
    Das Wappen
    -Eine fantastische Spielwelt erwartet dich-
    -bis zu 100 Stunden Spielzeit-

  4. Beiträge anzeigen #4 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline
    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?

  5. Beiträge anzeigen #5 Zitieren
    Ritter Avatar von aebo
    Registriert seit
    Oct 2008
    Beiträge
    1.278
     
    aebo ist offline
    Zitat Zitat von Cryp18Struct Beitrag anzeigen
    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
    Das Wappen
    -Eine fantastische Spielwelt erwartet dich-
    -bis zu 100 Stunden Spielzeit-
    Geändert von aebo (10.05.2019 um 11:23 Uhr)

  6. Beiträge anzeigen #6 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline
    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.

  7. Beiträge anzeigen #7 Zitieren
    Ritter Avatar von aebo
    Registriert seit
    Oct 2008
    Beiträge
    1.278
     
    aebo ist offline
    Zitat Zitat von Cryp18Struct Beitrag anzeigen
    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.
    Das wäre super, bin gespannt
    Das Wappen
    -Eine fantastische Spielwelt erwartet dich-
    -bis zu 100 Stunden Spielzeit-

  8. Beiträge anzeigen #8 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline
    Okay, hier der post von Sektenspinner:
    https://forum.worldofplayers.de/foru...1#post20881281
    RemoveSlotItem/CreateSlotItem sind die Funktionen die ich meinte.

    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)

  9. Beiträge anzeigen #9 Zitieren
    Ritter Avatar von aebo
    Registriert seit
    Oct 2008
    Beiträge
    1.278
     
    aebo ist offline
    Zitat Zitat von Cryp18Struct Beitrag anzeigen
    Okay, hier der post von Sektenspinner:
    https://forum.worldofplayers.de/foru...1#post20881281
    RemoveSlotItem/CreateSlotItem sind die Funktionen die ich meinte.

    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?
    Das Wappen
    -Eine fantastische Spielwelt erwartet dich-
    -bis zu 100 Stunden Spielzeit-

  10. Beiträge anzeigen #10 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline
    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.

  11. Beiträge anzeigen #11 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.244
     
    Milky-Way ist offline
    Zitat Zitat von Cryp18Struct Beitrag anzeigen
    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?

  12. Beiträge anzeigen #12 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Zitat Zitat von Milky-Way Beitrag anzeigen
    Haben AI_Functions nicht automatisch den Npc als self, für den die Funktion in die AI-Kette geschrieben wurde?
    Nein, zumindest nicht verlässlich. Ein Blick in die Dokumentation hilft aber, wie immer (naja, meistens...).

  13. Beiträge anzeigen #13 Zitieren
    Ritter Avatar von aebo
    Registriert seit
    Oct 2008
    Beiträge
    1.278
     
    aebo ist offline
    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
    };
    Das Wappen
    -Eine fantastische Spielwelt erwartet dich-
    -bis zu 100 Stunden Spielzeit-

  14. Beiträge anzeigen #14 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline
    Zitat Zitat von aebo Beitrag anzeigen
    Code:
    //-------------------------------------------------------------------------------
    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
    };

  15. Beiträge anzeigen #15 Zitieren
    Ritter Avatar von aebo
    Registriert seit
    Oct 2008
    Beiträge
    1.278
     
    aebo ist offline
    Zitat Zitat von Cryp18Struct Beitrag anzeigen

    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
    };
    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:
    Code:
    cookItem_FleischOfen (MEM_InstToPtr(hero), ItMi_Pan);
    aufschreiben. Warum aber muss man dort nochmal eine Itemsinstance einbringen?
    Das Wappen
    -Eine fantastische Spielwelt erwartet dich-
    -bis zu 100 Stunden Spielzeit-
    Geändert von aebo (13.05.2019 um 13:03 Uhr)

  16. Beiträge anzeigen #16 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline
    Zitat Zitat von aebo Beitrag anzeigen
    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 Zitat von aebo Beitrag anzeigen
    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 Zitat von aebo Beitrag anzeigen
    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:
    Code:
    cookItem_FleischOfen (MEM_InstToPtr(hero), ItMi_Pan);
    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.

  17. Beiträge anzeigen #17 Zitieren
    Ritter Avatar von aebo
    Registriert seit
    Oct 2008
    Beiträge
    1.278
     
    aebo ist offline
    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 Wappen
    -Eine fantastische Spielwelt erwartet dich-
    -bis zu 100 Stunden Spielzeit-
    Geändert von aebo (13.05.2019 um 17:48 Uhr)

  18. Beiträge anzeigen #18 Zitieren
    Ritter Avatar von aebo
    Registriert seit
    Oct 2008
    Beiträge
    1.278
     
    aebo ist offline
    So, es ist nun alles zu meiner Zufriedenheit. Sieht klasse aus. Vielen Dank an Euch. Ihr seid wie immer die Besten
    Das Wappen
    -Eine fantastische Spielwelt erwartet dich-
    -bis zu 100 Stunden Spielzeit-

  19. Beiträge anzeigen #19 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline
    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.

  20. Beiträge anzeigen #20 Zitieren
    Ritter Avatar von aebo
    Registriert seit
    Oct 2008
    Beiträge
    1.278
     
    aebo ist offline
    Zitat Zitat von Cryp18Struct Beitrag anzeigen
    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
    Das Wappen
    -Eine fantastische Spielwelt erwartet dich-
    -bis zu 100 Stunden Spielzeit-

Seite 1 von 2 12 Letzte »

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
Impressum | Link Us | intern
World of Gothic © by World of Gothic Team
Gothic, Gothic 2 & Gothic 3 are © by Piranha Bytes & Egmont Interactive & JoWooD Productions AG, all rights reserved worldwide