SetUnitState() Life Healing, Incorrect Increase!

Discussion in 'JASS Zone' started by WolfieeifloW, Jun 17, 2011.

  1. WolfieeifloW

    WolfieeifloW WEHZ Helper

    Ratings:
    +372 / 0 / -0
    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 SetUnitState().
    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).
     
  2. rexpim

    rexpim Member

    Ratings:
    +8 / 0 / -0
  3. WolfieeifloW

    WolfieeifloW WEHZ Helper

    Ratings:
    +372 / 0 / -0
  4. rexpim

    rexpim Member

    Ratings:
    +8 / 0 / -0
    cant find the problem
     
  5. emjlr3

    emjlr3 Change can be a good thing Staff Member

    Ratings:
    +396 / 0 / -0
    the math is right - something else is contributing to the units hp change
     
    • Like Like x 1
  6. rexpim

    rexpim Member

    Ratings:
    +8 / 0 / -0
    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
     
  7. WolfieeifloW

    WolfieeifloW WEHZ Helper

    Ratings:
    +372 / 0 / -0
    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
     
  8. Solmyr

    Solmyr Active Member

    Ratings:
    +30 / 0 / -0
    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.
     
  9. rexpim

    rexpim Member

    Ratings:
    +8 / 0 / -0
    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
     
    • Like Like x 1
  10. WolfieeifloW

    WolfieeifloW WEHZ Helper

    Ratings:
    +372 / 0 / -0
    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.
     
  11. Solmyr

    Solmyr Active Member

    Ratings:
    +30 / 0 / -0
    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.
     
  12. WolfieeifloW

    WolfieeifloW WEHZ Helper

    Ratings:
    +372 / 0 / -0
    Warcraft works in mysterious ways :nuts:
    Thank you again Solmyr.
     

Share This Page