Name | Type | is_array | initial_value |
library Table /* made by Bribe, special thanks to Vexorian & Nestharus, version 4.1.0.1.
One map, one hashtable. Welcome to NewTable 4.1.0.1
This newest iteration of Table introduces the new HashTable struct.
You can now instantiate HashTables which enables the use of large
parent and large child keys, just like a standard hashtable. Previously,
the user would have to instantiate a Table to do this on their own which -
while doable - is something the user should not have to do if I can add it
to this resource myself (especially if they are inexperienced).
This library was originally called NewTable so it didn't conflict with
the API of Table by Vexorian. However, the damage is done and it's too
late to change the library name now. To help with damage control, I
have provided an extension library called TableBC, which bridges all
the functionality of Vexorian's Table except for 2-D string arrays &
the ".flush(integer)" method. I use ".flush()" to flush a child hash-
table, because I wanted the API in NewTable to reflect the API of real
hashtables (I thought this would be more intuitive).
API
------------
struct Table
| static method create takes nothing returns Table
| create a new Table
|
| method destroy takes nothing returns nothing
| destroy it
|
| method flush takes nothing returns nothing
| flush all stored values inside of it
|
| method remove takes integer key returns nothing
| remove the value at index "key"
|
| method operator []= takes integer key, $TYPE$ value returns nothing
| assign "value" to index "key"
|
| method operator [] takes integer key returns $TYPE$
| load the value at index "key"
|
| method has takes integer key returns boolean
| whether or not the key was assigned
|
----------------
struct TableArray
| static method operator [] takes integer array_size returns TableArray
| create a new array of Tables of size "array_size"
|
| method destroy takes nothing returns nothing
| destroy it
|
| method flush takes nothing returns nothing
| flush and destroy it
|
| method operator size takes nothing returns integer
| returns the size of the TableArray
|
| method operator [] takes integer key returns Table
| returns a Table accessible exclusively to index "key"
*/
globals
private integer less = 0 //Index generation for TableArrays (below 0).
private integer more = 8190 //Index generation for Tables.
//Configure it if you use more than 8190 "key" variables in your map (this will never happen though).
private hashtable ht = InitHashtable()
private key sizeK
private key listK
endglobals
private struct dex extends array
static method operator size takes nothing returns Table
return sizeK
endmethod
static method operator list takes nothing returns Table
return listK
endmethod
endstruct
private struct handles extends array
method has takes integer key returns boolean
return HaveSavedHandle(ht, this, key)
endmethod
method remove takes integer key returns nothing
call RemoveSavedHandle(ht, this, key)
endmethod
endstruct
private struct agents extends array
method operator []= takes integer key, agent value returns nothing
call SaveAgentHandle(ht, this, key, value)
endmethod
endstruct
//! textmacro NEW_ARRAY_BASIC takes SUPER, FUNC, TYPE
private struct $TYPE$s extends array
method operator [] takes integer key returns $TYPE$
return Load$FUNC$(ht, this, key)
endmethod
method operator []= takes integer key, $TYPE$ value returns nothing
call Save$FUNC$(ht, this, key, value)
endmethod
method has takes integer key returns boolean
return HaveSaved$SUPER$(ht, this, key)
endmethod
method remove takes integer key returns nothing
call RemoveSaved$SUPER$(ht, this, key)
endmethod
endstruct
private module $TYPE$m
method operator $TYPE$ takes nothing returns $TYPE$s
return this
endmethod
endmodule
//! endtextmacro
//! textmacro NEW_ARRAY takes FUNC, TYPE
private struct $TYPE$s extends array
method operator [] takes integer key returns $TYPE$
return Load$FUNC$Handle(ht, this, key)
endmethod
method operator []= takes integer key, $TYPE$ value returns nothing
call Save$FUNC$Handle(ht, this, key, value)
endmethod
method has takes integer key returns boolean
return HaveSavedHandle(ht, this, key)
endmethod
method remove takes integer key returns nothing
call RemoveSavedHandle(ht, this, key)
endmethod
endstruct
private module $TYPE$m
method operator $TYPE$ takes nothing returns $TYPE$s
return this
endmethod
endmodule
//! endtextmacro
//Run these textmacros to include the entire hashtable API as wrappers.
//Don't be intimidated by the number of macros - Vexorian's map optimizer is
//supposed to kill functions which inline (all of these functions inline).
//! runtextmacro NEW_ARRAY_BASIC("Real", "Real", "real")
//! runtextmacro NEW_ARRAY_BASIC("Boolean", "Boolean", "boolean")
//! runtextmacro NEW_ARRAY_BASIC("String", "Str", "string")
//New textmacro to allow table.integer[] syntax for compatibility with textmacros that might desire it.
//! runtextmacro NEW_ARRAY_BASIC("Integer", "Integer", "integer")
//! runtextmacro NEW_ARRAY("Player", "player")
//! runtextmacro NEW_ARRAY("Widget", "widget")
//! runtextmacro NEW_ARRAY("Destructable", "destructable")
//! runtextmacro NEW_ARRAY("Item", "item")
//! runtextmacro NEW_ARRAY("Unit", "unit")
//! runtextmacro NEW_ARRAY("Ability", "ability")
//! runtextmacro NEW_ARRAY("Timer", "timer")
//! runtextmacro NEW_ARRAY("Trigger", "trigger")
//! runtextmacro NEW_ARRAY("TriggerCondition", "triggercondition")
//! runtextmacro NEW_ARRAY("TriggerAction", "triggeraction")
//! runtextmacro NEW_ARRAY("TriggerEvent", "event")
//! runtextmacro NEW_ARRAY("Force", "force")
//! runtextmacro NEW_ARRAY("Group", "group")
//! runtextmacro NEW_ARRAY("Location", "location")
//! runtextmacro NEW_ARRAY("Rect", "rect")
//! runtextmacro NEW_ARRAY("BooleanExpr", "boolexpr")
//! runtextmacro NEW_ARRAY("Sound", "sound")
//! runtextmacro NEW_ARRAY("Effect", "effect")
//! runtextmacro NEW_ARRAY("UnitPool", "unitpool")
//! runtextmacro NEW_ARRAY("ItemPool", "itempool")
//! runtextmacro NEW_ARRAY("Quest", "quest")
//! runtextmacro NEW_ARRAY("QuestItem", "questitem")
//! runtextmacro NEW_ARRAY("DefeatCondition", "defeatcondition")
//! runtextmacro NEW_ARRAY("TimerDialog", "timerdialog")
//! runtextmacro NEW_ARRAY("Leaderboard", "leaderboard")
//! runtextmacro NEW_ARRAY("Multiboard", "multiboard")
//! runtextmacro NEW_ARRAY("MultiboardItem", "multiboarditem")
//! runtextmacro NEW_ARRAY("Trackable", "trackable")
//! runtextmacro NEW_ARRAY("Dialog", "dialog")
//! runtextmacro NEW_ARRAY("Button", "button")
//! runtextmacro NEW_ARRAY("TextTag", "texttag")
//! runtextmacro NEW_ARRAY("Lightning", "lightning")
//! runtextmacro NEW_ARRAY("Image", "image")
//! runtextmacro NEW_ARRAY("Ubersplat", "ubersplat")
//! runtextmacro NEW_ARRAY("Region", "region")
//! runtextmacro NEW_ARRAY("FogState", "fogstate")
//! runtextmacro NEW_ARRAY("FogModifier", "fogmodifier")
//! runtextmacro NEW_ARRAY("Hashtable", "hashtable")
struct Table extends array
// Implement modules for intuitive syntax (tb.handle; tb.unit; etc.)
implement realm
implement integerm
implement booleanm
implement stringm
implement playerm
implement widgetm
implement destructablem
implement itemm
implement unitm
implement abilitym
implement timerm
implement triggerm
implement triggerconditionm
implement triggeractionm
implement eventm
implement forcem
implement groupm
implement locationm
implement rectm
implement boolexprm
implement soundm
implement effectm
implement unitpoolm
implement itempoolm
implement questm
implement questitemm
implement defeatconditionm
implement timerdialogm
implement leaderboardm
implement multiboardm
implement multiboarditemm
implement trackablem
implement dialogm
implement buttonm
implement texttagm
implement lightningm
implement imagem
implement ubersplatm
implement regionm
implement fogstatem
implement fogmodifierm
implement hashtablem
method operator handle takes nothing returns handles
return this
endmethod
method operator agent takes nothing returns agents
return this
endmethod
//set this = tb[GetSpellAbilityId()]
method operator [] takes integer key returns Table
return LoadInteger(ht, this, key) //return this.integer[key]
endmethod
//set tb[389034] = 8192
method operator []= takes integer key, Table tb returns nothing
call SaveInteger(ht, this, key, tb) //set this.integer[key] = tb
endmethod
//set b = tb.has(2493223)
method has takes integer key returns boolean
return HaveSavedInteger(ht, this, key) //return this.integer.has(key)
endmethod
//call tb.remove(294080)
method remove takes integer key returns nothing
call RemoveSavedInteger(ht, this, key) //call this.integer.remove(key)
endmethod
//Remove all data from a Table instance
method flush takes nothing returns nothing
call FlushChildHashtable(ht, this)
endmethod
//local Table tb = Table.create()
static method create takes nothing returns Table
local Table this = dex.list[0]
if this == 0 then
set this = more + 1
set more = this
else
set dex.list[0] = dex.list[this]
call dex.list.remove(this) //Clear hashed memory
endif
debug set dex.list[this] = -1
return this
endmethod
// Removes all data from a Table instance and recycles its index.
//
// call tb.destroy()
//
method destroy takes nothing returns nothing
debug if dex.list[this] != -1 then
debug call BJDebugMsg("Table Error: Tried to double-free instance: " + I2S(this))
debug return
debug endif
call this.flush()
set dex.list[this] = dex.list[0]
set dex.list[0] = this
endmethod
//! runtextmacro optional TABLE_BC_METHODS()
endstruct
//! runtextmacro optional TABLE_BC_STRUCTS()
struct TableArray extends array
//Returns a new TableArray to do your bidding. Simply use:
//
// local TableArray ta = TableArray[array_size]
//
static method operator [] takes integer array_size returns TableArray
local Table tb = dex.size[array_size] //Get the unique recycle list for this array size
local TableArray this = tb[0] //The last-destroyed TableArray that had this array size
debug if array_size <= 0 then
debug call BJDebugMsg("TypeError: Invalid specified TableArray size: " + I2S(array_size))
debug return 0
debug endif
if this == 0 then
set this = less - array_size
set less = this
else
set tb[0] = tb[this] //Set the last destroyed to the last-last destroyed
call tb.remove(this) //Clear hashed memory
endif
set dex.size[this] = array_size //This remembers the array size
return this
endmethod
//Returns the size of the TableArray
method operator size takes nothing returns integer
return dex.size[this]
endmethod
//This magic method enables two-dimensional[array][syntax] for Tables,
//similar to the two-dimensional utility provided by hashtables them-
//selves.
//
//ta[integer a].unit[integer b] = unit u
//ta[integer a][integer c] = integer d
//
//Inline-friendly when not running in debug mode
//
method operator [] takes integer key returns Table
static if DEBUG_MODE then
local integer i = this.size
if i == 0 then
call BJDebugMsg("IndexError: Tried to get key from invalid TableArray instance: " + I2S(this))
return 0
elseif key < 0 or key >= i then
call BJDebugMsg("IndexError: Tried to get key [" + I2S(key) + "] from outside TableArray bounds: " + I2S(i))
return 0
endif
endif
return this + key
endmethod
//Destroys a TableArray without flushing it; I assume you call .flush()
//if you want it flushed too. This is a public method so that you don't
//have to loop through all TableArray indices to flush them if you don't
//need to (ie. if you were flushing all child-keys as you used them).
//
method destroy takes nothing returns nothing
local Table tb = dex.size[this.size]
debug if this.size == 0 then
debug call BJDebugMsg("TypeError: Tried to destroy an invalid TableArray: " + I2S(this))
debug return
debug endif
if tb == 0 then
//Create a Table to index recycled instances with their array size
set tb = Table.create()
set dex.size[this.size] = tb
endif
call dex.size.remove(this) //Clear the array size from hash memory
set tb[this] = tb[0]
set tb[0] = this
endmethod
private static Table tempTable
private static integer tempEnd
//Avoids hitting the op limit
private static method clean takes nothing returns nothing
local Table tb = .tempTable
local integer end = tb + 0x1000
if end < .tempEnd then
set .tempTable = end
call ForForce(bj_FORCE_PLAYER[0], function thistype.clean)
else
set end = .tempEnd
endif
loop
call tb.flush()
set tb = tb + 1
exitwhen tb == end
endloop
endmethod
//Flushes the TableArray and also destroys it. Doesn't get any more
//similar to the FlushParentHashtable native than this.
//
method flush takes nothing returns nothing
debug if this.size == 0 then
debug call BJDebugMsg("TypeError: Tried to flush an invalid TableArray instance: " + I2S(this))
debug return
debug endif
set .tempTable = this
set .tempEnd = this + this.size
call ForForce(bj_FORCE_PLAYER[0], function thistype.clean)
call this.destroy()
endmethod
endstruct
//NEW: Added in Table 4.0. A fairly simple struct but allows you to do more
//than that which was previously possible.
struct HashTable extends array
//Enables myHash[parentKey][childKey] syntax.
//Basically, it creates a Table in the place of the parent key if
//it didn't already get created earlier.
method operator [] takes integer index returns Table
local Table t = Table(this)[index]
if t == 0 then
set t = Table.create()
set Table(this)[index] = t //whoops! Forgot that line. I'm out of practice!
endif
return t
endmethod
//You need to call this on each parent key that you used if you
//intend to destroy the HashTable or simply no longer need that key.
method remove takes integer index returns nothing
local Table t = Table(this)[index]
if t != 0 then
call t.destroy()
call Table(this).remove(index)
endif
endmethod
//Added in version 4.1
method has takes integer index returns boolean
return Table(this).has(index)
endmethod
//HashTables are just fancy Table indices.
method destroy takes nothing returns nothing
call Table(this).destroy()
endmethod
//Like I said above...
static method create takes nothing returns thistype
return Table.create()
endmethod
endstruct
endlibrary
library TasInventoryEx initializer init_function requires optional Table
/* TasInventoryEx 1.5
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/
war3mapImported\TasInventoryEx.fdf
war3mapImported\TasInventoryEx.toc
*/
// 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 real PosX = 0.4
private real PosY = 0.19
private framepointtype Pos = FRAMEPOINT_TOP
private integer Cols = 9
private integer Rows = 1
private real ShowButtonPosX = 0.48
private real ShowButtonPosY = 0.145
private framepointtype ShowButtonPos = FRAMEPOINT_TOPLEFT
private string ShowButtonTexture = "ReplaceableTextures/CommandButtons/BTNDustOfAppearance"
private string ShowButtonTextureDisabled = "ReplaceableTextures/CommandButtonsDisabled/DISBTNDustOfAppearance"
// show the showButton only when the inventory is shown?
public boolean ShowButtonNeedsInventory = true
// showButton closes the UI when clicked while the UI is shown?
public boolean ShowButtonCloses = true
private real TooltipWidth = 0.27
public real TooltipScale = 1.0
public boolean TooltipFixedPosition = true
private real TooltipFixedPositionX = 0.79
private real TooltipFixedPositionY = 0.16
private framepointtype TooltipFixedPositionPoint = FRAMEPOINT_BOTTOMRIGHT
// The Inventory Abilities used by this system, the first in the array needs to be the default Inventory
public integer array InventorySkills
private abilityintegerlevelfield AbilityField
public timer TimerUpdate
public trigger Trigger
public trigger TriggerESC
public trigger TriggerItemGain
public trigger TriggerItemDrop
public trigger TriggerUnitRevived
public trigger TriggerLife
public trigger TriggerReInkarnationDone
public trigger TriggerUIOpen
public trigger TriggerUIClose
public trigger TriggerUIBagButton
public trigger TriggerUISlider
public trigger TriggerUIWheel
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
return true
endfunction
private function UserInit takes nothing returns nothing
set InventorySkills[0] = 'AInv'
set InventorySkills[1] = 'A000'
set InventorySkills[2] = 'A001'
// set InventorySkills[1] = 'Apak'
// set InventorySkills[2] = 'Aiun'
//set InventorySkills[3] = 'Aien'
// set InventorySkills[4] = 'Aihn'
//set InventorySkills[5] = 'Aion'
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 FrameLoseFocus takes nothing returns nothing
if GetLocalPlayer() == GetTriggerPlayer() then
call BlzFrameSetEnable(BlzGetTriggerFrame(), false)
call BlzFrameSetEnable(BlzGetTriggerFrame(), true)
endif
endfunction
private function BagButtonAction takes nothing returns nothing
local player p = GetTriggerPlayer()
local integer pId = GetPlayerId(GetTriggerPlayer())
local integer bagIndex = S2I(BlzFrameGetText(BlzGetTriggerFrame())) + Offset[pId]
local unit u = Selected[pId]
local item i
local item newItem
local ability abi
if GetPlayerAlliance(GetOwningPlayer(u), p, ALLIANCE_SHARED_CONTROL) then
set i = RemoveIndex(u, bagIndex)
set newItem = CreateItem(GetItemTypeId(i), GetUnitX(u), GetUnitY(u))
call CopyItemData(i, newItem)
call RemoveItem(i)
set abi = BlzGetUnitAbility(u, InventorySkills[1])
call BlzSetAbilityIntegerLevelField(abi, AbilityField, 0, 0)
call UnitAddItem(u, newItem)
call BlzSetAbilityIntegerLevelField(abi, AbilityField, 0, 6)
endif
set u = null
set i = null
set newItem = null
set abi = null
call FrameLoseFocus()
endfunction
private function WheelAction takes nothing returns nothing
local boolean upwards = BlzGetTriggerFrameValue() > 0
if GetLocalPlayer() == GetTriggerPlayer() then
if upwards then
call BlzFrameSetValue(BlzGetFrameByName("TasInventoryExSlider", 0), BlzFrameGetValue(BlzGetFrameByName("TasInventoryExSlider", 0)) + 1)
else
call BlzFrameSetValue(BlzGetFrameByName("TasInventoryExSlider", 0), BlzFrameGetValue(BlzGetFrameByName("TasInventoryExSlider", 0)) - 1)
endif
endif
endfunction
private function CloseButtonAction takes nothing returns nothing
local integer pId = GetPlayerId(GetTriggerPlayer())
if GetLocalPlayer() == GetTriggerPlayer() then
call BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExPanel", 0), false)
call BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExPopUpPanel", 0), false)
endif
call FrameLoseFocus()
endfunction
private function ShowButtonAction takes nothing returns nothing
local integer pId = GetPlayerId(GetTriggerPlayer())
if GetLocalPlayer() == GetTriggerPlayer() then
if ShowButtonCloses and BlzFrameIsVisible(BlzGetFrameByName("TasInventoryExPanel", 0)) then
call BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExPanel", 0), false)
call BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExPopUpPanel", 0), false)
else
call BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExPanel", 0), true)
call BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExPopUpPanel", 0), false)
endif
endif
call FrameLoseFocus()
endfunction
private function SliderAction takes nothing returns nothing
set Offset[GetPlayerId(GetTriggerPlayer())] = R2I(BlzGetTriggerFrameValue()*Cols)
endfunction
private function SelectAction takes nothing returns nothing
local integer pId = GetPlayerId(GetTriggerPlayer())
set Selected[pId] = GetTriggerUnit()
set Offset[pId] = 0
endfunction
private function ESCAction takes nothing returns nothing
if GetLocalPlayer() == GetTriggerPlayer() then
call BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExPanel", 0), false)
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
// dummies do not use the bag feature
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 UnitReInkarnationDoneAction takes nothing returns nothing
local unit u
local integer i = BlzGroupGetSize(WaitingGroup) - 1
loop
exitwhen i < 0
set u = BlzGroupUnitAt(WaitingGroup, i)
if not IsUnitType(u, UNIT_TYPE_DEAD) then
call GroupRemoveUnit(WaitingGroup, u)
call ReAddInventories(u)
endif
set i = i - 1
endloop
set u = null
endfunction
private function ItemDropAction takes nothing returns nothing
local integer loopA
local integer unitHandle
local unit u
local item i
if not ValidUnit(GetTriggerUnit()) then
return
endif
// 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
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 UpdateUI takes nothing returns nothing
local integer pId = GetPlayerId(GetLocalPlayer())
local integer unitHandle = GetHandleId(Selected[pId])
static if LIBRARY_Table then
local integer itemCount = data.BagItem[unitHandle].integer[0]
else
local integer itemCount = LoadInteger(data.Hash, unitHandle,0)
endif
local integer offset = Offset[pId]
local integer max
local integer itemCode
local item it
local string text = ""
local integer dataIndex
local integer i
// When the options from HeroScoreFrame are in this map use the tooltip&total scale slider
if GetHandleId(BlzGetFrameByName("HeroScoreFrameOptionsSlider1", 0)) > 0 then
set TooltipScale = BlzFrameGetValue(BlzGetFrameByName("HeroScoreFrameOptionsSlider1", 0))
endif
if GetHandleId(BlzGetFrameByName("HeroScoreFrameOptionsSlider3", 0)) > 0 then
call BlzFrameSetScale(BlzGetFrameByName("TasInventoryExPanel", 0), BlzFrameGetValue(BlzGetFrameByName("HeroScoreFrameOptionsSlider3", 0)))
endif
call BlzFrameSetScale(BlzGetFrameByName("TasInventoryExTooltipPanel", 0), TooltipScale)
call BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExSlot", 0), ValidUnit(Selected[pId]) and (not ShowButtonNeedsInventory or BlzFrameIsVisible(BlzGetOriginFrame(ORIGIN_FRAME_ITEM_BUTTON, 0))))
call BlzFrameSetText(BlzGetFrameByName("TasInventoryExSlotButtonOverLayText", 0), I2S(itemCount))
if BlzFrameIsVisible(BlzGetFrameByName("TasInventoryExPanel", 0)) then
if itemCount > 0 then
// scroll by rows
set max = IMaxBJ(0, (itemCount+Cols - Cols*Rows)/Cols)
call BlzFrameSetMinMaxValue(BlzGetFrameByName("TasInventoryExSlider", 0), 0, max)
call BlzFrameSetText(BlzGetFrameByName("TasInventoryExSliderTooltip", 0), I2S(R2I(offset/Cols))+"/"+I2S(max))
else
call BlzFrameSetMinMaxValue(BlzGetFrameByName("TasInventoryExSlider", 0), 0, 0)
call BlzFrameSetText(BlzGetFrameByName("TasInventoryExSliderTooltip", 0), "")
endif
set i = 1
loop
exitwhen i > Cols*Rows
set dataIndex = i + offset
call BlzFrameSetEnable(BlzGetFrameByName("TasInventoryExSlotButton", i), dataIndex <= itemCount)
if dataIndex <= itemCount then
static if LIBRARY_Table then
set it = data.BagItem[unitHandle].item[dataIndex]
else
set it = LoadItemHandle(data.Hash, unitHandle, dataIndex)
endif
set itemCode = GetItemTypeId(it)
call BlzFrameSetTexture(BlzGetFrameByName("TasInventoryExSlotButtonBackdrop", i), BlzGetAbilityIcon(itemCode) , 0, true)
call BlzFrameSetTexture(BlzGetFrameByName("TasInventoryExSlotButtonBackdropPushed", i), BlzGetAbilityIcon(itemCode) , 0, true)
call BlzFrameSetText(BlzGetFrameByName("TasInventoryExSlotButtonTooltip", i), GetObjectName(itemCode)+ "|n"+BlzGetAbilityExtendedTooltip(itemCode, 0))
if GetItemCharges(it) > 0 then
call BlzFrameSetText(BlzGetFrameByName("TasInventoryExSlotButtonOverLayText", i), I2S(GetItemCharges(it)))
call BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExSlotButtonOverLay", i), true)
else
call BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExSlotButtonOverLay", i), false)
endif
else
call BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExSlotButtonOverLay", i), false)
call BlzFrameSetText(BlzGetFrameByName("TasInventoryExSlotButtonTooltip", i), "")
endif
set i = i + 1
endloop
endif
set it = null
endfunction
private function CreateTextTooltip takes framehandle frame, string wantedframeName, integer wantedCreateContext, string text returns framehandle
// this FRAME is important when the Box is outside of 4:3 it can be limited to 4:3.
local framehandle toolTipParent = BlzCreateFrameByType("FRAME", "", BlzGetFrameByName("TasInventoryExTooltipPanel", 0), "", 0)
local framehandle toolTipBox = BlzCreateFrame("TasToolTipBox", toolTipParent, 0, 0)
local framehandle toolTip = BlzCreateFrameByType("TEXT", wantedframeName, toolTipBox, "TasTooltipText", wantedCreateContext)
if TooltipFixedPosition then
call BlzFrameSetAbsPoint(toolTip, TooltipFixedPositionPoint, TooltipFixedPositionX, TooltipFixedPositionY)
else
call BlzFrameSetPoint(toolTip, FRAMEPOINT_TOP, frame, FRAMEPOINT_BOTTOM, 0, -0.008)
endif
call BlzFrameSetPoint(toolTipBox, FRAMEPOINT_TOPLEFT, toolTip, FRAMEPOINT_TOPLEFT, -0.008, 0.008)
call BlzFrameSetPoint(toolTipBox, FRAMEPOINT_BOTTOMRIGHT, toolTip, FRAMEPOINT_BOTTOMRIGHT, 0.008, -0.008)
call BlzFrameSetText(toolTip, text)
call BlzFrameSetTooltip(frame, toolTipParent)
call BlzFrameSetSize(toolTip, TooltipWidth, 0)
return toolTip
endfunction
private function InitFrames takes nothing returns nothing
local boolean loaded = BlzLoadTOCFile("war3mapImported/TasInventoryEx.toc")
local framehandle panel
local framehandle frame
local framehandle frame2
local framehandle frame3
local integer count = 0
local integer buttonIndex = 0
local boolean backup
set panel = BlzCreateFrameByType("BUTTON", "TasInventoryExPanel", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), "", 0)
call BlzFrameSetAbsPoint(panel, Pos, PosX, PosY)
call BlzFrameSetAllPoints(BlzCreateFrame("TasInventoryExBox", panel, 0, 0), panel)
call BlzTriggerRegisterFrameEvent(TriggerUIWheel, panel, FRAMEEVENT_MOUSE_WHEEL)
call BlzCreateFrameByType("BUTTON", "TasInventoryExTooltipPanel", panel, "", 0)
// Custom Bag
set count = 0
set buttonIndex = 1
loop
exitwhen buttonIndex > Rows*Cols
set frame = BlzCreateFrame("TasInventoryExSlot", panel, 0, buttonIndex)
call BlzGetFrameByName("TasInventoryExSlotButton", buttonIndex)
call BlzGetFrameByName("TasInventoryExSlotButtonBackdrop", buttonIndex)
call BlzGetFrameByName("TasInventoryExSlotButtonBackdropDisabled", buttonIndex)
call BlzGetFrameByName("TasInventoryExSlotButtonBackdropPushed", buttonIndex)
call BlzGetFrameByName("TasInventoryExSlotButtonOverLay", buttonIndex)
call BlzGetFrameByName("TasInventoryExSlotButtonOverLayText", buttonIndex)
call CreateTextTooltip(BlzGetFrameByName("TasInventoryExSlotButton", buttonIndex), "TasInventoryExSlotButtonTooltip", buttonIndex, "")
call BlzTriggerRegisterFrameEvent(TriggerUIBagButton, BlzGetFrameByName("TasInventoryExSlotButton", buttonIndex), FRAMEEVENT_CONTROL_CLICK)
call BlzTriggerRegisterFrameEvent(TriggerUIWheel, BlzGetFrameByName("TasInventoryExSlotButton", buttonIndex), FRAMEEVENT_MOUSE_WHEEL)
call BlzFrameSetText(BlzGetFrameByName("TasInventoryExSlotButton", buttonIndex), I2S(buttonIndex))
set count = count + 1
if count > Cols then
call BlzFrameSetPoint(frame, FRAMEPOINT_TOPLEFT, BlzGetFrameByName("TasInventoryExSlot", buttonIndex - Cols), FRAMEPOINT_BOTTOMLEFT, 0, -0.002)
set count = 1
elseif buttonIndex > 1 then
call BlzFrameSetPoint(frame, FRAMEPOINT_TOPLEFT, BlzGetFrameByName("TasInventoryExSlot", buttonIndex - 1), FRAMEPOINT_TOPRIGHT, 0.002, 0)
endif
set buttonIndex = buttonIndex + 1
endloop
if GetHandleId(frame) == 0 then
call BJDebugMsg("Error - Creating TasInventoryExSlot")
endif
call BlzFrameSetSize(panel, BlzFrameGetWidth(frame)*Cols + (Cols - 1)*0.002 + 0.02, BlzFrameGetHeight(frame)*Rows + (Rows - 1)*0.002 + 0.012)
call BlzFrameSetPoint(BlzGetFrameByName("TasInventoryExSlot", 1), FRAMEPOINT_TOPLEFT, panel, FRAMEPOINT_TOPLEFT, 0.006, -0.006)
set frame = BlzCreateFrameByType("SLIDER", "TasInventoryExSlider", panel, "QuestMainListScrollBar", 0)
call BlzFrameClearAllPoints(frame)
call BlzFrameSetPoint(frame, FRAMEPOINT_BOTTOMRIGHT, panel, FRAMEPOINT_BOTTOMRIGHT, -0.004, 0.008)
call BlzFrameSetSize(frame, BlzFrameGetWidth(frame), BlzFrameGetHeight(panel) - 0.02)
//BlzFrameSetStepSize(frame, Cols)
set backup = TooltipFixedPosition
set TooltipFixedPosition = false
call CreateTextTooltip(frame, "TasInventoryExSliderTooltip", 0, "")
call BlzFrameSetSize(BlzGetFrameByName("TasInventoryExSliderTooltip", 0), 0, 0)
set TooltipFixedPosition = backup
call BlzTriggerRegisterFrameEvent(TriggerUIWheel, frame, FRAMEEVENT_MOUSE_WHEEL)
call BlzTriggerRegisterFrameEvent(TriggerUISlider, frame, FRAMEEVENT_SLIDER_VALUE_CHANGED)
// show Buttons
set frame = BlzCreateFrame("TasInventoryExSlot", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 0, 0)
call BlzFrameSetAbsPoint(frame, ShowButtonPos, ShowButtonPosX, ShowButtonPosY)
call BlzFrameSetTexture(BlzGetFrameByName("TasInventoryExSlotButtonBackdrop", 0), ShowButtonTexture, 0, false)
call BlzFrameSetTexture(BlzGetFrameByName("TasInventoryExSlotButtonBackdropDisabled", 0), ShowButtonTextureDisabled, 0, false)
call BlzFrameSetTexture(BlzGetFrameByName("TasInventoryExSlotButtonBackdropPushed", 0), ShowButtonTexture, 0, false)
call BlzGetFrameByName("TasInventoryExSlotButtonOverLay", 0)
call BlzGetFrameByName("TasInventoryExSlotButtonOverLayText", 0)
call BlzTriggerRegisterFrameEvent(TriggerUIOpen, BlzGetFrameByName("TasInventoryExSlotButton", 0), FRAMEEVENT_CONTROL_CLICK)
call BlzFrameSetEnable(BlzGetFrameByName("TasInventoryExSlotButton", 0), true)
set frame = BlzCreateFrameByType("GLUETEXTBUTTON", "TasInventoryExCloseButton", panel, "ScriptDialogButton", 0)
call BlzFrameSetSize(frame, 0.03, 0.03)
call BlzFrameSetText(frame, "X")
call BlzFrameSetPoint(frame, FRAMEPOINT_CENTER, BlzFrameGetParent(frame), FRAMEPOINT_TOPRIGHT, -0.002, -0.002)
call BlzTriggerRegisterFrameEvent(TriggerUIClose, frame, FRAMEEVENT_CONTROL_CLICK)
// BlzFrameClick(BlzGetFrameByName("TasInventoryExCloseButton", 0))
call BlzFrameSetLevel(BlzGetFrameByName("TasInventoryExTooltipPanel", 0), 8)
call BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExPopUpPanel", 0), false)
call BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExPanel", 0), false)
call BlzGetOriginFrame(ORIGIN_FRAME_ITEM_BUTTON, 0)
endfunction
private function At0s takes nothing returns nothing
local integer i
set AbilityField = ConvertAbilityIntegerLevelField('inv1')
static if LIBRARY_Table then
set data.BagItem = HashTable.create()
else
set data.Hash = InitHashtable()
endif
set TimerUpdate = CreateTimer()
call TimerStart(TimerUpdate, 0.1, true, function UpdateUI)
set Trigger = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(Trigger, EVENT_PLAYER_UNIT_SELECTED)
call TriggerAddAction(Trigger, function SelectAction)
set TriggerESC = CreateTrigger()
set i = 0
loop
call BlzTriggerRegisterPlayerKeyEvent(TriggerESC, Player(i), OSKEY_ESCAPE, 0, true)
set i = i + 1
exitwhen i >= bj_MAX_PLAYERS
endloop
call TriggerAddAction(TriggerESC, function ESCAction)
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 TriggerUIOpen = CreateTrigger()
call TriggerAddAction(TriggerUIOpen, function ShowButtonAction)
set TriggerUIClose = CreateTrigger()
call TriggerAddAction(TriggerUIClose, function CloseButtonAction)
set TriggerUIBagButton = CreateTrigger()
call TriggerAddAction(TriggerUIBagButton, function BagButtonAction)
set TriggerUISlider = CreateTrigger()
call TriggerAddAction(TriggerUISlider, function SliderAction)
set TriggerUIWheel = CreateTrigger()
call TriggerAddAction(TriggerUIWheel, function WheelAction)
call UserInit()
call InitFrames()
static if LIBRARY_FrameLoader then
call FrameLoaderAdd(function InitFrames)
endif
call DestroyTimer(GetExpiredTimer())
endfunction
private function init_function takes nothing returns nothing
call TimerStart(CreateTimer(), 0, false, function At0s)
endfunction
endlibrary
--[[ TasFrameAction by Tasyen
TasFrameAction is an Lua system to not have to care about Trigger and FrameEvents for FrameAction. All FrameEvents are binded to one trigger that trigger than calls the action for
handles frame Events in one trigger, care only about the actionFunction itself.
calls give Actions inside xpcall.
Supports only one Action per Event+Frame
Example
TasSliderAction(sliderFrame, function(frame, player, value)
print(BlzFrameGetName(frame), GetPlayerId(player), value)
end)
TasButtonAction(frame, function(frame, player))
wrapper for TasFrameAction meant for BUTTON just ControlClick
Removes focus & StopCamera
takes FRAMEEVENT_CONTROL_CLICK from TasFrameAction for this frame
TasSliderAction(frame, function(frame, player, value))
action happens when a Value is set
TasSliderAction.AvoidPoll (true) skip actions with the same value in a row by 1 player
takes FRAMEEVENT_MOUSE_WHEEL and FRAMEEVENT_SLIDER_VALUE_CHANGED from TasFrameAction for this frame
TasEditBoxAction(frame[, actionEnter, actionEdit])
skip an action to not have one for that event
function(frame, player, text)
TasDialogAction(frame, function(frame, player, accept))
TasCheckBoxAction(frame, function(frame, player, checked))
TasFrameMouseMoveAction(frame, actionEnter(frame, player), actionLeave(frame, player), actionWheel(frame, player, upwards))
TasFrameMouseUpAction(frame, action(frame, player, rightClick)
Happens when the mouse click is released over frame
rightClick does not work probably during Paused Games
TasMenuAction(frame, function(frame, player, value))
for POPUPMENU
functions above use an entry in TasFrameAction
TasFrameAction(frame, action, frameEvent)
action = function(frame, player, value, text)
]]
TasFrameAction = setmetatable({
EVENTNAME= {
"CONTROL_CLICK", "MOUSE_ENTER", "MOUSE_LEAVE", "MOUSE_UP"
, "MOUSE_DOWN", "MOUSE_WHEEL", "CHECKBOX_CHECKED", "CHECKBOX_UNCHECKED"
, "EDITBOX_TEXT_CHANGED", "POPUPMENU_ITEM_CHANGED", "MOUSE_DOUBLECLICK", "SPRITE_ANIM_UPDATE"
, "SLIDER_VALUE_CHANGED", "DIALOG_CANCEL", "DIALOG_ACCEPT", "EDITBOX_ENTER"
}
,ERROR = function(x)
print("TasFrameAction - ERROR")
print("FrameName", BlzFrameGetName(BlzGetTriggerFrame()), TasFrameAction.EVENTNAME[GetHandleId(BlzGetTriggerFrameEvent())]
, "PlayerId:", GetPlayerId(GetTriggerPlayer())
-- , BlzGetTriggerFrameValue(), BlzGetTriggerFrameText()
)
print(x)
return x
end
}
,{
__call = function(table, frame, action, frameEvent)
-- first call?
if not TasFrameAction.Trigger then
-- FrameEventData
for i = 1, 16 do
TasFrameAction[ConvertFrameEventType(i)] = {}
end
-- yes, Create the Trigger and the click handler.
TasFrameAction.Trigger = CreateTrigger()
TriggerAddAction(TasFrameAction.Trigger, function()
local frame = BlzGetTriggerFrame()
local event = BlzGetTriggerFrameEvent()
-- call the action set for that frame&Event
if TasFrameAction[event][frame] then
xpcall(TasFrameAction[event][frame], TasFrameAction.ERROR, frame, GetTriggerPlayer(), BlzGetTriggerFrameValue(), BlzGetTriggerFrameText())
--TasFrameAction[event][frame](frame, GetTriggerPlayer(), BlzGetTriggerFrameValue(), BlzGetTriggerFrameText())
end
frame = nil
event = nil
end)
end
-- create the click event only when it does not exist yet.
if not TasFrameAction[frameEvent][frame] then
BlzTriggerRegisterFrameEvent(TasFrameAction.Trigger, frame, frameEvent)
end
-- Using [frameEvent][frame] brings a fixed amout of Tables.
TasFrameAction[frameEvent][frame] = action
end
})
TasSliderAction = setmetatable({
AvoidPoll = true
,WHEEL = function(frame, player, value, text)
if GetLocalPlayer() == player then
if value > 0 then
BlzFrameSetValue(frame, BlzFrameGetValue(frame) + 1)
else
BlzFrameSetValue(frame, BlzFrameGetValue(frame) - 1)
end
end
end
,VALUE = function(frame, player, value, text)
-- avoid Polling
if not TasSliderAction.AvoidPoll or TasSliderAction.AvoidPollData[player][frame] ~= value then
TasSliderAction.AvoidPollData[player][frame] = value
TasSliderAction[frame](frame, player, value)
end
end
}
,{__call = function(table, frame, action)
-- first call?
if not TasSliderAction.AvoidPollData then
TasSliderAction.AvoidPollData = {}
for i=0, bj_MAX_PLAYER_SLOTS - 1 do TasSliderAction.AvoidPollData[Player(i)] = __jarray(0.0) end
end
TasFrameAction(frame, TasSliderAction.WHEEL, FRAMEEVENT_MOUSE_WHEEL)
TasFrameAction(frame, TasSliderAction.VALUE, FRAMEEVENT_SLIDER_VALUE_CHANGED)
TasSliderAction[frame] = action
end
})
TasSliderAction.Set = TasSliderAction
TasButtonAction = setmetatable({
ACTION = function(frame, player, value, text)
-- remove Focus for the local clicking player
if player == GetLocalPlayer() then
BlzFrameSetEnable(frame, false)
BlzFrameSetEnable(frame, true)
StopCamera()
end
-- call the action set for that frame
TasButtonAction[frame](frame, player)
end
},{
__call = function(table, frame, action)
TasFrameAction(frame, TasButtonAction.ACTION, FRAMEEVENT_CONTROL_CLICK)
TasButtonAction[frame] = action
end
})
TasButtonAction.Set = TasButtonAction
TasEditBoxAction = setmetatable({
A = {}
,B = {}
,ENTER = function(frame, player, value, text)
TasEditBoxAction.A[frame](frame, player, text)
end
,EDIT = function(frame, player, value, text)
TasEditBoxAction.B[frame](frame, player, text)
end
},{
__call = function(table, frame, actionEnter, actionEdit)
if actionEnter then
TasFrameAction(frame, TasEditBoxAction.ENTER, FRAMEEVENT_EDITBOX_ENTER)
TasEditBoxAction.A[frame] = actionEnter
end
if actionEdit then
TasFrameAction(frame, TasEditBoxAction.EDIT, FRAMEEVENT_EDITBOX_TEXT_CHANGED)
TasEditBoxAction.B[frame] = actionEdit
end
end
})
TasEditBoxAction.Set = TasEditBoxAction
TasDialogAction = setmetatable({
ACTION = function(frame, player)
TasDialogAction[frame](frame, player, BlzGetTriggerFrameEvent() == FRAMEEVENT_DIALOG_ACCEPT)
end
},{
__call = function(table, frame, action)
TasFrameAction(frame, TasDialogAction.ACTION, FRAMEEVENT_DIALOG_ACCEPT)
TasFrameAction(frame, TasDialogAction.ACTION, FRAMEEVENT_DIALOG_CANCEL)
TasDialogAction[frame] = action
end
})
TasDialogAction.Set = TasDialogAction
TasCheckBoxAction = setmetatable({
ACTION = function(frame, player)
TasCheckBoxAction[frame](frame, player, BlzGetTriggerFrameEvent() == FRAMEEVENT_CHECKBOX_CHECKED)
end
},{
__call = function(table, frame, action)
TasFrameAction(frame, TasCheckBoxAction.ACTION, FRAMEEVENT_CHECKBOX_CHECKED)
TasFrameAction(frame, TasCheckBoxAction.ACTION, FRAMEEVENT_CHECKBOX_UNCHECKED)
TasCheckBoxAction[frame] = action
end
})
TasCheckBoxAction.Set = TasCheckBoxAction
TasFrameMouseMoveAction = setmetatable({
A = {}
,B = {}
,C = {}
,ENTER = function(frame, player)
TasFrameMouseMoveAction.A[frame](frame, player)
end
,LEAVE = function(frame, player)
TasFrameMouseMoveAction.B[frame](frame, player)
end
,WHEEL = function(frame, player, value)
TasFrameMouseMoveAction.C[frame](frame, player, value > 0)
end
},{
__call = function(table, frame, actionEnter, actionLeave, actionWheel)
if actionEnter then
TasFrameAction(frame, TasFrameMouseMoveAction.ENTER, FRAMEEVENT_MOUSE_ENTER)
TasFrameMouseMoveAction.A[frame] = actionEnter
end
if actionLeave then
TasFrameAction(frame, TasFrameMouseMoveAction.LEAVE, FRAMEEVENT_MOUSE_LEAVE)
TasFrameMouseMoveAction.B[frame] = actionLeave
end
if actionWheel then
TasFrameAction(frame, TasFrameMouseMoveAction.WHEEL, FRAMEEVENT_MOUSE_WHEEL)
TasFrameMouseMoveAction.C[frame] = actionWheel
end
end
})
TasFrameMouseMoveAction.Set = TasFrameMouseMoveAction
TasFrameMouseUpAction = setmetatable({
TriggerCount = 0
,ACTION = function(frame, player)
-- during Pause EVENT_PLAYER_MOUSE_UP does not work, -> when The counter didn't increase since last Time do not allow this count as right click
local clickWorked = GetTriggerExecCount(TasFrameMouseUpAction.MouseTrigger) > TasFrameMouseUpAction.TriggerCount
TasFrameMouseUpAction[frame](frame, player, TasFrameMouseUpAction.RightClick[player] and clickWorked)
TasFrameMouseUpAction.TriggerCount = GetTriggerExecCount(TasFrameMouseUpAction.MouseTrigger)
end
},{
__call = function(table, frame, action)
if not TasFrameMouseUpAction.MouseTrigger then
TasFrameMouseUpAction.RightClick = __jarray(false)
TasFrameMouseUpAction.MouseTrigger = CreateTrigger()
for i = 0, bj_MAX_PLAYERS - 1 do
TriggerRegisterPlayerEvent(TasFrameMouseUpAction.MouseTrigger, Player(i), EVENT_PLAYER_MOUSE_UP)
end
TriggerAddAction(TasFrameMouseUpAction.MouseTrigger, function()
TasFrameMouseUpAction.RightClick[GetTriggerPlayer()] = GetHandleId(BlzGetTriggerPlayerMouseButton()) == GetHandleId(MOUSE_BUTTON_TYPE_RIGHT)
end)
end
TasFrameAction(frame, TasFrameMouseUpAction.ACTION, FRAMEEVENT_MOUSE_UP)
TasFrameMouseUpAction[frame] = action
end
})
TasFrameMouseUpAction.Set = TasFrameMouseUpAction
TasMenuAction = setmetatable({
ACTION = function(frame, player, value)
TasMenuAction[frame](frame, player, value)
end
},{
__call = function(table, frame, action)
TasFrameAction(frame, TasMenuAction.ACTION, FRAMEEVENT_POPUPMENU_ITEM_CHANGED)
TasMenuAction[frame] = action
end
})
TasMenuAction.Set = TasMenuAction
do
--[[
TasInventoryEx 1.5
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:
TasFrameAction
war3mapImported\TasInventoryEx.fdf
war3mapImported\TasInventoryEx.toc
]]
TasInventoryEx = {
PosX = 0.4
,PosY = 0.19
,Pos = FRAMEPOINT_TOP
,Cols = 9
,Rows = 1
,ShowButtonPosX = 0.48
,ShowButtonPosY = 0.145
,ShowButtonPos = FRAMEPOINT_TOPLEFT
,ShowButtonTexture = "ReplaceableTextures/CommandButtons/BTNDustOfAppearance"
,ShowButtonTextureDisabled = "ReplaceableTextures/CommandButtonsDisabled/DISBTNDustOfAppearance"
-- showButton closes the UI when clicked while the UI is shown?
,ShowButtonCloses = true
,TooltipWidth = 0.27
,TooltipScale = 1.0
,TooltipFixedPosition = true
,TooltipFixedPositionX = 0.79
,TooltipFixedPositionY = 0.16
,TooltipFixedPositionPoint = FRAMEPOINT_BOTTOMRIGHT
,DummySkill = FourCC('Aloc')
-- filters out units that should not Use TasInventoryEx
,ValidUnit = function(unit)
-- Units with the Locust skill do not use this System
if GetUnitAbilityLevel(unit, TasInventoryEx.DummySkill) > 0 then
return false
end
-- The extra Players don't use this
if GetPlayerId(GetOwningPlayer(unit)) >= bj_MAX_PLAYERS then
return false
end
if not IsUnitType(unit, UNIT_TYPE_HERO) then
return false
end
return true
end
-- the Inventory Abilities used by this system, the first in the array needs to be the default Inventory
,InventorySkills = {
--'AInv','Apak','Aiun','Aien','Aihn','Aion'
'AInv','A000','A001'
}
,Selected = {}
,Offset = __jarray(0)
,Indexes = {2}
}
local this = TasInventoryEx
local function CopyItemData(source, target)
SetItemCharges(target, GetItemCharges(source))
SetItemInvulnerable(target, IsItemInvulnerable(source))
SetItemUserData(target, GetItemUserData(source))
SetItemPlayer(target, GetItemPlayer(source), true)
SetWidgetLife(target, GetWidgetLife(source))
end
local function BagButtonAction(frame, player)
if GetPlayerAlliance(GetOwningPlayer(this.Selected[player]), player, ALLIANCE_SHARED_CONTROL) then
local index = tonumber(BlzFrameGetText(BlzGetTriggerFrame())) + this.Offset[player]
local unit = this.Selected[player]
local item = table.remove(this[unit], index)
local newItem = CreateItem(GetItemTypeId(item), GetUnitX(unit), GetUnitY(unit))
CopyItemData(item, newItem)
RemoveItem(item)
local abi
for i, v in ipairs(this.Indexes) do
abi = BlzGetUnitAbility(unit, this.InventorySkills[v])
BlzSetAbilityIntegerLevelField(abi, this.AbilityFieldSize, 0, 0)
end
UnitAddItem(unit, newItem)
for i, v in ipairs(this.Indexes) do
abi = BlzGetUnitAbility(unit, this.InventorySkills[v])
BlzSetAbilityIntegerLevelField(abi, this.AbilityFieldSize, 0, 6)
end
item = nil
newItem = nil
unit = nil
abi = nil
end
end
local function NonSliderWheelAction(frame, player, upwards)
-- print("NonSliderWheelAction", upwards)
if GetLocalPlayer() == player then
if upwards then
BlzFrameSetValue(BlzGetFrameByName("TasInventoryExSlider", 0), BlzFrameGetValue(BlzGetFrameByName("TasInventoryExSlider", 0)) + 1)
else
BlzFrameSetValue(BlzGetFrameByName("TasInventoryExSlider", 0), BlzFrameGetValue(BlzGetFrameByName("TasInventoryExSlider", 0)) - 1)
end
end
end
local function CloseButtonAction(frame, player)
if GetLocalPlayer() == player then
BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExPanel", 0), false)
BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExPopUpPanel", 0), false)
end
end
local function ShowButtonAction(frame, player)
if GetLocalPlayer() == player then
if this.ShowButtonCloses and BlzFrameIsVisible(BlzGetFrameByName("TasInventoryExPanel", 0)) then
BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExPanel", 0), false)
BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExPopUpPanel", 0), false)
else
BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExPanel", 0), true)
BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExPopUpPanel", 0), false)
end
end
end
local function SliderAction(frame, player, value)
this.Offset[player] = value*this.Cols
end
local function ReAddInventories(unit)
if not this.ValidUnit(unit) then
return
end
-- revived heroes
if this[unit] then
local backup = {}
local item
-- remember items already owned before getting TasInventory
DisableTrigger(this.TriggerItemDrop)
for i = #this[unit], 1, -1 do
item = table.remove(this[unit])
newItem = CreateItem(GetItemTypeId(item), GetUnitX(unit), GetUnitY(unit))
CopyItemData(item, newItem)
RemoveItem(item)
table.insert(backup, newItem)
end
EnableTrigger(this.TriggerItemDrop)
-- dont remove & readd the first inventory skill, otherwise the inventory grows
--for i, abi in ipairs(this.InventorySkills) do
for i = #this.InventorySkills, 2 ,-1 do
UnitMakeAbilityPermanent(unit, false, this.InventorySkills[i])
UnitRemoveAbility(unit, this.InventorySkills[i])
end
local itemCount = 1
local recreatedCount = 0
--for i, abi in ipairs(this.InventorySkills) do
for i = 2, #this.InventorySkills do
for i = 0, bj_MAX_INVENTORY - 1 do
if GetHandleId(UnitItemInSlot(unit, i)) > 0 then
table.insert(this[unit], UnitItemInSlot(unit, i))
end
end
abi = this.InventorySkills[i]
if GetUnitAbilityLevel(unit, abi) == 0 then
UnitAddAbility(unit, abi)
end
UnitMakeAbilityPermanent(unit, true, abi)
for itemIndex = 1, UnitInventorySize(unit) do
item = backup[itemCount]
itemCount = itemCount + 1
if GetHandleId(item) > 0 then
recreatedCount = recreatedCount + 1
UnitAddItem(unit, item)
end
end
end
backup = nil
newItem = nil
end
unit = nil
item = nil
end
local function UpdateUI()
-- When the options from HeroScoreFrame are in this map use the tooltip&total scale slider
if GetHandleId(BlzGetFrameByName("HeroScoreFrameOptionsSlider1", 0)) > 0 then
this.TooltipScale = BlzFrameGetValue(BlzGetFrameByName("HeroScoreFrameOptionsSlider1", 0))
end
if GetHandleId(BlzGetFrameByName("HeroScoreFrameOptionsSlider3", 0)) > 0 then
BlzFrameSetScale(BlzGetFrameByName("TasInventoryExPanel", 0), BlzFrameGetValue(BlzGetFrameByName("HeroScoreFrameOptionsSlider3", 0)))
end
BlzFrameSetScale(BlzGetFrameByName("TasInventoryExTooltipPanel", 0), this.TooltipScale)
BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExSlot", 0), this.ValidUnit(this.Selected[GetLocalPlayer()]) and BlzFrameIsVisible(BlzGetOriginFrame(ORIGIN_FRAME_ITEM_BUTTON, 0)))
if this[this.Selected[GetLocalPlayer()]] then
BlzFrameSetText(BlzGetFrameByName("TasInventoryExSlotButtonOverLayText", 0), #this[this.Selected[GetLocalPlayer()]])
else
BlzFrameSetText(BlzGetFrameByName("TasInventoryExSlotButtonOverLayText", 0), 0)
end
if BlzFrameIsVisible(BlzGetFrameByName("TasInventoryExPanel", 0)) then
local itemCount, itemBag
local offset = this.Offset[GetLocalPlayer()]
if this[this.Selected[GetLocalPlayer()]] then
itemCount = #this[this.Selected[GetLocalPlayer()]]
itemBag = this[this.Selected[GetLocalPlayer()]]
-- scroll by rows
local max = R2I(math.max(0, (itemCount+this.Cols - this.Cols*this.Rows)/this.Cols) )
-- print(max)
BlzFrameSetMinMaxValue(BlzGetFrameByName("TasInventoryExSlider", 0), 0, max)
BlzFrameSetText(BlzGetFrameByName("TasInventoryExSliderTooltip", 0), R2I(offset/this.Cols).."/"..max)
else
itemCount = 0
BlzFrameSetMinMaxValue(BlzGetFrameByName("TasInventoryExSlider", 0), 0, 0)
BlzFrameSetText(BlzGetFrameByName("TasInventoryExSliderTooltip", 0), "")
end
local itemCode
local text = ""
local dataIndex
for i = 1, this.Cols*this.Rows do
dataIndex = i + offset
BlzFrameSetEnable(BlzGetFrameByName("TasInventoryExSlotButton", i), dataIndex <= itemCount)
if dataIndex <= itemCount then
itemCode = GetItemTypeId(itemBag[dataIndex])
BlzFrameSetTexture(BlzGetFrameByName("TasInventoryExSlotButtonBackdrop", i), BlzGetAbilityIcon(itemCode) , 0, true)
BlzFrameSetTexture(BlzGetFrameByName("TasInventoryExSlotButtonBackdropPushed", i), BlzGetAbilityIcon(itemCode) , 0, true)
BlzFrameSetText(BlzGetFrameByName("TasInventoryExSlotButtonTooltip", i), GetObjectName(itemCode).. "|n"..BlzGetAbilityExtendedTooltip(itemCode, 0))
if GetItemCharges(itemBag[dataIndex]) > 0 then
BlzFrameSetText(BlzGetFrameByName("TasInventoryExSlotButtonOverLayText", i), GetItemCharges(itemBag[dataIndex]))
BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExSlotButtonOverLay", i), true)
else
BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExSlotButtonOverLay", i), false)
end
else
BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExSlotButtonOverLay", i), false)
BlzFrameSetText(BlzGetFrameByName("TasInventoryExSlotButtonTooltip", i), "")
end
end
end
end
local function CreateTextTooltip(frame, wantedframeName, wantedCreateContext, text)
-- this FRAME is important when the Box is outside of 4:3 it can be limited to 4:3.
local toolTipParent = BlzCreateFrameByType("FRAME", "", BlzGetFrameByName("TasInventoryExTooltipPanel", 0), "", 0)
local toolTipBox = BlzCreateFrame("TasToolTipBox", toolTipParent, 0, 0)
local toolTip = BlzCreateFrameByType("TEXT", wantedframeName, toolTipBox, "TasTooltipText", wantedCreateContext)
if this.TooltipFixedPosition then
BlzFrameSetAbsPoint(toolTip, this.TooltipFixedPositionPoint, this.TooltipFixedPositionX, this.TooltipFixedPositionY)
else
BlzFrameSetPoint(toolTip, FRAMEPOINT_TOP, frame, FRAMEPOINT_BOTTOM, 0, -0.008)
end
BlzFrameSetPoint(toolTipBox, FRAMEPOINT_TOPLEFT, toolTip, FRAMEPOINT_TOPLEFT, -0.008, 0.008)
BlzFrameSetPoint(toolTipBox, FRAMEPOINT_BOTTOMRIGHT, toolTip, FRAMEPOINT_BOTTOMRIGHT, 0.008, -0.008)
BlzFrameSetText(toolTip, text)
BlzFrameSetTooltip(frame, toolTipParent)
BlzFrameSetSize(toolTip, this.TooltipWidth, 0)
return toolTip
end
local function InitFrames()
BlzLoadTOCFile("war3mapImported/TasInventoryEx.toc")
local panel, frame, frame2, frame3
panel = BlzCreateFrameByType("BUTTON", "TasInventoryExPanel", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), "", 0)
BlzFrameSetAbsPoint(panel, this.Pos, this.PosX, this.PosY)
BlzFrameSetAllPoints(BlzCreateFrame("TasInventoryExBox", panel, 0, 0), panel)
TasFrameMouseMoveAction(panel, nil, nil, NonSliderWheelAction)
BlzCreateFrameByType("BUTTON", "TasInventoryExTooltipPanel", panel, "", 0)
-- Custom Bag
local count = 0
for buttonIndex = 1, this.Rows*this.Cols do
frame = BlzCreateFrame("TasInventoryExSlot", panel, 0, buttonIndex)
BlzGetFrameByName("TasInventoryExSlotButton", buttonIndex)
BlzGetFrameByName("TasInventoryExSlotButtonBackdrop", buttonIndex)
BlzGetFrameByName("TasInventoryExSlotButtonBackdropDisabled", buttonIndex)
BlzGetFrameByName("TasInventoryExSlotButtonBackdropPushed", buttonIndex)
BlzGetFrameByName("TasInventoryExSlotButtonOverLay", buttonIndex)
BlzGetFrameByName("TasInventoryExSlotButtonOverLayText", buttonIndex)
CreateTextTooltip(BlzGetFrameByName("TasInventoryExSlotButton", buttonIndex), "TasInventoryExSlotButtonTooltip", buttonIndex, "")
TasButtonAction(BlzGetFrameByName("TasInventoryExSlotButton", buttonIndex), BagButtonAction)
TasFrameMouseMoveAction(BlzGetFrameByName("TasInventoryExSlotButton", buttonIndex), nil, nil, NonSliderWheelAction)
BlzFrameSetText(BlzGetFrameByName("TasInventoryExSlotButton", buttonIndex), buttonIndex)
count = count + 1
if count > this.Cols then
BlzFrameSetPoint(frame, FRAMEPOINT_TOPLEFT, BlzGetFrameByName("TasInventoryExSlot", buttonIndex - this.Cols), FRAMEPOINT_BOTTOMLEFT, 0, -0.002)
count = 1
elseif buttonIndex > 1 then
BlzFrameSetPoint(frame, FRAMEPOINT_TOPLEFT, BlzGetFrameByName("TasInventoryExSlot", buttonIndex - 1), FRAMEPOINT_TOPRIGHT, 0.002, 0)
end
end
if GetHandleId(frame) == 0 then print("Error - Creating TasInventoryExSlot") end
BlzFrameSetSize(panel, BlzFrameGetWidth(frame)*this.Cols + (this.Cols - 1)*0.002 + 0.02, BlzFrameGetHeight(frame)*this.Rows + (this.Rows - 1)*0.002 + 0.012)
BlzFrameSetPoint(BlzGetFrameByName("TasInventoryExSlot", 1), FRAMEPOINT_TOPLEFT, panel, FRAMEPOINT_TOPLEFT, 0.006, -0.006)
frame = BlzCreateFrameByType("SLIDER", "TasInventoryExSlider", panel, "QuestMainListScrollBar", 0)
BlzFrameClearAllPoints(frame)
BlzFrameSetPoint(frame, FRAMEPOINT_BOTTOMRIGHT, panel, FRAMEPOINT_BOTTOMRIGHT, -0.004, 0.008)
BlzFrameSetSize(frame, BlzFrameGetWidth(frame), BlzFrameGetHeight(panel) - 0.02)
--BlzFrameSetStepSize(frame, this.Cols)
local backup = this.TooltipFixedPosition
this.TooltipFixedPosition = false
CreateTextTooltip(frame, "TasInventoryExSliderTooltip", 0, "")
BlzFrameSetSize(BlzGetFrameByName("TasInventoryExSliderTooltip", 0), 0, 0)
this.TooltipFixedPosition = backup
TasSliderAction(frame, SliderAction)
-- show Buttons
frame = BlzCreateFrame("TasInventoryExSlot", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 0, 0)
BlzFrameSetAbsPoint(frame, this.ShowButtonPos, this.ShowButtonPosX, this.ShowButtonPosY)
BlzFrameSetTexture(BlzGetFrameByName("TasInventoryExSlotButtonBackdrop", 0), this.ShowButtonTexture, 0, false)
BlzFrameSetTexture(BlzGetFrameByName("TasInventoryExSlotButtonBackdropDisabled", 0), this.ShowButtonTextureDisabled, 0, false)
BlzFrameSetTexture(BlzGetFrameByName("TasInventoryExSlotButtonBackdropPushed", 0), this.ShowButtonTexture, 0, false)
BlzGetFrameByName("TasInventoryExSlotButtonOverLay", 0)
BlzGetFrameByName("TasInventoryExSlotButtonOverLayText", 0)
TasButtonAction(BlzGetFrameByName("TasInventoryExSlotButton", 0), ShowButtonAction)
BlzFrameSetEnable(BlzGetFrameByName("TasInventoryExSlotButton", 0), true)
frame = BlzCreateFrameByType("GLUETEXTBUTTON", "TasInventoryExCloseButton", panel, "ScriptDialogButton", 0)
BlzFrameSetSize(frame, 0.03, 0.03)
BlzFrameSetText(frame, "X")
BlzFrameSetPoint(frame, FRAMEPOINT_CENTER, BlzFrameGetParent(frame), FRAMEPOINT_TOPRIGHT, -0.002, -0.002)
TasButtonAction(frame, CloseButtonAction)
BlzFrameSetLevel(BlzGetFrameByName("TasInventoryExTooltipPanel", 0), 8)
BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExPanel", 0), false)
BlzGetOriginFrame(ORIGIN_FRAME_ITEM_BUTTON, 0)
end
local real = MarkGameStarted
function MarkGameStarted()
real()
this.AbilityFieldSize = ConvertAbilityIntegerLevelField(FourCC('inv1'))
this.AbilityFieldDrop = ConvertAbilityIntegerLevelField(FourCC('inv2'))
this.AbilityFieldUse = ConvertAbilityIntegerLevelField(FourCC('inv3'))
this.AbilityFieldGain = ConvertAbilityIntegerLevelField(FourCC('inv4'))
this.AbilityFieldCanDrop = ConvertAbilityIntegerLevelField(FourCC('inv5'))
for key, value in pairs(this.InventorySkills) do
if type(key) == "string" then key = FourCC(key) end
if type(value) == "string" then value = FourCC(value) end
this.InventorySkills[key] = value
end
this.TimerUpdate = CreateTimer()
TimerStart(this.TimerUpdate, 0.1, true, UpdateUI)
this.Trigger = CreateTrigger()
TriggerRegisterAnyUnitEventBJ(this.Trigger, EVENT_PLAYER_UNIT_SELECTED)
TriggerAddAction(this.Trigger, function()
this.Selected[GetTriggerPlayer()] = GetTriggerUnit()
this.Offset[GetTriggerPlayer()] = 0
end)
this.TriggerESC = CreateTrigger()
for i = 0, bj_MAX_PLAYERS - 1 do
BlzTriggerRegisterPlayerKeyEvent(this.TriggerESC, Player(i), OSKEY_ESCAPE, 0, true)
end
TriggerAddAction(this.TriggerESC, function()
if GetLocalPlayer() == GetTriggerPlayer() then
BlzFrameSetVisible(BlzGetFrameByName("TasInventoryExPanel", 0), false)
end
end)
this.TriggerItemGain = CreateTrigger()
TriggerRegisterAnyUnitEventBJ(this.TriggerItemGain, EVENT_PLAYER_UNIT_PICKUP_ITEM)
TriggerAddAction(this.TriggerItemGain, function()
-- powerups, destroyed item don't matter
if IsItemPowerup(GetManipulatedItem()) or GetItemTypeId(GetManipulatedItem()) <= 0 or GetWidgetLife(GetManipulatedItem()) <= 0 then
return
end
if not this.ValidUnit(GetTriggerUnit()) then
return
end
local item = GetManipulatedItem()
local unit = GetTriggerUnit()
-- after reinkarnation or death the inventories don't work the way Wanted: has to be repeated
-- print("Has 2 Inventories",GetUnitAbilityLevel(unit, this.InventorySkills[1]) > 0 and GetUnitAbilityLevel(unit, this.InventorySkills[2]) > 0)
if not this[unit] then
this[unit] = {}
-- remember items already owned before getting TasInventory
for i = 0, bj_MAX_INVENTORY - 1 do
if GetHandleId(UnitItemInSlot(unit, i)) > 0 then
table.insert(this[unit], UnitItemInSlot(unit, i))
end
end
for i, abi in ipairs(this.InventorySkills) do
if GetUnitAbilityLevel(unit, abi) == 0 then
UnitAddAbility(unit, abi)
end
UnitMakeAbilityPermanent(unit, true, abi)
end
TriggerRegisterUnitLifeEvent(this.TriggerLife, unit, LESS_THAN_OR_EQUAL, 0.41)
elseif this[unit] and not UnitHasItem(unit, item) then
table.insert(this[unit], item)
elseif this[unit] and UnitHasItem(unit, item) then
end
item = nil
unit = nil
end)
this.TriggerItemDrop = CreateTrigger()
TriggerRegisterAnyUnitEventBJ(this.TriggerItemDrop, EVENT_PLAYER_UNIT_DROP_ITEM)
TriggerAddAction(this.TriggerItemDrop, function()
-- powerups don't matter
if IsItemPowerup(GetManipulatedItem()) then
return
end
-- print("Owned", IsItemOwned(GetManipulatedItem()), "Life", "HasItem", UnitHasItem(GetTriggerUnit(), GetManipulatedItem()))
-- Drops from main inventory? no work to do
if UnitHasItem(GetTriggerUnit(), GetManipulatedItem()) then
return
end
if not this.ValidUnit(GetTriggerUnit()) then
return
end
local unit = GetTriggerUnit()
local item = GetManipulatedItem()
-- 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
if this[unit] then
for i = #this[unit], 1, -1 do
if GetHandleId((this[unit][i])) == GetHandleId(item) then
table.remove(this[unit], i)
break
end
end
end
unit = nil
item = nil
end)
function CountUnitAbilities(unit)
local count = 0
local i = 0
local abi
while true do
abi = BlzGetUnitAbilityByIndex(unit, i)
if GetHandleId(abi) == 0 then break end
i = i + 1
count = count + 1
end
return count
end
this.TriggerRevive = CreateTrigger()
TriggerRegisterAnyUnitEventBJ(this.TriggerRevive, EVENT_PLAYER_HERO_REVIVE_FINISH)
TriggerAddAction(this.TriggerRevive, function()
ReAddInventories(GetTriggerUnit())
GroupRemoveUnit(this.WaitingGroup, GetTriggerUnit())
end)
this.WaitingGroup = CreateGroup()
this.TriggerLife = CreateTrigger()
TriggerAddAction(this.TriggerLife, function()
GroupAddUnit(this.WaitingGroup, GetTriggerUnit())
end)
this.TriggerReInkarnationDone = CreateTrigger()
TriggerRegisterTimerEvent(this.TriggerReInkarnationDone, 0.25, true)
TriggerAddAction(this.TriggerReInkarnationDone, function()
local unit
for i = BlzGroupGetSize(this.WaitingGroup) - 1, 0, - 1 do
unit = BlzGroupUnitAt(this.WaitingGroup, i)
if not IsUnitType(unit, UNIT_TYPE_DEAD) then
GroupRemoveUnit(this.WaitingGroup, unit)
ReAddInventories(unit)
end
end
unit = nil
end)
InitFrames()
if FrameLoaderAdd then FrameLoaderAdd(InitFrames) end
end
end