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

 

Page 2 of 2 « First 12
Results 21 to 40 of 40
  1. View Forum Posts #21 Reply With Quote
    Provinzheld
    Join Date
    Feb 2016
    Location
    Dresden
    Posts
    282
     
    gladi1994 is offline
    Wow, dieses Skript ist ja der Hammer. Ich danke dir für die ausführliche Erklärung, ich denke, ich habs verstanden.

    Da ich jetzt erst wieder nach Hause gekommen bin und heute Abend noch Besuch empfange, kann ich das im Moment leider nicht testen (erst heute Nacht vermutlich ), werde das dann aber mit Freuden tun und ganz bestimmt werden sich da mir noch ein paar Fragen aufwerfen...

    Toll, wie einem hier geholfen wird, da kann man gar nicht genug danken!

    Bis später und liebe Grüße, Gladi

  2. View Forum Posts #22 Reply With Quote
    Provinzheld
    Join Date
    Feb 2016
    Location
    Dresden
    Posts
    282
     
    gladi1994 is offline
    Soo, bin leider doch erst heute wieder dazu gekommen, mit dem Script rumzubrobieren..

    Wollte mal testweise Folgendes ausprobieren, hab aber irgendwie schon geahnt, dass es so leicht nicht ist:

    Code:
    func int DMG_OnDmg(var int victimPtr, var int attackerPtr, var int dmg, var int dmgDescriptorPtr) {
        var oSDamageDescriptor dmgDesc; dmgDesc = _^(dmgDescriptorPtr);
        
        // Diese Funktion anpassen, wenn ihr den Schaden verändern wollt! 'dmg' ist der von Gothic berechnete Schaden
        // return dmg;
        
        if(Npc_IsPlayer(attackerPtr))
        {
            return 200;
        } 
        else 
        {
            return 5;
        };
    };
    Das sollte nur mal ein Test sein, ob ich so einfach abfragen kann, ob der Spieler der Angreifer ist. Aber beim Parsen meckert Gothic (wie ich es eigentlich schon erwartet hatte), dass der Parameter in "Npc_IsPlayer" falsch ist. (Normalerweise kommt da ja sowas rein wie self, other, hero oder so. Das sind Instanzen und attackerPtr ist eine Variable..)

    Es ist bestimmt leicht, aber ich komm da gerade nicht drauf.. Wie kann ich mit den Variablen den Angreifer / das Opfer abfragen?

  3. View Forum Posts #23 Reply With Quote
    Ritter Draxes's Avatar
    Join Date
    Aug 2007
    Location
    Mainz
    Posts
    1,471
     
    Draxes is online now
    Mit der Funktion MEM_PtrToInst(var int pointer) kannst du die Instanz des Pointers erhalten. In dem konkreten Fall kannst du dein Problem so lösen:

    Code:
    var c_npc victimNpc;
    victimNpc = MEM_PtrToInst(victimPtr);
    	
    var c_npc attackerNpc;
    attackerNpc = MEM_PtrToInst(attackerPtr);
    
    if (Npc_IsPlayer(attackerNpc)) {
        [...]
    };

  4. View Forum Posts #24 Reply With Quote
    Provinzheld
    Join Date
    Feb 2016
    Location
    Dresden
    Posts
    282
     
    gladi1994 is offline
    Dankeschön, das hat wunderbar funktioniert!

    Habe jetzt also die DMG_OnDmg Funktion so geschrieben:

    Code:
    func int DMG_OnDmg(var int victimPtr, var int attackerPtr, var int dmg, var int dmgDescriptorPtr) {
        var oSDamageDescriptor dmgDesc; dmgDesc = _^(dmgDescriptorPtr);
        
        // Diese Funktion anpassen, wenn ihr den Schaden verändern wollt! 'dmg' ist der von Gothic berechnete Schaden
        // return dmg;
        
        var c_npc victimNpc;
        victimNpc = MEM_PtrToInst(victimPtr);
        
        var c_npc attackerNpc;
        attackerNpc = MEM_PtrToInst(attackerPtr);
    
        if(Npc_IsPlayer(attackerNpc))
        {
            if (dmgDesc.spellID != 0)
            {
                var int rest;
                if(b_specialspell_damage(spellType) > 0)
                {
                    rest = b_spelldamage(spellType) % b_specialspell_damage(spellType);
                    dmg = b_spelldamage(spellType) + (b_spelldamage(spellType) / b_specialspell_damage(spellType));
                    if((rest * 2) >= b_specialspell_damage(spellType))
                    {
                        dmg += 1;
                    };
                }
                else
                {
                    dmg = b_spelldamage(spellType);
                };
                return dmg;
            }
            else
            {
            return dmg;
            };
        } 
        else 
        {
            return dmg;
        };
    };
    Eigentlich ist das nur die spl_damage Funktion nochmal kopiert (rot) und ein wenig angepasst. Diese wird, wie folgend im Code gezeigt, mit "var int spelltype" aufgerufen, was ich hier jetzt natürlich nicht kann. Nachfolgend nochmal die originale spl_damage Funktion zu Übersichtszwecken:

    Code:
    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;
    };
    Jetzt meckert Gothic beim Parsen, dass spellType ein "Unknown Identifier" ist...

    Hab auch mal versucht, statt des oben rot markierten mal direkt die Funktion spl_damage aufzurufen, aber dann bekomme ich einen Syntax Error...

    Hat jemand eine Ahnung, wo mein Fehler liegt?

  5. View Forum Posts #25 Reply With Quote
    Dea
    Join Date
    Jul 2007
    Posts
    10,200
     
    Lehona is online now
    Dein Code ist (für mich) ein wenig verwirrend, ich glaube du hast da irgendwo einen Knoten im Gedankengang. Hier mal ein Beispiel, wie ich es machen würde:


    Code:
    func int IsSpellAffectedByPerk(var int spellID) {
    	if (spellID == SPL_Zap)
    	|| (spellID == SPL_Firerain)
    	|| (...)
    	{
    		return true;
    	};
    	
    	return false;
    };
    
    
    func int DMG_OnDmg(var int victimPtr, var int attackerPtr, var int dmg, var int dmgDescriptorPtr) {
        var oSDamageDescriptor dmgDesc; dmgDesc = _^(dmgDescriptorPtr); 
        var c_npc victimNpc; victimNpc = MEM_PtrToInst(victimPtr);
        var c_npc attackerNpc; attackerNpc = MEM_PtrToInst(attackerPtr);
    
        if(Npc_IsPlayer(attackerNpc))
        {
            if (dmgDesc.spellID != 0)
            && (IsSpellAffectedByPerk(dmgDesc.spellID))
    	&& (HeroHasLearnedPerk()) 
    	{
    		return (dmg*110)/100;
    	}
    	else
    	{
    		return dmg;
    	};
             
        } 
        else 
        {
            return dmg;
        };
    };
    Das würde den Schaden der vom Perk beeinflussten Zauber um 10% erhöhen (Auf die Gefahr hin mich zu wiederholen: Die 10% beziehen sich auf den Schaden _nach_ der Rüstungsreduktion).

    Ich vermute, dass du anstatt spellType dmgDesc.spellID verwenden musst, aber ohne die entsprechenden b_*-Funktionen zu sehen kann ich das nicht wissen.

  6. View Forum Posts #26 Reply With Quote
    Provinzheld
    Join Date
    Feb 2016
    Location
    Dresden
    Posts
    282
     
    gladi1994 is offline
    Vielen Dank für deinen Vorschlag! Das ist eigentlich ja so einfach, wie du es schreibst, sorry, dass ich es so kompliziert mache..

    Ich habe ja wie gesagt die Skripte von Tricky (MinimodBalance) als Grundlage, um dort Fehler zu beheben und eine andere Mod mit einzubauen, daher bin ich auch noch nicht komplett zu 100% dahintergestiegen. Tricky hatte dort diese Perks so in etwa eingebaut und dementsprechend auch den Fehler, dass die NPCs auch von den stärkeren Zaubern profitieren, sobald der Held den Perk gelernt hat.

    Da in den Skripten schon fast alles soweit richtig und fertig ist, und eben nur die Abfrage fehlte, ob der Angreifer ein NPC oder der Held ist, wollte ich möglichst alles so lassen, um Trickys Arbeit nicht groß verändern zu müssen.

    Dein Code ist eigentlich total verständlich und leicht nachvollziehbar, und ich werde ihn vermutlich letztendlich auch benutzen, sofern ich es anders nicht hinbekomme, aber eigentlich sind mir wie gesagt schon alle Funktionen gegeben und ich müsste sie nur noch richtig in die DMG_OnDmg einbauen.

    Kann ja mal das Skript von Tricky hier noch zeigen, in dem die spl_damage() und alle anderen dafür relevanten Funktionen definiert sind (der relevante Code ist rot markiert):

    Code:
    const int SPL_Cost_Scroll = 5;
    const int SPL_COST_SEC_1 = 1;
    const int SPL_COST_SEC_2 = 2;
    const int SPL_COST_SEC_3 = 3;
    const int SPL_COST_SEC_4 = 4;
    const int SPL_COST_SEC_5 = 5;
    const int SPL_COST_SEC_6 = 6;
    const int BONUSDAMAGE_FIREMASTER = 1;
    const int BONUSDAMAGE_WATERMASTER = 1;
    const int BONUSDAMAGE_STORMMASTER = 1;
    var int trf_currentmana;
    var int areadamage;
    const int SPL_Cost_Firebolt = 5;
    const int SPL_Damage_Firebolt = 25;
    const int SPL_COST_InstantFireball = 15;
    const int SPL_DAMAGE_InstantFireball = 75;
    const int SPL_COST_ChargeFireball = 120;
    const int SPL_Damage_ChargeFireball = 80;
    const int STEP_ChargeFireball = 30;
    const int SPL_Cost_InstantFireStorm = 40;
    const int SPL_Damage_InstantFireStorm = 100;
    const int SPL_Damage_InstantFireStormB = 150;
    const int SPL_Damage_InstantFireStormP = 200;
    const int SPL_COST_Firestorm = 160;
    const int SPL_Damage_Firestorm = 100;
    const int SPL_Damage_FirestormB = 150;
    const int SPL_Damage_FirestormP = 200;
    const int STEP_Firestorm = 40;
    const int SPL_PYRO_DAMAGE_PER_SEC = 20;
    const int SPL_COST_SUMMONFIREGOLEM = 25;
    const int SPL_Cost_Firerain = 200;
    const int SPL_Damage_FireRain = 500;
    const int SPL_COST_MasterOfDisaster = 60;
    const int SPL_DAMAGE_MasterOfDisaster = 300;
    const int SPL_COST_Icebolt = 10;
    const int SPL_DAMAGE_Icebolt = 60;
    const int SPL_Cost_IceCube = 40;
    const int SPL_DAMAGE_ICECUBE = 60;
    const int SPL_FREEZE_DAMAGE = 2;
    const int SPL_TIME_FREEZE = 19;
    const int SPL_Cost_Icelance = 40;
    const int SPL_DAMAGE_Icelance = 100;
    const int SPL_Cost_WindFist = 40;
    const int SPL_Damage_Windfist = 40;
    const int STEP_WindFist = 10;
    const int SPL_Cost_Whirlwind = 30;
    const int SPL_DAMAGE_WHIRLWIND = 60;
    const int SPL_WIND_DAMAGE = 2;
    const int SPL_TIME_WHIRLWIND = 10;
    const int SPL_COST_SUMMONICEWOLF = 50;
    const int SPL_Cost_Geyser = 70;
    const int SPL_DAMAGE_Geyser = 150;
    const int SPL_Cost_Waterfist = 30;
    const int SPL_DAMAGE_Waterfist = 125;
    const int SPL_COST_SUMMONICEGOLEM = 25;
    const int SPL_Cost_Thunderstorm = 100;
    const int SPL_DAMAGE_Thunderstorm = 250;
    const int SPL_Cost_IceWave = 120;
    const int SPL_DAMAGE_ICEWAVE = 60;
    const int SPL_COST_ZORNADANOS = 60;
    const int SPL_DAMAGE_ZORNADANOS = 250;
    const int SPL_Cost_Zap = 10;
    const int SPL_Damage_Zap = 40;
    const int SPL_COST_ChargeZap = 80;
    const int SPL_Damage_ChargeZap = 50;
    const int STEP_ChargeZap = 20;
    const int SPL_Cost_LightningFlash = 40;
    const int SPL_Damage_LightningFlash = 150;
    const int SPL_ZAPPED_DAMAGE_PER_SEC = 2;
    const int SPL_TIME_SHORTZAPPED = 2;
    const int SPL_Cost_SummonGoblinSkeleton = 5;
    const int SPL_Cost_SummonWolf = 5;
    const int SPL_Cost_SummonSkeleton = 10;
    const int SPL_Cost_SummonGolem = 20;
    const int SPL_Cost_SummonDemon = 30;
    const int SPL_Cost_ArmyOfDarkness = 60;
    const int SPL_COST_SUMMONDEMONLORD = 40;
    const int SPL_Cost_DESTROYUNDEAD = 80;
    const int SPL_Damage_DESTROYUNDEAD = 1000;
    const int SPL_Cost_BreathOfDeath = 100;
    const int SPL_Damage_BreathOfDeath = 500;
    const int SPL_Cost_MassDeath = 200;
    const int SPL_Damage_MassDeath = 500;
    const int SPL_Cost_SuckEnergy = 60;
    const int SPL_DAMAGE_SUCKENERGY = 20;
    const int SPL_TIME_SuckEnergy = 9;
    const int SPL_Cost_Swarm = 20;
    const int SPL_DAMAGE_SWARM = 80;
    const int SPL_TIME_Swarm = 6;
    const int SPL_Cost_Greententacle = 30;
    const int SPL_DAMAGE_GREENTENTACLE = 0;
    const int SPL_TIME_Greententacle = 20;
    const int SPL_Cost_Inflate = 10;
    const int SPL_DAMAGE_INFLATE = 5;
    const int SPL_TIME_Inflate = 19;
    const int SPL_Cost_Energyball = 100;
    const int SPL_DAMAGE_Energyball = 250;
    const int SPL_Cost_SummonGuardian = 10;
    const int SPL_Cost_SummonZombie = 10;
    const int SPL_Cost_Skull = 100;
    const int SPL_Damage_Skull = 666;
    const int SPL_COST_ZEITSPALT = 150;
    const int SPL_Cost_PalLight = 5;
    const int SPL_Duration_LIGHT = 5;
    const int SPL_Cost_PalHolyBolt = 20;
    const int SPL_Damage_PalHolyBolt = 100;
    const int SPL_Cost_PalRepelEvil = 50;
    const int SPL_Damage_PalRepelEvil = 200;
    const int SPL_Cost_PalDestroyEvil = 80;
    const int SPL_Damage_PalDestroyEvil = 500;
    const int SPL_Cost_PalLightHeal = 30;
    const int SPL_Heal_PalLightHeal = 200;
    const int SPL_Cost_PalMediumHeal = 40;
    const int SPL_Heal_PalMediumHeal = 500;
    const int SPL_Cost_PalFullHeal = 50;
    const int SPL_Heal_PalFullHeal = 800;
    const int SPL_Cost_LIGHT = 5;
    const int SPL_Duration_PalLIGHT = 5;
    const int SPL_Cost_Sleep = 30;
    const int SPL_TIME_Sleep = 30;
    const int SPL_Cost_Charm = 10;
    const int SPL_Damage_Charm = 0;
    const int SPL_Cost_Fear = 30;
    const int SPL_TIME_Fear = 5;
    const int SPL_Cost_LightHeal = 30;
    const int SPL_Heal_LightHeal = 200;
    const int SPL_Cost_MediumHeal = 40;
    const int SPL_Heal_MediumHeal = 500;
    const int SPL_Cost_FullHeal = 50;
    const int SPL_Heal_FullHeal = 800;
    const int SPL_Cost_Shrink = 100;
    const int SPL_Cost_Teleport = 10;
    const int SPL_COST_EARTHQUAKE = 120;
    const int SPL_DAMAGE_EARTHQUAKE = 200;
    const int SPL_Cost_TrfSheep = 5;
    const int SPL_Cost_TrfScavenger = 5;
    const int SPL_Cost_TrfGiantRat = 5;
    const int SPL_Cost_TrfGiantBug = 10;
    const int SPL_Cost_TrfWolf = 5;
    const int SPL_Cost_TrfWaran = 10;
    const int SPL_Cost_TrfLurker = 15;
    const int SPL_Cost_TrfSnapper = 10;
    const int SPL_Cost_TrfWarg = 15;
    const int SPL_Cost_TrfFireWaran = 30;
    const int SPL_Cost_TrfShadowbeast = 20;
    const int SPL_Cost_TrfDragonSnapper = 30;
    const int SPL_DAMAGE_ICEBOLT2 = 90;
    const int SPL_COST_ORCFIREBALL = 25;
    const int SPL_DAMAGE_ORCFIREBALL = 100;
    const int SPL_COST_Deathbolt = 25;
    const int SPL_DAMAGE_Deathbolt = 150;
    const int SPL_COST_Deathball = 35;
    const int SPL_DAMAGE_Deathball = 200;
    const int SPL_COST_DEATHBALL_DMT = 35;
    const int SPL_DAMAGE_DEATHBALL_DMT = 200;
    const int SPL_COST_Concussionbolt = 40;
    const int SPL_DAMAGE_Concussionbolt = 200;
    const int SPL_Cost_SummonMud = 10;
    
    func int b_manacost(var int spellType)
    {
        if(spellType == SPL_Firebolt)
        {
            return SPL_Cost_Firebolt;
        };
        if(spellType == SPL_InstantFireball)
        {
            return SPL_COST_InstantFireball;
        };
        if(spellType == SPL_ChargeFireball)
        {
            return STEP_ChargeFireball;
        };
        if(spellType == SPL_Pyrokinesis)
        {
            return STEP_Firestorm;
        };
        if(spellType == SPL_Firestorm)
        {
            return SPL_Cost_InstantFireStorm;
        };
        if(spellType == SPL_SUMMONFIREGOLEM)
        {
            return SPL_COST_SUMMONFIREGOLEM;
        };
        if(spellType == SPL_Firerain)
        {
            return SPL_Cost_Firerain;
        };
        if(spellType == SPL_MasterOfDisaster)
        {
            return SPL_COST_MasterOfDisaster;
        };
        if(spellType == SPL_Icebolt)
        {
            return SPL_COST_Icebolt;
        };
        if(spellType == SPL_IceCube)
        {
            return SPL_Cost_IceCube;
        };
        if(spellType == SPL_IceLance)
        {
            return SPL_Cost_Icelance;
        };
        if(spellType == SPL_WindFist)
        {
            return STEP_WindFist;
        };
        if(spellType == SPL_Whirlwind)
        {
            return SPL_Cost_Whirlwind;
        };
        if(spellType == SPL_WaterFist)
        {
            return SPL_Cost_Waterfist;
        };
        if(spellType == SPL_Geyser)
        {
            return SPL_Cost_Geyser;
        };
        if(spellType == SPL_SUMMONICEWOLF)
        {
            return SPL_COST_SUMMONICEWOLF;
        };
        if(spellType == SPL_SUMMONICEGOLEM)
        {
            return SPL_COST_SUMMONICEGOLEM;
        };
        if(spellType == SPL_IceWave)
        {
            return SPL_Cost_IceWave;
        };
        if(spellType == SPL_Thunderstorm)
        {
            return SPL_Cost_Thunderstorm;
        };
        if(spellType == SPL_ZORNADANOS)
        {
            return SPL_COST_ZORNADANOS;
        };
        if(spellType == SPL_Zap)
        {
            return SPL_Cost_Zap;
        };
        if(spellType == SPL_ChargeZap)
        {
            return STEP_ChargeZap;
        };
        if(spellType == SPL_LightningFlash)
        {
            return SPL_Cost_LightningFlash;
        };
        if(spellType == SPL_SummonGoblinSkeleton)
        {
            return SPL_Cost_SummonGoblinSkeleton;
        };
        if(spellType == SPL_SummonWolf)
        {
            return SPL_Cost_SummonWolf;
        };
        if(spellType == SPL_SummonSkeleton)
        {
            return SPL_Cost_SummonSkeleton;
        };
        if(spellType == SPL_SummonGolem)
        {
            return SPL_Cost_SummonGolem;
        };
        if(spellType == SPL_SummonDemon)
        {
            return SPL_Cost_SummonDemon;
        };
        if(spellType == SPL_ArmyOfDarkness)
        {
            return SPL_Cost_ArmyOfDarkness;
        };
        if(spellType == SPL_SUMMONDEMONLORD)
        {
            return SPL_COST_SUMMONDEMONLORD;
        };
        if(spellType == SPL_DestroyUndead)
        {
            return SPL_Cost_DESTROYUNDEAD;
        };
        if(spellType == SPL_BreathOfDeath)
        {
            return SPL_Cost_BreathOfDeath;
        };
        if(spellType == SPL_MassDeath)
        {
            return SPL_Cost_MassDeath;
        };
        if(spellType == SPL_SuckEnergy)
        {
            return SPL_Cost_SuckEnergy;
        };
        if(spellType == SPL_Swarm)
        {
            return SPL_Cost_Swarm;
        };
        if(spellType == SPL_GreenTentacle)
        {
            return SPL_Cost_Greententacle;
        };
        if(spellType == SPL_SummonGuardian)
        {
            return SPL_Cost_SummonGuardian;
        };
        if(spellType == SPL_Energyball)
        {
            return SPL_Cost_Energyball;
        };
        if(spellType == SPL_SummonZombie)
        {
            return SPL_Cost_SummonZombie;
        };
        if(spellType == SPL_Skull)
        {
            return SPL_Cost_Skull;
        };
        if(spellType == SPL_ZEITSPALT)
        {
            return SPL_COST_ZEITSPALT;
        };
        if(spellType == SPL_Inflate)
        {
            return SPL_Cost_Inflate;
        };
        if(spellType == SPL_Earthquake)
        {
            return SPL_COST_EARTHQUAKE;
        };
        if(spellType == SPL_PalLight)
        {
            return SPL_Cost_PalLight;
        };
        if(spellType == SPL_PalLightHeal)
        {
            return SPL_Cost_PalLightHeal;
        };
        if(spellType == SPL_PalHolyBolt)
        {
            return SPL_Cost_PalHolyBolt;
        };
        if(spellType == SPL_PalMediumHeal)
        {
            return SPL_Cost_PalMediumHeal;
        };
        if(spellType == SPL_PalRepelEvil)
        {
            return SPL_Cost_PalRepelEvil;
        };
        if(spellType == SPL_PalFullHeal)
        {
            return SPL_Cost_PalFullHeal;
        };
        if(spellType == SPL_PalDestroyEvil)
        {
            return SPL_Cost_PalDestroyEvil;
        };
        if(spellType == SPL_Light)
        {
            return SPL_Cost_LIGHT;
        };
        if(spellType == SPL_LightHeal)
        {
            return SPL_Cost_LightHeal;
        };
        if(spellType == SPL_MediumHeal)
        {
            return SPL_Cost_MediumHeal;
        };
        if(spellType == SPL_FullHeal)
        {
            return SPL_Cost_FullHeal;
        };
        if(spellType == SPL_Sleep)
        {
            return SPL_Cost_Sleep;
        };
        if(spellType == SPL_Fear)
        {
            return SPL_Cost_Fear;
        };
        if(spellType == SPL_Shrink)
        {
            return SPL_Cost_Shrink;
        };
        if(spellType == SPL_Charm)
        {
            return SPL_Cost_Charm;
        };
        if(spellType == SPL_TrfSheep)
        {
            return SPL_Cost_TrfSheep;
        };
        if(spellType == SPL_TrfScavenger)
        {
            return SPL_Cost_TrfScavenger;
        };
        if(spellType == SPL_TrfGiantRat)
        {
            return SPL_Cost_TrfGiantRat;
        };
        if(spellType == SPL_TrfGiantBug)
        {
            return SPL_Cost_TrfGiantBug;
        };
        if(spellType == SPL_TrfWolf)
        {
            return SPL_Cost_TrfWolf;
        };
        if(spellType == SPL_TrfWaran)
        {
            return SPL_Cost_TrfWaran;
        };
        if(spellType == SPL_TrfSnapper)
        {
            return SPL_Cost_TrfSnapper;
        };
        if(spellType == SPL_TrfWarg)
        {
            return SPL_Cost_TrfWarg;
        };
        if(spellType == SPL_TrfFireWaran)
        {
            return SPL_Cost_TrfFireWaran;
        };
        if(spellType == SPL_TrfLurker)
        {
            return SPL_Cost_TrfLurker;
        };
        if(spellType == SPL_TrfShadowbeast)
        {
            return SPL_Cost_TrfShadowbeast;
        };
        if(spellType == SPL_TrfDragonSnapper)
        {
            return SPL_Cost_TrfDragonSnapper;
        };
        if(spellType == SPL_PalTeleportSecret)
        {
            return SPL_Cost_Teleport;
        };
        if(spellType == SPL_TeleportSeaport)
        {
            return SPL_Cost_Teleport;
        };
        if(spellType == SPL_TeleportMonastery)
        {
            return SPL_Cost_Teleport;
        };
        if(spellType == SPL_TeleportFarm)
        {
            return SPL_Cost_Teleport;
        };
        if(spellType == SPL_TeleportXardas)
        {
            return SPL_Cost_Teleport;
        };
        if(spellType == SPL_TeleportPassNW)
        {
            return SPL_Cost_Teleport;
        };
        if(spellType == SPL_TeleportPassOW)
        {
            return SPL_Cost_Teleport;
        };
        if(spellType == SPL_TeleportOC)
        {
            return SPL_Cost_Teleport;
        };
        if(spellType == SPL_TeleportOWDemonTower)
        {
            return SPL_Cost_Teleport;
        };
        if(spellType == SPL_TeleportTaverne)
        {
            return SPL_Cost_Teleport;
        };
        if(spellType == SPL_TELEPORTPORTAL)
        {
            return SPL_Cost_Teleport;
        };
        if(spellType == SPL_TELEPORTRITUAL)
        {
            return SPL_Cost_Teleport;
        };
        if(spellType == SPL_TELEPORTGESTATH)
        {
            return SPL_Cost_Teleport;
        };
        if(spellType == SPL_Deathbolt)
        {
            return SPL_COST_Deathbolt;
        };
        if(spellType == SPL_Deathball)
        {
            return SPL_COST_Deathball;
        };
        if(spellType == SPL_ConcussionBolt)
        {
            return SPL_COST_Concussionbolt;
        };
        if(spellType == SPL_DEATHBALL_DMT)
        {
            return SPL_COST_DEATHBALL_DMT;
        };
        if(spellType == SPL_ICEBOLT2)
        {
            return SPL_COST_Icebolt;
        };
        if(spellType == SPL_ORCFIREBALL)
        {
            return SPL_COST_ORCFIREBALL;
        };
        if(spellType == SPL_SummonMud)
        {
            return SPL_Cost_SummonMud;
        };
        if(spellType >= MAX_SPELL)
        {
            return 0;
        };
    };
    
    func int b_guildmana_cost(var int spellType)
    {
        if(GUILDFORSPELLS == GIL_KDF)
        {
            if((spellType == SPL_Firebolt) || (spellType == SPL_InstantFireball) || (spellType == SPL_ChargeFireball) || (spellType == SPL_Firestorm) || (spellType == SPL_Pyrokinesis) || (spellType == SPL_SUMMONFIREGOLEM) || (spellType == SPL_Firerain) || (spellType == SPL_MasterOfDisaster))
            {
                return 5;
            }
            else
            {
                return 4;
            };
        }
        else if(GUILDFORSPELLS == GIL_KDW)
        {
            if((spellType == SPL_Icebolt) || (spellType == SPL_IceCube) || (spellType == SPL_IceLance) || (spellType == SPL_SUMMONICEWOLF) || (spellType == SPL_Geyser) || (spellType == SPL_WaterFist) || (spellType == SPL_WindFist) || (spellType == SPL_Whirlwind) || (spellType == SPL_SUMMONICEGOLEM) || (spellType == SPL_Thunderstorm) || (spellType == SPL_IceWave) || (spellType == SPL_ZORNADANOS))
            {
                return 5;
            }
            else
            {
                return 4;
            };
        }
        else if(GUILDFORSPELLS == GIL_NOV)
        {
            return 3;
        }
        else
        {
            return 2;
        };
    };
    
    func int b_invmanacostrune(var int flagtype,var int spellType)
    {
        var int manacost;
        manacost = 0;
        manacost = b_manacost(spellType);
        if(manacost > SPL_Cost_Scroll)
        {
            return manacost;
        }
        else
        {
            return SPL_Cost_Scroll;
        };
    };
    
    func int b_invmanacostscroll(var int flagtype,var int spellType)
    {
        var int manacost;
        var int rest;
        manacost = 0;
        rest = 0;
        if(b_guildmana_cost(spellType) > 0)
        {
            rest = b_manacost(spellType) % b_guildmana_cost(spellType);
            manacost = b_manacost(spellType) / b_guildmana_cost(spellType);
        };
        if((rest * 2) >= b_guildmana_cost(spellType))
        {
            manacost += 1;
        };
        if(manacost > SPL_Cost_Scroll)
        {
            return manacost;
        }
        else
        {
            return SPL_Cost_Scroll;
        };
    };
    
    func int spl_cost_mana(var C_Npc slf,var int spellType)
    {
        var int manacost;
        var int rest;
        manacost = 0;
        rest = 0;
        if(Npc_GetActiveSpellIsScroll(slf))
        {
            if(b_guildmana_cost(spellType) > 0)
            {
                rest = b_manacost(spellType) % b_guildmana_cost(spellType);
                manacost = b_manacost(spellType) / b_guildmana_cost(spellType);
            };
            if((rest * 2) >= b_guildmana_cost(spellType))
            {
                manacost += 1;
            };
        }
        else
        {
            manacost = b_manacost(spellType);
        };
        if(manacost > SPL_Cost_Scroll)
        {
            return manacost;
        }
        else
        {
            return SPL_Cost_Scroll;
        };
    };
    
    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;
    };
    
    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(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;
    };
    
    func int spl_freezedamage()
    {
        if(PLAYER_TALENT_PERKS[8] == TRUE)
        {
            return SPL_FREEZE_DAMAGE + 2;
        }
        else
        {
            return SPL_FREEZE_DAMAGE;
        };
    };
    
    func int spl_heal_volume(var int spellType)
    {
        if(spellType == SPL_LightHeal)
        {
            return SPL_Heal_LightHeal;
        };
        if(spellType == SPL_MediumHeal)
        {
            return SPL_Heal_MediumHeal;
        };
        if(spellType == SPL_FullHeal)
        {
            return SPL_Heal_FullHeal;
        };
        if(spellType == SPL_PalLightHeal)
        {
            return SPL_Heal_PalLightHeal;
        };
        if(spellType == SPL_PalMediumHeal)
        {
            return SPL_Heal_PalMediumHeal;
        };
        if(spellType == SPL_PalFullHeal)
        {
            return SPL_Heal_PalFullHeal;
        };
        return 0;
    };
    
    func int spl_cost_sec(var int spellType)
    {
        if((spellType == SPL_SummonGoblinSkeleton) || (spellType == SPL_TrfSheep) || (spellType == SPL_TrfScavenger) || (spellType == SPL_TrfGiantRat))
        {
            return spl_cost_sec_1;
        };
        if((spellType == SPL_SummonWolf) || (spellType == SPL_SummonGuardian) || (spellType == SPL_TrfGiantBug) || (spellType == SPL_TrfWolf))
        {
            return spl_cost_sec_2;
        };
        if((spellType == SPL_SummonSkeleton) || (spellType == SPL_TrfWaran) || (spellType == SPL_TrfLurker))
        {
            return spl_cost_sec_3;
        };
        if((spellType == SPL_SummonZombie) || (spellType == SPL_SummonGolem) || (spellType == SPL_SUMMONFIREGOLEM) || (spellType == SPL_SUMMONICEGOLEM) || (spellType == SPL_TrfSnapper) || (spellType == SPL_TrfWarg))
        {
            return spl_cost_sec_4;
        };
        if((spellType == SPL_SummonDemon) || (spellType == SPL_TrfShadowbeast) || (spellType == SPL_TrfFireWaran))
        {
            return spl_cost_sec_5;
        };
        if((spellType == SPL_SUMMONDEMONLORD) || (spellType == SPL_ArmyOfDarkness) || (spellType == SPL_TrfDragonSnapper))
        {
            return spl_cost_sec_6;
        };
        return 0;
    };
    Aber wie gesagt, danke schon mal für deinen Lösungsvorschlag!! Wenn mir nichts anderes einfällt, wie ich die bereits vorhandenen Funktionen nutzen kann, werde ich es auf deine Art umsetzen und Trickys Funktionen auskommentieren!

  7. View Forum Posts #27 Reply With Quote
    Provinzheld
    Join Date
    Feb 2016
    Location
    Dresden
    Posts
    282
     
    gladi1994 is offline
    Hallo zusammen,

    bitte entschuldigt, dass ich den alten Thread wieder ausbuddle... Ich dachte damals, das Problem sei gelöst, meine sogar, ich hätte es getestet, aber anscheinend ist dem doch nicht so... Das beschriebene Problem besteht weiterhin, mein Code sieht jetzt so aus:

    Code:
    func int DMG_OnDmg(var int victimPtr, var int attackerPtr, var int dmg, var int dmgDescriptorPtr) 
    {
        var oSDamageDescriptor dmgDesc; dmgDesc = _^(dmgDescriptorPtr);
        
        // Diese Funktion anpassen, wenn ihr den Schaden verändern wollt! 'dmg' ist der von Gothic berechnete Schaden
        // return dmg;
        
        var c_npc victimNpc;
        victimNpc = MEM_PtrToInst(victimPtr);
        
        var c_npc attackerNpc;
        attackerNpc = MEM_PtrToInst(attackerPtr);
    
        if(Npc_IsPlayer(attackerNpc))
        {
            return dmg;
        } 
        else
        {
            if(dmgDesc.spellID != 0)
            {
                if (PLAYER_TALENT_PERKS[7] == TRUE
                    && ((dmgDesc.spellID == SPL_Firebolt)
                    || (dmgDesc.spellID == SPL_InstantFireball)
                    || (dmgDesc.spellID == SPL_ChargeFireball)
                    || (dmgDesc.spellID == SPL_Firestorm)
                    || (dmgDesc.spellID == SPL_Pyrokinesis)
                    || (dmgDesc.spellID == SPL_Firerain)
                    || (dmgDesc.spellID == SPL_MasterOfDisaster)))
                {
                    dmg = (spl_damage(dmgDesc.spellID) / 2);
                    dmg = ApplyMagicResistance(victimNpc, dmg);
                };
                if (PLAYER_TALENT_PERKS[8] == TRUE
                    && ((dmgDesc.spellID == SPL_Icebolt)
                    || (dmgDesc.spellID == SPL_IceLance)
                    || (dmgDesc.spellID == SPL_IceCube)
                    || (dmgDesc.spellID == SPL_IceWave)
                    || (dmgDesc.spellID == SPL_Geyser)
                    || (dmgDesc.spellID == SPL_WaterFist)
                    || (dmgDesc.spellID == SPL_ZORNADANOS)))
                {
                    dmg = (spl_damage(dmgDesc.spellID) / 2);
                    dmg = ApplyMagicResistance(victimNpc, dmg);
                };
                if (PLAYER_TALENT_PERKS[10] == TRUE
                    && ((dmgDesc.spellID == SPL_WindFist)
                    || (dmgDesc.spellID == SPL_Whirlwind)
                    || (dmgDesc.spellID == SPL_Thunderstorm)
                    || (dmgDesc.spellID == SPL_Zap)
                    || (dmgDesc.spellID == SPL_LightningFlash)
                    || (dmgDesc.spellID == SPL_ChargeZap)))
                {
                    dmg = (spl_damage(dmgDesc.spellID) / 2);
                    dmg = ApplyMagicResistance(victimNpc, dmg);
                };
                return dmg;
            }
            else
            {
                return dmg;
            };
        };
    };
    Wo ist da nur mein Denkfehler? Die Player_Talent_Perks 7,8 und 10 sind die drei Perks Feuermeister, Wassermeister und Sturmmeister. Sie sorgen dafür, dass der Schaden der jeweiligen Zauber (momentan noch) verdoppelt wird, wenn der Held sie lernt. Mit diesem Skript, dass mir Lehona vor einiger Zeit zur Verfügung gestellt hat, sollte herausgefunden werden, wer den Zauber gerade ausführt, um den Schadensbonus einzubeziehen oder eben nicht, wenn der Zauber nicht vom Held gewirkt wird. Leider profitieren allerdings immer noch alle Magiegegner, die die entsprechenden Zauber nutzen, von dem Schadensbonus, sobald der Held die jeweiligen Perks gelernt hat...

    Könnte hier vielleicht nochmal eine furchtbar nette Person drüberschauen, was da mein Fehler sein könnte? Allein finde ich ihn nicht, habe jetzt viel probiert und ewig getestet, bin mit meinem Latein am Ende..

    Da sag ich schon mal ein ganz großes Dankeschön im Voraus!

    Beste Grüße,
    Gladi

  8. View Forum Posts #28 Reply With Quote
    Ranger
    Join Date
    Feb 2017
    Posts
    147
     
    F a w k e s is offline
    If google translator does not lie - I understand that you are trying to adjust damage for certain spells, when damage is inflicted by player?
    In that case - this piece of code is saying - that if attacker is player - original dmg will be inflicted:
    Code:
    if(Npc_IsPlayer(attackerNpc))
    {
    return dmg;
    };
    You should probably change it like this:
    Code:
    func int DMG_OnDmg(var int victimPtr, var int attackerPtr, var int dmg, var int dmgDescriptorPtr) 
    {
        var oSDamageDescriptor dmgDesc; dmgDesc = _^(dmgDescriptorPtr);
        
        // Diese Funktion anpassen, wenn ihr den Schaden verändern wollt! 'dmg' ist der von Gothic berechnete Schaden
        // return dmg;
        
        var c_npc victimNpc;
        victimNpc = MEM_PtrToInst(victimPtr);
        
        var c_npc attackerNpc;
        attackerNpc = MEM_PtrToInst(attackerPtr);
    
        if(Npc_IsPlayer(attackerNpc))
        {
    //        return dmg;
    //    } 
    //    else
    //    {
            if(dmgDesc.spellID != 0)
            {
                if (PLAYER_TALENT_PERKS[7] == TRUE
                    && ((dmgDesc.spellID == SPL_Firebolt)
                    || (dmgDesc.spellID == SPL_InstantFireball)
                    || (dmgDesc.spellID == SPL_ChargeFireball)
                    || (dmgDesc.spellID == SPL_Firestorm)
                    || (dmgDesc.spellID == SPL_Pyrokinesis)
                    || (dmgDesc.spellID == SPL_Firerain)
                    || (dmgDesc.spellID == SPL_MasterOfDisaster)))
                {
                    dmg = (spl_damage(dmgDesc.spellID) / 2);
                    dmg = ApplyMagicResistance(victimNpc, dmg);
                };
                if (PLAYER_TALENT_PERKS[8] == TRUE
                    && ((dmgDesc.spellID == SPL_Icebolt)
                    || (dmgDesc.spellID == SPL_IceLance)
                    || (dmgDesc.spellID == SPL_IceCube)
                    || (dmgDesc.spellID == SPL_IceWave)
                    || (dmgDesc.spellID == SPL_Geyser)
                    || (dmgDesc.spellID == SPL_WaterFist)
                    || (dmgDesc.spellID == SPL_ZORNADANOS)))
                {
                    dmg = (spl_damage(dmgDesc.spellID) / 2);
                    dmg = ApplyMagicResistance(victimNpc, dmg);
                };
                if (PLAYER_TALENT_PERKS[10] == TRUE
                    && ((dmgDesc.spellID == SPL_WindFist)
                    || (dmgDesc.spellID == SPL_Whirlwind)
                    || (dmgDesc.spellID == SPL_Thunderstorm)
                    || (dmgDesc.spellID == SPL_Zap)
                    || (dmgDesc.spellID == SPL_LightningFlash)
                    || (dmgDesc.spellID == SPL_ChargeZap)))
                {
                    dmg = (spl_damage(dmgDesc.spellID) / 2);
                    dmg = ApplyMagicResistance(victimNpc, dmg);
                };
                return dmg;
            }
            else
            {
                return dmg;
            };
        };
        
        return dmg;
    };
    Last edited by F a w k e s; 06.11.2019 at 18:09.

  9. View Forum Posts #29 Reply With Quote
    Provinzheld
    Join Date
    Feb 2016
    Location
    Dresden
    Posts
    282
     
    gladi1994 is offline
    Hi F a w k e s

    first of all, thank you for your time and for analysing my problem.
    You are right, I want to adjust the damage of some spells. That even works already. When the player learns one of the talents, the damage of the specific spells changes. My problem is, that enemies, who also use this spells, also take advantage of it. That's what I want to change.

    And that's why I return normal damage for the player, and half the damage for any other npc using the spells when the player learned the talents. (... half the damage because I double the damage for the spells when the player learned the talent...)

    I hope you understand what I mean.

    Thank you anyway for your help, looking forward to seeing you again!

    Gladi

  10. View Forum Posts #30 Reply With Quote
    Ritter Draxes's Avatar
    Join Date
    Aug 2007
    Location
    Mainz
    Posts
    1,471
     
    Draxes is online now
    Hast du schon mal mit prints versucht zu schauen, an welcher Bedingung es scheitert? Das wäre auf jeden Fall interessant. Dann könnte man versuchen herauszufinden, wieso. Aber erstmal wäre wichtig: wo.

  11. View Forum Posts #31 Reply With Quote
    Ranger
    Join Date
    Feb 2017
    Posts
    147
     
    F a w k e s is offline
    Hi Gladi,
    Ah apologies - I completely missed that you are halving damage when attacker is not a player - in that case my suggestion is crap!

    What is this function ApplyMagicResistance doing exactly ?

  12. View Forum Posts #32 Reply With Quote
    Provinzheld
    Join Date
    Feb 2016
    Location
    Dresden
    Posts
    282
     
    gladi1994 is offline
    Quote Originally Posted by Draxes View Post
    Hast du schon mal mit prints versucht zu schauen, an welcher Bedingung es scheitert? Das wäre auf jeden Fall interessant. Dann könnte man versuchen herauszufinden, wieso. Aber erstmal wäre wichtig: wo.
    Das hab ich noch nicht. Ich bin aber auch gerade etwas ratlos, wo und in welcher Form ich die Prints einbauen sollte. Ich würde jetzt einfach nur an verschiedenen Stellen Nummern ausgeben lassen und schauen, welche Nummern nicht mehr ausgegeben werden? Ich probiere das mal, die Idee find ich gut, warum komme ich da nicht von selbst drauf?

    Vielen Dank!

    Quote Originally Posted by F a w k e s View Post
    Hi Gladi,
    Ah apologies - I completely missed that you are halving damage when attacker is not a player - in that case my suggestion is crap!

    What is this function ApplyMagicResistance doing exactly ?
    No problem, I highly welcome your work to translate my german text into english just for helping me!

    The ApplyMagicResistance function calculates the damage after armour. It is very short:

    Code:
    func int ApplyMagicResistance(var c_npc victimNpc, var int dmg)
    {
        dmg -= victimNpc.protection[PROT_MAGIC];
        return dmg;
    };
    Thank you anyway for your help!

    Gladi

  13. View Forum Posts #33 Reply With Quote
    Ritter Draxes's Avatar
    Join Date
    Aug 2007
    Location
    Mainz
    Posts
    1,471
     
    Draxes is online now
    Quote Originally Posted by gladi1994 View Post
    Das hab ich noch nicht. Ich bin aber auch gerade etwas ratlos, wo und in welcher Form ich die Prints einbauen sollte. Ich würde jetzt einfach nur an verschiedenen Stellen Nummern ausgeben lassen und schauen, welche Nummern nicht mehr ausgegeben werden?
    Ungefähr so hätte ich das auch versucht. Ist schon etwas herausgekommen? =)

  14. View Forum Posts #34 Reply With Quote
    Lehrling
    Join Date
    Aug 2018
    Posts
    32
     
    Feiger Scavenger is offline
    Grüße

    Mal kurz eine Frage abseits, da es ja so gesehen auch Zauber verstärkt.

    Wo wird festgelegt wie schnell ein Zauber fliegt? Wasserfaust bsp. ist ja ziemlich langsam oder Eisblock eben. gäbe es da eine möglichkeit den Zauber schneller fliegen zu lassen? und wo wird das eingetragen/geändert.

    Mfg.
    Feiger Scavenger

  15. View Forum Posts #35 Reply With Quote
    Sword Master
    Join Date
    Aug 2009
    Location
    Hessen
    Posts
    857
     
    Cryp18Struct is offline
    Geschwindigkeit des Projektils ist die Eigenschaft "emtrjeasevel" in der vfx Definition(visualfxinst.d):
    Code:
    INSTANCE spellFX_DestroyUndead_KEY_CAST (C_ParticleFXEmitKey)
    		{
    				visname_S 				= "MFX_DestroyUndead_CAST";
    				emtrjmode_s 			= "TARGET";
    		     		emtrjeasevel 			= 800.;
    	 			sfxid					= "MFX_DestroyUndead_Cast";
    	 			sfxisambient			= 1;
    				//emCreateFXID 			= "FX_CAST2";
    				emCheckCollision 		= 1;
    };
    Code:
    INSTANCE spellFX_IceCube_KEY_CAST (C_ParticleFXEmitKey)
    		{
    				visname_S 				= "MFX_ICECUBE_CAST";
    				emtrjmode_s 			= "TARGET";
    		     		emtrjeasevel 			= 1000.;
    	 			emCheckCollision		= 1;
    	 			sfxid					= "MFX_Icecube_cast";
    	 			sfxisambient			= 1;
    				//emCreateFXID 			= "FX_CAST2";
    				Lightrange				= 100;
    		};
    Eisblock ist ein bisschen schneller(1000) als Untote vernichten(800).

  16. View Forum Posts #36 Reply With Quote
    Provinzheld
    Join Date
    Feb 2016
    Location
    Dresden
    Posts
    282
     
    gladi1994 is offline
    Quote Originally Posted by Draxes View Post
    Ungefähr so hätte ich das auch versucht. Ist schon etwas herausgekommen? =)
    Ich habe leider erst heute wieder Zeit für ein paar Versuche. Habe schon etwas herumgespielt und dabei herausgefunden, dass (Print-)Befehle nach einem "return x;" nicht mehr ausgeführt werden, eigentlich ja logisch...

    Jedenfalls habe ich mal ganz einfach angefangen:

    Code:
    func int DMG_OnDmg(var int victimPtr, var int attackerPtr, var int dmg, var int dmgDescriptorPtr) 
    {
        var oSDamageDescriptor dmgDesc; dmgDesc = _^(dmgDescriptorPtr);
        
        // Diese Funktion anpassen, wenn ihr den Schaden verändern wollt! 'dmg' ist der von Gothic berechnete Schaden
        // return dmg;
        
        var c_npc victimNpc;
        victimNpc = MEM_PtrToInst(victimPtr);
        
        var c_npc attackerNpc;
        attackerNpc = MEM_PtrToInst(attackerPtr);
    
        if(Npc_IsPlayer(attackerNpc))
        {
            return dmg;
        } 
        else
        {
            if(dmgDesc.spellID != 0)
            {
                if (PLAYER_TALENT_PERKS[7] == TRUE
                    && ((dmgDesc.spellID == SPL_Firebolt)
                    || (dmgDesc.spellID == SPL_InstantFireball)
                    || (dmgDesc.spellID == SPL_ChargeFireball)
                    || (dmgDesc.spellID == SPL_Firestorm)
                    || (dmgDesc.spellID == SPL_Pyrokinesis)
                    || (dmgDesc.spellID == SPL_Firerain)
                    || (dmgDesc.spellID == SPL_MasterOfDisaster)))
                {
                    dmg = (spl_damage(dmgDesc.spellID) / 2);
                    dmg = ApplyMagicResistance(victimNpc, dmg);
                };
                if (PLAYER_TALENT_PERKS[8] == TRUE
                    && ((dmgDesc.spellID == SPL_Icebolt)
                    || (dmgDesc.spellID == SPL_IceLance)
                    || (dmgDesc.spellID == SPL_IceCube)
                    || (dmgDesc.spellID == SPL_IceWave)
                    || (dmgDesc.spellID == SPL_Geyser)
                    || (dmgDesc.spellID == SPL_WaterFist)
                    || (dmgDesc.spellID == SPL_ZORNADANOS)))
                {
                    dmg = (spl_damage(dmgDesc.spellID) / 2);
                    dmg = ApplyMagicResistance(victimNpc, dmg);
                };
                if (PLAYER_TALENT_PERKS[10] == TRUE
                    && ((dmgDesc.spellID == SPL_WindFist)
                    || (dmgDesc.spellID == SPL_Whirlwind)
                    || (dmgDesc.spellID == SPL_Thunderstorm)
                    || (dmgDesc.spellID == SPL_Zap)
                    || (dmgDesc.spellID == SPL_LightningFlash)
                    || (dmgDesc.spellID == SPL_ChargeZap)))
                {
                    dmg = (spl_damage(dmgDesc.spellID) / 2);
                    dmg = ApplyMagicResistance(victimNpc, dmg);
                };
                PrintScreen("Nummer 1",-1,-1,FONT_Screen,2);
                return dmg;
            }
            else
            {
                PrintScreen("       Nummer 2",-1,-1,FONT_Screen,2);
                return dmg;
            };
        };
    };
    Gibt wunderbar die "Nummer 2" aus, wenn mich ein Nahkampfangriff trifft. Bei einem Zauber (Feuerball) eines Orkschamanen (an dem hab ich's getestet) bekomme ich die "Nummer 1" ausgegeben, gefolgt von der "Nummer 2" etwa eine Sekunde später. Daraus ergibt sich meine erste Frage: Wieso bekomme ich beides ausgegeben? Der normale Feuerball brennt doch eigentlich nicht nach (wie beispielsweise die Angriffe eines Feuerwarans), ich erleide also nur das eine Mal Schaden, wo mich der Feuerball trifft und ich die Nummer 1 ausgegeben bekomme. Trotzdem folgt ohne weitere Treffer eine Sekunde später die Nummer 2?

    Aber immerhin weiß ich jetzt schon mal, dass die Funktion im Allgemeinen irgendwie "richtig" ausgeführt wird, also dass "if" und "else" erkannt werden...

    Edit: Die "1" bleibt ca. 2 Sekunden stehen, die "2" wird ca. 6 Sekunden auf dem Bildschirm angezeigt. Nach 4 Sekunden etwa hört die Brandanimation des Helden auf, 2 Sekunden später verschwindet auch die "2". Ich denke, es liegt also doch an diesem "Nachbrennen", obwohl es bei den Feuerbällen ja keinen Schaden verursacht.
    Last edited by gladi1994; 09.11.2019 at 14:15.

  17. View Forum Posts #37 Reply With Quote
    Sword Master
    Join Date
    Aug 2009
    Location
    Hessen
    Posts
    857
     
    Cryp18Struct is offline
    Da würde ich jetzt einbauen das sofort aus der Funktion gesprungen werden soll, falls der Schaden gleich 0 ist (weil in dem Fall willst du ja nicht den Schaden manipulieren).
    Code:
    func int DMG_OnDmg(var int victimPtr, var int attackerPtr, var int dmg, var int dmgDescriptorPtr) 
    {
        if(dmg == 0){
            printDebug("DMG_OnDmg: initial damage == 0, return.");
            return 0;
        };
        var oSDamageDescriptor dmgDesc; dmgDesc = _^(dmgDescriptorPtr);
    
    [...]

  18. View Forum Posts #38 Reply With Quote
    Provinzheld
    Join Date
    Feb 2016
    Location
    Dresden
    Posts
    282
     
    gladi1994 is offline
    Quote Originally Posted by Cryp18Struct View Post
    Da würde ich jetzt einbauen das sofort aus der Funktion gesprungen werden soll, falls der Schaden gleich 0 ist (weil in dem Fall willst du ja nicht den Schaden manipulieren).
    Code:
    func int DMG_OnDmg(var int victimPtr, var int attackerPtr, var int dmg, var int dmgDescriptorPtr) 
    {
        if(dmg == 0){
            printDebug("DMG_OnDmg: initial damage == 0, return.");
            return 0;
        };
        var oSDamageDescriptor dmgDesc; dmgDesc = _^(dmgDescriptorPtr);
    
    [...]
    Du hast Recht, werde ich noch machen, habe jetzt aber erstmal weiter herumexperimentiert und Erstaunliches herausgefunden... Ich kann nur schon mal vorweg sagen: Schande über mein Haupt...

    Der Code sieht jetzt mit den Printbefehlen so aus:
    Code:
    func int DMG_OnDmg(var int victimPtr, var int attackerPtr, var int dmg, var int dmgDescriptorPtr) 
    {
        var oSDamageDescriptor dmgDesc; dmgDesc = _^(dmgDescriptorPtr);
        
        // Diese Funktion anpassen, wenn ihr den Schaden verändern wollt! 'dmg' ist der von Gothic berechnete Schaden
        // return dmg;
        
        var c_npc victimNpc;
        victimNpc = MEM_PtrToInst(victimPtr);
        
        var c_npc attackerNpc;
        attackerNpc = MEM_PtrToInst(attackerPtr);
    
        if(Npc_IsPlayer(attackerNpc))
        {
            return dmg;
        } 
        else
        {
            if(dmgDesc.spellID != 0)
            {
                if (PLAYER_TALENT_PERKS[7] == TRUE
                    && ((dmgDesc.spellID == SPL_Firebolt)
                    || (dmgDesc.spellID == SPL_InstantFireball)
                    || (dmgDesc.spellID == SPL_ChargeFireball)
                    || (dmgDesc.spellID == SPL_Firestorm)
                    || (dmgDesc.spellID == SPL_Pyrokinesis)
                    || (dmgDesc.spellID == SPL_Firerain)
                    || (dmgDesc.spellID == SPL_MasterOfDisaster)))
                {
                    PrintScreen("3 - Spieler ist Feuermeister und benutzter Spell passt dazu",-1,40,FONT_Screen,5);
                    dmg = (spl_damage(dmgDesc.spellID) / 2);
                    dmg = ApplyMagicResistance(victimNpc, dmg);
                };
                if (PLAYER_TALENT_PERKS[8] == TRUE
                    && ((dmgDesc.spellID == SPL_Icebolt)
                    || (dmgDesc.spellID == SPL_IceLance)
                    || (dmgDesc.spellID == SPL_IceCube)
                    || (dmgDesc.spellID == SPL_IceWave)
                    || (dmgDesc.spellID == SPL_Geyser)
                    || (dmgDesc.spellID == SPL_WaterFist)
                    || (dmgDesc.spellID == SPL_ZORNADANOS)))
                {
                    PrintScreen("4 - Spieler ist Wassermeister und benutzter Spell passt dazu",-1,50,FONT_Screen,5);
                    dmg = (spl_damage(dmgDesc.spellID) / 2);
                    dmg = ApplyMagicResistance(victimNpc, dmg);
                };
                if (PLAYER_TALENT_PERKS[10] == TRUE
                    && ((dmgDesc.spellID == SPL_WindFist)
                    || (dmgDesc.spellID == SPL_Whirlwind)
                    || (dmgDesc.spellID == SPL_Thunderstorm)
                    || (dmgDesc.spellID == SPL_Zap)
                    || (dmgDesc.spellID == SPL_LightningFlash)
                    || (dmgDesc.spellID == SPL_ChargeZap)))
                {
                    PrintScreen("5 - Spieler ist Sturmmeister und benutzter Spell passt dazu",-1,60,FONT_Screen,5);
                    dmg = (spl_damage(dmgDesc.spellID) / 2);
                    dmg = ApplyMagicResistance(victimNpc, dmg);
                };
                PrintScreen("1 - Zauber",30,30,FONT_Screen,2);
                return dmg;
            }
            else
            {
                PrintScreen("2 - kein Zauber",50,30,FONT_Screen,2);
                return dmg;
            };
        };
    };
    Da ich mitunter Trickys Skripte der MinimodBalance verwende, benutzen die Orkschamanen einen eigens von Tricky erstellten Zauber, den "Orkischen Feuerball" (OrcFireball in den Skripten). Vermutlich wollte er damit schon damals des Problems Herr werden, dass u.a. die Schamanen auch von der Schadenserhöhung profitieren.
    Dieser Zauber soll 100 Schaden machen und gehört nicht zu den Zaubern, die von der Schadenserhöhung durch den Perk "Feuermeister" betroffen sind. Er ist quasi ein Duplikat des kleinen Feuerballs, der 100 statt 75 Schaden macht. Er hat eine eigene SpellID und eine eigene Rune. Die Schamenen haben ihn auch in der SelectSpell.d zugewiesen bekommen und wenn man mittels Marvin-Mode in einen Schamanen wechselt, hat er diesen Orkischen Feuerball auch im Inventar und angelegt. Komischerweise macht er, wenn ihn die AI zaubert, trotzdem den Schaden des normalen kleinen Feuerballs, nämlich 75. Und wenn der Perk Feuermeister vom Helden erlernt wurde, macht er eben den doppelten Schaden, obwohl es ein eigenständiger Zauber mit eigener SpellID ist, der nicht dem Perk zugeordnet ist!

    Ich habe eben auch mal mit einem Suchenden getestet, welcher den normalen kleinen Feuerball benutzt, der auch dem Helden zur Verfügung steht. Mit obigem Code bekam ich ohne den Perk Feuermeister die Nummern 1 und 2 wie vorhin ausgegeben. Beim Orkschamanen das gleiche.

    Mit
    dem Perk Feuermeister bekam ich beim Suchenden nun die Nummern 1, 2 und 3 ausgegeben (wurde also alles korrekt erkannt) und sogar der Schaden wurde korrekt berechnet, also der normale kleine Feuerball des Suchenden machte immernoch 75 Schaden. Das heißt, die Funktion funktioniert einwandfrei. Ich komme mir so dämlich vor, ich hätte einfach mal gleich mit dem Suchenden und dem normalen Feuerball testen sollen... Tut mir wirklich leid...

    Ebenso mit dem Perk Feuermeister wurden mir beim Orkschamanen (welcher den Duplikatsspell "OrcFireball" von Tricky benuzt) allerdings trotzdem nur die Nummern 1 und 2 ausgegeben, der Schaden wurde nicht halbiert und betrug 150 statt 75. Mal ganz abgesehen davon, dass Tricky für diesen Spell einen Standardschaden von 100 vorgesehen hat und dieser verdoppelt 200 wäre...

    Das löst natürlich mein Problem, was die Hauptsache ist. Ich muss also nur wieder die ganzen Standardspells einbauen und kann nun auf die Duplikate verzichten.

    Trotzdem drängen sich mir hier einige Fragen auf:
    1. Wieso wird der Schaden des Spells "OrcFireball" verdoppelt, obwohl er nicht den Spells des Perks "Feuermeister" zugeordnet ist?
    2. Wieso wird, wenn er schon fälschlicherweise dazugehört, der Schaden dann von der obigen Funktion nicht wieder halbiert und er als Spell des Perks "Feuermeister" anerkannt?
    (3. Wieso macht dieser Zauber 75 Standardschaden (150 mit Feuermeister), obwohl in den Skripten eindeutig 100 Schaden (200 mit Feuermeister) festgelegt ist?)

    Ich weiß, dass diese Fragen (besonders die dritte) vermutlich nicht ohne die Skripte beantwortet werden können, aber ich hoffe man versteht die Unlogik des Zusammenhangs der Fragen 1 und 2?

    Naja, langer Text, sorry dafür, war etwas umständlich zu formulieren, ich hoffe man konnte es trotzdem verstehen.

    Jedenfalls baue ich jetzt die Skripte auf die Originalspells zurück, denn damit funktioniert die Funktion ja.

    Vielen Dank auf jeden Fall euch allen für die Hilfe!
    Würde jetzt nur echt gern noch die obigen Fragen verstehen...

    Beste Grüße,

    Gladi
    Last edited by gladi1994; 09.11.2019 at 17:06.

  19. View Forum Posts #39 Reply With Quote
    Ritter Draxes's Avatar
    Join Date
    Aug 2007
    Location
    Mainz
    Posts
    1,471
     
    Draxes is online now
    zu 1) Kannst du mal den Code posten, wo du den Zauberschaden der entsprechenden Zauber verdoppelst?

    zu 2) Es werden nur die Zauber halbiert, die in deiner if-Abfrage stecken. Ein SPL_OrcishFireball oder so sehe ich dort nicht. Wahrscheinlich musst du diesen dort dann noch hinzufügen?

    zu 3) Kannst du den entsprechenden Code aus der B_SelectSpell.d posten, wo die Orkschamanen ihren Zauber zugewiesen bekommen? Vielleicht steckt dort irgendwo das Mysterium.

    Generell hätte ich dir empfohlen die Logik so umzuschreiben, dass du den Zauberschaden nicht an der einen Stelle verdoppelst und einer anderen wieder halbierst. Sondern am besten diese Funktion dafür nutzt, den Zauberschaden zu verdoppeln, wenn du die Perks gelernt hast. Dann können dort auch keine Fehler entstehen, dass du an der einen Stelle den Schaden verdoppelst und an der anderen vergisst, ihn wieder zu halbieren. Spart dir also viel Frust und Arbeit

  20. View Forum Posts #40 Reply With Quote
    Provinzheld
    Join Date
    Feb 2016
    Location
    Dresden
    Posts
    282
     
    gladi1994 is offline
    Quote Originally Posted by Draxes View Post
    zu 1) Kannst du mal den Code posten, wo du den Zauberschaden der entsprechenden Zauber verdoppelst?
    Ja, sehr gern.
    Spoiler:(zum lesen bitte Text markieren)
    Code:
    [...]
    
    var int player_talent_perks[11];
    const int BONUSDAMAGE_FIREMASTER = 1;
    const int BONUSDAMAGE_WATERMASTER = 1;
    const int BONUSDAMAGE_STORMMASTER = 1;
    const int SPL_COST_ORCFIREBALL = 25;
    const int SPL_DAMAGE_ORCFIREBALL = 100;
    
    [...]
    
    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;
    };
    
    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(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;
    };
    
    [...]
    Ich hoffe, ich habe an alle wichtigen Passagen zum Verstehen des Codes gedacht.

    Quote Originally Posted by Draxes View Post
    zu 2) Es werden nur die Zauber halbiert, die in deiner if-Abfrage stecken. Ein SPL_OrcishFireball oder so sehe ich dort nicht. Wahrscheinlich musst du diesen dort dann noch hinzufügen?
    Es kann so einfach sein... Mein Fehler, sorry. Ich frage mich, warum ich die einfachsten Dinge manchmal nicht sehe?

    Quote Originally Posted by Draxes View Post
    zu 3) Kannst du den entsprechenden Code aus der B_SelectSpell.d posten, wo die Orkschamanen ihren Zauber zugewiesen bekommen? Vielleicht steckt dort irgendwo das Mysterium.
    Auch das sehr gern.

    Spoiler:(zum lesen bitte Text markieren)
    Code:
    func int B_SelectSpell(var C_Npc slf,var C_Npc oth)
    {
    
        [...]
    
        if(slf.aivar[AIV_MM_REAL_ID] == ID_ORCSHAMAN)
        {
            if(Npc_HasItems(slf,itru_orcfireball) == 0)
            {
                CreateInvItems(slf,itru_orcfireball,1);
            };
            if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_MELEE)
            {
                B_ReadySpell(slf,SPL_ORCFIREBALL,SPL_COST_ORCFIREBALL);
                return TRUE;
            }
            else
            {
                return FALSE;
            };
        };
    
        [...]
    
    };

    Quote Originally Posted by Draxes View Post
    Generell hätte ich dir empfohlen die Logik so umzuschreiben, dass du den Zauberschaden nicht an der einen Stelle verdoppelst und einer anderen wieder halbierst. Sondern am besten diese Funktion dafür nutzt, den Zauberschaden zu verdoppeln, wenn du die Perks gelernt hast. Dann können dort auch keine Fehler entstehen, dass du an der einen Stelle den Schaden verdoppelst und an der anderen vergisst, ihn wieder zu halbieren. Spart dir also viel Frust und Arbeit
    Da gebe ich dir völlig Recht, im Nachhinein betrachtet ist das so wesentlich einfacher. Liegt an der Chronologie der Implementation. Erst wurde der Schaden verdoppelt und danach habe ich mitbekommen, dass auch der Schaden der NPC's verdoppelt wurde. Der musste dann wieder halbiert werden. An das Umschreiben hab ich nicht gedacht.

    Besten Dank nochmal für die Hilfe!

    Gladi
    Last edited by gladi1994; 09.11.2019 at 21:04.

Page 2 of 2 « First 12

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
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