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 5 von 5
  1. Beiträge anzeigen #1 Zitieren
    Lehrling
    Registriert seit
    May 2020
    Beiträge
    32
     
    rezu93 ist offline

    G1 breath of death tick damage

    Greetings all,
    I want to make Breath od Death spell deal damage over time like it was supposed to be. I Discovered that in G1 this spell when f.e. orc priest hit the hero damage over time is dealt and the tick damage is from Npc_minimal_damage value. In G1 hero doesn't deal minimal damage so damage is 0. It could be easily done with onDamage func but after many tests I saw after spell hit npc the whole damage data is gone. Tick damage is working and it triggers OnDamage func but attacker is missing all visualFx data too also the damage is 0. The only data i got from damage descriptor is duration and interval numbers thats why ticking is working but everything else is gone.

    Any idea why data is missing? Burn effects from DAM_FIRE is not missing when tick damage is on with VOB_BURN visual FX and it should works similarly doesnt it?

    I want to have the attackerNpc and visual data to manipulate the damage in onDamage func and wondering how I can do this.

    Regards!

  2. Beiträge anzeigen #2 Zitieren
    Provinzheld Avatar von TopLayer
    Registriert seit
    Nov 2020
    Beiträge
    285
     
    TopLayer ist offline
    Use pVisualFX properties.

    From OnDamage hook:
    Code:
    desc.fTimeDuration: 340282346638528860000000000000000000000.000
    desc.fTimeInterval: 1000.000
    desc.fDamagePerInterval: 0.000
    desc.fDamageTotal: 0.000
    desc.strVisualFX:
    desc.pVisualFX->level: 1
    desc.pVisualFX->damage: 100.000
    damage: 0

  3. Beiträge anzeigen #3 Zitieren
    Lehrling
    Registriert seit
    May 2020
    Beiträge
    32
     
    rezu93 ist offline
    Zitat Zitat von TopLayer Beitrag anzeigen
    Use pVisualFX properties.

    From OnDamage hook:
    Code:
    desc.fTimeDuration: 340282346638528860000000000000000000000.000
    desc.fTimeInterval: 1000.000
    desc.fDamagePerInterval: 0.000
    desc.fDamageTotal: 0.000
    desc.strVisualFX:
    desc.pVisualFX->level: 1
    desc.pVisualFX->damage: 100.000
    damage: 0
    Code:
    classoSDamageDescriptor {    var int validFields;        //0 unsigned long dwFieldsValid;
    
        var int attackerVob;        //4 zCVob* pVobAttacker;
        var int attackerNPC;        //8 oCNpc* pNpcAttacker;
        var int hitVob;         //12 zCVob* pVobHit;
        var int hitPfx;         //16 oCVisualFX* pFXHit;
        var int itemWeapon;         //20 oCItem* pItemWeapon;
    
        var int spellID;        //24 unsigned long nSpellID;
        var int spellLevel;     //28 unsigned long nSpellLevel;
    
        var int dmgMode;        //32 unsigned long enuModeDamage;
        var int weaponMode;     //36 unsigned long enuModeWeapon;
    
        var int dmgArray[8];        //40 unsigned long aryDamage[oEDamageIndex_MAX];
        var int dmgTotal;       //72 float fDamageTotal;
        var int dmgMultiplier;      //76 float fDamageMultiplier;
    
        var int locationHit[3];     //80 zVEC3 vecLocationHit;
        var int directionFly[3];    //92 zVEC3 vecDirectionFly;
    
        var string visualFXStr;     //104 zSTRING strVisualFX;
    
        var int duration;       //124 float fTimeDuration;
        var int interval;       //128 float fTimeInterval;
        var int dmgPerInterval;     //132 float fDamagePerInterval;
    
        var int bitfield; // 1 -> Once, 2 -> finished, 4 -> isDead, 8 -> isUnconscious
        //group {
        //unsigned long bOnce          : 1;
        //unsigned long bFinished      : 1;
        //unsigned long bIsDead        : 1;
        //unsigned long bIsUnconscious : 1;
        //unsigned long lReserved      : 28;
        //};
        //var int lReserved;        //136
    
        var int azimuth;        //140 float fAzimuth;
        var int elevation;      //144 float fElevation;
        var int timeCurrent;        //148 float fTimeCurrent;
        var int dmgReal;        //152 float fDamageReal;
        var int dmgEffective;       //156 float fDamageEffective;
        var int dmgArrayEffective[8];   //160 unsigned long aryDamageEffective[oEDamageIndex_MAX];
        var int vobParticleFX;      //192 zCVob* pVobParticleFX;
        var int particleFX;     //196 zCParticleFX* pParticleFX;
        var int visualFX;       //200 oCVisualFX* pVisualFX;
    
    };
    everything value is 0 only visualFx isnot but the value is random on every spell hit and duration + interval is not 0 too, other data is missing

  4. Beiträge anzeigen #4 Zitieren
    Provinzheld Avatar von TopLayer
    Registriert seit
    Nov 2020
    Beiträge
    285
     
    TopLayer ist offline
    visualFX is a pointer to oCVisualFX object
    So, if it is not zero you probably can read it's properties:
    Code:
    var int vobAttacker;
    vobAttacker = MEM_ReadInt(visualFX + 1116);
    Number 1116 is result of converting hex value 45C to decimal.

  5. Beiträge anzeigen #5 Zitieren
    Lehrling
    Registriert seit
    May 2020
    Beiträge
    32
     
    rezu93 ist offline
    Zitat Zitat von TopLayer Beitrag anzeigen
    visualFX is a pointer to oCVisualFX object
    So, if it is not zero you probably can read it's properties:
    Code:
    var int vobAttacker;
    vobAttacker = MEM_ReadInt(visualFX + 1116);
    Number 1116 is result of converting hex value 45C to decimal.
    Thanks for help i tried to create new oCVisaulFx object and use visualFx as a pointer here then use it as a attackerPtr then PtrToInst as a vobAttacker but it wasnt effected.
    With your solution all is fine only first tick doesnt contains any data because it must be written before i think. Then rest of ticks got needed data so its very good

    It looks like this now:
    Code:
        var oSDamageDescriptor dmgDesc; dmgDesc = _^ (attackerPtr);
    
        var c_npc oth; oth =  _^(victimPtr);
        var c_npc slf; slf =  _^(dmgDesc.attackerNPC);
        
        //Don't change anything if damage was not caused by NPC
        if (dmgDesc.attackerNPC == 0)
        || (victimPtr == 0)
        {
            if (Hlp_StrCmp(MEM_ReadString(dmgDesc.visualFX + 1140), "spellFX_BreathOfDeath_Target"))
            {
                dmgDesc.attackerNPC = MEM_ReadInt(dmgDesc.visualFX + 1116);
                dmgDesc.attackerVob = MEM_ReadInt(dmgDesc.visualFX + 1116);
                dmgDesc.dmgMode     = MEM_ReadInt(dmgDesc.visualFX + 1324);
                dmgDesc.visualFXStr = MEM_ReadString(dmgDesc.visualFX + 1140);
            };
    
            return dmg;
        };
    
    For that first tick fix maybe i should use MEM_WriteInt? But which adresses IT would be?

    I think the problem with this is because my OnDamage func is the post one so changing some dmgDesc pointers wont make any effect, that's what Lehona said in his thread. So he wrote a hook for pre damage func to make it edit those pointers. I mean this:

    Code:
    var int _DMG_DmgDesc;
    
    func void _DMG_OnDmg_Post() {
        EDI = DMG_OnDmg(EBP, MEM_ReadInt(MEM_ReadInt(ESP+644)+8), EDI, _DMG_DmgDesc);
    };
    
    func void _DMG_OnDmg_Pre() {
        _DMG_DmgDesc = ESI; // I'm preeeeetty sure it won't get moved in the meantime...
    };
    
    func void InitDamage() {
        const int dmg = 0;
        if (dmg) { return; };
        HookEngineF(6736583/*0x66CAC7*/, 5, _DMG_OnDmg_Post);
        const int oCNpc__OnDamage_Hit = 6710800;
        HookEngineF(oCNpc__OnDamage_Hit, 7, _DMG_OnDmg_Pre);
        dmg = 1;
    };
    But unfortunately i have adresses only for hook post damage and dont have for pre for Gothic 1.
    Geändert von rezu93 (09.12.2022 um 22:09 Uhr)

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