SetUnitState() Life Healing, Incorrect Increase!

WolfieeifloW

WEHZ Helper
Reaction score
372
I didn't want to just add this question into my other thread (Since that's against the rules :cool:) so I posted this.
I have a spell that heals the hero for 3% health when it procs.

So, I've used [ljass]SetUnitState()[/ljass].
Here's the line of code it uses:
JASS:
private function Heal takes nothing returns real
    return 0.03
endfunction

call BJDebugMsg(R2S(GetUnitState(d.attacker, UNIT_STATE_MAX_LIFE) * Heal()))
call SetUnitState(d.attacker, UNIT_STATE_LIFE, GetUnitState(d.attacker, UNIT_STATE_LIFE) + (GetUnitState(d.attacker, UNIT_STATE_MAX_LIFE) * Heal()))

The BJ displays 19.5.
However, here's my results from testing.

The hero has 650HP maximum.
The hero started at 366 current HP.
Ideally, he should have been healed up to 385HP with the spell.
Instead, after the spell goes off, he is healed up to 416HP.
Which means he healed for 50HP, instead of 19HP.

Am I missing something here?
What I'm thinking that code should do is:
Get the unit's current life, then add (maxHP * 0.03).
 

emjlr3

Change can be a good thing
Reaction score
395
the math is right - something else is contributing to the units hp change
 

rexpim

Member
Reaction score
8
just for the fun, set the str of the hero to 0, and hp reg to 0 and see if it was hp reg that was making diference
 

WolfieeifloW

WEHZ Helper
Reaction score
372
HP regen is 0.00, and HP regen/point of Strength is 0.00.
Here's the whole trigger:
JASS:
scope ROTFC initializer ROTFCInit

    globals
        private constant string rotfcString = "innerfire"
        private group inc = CreateGroup()
    endglobals
    
    private struct data
        unit attacker
        unit dummy
        integer str
        real heal
        timer t
        
        method onDestroy takes nothing returns nothing
            call ReleaseTimer(.t)
        endmethod
    endstruct

    private function Chance takes integer level returns integer
        return 100//level * 1
    endfunction
    
    private function Heal takes nothing returns real
        return 0.03
    endfunction
    
    private function RemoveStr takes nothing returns nothing
        local data d = GetTimerData(GetExpiredTimer())
        
        call SetHeroStr(d.attacker, d.str, true)
        call GroupRemoveUnit(inc, d.attacker)
        call d.destroy()
    endfunction
    
    private function Conditions takes nothing returns boolean
        local data d = data.create()
        set d.attacker = GetAttacker()
        set d.str = GetHeroStr(d.attacker, true)
        set d.heal = GetUnitState(d.attacker, UNIT_STATE_MAX_LIFE) * Heal()
                
        if (GetUnitAbilityLevel(d.attacker, rotfc) > 0 and GetRandomInt(0, 100) <= Chance(GetUnitAbilityLevel(d.attacker, rotfc)) and IsUnitInGroup(d.attacker, inc) == false) then
            call GroupAddUnit(inc, d.attacker)
            set d.dummy = CreateUnit(GetOwningPlayer(d.attacker), dummyID, GetUnitX(d.attacker), GetUnitY(d.attacker), bj_UNIT_FACING)
            call UnitAddAbility(d.dummy, rotfcBuff)
            call SetUnitAbilityLevel(d.dummy, rotfcBuff, 1)
            call IssueTargetOrder(d.dummy, rotfcString, d.attacker)
            call UnitApplyTimedLife(d.dummy, 'BTLF', 0.01)
            call SetHeroStr(d.attacker, R2I(d.str * 1.15), false)
            call BJDebugMsg(R2S(d.heal))
            call SetUnitState(d.attacker, UNIT_STATE_LIFE, GetUnitState(d.attacker, UNIT_STATE_LIFE) + d.heal)
            set d.t = NewTimer()
            call SetTimerData(d.t, d)
            call TimerStart(d.t, 5., false, function RemoveStr)
        endif
        return false
    endfunction
    

    private function ROTFCInit takes nothing returns nothing
        local trigger t = CreateTrigger()
        local integer index = 0
        
        loop
            call TriggerRegisterPlayerUnitEvent(t, Player(index), EVENT_PLAYER_UNIT_ATTACKED, null)
            set index = index + 1
            exitwhen index == bj_MAX_PLAYER_SLOTS
        endloop
        call TriggerAddCondition(t, Condition(function Conditions))
        set t = null
    endfunction
    
endscope
 

Solmyr

Ultra Cool Member
Reaction score
30
It's because you're adding strength directly to the unit (you know, strength increases HP as well).

Try storing the HP of the unit before adding the strength, and apply the heal according to the previously stored value.
 

rexpim

Member
Reaction score
8
got it
call SetHeroStr(d.attacker, R2I(d.str * 1.15), false) Increases max hp and will increase max healing value Im right?
edit didnt saw earlier post XD
 

WolfieeifloW

WEHZ Helper
Reaction score
372
Hmm..
I took that into account, and it still shouldn't have healed for as much as it did.
Although storing it beforehand worked..

Thanks everyone for your time.
 

Solmyr

Ultra Cool Member
Reaction score
30
Hmm..
I took that into account, and it still shouldn't have healed for as much as it did.
Although storing it beforehand worked..

Thanks everyone for your time.
No, it's not what you're thinking about.

Say, 1 point of strength increases HP by 20. Now, if your unit has 50/100 HP, and you add 5 strength to it, it'd end up with 150/200 HP (and when you apply the heal, it'd end up with even more). Even if you added the strenght via something like BonusMod, it'd have ended up with 100/200 (plus the heal ...), so that wouldn't solve the problem either.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top