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

    Giftpfeil: Held bekommt selbst Giftschaden durch Gegner

    Hallo,
    folgendes Problem: Wenn der Spieler auf einen NPC einen Giftpfeil schießt, bekommt dieser dann selbst Giftschaden durch den getroffenen NPC, sobald er von diesen NPC angegriffen und getroffen wird. Dabei ist es egal, mit welcher Waffe der NPC den Helden angreift.

    Das Skript dafür sieht so aus:

    Code:
    func int DMG_OnDmg(var int victimPtr, var int attackerPtr, var int dmg) 
    {
        var C_NPC slf; slf = _^(victimPtr);
        var C_NPC oth; oth = _^(attackerptr);
            
        var int rnd; rnd = Hlp_Random (100);
        var C_ITEM DistanceWeapon; 
        
        if (Npc_IsInFightMode(oth, FMODE_FAR))
        {
            DistanceWeapon = Npc_GetReadiedWeapon(oth);
        };
    
        if (rnd <= 55)
        {
            if (DistanceWeapon.munition == ItRw_DIV_Arrow_Special_03)
            || (Hlp_GetInstanceID(oth) == Hlp_GetInstanceID(Bloodfly))
            || (Hlp_GetInstanceID(oth) == Hlp_GetInstanceID(YBloodfly))
            {
                if (!FF_ActiveData(DIV_SetPoisonHealth, Hlp_GetInstanceID(slf))) 
                && (!FF_ActiveData(DIV_SetFireHealth, Hlp_GetInstanceID(slf)))
                {
                    FF_ApplyExtData(DIV_SetPoisonHealth, 1000, 10, Hlp_GetInstanceID(slf));
                };
            };
            
            if (DistanceWeapon.munition == ItRw_DIV_Arrow_Special_02) 
            && (!FF_ActiveData(DIV_SetPoisonHealth, Hlp_GetInstanceID(slf))) 
            && (!FF_ActiveData(DIV_SetFireHealth, Hlp_GetInstanceID(slf))) 
            {
                Wld_PlayEffect("VOB_BURN", slf, slf, 0, 0, 0, FALSE);
                FF_ApplyExtData(DIV_SetFireHealth, 1000, 10, Hlp_GetInstanceID(slf));
            };
        };
            return dmg;
    };
        
    func void _DMG_OnDmg() 
    {
        EDI = DMG_OnDmg(EBP, MEM_ReadInt(MEM_ReadInt(ESP+644)+8), EDI);
    };
    
    func void InitDamage() 
    {
        const int dmg = 0;
        if (dmg) 
        { 
            return; 
        };
        
        HookEngineF(6736583/*0x66CAC7*/, 5, _DMG_OnDmg);
        dmg = 1;
    };
    Und wird in der INIT_GLOBAL durch InitDamage(); aufgerufen.,

    Edit: Das gleiche passiert übrigens auch mit dem Feuerpfeil ("ItRw_DIV_Arrow_Special_02").

    Edit2: Das Skript für 'DIV_SetPoisonHealth' und 'DIV_SetFireHealth' sieht so aus:

    Code:
    func void DIV_SetPoisonHealth (var int slfInstID)
    {
        var C_NPC slf; slf = Hlp_GetNpc(slfInstID);
        Npc_ChangeAttribute(slf, ATR_HITPOINTS, -10); // Schaden (pro Sekunde)
    };
    
    func void DIV_SetFireHealth (var int slfInstID)
    {
        var C_NPC slf; slf = Hlp_GetNpc(slfInstID);
        Npc_ChangeAttribute(slf, ATR_HITPOINTS, -10); // Schaden (pro Sekunde). Kann beliebig verändert werden.
    };
    Geändert von Bloodfly91 (01.01.2018 um 19:50 Uhr)

  2. Beiträge anzeigen #2 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.484
     
    Cryp18Struct ist offline
    Mit solch einer Abfrage
    Code:
    (Hlp_GetInstanceID(oth) == Hlp_GetInstanceID(YBloodfly)
    hatte ich auch schon mal Probleme.
    https://forum.worldofplayers.de/foru...1#post25654336

    Schau mal ob es mit Abfragen wie
    Code:
    (Hlp_GetInstanceID(oth) == YBloodfly)
    ohne Probleme funktioniert.
    Alternativ Hlp_IsValidNpc(oth) verwenden.

  3. Beiträge anzeigen #3 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Das Problem steckt in der Variable DistanceWeapon. Daedalus "merkt" sich die Inhalte von Variablen vom letzten Funktionsaufruf zum nächsten (in LeGo häufig "pseudo-locals" genannt). Die Abfrage if (DistanceWeapon.munition == ItRw_DIV_Arrow_Special_03) gibt also immer true zurück, wenn einmal mit vergiftetem Pfeil geschossen wurde und nachfolgend keine Fernkampfwaffe gezogen ist. Die If-Abfragen musst du also etwas zerpflücken.

  4. Homepage besuchen Beiträge anzeigen #4 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Zitat Zitat von Cryp18Struct Beitrag anzeigen
    Mit solch einer Abfrage
    Code:
    (Hlp_GetInstanceID(oth) == Hlp_GetInstanceID(YBloodfly)
    hatte ich auch schon mal Probleme.
    https://forum.worldofplayers.de/foru...1#post25654336

    Schau mal ob es mit Abfragen wie
    Code:
    (Hlp_GetInstanceID(oth) == YBloodfly)
    ohne Probleme funktioniert.
    Alternativ Hlp_IsValidNpc(oth) verwenden.
    Zitat Zitat von mud-freak Beitrag anzeigen
    Das Problem steckt in der Variable DistanceWeapon. Daedalus "merkt" sich die Inhalte von Variablen vom letzten Funktionsaufruf zum nächsten (in LeGo häufig "pseudo-locals" genannt). Die Abfrage if (DistanceWeapon.munition == ItRw_DIV_Arrow_Special_03) gibt also immer true zurück, wenn einmal mit vergiftetem Pfeil geschossen wurde und nachfolgend keine Fernkampfwaffe gezogen ist. Die If-Abfragen musst du also etwas zerpflücken.
    Ich habe es jetzt so gemacht und so scheint es zu funktionieren.

    Code:
    func int DMG_OnDmg(var int victimPtr, var int attackerPtr, var int dmg) 
    {
        var C_NPC slf; slf = _^(victimPtr);
        var C_NPC oth; oth = _^(attackerptr);
            
        var int rnd; rnd = Hlp_Random (100);
        var C_ITEM DistanceWeapon; 
        
        if (Npc_IsInFightMode(oth, FMODE_FAR))
        {
            DistanceWeapon = Npc_GetReadiedWeapon(oth);
        
            if (rnd <= 55)
            {
                if (!FF_ActiveData(DIV_SetPoisonHealth, Hlp_GetInstanceID(slf))) 
                && (!FF_ActiveData(DIV_SetFireHealth, Hlp_GetInstanceID(slf)))
                {
                    if (DistanceWeapon.munition == ItRw_DIV_Arrow_Special_02)
                    {
                        Wld_PlayEffect("VOB_BURN", slf, slf, 0, 0, 0, FALSE);
                        FF_ApplyExtData(DIV_SetFireHealth, 1000, 10, Hlp_GetInstanceID(slf));
                
                    } else if (DistanceWeapon.munition == ItRw_DIV_Arrow_Special_03) {
            
                        FF_ApplyExtData(DIV_SetPoisonHealth, 1000, 10, Hlp_GetInstanceID(slf));
                    };
                };
            };    
        };
    
        if (Hlp_GetInstanceID(oth) == Bloodfly) || (Hlp_GetInstanceID(oth) == YBloodfly)
        {
            if (rnd <= 55)
            {
                if (!FF_ActiveData(DIV_SetPoisonHealth, Hlp_GetInstanceID(slf))) 
                && (!FF_ActiveData(DIV_SetFireHealth, Hlp_GetInstanceID(slf)))
                {
                    FF_ApplyExtData(DIV_SetPoisonHealth, 1000, 10, Hlp_GetInstanceID(slf));
                };
            };
        };
        
        return dmg;
    };
    Vielen Dank.
    Geändert von Bloodfly91 (02.01.2018 um 01:54 Uhr)

  5. Beiträge anzeigen #5 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.484
     
    Cryp18Struct ist offline
    Probiere am besten auch mal aus was passiert wenn ein NPC vergiftet wurde und du dann ein Menü öffnest (Tagebuch, Charaktermenü). Wahrscheinlich läuft der Gifteffekt dann einfach weiter. Das ließe sich zwar evt. mit Timer_SetPauseInMenu beheben, allerdings kann dir das dann was anderes kaputt machen.

    Auch zu testen: Was passiert wenn ein NPC von Blutfliege vergiftet wurde und der Spieler ihn dann anspricht. Ich nehme an der kann dann mittem im Dialog wegsterben was evt. zu Problemen führt.

    Auch bekommt der Spieler keine EXP wenn ein NPC mit Npc_ChangeAttribute getötet wird. Vielleicht zusätlich für jeden NPC speichern wer der letzte Vergifter war.

    Ich würde das von der Struktur her anders machen: Bei Beginn der Vergiftung eine aivar des NPCs auf Wert 10 setzten und dann in einer Funktion die einmal die Sekunde aufgerufen wird einen broadcast auf alle NPCs in der KI_Glocke ausführen. Dort die aivar um 1 reduzieren falls größer 0 und Giftschaden machen.

    PI * Daumen Beispiel:
    Code:
    func void calledEverySecond(){
     	if(!InfoManager_HasFinished()){return;}; // spieler in dialog
    	if(MEM_Game.singleStep){return;}; // irgendein menü offen
    	//[evt. weitere Ausnahmen hier]
    	Broadcast(hero, OnceAGameSecondForAllActiveNPC);
    };
    
    func void OnceAGameSecondForAllActiveNPC(var C_NPC me, var C_NPC caster) {
    		
    		if(me.aivar[AIV_Vergiftet]>0 ){ //Wenn noch vergiftet
    			
    			me.Aivar[AIV_Vergiftet]-=1; // Vergiftungswirkungen runterzählen
    			
    			if ((me.flags & NPC_FLAG_IMMORTAL) == NPC_FLAG_IMMORTAL) { // hier evt. weitere Ausnahmen: Giftimmune Wesen
    				me.Aivar[AIV_Vergiftet] = 0;
    			}else{
    				var c_npc poisoner;
    				poisoner = Hlp_getNpc(me.aivar[AIV_PoisonerID]);
    				B_MagicHurtNpc(poisoner, me , 10);
    			};
    		};
    };

  6. Homepage besuchen Beiträge anzeigen #6 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Zitat Zitat von Cryp18Struct Beitrag anzeigen
    Probiere am besten auch mal aus was passiert wenn ein NPC vergiftet wurde und du dann ein Menü öffnest (Tagebuch, Charaktermenü). Wahrscheinlich läuft der Gifteffekt dann einfach weiter. Das ließe sich zwar evt. mit Timer_SetPauseInMenu beheben, allerdings kann dir das dann was anderes kaputt machen.

    Auch zu testen: Was passiert wenn ein NPC von Blutfliege vergiftet wurde und der Spieler ihn dann anspricht. Ich nehme an der kann dann mittem im Dialog wegsterben was evt. zu Problemen führt.

    Auch bekommt der Spieler keine EXP wenn ein NPC mit Npc_ChangeAttribute getötet wird. Vielleicht zusätlich für jeden NPC speichern wer der letzte Vergifter war.

    Ich würde das von der Struktur her anders machen: Bei Beginn der Vergiftung eine aivar des NPCs auf Wert 10 setzten und dann in einer Funktion die einmal die Sekunde aufgerufen wird einen broadcast auf alle NPCs in der KI_Glocke ausführen. Dort die aivar um 1 reduzieren falls größer 0 und Giftschaden machen.

    PI * Daumen Beispiel:
    Code:
    func void calledEverySecond(){
         if(!InfoManager_HasFinished()){return;}; // spieler in dialog
        if(MEM_Game.singleStep){return;}; // irgendein menü offen
        //[evt. weitere Ausnahmen hier]
        Broadcast(hero, OnceAGameSecondForAllActiveNPC);
    };
    
    func void OnceAGameSecondForAllActiveNPC(var C_NPC me, var C_NPC caster) {
            
            if(me.aivar[AIV_Vergiftet]>0 ){ //Wenn noch vergiftet
                
                me.Aivar[AIV_Vergiftet]-=1; // Vergiftungswirkungen runterzählen
                
                if ((me.flags & NPC_FLAG_IMMORTAL) == NPC_FLAG_IMMORTAL) { // hier evt. weitere Ausnahmen: Giftimmune Wesen
                    me.Aivar[AIV_Vergiftet] = 0;
                }else{
                    var c_npc poisoner;
                    poisoner = Hlp_getNpc(me.aivar[AIV_PoisonerID]);
                    B_MagicHurtNpc(poisoner, me , 10);
                };
            };
    };
    Das müsste dann doch eigentlich so aussehen, oder?

    Code:
    func void calledEverySecond()
    {
         if(!InfoManager_HasFinished()){return;}; // spieler in dialog
        if(MEM_Game.singleStep){return;}; // irgendein menü offen
        //[evt. weitere Ausnahmen hier]
        Broadcast(hero, OnceAGameSecondForAllActiveNPC);
    };
    
    func void OnceAGameSecondForAllActiveNPC(var C_NPC me, var C_NPC caster) 
    {
        if(me.aivar[AIV_POISONED] > 0){ //Wenn noch vergiftet
                
            me.Aivar[AIV_POISONED] -=1; // Vergiftungswirkungen runterzählen
                
            if ((me.flags & NPC_FLAG_IMMORTAL) == NPC_FLAG_IMMORTAL) { // hier evt. weitere Ausnahmen: Giftimmune Wesen
                    
                me.Aivar[AIV_POISONED] = 0;
            
            } else {
                
                var C_NPC poisoner;
                poisoner = Hlp_getNpc(me.aivar[AIV_PoisonerID]);
                
                B_MagicHurtNpc(poisoner, me, 10);
            };
        };
    };
    
    func int DMG_OnDmg(var int victimPtr, var int attackerPtr, var int dmg) 
    {
        var C_NPC slf; slf = _^(victimPtr);
        var C_NPC oth; oth = _^(attackerptr);
            
        var int rnd; rnd = Hlp_Random (100);
        var C_ITEM DistanceWeapon; 
        
        if (Npc_IsInFightMode(oth, FMODE_FAR))
        {
            DistanceWeapon = Npc_GetReadiedWeapon(oth);
        
            if (rnd <= 55) {
            
                if (DistanceWeapon.munition == ItRw_DIV_Arrow_Special_03) {
                
                    slf.aivar[AIV_POISONED] = 10;
                    
                    print ("Test1");
                };
            };    
        };
    
        return dmg;
    };
    'calledEverySecond' wird zwar aufgerufen, aber jetzt wird der NPC gar nicht mehr vergiftet.

  7. Beiträge anzeigen #7 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    Wenn wir schon bei Alternativlösungen sind: LeGo bietet das Paket Buffs, das genau für solche Anwendungen gedacht ist. Falls du dir das mal ansehen möchtest, schaust du am besten ins Beispiel dazu. Da wird sogar genau so ein Gifteffekt implementiert

    Das ist in diesem Fall nicht unbedingt eine Aufwandserleichterung (schließlich hast du ja schon etwas funktionierendes), aber dann profitierst du auch von Überlegungen zu all diesen Randfällen, die Cryp18Struct angestellt hat*. Zudem sollte dein Code nicht richtig funktionieren, d.h. es würde mich wundern, wenn du mehr als eine Blutfliege gleichzeitig vergiften könntest (da du die nur über die Instanz identifizierst, aber alle Blutfliegen haben die selbe Instanz). LeGo nimmt einem den ganzen technischen Kram ab (z.B. wie identifiziere ich überhaupt NPCs, so dass es nach Speichern/Laden nicht verloren geht) und bietet noch einige Komfortfunktionen, die für dich vielleicht ganz interessant sein könnten (z.B. die Funktion Buff_ApplyOrRefresh(), so dass pro Ziel nur ein Gift vorhanden sein kann (mehrfache Treffer stapeln den Schaden nicht), aber ggf. die Dauer zurückgesetzt wird. In deiner jetzigen Lösung hätte ein Treffer mit einem vergifteten Pfeil keine Wirkung, wenn das Opfer schon vergiftet ist).


    *Nicht unbedingt zu allen, das Paket befindet sich noch in den Kinderschuhen. Aber mit der Zeit bzw. auf konkrete Problem-/Ideen-Nennung hin, werden diese Verbesserungen da natürlich einfließen.

  8. Homepage besuchen Beiträge anzeigen #8 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Hallo,

    Zitat Zitat von Lehona Beitrag anzeigen
    Wenn wir schon bei Alternativlösungen sind: LeGo bietet das Paket Buffs, das genau für solche Anwendungen gedacht ist. Falls du dir das mal ansehen möchtest, schaust du am besten ins Beispiel dazu. Da wird sogar genau so ein Gifteffekt implementiert

    Das ist in diesem Fall nicht unbedingt eine Aufwandserleichterung (schließlich hast du ja schon etwas funktionierendes), aber dann profitierst du auch von Überlegungen zu all diesen Randfällen, die Cryp18Struct angestellt hat*. Zudem sollte dein Code nicht richtig funktionieren, d.h. es würde mich wundern, wenn du mehr als eine Blutfliege gleichzeitig vergiften könntest (da du die nur über die Instanz identifizierst, aber alle Blutfliegen haben die selbe Instanz). LeGo nimmt einem den ganzen technischen Kram ab (z.B. wie identifiziere ich überhaupt NPCs, so dass es nach Speichern/Laden nicht verloren geht) und bietet noch einige Komfortfunktionen, die für dich vielleicht ganz interessant sein könnten (z.B. die Funktion Buff_ApplyOrRefresh(), so dass pro Ziel nur ein Gift vorhanden sein kann (mehrfache Treffer stapeln den Schaden nicht), aber ggf. die Dauer zurückgesetzt wird. In deiner jetzigen Lösung hätte ein Treffer mit einem vergifteten Pfeil keine Wirkung, wenn das Opfer schon vergiftet ist).


    *Nicht unbedingt zu allen, das Paket befindet sich noch in den Kinderschuhen. Aber mit der Zeit bzw. auf konkrete Problem-/Ideen-Nennung hin, werden diese Verbesserungen da natürlich einfließen.
    ich habe das jetzt nach sehr langer Zeit endlich mal probiert und die Funktion einfach um das ganze erst mal zu testen in der on_state von einem Trank aufgerufen. Sobald man diesen Trank benutzt, crasht allerdings das Spiel und im zSpy steht folgende Fehlermeldung:

    Code:
    [f] 01:26 Fault: 0 Q:     [start of stacktrace]
    [f] 01:26 Fault: 0 Q:             MEMINT_HANDLEERROR(2, 'MEM_PtrToInst: ptr is NULL. Use MEM_NullToInst if that's what you want.') +   62 bytes
    [f] 01:26 Fault: 0 Q:             MEM_WARN('MEM_PtrToInst: ptr is NULL. Use MEM_NullToInst if that's what you want.') +   21 bytes
    [f] 01:26 Fault: 0 Q:             MEM_PTRTOINST(530244496)                                       +  128 bytes
    [f] 01:26 Fault: 0 Q:             MEM_ARRAYINSERT(0, 12)                                         +   22 bytes
    [f] 01:26 Fault: 0 Q:             BUFFLIST_ADD(12)                                               +   58 bytes
    [f] 01:26 Fault: 0 Q:             BUFF_APPLY((instance)786046512, 17211)                         +  215 bytes
    [f] 01:26 Fault: 0 Q:             BUFF_APPLYORREFRESH((instance)786046512, 17211)                +   79 bytes
    [f] 01:26 Fault: 0 Q:             USE_DIV_GIFTTEST()                                             +   15 bytes
    [f] 01:26 Fault: 0 Q:     [end of stacktrace]
    [w] 01:26 Warn:  0 Q:     MEM_PtrToInst: ptr is NULL. Use MEM_NullToInst if that's what you want.
    [i] 01:26 Info:  2 U:    PAR: Adressing an empty Instance : ZCARRAY.ARRAY .... <zParser_Symbol.cpp,#365>
    [i] 01:26 Info:  2 U:    PAR: Adressing an empty Instance : ZCARRAY.NUMALLOC .... <zParser_Symbol.cpp,#365>
    [i] 01:26 Info:  2 U:    PAR: Adressing an empty Instance : ZCARRAY.NUMALLOC .... <zParser_Symbol.cpp,#365>
    [i] 01:26 Info:  2 U:    PAR: Adressing an empty Instance : ZCARRAY.ARRAY .... <zParser_Symbol.cpp,#365>
    [i] 01:26 Info:  2 U:    PAR: Adressing an empty Instance : ZCARRAY.ARRAY .... <zParser_Symbol.cpp,#365>
    [i] 01:26 Info:  2 U:    PAR: Adressing an empty Instance : ZCARRAY.NUMINARRAY .... <zParser_Symbol.cpp,#365>
    [f] 01:26 Fault: 0 Q:     [start of stacktrace]
    [f] 01:26 Fault: 0 Q:             MEM_WRITEINT_()                                                +   35 bytes
    [f] 01:26 Fault: 0 Q:             MEM_WRITEINTARRAY(0, 0, 12)                                    +   45 bytes
    [f] 01:26 Fault: 0 Q:             MEM_ARRAYINSERT(0, 12)                                         +  238 bytes
    [f] 01:26 Fault: 0 Q:             BUFFLIST_ADD(12)                                               +   58 bytes
    [f] 01:26 Fault: 0 Q:             BUFF_APPLY((instance)786046512, 17211)                         +  215 bytes
    [f] 01:26 Fault: 0 Q:             BUFF_APPLYORREFRESH((instance)786046512, 17211)                +   79 bytes
    [f] 01:26 Fault: 0 Q:             USE_DIV_GIFTTEST()                                             +   15 bytes
    [f] 01:26 Fault: 0 Q:     [end of stacktrace]
    [f] 01:26 Fault: 0 Q:     Exception handler was invoked. Ikarus tried to print a Daedalus-Stacktrace to zSpy. Gothic will now crash and probably give you a stacktrace of its own.
    Das Skript sieht so aus:

    Code:
    func void deadly_poison_damage(var int bh) {
        var int ptr; ptr = Buff_GetNpc(bh);
        if (!ptr) { return; }; // Kann passieren, falls z.B. die Welt gewechselt wurde
    
        var c_npc n; n = _^(ptr);
        Npc_ChangeAttribute(n, ATR_HITPOINTS, -3); // 3 Schaden
    };
    
    instance deadly_poison(lCBuff) {
            name = "tödliches Gift";
            bufftype = BUFF_BAD;
            
            durationMS = 10*1000; //10 Sekunden lang
            tickMS = 1000; // Jede Sekunde
            
            onTick = SAVE_GetFuncID(deadly_poison_damage); // Every second, after 1 second, the damage should be applied
            buffTex = "BAR_HEALTH_POISONED.TGA";
    };
    
    INSTANCE ItPo_DIV_GiftTest(C_Item)
    {
        name             =    "Gift";
    
        mainflag         =    ITEM_KAT_POTIONS;
        flags             =    ITEM_MULTI;
    
        value             =    10;    
    
        visual             =    "ItMi_Flask.3ds";
        material         =    MAT_GLAS;
    
        on_state[0]        =    Use_DIV_GiftTest;
        scemeName        =    "POTIONFAST";
    
        description        =     name;
        
        TEXT[1]            =     "Sollte man lieber nicht trinken...";
    
        TEXT[5]            =     NAME_Value;                    
        COUNT[5]        =     10;
    
    };
    
        FUNC VOID Use_DIV_GiftTest()
        {
            Buff_ApplyOrRefresh(self, deadly_poison);
        };

  9. Beiträge anzeigen #9 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    Das liegt daran, dass du die Buffs nicht explizit initialisierst:

    Code:
    LeGo_Init(LeGo_All | LeGo_Buffs);
    Die grundlegende Funktionalität der Buffs funktioniert auch ohne Initialisierung, deswegen fällt das nicht immer direkt auf, aber wenn dem Helden ein Buff hinzugefügt wird, dann versucht LeGo die entsprechende Textur anzuzeigen. Ohne Initialisierung schlägt das aber fehl (die View-Komponenten, in die die Textur gezeichnet werden soll, existieren nicht).

    In der Zukunft werden die Buffs dann auch standardmäßig mit LeGo_All initialisiert und ich habe jetzt eine Konstante eingebaut, mit der man das anzeigen der Heldenbuffs ausschalten kann.

  10. Homepage besuchen Beiträge anzeigen #10 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    Das liegt daran, dass du die Buffs nicht explizit initialisierst:

    Code:
    LeGo_Init(LeGo_All | LeGo_Buffs);
    Die grundlegende Funktionalität der Buffs funktioniert auch ohne Initialisierung, deswegen fällt das nicht immer direkt auf, aber wenn dem Helden ein Buff hinzugefügt wird, dann versucht LeGo die entsprechende Textur anzuzeigen. Ohne Initialisierung schlägt das aber fehl (die View-Komponenten, in die die Textur gezeichnet werden soll, existieren nicht).

    In der Zukunft werden die Buffs dann auch standardmäßig mit LeGo_All initialisiert und ich habe jetzt eine Konstante eingebaut, mit der man das anzeigen der Heldenbuffs ausschalten kann.
    Funktioniert leider trotzdem nicht, immer noch das gleiche Problem.
    Auch meckert Gothic jetzt, dass verdammt viele Dateien und Animationen jetzt angeblich nicht mehr gefunden werden, wenn die zSpy-Nachrichten aktiviert sind. Sobald ich LeGo_Init(LeGo_All | LeGo_Buffs); wieder aus der Startup entferne, werden mir diese Fehlermeldungen nicht mehr angezeigt.

  11. Beiträge anzeigen #11 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    Das kann ich leider nicht bestätigen, habe deine Skripte 1:1 übernommen und es funktioniert. Steht LeGo_Init() in der INIT_Global()? Und du hast natürlich nur einen Aufruf an LeGo_Init(), ja?

  12. Homepage besuchen Beiträge anzeigen #12 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    Und du hast natürlich nur einen Aufruf an LeGo_Init(), ja?
    Ups... Tatsächlich war genau das das Problem. Jetzt funktioniert alles, vielen Dank.

  13. Homepage besuchen Beiträge anzeigen #13 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Also es funktioniert jetzt soweit zwar schon mal alles, aber ein Problem gibt es trotzdem noch:

    Ich habe bis jetzt noch keine Möglichkeit gefunden, einen aktiven Buff wieder von einem bestimmten NPC zu entfernen. Das sollte zum Beispiel dann passieren, wenn ein vergifteter NPC ein Gegengift trinkt.
    Im Wiki habe ich leider auch nichts dazu gefunden. Ist das also überhaupt möglich?

    Dann habe ich noch einen kleinen Bug gefunden: Die Textur für die Buffs wird auch noch angezeigt, wenn das Spiel pausiert wird und in Dialogen. Ist zwar nicht soo schlimm, sieht aber etwas unschön aus.

  14. Beiträge anzeigen #14 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    Es gibt die Funktion Buff_Remove(), die aber tatsächlich nicht im Wiki dokumentiert ist (habe ich wohl übersehen). Es wird allerdings ein Buff-Handle als Parameter benötigt:

    Code:
    var int buff; buff = Buff_Apply(self, deadly_poison);
    Buff_remove(buff);
    
    // Folgendes geht nicht:
    
    var int buff; buff = Buff_Apply(self, deadly_poison);
    Buff_remove(self, deadly_poison);
    Es ist also für dich vermutlich nicht ohne weiteres benutzbar. Hier stellen sich aber leider auch noch einige Fragen: Was ist, wenn der NPC zwei Instanzen des Buffs aktiv hat?

    Ich werde in Zukunft wohl weitere Remove*-Funktionen anbieten, zum Beispiel RemoveOldest, RemoveAll, ... die jeweils einen NPC und eine Buff-Instanz als Parameter verwenden. Da hast du mich auf eine gute Idee gebracht

    Bezüglich der Bugs: Hier wurden schon ein paar Grundbausteine für zukünftige Versionen gelegt, so dass fortlaufende Funktionen (FrameFunctions) individuell bei pausiertem Spiel ebenfalls angehalten werden können (oder eben nicht). Aber auch das sind gute Inputs, die in der jetzigen Version der Buffs nicht berücksichtigt wurden. Habe ich also aufgenommen

  15. Homepage besuchen Beiträge anzeigen #15 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    Es gibt die Funktion Buff_Remove(), die aber tatsächlich nicht im Wiki dokumentiert ist (habe ich wohl übersehen). Es wird allerdings ein Buff-Handle als Parameter benötigt:

    Code:
    var int buff; buff = Buff_Apply(self, deadly_poison);
    Buff_remove(buff);
    
    // Folgendes geht nicht:
    
    var int buff; buff = Buff_Apply(self, deadly_poison);
    Buff_remove(self, deadly_poison);
    Es ist also für dich vermutlich nicht ohne weiteres benutzbar. Hier stellen sich aber leider auch noch einige Fragen: Was ist, wenn der NPC zwei Instanzen des Buffs aktiv hat?

    Ich werde in Zukunft wohl weitere Remove*-Funktionen anbieten, zum Beispiel RemoveOldest, RemoveAll, ... die jeweils einen NPC und eine Buff-Instanz als Parameter verwenden. Da hast du mich auf eine gute Idee gebracht

    Bezüglich der Bugs: Hier wurden schon ein paar Grundbausteine für zukünftige Versionen gelegt, so dass fortlaufende Funktionen (FrameFunctions) individuell bei pausiertem Spiel ebenfalls angehalten werden können (oder eben nicht). Aber auch das sind gute Inputs, die in der jetzigen Version der Buffs nicht berücksichtigt wurden. Habe ich also aufgenommen
    Dann werde ich wohl noch ein bisschen damit warten müssen. Dauert ja sowieso noch etwas, bis die Mod veröffentlicht wird.

  16. Homepage besuchen Beiträge anzeigen #16 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    Es gibt die Funktion Buff_Remove(), die aber tatsächlich nicht im Wiki dokumentiert ist (habe ich wohl übersehen). Es wird allerdings ein Buff-Handle als Parameter benötigt:

    Code:
    var int buff; buff = Buff_Apply(self, deadly_poison);
    Buff_remove(buff);
    
    // Folgendes geht nicht:
    
    var int buff; buff = Buff_Apply(self, deadly_poison);
    Buff_remove(self, deadly_poison);
    Es ist also für dich vermutlich nicht ohne weiteres benutzbar. Hier stellen sich aber leider auch noch einige Fragen: Was ist, wenn der NPC zwei Instanzen des Buffs aktiv hat?

    Ich werde in Zukunft wohl weitere Remove*-Funktionen anbieten, zum Beispiel RemoveOldest, RemoveAll, ... die jeweils einen NPC und eine Buff-Instanz als Parameter verwenden. Da hast du mich auf eine gute Idee gebracht

    Bezüglich der Bugs: Hier wurden schon ein paar Grundbausteine für zukünftige Versionen gelegt, so dass fortlaufende Funktionen (FrameFunctions) individuell bei pausiertem Spiel ebenfalls angehalten werden können (oder eben nicht). Aber auch das sind gute Inputs, die in der jetzigen Version der Buffs nicht berücksichtigt wurden. Habe ich also aufgenommen
    Zitat Zitat von Bloodfly91 Beitrag anzeigen
    Dann werde ich wohl noch ein bisschen damit warten müssen. Dauert ja sowieso noch etwas, bis die Mod veröffentlicht wird.
    Gibt es dazu eigentlich schon irgendwelche Neuigkeiten?
    Ich frage deshalb, weil wir Velen eigentlich dieses Jahr noch releasen wollen und wir leider immer noch keine Möglichkeit gefunden haben, die Vergiftung (also den Buff) der NPCs wieder durch ein Gegengift zu entfernen. ^^

  17. Beiträge anzeigen #17 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    Wie üblich gilt die Devise: Wenn man auf etwas von mir wartet, einfach so lange in den Arsch treten, bis ich mich darum kümmere. Dementsprechend fühle ich mich jetzt offiziell benachrichtigt und werde mich gleich ran setzen

  18. Beiträge anzeigen #18 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    Ich habe jetzt die Funktion Buff_RemoveAll(npc, buffInstance) eingebaut. Zusätzlich laufen Buffs jetzt nur noch, wenn auch das Spiel läuft: Das heißt während man z.B. im Menü ist, laufen Buffs nicht weiter.

    Für letzteres mussten ein paar mehr Änderungen gemacht werden, daher hab ich einfach mal die LeGo-Skripte gezippt und angehängt. Vor einem richtigen Release muss ich noch ein bisschen testen und Dokumentation schreiben
    Angehängte Dateien

  19. Homepage besuchen Beiträge anzeigen #19 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    Ich habe jetzt die Funktion Buff_RemoveAll(npc, buffInstance) eingebaut. Zusätzlich laufen Buffs jetzt nur noch, wenn auch das Spiel läuft: Das heißt während man z.B. im Menü ist, laufen Buffs nicht weiter.

    Für letzteres mussten ein paar mehr Änderungen gemacht werden, daher hab ich einfach mal die LeGo-Skripte gezippt und angehängt. Vor einem richtigen Release muss ich noch ein bisschen testen und Dokumentation schreiben
    Es funktioniert perfekt, vielen Dank!

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