Portal-Zone Gothic-Zone Gothic II-Zone Gothic 3-Zone Gothic 4-Zone Modifikationen-Zone Download-Zone Foren-Zone RPG-Zone Almanach-Zone Spirit of Gothic

 

Ergebnis 1 bis 6 von 6
  1. Beiträge anzeigen #1 Zitieren
    Apprentice
    Registriert seit
    Oct 2012
    Beiträge
    33
     
    dorumia ist offline

    Function DMG_OnDmg - question about spell edit.

    Hello. I have a little question about function Dmg_OnDmg. If i remember, Lehona make that function, but it's possible to edit magic damage with her? Because actually i have something like this:
    Spoiler:(zum lesen bitte Text markieren)

    Code:
    funcintDMG_OnDmg(varint victimPtr, varint attackerPtr, varint dmg) 
    {
    if (!attackerptr) 
        {
    return dmg;
        };
    
    var c_npc slf; slf = _^(victimPtr);
    var c_npc oth; oth = _^(attackerptr);
    var C_NPC Bezio; Bezio = Hlp_GetNpc (PC_Hero);
    var c_item weapon; weapon = Npc_GetReadiedWeapon(oth);
    varint weaponDmg; weaponDmg = weapon.damageTotal;
    varint armor;
    varint activespell;
    varint spelldmg;
    
    if  ((Hlp_GetInstanceID(oth) == Hlp_GetInstanceID(Bezio)))
        {
    
    if (Npc_GetActiveSpell(oth) == SPL_IceBolt)
            && (Npc_GetLastHitSpellID(slf) == SPL_IceBolt)
            {
            spelldmg = SPL_Damage_IceBolt + oth.attribute[ATR_MANA_MAX];
            armor = slf.protection[PROT_MAGIC];
    
    if (slf.protection[PROT_MAGIC] > spelldmg)
                {
                dmg = (armor - spelldmg);
    PrintS_Extend(IntToString(dmg), COL_Yellow);
                }
    else
                {
                dmg = (spelldmg - armor/2);
    PrintS_Extend(IntToString(dmg), COL_Aqua);
                };      
            };      
    
    if (Npc_GetLastHitSpellID(slf) == SPL_Firebolt)
            && (Npc_GetActiveSpell(oth) == SPL_Firebolt)
            {
    varint SPL_FireBolt_total; SPL_FireBolt_total = SPL_Damage_Firebolt + oth.attribute[ATR_MANA_MAX];
    
    if (slf.protection[PROT_FIRE] > SPL_FireBolt_total)
                {
                dmg = (slf.protection[PROT_FIRE] - SPL_FireBolt_total);
    PrintS_Extend(IntToString(dmg), COL_Yellow);
                }
    else
                {
                dmg = (SPL_FireBolt_total - slf.protection[PROT_FIRE]/2);
    PrintS_Extend(IntToString(dmg), COL_Aqua);
                };
    
            }   
    elseif (Npc_GetLastHitSpellID(slf) == SPL_ChargeFireball)
            && (Npc_GetActiveSpell(oth) == SPL_ChargeFireball)
            {
    varint SPL_ChargeFireball_total; SPL_ChargeFireball_total = SPL_Damage_ChargeFireball + oth.attribute[ATR_MANA_MAX];
    
    if (slf.protection[PROT_FIRE] > SPL_ChargeFireball_total)
                {
                dmg = (slf.protection[PROT_FIRE] - SPL_ChargeFireball_total);
    PrintS_Extend(IntToString(dmg), COL_Yellow);
                }
    else
                {
                dmg = (SPL_ChargeFireball_total - slf.protection[PROT_FIRE]/2);
    PrintS_Extend(IntToString(dmg), COL_Aqua);
                };
    
            }
    elseif (Npc_GetLastHitSpellID(slf) == SPL_FireRain)
            && (Npc_GetActiveSpell(oth) == SPL_FireRain)
            {
    varint SPL_FireRain_total; SPL_FireRain_total = SPL_Damage_FireRain + oth.attribute[ATR_MANA_MAX];
    
    if (slf.protection[PROT_FIRE] > SPL_FireRain_total)
                {
                dmg = (slf.protection[PROT_FIRE] - SPL_FireRain_total);
    PrintS_Extend(IntToString(dmg), COL_Yellow);
                }
    else
                {
                dmg = (SPL_FireRain_total - slf.protection[PROT_FIRE]/2);
    PrintS_Extend(IntToString(dmg), COL_Aqua);
                };
    
            }
    elseif (Npc_GetLastHitSpellID(slf) == SPL_FireStorm)
            && (Npc_GetActiveSpell(oth) == SPL_FireStorm)
            {
    varint SPL_FireStorm_total; SPL_FireStorm_total = SPL_Damage_InstantFireStorm + oth.attribute[ATR_MANA_MAX];
    
    if (slf.protection[PROT_FIRE] > SPL_FireStorm_total)
                {
                dmg = (slf.protection[PROT_FIRE] - SPL_FireStorm_total);
    PrintS_Extend(IntToString(dmg), COL_Yellow);
                }
    else
                {
                dmg = (SPL_FireStorm_total - slf.protection[PROT_FIRE]/2);
    PrintS_Extend(IntToString(dmg), COL_Aqua);
                };
    
            }
    elseif (Npc_GetLastHitSpellID(slf) == SPL_InstantFireball)
            && (Npc_GetActiveSpell(oth) == SPL_InstantFireball)
            {
    varint SPL_InstantFireball_total; SPL_InstantFireball_total = SPL_Damage_InstantFireball + oth.attribute[ATR_MANA_MAX];
    
    if (slf.protection[PROT_FIRE] > SPL_InstantFireball_total)
                {
                dmg = (slf.protection[PROT_FIRE] - SPL_InstantFireball_total);
    PrintS_Extend(IntToString(dmg), COL_Yellow);
                }
    else
                {
                dmg = (SPL_InstantFireball_total - slf.protection[PROT_FIRE]/2);
    PrintS_Extend(IntToString(dmg), COL_Aqua);
                };
    
            }
    elseif (Npc_GetLastHitSpellID(slf) == SPL_Pyrokinesis)
            && (Npc_GetActiveSpell(oth) == SPL_Pyrokinesis)
            {
    varint SPL_Pyrokinesis_total; SPL_Pyrokinesis_total = SPL_Damage_FireStorm + oth.attribute[ATR_MANA_MAX];
    
    if (slf.protection[PROT_FIRE] > SPL_Pyrokinesis_total)
                {
                dmg = (slf.protection[PROT_FIRE] - SPL_Pyrokinesis_total);
    PrintS_Extend(IntToString(dmg), COL_Yellow);
                }
    else
                {
                dmg = (SPL_Pyrokinesis_total - slf.protection[PROT_FIRE]/2);
    PrintS_Extend(IntToString(dmg), COL_Aqua);
                };
    
            }
    elseif (Npc_GetLastHitSpellID(slf) == SPL_ChargeZap)
            && (Npc_GetActiveSpell(oth) == SPL_ChargeZap)
            {
    varint SPL_ChargeZap_total; SPL_ChargeZap_total = SPL_Damage_ChargeZap + oth.attribute[ATR_MANA_MAX];
    
    if (slf.protection[PROT_MAGIC] > SPL_ChargeZap_total)
                {
                dmg = (slf.protection[PROT_MAGIC] - SPL_ChargeZap_total);
    PrintS_Extend(IntToString(dmg), COL_Yellow);
                }
    else
                {
                dmg = (SPL_ChargeZap_total - slf.protection[PROT_MAGIC]/2);
    PrintS_Extend(IntToString(dmg), COL_Aqua);
                };
    
            }   
    elseif (Npc_GetLastHitSpellID(slf) == SPL_ChargeZap1)
            && (Npc_GetActiveSpell(oth) == SPL_ChargeZap1)
            {
    varint SPL_ChargeZap1_total; SPL_ChargeZap1_total = SPL_Damage_ChargeZap1 + oth.attribute[ATR_MANA_MAX];
    
    if (slf.protection[PROT_MAGIC] > SPL_ChargeZap1_total)
                {
                dmg = (slf.protection[PROT_MAGIC] - SPL_ChargeZap1_total);
    PrintS_Extend(IntToString(dmg), COL_Yellow);
                }
    else
                {
                dmg = (SPL_ChargeZap1_total - slf.protection[PROT_MAGIC]/2);
    PrintS_Extend(IntToString(dmg), COL_Aqua);
                };
    
            }
    elseif (Npc_GetLastHitSpellID(slf) == SPL_BreathOfDeath)
            && (Npc_GetActiveSpell(oth) == SPL_BreathOfDeath)
            {
    varint SPL_BreathOfDeath_total; SPL_BreathOfDeath_total = SPL_Damage_BreathOfDeath + oth.attribute[ATR_MANA_MAX];
    
    if (slf.protection[PROT_MAGIC] > SPL_BreathOfDeath_total)
                {
                dmg = (slf.protection[PROT_MAGIC] - SPL_BreathOfDeath_total);
    PrintS_Extend(IntToString(dmg), COL_Yellow);
                }
    else
                {
                dmg = (SPL_BreathOfDeath_total - slf.protection[PROT_MAGIC]/2);
    PrintS_Extend(IntToString(dmg), COL_Aqua);
                };
    
            }   
    elseif (Npc_GetLastHitSpellID(slf) == SPL_Geyser)
            && (Npc_GetActiveSpell(oth) == SPL_Geyser)
            {
    varint SPL_Geyser_total; SPL_Geyser_total = SPL_Damage_Geyser + oth.attribute[ATR_MANA_MAX];
    
    if (slf.protection[PROT_MAGIC] > SPL_Geyser_total)
                {
                dmg = (slf.protection[PROT_MAGIC] - SPL_Geyser_total);
    PrintS_Extend(IntToString(dmg), COL_Yellow);
                }
    else
                {
                dmg = (SPL_Geyser_total - slf.protection[PROT_MAGIC]/2);
    PrintS_Extend(IntToString(dmg), COL_Aqua);
                };
    
            };                                                                                                                      
    
        };
    
    if weapon.damagetype & DAM_EDGE
        {
            armor = slf.protection[PROT_EDGE];
        }
    elseif weapon.damagetype & DAM_POINT   
        { 
            armor = slf.protection[PROT_POINT]; 
        }
    elseif weapon.damagetype & DAM_BLUNT   
        { 
            armor = slf.protection[PROT_BLUNT]; 
        }
    elseif weapon.damagetype & DAM_FIRE    
        { 
            armor = slf.protection[PROT_FIRE]; 
        }       
    elseif weapon.damagetype & DAM_MAGIC   
        { 
            armor = slf.protection[PROT_MAGIC]; 
        };
    
    if (weapon.mainflag == ITEM_KAT_NF && weapon.cond_atr[2] == ATR_DEXTERITY)
        &&  ((Hlp_GetInstanceID(oth) == Hlp_GetInstanceID(Bezio)))
        {
    varint damage; damage = weaponDmg + oth.attribute[ATR_DEXTERITY];
    varint CritChances; CritChances = r_Max(100);
    
    if (CritChances<=oth.hitchance[NPC_TALENT_1H])
            || (CritChances<=oth.hitchance[NPC_TALENT_2H])
            {
                dmg = damage;   
    PrintS_Extend(IntToString(dmg), COL_RED);
            }
    elseif (armor > damage)
            {
                dmg = (weapondmg/2 + oth.attribute[ATR_DEXTERITY]/2);   
    PrintS_Extend(IntToString(dmg), COL_WHITE);
            }       
    else
            {
                dmg = (damage - armor/2);   
    PrintS_Extend(IntToString(dmg), COL_Orange);
            };
    
        }
    elseif (weapon.mainflag == ITEM_KAT_NF && weapon.cond_atr[2] == ATR_STRENGTH)
        &&  ((Hlp_GetInstanceID(oth) == Hlp_GetInstanceID(Bezio)))
        {
    varint damage_str; damage_str = weaponDmg + oth.attribute[ATR_STRENGTH];
    varint CritChances_str; CritChances_str = r_Max(100);
    
    if (CritChances_str<=oth.hitchance[NPC_TALENT_1H])
            || (CritChances_str<=oth.hitchance[NPC_TALENT_2H])
            {
                dmg = damage_str;   
    PrintS_Extend(IntToString(dmg), COL_RED);
            }
    elseif (armor > damage_str)
            {
                dmg = (weapondmg/2 + oth.attribute[ATR_STRENGTH]/2);    
    PrintS_Extend(IntToString(dmg), COL_WHITE);
            }
    else
            {
                dmg = (damage_str - armor/5);   
    PrintS_Extend(IntToString(dmg), COL_Yellow);
            };      
    
        };  
    
    if (weapon.flags & ITEM_CROSSBOW)
        &&  ((Hlp_GetInstanceID(oth) == Hlp_GetInstanceID(Bezio)))
        {
    varint damage1; damage1 = weaponDmg + oth.attribute[ATR_STRENGTH];
    varint CritChances1; CritChances1 = r_Max(100);
    
    if (CritChances1<=oth.hitchance[NPC_TALENT_CROSSBOW])
            {
                dmg = damage1;  
    PrintS_Extend(IntToString(dmg), COL_RED);
            }
    elseif (armor > damage1)
            {
                dmg = (weapondmg/2 + oth.attribute[ATR_STRENGTH]/2);    
    PrintS_Extend(IntToString(dmg), COL_WHITE);
            }       
    else
            {
                dmg = (damage1 - armor/2); 
    PrintS_Extend(IntToString(dmg), COL_Lime);
            };
    
        };
    
    if (weapon.flags & ITEM_BOW)
        &&  ((Hlp_GetInstanceID(oth) == Hlp_GetInstanceID(Bezio)))
        {
    varint damage2; damage2 = weaponDmg + oth.attribute[ATR_DEXTERITY];
    varint CritChances2; CritChances2 = r_Max(100);
    
    if (CritChances2<=oth.hitchance[NPC_TALENT_BOW])
            {
                dmg = damage2;  
    PrintS_Extend(IntToString(dmg), COL_RED);
            }
    elseif (armor > damage2)
            {
                dmg = (weapondmg/2 + oth.attribute[ATR_DEXTERITY]/2);   
    PrintS_Extend(IntToString(dmg), COL_WHITE);
            }       
    else
            {
                dmg = (damage2 - armor/2); 
    PrintS_Extend(IntToString(dmg), COL_Aqua);
            };
    
        };
    
    return dmg;
    };
    
    funcvoid_DMG_OnDmg() {
        EDI = DMG_OnDmg(EBP, MEM_ReadInt(MEM_ReadInt(ESP+644)+8), EDI);
    };
    funcvoidInitDamage() {
    constint dmg = 0;
    if (dmg) { return; };
    HookEngineF(6736583/*0x66CAC7*/, 5, _DMG_OnDmg);
        dmg = 1;
    };
    
    

    And if i use scaling weapon damage with attribute i don't have any problem(all work great and correct). But if i try make scaling with ex. Icebolt spell, scaling not work. Example - if i have 400 mana and Icebolt deal 50 damage, after my change npc, who don't have any protection from magic, should get 450 clear dmg. But actually lose only 50(so my formula not work). It's possible to add scaling magic damage in this function or it need more work? I use Ikarus/Lego. Geyser and Breath of Death don't work too. Fire spell and Chargezap work in half.
    Geändert von dorumia (26.06.2022 um 21:33 Uhr)

  2. Beiträge anzeigen #2 Zitieren
    Apprentice
    Registriert seit
    May 2017
    Beiträge
    38
     
    LootaBox ist offline
    I didn't fully read your code, but you have conditions such as

    Code:
    if (Npc_GetActiveSpell(oth) == SPL_IceBolt)
    && (Npc_GetLastHitSpellID(slf) == SPL_IceBolt)
    1. You don't want to use Npc_GetActiveSpell, because it will return the currently active spell - this could be different if the hero changes equipped spell while a spell projectile is in flight.
    2. I think Npc_GetLastHitSpellID only works under certain condition - if I remember correctly its when the spell causes (or can cause) a status/AI state such as Ice Cube. (not 100% sure)

    You get the spell ID from the damage descriptor:
    Code:
    dmgDesc.spellId
    And to save some headache you might want to do the following:
    Code:
    // If there is hitPfx but no spellId, probably AoE spell _SPREAD hitting other NPCs after a direct hit on NPC with the original projectile
    if (dmgDesc.hitPfx && dmgDesc.spellId <= 0) {
        var oCVisualFX hitPfx; hitPfx = _^(dmgDesc.hitPfx);
        if (!attackerPtr) {
            attackerPtr = hitPfx.inflictor;
        };
    };
    If the attacker ptr is still missing after this, I would just return the damage as is... Alternatively you could use this fix: https://forum.worldofplayers.de/foru...1#post26707746 (fixes some other stuff too, e.g. with Large Firestorm)

    You can also use weapon mode to figure out what the attack actually was

    Code:
    /** Weapon modes:
        None (0x00, for spells check spellId instead)
        Fist (0x01)
        Melee (0x02)
        Ranged (0x04)
    */
    dmgDesc.weaponMode
    Geändert von LootaBox (27.06.2022 um 08:33 Uhr)

  3. Beiträge anzeigen #3 Zitieren
    Apprentice
    Registriert seit
    Oct 2012
    Beiträge
    33
     
    dorumia ist offline
    Actually i make something like that:
    Code:
    Spoiler:(zum lesen bitte Text markieren)
    /// Calculate the damage, enhance it, ... func int DMG_Calculate(var oSDamageDescriptor dmgDesc, var int dmg_IsHit, var c_npc attackerNpc, var c_npc victimNpc, var int spellId, var int spellLvl) { var int dmg; dmg = 0; var int curDmg; curDmg = 0; var int prot; var C_Item weaponItem; weaponItem = MEM_NullToInst(); // We add all the damage types to a sum of damage repeat(i, DAM_INDEX_MAX); var int i; if ( (dmgDesc.dmgMode & (1 << i)) == (1 << i)) { curDmg = MEM_ReadStatArr(dmgDesc.dmgArray, i); prot = MEM_ReadStatArr(victimNpc.protection, i); if ((spellId > 0 && !dmgDesc.itemWeapon) && (i == DAM_INDEX_FIRE || i == DAM_INDEX_MAGIC)) { // TODO: Print("Spell hit"); if (spellID == 20) { curDmg = SPL_Damage_BreathOfDeath + hero.attribute[ATR_MANA_MAX]; }; // curDmg = Dmg_EnhanceMagicDamage(attackerNpc, victimNpc, curDmg, spellId, spellLvl); }; if (dmgDesc.itemWeapon) { // TODO: // if (Hlp_Is_oCItem(dmgDesc.itemWeapon)) { // weaponItem = MEM_PtrToInst(dmgDesc.itemWeapon); // curDmg = Dmg_EnhanceWeaponDamage(attackerNpc, victimNpc, curDmg, dmg_IsHit, weaponItem); // }; }; // Substract Protection from damage curDmg = ( curDmg - prot ); if (curDmg > 0) { dmg += curDmg; PrintS_Extend(IntToString(curDmg), COL_Aqua); }; }; end; // If we did not achieve a "critical hit", reduce damage accordingly if (!dmg_IsHit) { dmg = dmg * NPC_MINIMAL_PERCENT / 100; }; // We check if we actually got any damage done if (dmg < 0) { dmg = 0; }; // Apply min-damage *only* if not spell attack if ( (!dmgDesc.hitPfx) && (!dmgDesc.visualFX)) { if (dmg < NPC_MINIMAL_DAMAGE) { dmg = NPC_MINIMAL_DAMAGE; }; }; return dmg; }; func int DMG_OnDmg(var int victimPtr, var int attackerPtr, var int dmg, var int dmgDescriptorPtr, var int dmg_IsHit) { if (!victimPtr) { return dmg; }; var oSDamageDescriptor dmgDesc; dmgDesc = MEM_PtrToInst(dmgDescriptorPtr); // Just return falldamage if (dmgDesc.dmgMode == DAM_FALL) { return dmg; }; var int dmgIsPFX; dmgIsPFX = FALSE; var c_npc victimNpc; victimNpc = MEM_PtrToInst(victimPtr); var int spellId; spellId = dmgDesc.spellID; var int spellLvl; spellLvl = dmgDesc.spellLevel; var oCVisualFX visFx; if (!attackerptr) { attackerptr = dmgDesc.attackerNpc; }; if (dmgDesc.hitPfx && spellId <= 0) { visFx = MEM_PtrToInst(dmgDesc.hitPfx); // If we still have no attacker, try to take him from // Pfx inflictor if (!attackerptr) { attackerptr = visFx.inflictor; }; dmgIsPFX = TRUE; }; if (attackerptr) { var c_npc attackerNpc; attackerNpc = MEM_PtrToInst(attackerptr); // Invoke customized damage calculation if it's not a particle effect if (!dmgIsPFX) { dmg = DMG_Calculate(dmgDesc, dmg_IsHit, attackerNpc, victimNpc, spellId, spellLvl); }; }; return dmg; }; func void_DMG_OnDmg_Post() { const int dmgDesc = 0; const int dmg_IsHit = 0; dmg_IsHit = MEM_ReadInt((ESP + 640) - 356/* zBOOL bHasHit */); dmgDesc = MEM_ReadInt((ESP + 640) + 4/* &oSDamageDescriptor */); // oCNpc :: OnDamage_Hit ( oSDamageDescriptor& descDamage ) EDI = DMG_OnDmg(EBP, MEM_ReadInt(dmgDesc+8), EDI, +dmgDesc, +dmg_IsHit); }; func void InitDamage() { HookEngineF(6736583/*0x66CAC7*/, 5, _DMG_OnDmg_Post); };

    Now Icebolt spell deal correct damage(if hero have 400 mana and target have 0 protection from magic, he deal 650 damage - if he have 50 protection, he deal 600[but i don't know if it work only for Hero or other NPC too). But after change my last formula i have another problem. How i can now add weapon scaling? I mean, if we had weapon, which need Dexterity to wear, i want add scaling like "Weapon damage + hero dexterity - protection". Example... if weapon like Betty deal 130 damage and need 110 dexterity to wear, i want something like "130/2 damage + 110/2 dexterity(from hero) =
    protection - 120 damage(if enemy have more prot than total damage = 300 - 120 = 180) or
    130 damage(from weapon) + 110 dexterity(from hero) = 240 damage - protection/2, if enemy have less prot than total damage(240-140/2 = 170). I know it's stupid question, but thanks for your help anyway.

  4. Beiträge anzeigen #4 Zitieren
    Apprentice
    Registriert seit
    Oct 2012
    Beiträge
    33
     
    dorumia ist offline
    Spoiler:(zum lesen bitte Text markieren)
    Code:
    /// Calculate the damage, enhance it, ...
    funcintDMG_Calculate(var oSDamageDescriptor dmgDesc, varint dmg_IsHit, var c_npc attackerNpc, var c_npc victimNpc, varint spellId, varint spellLvl) {
    varint dmg;    dmg = 0;
    varint curDmg; curDmg = 0;
    varint prot;
    
    var C_Item weaponItem; weaponItem = MEM_NullToInst();
    
    // We add all the damage types to a sum of damage
    repeat(i, DAM_INDEX_MAX); varint i;
    if ( (dmgDesc.dmgMode & (1 << i)) == (1 << i)) {
                curDmg = MEM_ReadStatArr(dmgDesc.dmgArray,     i);
                prot   = MEM_ReadStatArr(victimNpc.protection, i);
    
    if ((spellId > 0 && !dmgDesc.itemWeapon) 
                && (i == DAM_INDEX_FIRE || i == DAM_INDEX_MAGIC)) {
    // TODO:
    Print("Spell hit");
    if (spellID == 43)
                    {
                        curDmg = SPL_Damage_BreathOfDeath + hero.attribute[ATR_MANA_MAX];
                    }
    elseif (spellID == 20)
                    {
                        curDmg = SPL_Damage_IceBolt + hero.attribute[ATR_MANA_MAX];
                    };
    // curDmg = Dmg_EnhanceMagicDamage(attackerNpc, victimNpc, curDmg, spellId, spellLvl);
                };
    if (dmgDesc.itemWeapon) {
    // TODO:
    if((dmgDesc.weaponMode == 2) || (dmgDesc.weaponMode == 4))
                    {
    var c_item wpn; wpn = Npc_GetReadiedWeapon(hero);
    varint wpnDmg; wpnDmg = wpn.damageTotal;
    varint att_need; att_need = wpn.cond_atr[2];
    
    if (att_need == ATR_STRENGTH)
                    {
                        curDmg = (wpnDmg+ hero.attribute[ATR_STRENGTH]);
                    }
    elseif (att_need == ATR_DEXTERITY)
                    {
                        curDmg = (wpnDmg+ hero.attribute[ATR_DEXTERITY]);   
                    };
    
    varint ChanceForCrit; ChanceForCrit = 0;
    
    if (wpn.flags & ITEM_2HD_AXE || wpn.flags & ITEM_2HD_SWD)
                        { 
                            ChanceForCrit = hero.HitChance[NPC_TALENT_2H];
                        };
    
    if (wpn.flags & ITEM_AXE || wpn.flags & ITEM_SWD)
                        { 
                            ChanceForCrit = hero.HitChance[NPC_TALENT_1H];
                        };
    
    if (wpn.flags & ITEM_BOW)
                        { 
                            ChanceForCrit = hero.HitChance[NPC_TALENT_BOW];
                        };
    
    if (wpn.flags & ITEM_CROSSBOW)
                        { 
                            ChanceForCrit = hero.HitChance[NPC_TALENT_CROSSBOW];
                        };
    
    /*                  if(r_MinMax(1,100) <= chanceForCrit)
                        {
                            dmg += (curDmg *2);
                            PrintS_Extend(IntToString(dmg), COL_Red);
                        }
                        else
                        {
                            dmg += curDmg;
                            PrintS_Extend(IntToString(curDmg), COL_Aqua);       
                        };                              
    */
                };
            };
    // Substract Protection from damage
    //curDmg = ( curDmg - prot );
    
    varint critDmg_STR; critDmg_STR = (wpnDmg + hero.attribute[ATR_STRENGTH]);
    varint critDmg_DEX; critDmg_DEX = (wpnDmg + hero.attribute[ATR_DEXTERITY]);
    varint curDmg_STR; curDmg_STR = (wpnDmg + hero.attribute[ATR_STRENGTH]);
    varint curDmg_DEX; curDmg_DEX = (wpnDmg + hero.attribute[ATR_DEXTERITY]);
    
                curDmg_STR += curDmg_STR;
                curDmg_DEX += curDmg_DEX;
    
    if(r_MinMax(1,100) <= chanceForCrit)
                {
    if (att_need == ATR_STRENGTH)
                    {
                    dmg += critDmg_STR;
    PrintS_Extend(IntToString(dmg), COL_Red);
                    }
    elseif (att_need == ATR_DEXTERITY)
                    {
                    dmg += critDmg_DEX;
    PrintS_Extend(IntToString(dmg), COL_Green);                 
                    };
    
                };
    
    //Test obrażeń - 100 siły, 100 obrażeń broni, 150 pancerza
    //Trafienie krytyczne = obrażenia broni + siła postaci - pancerz/2
    //Trafienie przebija pancerz = obrażenia broni + siła postaci - pancerz/5
    //Trafienie nie przebija pancerza = obrażenia broni + siła postaci
    
    if (curDmg_STR > prot)
                {
    Print("Dmg more than armor");
    
                    dmg += (curDmg_STR - prot);
    PrintS_Extend(IntToString(dmg), COL_Yellow);    
                }
    elseif (curDmg_DEX > prot)
                {
                    Print("Dmg more than armor");
    
                    dmg += (curDmg_DEX - prot);
    
    PrintS_Extend(IntToString(dmg), COL_Aqua);              
                }
    else
                {
    if ( (!dmgDesc.hitPfx) && (!dmgDesc.visualFX)) 
                    {
    if (dmg < NPC_MINIMAL_DAMAGE) 
                        {
    Print("Dmg less than armor");    
    
                        dmg = (wpnDmg/2 + hero.attribute[ATR_STRENGTH]/2);
    PrintS_Extend(IntToString(dmg), COL_WHITE);
                        };  
                    };              
                };
    
            };
    
        End;
    // If we did not achieve a "critical hit", reduce damage accordingly
    /*    if (!dmg_IsHit) {
            dmg = dmg * NPC_MINIMAL_PERCENT / 100;
        };
    */
    // We check if we actually got any damage done
    if (dmg < 0) {
            dmg = 0;
        };
    
    // Apply min-damage *only* if not spell attack
    /*    if ( (!dmgDesc.hitPfx) && (!dmgDesc.visualFX)) {
            if (dmg < NPC_MINIMAL_DAMAGE) {
                dmg = NPC_MINIMAL_DAMAGE + hero.attribute[ATR_STRENGTH]/2;
                PrintS_Extend(IntToString(dmg), COL_WHITE);
            };
        };
    */
    return dmg;
    };
    
    funcintDMG_OnDmg(varint victimPtr, varint attackerPtr, varint dmg, varint dmgDescriptorPtr, varint dmg_IsHit) {    
    if (!victimPtr) { return dmg; };
    
    var oSDamageDescriptor dmgDesc; dmgDesc = MEM_PtrToInst(dmgDescriptorPtr);
    
    // Just return falldamage
    if (dmgDesc.dmgMode == DAM_FALL) {
    return dmg;
        };
    
    varint dmgIsPFX;               dmgIsPFX = FALSE;
    var c_npc victimNpc;            victimNpc = MEM_PtrToInst(victimPtr);
    varint spellId;                spellId = dmgDesc.spellID;
    varint spellLvl;               spellLvl = dmgDesc.spellLevel;
    var oCVisualFX visFx;
    
    if (!attackerptr) {
            attackerptr = dmgDesc.attackerNpc;
        };
    
    if (dmgDesc.hitPfx && spellId <= 0) {
            visFx = MEM_PtrToInst(dmgDesc.hitPfx);
    
    // If we still have no attacker, try to take him from
    // Pfx inflictor
    if (!attackerptr) {
                attackerptr = visFx.inflictor;
            };
    
            dmgIsPFX = TRUE;
        };
    
    if (attackerptr)
        {
    var c_npc attackerNpc; attackerNpc = MEM_PtrToInst(attackerptr);
    
    // Invoke customized damage calculation if it's not a particle effect
    if (!dmgIsPFX) {
                dmg = DMG_Calculate(dmgDesc, dmg_IsHit, attackerNpc, victimNpc, spellId, spellLvl);
            };
        };
    
    return dmg;
    };
    
    funcvoid_DMG_OnDmg_Post() {
    constint dmgDesc = 0;
    constint dmg_IsHit = 0;
        dmg_IsHit = MEM_ReadInt((ESP + 640) - 356/* zBOOL bHasHit */);
        dmgDesc = MEM_ReadInt((ESP + 640) + 4/* &oSDamageDescriptor */); // oCNpc :: OnDamage_Hit ( oSDamageDescriptor& descDamage )
        EDI = DMG_OnDmg(EBP, MEM_ReadInt(dmgDesc+8), EDI, +dmgDesc, +dmg_IsHit);
    };
    
    funcvoidInitDamage() {
    HookEngineF(6736583/*0x66CAC7*/, 5, _DMG_OnDmg_Post);
    
    };
    
    

    Now i have script like this. But how i can set it for only player? Because actually even npc are scaled with my stats.

  5. Beiträge anzeigen #5 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    You can use
    Code:
    if !Npc_IsPlayer(attackerNpc) { return dmg; }
    at the top of DMG_OnDmg, to make sure your code is only run if the player is attacking, otherwise the damage stays as normal.

  6. Beiträge anzeigen #6 Zitieren
    Apprentice
    Registriert seit
    Oct 2012
    Beiträge
    33
     
    dorumia ist offline
    Code:
    funcintDMG_OnDmg(varint victimPtr, varint attackerPtr, varint dmg, varint dmgDescriptorPtr, varint dmg_IsHit) {    
    //if (!victimPtr) { return dmg; };
    
    
    var oSDamageDescriptor dmgDesc; dmgDesc = MEM_PtrToInst(dmgDescriptorPtr);
    
    // Just return falldamage
    if (dmgDesc.dmgMode == DAM_FALL) {
    return dmg;
        };
    
    varint dmgIsPFX;               dmgIsPFX = FALSE;
    var c_npc victimNpc;            victimNpc = MEM_PtrToInst(victimPtr);
    varint spellId;                spellId = dmgDesc.spellID;
    varint spellLvl;               spellLvl = dmgDesc.spellLevel;
    var oCVisualFX visFx;
    
    if !Npc_IsPlayer(attackerNpc) 
        { 
    return dmg; 
        };
    
    if (!attackerptr) {
            attackerptr = dmgDesc.attackerNpc;
        };
    
    if (dmgDesc.hitPfx && spellId <= 0) {
            visFx = MEM_PtrToInst(dmgDesc.hitPfx);
    
    // If we still have no attacker, try to take him from
    // Pfx inflictor
    if (!attackerptr) {
                attackerptr = visFx.inflictor;
            };
    
            dmgIsPFX = TRUE;
        };
    
    if (attackerptr)
        {
    var c_npc attackerNpc; attackerNpc = MEM_PtrToInst(attackerptr);
    
    // Invoke customized damage calculation if it's not a particle effect
    if (!dmgIsPFX) {
                dmg = DMG_Calculate(dmgDesc, dmg_IsHit, attackerNpc, victimNpc, spellId, spellLvl);
            };
        };
    
    return dmg;
    };
    
    
    After adding new condition i don't get any print or something.

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