HomeUser Control Panel (unavailable in archive)ForumsTutorialsArt GalleryResourcesMaps

Item bonus not receiving

04-04-2009, 09:54 AM#1
wraithseeker
Collapse JASS:
library BackpackSys initializer Init requires PUI

globals
    //                                     vvvv
    private constant integer BackpackId = 'BAG1'
    private boolean drop = true
    //Change this to the ID of the backpack item in your map.
endglobals

private struct Data
    //! runtextmacro PUI()
    integer array ItemType[6]
    integer array Charges[6]
    integer array UserData[6]    
    
    static method create takes unit u returns Data
        local Data d = Data.allocate()
        local integer i = 0
        local item it
        local integer id
        loop
            set it = UnitItemInSlot(u, i)
            set id = GetItemTypeId(it)
            if GetSpellAbilityId() == BackpackId then
            if drop == true then
                set d.ItemType[i] = id
                set d.Charges[i] = GetItemCharges(it)
                set d.UserData[i] = GetItemUserData(it)
                set drop = false
                call RemoveItem(it)
                set drop = true
            else
                set d.ItemType[i] = 0
                set d.Charges[i] = 0
                set d.UserData[i] = 0
            endif
            endif
            set i = i + 1
            exitwhen i > 6
        endloop
        set it = null
        return d
    endmethod
endstruct

function ActivateBackpack takes unit target returns nothing
    local Data d1
    local Data d2 = Data[target]
    local integer i = 0
    local item it
    if GetSpellAbilityId() == BackpackId then
        set d1 = Data.create(target)
        if d2 != 0 then
            loop
                if d2.ItemType[i] != 0  then
                if drop == true then
                    set drop = false
                    set it = UnitAddItemById(target, d2.ItemType[i])
                    set drop = true
                    call SetItemCharges(it, d2.Charges[i])
                    call SetItemUserData(it, d2.UserData[i])
                    endif
                    
                endif
                set i = i + 1
                exitwhen i > 6
            endloop
        endif
        call d2.destroy()
        set Data[target] = d1
    endif
    set it = null
endfunction

private function Init takes nothing returns nothing
endfunction

endlibrary

Collapse JASS:
library Backpack initializer Init requires Table
    globals
        private constant integer MAX_ABILITIES = 6
        private trigger Pickup = null
        private trigger Drop = null
        private Table DataTable = 0
    endglobals

    struct data
        integer ItemId = 0
        integer Str = 0
        integer Agi = 0
        integer Int = 0
        real Damage = 0.00
        real Armor = 0.00
        real MaxLife = 0.00
        real MaxMana = 0.00
        real LifeRegen = 0.00
        real ManaRegen = 0.00
        real AttackSpeed = 0.00
        real MoveSpeed = 0.00
        integer array Abilities[MAX_ABILITIES]
        integer array AbilityLevels[MAX_ABILITIES]

       static method create takes integer ItemId returns data
            local data d = data.allocate()
            local integer i = 0

            loop
                set d.Abilities[i] = 0
                set d.AbilityLevels[i] = 1
                set i = i+1
                exitwhen i >= MAX_ABILITIES
            endloop

            set d.ItemId = ItemId
            set DataTable[ItemId] = d

            return d
        endmethod
    endstruct

    //! textmacro CheckAndApply takes VALUE
        if d.$VALUE$ != 0 then
           set $VALUE$[u] = $VALUE$[u] + d.$VALUE$ // set Property[Unit] = Property[Unit] + x
        endif
    //! endtextmacro

    //! textmacro CheckAndUnapply takes VALUE
        if d.$VALUE$ != 0 then
            set $VALUE$[u] = $VALUE$[u] + -1*d.$VALUE$
        endif
    //! endtextmacro

    function UnitApplyItem takes unit U, data d returns nothing
        local integer i

        //! runtextmacro CheckAndApply("Str")
        //! runtextmacro CheckAndApply("Agi")
        //! runtextmacro CheckAndApply("Int")
        //! runtextmacro CheckAndApply("Damage")
        //! runtextmacro CheckAndApply("Armor")
        //! runtextmacro CheckAndApply("MaxLife")
        //! runtextmacro CheckAndApply("MaxMana")
        //! runtextmacro CheckAndApply("LifeRegen")
        //! runtextmacro CheckAndApply("ManaRegen")
        //! runtextmacro CheckAndApply("AttackSpeed")
        //! runtextmacro CheckAndApply("MoveSpeed")

        if d.Abilities[0] != 0 then
            set i = 0
            loop
                call UnitAddAbility(U, d.Abilities[i])
                call SetUnitAbilityLevel(U, d.Abilities[i], d.AbilityLevels[i])

                set i = i+1
                exitwhen d.Abilities[i] == 0 or i >= MAX_ABILITIES
            endloop
        endif
    endfunction

    function UnitUnapplyItem takes unit U, data d returns nothing
        local integer i

        //! runtextmacro CheckAndUnapply("Str")
        //! runtextmacro CheckAndUnapply("Agi")
        //! runtextmacro CheckAndUnapply("Int")
        //! runtextmacro CheckAndUnapply("Damage")
        //! runtextmacro CheckAndUnapply("Armor")
        //! runtextmacro CheckAndUnapply("MaxLife")
        //! runtextmacro CheckAndUnapply("MaxMana")
        //! runtextmacro CheckAndUnapply("LifeRegen")
        //! runtextmacro CheckAndUnapply("ManaRegen")
        //! runtextmacro CheckAndUnapply("AttackSpeed")
        //! runtextmacro CheckAndUnapply("MoveSpeed")

        if d.Abilities[0] != 0 then
            set i = 0
            loop
                call UnitRemoveAbility(U, d.Abilities[i])

                set i = i+1
                exitwhen d.Abilities[i] == 0 or i >= MAX_ABILITIES
            endloop
        endif
    endfunction

    private function onPickup takes nothing returns nothing
        local data d = DataTable[GetItemTypeId(GetManipulatedItem())]

        if d > 0 then
            call UnitApplyItem(GetTriggerUnit(), d)
        endif
    endfunction

    private function onDrop takes nothing returns nothing
        local data d = DataTable[GetItemTypeId(GetManipulatedItem())]

        if d > 0 then
            call UnitUnapplyItem(GetTriggerUnit(), d)
        endif
    endfunction

    private function Init takes nothing returns nothing
        local data d
        set DataTable = Table.create()
        set d = data.create('I000')
        set d.Damage = 100
        set d.Agi = 1000
        set d.Armor = 50
        set Pickup = CreateTrigger()
        call TriggerRegisterAnyUnitEventBJ(Pickup, EVENT_PLAYER_UNIT_PICKUP_ITEM)
        call TriggerAddAction(Pickup, function onPickup)

        set Drop = CreateTrigger()
        call TriggerRegisterAnyUnitEventBJ(Drop, EVENT_PLAYER_UNIT_DROP_ITEM)
        call TriggerAddAction(Drop, function onDrop)
        
    endfunction
endlibrary

Is there any reason why when the unit casts the spell backpack, the items switch over to the "backpack" and doesn't receive the bonus? I did remove item and not drop item so the item bonus should stay instead of been removed.
04-05-2009, 02:29 AM#2
wraithseeker
bump
04-05-2009, 10:37 AM#3
Captain Griffen
Why should item bonuses stay after you remove the item?