Name | Type | is_array | initial_value |
all | group | No | |
group | group | No | |
group_items | group | No | |
hash | hashtable | No | |
item_loc | location | No | |
ItemPickup__AddUnit | boolean | No | |
ItemPickup__Radius | real | No | |
ItemPickup__Unit | unit | No | |
ItemPickup_Index | integer | No | |
ItemPickup_Max | integer | No | |
ItemPickup_Rect | rect | Yes | |
ItemPickup_Timer | timer | No | |
ItemPickup_Unit | unit | Yes | |
Location | location | No | |
range | real | No | |
ScaleSize | real | No | 100.00 |
u | unit | No | UnitNull |
u_loc | location | No | |
Untitled_Variable_001 | abilcode | No | A03K |
//===============================================================================
// ItemPickup. Version 1.0
//===============================================================================
//
// Automatically pickup items for a unit in a configurable radius.
//
// Furthermore the system automatically clean invalid units ( removed )
// from the stack. Ergo no extra cleanup from your side is required.
//
// Note: ItemPickup doesn't clean powerup- and dead items!
// Therefore you should consider importing the following system aswell:
// - ItemCleanup: hiveworkshop.com/threads/item-cleanup-1-2.201057/
//
// Import instructions:
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
// • Copy this trigger into your map.
//
// API:
// ¯¯¯¯
// unit udg_ItemPickup_Unit
// • The unit you wish to add / remove.
//
// real udg_ItemPickup_Radius
// • The desired pickup radius.
//
// boolean udg_ItemPickup_AddUnit
// • Determines whether the unit should be added or removed.
//
// Trigger - Run ItemPickup JASS <gen> ( Ignoring/Checking conditions )
// • Executes your settings.
//
// User settings:
// ==============
// Set the timer interval in which nearby items are enumerated.
//
constant function ItemPickup_GetTimerTimeout takes nothing returns real
return 0.1
endfunction
// Define the item filter for picked up items
// • A is widget alive check is done internally.
//
function ItemPickup_FilterItem takes unit picker, item whichItem returns boolean
return true
endfunction
//===============================================================================
// ItemPickup source code. Make changes carefully.
//===============================================================================
function ItemPickup_EnumItems takes nothing returns nothing
local item i = GetFilterItem()
if GetWidgetLife(i) > 0.405 and ItemPickup_FilterItem(udg_ItemPickup_Unit[udg_ItemPickup_Index], i) then
call UnitAddItem(udg_ItemPickup_Unit[udg_ItemPickup_Index], i)
endif
set i = null
endfunction
function ItemPickup_GetIndexByUnit takes unit whichUnit returns integer
local integer index = 0
loop
exitwhen index == udg_ItemPickup_Max
if udg_ItemPickup_Unit[index] == whichUnit then
return index
endif
set index = index + 1
endloop
return -1
endfunction
function ItemPickup_Clear takes unit whichUnit returns nothing
local integer index = ItemPickup_GetIndexByUnit(whichUnit)
if index != -1 then
set udg_ItemPickup_Max = udg_ItemPickup_Max - 1
set udg_ItemPickup_Unit[index] = udg_ItemPickup_Unit[udg_ItemPickup_Max]
set udg_ItemPickup_Rect[index] = udg_ItemPickup_Rect[udg_ItemPickup_Max]
call RemoveRect(udg_ItemPickup_Rect[udg_ItemPickup_Max])
set udg_ItemPickup_Rect[udg_ItemPickup_Max] = null
set udg_ItemPickup_Unit[udg_ItemPickup_Max] = null
if udg_ItemPickup_Max == 0 then
call PauseTimer(udg_ItemPickup_Timer)
endif
endif
endfunction
function ItemPickup_OnPeriodic takes nothing returns nothing
local integer index = 0
loop
exitwhen index == udg_ItemPickup_Max
// Automatically pops invalid indexes.
if GetUnitTypeId(udg_ItemPickup_Unit[index]) == 0 then
call ItemPickup_Clear(udg_ItemPickup_Unit[index])
elseif not IsUnitType(udg_ItemPickup_Unit[index], UNIT_TYPE_DEAD) then
call MoveRectTo(udg_ItemPickup_Rect[index], GetUnitX(udg_ItemPickup_Unit[index]), GetUnitY(udg_ItemPickup_Unit[index]))
set udg_ItemPickup_Index = index
call EnumItemsInRect(udg_ItemPickup_Rect[index], null, function ItemPickup_EnumItems)
endif
set index = index + 1
endloop
endfunction
function ItemPickup_TriggerResponse takes nothing returns nothing
call ItemPickup_Clear(udg_ItemPickup__Unit)
if not udg_ItemPickup__AddUnit or GetUnitTypeId(udg_ItemPickup__Unit) == 0 or udg_ItemPickup__Radius < 0.00 then
return
endif
if udg_ItemPickup_Max == 0 then
call TimerStart(udg_ItemPickup_Timer, ItemPickup_GetTimerTimeout(), true, function ItemPickup_OnPeriodic)
endif
set udg_ItemPickup_Unit[udg_ItemPickup_Max] = udg_ItemPickup__Unit
set udg_ItemPickup_Rect[udg_ItemPickup_Max] = Rect(-udg_ItemPickup__Radius, -udg_ItemPickup__Radius, udg_ItemPickup__Radius, udg_ItemPickup__Radius)
set udg_ItemPickup_Max = udg_ItemPickup_Max + 1
endfunction
//===========================================================================
function InitTrig_Item_Pickup_JASS takes nothing returns nothing
set gg_trg_Item_Pickup_JASS = CreateTrigger()
call TriggerAddAction(gg_trg_Item_Pickup_JASS, function ItemPickup_TriggerResponse)
endfunction