| 04-04-2009, 09:54 AM | #1 |
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 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 |
bump |
| 04-05-2009, 10:37 AM | #3 |
Why should item bonuses stay after you remove the item? |
