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

 

Ergebnis 1 bis 16 von 16
  1. Homepage besuchen Beiträge anzeigen #1 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline

    Rüstungen ins Händlerinventar - möglich?

    Guten Abend,
    ist es möglich (mit LeGo/Ikarus) Rüstungen im Händlerinventar erscheinen zu lassen, und falls ja, wie? In Gothic 1 und 2 ist es ja so, dass man Rüstungen über den Dialog verkaufen muss. Nur finde ich das nicht so schön. Ich hab es auch schon so: https://forum.worldofplayers.de/foru...1#post22641091 probiert, aber das ist mMn. auch nicht die beste Lösung und es gibt damit auch einige Probleme.

  2. Beiträge anzeigen #2 Zitieren
    Veteran Avatar von Atariar
    Registriert seit
    May 2016
    Beiträge
    570
     
    Atariar ist offline
    Hallo Bloodfly,

    das dürfte auch ohne Ikarus und Lego funktionieren. Marcello hatte die Idee, Rüstungen in Form von Fake-Rüstungen (mit einem Gürtel-Flag) im Händlerinventar anzubieten.
    In der Loop_Funktion der ZS_Talk wird dann die Fake-Rüstung ausgetauscht.

    Code:
    func INT ZS_Talk_Loop ()
    {
        if (Hlp_GetInstanceID(other) == Hlp_GetInstanceID(hero))
        {
            
            if (Npc_HasItems (other, ITAR_VLK_M_FAKE) == 1) 
            {
                Npc_RemoveInvItems (hero, ITAR_VLK_M_FAKE, 1);
                CreateInvItems (hero, ITAR_VLK_M, 1);
            };
            if (Npc_HasItems (other, ITAR_VLK_H_FAKE) == 1) 
            {
                Npc_RemoveInvItems (hero, ITAR_VLK_H_FAKE, 1);
                CreateInvItems (hero, ITAR_VLK_H, 1);
            };
        };
    ...
    Vielleicht genügt diese Lösung deinen Anforderungen.
    Geändert von Atariar (29.01.2017 um 22:10 Uhr)

  3. Homepage besuchen Beiträge anzeigen #3 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Zitat Zitat von Atariar Beitrag anzeigen
    Hallo Bloodfly,

    das sollte auch ohne ohne Ikarus und Lego funktionieren. Marcello hatte die Idee, Rüstungen in Form von Fake-Rüstungen (mit einem Gürtel-Flag) im Händlerinventar anzubieten.
    In der Loop_Funktion der ZS_Talk wird dann die Fake-Rüstung ausgetauscht.

    Code:
    func INT ZS_Talk_Loop ()
    {
        if (Hlp_GetInstanceID(other) == Hlp_GetInstanceID(hero))
        {
            
            if (Npc_HasItems (other, ITAR_VLK_M_FAKE) == 1) 
            {
                Npc_RemoveInvItems (hero, ITAR_VLK_M_FAKE, 1);
                CreateInvItems (hero, ITAR_VLK_M, 1);
            };
            if (Npc_HasItems (other, ITAR_VLK_H_FAKE) == 1) 
            {
                Npc_RemoveInvItems (hero, ITAR_VLK_H_FAKE, 1);
                CreateInvItems (hero, ITAR_VLK_H, 1);
            };
        };
    ...
    Vielleicht genügt diese Lösung deinen Anforderungen.
    Danke. Ja, ich habe auch schon daran gedacht es so ähnlich zu machen. Aber das Problem ist dann, dass die Rüstung nicht wieder im Händlerinventar erscheint, wenn der Spieler sie wieder verkauft.

  4. Beiträge anzeigen #4 Zitieren
    Veteran Avatar von Atariar
    Registriert seit
    May 2016
    Beiträge
    570
     
    Atariar ist offline
    Vielleicht funktioniert das auch umgekehrt. Wenn der Hero die Rüstung verkauft, und dann im ZS_Talk_Loop wird abgefragt, ob der Händler die Rüstung besitzt und dann wieder durch die Fake_Armor ausgetauscht.

    Edit: Ich konnte das soweit erfolgreich testen, das einzige Problem dabei ist allerdings, dass der Händler diese Rüstung nicht sofort in seinem Handelsfenster hat. Er zeigt erst beim nächsten Aufruf des Händlerinventars die Rüstung an.
    Geändert von Atariar (29.01.2017 um 21:53 Uhr)

  5. Homepage besuchen Beiträge anzeigen #5 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Zitat Zitat von Atariar Beitrag anzeigen
    Vielleicht funktioniert das auch umgekehrt. Wenn der Hero die Rüstung verkauft, und dann im ZS_Talk_Loop wird abgefragt, ob der Händler die Rüstung besitzt und dann wieder durch die Fake_Armor ausgetauscht.

    Edit: Ich konnte das soweit erfolgreich testen, das einzige Problem dabei ist allerdings, dass der Händler diese Rüstung nicht sofort in seinem Handelsfenster hat. Er zeigt erst beim nächsten Aufruf des Händlerinventars die Rüstung an.
    Ok, dann werde ich mal versuchen das einzubauen. Danke

  6. Homepage besuchen Beiträge anzeigen #6 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Es funktioniert. Vielen Dank.

    Aber hat vielleicht noch jemand eine Idee wie man dem Händler sofort die Rüstung ins Inventar geben kann?

  7. Homepage besuchen Beiträge anzeigen #7 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Zitat Zitat von Bloodfly91 Beitrag anzeigen
    Es funktioniert. Vielen Dank.

    Aber hat vielleicht noch jemand eine Idee wie man dem Händler sofort die Rüstung ins Inventar geben kann?
    Ich hab heute beim testen gesehen, dass jetzt alle NPCs ihre Rüstung ablegen (bzw. wird sie gelöscht und die "Fake Rüstung" ins Inventar gegeben), wenn ich mit ihnen rede. Gibt es da nicht vielleicht doch auch eine Möglichkeit mit LeGo? Es muss doch irgendwie möglich sein, auch Items mit dem Mainflag "ITEM_KAT_ARMOR" im Händlerinventar sichtbar zu machen, oder? Wäre ja bestimmt auch leichter und schneller gemacht, als für alle Rüstungen (es gibt einige) ein Skript zu schreiben und die dann alle in die ZS_Talk einzutragen.

  8. Beiträge anzeigen #8 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    Zitat Zitat von Bloodfly91 Beitrag anzeigen
    Ich hab heute beim testen gesehen, dass jetzt alle NPCs ihre Rüstung ablegen (bzw. wird sie gelöscht und die "Fake Rüstung" ins Inventar gegeben), wenn ich mit ihnen rede. Gibt es da nicht vielleicht doch auch eine Möglichkeit mit LeGo? Es muss doch irgendwie möglich sein, auch Items mit dem Mainflag "ITEM_KAT_ARMOR" im Händlerinventar sichtbar zu machen, oder? Wäre ja bestimmt auch leichter und schneller gemacht, als für alle Rüstungen (es gibt einige) ein Skript zu schreiben und die dann alle in die ZS_Talk einzutragen.
    Dazu müsste man herausfinden, wo in der Engine die Rüstungen aus dem Handelsinventar entfernt werden und das irgendwie verhindern. Das kann man leider nicht mal so eben runterschreiben.

    Warum für alle Rüstungen? Du kannst ja auch einfach das komplette Inventar des Händlers durchgehen und dann auf das (von dir genannte) Mainflag testen

  9. Homepage besuchen Beiträge anzeigen #9 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    Dazu müsste man herausfinden, wo in der Engine die Rüstungen aus dem Handelsinventar entfernt werden und das irgendwie verhindern. Das kann man leider nicht mal so eben runterschreiben.
    Ah Okay, schade. Dachte eigentlich mit LeGo ist das ganz leicht, kenne mich aber auch nicht wirklich gut damit aus.

    Zitat Zitat von Lehona Beitrag anzeigen
    Warum für alle Rüstungen? Du kannst ja auch einfach das komplette Inventar des Händlers durchgehen und dann auf das (von dir genannte) Mainflag testen
    Das verstehe ich gerade irgendwie nicht. Müsste ich dann nicht trotzdem für jede Rüstung eine "Fake Rüstung" erstellen mit einem Mainflag (wie z.B. ITEM_KAT_NONE), der auch im Händlerinventar sichtbar ist?

  10. Beiträge anzeigen #10 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    Zitat Zitat von Bloodfly91 Beitrag anzeigen
    Ah Okay, schade. Dachte eigentlich mit LeGo ist das ganz leicht, kenne mich aber auch nicht wirklich gut damit aus.
    Interaktion mit der Engine ist leider selten "ganz leicht"
    Zitat Zitat von Bloodfly91 Beitrag anzeigen
    Das verstehe ich gerade irgendwie nicht. Müsste ich dann nicht trotzdem für jede Rüstung eine "Fake Rüstung" erstellen mit einem Mainflag (wie z.B. ITEM_KAT_NONE), der auch im Händlerinventar sichtbar ist?
    Daran hatte ich gar nicht gedacht, aber wenn man sich klug anstellt, sollte man das auch umgehen können. Man muss sich nur zu Nütze machen, dass dieses Austauschen nicht persistent sein muss (soll heißen: Während man handelt kann der Spieler nicht speichern). Dann erzeugt man einfach mehrere gleiche Fake-Rüstungen und passt Namen und Visual entsprechend an.

  11. Homepage besuchen Beiträge anzeigen #11 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Muss leider nochmal diesen Thread wiederbeleben, weil ich heute auf ein Problem gestoßen bin, das damit zu tun hat.

    Ich habe das Skript von weiter oben in den letzten Tagen mal noch etwas angepasst, weil es mich ziemlich gestört hat, dass die Rüstungen nicht sofort im Händlerinventar erschienen und andere NPCs, die eine Rüstung trugen, die im Skript stand, diese auch beim anquatschen ausgezogen haben.
    Also habe ich für jede Rüstung ein 'Fake-Item' erstellt, die das gleiche Visual, Namen etc. von den Rüstungen haben. Sobald der Spieler einen NPC anquatscht (also er sich in der ZS_Talk befindet), werden ALLE Rüstungen, die der Spieler im Inventar hat, durch die Fake-Rüstungen ersetzt. Sobald der Spieler den Dialog wieder beendet, werden die Fake-Rüstungen wieder durch richtige ausgetauscht.
    Das funktioniert(E) soweit auch problemlos, die Rüstung erscheint dadurch dass sie durch ein normales Item ersetzt wird sofort im Händlerinventar.

    Aber jetzt das Problem: Ich kriege es einfach nicht hin, dass die Rüstung, die der Held gerade trägt, nicht auch durch eine Fake-Rüstung ersetzt wird und somit auszieht, was auch ziemlich komisch wirken würde. Ich habe jetzt schon einiges probiert, aber nichts funktioniert.
    Hier mal das Skript, das die Rüstungen tauscht:

    Code:
    func void DIV_ChangeArmorToFakeArmor_Player()
    {
        var C_Item isArmorEquipped; isArmorEquipped = Npc_GetEquippedArmor(other);
        
        if (Hlp_GetInstanceID(other) == Hlp_GetInstanceID(hero))
        {
            // Hier muss JEDE Rüstung eingetragen und abgefragt werden!
            
            // --- Normale Landbewohnerkleidung ---
            if (Npc_HasItems (other, ITAR_DIV_Armor_Kleidung_01) > 0)    // Hat der Spieler mind. eine solche Rüstung?
            { 
                if (Hlp_IsItem (isArmorEquipped, ITAR_DIV_Armor_Kleidung_01))    // Hat der Spieler eine davon angelegt? Falls ja --> Alle durch Fake-Rüstungen ersetzen, bis auf die, die er trägt
                {
                    CreateInvItems (other, ITFA_DIV_Armor_Kleidung_01, Npc_HasItems(other, ITAR_DIV_Armor_Kleidung_01)-1);
                    Npc_RemoveInvItems (other, ITAR_DIV_Armor_Kleidung_01, Npc_HasItems(other, ITAR_DIV_Armor_Kleidung_01)-1);
                
                } else {
                
                    CreateInvItems (other, ITFA_DIV_Armor_Kleidung_01, Npc_HasItems(other, ITAR_DIV_Armor_Kleidung_01));
                    Npc_RemoveInvItems (other, ITAR_DIV_Armor_Kleidung_01, Npc_HasItems(other, ITAR_DIV_Armor_Kleidung_01));
                };
            };
        };
            Print("Nicht equippte Rüstungen des Helden wurden JETZT ausgetauscht!");
    };
    
    func void DIV_ChangeFakeArmorToArmor_Player()
    {
        if (Hlp_GetInstanceID(other) == Hlp_GetInstanceID(hero))
        {
            // Hier muss JEDE Rüstung eingetragen und abgefragt werden!
        
            // --- Normale Landbewohnerkleidung ---
            if (Npc_HasItems (other, ITFA_DIV_Armor_Kleidung_01) > 0) 
            {
                CreateInvItems (other, ITAR_DIV_Armor_Kleidung_01, Npc_HasItems(other, ITFA_DIV_Armor_Kleidung_01));
                Npc_RemoveInvItems (other, ITFA_DIV_Armor_Kleidung_01, Npc_HasItems(other, ITFA_DIV_Armor_Kleidung_01));
            };
        };
            Print("Alle Fake-Rüstungen des Helden wurden JETZT ausgetauscht!");
    };
    Die beiden Funktionen werden in der ZS_Talk aufgerufen.

    DIV_ChangeArmorToFakeArmor_Player(); --> ZS_Talk
    DIV_ChangeFakeArmorToArmor_Player(); --> ZS_Talk_End

    Das Problem ist dieser Teil:

    Code:
    CreateInvItems (other, ITFA_DIV_Armor_Kleidung_01,  Npc_HasItems(other, ITAR_DIV_Armor_Kleidung_01)-1);
    Npc_RemoveInvItems (other, ITAR_DIV_Armor_Kleidung_01,  Npc_HasItems(other, ITAR_DIV_Armor_Kleidung_01)-1);
    Das -1 funktioniert so natürlich nicht, weil eine der (z.B.) 3 Rüstungen, die ich davon im Inventar habe, ausgesucht und gelöscht wird, also oft auch die, die der Held gerade davon trägt.


    Wie mache ich das also, dass nicht auch die ersetzt/gelöscht wird, die der Spieler gerade trägt?

  12. Beiträge anzeigen #12 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.205
     
    Milky-Way ist offline
    Vielleicht Rüstung ablegen, alle 3 entfernen, eine hinzufügen und wieder anziehen lassen?

  13. Homepage besuchen Beiträge anzeigen #13 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Zitat Zitat von Milky-Way Beitrag anzeigen
    Vielleicht Rüstung ablegen, alle 3 entfernen, eine hinzufügen und wieder anziehen lassen?
    Danke, so scheint es tatsächlich zu funktionieren. Sieht zwar etwas komisch aus, wenn der Held kurz die Rüstung auszieht, sobald man einen NPC anquatscht, und dann schnell wieder anzieht, aber das ist ja nur für einen kurzen Moment und den meisten wird das vermutlich gar nicht auffallen.

    Vielleicht hat ja aber trotzdem noch jemand eine Idee, wie man es komplett unauffällig machen kann. ^^

  14. Homepage besuchen Beiträge anzeigen #14 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    So, leider gibt es doch noch ein kleines Problem.

    Weil ich es sehr unschön fand, dass der Held bei jedem NPC den er anquatscht die Rüstung auszieht, dachte ich mir, dass ich es einfach so machen könnte, dass dieser Befehl nur aufgerufen wird, wenn der Spieler mit einem NPC handelt.
    Also habe ich einfach den Befehl
    Code:
    DIV_ChangeArmorToFakeArmor_Player();
    in die
    Code:
    B_GiveTradeInv()
    Funktion ganz oben geschrieben und das funktioniert soweit auch ganz gut.
    Problem ist jetzt allerdings, dass der Held die Rüstung zwar auszieht, aber nicht sofort wieder anzieht, weil er z.B. noch einen Satz wie: "Zeig mir deine Ware!" sagt. Und danach zieht er sie dann erst wieder an.
    Lässt sich da noch irgendwas machen? Kann man vielleicht einfach irgendwie prüfen, ob der Spieler sich gerade in einem Handelsinventar befindet?

    So sieht das Skript im Moment aus:

    Code:
    func void DIV_ChangeArmorToFakeArmor_Player()
    {
        var C_Item isArmorEquipped; isArmorEquipped = Npc_GetEquippedArmor(hero);
            
        // Hier muss JEDE Rüstung, die der Spieler bekommen kann, eingetragen und abgefragt werden!
            
        // --- Sträflingskleidung ---
        if (Npc_HasItems (hero, ITAR_DIV_Armor_Prisoner) > 0)
        { 
            if (Hlp_IsItem (isArmorEquipped, ITAR_DIV_Armor_Prisoner)) 
            && (Npc_HasItems (hero, ITAR_DIV_Armor_Prisoner) < 2)
            {
                return;
                        
            } else if (Hlp_IsItem (isArmorEquipped, ITAR_DIV_Armor_Prisoner)) 
            && (Npc_HasItems (hero, ITAR_DIV_Armor_Prisoner) >= 2) {
    
                AI_UnequipArmor (hero);
                CreateInvItems (hero, ITFA_DIV_Armor_Prisoner, Npc_HasItems(hero, ITAR_DIV_Armor_Prisoner)-1);
                Npc_RemoveInvItems (hero, ITAR_DIV_Armor_Prisoner, Npc_HasItems(hero, ITAR_DIV_Armor_Prisoner)-1);
                AI_EquipArmor (hero, ITAR_DIV_Armor_Prisoner);
                
            } else if (!Hlp_IsItem (isArmorEquipped, ITAR_DIV_Armor_Prisoner)) {
                
                CreateInvItems (hero, ITFA_DIV_Armor_Prisoner, Npc_HasItems(hero, ITAR_DIV_Armor_Prisoner));
                Npc_RemoveInvItems (hero, ITAR_DIV_Armor_Prisoner, Npc_HasItems(hero, ITAR_DIV_Armor_Prisoner));
            };
        };
    };

  15. Beiträge anzeigen #15 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.205
     
    Milky-Way ist offline
    Mit LeGo kannst du die AI_Functions benutzen, um das entfernen der Rüstungen in die AI-Queue des Helden einzustellen.

  16. Homepage besuchen Beiträge anzeigen #16 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Zitat Zitat von Milky-Way Beitrag anzeigen
    Mit LeGo kannst du die AI_Functions benutzen, um das entfernen der Rüstungen in die AI-Queue des Helden einzustellen.
    Funktioniert perfekt, vielen Dank!
    Auch gut zu wissen, dass so etwas mit LeGo möglich ist. Diese AI_Functions werden mir denke ich auch noch bei vielen anderen Sachen helfen.

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