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 3 123 Letzte »
Ergebnis 1 bis 20 von 44
  1. Beiträge anzeigen #1 Zitieren
    Kämpfer
    Registriert seit
    Feb 2016
    Ort
    Dresden
    Beiträge
    349
     
    gladi1994 ist offline

    Zauber verstärken

    Huhu zusammen

    Ich hab mal wieder ein "kleines" Anliegen, bei dem ich nicht weiterkomme...
    Und zwar möchte ich gewisse Zauber unter bestimmten Bedingungen (bzw. nach dem Erlernen bestimmter Perks) stärker werden lassen. Um zu testen, ob es überhaupt so funktioniert, wie gedacht, habe ich das erstmal vom Level des Helden abhängig machen wollen. Siehe folgenden Code:

    Code:
    if(spellType == SPL_Firestorm)
        {
            if(hero.level >= 10)
            {
                return SPL_Damage_InstantFireStormP;
            }
            else if(hero.level >= 5)
            {
                return SPL_Damage_InstantFireStormB;
            }
            else
            {
                return SPL_Damage_InstantFireStorm;
            };
        };
    Allerdings bringt mir das eine Access Violation, sobald ich versuche, die Rune zu inserten, um es zu testen... Funktioniert das so nicht? Oder ist es komplizierter, als ich mir das hier gedacht habe?

    Danke schon mal für etwaige Antworten!

    LG, Gladi


    Edit: So sah es vorher aus und so funktioniert es auch einwandfrei:

    Code:
    if(spellType == SPL_Firestorm)
        {
            return SPL_Damage_InstantFireStorm;
        };
    Geändert von gladi1994 (17.02.2018 um 19:42 Uhr)

  2. Beiträge anzeigen #2 Zitieren
    Knight Avatar von Draxes
    Registriert seit
    Aug 2007
    Ort
    Mainz
    Beiträge
    1.920
     
    Draxes ist offline
    In welcher Datei ist denn diese Funktion? Die ist mir nicht bekannt und ich finde sie in meinen Scripten gerade auch nicht.

    Das einfachste ist, wenn du die Variable SPL_Damage_InstantFireStorm immer aktualisierst, wenn sich deine Abhängigkeiten, durch die der Zauber potentiell stärker werden könnte, ändern. In deinem Fall also der Levelaufstieg (B_GivePlayerXP.d).
    Am besten also eine Update-Funktion implementieren, in der du alle Zauberschaden-Variablen nach bestimmten Bedingungen updatest. Diese rufst du dann an allen Stellen auf, wo sich einer der Werte evt. ändern könnte.

  3. Beiträge anzeigen #3 Zitieren
    Kämpfer
    Registriert seit
    Feb 2016
    Ort
    Dresden
    Beiträge
    349
     
    gladi1994 ist offline
    Zitat Zitat von Draxes Beitrag anzeigen
    In welcher Datei ist denn diese Funktion? Die ist mir nicht bekannt und ich finde sie in meinen Scripten gerade auch nicht.
    Sorry, hatte gedacht, das ist in den Originalskripten auch so geregelt. Sonst hätte ich das gleich mit erwähnt:
    Ich bastle zur Zeit wieder an den Skripten der MinimodBalance von Tricky, die mir Lord Sargon hier dekompiliert zur Verfügung gestellt hat. Ich habe die RespawnModEnhanced mit der MinimodBalance gemerged, sodass ich als Grundgerüst die Skripte der MinimodBalance benutze. Und dort hat Tricky das mit den Zaubern scheinbar so geregelt.

    Zitat Zitat von Draxes Beitrag anzeigen
    Das einfachste ist, wenn du die Variable SPL_Damage_InstantFireStorm immer aktualisierst, wenn sich deine Abhängigkeiten, durch die der Zauber potentiell stärker werden könnte, ändern. In deinem Fall also der Levelaufstieg (B_GivePlayerXP.d).
    Am besten also eine Update-Funktion implementieren, in der du alle Zauberschaden-Variablen nach bestimmten Bedingungen updatest. Diese rufst du dann an allen Stellen auf, wo sich einer der Werte evt. ändern könnte.
    Ich verstehe, was du meinst, aber wenn ich immer nur eine Variable update, werden die Zauber ja sowohl für mich, als auch für die Gegner stärker, sobald ich beispielsweise einen Perk erlerne... oder hab ich da einen Denkfehler? Dann müsste ich ja die momentan als "const int" angelegten Variablen in "var int" ändern und sobald ich diese dann update, wird der entsprechende Wert auf alle Zauber angewandt, und nicht nur auf vom Helden gecastete. Oder?

  4. Beiträge anzeigen #4 Zitieren
    Knight Avatar von Draxes
    Registriert seit
    Aug 2007
    Ort
    Mainz
    Beiträge
    1.920
     
    Draxes ist offline
    Okay, das ist ein Argument. Dass die Zauber für die Gegner dann auch stärker werden habe ich an der Stelle nicht bedacht. Bei uns in der Mod nutzen die Npcs andere Zauber als der Held. Allerdings wäre das dann wohl zu viel Aufwand für deine Zwecke.

    Allerdings könntest du die beiden Ansätze ja verbinden und für die Npcs den Originalwert zurückgeben und für den Helden die eine Variable updaten. Lustigerweise kann man in Gothic auch const-Variablen abändern. Das heißt du müsstest an der SPL_Damage_InstantFireStorm nicht mal großartig etwas ändern.

    Du bräuchtest dann eine Hilfsvariable, wo du dir anfänglich einmal den Grundwert merkst. Zum Beispiel SPL_Base_Damage_InstantFireStorm. Die initialisierst du einfach über die const-Deklaration:
    Code:
    const int SPL_Base_Damage_InstantFireStorm = SPL_Damage_InstantFireStorm;
    Anschließend kannst du SPL_Damage_InstantFireStorm nach belieben verändern auf Basis von SPL_Base_Damage_InstantFireStorm.

  5. Beiträge anzeigen #5 Zitieren
    Kämpfer
    Registriert seit
    Feb 2016
    Ort
    Dresden
    Beiträge
    349
     
    gladi1994 ist offline
    Danke für deine Ideen!

    Ich hatte auch schon überlegt, die Zauber, die sich verstärken sollen, einfach als neue Spells und Runeninstanzen einzufügen und diese dann dem Helden zukommen zu lassen, aber habe dann festgestellt, dass der Aufwand wohl ziemlich groß wird... Und mir dann überlegt, dass das doch auch einfacher gehen muss.

    Mir war mal so, gelesen zu haben, dass const Variablen nach jedem Neustart des Spiels auf ihren ursprünglichen Wert zurückgesetzt werden. Daher habe ich gedacht, diese in var(iable)-Variablen (hehe ) abzuändern.

    Dein Vorschlag, für NPC's den Originalwert zu nutzen und für den Helden den abgeänderten, klingt gut, allerdings wüsste ich gerade nicht, wie man das umsetzen kann...

    Wieso funktioniert denn mein obiger Code nicht, bzw. wieso bekomme ich da einen Absturz mit Access Violation? Kann man das so nicht machen? Ohne die if-Abfragen funktioniert es ja wunderbar... Ich verstehe nicht, wo da das Problem liegen soll...

  6. Beiträge anzeigen #6 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    Zeig mal einen Screenshot der Access Violation. Ich sehe aber auch keinen Grund, warum dein Code zu einem Crash führen sollte...

  7. Beiträge anzeigen #7 Zitieren
    Kämpfer
    Registriert seit
    Feb 2016
    Ort
    Dresden
    Beiträge
    349
     
    gladi1994 ist offline
    Hallo Lehona,

    hier mal der Screenshot der Access Violation:

    [Bild: AccessViolation.png]

    Der Crash tritt auf, sobald ich die betroffene Rune inserten will. Runen anderer unveränderter Spells funktionieren einwandfrei...

  8. Beiträge anzeigen #8 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.484
     
    Cryp18Struct ist offline
    Zeig mal bitte das item skript der Rune.

  9. Beiträge anzeigen #9 Zitieren
    Kämpfer
    Registriert seit
    Feb 2016
    Ort
    Dresden
    Beiträge
    349
     
    gladi1994 ist offline
    Zitat Zitat von Cryp18Struct Beitrag anzeigen
    Zeig mal bitte das item skript der Rune.
    Das wäre dieses:

    Code:
    instance ItRu_Firestorm(C_Item)
    {
        name = NAME_Rune;
        mainflag = ITEM_KAT_RUNE;
        flags = 0;
        value = Value_Ru_Firestorm;
        visual = "ItRu_Firestorm.3ds";
        material = MAT_STONE;
        spell = SPL_Firestorm;
        mag_circle = 3;
        wear = WEAR_EFFECT;
        effect = "SPELLFX_WEAKGLIMMER_YELLOW";
        description = NAME_SPL_Firestorm;
        text[0] = NAME_Mag_Circle;
        count[0] = mag_circle;
        text[1] = NAME_Manakosten;
        count[1] = b_invmanacostrune(flags,spell);
        text[2] = NAME_Dam_Magic;
        count[2] = spl_damage(spell);
        text[5] = NAME_Value;
        count[5] = value;
    };
    Von mir unverändert, also original, wie in den MinimodBalance Skripten...

    Für den Zusammenhang würde ich auch mal die zugehörigen Damage Funktionen posten:

    Spoiler:(zum lesen bitte Text markieren)
    Code:
    func int b_specialspell_damage(var int spellType)
    {
        if((PLAYER_TALENT_PERKS[7] == TRUE) && c_hasspellforperk(PERK_FIREMASTER,spellType))
        {
            if(heroGIL_KDF2 == TRUE)
            {
                return BONUSDAMAGE2_FIREMASTER;
            }
            else
            {
                return BONUSDAMAGE1_FIREMASTER;
            };
        };
        if((PLAYER_TALENT_PERKS[8] == TRUE) && c_hasspellforperk(PERK_WATERMASTER,spellType))
        {
            if(HEROGIL_KDW2 == TRUE)
            {
                return BONUSDAMAGE2_WATERMASTER;
            }
            else
            {
                return BONUSDAMAGE1_WATERMASTER;
            };
        };
        return 0;
    };
    
    func int spl_damage(var int spellType)
    {
        var int damage;
        var int rest;
        if(b_specialspell_damage(spellType) > 0)
        {
            rest = b_spelldamage(spellType) % b_specialspell_damage(spellType);
            damage = b_spelldamage(spellType) + (b_spelldamage(spellType) / b_specialspell_damage(spellType));
            if((rest * 2) >= b_specialspell_damage(spellType))
            {
                damage += 1;
            };
        }
        else
        {
            damage = b_spelldamage(spellType);
        };
        return damage;
    };


    Und b_spelldamage:

    Spoiler:(zum lesen bitte Text markieren)
    Code:
    func int b_spelldamage(var int spellType)
    {
        if(spellType == SPL_Firebolt)
        {
            return SPL_Damage_Firebolt;
        };
        if(spellType == SPL_InstantFireball)
        {
            return SPL_DAMAGE_InstantFireball;
        };
        if(spellType == SPL_ChargeFireball)
        {
            return SPL_Damage_ChargeFireball;
        };
        if(spellType == SPL_Pyrokinesis)
        {
            return SPL_Damage_Firestorm;
        };
        if(spellType == SPL_Firestorm)
        {
            return SPL_Damage_InstantFireStorm;
        };
        if(spellType == SPL_Firerain)
        {
            return SPL_Damage_FireRain;
        };
        if(spellType == SPL_MasterOfDisaster)
        {
            return SPL_DAMAGE_MasterOfDisaster;
        };
        if(spellType == SPL_Icebolt)
        {
            return SPL_DAMAGE_Icebolt;
        };
        if(spellType == SPL_IceCube)
        {
            return SPL_DAMAGE_ICECUBE;
        };
        if(spellType == SPL_IceLance)
        {
            return SPL_DAMAGE_Icelance;
        };
        if(spellType == SPL_WindFist)
        {
            return SPL_Damage_Windfist;
        };
        if(spellType == SPL_Whirlwind)
        {
            return SPL_DAMAGE_WHIRLWIND;
        };
        if(spellType == SPL_WaterFist)
        {
            return SPL_DAMAGE_Waterfist;
        };
        if(spellType == SPL_Geyser)
        {
            return SPL_DAMAGE_Geyser;
        };
        if(spellType == SPL_IceWave)
        {
            return SPL_DAMAGE_ICEWAVE;
        };
        if(spellType == SPL_Thunderstorm)
        {
            return SPL_DAMAGE_Thunderstorm;
        };
        if(spellType == SPL_ZORNADANOS)
        {
            return SPL_DAMAGE_ZORNADANOS;
        };
        if(spellType == SPL_Zap)
        {
            return SPL_Damage_Zap;
        };
        if(spellType == SPL_ChargeZap)
        {
            return SPL_Damage_ChargeZap;
        };
        if(spellType == SPL_LightningFlash)
        {
            return SPL_Damage_LightningFlash;
        };
        if(spellType == SPL_DestroyUndead)
        {
            return SPL_Damage_DESTROYUNDEAD;
        };
        if(spellType == SPL_BreathOfDeath)
        {
            return SPL_Damage_BreathOfDeath;
        };
        if(spellType == SPL_MassDeath)
        {
            return SPL_Damage_MassDeath;
        };
        if(spellType == SPL_SuckEnergy)
        {
            return SPL_DAMAGE_SUCKENERGY;
        };
        if(spellType == SPL_Swarm)
        {
            return SPL_DAMAGE_SWARM;
        };
        if(spellType == SPL_GreenTentacle)
        {
            return SPL_DAMAGE_GREENTENTACLE;
        };
        if(spellType == SPL_Energyball)
        {
            return SPL_DAMAGE_Energyball;
        };
        if(spellType == SPL_Skull)
        {
            return SPL_Damage_Skull;
        };
        if(spellType == SPL_Inflate)
        {
            return SPL_DAMAGE_INFLATE;
        };
        if(spellType == SPL_Earthquake)
        {
            return SPL_DAMAGE_EARTHQUAKE;
        };
        if(spellType == SPL_PalHolyBolt)
        {
            return SPL_Damage_PalHolyBolt;
        };
        if(spellType == SPL_PalRepelEvil)
        {
            return SPL_Damage_PalRepelEvil;
        };
        if(spellType == SPL_PalDestroyEvil)
        {
            return SPL_Damage_PalDestroyEvil;
        };
        if(spellType == SPL_Charm)
        {
            return SPL_Damage_Charm;
        };
        if(spellType == SPL_Deathbolt)
        {
            return SPL_DAMAGE_Deathbolt;
        };
        if(spellType == SPL_Deathball)
        {
            return SPL_DAMAGE_Deathball;
        };
        if(spellType == SPL_ConcussionBolt)
        {
            return SPL_DAMAGE_Concussionbolt;
        };
        if(spellType == SPL_DEATHBALL_DMT)
        {
            return SPL_DAMAGE_DEATHBALL_DMT;
        };
        if(spellType == SPL_ICEBOLT2)
        {
            return SPL_DAMAGE_ICEBOLT2;
        };
        if(spellType == SPL_ORCFIREBALL)
        {
            return SPL_DAMAGE_ORCFIREBALL;
        };
        return 0;
    };


    Und in letzterer habe ich obigen Code eingefügt / abgeändert. Das habe ich jetzt erstmal wieder rückgängig gemacht, so funktioniert es wieder, aber meine Änderung ist halt nicht drin...

    Edit: Zur Not probiere ich es anders, über die Perks, so, wie es auch Tricky gemacht hat, nur ist das aufwändiger und ich verstehe nicht, wieso mein obiger Code zu einem Crash führt.
    Geändert von gladi1994 (18.02.2018 um 14:18 Uhr)

  10. Beiträge anzeigen #10 Zitieren
    Kämpfer
    Registriert seit
    Feb 2016
    Ort
    Dresden
    Beiträge
    349
     
    gladi1994 ist offline
    Habs jetzt ganz anders gelöst, trotzdem nochmal vielen Dank für eure Hilfe!

    Obwohl ich schon gern gewusst hätte, was da gesponnen hat...

    LG, Gladi

  11. Beiträge anzeigen #11 Zitieren
    Kämpfer
    Registriert seit
    Feb 2016
    Ort
    Dresden
    Beiträge
    349
     
    gladi1994 ist offline
    Hat sich leider doch noch nicht ganz erledigt, sorry...

    Beim Testen kam nämlich raus, dass, sobald ich als Hero das entsprechende Talent erlerne (in meinem Fall "Meister des Feuers" -> PLAYER_TALENT_PERKS[7]) auch die NPCs von der geänderten Spellstärke profitieren. Und das bekomme ich irgendwie nicht gehändelt, egal wie sehr ich mir darüber auch den Kopf zerbreche. Habe diverse Ansätze ausprobiert, die alle etwa in folgende Richtung gingen:

    Code:
    const int BONUSDAMAGE_FIREMASTER = 1;
    const int BONUSDAMAGE_WATERMASTER = 1;
    const int BONUSDAMAGE_STORMMASTER = 1;
    
    func int c_hasspellforperk(var int perk,var int spellType)
    {
        if(perk == PERK_FIREMASTER)
        {
            if((spellType == SPL_Firebolt) || (spellType == SPL_InstantFireball) || (spellType == SPL_ChargeFireball) || (spellType == SPL_Firestorm) || (spellType == SPL_Pyrokinesis) || (spellType == SPL_Firerain) || (spellType == SPL_MasterOfDisaster))
            {
                return TRUE;
            }
            else
            {
                return FALSE;
            };
        };
        if(perk == PERK_WATERMASTER)
        {
            if((spellType == SPL_Icebolt) || (spellType == SPL_IceLance) || (spellType == SPL_IceCube) || (spellType == SPL_IceWave) || (spellType == SPL_Geyser) || (spellType == SPL_WaterFist) || (spellType == SPL_ZORNADANOS))
            {
                return TRUE;
            }
            else
            {
                return FALSE;
            };
        };
        if(perk == PERK_STORMMASTER)
        {
            if((spellType == SPL_WindFist) || (spellType == SPL_Whirlwind) || (spellType == SPL_Thunderstorm) || (spellType == SPL_Zap) || (spellType == SPL_LightningFlash) || (spellType == SPL_ChargeZap))
            {
                return TRUE;
            }
            else
            {
                return FALSE;
            };
        };
        return FALSE;
    };
    
    func int b_specialspell_damage(var int spellType)
    {
        if((PLAYER_TALENT_PERKS[7] == TRUE) && c_hasspellforperk(PERK_FIREMASTER,spellType))
        {
            return BONUSDAMAGE_FIREMASTER;
        };
        if((PLAYER_TALENT_PERKS[8] == TRUE) && c_hasspellforperk(PERK_WATERMASTER,spellType))
        {
            return BONUSDAMAGE_WATERMASTER;
        };
        if((PLAYER_TALENT_PERKS[10] == TRUE) && c_hasspellforperk(PERK_STORMMASTER,spellType))
        {
            return BONUSDAMAGE_STORMMASTER;
        };
        return 0;
    };
    
     func int spl_damage(var int spellType)
    {
        var int damage;
        var int rest;
        if(Npc_IsPlayer(hero))
        {
            if(b_specialspell_damage(spellType) > 0)
            {
                rest = b_spelldamage(spellType) % b_specialspell_damage(spellType);
                damage = b_spelldamage(spellType) + (b_spelldamage(spellType) / b_specialspell_damage(spellType));
                if((rest * 2) >= b_specialspell_damage(spellType))
                {
                    damage += 1;
                };
            }
            else
            {
                damage = b_spelldamage(spellType);
            };
        }
        else
        {
            damage = b_spelldamage(spellType);
        };
        return damage;
    };
    Rot markiert ist einer der von mir vorgenommenen Versuche, sicherzustellen, dass der zaubernde NPC der Held ist. Alle meine Gedanken gingen in diese Richtung, daher sind die anderen Versuche relativ ähnlich. Allerdings ändert das an der Situation nichts, die Suchenden beispielsweise profitieren trotzdem von der Schadenssteigerung, sobald ich als Hero das Talent erlernt habe...

    Weiß jemand, wo mein Gedankenfehler ist?
    Geändert von gladi1994 (19.02.2018 um 14:46 Uhr) Grund: mehr Code fürs Verständnis

  12. Beiträge anzeigen #12 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist gerade online
    Schau dir mal folgende Zeile aus deinem Code genau an.

    Code:
    if(Npc_IsPlayer(hero))

  13. Beiträge anzeigen #13 Zitieren
    Kämpfer
    Registriert seit
    Feb 2016
    Ort
    Dresden
    Beiträge
    349
     
    gladi1994 ist offline
    Meine Gedanken drehen sich momentan im Kreis... Sorry..

    Ich weiß inzwischen, dass das falsch ist, weiß aber nicht, wie ich abfragen kann, ob der Zaubernde der Held ist, oder nicht? Gibts da einen Befehl für? Sorry für die dämliche Frage...

    Edit: Hatte auch an sowas in der Art gedacht, aber das hat auch nicht funktioniert:

    Code:
    var C_Npc her;
    her = Hlp_GetNpc(PC_Hero);
    if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(her))

  14. Beiträge anzeigen #14 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    Zitat Zitat von gladi1994 Beitrag anzeigen
    Meine Gedanken drehen sich momentan im Kreis... Sorry..

    Ich weiß inzwischen, dass das falsch ist, weiß aber nicht, wie ich abfragen kann, ob der Zaubernde der Held ist, oder nicht? Gibts da einen Befehl für? Sorry für die dämliche Frage...

    Edit: Hatte auch an sowas in der Art gedacht, aber das hat auch nicht funktioniert:

    Code:
    var C_Npc her;
    her = Hlp_GetNpc(PC_Hero);
    if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(her))
    Dein (neuer) Gedankengang ist grundsätzlich richtig, du musst überprüfen ob der gerade zaubernde (N)PC der Spieler ist. Npc_IsPlayer(self) würde also das gleiche tun wie dein neuer Vorschlag. Das Problem liegt aber nicht direkt im Code, sondern in der Tatsache, dass 'self' zu diesem Zeitpunkt offenbar nicht den richtigen Wert (nämlich den zaubernden NPC) enthält.

    Wie man genau an den entsprechenden NPC kommt, der gerade zaubert, kann ich dir aber (mangels Erfahrung) auch nicht sagen. Vielleicht hat jemand, der mehr mit Zaubern gearbeitet hat eine gute Lösung. Ansonsten kommt noch eine unsaubere Lösung in Frage: In einer der Funktionen, die beim Zaubern ausgeführt werden setzt du eine eigene globale Variable auf die Instanz des Zaubernden (mit Hlp_GetInstanceID), die überprüfst du dann in deiner Funktion. Das funktioniert aber nur, wenn die entsprechende Funktion überhaupt vorher ausgeführt wird.

    Pseudo-Edit: Der letzte Absatz ist keine so optimale Lösung, es könn(t)en Probleme auftreten falls NPC und Spieler gleichzeitig den Zauber benutzen. Die einfachste Lösung wird stattdessen sein, diesen Zauber nicht für NPCs zu verwenden (sondern eine Kopie).

  15. Beiträge anzeigen #15 Zitieren
    Kämpfer
    Registriert seit
    Feb 2016
    Ort
    Dresden
    Beiträge
    349
     
    gladi1994 ist offline
    Ich danke euch für die Antworten!

    Sehr schade, dass es scheinbar nicht anders sauber machbar ist, als mit Kopien von Zaubern. Das ist ne ganze Menge Aufwand, aber da werd ich wohl nicht drum herum kommen. Nur doof, dass dann die bisherige Arbeit und der Ansatz über die Perks eigentlich komplett umsonst war...

  16. Beiträge anzeigen #16 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    Zitat Zitat von gladi1994 Beitrag anzeigen
    Ich danke euch für die Antworten!

    Sehr schade, dass es scheinbar nicht anders sauber machbar ist, als mit Kopien von Zaubern. Das ist ne ganze Menge Aufwand, aber da werd ich wohl nicht drum herum kommen. Nur doof, dass dann die bisherige Arbeit und der Ansatz über die Perks eigentlich komplett umsonst war...
    Ist es so viel Arbeit, einen Zauber zu erstellen? Du musst doch nur die vorhandenen Scripte (Instanz, ...) kopieren und an ein paar Orten eintragen. Die Perk-Geschichte brauchst du auch weiterhin, der Held soll doch wenigstens weiterhin den Zauber mit und ohne Perk verwenden können.

  17. Beiträge anzeigen #17 Zitieren
    Kämpfer
    Registriert seit
    Feb 2016
    Ort
    Dresden
    Beiträge
    349
     
    gladi1994 ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    Ist es so viel Arbeit, einen Zauber zu erstellen? Du musst doch nur die vorhandenen Scripte (Instanz, ...) kopieren und an ein paar Orten eintragen. Die Perk-Geschichte brauchst du auch weiterhin, der Held soll doch wenigstens weiterhin den Zauber mit und ohne Perk verwenden können.
    Es geht ja nicht nur um einen Zauber, sondern um nahezu alle. War so gedacht, dass es drei Perks gibt (Meister des Feuers, Wassers und Sturms), die die jeweiligen Zauber stärker machen sollen.

    Edit: Brauch ich dann nicht sogar für jeden Spell eine eigene Runeninstanz?

  18. Beiträge anzeigen #18 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    Oh, das ist mir entgangen, das würde natürlich eine Menge Arbeit bedeuten.

    [~2 Stunden später]

    Ich habe das jetzt mal als Anlass genommen, das Script zur eigenen Schadensverbesserung auszubauen, damit Magie auch vernünftig (besser) berücksichtigt werden kann. Wenn du also LeGo verwendest, kannst du da mal drin rumstöbern, Stichwort "spellID".

  19. Beiträge anzeigen #19 Zitieren
    Kämpfer
    Registriert seit
    Feb 2016
    Ort
    Dresden
    Beiträge
    349
     
    gladi1994 ist offline
    Wow, ich wollte dich nicht nötigen, bis morgens um 4 wach zu bleiben.. Vielen Dank dafür und für die Mühen!

    Ich habs mir mal angeschaut und ehrlich gesagt versteh ichs nicht so ganz.. Kann mir das Skript bei meinem Problem helfen?
    Ich würde mal vermuten, ich müsste für mein Problem was an der Dmg_OnDmg_Pre drehen? Sorry, ich benutze zwar LeGo, aber bin da noch nicht so wirklich durchgestiegen, gerade was die MEM / HookEngine Sachen angeht...

  20. Beiträge anzeigen #20 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    Kein Problem, in der neuen Version ist das Skript auch nicht mehr so übersichtlich und die vorhandene Erklärung dazu ein wenig spärlich.

    Als erstes musst du das gesamte Script irgendwo hinkopieren - in welche Datei ist erstmal egal, aber sie muss natürlich geparst werden. Dann möchtest du das Skript initialisieren, dazu rufst du einfach in der INIT_Global einmal InitDamage() auf - natürlich nach LeGo_Init(). Jetzt wird für dich die Funktion DMG_OnDmg() interessant (kleiner Hinweis: Die anderen beiden DMG_OnDmg()-Funktionen beginnen mit einem _, das heißt (per Konvention) dass sie "interna" sind und im Normalfall für den Benutzer uninteressant).

    Mittels der Funktion DMG_OnDmg() hast du quasi die vollständige Kontrolle, wie viel Schaden einem NPC wirklich zugefügt wird. Immer wenn ein NPC Schaden bekommt (und eventuell auch, wenn er blockt und somit eigentlich 0 Schaden erhält?), wird die Funktion DMG_OnDmg() aufgerufen. In der Funktion hast du die drei "Hauptparameter", nämlich den Angreifer (in attackerPtr), das Opfer (in victimPtr) und der von Gothic berechnete Schaden (in dmg). Über den Rückgabewert steuerst du, wie viel Schaden zugefügt werden soll. Ohne weitere Änderungen gibt das Script 'dmg' zurück, d.h. einfach der von Gothic berechnete Wert (-> Keine Änderung im Schaden). Sollte jeder Angriff von allen NPCs/Spieler/Monstern immer 100 Schaden verursachen, könntest du einfach "return 100;" in die Funktion schreiben, möchtest du jeglichen Schaden verdoppeln zum Beispiel "return dmg * 2;".


    Du möchtest aber natürlich nicht jeglichen Schaden verändern (zum größten Teil soll die Schadensberechnung ja bleiben wie in Gothic), sondern nur unter bestimmten Umständen:

    1. Der Angreifer ist der Held
    2. Beim verwendeten Zauber (dazu später mehr) handelt es sich um einen der Zauber, der von den Perks verstärkt wird
    3. Der Held hat den jeweiligen Perk


    Diese Punkte musst du also innerhalb der DMG_OnDmg() überprüfen und dann den richtigen Schadenswert (z.B. 100 ohne Perk, 120 mit Perk 1, 140 mit Perk 2) zurückgeben.
    Dabei solltest du darauf achten, dass der Rückgabewert wirklich der letztliche, finale Schaden ist - etwaige Rüstungswerte des Ziels musst du also selber beachten, Gothic ändert daran nichts mehr!

    Um festzustellen, ob und um welchen Zauber es sich handelt, verwendest du das Objekt der neuen Klasse "oSDamageDescriptor". Gothic verwendet diese Klasse intern, um Informationen zum Schadensereignis zu sammeln, unter anderem auch, ob es sich um einen Magie-Angriff handelt und welche SpellID (nachzuschauen in der Constants.d) das war:

    Code:
    if (dmgDesc.spellID == SPL_Zap) { // Der Angreifer hat den Zauber "Blitz" verwendet
        return 0; // Blitze machen keinen Schaden mehr!
    };

    Ich kann dir gerade nicht sagen, wie man vonn der Spell-ID am besten an die Spell-Instanz (z.B. Spell_Zap) kommt, d.h. im Zweifelsfall bräuchste du eine große Liste von If-Abfragen, um welche Spell-ID es sich handelt. Ich schau aber gerade mal nach, ob man da nicht vielleicht was einfacheres tun kann In der Zwischenzeit kannst du ja schonmal ein bisschen mit der Schadensberechnung rumspielen und bei weiteren Fragen nochmal posten

    Edit: Hm, so auf die schnelle kann ich keinen einfachen Weg finden. Vielleicht weiß da jemand anderes was?
    Geändert von Lehona (20.02.2018 um 12:41 Uhr)

Seite 1 von 3 123 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