- Joined
- Jul 18, 2010
- Messages
- 2,377
JASS:
//filter Out PowerUps
function GainItemCon takes nothing returns boolean
return not IsItemPowerup(GetManipulatedItem ())
endfunction
function GainItem takes nothing returns nothing
local item it = GetManipulatedItem ()
local unit picker = GetManipulatingUnit ()
local item slot
local integer loopA = 0
local integer oldCharges
local integer newCharges = GetItemCharges(it)
//Has Charges
if GetItemCharges (GetManipulatedItem ()) != 0 then
loop
exitwhen loopA > 5
set slot = UnitItemInSlot (picker, loopA)
//Same ItemType but not same Item
if (GetItemTypeId(it) == GetItemTypeId(slot) and slot != it) then
set oldCharges = GetItemCharges(slot)
if oldCharges + newCharges <= 3 then
call SetItemCharges(slot, newCharges +oldCharges)
call RemoveItem(it)
set it = null
exitwhen (true)
endif
endif
set loopA = loopA + 1
endloop
if it != null then
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0, 30.00, GetItemName(it) + "[" + I2S(newCharges ) +"]" )
else
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0, 30.00, GetItemName(slot) + "["+I2S(oldCharges)+ " -> " + I2S(GetItemCharges(slot)) +"]" )
endif
else
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0, 30.00, GetItemName(it) )
endif
set it = null
set picker = null
set slot = null
endfunction
//Works only if an Item is moved; Filters Items without Charges
function MoveItemCon takes nothing returns boolean
return ( GetIssuedOrderId() >= 852002 and GetIssuedOrderId() <= 852007 and GetItemCharges(GetOrderTargetItem()) != 0)
endfunction
function MoveItem takes nothing returns nothing
local item movingItem = GetOrderTargetItem()
local item swapedItem
local integer oldSlot
local integer newSlot = GetIssuedOrderId() - 852002
local integer loopA = 0
//Find OldItem Slot
loop
exitwhen loopA > 5
if UnitItemInSlot (GetTriggerUnit(), loopA) == movingItem then
set oldSlot = loopA
exitwhen (true)
endif
set loopA = loopA + 1
endloop
set swapedItem = UnitItemInSlot (GetTriggerUnit(), newSlot)
//Same ItemType & was Moved at all & Combined Charges below equal 3 ?
if ( GetItemTypeId (swapedItem) == GetItemTypeId(movingItem) and newSlot != oldSlot and GetItemCharges(movingItem) + GetItemCharges(swapedItem) <= 3) then
call SetItemCharges(movingItem, GetItemCharges(movingItem) + GetItemCharges(swapedItem))
call RemoveItem(swapedItem)
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0, 30.00, GetItemName(movingItem) + "[Combined into " + I2S(GetItemCharges(movingItem)) +"]" )
endif
set movingItem = null
set swapedItem = null
endfunction
//===========================================================================
function InitTrig_ItemStacking takes nothing returns nothing
//0 = Pick;
//1 = Move/Split
set udg_ItemSystem[0] = CreateTrigger()
set udg_ItemSystem[1] = CreateTrigger()
call TriggerAddAction( udg_ItemSystem[0], function GainItem )
call TriggerAddCondition( udg_ItemSystem[0], Condition (function GainItemCon) )
call TriggerRegisterAnyUnitEventBJ( udg_ItemSystem[0], EVENT_PLAYER_UNIT_PICKUP_ITEM )
call TriggerAddAction( udg_ItemSystem[1], function MoveItem )
call TriggerAddCondition( udg_ItemSystem[1], Condition (function MoveItemCon) )
call TriggerRegisterAnyUnitEventBJ( udg_ItemSystem[1], EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER )
endfunction
Edit 2: Saves the Triggers in Global Triggers udg_ItemSystem[0]/udg_ItemSystem[1]
JASS:
//filter Out PowerUps
function GainItemCon takes nothing returns boolean
return not IsItemPowerup(GetManipulatedItem ())
endfunction
function GainItem takes nothing returns nothing
local item it = GetManipulatedItem ()
local unit picker = GetManipulatingUnit ()
local item slot
local integer loopA = 0
local integer oldCharges
local integer newCharges = GetItemCharges(it)
//Has Charges
if GetItemCharges (GetManipulatedItem ()) != 0 then
loop
exitwhen loopA > 5
set slot = UnitItemInSlot (picker, loopA)
//Same ItemType but not same Item
if (GetItemTypeId(it) == GetItemTypeId(slot) and slot != it) then
set oldCharges = GetItemCharges(slot)
if oldCharges + newCharges <= 3 then
call SetItemCharges(slot, newCharges +oldCharges)
call RemoveItem(it)
set it = null
exitwhen (true)
endif
endif
set loopA = loopA + 1
endloop
if it != null then
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0, 30.00, GetItemName(it) + "[" + I2S(newCharges ) +"]" )
else
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0, 30.00, GetItemName(slot) + "["+I2S(oldCharges)+ " -> " + I2S(GetItemCharges(slot)) +"]" )
endif
else
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0, 30.00, GetItemName(it) )
endif
set it = null
set picker = null
set slot = null
endfunction
//Works only if an Item is moved; Filters Items without Charges
function MoveItemCon takes nothing returns boolean
return ( GetIssuedOrderId() >= 852002 and GetIssuedOrderId() <= 852007 and GetItemCharges(GetOrderTargetItem()) != 0)
endfunction
function MoveItem takes nothing returns nothing
local item movingItem = GetOrderTargetItem()
local item swapedItem
local integer oldSlot
local integer newSlot = GetIssuedOrderId() - 852002
local integer loopA = 0
local unit hero = GetTriggerUnit()
//Find OldItem Slot
loop
exitwhen loopA > 5
if UnitItemInSlot (hero, loopA) == movingItem then
set oldSlot = loopA
exitwhen (true)
endif
set loopA = loopA + 1
endloop
set swapedItem = UnitItemInSlot (hero, newSlot)
//Same ItemType & was Moved at all & Combined Charges below equal 3 ?
if ( GetItemTypeId (swapedItem) == GetItemTypeId(movingItem) and newSlot != oldSlot and GetItemCharges(movingItem) + GetItemCharges(swapedItem) <= 3) then
call SetItemCharges(movingItem, GetItemCharges(movingItem) + GetItemCharges(swapedItem))
call RemoveItem(swapedItem)
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0, 30.00, GetItemName(movingItem) + "[Combined into " + I2S(GetItemCharges(movingItem)) +"]" )
else
//Split?
if newSlot == oldSlot and GetItemCharges(movingItem) > 1 then
call SetItemCharges(movingItem, GetItemCharges(movingItem) - 1)
call UnitRemoveItem(hero, movingItem)
call UnitAddItemByIdSwapped( GetItemTypeId(movingItem), hero )
//Regain Old Item without Checking for Stacking
call DisableTrigger(udg_ItemSystem[0])
call UnitAddItem(hero, movingItem)
call EnableTrigger(udg_ItemSystem[0])
endif
endif
set movingItem = null
set swapedItem = null
endfunction
//===========================================================================
function InitTrig_ItemStacking takes nothing returns nothing
//0 = Pick;
//1 = Move/Split
set udg_ItemSystem[0] = CreateTrigger()
set udg_ItemSystem[1] = CreateTrigger()
call TriggerAddAction( udg_ItemSystem[0], function GainItem )
call TriggerAddCondition( udg_ItemSystem[0], Condition (function GainItemCon) )
call TriggerRegisterAnyUnitEventBJ( udg_ItemSystem[0], EVENT_PLAYER_UNIT_PICKUP_ITEM )
call TriggerAddAction( udg_ItemSystem[1], function MoveItem )
call TriggerAddCondition( udg_ItemSystem[1], Condition (function MoveItemCon) )
call TriggerRegisterAnyUnitEventBJ( udg_ItemSystem[1], EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER )
endfunction
Attachments
Last edited: