| 05-19-2009, 09:10 AM | #1 |
JASS:library CIS initializer Init requires Table, UnitProperties, AutoIndex globals private constant integer BackpackId = 'BAG1' private constant integer MAX_ABILITIES = 6 endglobals globals private trigger Pickup = null private trigger Drop = null private boolean array COMBINED Table DataTable = 0 Table SetTable = 0 endglobals function UnitHasItemOfType takes unit whichUnit, integer itemId returns boolean local integer index = 0 local item indexItem loop set indexItem = UnitItemInSlot(whichUnit, index) if indexItem != null and GetItemTypeId(indexItem) == itemId then return true endif set index = index + 1 exitwhen index > 5 endloop return false endfunction function UnitHasItemOfTypeEnd takes bonus d returns boolean local integer i = 0 loop exitwhen i > 5 if d.Items[i] != 0 then return false endif set i = i + 1 endloop return true endfunction struct bonus static integer Count = 0 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 Items[6] integer array Abilities[MAX_ABILITIES] integer array AbilityLevels[MAX_ABILITIES] static method create takes integer ItemId returns bonus local bonus d = bonus.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 static method Item takes item whichItem returns bonus local bonus d = bonus.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 call SetItemUserData(whichItem,d) return d endmethod static method Recipe takes integer i1, integer i2, integer i3, integer i4, integer i5, integer i6 returns bonus local bonus d = bonus.allocate() local integer i = 0 set d.Items[0] = i1 set d.Items[1] = i2 set d.Items[2] = i3 set d.Items[3] = i4 set d.Items[4] = i5 set d.Items[5] = i6 loop set d.Abilities[i] = 0 set d.AbilityLevels[i] = 1 set i = i+1 exitwhen i >= MAX_ABILITIES endloop set SetTable[d.Count] = d set d.Count = d.Count + 1 return d endmethod endstruct //! textmacro CheckAndApply takes VALUE if d.$VALUE$ != 0 then set $VALUE$[u] = $VALUE$[u] + d.$VALUE$ 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, bonus 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, bonus 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 function UnitUnapplyAbilities takes unit U, bonus d returns nothing local integer i 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 function UnitApplyAbilities takes unit U, bonus d returns nothing local integer i 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 private function onPickup takes nothing returns boolean local bonus d = GetItemUserData(GetManipulatedItem()) local unit u = GetTriggerUnit() local integer i = 0 local integer r = 0 local integer array Items if d != 0 then call UnitApplyItem(u,d) else set d = DataTable[GetItemTypeId(GetManipulatedItem())] if d > 0 then call UnitApplyItem(u,d) else loop exitwhen r >= d.Count set d = SetTable[r] loop exitwhen i > 5 set Items[i] = d.Items[i] set i = i + 1 endloop set i = 0 loop exitwhen i > 5 if UnitHasItemOfType(u,Items[i]) then set Items[i] = 0 endif set i = i + 1 endloop set i = 0 loop exitwhen i > 5 if Items[i] != 0 then return false endif set i = i + 1 endloop if COMBINED[GetUnitId(u)] == false then call UnitApplyItem(u,d) set COMBINED[GetUnitId(u)] = true endif set r = r + 1 endloop endif endif set u = null return true endfunction private function onDrop takes nothing returns boolean local bonus d = GetItemUserData(GetManipulatedItem()) local unit u = GetTriggerUnit() local integer i = 0 local integer r = 0 local integer array Items if d != 0 then call UnitUnapplyItem(u, d) else set d = DataTable[GetItemTypeId(GetManipulatedItem())] if d > 0 then call UnitUnapplyItem(u, d) else loop exitwhen r >= d.Count set d = SetTable[r] loop exitwhen i > 5 set Items[i] = d.Items[i] set i = i + 1 endloop set i = 0 loop exitwhen i > 5 if UnitHasItemOfType(u,Items[i]) then set Items[i] = 0 endif set i = i + 1 endloop set i = 0 loop exitwhen i > 5 if Items[i] != 0 then return false endif set i = i + 1 endloop if COMBINED[GetUnitId(u)] then call UnitUnapplyItem(u,d) set COMBINED[GetUnitId(u)] = false endif set r = r + 1 endloop endif endif set u = null return true endfunction public struct backpack integer array ItemType[6] integer array Charges[6] integer array UserData[6] static method create takes unit u returns backpack local backpack d = backpack.allocate() local backpack c local bonus a local integer i = 0 local item it loop set it = UnitItemInSlot(u, i) if GetSpellAbilityId() == BackpackId then set a = GetItemUserData(it) set d.ItemType[i] = GetItemTypeId(it) set d.Charges[i] = GetItemCharges(it) set d.UserData[i] = GetItemUserData(it) if a == 0 then set c = DataTable[d.ItemType[i]] call UnitApplyItem(u,c) call RemoveItem(it) call UnitApplyAbilities(u,c) else call UnitApplyItem(u,a) call RemoveItem(it) call UnitApplyAbilities(u,a) endif else set d.ItemType[i] = 0 set d.Charges[i] = 0 set d.UserData[i] = 0 endif set i = i + 1 exitwhen i > 5 endloop set it = null return d endmethod implement AutoData endstruct function ActivateBackpack takes unit target returns nothing local backpack d1 local backpack d2 = backpack[target] local backpack d local integer i = 0 local item it local bonus a if GetSpellAbilityId() == BackpackId then set d1 = backpack.create(target) if d2 != 0 then loop if d2.ItemType[i] != 0 then set it = UnitAddItemById(target, d2.ItemType[i]) call SetItemCharges(it, d2.Charges[i]) call SetItemUserData(it, d2.UserData[i]) set d = DataTable[d2.ItemType[i]] call UnitUnapplyItem(target,d) call UnitApplyAbilities(target,d) endif set i = i + 1 exitwhen i > 5 endloop endif if d2 != 0 then call d2.destroy() endif set backpack[target] = d1 endif set it = null endfunction private function Init takes nothing returns nothing set Pickup = CreateTrigger() call TriggerRegisterAnyUnitEventBJ(Pickup, EVENT_PLAYER_UNIT_PICKUP_ITEM) call TriggerAddCondition(Pickup,Condition(function onPickup)) set Drop = CreateTrigger() call TriggerRegisterAnyUnitEventBJ(Drop, EVENT_PLAYER_UNIT_DROP_ITEM) call TriggerAddCondition(Drop, Condition(function onDrop)) endfunction endlibrary Right now everything works fine but Recipe making isn't MRI (Multiple Recipe Instanceable) Initialization of Recipes JASS:set d = bonus.Recipe('I002','I003','I004',0,0,0) set d.Damage = 500 set d = bonus.Recipe('I002','I003',0,0,0,0) set d.Str = 1000 Basically the first one will run but the second one will not run, do you all have any clues? |
