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 4 von 4
  1. Homepage besuchen Beiträge anzeigen #1 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline

    Held legt Item mit 'EquipItem' nicht immer an

    Nachdem das letzte Problem gelöst werden konnte, kommt hier gleich das nächste.

    Es geht darum, dass der Held nicht immer das im Skript mit 'EquipItem' angegebene Item anlegt, es aber trotzdem ins Inventar bekommt.
    Aber erst mal zu dem, was ich überhaupt vorhabe: Ich möchte ein neues Pfeilsystem einbauen, das es ermöglicht, im Inventar verschiedene Pfeile/Bolzen anzulegen und diese dann mit einem Bogen/einer Armbrust abzuschießen.
    Soweit funktioniert das auch schon ganz gut, allerdings gibt es das Problem, dass der Held immer, wenn er nur noch einen Pfeil von dem angelegten Pfeil im Inventar hat, diesen ablegt, sobald man den Bogen wieder wegsteckt, man aber trotzdem noch damit schießen kann.
    Den Grund dafür habe ich schon herausgefunden: Es liegt daran, dass der Held diesen letzten Pfeil ja in die Hand nimmt, also nicht mehr im Inventar hat, wenn man den Bogen zieht. Deshalb wird er dann auch einfach wieder ins Inventar gelegt, wenn man ihn nicht verschießt und den Bogen wieder wegsteckt. Dann ist er natürlich auch nicht mehr angelegt.
    Jetzt habe ich schon mehreres probiert, um diesen "Schönheitsfehler" zu beheben. Aber bis jetzt konnte ich noch keine Lösung finden, die auch funkioniert.
    Die einzige, die teilweise funktioniert, ist, dass der Held sobald er den Bogen zieht eine Variable auf TRUE gesetzt wird und dann, wenn diese Variable auf TRUE ist und der Held den Bogen wieder wegsteckt diese wieder auf FALSE gesetzt wird und er durch EquipItem einen neuen Pfeil angelegt bekommen soll. Der andere, den er dann wieder wegsteckt, wird einfach per Npc_RemoveInvItem entfernt.

    Das Skript sieht so aus:

    Code:
    var int Arrowbugfixalreadydone;
    
    func void DIV_SwitchBowCrossbowMunition()
    {
        var C_Item GetEquippedRangedWeapon;
    
        if (Npc_IsInFightMode(hero, FMODE_FAR))
        {
            if (Arrowbugfixalreadydone == FALSE)
            {
                Arrowbugfixalreadydone = TRUE;
            };
            
            GetEquippedRangedWeapon = Npc_GetReadiedWeapon(hero);
        }
        else if (Npc_HasEquippedRangedWeapon (hero))
        {
            if (Arrowbugfixalreadydone == TRUE)
            {
                FF_ApplyExt(GiveHeroArrowBugfix, 1000, 1);
                
                Arrowbugfixalreadydone = FALSE;
            };
            
            GetEquippedRangedWeapon = Npc_GetEquippedRangedWeapon(hero);
        }
        else //weder gezogenen noch equippten Bogen
        {
            return;
        };
            
        if (SharpArrow == TRUE) 
        {
            GetEquippedRangedWeapon.munition = ItRw_DIV_Arrow_Sharp;
                
        } else {
            
            return;
        };
    };
    
    func void GiveHeroArrowBugfix()
    {
        EquipItem (hero, ItRw_DIV_Arrow_Sharp);
            
        FF_ApplyExt(GiveHeroArrowBugfix_PartII, 500, 1);
    };
    
    func void GiveHeroArrowBugfix_PartII()
    {
        Npc_RemoveInvItem (hero, ItRw_DIV_Arrow_Sharp);
    };
    Das Skript eines Pfeiles sieht z.B. so aus:

    Code:
    ///////////////////////////////////////////////////////////
    //                    Scharfer Pfeil     
    ///////////////////////////////////////////////////////////
    INSTANCE ItRw_DIV_Arrow_Sharp(C_Item)
    {
        name                 =    "Pfeil";
    
        mainflag             =    ITEM_KAT_MAGIC;
        flags                =    ITEM_BELT|ITEM_MULTI; 
    
        value                =    Value_Pfeil;
    
        visual               =    "ItRw_DIV_Arrow_Sharp.3ds";
        material             =    MAT_WOOD;
    
        on_equip                =    Equip_BetterArrow;
        on_unequip           =    Unequip_BetterArrow;
    
        description          =       "Scharfer Pfeil";
    
        TEXT[1]              =    "Die Spitze des Pfeiles besteht aus Stein.";    
        TEXT[3]              =    "Schaden +7";
        
        TEXT[5]                 =       NAME_Value;    COUNT[5] = value;
    
        INV_ZBIAS            =       INVCAM_ENTF_AMULETTE_STANDARD;
    };
    
    FUNC VOID Equip_BetterArrow()
    {
        SharpArrow = TRUE;
    };
    
    FUNC VOID Unequip_BetterArrow()
    {
        SharpArrow = FALSE;
    };
    Die Funktion 'DIV_SwitchBowCrossbowMunition()' wird per FF_ApplyOnce aufgerufen.

    Leider gibt es keine Funktion, mit der man einfach irgendein Item aus dem Inventar anlegen lassen kann (jedenfalls hab ich keine gefunden?).

    Aber es muss doch irgendwie möglich sein, dass der Held den Pfeil, sobald er ihn wieder im Inventar hat, wieder anlegt, oder?

    PS: Ich weiß, dass es hier im Forum schon ein Skript für mehrere Pfeile von Migos gibt. Dieses habe ich auch bis heute verwendet, allerdings gibt es dort den gleichen Bug und auch noch andere, z.B. dass man nach dem laden eines Spielstandes den Bogen und die Pfeile erst wieder ablegen und anlegen muss, damit der Bogen wieder schießt oder dass man erst den Bogen und dann die Pfeile anlegen muss, damit der überhaupt schießt.
    Geändert von Bloodfly91 (18.11.2017 um 20:42 Uhr)

  2. Homepage besuchen Beiträge anzeigen #2 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Ich habe mal weiter getestet und so funktioniert es jetzt schon mal besser:

    Code:
    var int Arrowbugfixalreadydone;
    
    func void DIV_SwitchBowCrossbowMunition()
    {
        var C_Item GetEquippedRangedWeapon;
    
        if (Npc_IsInFightMode(hero, FMODE_FAR))
        {
            if (Arrowbugfixalreadydone == FALSE) && (Npc_HasItems (hero, ItRw_DIV_Arrow_Sharp) == 1)
            {
                Arrowbugfixalreadydone = TRUE;
            };
        
            GetEquippedRangedWeapon = Npc_GetReadiedWeapon(hero);
        }
        else if (Npc_HasEquippedRangedWeapon (hero))
        {    
            GetEquippedRangedWeapon = Npc_GetEquippedRangedWeapon(hero);
        }
        else //weder gezogenen noch equippten Bogen
        {
            return;
        };
            
        if (SharpArrow == TRUE) 
        {
            GetEquippedRangedWeapon.munition = ItRw_DIV_Arrow_Sharp;
                
        } else {
            
            return;
        };
    };
    
    func void DIV_GiveHeroArrowBugfix()
    {
        if (Arrowbugfixalreadydone == TRUE)
        {
            EquipItem (hero, ItRw_DIV_Arrow_Sharp);
            
            Arrowbugfixalreadydone = FALSE;
            
            FF_ApplyExt(DIV_GiveHeroArrowBugfix_PartII, 500, 1);
        };
    };
    
    func void DIV_GiveHeroArrowBugfix_PartII()
    {
        Npc_RemoveInvItem (hero, ItRw_DIV_Arrow_Sharp);
    };
    Die Funktion DIV_GiveHeroArrowBugfix() lasse ich jetzt auch einfach per FF_ApplyOnce aufrufen. Problem: Der Pfeil wird anscheinend nicht schnell genug entfernt, deshalb kann man, selbst wenn man davor nur einen Pfeil im Inventar hatte, 2-3x schießen, bis der Held den Bogen wieder wegsteckt, weil er keine Pfeile mehr hat.
    Weiß vielleicht jemand, wie man das Problem noch lösen kann? Falls es nicht anders geht, müsste ich den Munitionswechsel dann über einen Dialog machen, den man mit irgendeiner Taste aufrufen kann.

  3. Beiträge anzeigen #3 Zitieren
    Legende der Amazonen Avatar von Bisasam
    Registriert seit
    Dec 2006
    Ort
    Meine Faust in Sinis Gesicht
    Beiträge
    9.639
     
    Bisasam ist offline
    Da könntest du auch ein bisschen mit den Animationen arbeiten.
    Öffne deine Humans.mds und such dir die Animationen fürs Wegstecken aus.
    Die Funktion DEF_REMOVEITEM sorgt dafür, dass ein Item von der Hand zurück ins Inventar kommt. DEF_DESTROYITEM sorgt dafür, dass ein Item aus der Hand komplett gelöscht wird.
    Wenn du da mit remove arbeitest kriegst du den Pfeil schonmal ins Inventar. Dann brauchst du eigentlich nur noch den Equip, vielleicht mit ner AI_Function. Dann wird der Equip nach dem Wegstecken ausgeführt.

    Aber das sind nur die theoretischen Ansätze, die ich mit meinen Erfahrungen gemacht habe. Kann sein, dass für dich was anderes besser ist.


    "Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
    -Korallenkette

  4. Homepage besuchen Beiträge anzeigen #4 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Zitat Zitat von Bisasam Beitrag anzeigen
    Da könntest du auch ein bisschen mit den Animationen arbeiten.
    Öffne deine Humans.mds und such dir die Animationen fürs Wegstecken aus.
    Die Funktion DEF_REMOVEITEM sorgt dafür, dass ein Item von der Hand zurück ins Inventar kommt. DEF_DESTROYITEM sorgt dafür, dass ein Item aus der Hand komplett gelöscht wird.
    Wenn du da mit remove arbeitest kriegst du den Pfeil schonmal ins Inventar. Dann brauchst du eigentlich nur noch den Equip, vielleicht mit ner AI_Function. Dann wird der Equip nach dem Wegstecken ausgeführt.

    Aber das sind nur die theoretischen Ansätze, die ich mit meinen Erfahrungen gemacht habe. Kann sein, dass für dich was anderes besser ist.
    In der HumanS.mds steht beim Bogen (wegstecken) '*eventTag (19 "DEF_REMOVE_MUNITION")'. Beim 19. frame wird der Pfeil wieder aus dem Bogen genommen und ins Inventar zurückgelegt. Würde ich da DEF_DESTROYITEM angeben, würde da nicht der Bogen bzw. irgendeins der beiden Objekte gelöscht werden?
    Wäre es denn möglich, nur den Pfeil bei frame 19 komplett löschen zu lassen?

    Edit: Habe es gestern mal mit 'DEF_DESTROYITEM' probiert, allerdings wird keins der beiden Items gelöscht und der Held behält den Pfeil einfach in der rechten Hand, bis man die Waffe wieder zieht. Dann fällt er auf den Boden und man kann ihn als Item wieder aufheben.
    Aber ich denke, ich werde es jetzt einfach über einen Dialog machen. Löst auch die anderen Probleme, die ich noch mit diesem System habe.
    Geändert von Bloodfly91 (20.11.2017 um 09:29 Uhr)

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