Name | Type | is_array | initial_value |
TasInvGroup | group | No | |
TasInvHash | hashtable | No | |
TasInvInventorySkills | abilcode | Yes | |
TasInvInventoryUnit | unit | Yes | |
TasInvInventoryUnitCode | unitcode | No | |
TasInvInventoryUnitSkills | abilcode | Yes | |
TasInvItemBackup | item | Yes | |
TasInvOffset | integer | Yes | |
TasInvSelected | unit | Yes | |
TasInvTriggerItemDrop | trigger | No | |
TasInvTriggerLife | trigger | No |
library TasInventoryEx initializer init_function requires optional Table
/* TasInventoryEx 1.0c
by Tasyen
Uses the multiple InventorySkills on an unit to allow an unit to benefit from more than 6 items.
Displays the items in additional Inventories in a customUI and allows to move Items from into the main inventory
Destroys & Recreates Items drop/Moved between inventories
Affected by HeroScoreFrame-Options, if found in the same map
Requires:
(optional) Table by Bribe https://www.hiveworkshop.com/threads/snippet-new-table.188084/
*/
// Mode without Table
private struct data extends array
static if LIBRARY_Table then
public static HashTable BagItem
else
public static hashtable Hash
endif
endstruct
globals
private integer InventoryUnitCode = 'h000'
public unit array InventoryUnit
// The Abilities used by the Inventory Unit
public integer array InventoryUnitSkills
// The Inventory Abilities used by this system, the first in the array needs to be the default Inventory
public integer array InventorySkills
public trigger Trigger
public trigger TriggerItemGain
public trigger TriggerItemDrop
public trigger TriggerUnitRevived
public trigger TriggerLife
public trigger TriggerReInkarnationDone
public trigger TriggerUIBagButton
public group WaitingGroup
public integer array Offset
public unit array Selected
public item array ItemBackup
endglobals
// function ValidUnit filters out units that should not Use TasInventoryEx
// Change it to your will
private function ValidUnit takes unit u returns boolean
// Units with the Locust skill do not use this System
if GetUnitAbilityLevel(u, 'Aloc') > 0 then
return false
endif
// The extra Players don't use this
if GetPlayerId(GetOwningPlayer(u)) >= bj_MAX_PLAYERS then
return false
endif
if not IsUnitType(u, UNIT_TYPE_HERO) then
return false
endif
if GetUnitTypeId(u) == InventoryUnitCode then
return false
endif
return true
endfunction
private function UserInit takes nothing returns nothing
// the InventorySkills used by Heroes more mean more items can be equiped
set InventorySkills[0] = 'AInv'
set InventorySkills[1] = 'A00A'
set InventorySkills[2] = 'A00B'
set InventoryUnitSkills[0] = 'A000' // Preview Inventory Not Use Not Drop Not Gain
set InventoryUnitSkills[1] = 'A001' // Take Slot 1
set InventoryUnitSkills[2] = 'A002' // Take Slot 2
set InventoryUnitSkills[3] = 'A003' // Take Slot 3
set InventoryUnitSkills[4] = 'A004' // Take Slot 4
set InventoryUnitSkills[5] = 'A005' // Take Slot 5
set InventoryUnitSkills[6] = 'A006' // Take Slot 6
set InventoryUnitSkills[7] = 'A007' // Next Page
set InventoryUnitSkills[8] = 'A008' // Prev Page
set InventoryUnitSkills[9] = 'A009' // First Page
endfunction
public function AddItem takes unit u, item i returns nothing
local integer unitHandle = GetHandleId(u)
static if LIBRARY_Table then
set data.BagItem[unitHandle].integer[0] = data.BagItem[unitHandle].integer[0] + 1
set data.BagItem[unitHandle].item[data.BagItem[unitHandle].integer[0]] = i
else
call SaveInteger(data.Hash, unitHandle, 0, LoadInteger(data.Hash, unitHandle,0) + 1)
call SaveItemHandle(data.Hash, unitHandle, LoadInteger(data.Hash, unitHandle,0), i)
endif
endfunction
public function RemoveIndex takes unit u, integer index returns item
local item i
local integer unitHandle = GetHandleId(u)
static if LIBRARY_Table then
if data.BagItem[unitHandle].integer[0] <= 0 then
return null
endif
set i = data.BagItem[unitHandle].item[index]
set data.BagItem[unitHandle].item[index] = data.BagItem[unitHandle].item[data.BagItem[unitHandle].integer[0]]
set data.BagItem[unitHandle].item[data.BagItem[unitHandle].integer[0]] = null
set data.BagItem[unitHandle].integer[0] = data.BagItem[unitHandle].integer[0] - 1
else
if LoadInteger(data.Hash, unitHandle,0) <= 0 then
return null
endif
set i = LoadItemHandle(data.Hash, unitHandle, index)
call SaveItemHandle(data.Hash, unitHandle, index, LoadItemHandle(data.Hash, unitHandle, LoadInteger(data.Hash, unitHandle,0)))
call RemoveSavedHandle(data.Hash, unitHandle, LoadInteger(data.Hash, unitHandle,0))
call SaveInteger(data.Hash, unitHandle, 0, LoadInteger(data.Hash, unitHandle,0) - 1)
endif
set bj_itemRandomCurrentPick = i
set i = null
return bj_itemRandomCurrentPick
endfunction
private function CopyItemData takes item source, item target returns nothing
call SetItemCharges(target, GetItemCharges(source))
call SetItemInvulnerable(target, IsItemInvulnerable(source))
call SetItemUserData(target, GetItemUserData(source))
call SetItemPlayer(target, GetItemPlayer(source), true)
call SetWidgetLife(target, GetWidgetLife(source))
endfunction
private function UpdateUI takes nothing returns nothing
local integer pId = GetPlayerId(GetTriggerPlayer())
local integer unitHandle = GetHandleId(Selected[pId])
local integer offset = Offset[pId]*6
local integer itemCode
local item it
local integer i = 0
loop
call RemoveItem(UnitItemInSlot(InventoryUnit[pId], i))
static if LIBRARY_Table then
set it = data.BagItem[unitHandle].item[i + offset + 1]
else
set it = LoadItemHandle(data.Hash, unitHandle, i + offset + 1)
endif
set itemCode = GetItemTypeId(it)
if itemCode > 0 then
call UnitAddItemById(InventoryUnit[pId], itemCode)
call SetItemCharges(UnitItemInSlot(InventoryUnit[pId], i), GetItemCharges(it))
call SetPlayerAbilityAvailableBJ(true, InventoryUnitSkills[i + 1], GetTriggerPlayer())
else
call SetPlayerAbilityAvailableBJ(false, InventoryUnitSkills[i + 1], GetTriggerPlayer())
endif
set i = i + 1
exitwhen i == bj_MAX_INVENTORY
endloop
set it = null
endfunction
private function BagButtonAction takes nothing returns nothing
local player p = GetTriggerPlayer()
local integer pId = GetPlayerId(GetTriggerPlayer())
local integer bagIndex
local unit u
local item i
local item newItem
local integer spell = GetSpellAbilityId()
local integer loopA = 1
// NextPage
if spell == InventoryUnitSkills[7] then
set Offset[pId] = Offset[pId] + 1
if InventorySkills[Offset[pId]] == 0 then
set Offset[pId] = Offset[pId] - 1
endif
call UpdateUI()
return
// PrevPage
elseif spell == InventoryUnitSkills[8] then
set Offset[pId] = IMaxBJ(0, Offset[pId] - 1)
call UpdateUI()
return
// ResetPage
elseif spell == InventoryUnitSkills[9] then
set Offset[pId] = 0
call UpdateUI()
return
endif
loop
if spell == InventoryUnitSkills[loopA] then
set bagIndex = loopA + Offset[pId]
exitwhen true
endif
set loopA = loopA + 1
exitwhen loopA > 6
endloop
if bagIndex == Offset[pId] then
return
endif
if GetPlayerAlliance(GetOwningPlayer(Selected[pId]), p, ALLIANCE_SHARED_CONTROL) then
set u = Selected[pId]
set i = RemoveIndex(u, bagIndex)
set newItem = CreateItem(GetItemTypeId(i), GetUnitX(u), GetUnitY(u))
call CopyItemData(i, newItem)
call RemoveItem(i)
call SetPlayerAbilityAvailableBJ(false, InventorySkills[1], GetOwningPlayer(u))
call UnitAddItem(u, newItem)
call SetPlayerAbilityAvailableBJ(true, InventorySkills[1], GetOwningPlayer(u))
set u = null
set i = null
set newItem = null
endif
call UpdateUI()
endfunction
private function SelectAction takes nothing returns nothing
local integer pId = GetPlayerId(GetTriggerPlayer())
if GetUnitTypeId(GetTriggerUnit()) != InventoryUnitCode then
set Selected[pId] = GetTriggerUnit()
set Offset[pId] = 0
call SetUnitX(udg_TasInvInventoryUnit[pId], GetUnitX(GetTriggerUnit()))
call SetUnitY(udg_TasInvInventoryUnit[pId], GetUnitY(GetTriggerUnit()))
else
call UpdateUI()
endif
endfunction
private function ItemGainAction takes nothing returns nothing
local integer loopA
local unit u
local item i
local integer unitHandle
// powerups, destroyed item don't matter
if IsItemPowerup(GetManipulatedItem()) or GetItemTypeId(GetManipulatedItem()) <= 0 or GetWidgetLife(GetManipulatedItem()) <= 0 then
return
endif
if not ValidUnit(GetTriggerUnit()) then
return
endif
set u = GetTriggerUnit()
set unitHandle = GetHandleId(u)
set i = GetManipulatedItem()
if GetUnitAbilityLevel(u, InventorySkills[1]) == 0 then
// remember items already owned before getting TasInventory
set loopA = bj_MAX_INVENTORY - 1
loop
if UnitItemInSlot(u, loopA) != null then
call AddItem(u, UnitItemInSlot(u, loopA))
endif
exitwhen loopA == 0
set loopA = loopA - 1
endloop
set loopA = 0
loop
exitwhen InventorySkills[loopA] == 0
if GetUnitAbilityLevel(u, InventorySkills[loopA]) == 0 then
call UnitAddAbility(u, InventorySkills[loopA])
endif
call UnitMakeAbilityPermanent(u, true, InventorySkills[loopA])
set loopA = loopA + 1
endloop
call TriggerRegisterUnitLifeEvent(TriggerLife, u, LESS_THAN_OR_EQUAL, 0.41)
elseif not UnitHasItem(u, i) then
call AddItem(u, i)
endif
set u = null
set i = null
endfunction
public function ReAddInventories takes unit u returns nothing
local item i
local item newItem
local integer loopA
local integer loopB
local integer itemCount = 1
local integer unitHandle = GetHandleId(u)
if not ValidUnit(u) then
return
endif
// revived heroes
if GetUnitAbilityLevel(u, InventorySkills[0]) > 0 and GetUnitAbilityLevel(u, InventorySkills[1]) > 0 then
// remember items already owned before getting TasInventory
call DisableTrigger(TriggerItemDrop)
static if LIBRARY_Table then
set loopA = data.BagItem[unitHandle].integer[0]
else
set loopA = LoadInteger(data.Hash, unitHandle,0)
endif
loop
exitwhen loopA <= 0
static if LIBRARY_Table then
set i = data.BagItem[unitHandle].item[loopA]
set data.BagItem[unitHandle].item[loopA] = null
set data.BagItem[unitHandle].integer[0] = 0
else
set i = LoadItemHandle(data.Hash, unitHandle, loopA)
call RemoveSavedHandle(data.Hash, unitHandle, loopA)
call SaveInteger(data.Hash, unitHandle, 0, 0)
endif
set newItem = CreateItem(GetItemTypeId(i), GetUnitX(u), GetUnitY(u))
call CopyItemData(i, newItem)
call RemoveItem(i)
set ItemBackup[loopA] = newItem
set loopA = loopA - 1
endloop
call EnableTrigger(TriggerItemDrop)
// dont remove & readd the first inventory skill, otherwise the inventory grows
//for i, abi in ipairs(this.InventorySkills) do
set loopA = 1
loop
exitwhen InventorySkills[loopA] == 0
call UnitMakeAbilityPermanent(u, false, InventorySkills[loopA])
call UnitRemoveAbility(u, InventorySkills[loopA])
set loopA = loopA + 1
endloop
set itemCount = 1
set loopA = 1
loop
//for i, abi in ipairs(this.InventorySkills) do
exitwhen InventorySkills[loopA] == 0
set loopB = 0
loop
exitwhen loopB >= bj_MAX_INVENTORY
if GetHandleId(UnitItemInSlot(u, loopB)) > 0 then
call AddItem(u, UnitItemInSlot(u, loopB))
endif
set loopB = loopB + 1
endloop
if GetUnitAbilityLevel(u, InventorySkills[loopA]) == 0 then
call UnitAddAbility(u, InventorySkills[loopA])
endif
call UnitMakeAbilityPermanent(u, true, InventorySkills[loopA])
set loopB = 0
loop
exitwhen loopB >= UnitInventorySize(u)
set i = ItemBackup[itemCount]
set ItemBackup[itemCount] = null
set itemCount = itemCount + 1
if GetHandleId(i) > 0 then
call UnitAddItem(u, i)
endif
set loopB = loopB + 1
endloop
set loopA = loopA + 1
endloop
endif
set u = null
set i = null
set newItem = null
endfunction
private function UnitReviveAction takes nothing returns nothing
call ReAddInventories(GetTriggerUnit())
call GroupRemoveUnit(WaitingGroup, GetTriggerUnit())
endfunction
private function UnitLifeAction takes nothing returns nothing
call GroupAddUnit(WaitingGroup, GetTriggerUnit())
endfunction
private function UnitReInkarnationDoneActionEnum takes nothing returns nothing
local unit u = GetEnumUnit()
if not IsUnitType(u, UNIT_TYPE_DEAD) then
call GroupRemoveUnit(WaitingGroup, u)
call ReAddInventories(u)
endif
set u = null
endfunction
private function UnitReInkarnationDoneAction takes nothing returns nothing
call ForGroup(WaitingGroup, function UnitReInkarnationDoneActionEnum)
endfunction
private function ItemDropAction takes nothing returns nothing
local integer loopA
local integer unitHandle
local unit u
local item i
// powerups don't matter
if IsItemPowerup(GetManipulatedItem()) then
return
endif
if not ValidUnit(GetTriggerUnit()) then
return
endif
// Drops from main inventory? no work to do
if UnitHasItem(GetTriggerUnit(), GetManipulatedItem()) then
return
endif
set u = GetTriggerUnit()
set unitHandle = GetHandleId(u)
// it can happen that using an item triggers other items in the inventory, check for broken and remove them
// happened for me with some of the charged summon items
static if LIBRARY_Table then
set loopA = data.BagItem[unitHandle].integer[0]
else
set loopA = LoadInteger(data.Hash, unitHandle,0)
endif
loop
exitwhen loopA <= 0
static if LIBRARY_Table then
set i = data.BagItem[unitHandle].item[loopA]
else
set i = LoadItemHandle(data.Hash, unitHandle, loopA)
endif
if i == GetManipulatedItem() then
call RemoveIndex(u, loopA)
exitwhen true
endif
set loopA = loopA - 1
endloop
set u = null
set i = null
endfunction
private function At0s takes nothing returns nothing
local integer i
local integer loopA
call UserInit()
static if LIBRARY_Table then
set data.BagItem = HashTable.create()
else
set data.Hash = InitHashtable()
endif
set Trigger = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(Trigger, EVENT_PLAYER_UNIT_SELECTED)
call TriggerAddAction(Trigger, function SelectAction)
set TriggerItemGain = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(TriggerItemGain, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddAction(TriggerItemGain, function ItemGainAction)
set TriggerItemDrop = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(TriggerItemDrop, EVENT_PLAYER_UNIT_DROP_ITEM)
call TriggerAddAction(TriggerItemDrop, function ItemDropAction)
set TriggerUnitRevived = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(TriggerUnitRevived, EVENT_PLAYER_HERO_REVIVE_FINISH)
call TriggerAddAction(TriggerUnitRevived, function UnitReviveAction)
set TriggerLife = CreateTrigger()
call TriggerAddAction(TriggerLife, function UnitLifeAction)
set WaitingGroup = CreateGroup()
set TriggerReInkarnationDone = CreateTrigger()
call TriggerRegisterTimerEvent(TriggerReInkarnationDone, 0.25, true)
call TriggerAddAction(TriggerReInkarnationDone, function UnitReInkarnationDoneAction)
set i = 0
loop
set InventoryUnit[i] = CreateUnit(Player(i), InventoryUnitCode, GetPlayerStartLocationX(Player(i)), GetPlayerStartLocationY(Player(i)), 0)
set loopA = 0
loop
call UnitAddAbility(InventoryUnit[i], InventoryUnitSkills[loopA])
set loopA = loopA + 1
exitwhen InventoryUnitSkills[loopA] == 0
endloop
set i = i + 1
exitwhen i == bj_MAX_PLAYER_SLOTS
endloop
set TriggerUIBagButton = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(TriggerUIBagButton, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddAction(TriggerUIBagButton, function BagButtonAction)
call DestroyTimer(GetExpiredTimer())
endfunction
private function init_function takes nothing returns nothing
call TimerStart(CreateTimer(), 0, false, function At0s)
endfunction
endlibrary
// TasInventoryEx (Warcraft 3 1.26a) 1.0b
// by Tasyen
// Uses the multiple udg_TasInvInventorySkills on an unit to allow an unit to benefit from more than 6 items.
// Displays the items in additional Inventories in a customUI and allows to move Items from into the main inventory
//Destroys & Recreates Items drop/Moved between inventories
// function ValidUnit filters out units that should not Use TasInventoryEx
// Change it to your will
function TasInventoryEx_ValidUnit takes unit u returns boolean
// Units with the Locust skill do not use this System
if GetUnitAbilityLevel(u, 'Aloc') > 0 then
return false
endif
// The extra Players don't use this
if GetPlayerId(GetOwningPlayer(u)) >= bj_MAX_PLAYERS then
return false
endif
if not IsUnitType(u, UNIT_TYPE_HERO) then
return false
endif
if GetUnitTypeId(u) == udg_TasInvInventoryUnitCode then
return false
endif
return true
endfunction
function TasInventoryEx_AddItem takes unit u, item i returns nothing
local integer unitHandle = GetHandleId(u)
call SaveInteger(udg_TasInvHash, unitHandle, 0, LoadInteger(udg_TasInvHash, unitHandle,0) + 1)
call SaveItemHandle(udg_TasInvHash, unitHandle, LoadInteger(udg_TasInvHash, unitHandle,0), i)
endfunction
function TasInventoryEx_RemoveIndex takes unit u, integer index returns item
local item i
local integer unitHandle = GetHandleId(u)
if LoadInteger(udg_TasInvHash, unitHandle,0) <= 0 then
return null
endif
set i = LoadItemHandle(udg_TasInvHash, unitHandle, index)
call SaveItemHandle(udg_TasInvHash, unitHandle, index, LoadItemHandle(udg_TasInvHash, unitHandle, LoadInteger(udg_TasInvHash, unitHandle,0)))
call RemoveSavedHandle(udg_TasInvHash, unitHandle, LoadInteger(udg_TasInvHash, unitHandle,0))
call SaveInteger(udg_TasInvHash, unitHandle, 0, LoadInteger(udg_TasInvHash, unitHandle,0) - 1)
set bj_itemRandomCurrentPick = i
set i = null
return bj_itemRandomCurrentPick
endfunction
function TasInventoryEx_CopyItemData takes item source, item target returns nothing
call SetItemCharges(target, GetItemCharges(source))
call SetItemInvulnerable(target, IsItemInvulnerable(source))
call SetItemUserData(target, GetItemUserData(source))
call SetItemPlayer(target, GetItemPlayer(source), true)
call SetWidgetLife(target, GetWidgetLife(source))
endfunction
function TasInventoryEx_UpdateUI takes nothing returns nothing
local integer pId = GetPlayerId(GetTriggerPlayer())
local integer unitHandle = GetHandleId(udg_TasInvSelected[pId])
local integer offset = udg_TasInvOffset[pId]*6
local integer itemCode
local item it
local integer i = 0
loop
call RemoveItem(UnitItemInSlot(udg_TasInvInventoryUnit[pId], i))
set it = LoadItemHandle(udg_TasInvHash, unitHandle, i + offset + 1)
set itemCode = GetItemTypeId(it)
if itemCode > 0 then
call UnitAddItemById(udg_TasInvInventoryUnit[pId], itemCode)
call SetItemCharges(UnitItemInSlot(udg_TasInvInventoryUnit[pId], i), GetItemCharges(it))
call SetPlayerAbilityAvailableBJ(true, udg_TasInvInventoryUnitSkills[i + 1], GetTriggerPlayer())
else
call SetPlayerAbilityAvailableBJ(false, udg_TasInvInventoryUnitSkills[i + 1], GetTriggerPlayer())
endif
set i = i + 1
exitwhen i == bj_MAX_INVENTORY
endloop
set it = null
endfunction
function TasInventoryEx_ButtonAction takes nothing returns nothing
local player p = GetTriggerPlayer()
local integer pId = GetPlayerId(GetTriggerPlayer())
local integer bagIndex
local unit u
local item i
local item newItem
local integer spell = GetSpellAbilityId()
local integer loopA = 1
// NextPage
if spell == udg_TasInvInventoryUnitSkills[7] then
set udg_TasInvOffset[pId] = udg_TasInvOffset[pId] + 1
if udg_TasInvInventorySkills[udg_TasInvOffset[pId]] == 0 then
set udg_TasInvOffset[pId] = udg_TasInvOffset[pId] - 1
endif
call TasInventoryEx_UpdateUI()
return
// PrevPage
elseif spell == udg_TasInvInventoryUnitSkills[8] then
set udg_TasInvOffset[pId] = IMaxBJ(0, udg_TasInvOffset[pId] - 1)
call TasInventoryEx_UpdateUI()
return
// ResetPage
elseif spell == udg_TasInvInventoryUnitSkills[9] then
set udg_TasInvOffset[pId] = 0
call TasInventoryEx_UpdateUI()
return
endif
loop
if spell == udg_TasInvInventoryUnitSkills[loopA] then
set bagIndex = loopA + udg_TasInvOffset[pId]
exitwhen true
endif
set loopA = loopA + 1
exitwhen loopA > 6
endloop
if bagIndex == udg_TasInvOffset[pId] then
return
endif
if GetPlayerAlliance(GetOwningPlayer(udg_TasInvSelected[pId]), p, ALLIANCE_SHARED_CONTROL) then
set u = udg_TasInvSelected[pId]
set i = TasInventoryEx_RemoveIndex(u, bagIndex)
set newItem = CreateItem(GetItemTypeId(i), GetUnitX(u), GetUnitY(u))
call TasInventoryEx_CopyItemData(i, newItem)
call RemoveItem(i)
call SetPlayerAbilityAvailableBJ(false, udg_TasInvInventorySkills[1], GetOwningPlayer(u))
call UnitAddItem(u, newItem)
call SetPlayerAbilityAvailableBJ(true, udg_TasInvInventorySkills[1], GetOwningPlayer(u))
set u = null
set i = null
set newItem = null
endif
call TasInventoryEx_UpdateUI()
endfunction
function TasInventoryEx_SelectAction takes nothing returns nothing
local integer pId = GetPlayerId(GetTriggerPlayer())
if GetUnitTypeId(GetTriggerUnit()) != udg_TasInvInventoryUnitCode then
set udg_TasInvSelected[pId] = GetTriggerUnit()
set udg_TasInvOffset[pId] = 0
call SetUnitX(udg_TasInvInventoryUnit[pId], GetUnitX(GetTriggerUnit()))
call SetUnitY(udg_TasInvInventoryUnit[pId], GetUnitY(GetTriggerUnit()))
else
call TasInventoryEx_UpdateUI()
endif
endfunction
function TasInventoryEx_ItemGainAction takes nothing returns nothing
local integer loopA
local unit u
local item i
local integer unitHandle
// powerups, destroyed item don't matter
if IsItemPowerup(GetManipulatedItem()) or GetItemTypeId(GetManipulatedItem()) <= 0 or GetWidgetLife(GetManipulatedItem()) <= 0 then
return
endif
if not TasInventoryEx_ValidUnit(GetTriggerUnit()) then
return
endif
set u = GetTriggerUnit()
set unitHandle = GetHandleId(u)
set i = GetManipulatedItem()
if GetUnitAbilityLevel(u, udg_TasInvInventorySkills[1]) == 0 then
// remember items already owned before getting TasInventory
set loopA = bj_MAX_INVENTORY - 1
loop
if UnitItemInSlot(u, loopA) != null then
call TasInventoryEx_AddItem(u, UnitItemInSlot(u, loopA))
endif
exitwhen loopA == 0
set loopA = loopA - 1
endloop
set loopA = 0
loop
exitwhen udg_TasInvInventorySkills[loopA] == 0
if GetUnitAbilityLevel(u, udg_TasInvInventorySkills[loopA]) == 0 then
call UnitAddAbility(u, udg_TasInvInventorySkills[loopA])
endif
call UnitMakeAbilityPermanent(u, true, udg_TasInvInventorySkills[loopA])
set loopA = loopA + 1
endloop
call TriggerRegisterUnitLifeEvent(udg_TasInvTriggerLife, u, LESS_THAN_OR_EQUAL, 0.41)
elseif not UnitHasItem(u, i) then
call TasInventoryEx_AddItem(u, i)
endif
set u = null
set i = null
endfunction
function TasInventoryEx_ReAddInventories takes unit u returns nothing
local item i
local item newItem
local integer loopA
local integer loopB
local integer itemCount = 1
local integer unitHandle = GetHandleId(u)
if not TasInventoryEx_ValidUnit(u) then
return
endif
// revived heroes
if GetUnitAbilityLevel(u, udg_TasInvInventorySkills[0]) > 0 and GetUnitAbilityLevel(u, udg_TasInvInventorySkills[1]) > 0 then
// remember items already owned before getting TasInventory
call DisableTrigger(udg_TasInvTriggerItemDrop)
set loopA = LoadInteger(udg_TasInvHash, unitHandle,0)
loop
exitwhen loopA <= 0
set i = LoadItemHandle(udg_TasInvHash, unitHandle, loopA)
call RemoveSavedHandle(udg_TasInvHash, unitHandle, loopA)
call SaveInteger(udg_TasInvHash, unitHandle, 0, 0)
set newItem = CreateItem(GetItemTypeId(i), GetUnitX(u), GetUnitY(u))
call TasInventoryEx_CopyItemData(i, newItem)
call RemoveItem(i)
set udg_TasInvItemBackup[loopA] = newItem
set loopA = loopA - 1
endloop
call EnableTrigger(udg_TasInvTriggerItemDrop)
// dont remove & readd the first inventory skill, otherwise the inventory grows
//for i, abi in ipairs(this.udg_TasInvInventorySkills) do
set loopA = 1
loop
exitwhen udg_TasInvInventorySkills[loopA] == 0
call UnitMakeAbilityPermanent(u, false, udg_TasInvInventorySkills[loopA])
call UnitRemoveAbility(u, udg_TasInvInventorySkills[loopA])
set loopA = loopA + 1
endloop
set itemCount = 1
set loopA = 1
loop
//for i, abi in ipairs(this.udg_TasInvInventorySkills) do
exitwhen udg_TasInvInventorySkills[loopA] == 0
set loopB = 0
loop
exitwhen loopB >= bj_MAX_INVENTORY
if GetHandleId(UnitItemInSlot(u, loopB)) > 0 then
call TasInventoryEx_AddItem(u, UnitItemInSlot(u, loopB))
endif
set loopB = loopB + 1
endloop
if GetUnitAbilityLevel(u, udg_TasInvInventorySkills[loopA]) == 0 then
call UnitAddAbility(u, udg_TasInvInventorySkills[loopA])
endif
call UnitMakeAbilityPermanent(u, true, udg_TasInvInventorySkills[loopA])
set loopB = 0
loop
exitwhen loopB >= UnitInventorySize(u)
set i = udg_TasInvItemBackup[itemCount]
set udg_TasInvItemBackup[itemCount] = null
set itemCount = itemCount + 1
if GetHandleId(i) > 0 then
call UnitAddItem(u, i)
endif
set loopB = loopB + 1
endloop
set loopA = loopA + 1
endloop
endif
set u = null
set i = null
set newItem = null
endfunction
function TasInventoryEx_ReviveAction takes nothing returns nothing
call TasInventoryEx_ReAddInventories(GetTriggerUnit())
call GroupRemoveUnit(udg_TasInvGroup, GetTriggerUnit())
endfunction
function TasInventoryEx_LifeAction takes nothing returns nothing
call GroupAddUnit(udg_TasInvGroup, GetTriggerUnit())
endfunction
function TasInventoryEx_ReInkarnationDoneEnum takes nothing returns nothing
local unit u = GetEnumUnit()
if not IsUnitType(u, UNIT_TYPE_DEAD) then
call GroupRemoveUnit(udg_TasInvGroup, u)
call TasInventoryEx_ReAddInventories(u)
endif
set u = null
endfunction
function TasInventoryEx_ReInkarnationDone takes nothing returns nothing
call ForGroup(udg_TasInvGroup, function TasInventoryEx_ReInkarnationDoneEnum)
endfunction
function TasInventoryEx_ItemDropAction takes nothing returns nothing
local integer loopA
local integer unitHandle
local unit u
local item i
// powerups don't matter
if IsItemPowerup(GetManipulatedItem()) then
return
endif
// print("Owned", IsItemOwned(GetManipulatedItem()), "Life", "HasItem", UnitHasItem(GetTriggerUnit(), GetManipulatedItem()))
// Drops from main inventory? no work to do
if UnitHasItem(GetTriggerUnit(), GetManipulatedItem()) then
return
endif
if not TasInventoryEx_ValidUnit(GetTriggerUnit()) then
return
endif
set u = GetTriggerUnit()
set unitHandle = GetHandleId(u)
// it can happen that using an item triggers other items in the inventory, check for broken and remove them
// happened for me with some of the charged summon items
set loopA = LoadInteger(udg_TasInvHash, unitHandle,0)
loop
exitwhen loopA <= 0
set i = LoadItemHandle(udg_TasInvHash, unitHandle, loopA)
if i == GetManipulatedItem() then
call TasInventoryEx_RemoveIndex(u, loopA)
exitwhen true
endif
set loopA = loopA - 1
endloop
set u = null
set i = null
endfunction
function TasInventoryEx_At0sEnum takes nothing returns nothing
local integer loopA = 0
local integer i = GetPlayerId(GetEnumPlayer())
set udg_TasInvInventoryUnit[i] = CreateUnit(Player(i), udg_TasInvInventoryUnitCode, GetPlayerStartLocationX(Player(i)), GetPlayerStartLocationY(Player(i)), 0)
loop
call UnitAddAbility(udg_TasInvInventoryUnit[i], udg_TasInvInventoryUnitSkills[loopA])
set loopA = loopA + 1
exitwhen udg_TasInvInventoryUnitSkills[loopA] == 0
endloop
endfunction
function TasInventoryEx_At0s takes nothing returns nothing
local integer i
local integer loopA
local trigger trig
set trig = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(trig, EVENT_PLAYER_UNIT_SELECTED)
call TriggerAddAction(trig, function TasInventoryEx_SelectAction)
set trig = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(trig, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddAction(trig, function TasInventoryEx_ItemGainAction)
set udg_TasInvTriggerItemDrop = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(udg_TasInvTriggerItemDrop, EVENT_PLAYER_UNIT_DROP_ITEM)
call TriggerAddAction(udg_TasInvTriggerItemDrop, function TasInventoryEx_ItemDropAction)
set trig = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(trig, EVENT_PLAYER_HERO_REVIVE_FINISH)
call TriggerAddAction(trig, function TasInventoryEx_ReviveAction)
set udg_TasInvTriggerLife = CreateTrigger()
call TriggerAddAction(udg_TasInvTriggerLife, function TasInventoryEx_LifeAction)
set udg_TasInvGroup = CreateGroup()
set trig = CreateTrigger()
call TriggerRegisterTimerEvent(trig, 0.25, true)
call TriggerAddAction(trig, function TasInventoryEx_ReInkarnationDone)
call ForForce(bj_FORCE_ALL_PLAYERS, function TasInventoryEx_At0sEnum)
set trig = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(trig, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddAction(trig, function TasInventoryEx_ButtonAction)
call DestroyTimer(GetExpiredTimer())
endfunction
function Trig_TasInventoryEx_Actions takes nothing returns nothing
call TimerStart(CreateTimer(), 0, false, function TasInventoryEx_At0s)
endfunction
//===========================================================================
function InitTrig_TasInventoryEx takes nothing returns nothing
set gg_trg_TasInventoryEx = CreateTrigger( )
call TriggerAddAction( gg_trg_TasInventoryEx, function Trig_TasInventoryEx_Actions )
endfunction