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. Beiträge anzeigen #1 Zitieren
    Schwertmeister Avatar von Buzz Killington
    Registriert seit
    Apr 2019
    Ort
    Heidelberg
    Beiträge
    856
     
    Buzz Killington ist offline

    Wieso funktionieren magische Waffen eigentlich nur für den Helden?

    Ich habe mich am Klaue Beliars Skript orientiert um eine magische Waffe zu erstellen, welche ein sehr starker Gegner tragen soll. Die funktioniert auch, aber halt nur wenn der HELD sie benutzt. Vorgehen war komplett analog zur Klaue Beliars mit Eintrag in die B_AssessDamage und B_MM_AssessDamage. Ich habe sogar extra die Abfrage im Schadens-Skript entfernt, welche abfragt, ob der hero die Waffe trägt. Egal, das Teil tut nur dann was es soll wenn der hero sie schwingt. Bei NPCs passiert grundsätzlich gar nichts (es sei denn ich übernehme den NPC im Marvin-Mode). Interessanterweise macht die Waffe auch keinen Schaden GEGEN den Helden oder PC_Rockefeller, aber klassentechnisch sind das auch nur NPC_Default. Wo wird das denn geregelt? Ich habe versucht herauszufinden wie das im Original mit Ravens Version von der Klaue gemacht wurde, aber ich konnte nichts finden.


    Code:
    
    func int C_IsItemKT(var C_Item weapon)
    {
        if Hlp_IsItem(weapon, ItMw_TestMag)
        {
            return TRUE;
        };
        return FALSE;
    };
    
    func int C_ScHasReadiedKT (var C_NPC oth)
    {   
        var C_ITEM ReadyWeap; ReadyWeap = Npc_GetReadiedWeapon(oth);
        
        if (C_IsItemKT(ReadyWeap))
        {
            return TRUE;
        };
        
        return FALSE; //DEFAULT
    };
    
    func int C_ScHasEquippedKT (var C_NPC oth) 
    {   
        var C_ITEM EquipWeap; EquipWeap = Npc_GetEquippedMeleeWeapon(oth);
        
        if (C_IsItemKT(EquipWeap))
        {
            return TRUE;
        };
        
        return FALSE; //DEFAULT
    };
    
    
    func void KT_Feuerschaden(var C_NPC slf)
    {
        Npc_ChangeAttribute(slf, ATR_HITPOINTS, -1);
    };
    
    
    
    func void B_TestMag_DMG (var C_NPC oth, var C_NPC slf) //other ist angreifer, slf ist victim
    {
            var int DamageRandy;
            DamageRandy = Hlp_Random(100);
    
            if (C_ScHasReadiedKT(oth))
            && (DamageRandy <= 50) 
                {
                    if (slf.attribute[ATR_HITPOINTS] < 200)
                    {
                        AI_PlayAni (slf, "S_FIRE_VICTIM"); 
                    };
                        if (slf.attribute[ATR_HITPOINTS] < 50)
                        {
                            Npc_StopAni (slf, "S_FIRE_VICTIM"); 
                        };
                   
                    Wld_PlayEffect("VOB_MAGICBURN",  slf, slf, 0, 0, 0, FALSE );
                    B_MagicHurtNpc (oth, slf, 100); 
                    FF_ApplyExtGT(KT_Feuerschaden,500,50);
                };
        
            if (C_ScHasReadiedKT(oth))
            && (DamageRandy > 50)
            {
                    Wld_PlayEffect("spellFX_CHARGEFIREBALL_INVEST_BLAST1", oth, oth, 0, 0, 0, FALSE );
            };
        
    };
    
    
    [Bild: janus_sig.png]
    Janus - eine Gothic 2 Modifikation
    Ankündigung im Forum
    Geändert von Buzz Killington (16.03.2025 um 22:30 Uhr)

  2. Beiträge anzeigen #2 Zitieren
    General Avatar von neocromicon
    Registriert seit
    Jan 2019
    Beiträge
    3.164
     
    neocromicon ist offline
    Gebe dir mal aus wer slf und other wirklich ist jeweils, wenn der NPC die Waffe schwingt. Ich vermute dort den Fehler.

  3. Beiträge anzeigen #3 Zitieren
    Deus Avatar von Ajanna
    Registriert seit
    Mar 2020
    Ort
    Hessen
    Beiträge
    10.725
     
    Ajanna ist offline
    In ELEX haben viele Gegner magische Waffen, kann man es sich da abgucken?


  4. Beiträge anzeigen #4 Zitieren
    Schwertmeister Avatar von Buzz Killington
    Registriert seit
    Apr 2019
    Ort
    Heidelberg
    Beiträge
    856
     
    Buzz Killington ist offline
    Zitat Zitat von neocromicon Beitrag anzeigen
    Gebe dir mal aus wer slf und other wirklich ist jeweils, wenn der NPC die Waffe schwingt. Ich vermute dort den Fehler.
    Ich habe einfach die Instanz-IDs abgefragt, allerdings werden die auch nur ausgegeben wenn ich als Hero die Waffe benutze und auch nicht wenn ich einen PC_Hero oder PC_Rockefeller angreife. Scheinbar wird in der AssessDamage nur der Fall geregelt wenn der Held angreift, aber ich kann es mir einfach nicht erklären wo, wie und warum das genau gemacht wird.

    Zitat Zitat von Ajanna Beitrag anzeigen
    In ELEX haben viele Gegner magische Waffen, kann man es sich da abgucken?
    Könnte man theoretisch wenn die auch Daedalus verwendet haben und man die Skripte hätte. In DNDR wurde das mit der Klaue Beliars ja aber auch gemacht, und hier finde ich das Skript für Ravens Version davon einfach nicht. Das hat ja sehr wohl gegen den Helden funktioniert. Mein Problem ist nur, dass diese AssessDamage den Schaden aus irgendeinem mir unklaren Grund nur für "Held benutzt die Waffe gegen nicht Held oder Rockefeller" abfragt, wobei ich derzeit äußerst ratlos bin, wo und wie das gemacht wird (und wozu). Nach der Logik dürfte der Held ja von nichts Schaden nehmen (wobei Logik und ich zugegeben nicht die besten Freunde sind).

    Lange Rede kurzer Sinn: Schwingt ein NPC die Waffe, funktioniert sie einfach nicht. Abgesehen vom normalen Waffenschaden.

    EDIT: Für die Klaue Beliars gilt das übrigens genauso, habe sie auch mal einem NPC in die Hand gedrückt. Funktioniert nur wenn der Hero sie benutzt gegen nicht-Hero und nicht-Rockefeller. Könnte es was damit zu tun haben, dass Hero und Rockefeller ID = 0 und keine Flags haben? Ich habe leider keine Ahnung wo die genau definiert sind und welchen Einfluss sie haben könnten, aber vielleicht ist das ein Hinweis.
    [Bild: janus_sig.png]
    Janus - eine Gothic 2 Modifikation
    Ankündigung im Forum
    Geändert von Buzz Killington (17.03.2025 um 17:17 Uhr)

  5. Beiträge anzeigen #5 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.354
     
    Milky-Way ist offline
    In solchen Situationen würde ich:
    1. schauen, welcher Code tatsächlich ausgeführt wird und wo eine Abfrage nicht den gedachten Wert zurückgibt, bzw. welche Zeile Code genau einfach nichts macht, obwohl sie ausgeführt wird (meistens mache ich das, in dem ich diverse unterschiedliche Prints überall in der jeweiligen Funktion einbaue)
    2. die eigene Schadensberechnung als Alternative in Betracht ziehen https://forum.worldofplayers.de/foru...densberechnung

  6. Beiträge anzeigen #6 Zitieren
    Deus Avatar von Ajanna
    Registriert seit
    Mar 2020
    Ort
    Hessen
    Beiträge
    10.725
     
    Ajanna ist offline
    Zitat Zitat von Buzz Killington Beitrag anzeigen
    Ich habe mich am Klaue Beliars Skript orientiert um eine magische Waffe zu erstellen, welche ein sehr starker Gegner tragen soll. Die funktioniert auch, aber halt nur wenn der HELD sie benutzt. Vorgehen war komplett analog zur Klaue Beliars mit Eintrag in die B_AssessDamage und B_MM_AssessDamage. Ich habe sogar extra die Abfrage im Schadens-Skript entfernt, welche abfragt, ob der hero die Waffe trägt. Egal, das Teil tut nur dann was es soll wenn der hero sie schwingt. Bei NPCs passiert grundsätzlich gar nichts (es sei denn ich übernehme den NPC im Marvin-Mode). Interessanterweise macht die Waffe auch keinen Schaden GEGEN den Helden oder PC_Rockefeller, aber klassentechnisch sind das auch nur NPC_Default. Wo wird das denn geregelt? Ich habe versucht herauszufinden wie das im Original mit Ravens Version von der Klaue gemacht wurde, aber ich konnte nichts finden.


    Code:
    
    func int C_IsItemKT(var C_Item weapon)
    {
        if Hlp_IsItem(weapon, ItMw_TestMag)
        {
            return TRUE;
        };
        return FALSE;
    };
    
    func int C_ScHasReadiedKT (var C_NPC oth)
    {   
        var C_ITEM ReadyWeap; ReadyWeap = Npc_GetReadiedWeapon(oth);
        
        if (C_IsItemKT(ReadyWeap))
        {
            return TRUE;
        };
        
        return FALSE; //DEFAULT
    };
    
    func int C_ScHasEquippedKT (var C_NPC oth) 
    {   
        var C_ITEM EquipWeap; EquipWeap = Npc_GetEquippedMeleeWeapon(oth);
        
        if (C_IsItemKT(EquipWeap))
        {
            return TRUE;
        };
        
        return FALSE; //DEFAULT
    };
    
    
    func void KT_Feuerschaden(var C_NPC slf)
    {
        Npc_ChangeAttribute(slf, ATR_HITPOINTS, -1);
    };
    
    
    
    func void B_TestMag_DMG (var C_NPC oth, var C_NPC slf) //other ist angreifer, slf ist victim
    {
            var int DamageRandy;
            DamageRandy = Hlp_Random(100);
    
            if (C_ScHasReadiedKT(oth))
            && (DamageRandy <= 50) 
                {
                    if (slf.attribute[ATR_HITPOINTS] < 200)
                    {
                        AI_PlayAni (slf, "S_FIRE_VICTIM"); 
                    };
                        if (slf.attribute[ATR_HITPOINTS] < 50)
                        {
                            Npc_StopAni (slf, "S_FIRE_VICTIM"); 
                        };
                   
                    Wld_PlayEffect("VOB_MAGICBURN",  slf, slf, 0, 0, 0, FALSE );
                    B_MagicHurtNpc (oth, slf, 100); 
                    FF_ApplyExtGT(KT_Feuerschaden,500,50);
                };
        
            if (C_ScHasReadiedKT(oth))
            && (DamageRandy > 50)
            {
                    Wld_PlayEffect("spellFX_CHARGEFIREBALL_INVEST_BLAST1", oth, oth, 0, 0, 0, FALSE );
            };
        
    };
    
    
    Npc_ChangeAttribute und B_MagicHurtNpc beziehen sich dann auf den Helden?


  7. Beiträge anzeigen #7 Zitieren
    Schwertmeister Avatar von Buzz Killington
    Registriert seit
    Apr 2019
    Ort
    Heidelberg
    Beiträge
    856
     
    Buzz Killington ist offline
    Zitat Zitat von Ajanna Beitrag anzeigen
    Npc_ChangeAttribute und B_MagicHurtNpc beziehen sich dann auf den Helden?
    Sie beziehen sich auf einen NPC, im Skript sollte "other" der Angreifer und "self" das Opfer sein, also hätte der Held "self" sein sollen wenn ein NPC die Waffe benutzt.

    Zitat Zitat von Milky-Way Beitrag anzeigen
    In solchen Situationen würde ich:
    1. schauen, welcher Code tatsächlich ausgeführt wird und wo eine Abfrage nicht den gedachten Wert zurückgibt, bzw. welche Zeile Code genau einfach nichts macht, obwohl sie ausgeführt wird (meistens mache ich das, in dem ich diverse unterschiedliche Prints überall in der jeweiligen Funktion einbaue)
    2. die eigene Schadensberechnung als Alternative in Betracht ziehen https://forum.worldofplayers.de/foru...densberechnung
    1. Ja, das ist auch was ich probiere; ich konnte hier nur einfach keine Stelle festmachen wo ich hätte diese Printbefehle "einhängen" können. Tatsächlich hat die Waffe bei NPC-Verwendung dann sogar MANCHMAL funktioniert. Aber nur manchmal, während für den Helden immer und nach wie vor niemals gegen den Helden oder PC_Rockefeller. Auch wenn ich das nun so nicht mehr verwenden werde (wegen zweiter Punkt direkt drunter), hätte ich gern gewusst woran das genau liegt. Mein einziger Ansatz wäre noch die ZS_Attack gewesen, aber wenn ich das Waffenskript aus dieser aufgerufen habe, hat sich ebenfalls nichts getan. Möglicherweise gehe ich dem noch einmal nach wenn mir gerade langweilig ist.

    2. Und damit klappt es wunderbar, das hätte ich schon viel früher probieren sollen. Ich denke ich werde in Zukunft die eigene Schadensberechnung verwenden. Hier habe ich jetzt das Skript angepasst für die besagte Waffe abgefragt und einfach ein

    Code:
    [...]
    }
        else
        {
        return dmg; 
    
        };
    gesetzt. Vielen Dank für den Hinweis (und mal wieder vielen Dank an Lehona für das Skript ).
    [Bild: janus_sig.png]
    Janus - eine Gothic 2 Modifikation
    Ankündigung im Forum

  8. Beiträge anzeigen #8 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.354
     
    Milky-Way ist offline
    Welcher Code wann genau aufgerufen wird, kann ich aus dem Kopf heraus auch nicht sagen; da müsste man schauen, welche prints kommen (oder auch nicht) und darauf basierend genauer überlegen, woran es liegt.
    Rockefeller habe ich mir schon ewig nicht mehr angeschaut; möglicherweise gibt es da Ausnahmen in manchen Skripten, oder manche Wahrnehmungen sind gar nicht aktiviert, so dass mancher Code für ihn nie aufgerufen wird?

  9. Beiträge anzeigen #9 Zitieren
    Deus Avatar von Ajanna
    Registriert seit
    Mar 2020
    Ort
    Hessen
    Beiträge
    10.725
     
    Ajanna ist offline
    Ich hab schon sehr lange nicht mehr programmiert - und insgesamt eher wenig - aber was wäre mit self_ChangeAttribute und B_MagicHurtself?


  10. Beiträge anzeigen #10 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.466
     
    Lehona ist offline
    Der Held hat standardmäßig keine Schadenswarnehmung (also die B_AssessDamage wird nicht aufgerufen, wenn er Schaden bekommt). Diese Perception kann man zusätzlich aktivieren, bringt aber ihre eigenen Probleme mit sich (siehe Klaue Beliars, die auch Blitze auslöst, wenn der Gegner pariert).

    2. Und damit klappt es wunderbar, das hätte ich schon viel früher probieren sollen. Ich denke ich werde in Zukunft die eigene Schadensberechnung verwenden. Hier habe ich jetzt das Skript angepasst für die besagte Waffe abgefragt und einfach ein
    Hast du daran gedacht zu überprüfen, ob auch tatsächlich ein Nahkampfangriff verarbeitet wird? Nicht, dass ich die Waffe nur auf dem Rücken haben muss und Bögen den selben Effekt auslösen Oder, etwas unwahrscheinlicher, ich einen Feuerball werfe und während das Projektil fliegt die Nahkampfwaffe zücke.

    Zitat Zitat von Ajanna Beitrag anzeigen
    Ich hab schon sehr lange nicht mehr programmiert - und insgesamt eher wenig - aber was wäre mit self_ChangeAttribute und B_MagicHurtself?
    Du kannst nicht einfach wahllos Teile des Funktionsnamens austauschen, das ergibt keinen Sinn.

  11. Beiträge anzeigen #11 Zitieren
    Schwertmeister Avatar von Buzz Killington
    Registriert seit
    Apr 2019
    Ort
    Heidelberg
    Beiträge
    856
     
    Buzz Killington ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    Hast du daran gedacht zu überprüfen, ob auch tatsächlich ein Nahkampfangriff verarbeitet wird? Nicht, dass ich die Waffe nur auf dem Rücken haben muss und Bögen den selben Effekt auslösen Oder, etwas unwahrscheinlicher, ich einen Feuerball werfe und während das Projektil fliegt die Nahkampfwaffe zücke.
    Ich habe konkret über Npc_GetReadiedWeapon abgefragt ob das besagte Schwert verwendet wird und else einfach erstmal return dmg gelassen, damit scheint es bislang zu funktionieren. Die Möglichkeiten die sich damit auftun habe ich wohl unterschätzt, das ist echt eine starke Sache!
    [Bild: janus_sig.png]
    Janus - eine Gothic 2 Modifikation
    Ankündigung im Forum

  12. Beiträge anzeigen #12 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.466
     
    Lehona ist offline
    Wenn du es ganz richtig machen willst, musst du vermutlich die itemWeapon und/oder den weaponMode aus dem DamageDescriptor überprüfen. Deine Lösung hat das von mir genannte Problem, dass man schummeln kann, wenn man im richtigen Moment die Waffe zückt. Ist dir aber ja vielleicht auch egal

  13. Beiträge anzeigen #13 Zitieren
    Schwertmeister Avatar von Buzz Killington
    Registriert seit
    Apr 2019
    Ort
    Heidelberg
    Beiträge
    856
     
    Buzz Killington ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    Wenn du es ganz richtig machen willst, musst du vermutlich die itemWeapon und/oder den weaponMode aus dem DamageDescriptor überprüfen. Deine Lösung hat das von mir genannte Problem, dass man schummeln kann, wenn man im richtigen Moment die Waffe zückt. Ist dir aber ja vielleicht auch egal
    Ich muss das mal testen/ausreizen um das zu reproduzieren. Auf jeden Fall danke für den Hinweis, war mir nicht bewusst.

    Zitat Zitat von Ajanna Beitrag anzeigen
    Ich hab schon sehr lange nicht mehr programmiert - und insgesamt eher wenig - aber was wäre mit self_ChangeAttribute und B_MagicHurtself?
    Wie Lehona schon geschrieben hat, es handelt sich dabei um Funktionsnamen welche auf eine bestimmte Art definiert sind (nämlich bei der Funktion), die kann man nicht einfach in eine Befehlszeile anders hinschreiben. Das gibt dann einen undefined-error (bzw. bei Daedalus unknown identifier), da das Programm den geänderten Funktionsnamen natürlich nicht kennt.
    [Bild: janus_sig.png]
    Janus - eine Gothic 2 Modifikation
    Ankündigung im Forum
    Geändert von Buzz Killington (18.03.2025 um 18:09 Uhr)

  14. Beiträge anzeigen #14 Zitieren
    Schwertmeister Avatar von Buzz Killington
    Registriert seit
    Apr 2019
    Ort
    Heidelberg
    Beiträge
    856
     
    Buzz Killington ist offline
    Mir ist bei meinem Schadens-Skript etwas aufgefallen, und zwar kommt das Programm scheinbar durcheinander, wer nun "victimNpc" ist, wenn ich mehrere NPCs mit gleicher Instanz angreife. Habe das beim Rockefeller getestet und dachte mir dann gut, habe eh keine NPCs mit gleicher Instanz, aber bei Monstern tritt das Problem dann ja natürlich ebenfalls auf. Gibt es einen Ansatz wie ich das im Skript einbeziehen kann? Also das victimNpc wirklich derjenige ist der gerade getroffen wird?

    Meine gesamte Funktion sieht bislang so aus wie unten gezeigt; ich habe eine magische Waffe ("Kro'Tarrach") mit einem Brenn-Effekt und Heilung des Anwenders (ist noch schlecht gebalanced und absolut OP das Teil, aber das Skript funktioniert soweit) und darunter Waffen die einen Bluten-Effekt starten. Funktioniert soweit alles, auch wenn es da sicher noch Optimierungsbedarf gibt. Das Problem ist wirklich nur, dass wenn ich z.B. 10 Drachensnapper bekämpfe, auch mal einer anfängt zu brennen/bluten, den ich gar nicht angegriffen habe. Das liegt vermute ich daran, dass Gothic hier irgendwie mit "victimNpc" durcheinander kommt? Was übersehe ich? Ich habe so ein Gefühl dass es mich anspringt, aber ich sehe es gerade einfach nicht...

    Code:
    func int DMG_OnDmg(var int victimPtr, var int attackerPtr, var int dmg, var int dmgDescriptorPtr) 
    {
        var oSDamageDescriptor dmgDesc; dmgDesc = _^(dmgDescriptorPtr);
        
        var c_npc attackerNpc; attackerNpc = _^(attackerptr);
        var c_npc victimNpc; victimNpc = _^(victimPtr);
    
        var c_item equipped_meleeWeapon;
        var c_item equipped_rangedWeapon;
    
        equipped_meleeWeapon = Npc_GetEquippedMeleeWeapon(attackerNpc);
        equipped_rangedWeapon = Npc_GetEquippedRangedWeapon(attackerNpc);
    
    // ************************************************************************************************************************************************************************
    // Neue Schadensberechnung ab hier ...
    // ************************************************************************************************************************************************************************
    
        if (C_ScHasReadiedKT(attackerNpc))      // KRO'TARRACH
        {
            var int DamageRandy;
            DamageRandy = Hlp_Random(100);
    
            if (C_ScHasReadiedKT(attackerNpc))
            && (DamageRandy <= 25) 
            {
                    var int BurningMan;
                    BurningMan = Hlp_Random(3);
                    if BurningMan == 2                                                                          
                    {
                        FF_ApplyExtDataGT(Burning,500,6,Hlp_GetInstanceID(victimNpc));
                        Wld_PlayEffect("VOB_MAGICBURN", victimNpc, victimNpc, 0, 0, 0, FALSE );
                        FF_ApplyExtDataGT(Burning_STOP,3500,1,Hlp_GetInstanceID(victimNpc));
                    };
                                
                    if Npc_IsDead(victimNpc)
                    {
                        Npc_StopAni (victimNpc, "S_FIRE_VICTIM"); 
                        FF_RemoveData(Burning,victimNpc);
                        FF_RemoveData(Burning_STOP,victimNpc);
                    };
    
                    return dmg;
            }
            else if (C_ScHasReadiedKT(attackerNpc))
            && DamageRandy > 25 && DamageRandy < 50
            {
                    Wld_PlayEffect("spellFX_CHARGEFIREBALL_INVEST_BLAST1", attackerNpc, attackerNpc, 0, 0, 0, FALSE );
                    return dmg;
            }
            else if (C_ScHasReadiedKT(attackerNpc))
            && DamageRandy > 50 && DamageRandy < 75
            {
                    if attackerNpc.attribute[ATR_HITPOINTS] < attackerNpc.attribute[ATR_HITPOINTS_MAX]
                    {
                    FF_ApplyExtDataGT(Heal_Attacker,500,10,Hlp_GetInstanceID(attackerNpc));
                    victimNpc.attribute[ATR_HITPOINTS] = victimNpc.attribute[ATR_HITPOINTS] - attackerNpc.attribute[ATR_HITPOINTS_MAX]*10/100 ;
                    Wld_PlayEffect("spellFX_PalHeal_ORIGIN", attackerNpc, attackerNpc, 0, 0, 0, FALSE );
                    }
                    else
                    {
                    Wld_PlayEffect("spellFX_CHARGEFIREBALL_INVEST_BLAST2", attackerNpc, attackerNpc, 0, 0, 0, FALSE );  
                    };
                    return dmg; 
    
            }
            else if (C_ScHasReadiedKT(attackerNpc))
            && DamageRandy > 75
            {
                    Wld_PlayEffect("spellFX_CHARGEFIREBALL_INVEST_BLAST2", attackerNpc, attackerNpc, 0, 0, 0, FALSE );
                    return dmg;
            };
        }
        else if (C_ScHasReadiedKD(attackerNpc))             // Waffen die BLUTEN verursachen...
        || (C_ScHasReadiedDAG(attackerNpc))
        {
            var int BlutenRandy;
            var int hp_bleeding;
            BlutenRandy = Hlp_Random(100);
    
            if BlutenRandy >= 90
            && C_ScHasReadiedKD(attackerNpc)  
            {
                hp_bleeding = victimNpc.attribute[ATR_HITPOINTS_MAX]*10/100;
    
                if victimNpc.attribute[ATR_HITPOINTS] > hp_bleeding
                {   
                    if (!FF_ActiveData(FF_ApplyExtDataGT, Hlp_GetInstanceID(victimNpc)))
                    {
                    FF_ApplyExtDataGT(Bleeding,500,-1,Hlp_GetInstanceID(victimNpc));    
                    };
                };
                
                if victimNpc.attribute[ATR_HITPOINTS] <= 2
                || Npc_IsDead(victimNpc)
                {
                    FF_RemoveData(Bleeding,Hlp_GetInstanceID(victimNpc));
                };
            }
            else if BlutenRandy >= 80
            && C_ScHasReadiedDAG(attackerNpc) 
            {
                if victimNpc.attribute[ATR_HITPOINTS] > hp_bleeding
                {   
                    if (!FF_ActiveData(FF_ApplyExtDataGT, Hlp_GetInstanceID(victimNpc)))
                    {
                    FF_ApplyExtDataGT(Bleeding,500,-1,Hlp_GetInstanceID(victimNpc));    
                    };
                };
                
                if victimNpc.attribute[ATR_HITPOINTS] <= 2
                {
                    FF_RemoveData(Bleeding,Hlp_GetInstanceID(victimNpc));
                };
            }       
            else
            {
                return dmg;
            };
    
        }
        else
        {
        return dmg;             
        };
    
    };
    Die C_HasReadied*-Funktionen sind hierbei die gleichen wie im Eingangspost; da habe ich mich an denen von der Klaue Beliars orientiert (mir ist bislang noch keine "elegantere" oder kompaktere Abfrage eingefallen...).

    Zitat Zitat von Lehona Beitrag anzeigen
    Hast du daran gedacht zu überprüfen, ob auch tatsächlich ein Nahkampfangriff verarbeitet wird? Nicht, dass ich die Waffe nur auf dem Rücken haben muss und Bögen den selben Effekt auslösen Oder, etwas unwahrscheinlicher, ich einen Feuerball werfe und während das Projektil fliegt die Nahkampfwaffe zücke.
    Und Shit, jetzt habe ich erst verstanden was genau du meinst, das muss ich aber ganz dringend prüfen und diese Exploit-Möglichkeit beseitigen. War gestern etwas übermüdet.
    [Bild: janus_sig.png]
    Janus - eine Gothic 2 Modifikation
    Ankündigung im Forum

  15. Beiträge anzeigen #15 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.466
     
    Lehona ist offline
    Code:
                    if BurningMan == 2                                                                          
                    {
                        FF_ApplyExtDataGT(Burning,500,6,Hlp_GetInstanceID(victimNpc));
                        Wld_PlayEffect("VOB_MAGICBURN", victimNpc, victimNpc, 0, 0, 0, FALSE );
                        FF_ApplyExtDataGT(Burning_STOP,3500,1,Hlp_GetInstanceID(victimNpc));
                    };
                                
                    if Npc_IsDead(victimNpc)
                    {
                        Npc_StopAni (victimNpc, "S_FIRE_VICTIM"); 
                        FF_RemoveData(Burning,victimNpc);
                        FF_RemoveData(Burning_STOP,victimNpc);
                    };
    Im ersten Block verwendest du die InstanceID des NPCs, die ist natürlich für alle Drachensnapper gleich. Der Gedanke ist nicht ganz doof, weil Pointer das Speichern/Laden nicht überleben, hat aber den Nachteil, dass man eben NPCs nicht genau identifizieren kann
    LeGo hat das Buffs Paket, dass dir diese Implementierungsdetails abnehmen kann.

  16. Beiträge anzeigen #16 Zitieren
    Schwertmeister Avatar von Buzz Killington
    Registriert seit
    Apr 2019
    Ort
    Heidelberg
    Beiträge
    856
     
    Buzz Killington ist offline
    Das ist echt prima, damit funktioniert es wie es soll. Der von dir gezeigte Block schrumpft jetzt beim ersten Versuch zu

    Code:
    var int BurningMan;
    
                    BurningMan = Hlp_Random(3);
                    if BurningMan == 2                                                                          
                    {
                        Buff_Apply(victimNpc,firedmg_burning);
    
                    };
    Mit der Buff-Funktion und einer Hilfs-Funktion

    Code:
    var int effectActive;
    
    func void firedmg_burning_apply(var int bh)
    {
        var int ptr; ptr = Buff_GetNpc(bh);
    
        if !ptr
        {
            return;
        };
    
        var c_npc n; n= _^(ptr);
        Npc_ChangeAttribute(n, ATR_HITPOINTS, -5);
        
        if effectActive == FALSE
        {
        Wld_PlayEffect("VOB_MAGICBURN", n, n, 0, 0, 0, FALSE ); 
        effectActive = TRUE;
    
            if (!FF_ActiveData(FF_ApplyExtDataGT, Hlp_GetInstanceID(n)))
            {
                FF_ApplyExtDataGT(FF_Aux_StartStop,3000,1,Hlp_GetInstanceID(n));
            };
        };
    };
    
    instance firedmg_burning(lCBuff)
    {
        bufftype = BUFF_BAD;
        
        durationMS = 3000;
        tickMS = 500;
    
        onTick = SAVE_GetFuncID(firedmg_burning_apply);
    };
    
    
    func void FF_Aux_StartStop(var C_NPC slf)
    {
        effectActive = FALSE;
    
    };
    Das ist echt klasse was man damit nun alles anstellen kann, ich bin gespannt was mir da noch alles in den Sinn kommt.

    Musste nur die "Ich brenne und zapple rum"-Animation rausschmeißen, weil ich die nicht mehr stoppen konnte. Das liegt aber nicht an den Buffs sondern einfach an Gothic. Irgendwie mag das Spiel keine Loop-Animationen stoppen, und ich bin gerade zu faul eine T_Animation draus zu machen. Witzigerweise haben die in Vanilla bei den Tränen Innos ja auch die S_FIRE_VICTIM Animation gestartet und wollten sie mit AI_Wait nach 3s wieder stoppen, was nur halt nicht funktioniert.

    Was mir noch einfällt: Du hattest recht, wenn ich einen Zauber auf einen Gegner schleudere und dann schnell die Waffe ziehe, wird der Effekt der Waffe auf ihn angewendet. Habe das bisher noch nicht gelöst, aber ich denke da setze ich mich als nächstes dran. Glücklicherweise werden die meisten Spieler diesen Exploit aber (hoffentlich) nicht finden, da man wirklich schnell sein muss und weit weg vom Gegner.
    [Bild: janus_sig.png]
    Janus - eine Gothic 2 Modifikation
    Ankündigung im Forum

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