• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

Header for FSS

Level 17
Joined
Nov 13, 2006
Messages
1,814
JASS:
//-------------------------------------------------------------------------
//                              CONSTANTS
//-------------------------------------------------------------------------

//special effect paths, example for potion
constant function EFFECT takes integer i returns string
    if i == 1 then
        return "Objects\\Spawnmodels\\Human\\HumanBlood\\HumanBloodPeasant.mdl"
    elseif i == 26 then
        return "Abilities\\Spells\\Human\\Heal\\HealTarget.mdl"
    elseif i == 30 then
        return "Abilities\\Spells\\Undead\\ReplenishMana\\SpiritTouchTarget.mdl"
    else
        return ""
    endif
endfunction

//where we want attach the effect on unit
constant function EFFECT_POINT takes integer i returns string
    if i == 1 then
        return "chest"
    elseif i == 26 then
        return "origin"
    elseif i == 30 then
        return "origin"
    else
        return ""
    endif
endfunction

//stat point per level what u can share between str/agi and int
constant function STAT_PER_LV takes nothing returns integer
    return 5
endfunction

//start stat points what get hero after it was created
constant function START_POINT takes nothing returns integer
    return 500
endfunction


//max stack/charge for stackable items
constant function CHARGE_MAX takes nothing returns integer
    return 99
endfunction

//max bag zise
constant function BAG_SIZE_MAX takes nothing returns integer
    return 24
endfunction

//max droped item amount on map
constant function MAX_ITEM takes nothing returns integer
    return 4
endfunction

//melee villager gero unit type id or raw code
constant function HERO_MELEE takes nothing returns integer
    return 'H000'
endfunction

//ranged villager hero unit type id or raw code
constant function HERO_RANGED takes nothing returns integer
    return 'H001'
endfunction

//bag item level
constant function BAG_LEVEL takes nothing returns integer
    return 199
endfunction

//Surprise box item level
constant function BOX_LEVEL takes nothing returns integer
    return 198
endfunction

//dummy unit rawcode what we use for decoration in inventory
constant function DUMMY_ID takes nothing returns integer
    return 'h002'
endfunction

//Harvest ability, it is used for harvesting, channel based ability,what let u go to item even ur inventory is full
constant function HARVEST_ID takes nothing returns integer
    return 'A00H'
endfunction

//Melee2Ranged ability raw code
constant function MELEE2RANGED_ID takes nothing returns integer
    return 'A00D'
endfunction

//Bear form ability for instant special effect destroy
constant function BEARFORM_ID takes nothing returns integer
    return 'A00C'
endfunction

//Bear form ability for Dummy Villager for instant special effect destroy
constant function DBEARFORM_ID takes nothing returns integer
    return 'A00A'
endfunction

// Add hp ability raw code
constant function ADDHP_ID takes nothing returns integer
    return 'A003'
endfunction

// Add mp ability raw code
constant function ADDMP_ID takes nothing returns integer
    return 'A004'
endfunction

// Minimum range
constant function MIN_RANGE takes nothing returns integer
    return 90000 //300 range
endfunction

//dummy caster unit unit type id
constant function DUMMY_CASTER_ID takes nothing returns integer
    return 'e000'
endfunction

constant function WeaponDamageModifier takes integer subtype returns integer
    if subtype == 1 then
        return 12
    elseif subtype == 2 then
        return 12
    elseif subtype == 3 then
        return 20
    elseif subtype == 4 then
        return 15
    elseif subtype == 5 then
        return 15
    elseif subtype == 6 then
        return 14
    elseif subtype == 7 then
        return 10
    elseif subtype == 8 then
        return 14
    elseif subtype == 9 then
        return 16
    else
        return 0
    endif
endfunction

//-------------------------------------------------------------------------
//                  BAG and FLOATING TEXT FUNCTION
//-------------------------------------------------------------------------

function AddItemToBag takes unit u, item bag, item itm returns boolean
    local integer bagid = GetHandleId(bag)
    local integer count = LoadInteger(udg_CItem_Table, bagid, 0)
    local integer id = GetHandleId(itm)
    local integer pl
    local integer i
    local destructable d
    local real x
    local real y
    if count < BAG_SIZE_MAX() then
//  if IsItemVisible(whichItem)
        if UnitHasItem(u, itm) or not IsItemVisible(itm) then
            if UnitHasItem(u, itm) then
                call UnitRemoveItem(u, itm)
                call SetItemVisible(itm, false)
            endif
            set i = 1
            loop
                exitwhen LoadItemHandle(udg_CItem_Table, bagid, i) == null
                set i = i + 1
            endloop
            call SaveInteger(udg_CItem_Table, bagid, 0, count + 1)
            call SaveItemHandle(udg_CItem_Table, bagid, i, itm)
            set pl = GetPlayerId(GetOwningPlayer(u)) + 1
            if udg_Camera_Lock[pl] == 3 and udg_Inv_Bag[pl] == bagid then
                set x = LoadReal(udg_FSS, i + 2200, 1)
                set y = LoadReal(udg_FSS, i + 2200, 2)
                set d = CreateDestructableZ(LoadInteger(udg_FSS, 600, GetItemTypeId(itm)), x, y, 5, 0, 0.6, 0)
                call SaveDestructableHandle(udg_FSS, 2409 + pl, i + 2200, d)
                call ShowDestructable(d, false)
                if GetLocalPlayer() == Player(pl - 1) then
                    call ShowDestructable(d, true)
                endif
                set d = null
            endif
            return true
        else
            return false
        endif
    else
        call DisplayTextToPlayer (GetOwningPlayer(u), 0, 0, "|cffffff00Bag already full, can add more item|r")
        return false
    endif
endfunction

function RemoveBagContent takes integer bagid returns nothing
    local integer max = LoadInteger(udg_CItem_Table, bagid, 0)
    local integer i = 1
    local integer a
    local item itm
    loop
        exitwhen i > max
        set itm = LoadItemHandle(udg_CItem_Table, bagid, i)
        if itm != null then
            set a = GetHandleId(itm)
            call FlushChildHashtable(udg_CItem_Table, a)
        endif
        set i = i + 1
    endloop
    set itm = null
endfunction

function FT takes player p1, player p2, string txt, real fsize, unit u, integer speed, integer red, integer green, integer blue, integer alpha returns nothing
    local real x
    local real y
    local real diff
    local texttag tt
    if IsUnitVisible(u, GetLocalPlayer()) and (GetLocalPlayer() == p1 or GetLocalPlayer() == p2) and udg_Camera_Lock[GetPlayerId(GetLocalPlayer()) + 1] == 0 then
        set x = GetUnitX( u )
        set y = GetUnitY( u )
        set diff = StringLength( txt ) * fsize / 2.00 + 1
        set tt = CreateTextTag( )
        call SetTextTagText( tt, txt, fsize * 0.023 )
        call SetTextTagPos( tt, x - diff, y, 100.00 )
        call SetTextTagColor( tt, red, green, blue, alpha )
        call SetTextTagPermanent( tt, false )
        call SetTextTagLifespan( tt, 4.50 )
        call SetTextTagFadepoint( tt, 2.50 )
        call SetTextTagVelocity( tt, speed * 0.71 / 128 * Cos( 3.14159 / 2 ), speed * 0.71 / 128 * Sin( 3.14159 / 2 ) )
        set tt = null
    endif
endfunction

function FT_Ex takes player p1, player p2, string txt, real fsize, unit u, integer speed, integer red, integer green, integer blue, integer alpha, integer dir returns nothing
    local real x
    local real y
    local real diff
    local texttag tt
    if IsUnitVisible(u, GetLocalPlayer()) and (GetLocalPlayer() == p1 or GetLocalPlayer() == p2) and udg_Camera_Lock[GetPlayerId(GetLocalPlayer()) + 1] == 0 then
        set x = GetUnitX( u )
        set y = GetUnitY( u )
        set diff = StringLength( txt ) * fsize / 2.00 + 1
        set tt = CreateTextTag( )
        call SetTextTagText( tt, txt, fsize * 0.023 )
        call SetTextTagPos( tt, x - diff, y, 100.00 )
        call SetTextTagColor( tt, red, green, blue, alpha )
        call SetTextTagPermanent( tt, false )
        call SetTextTagLifespan( tt, 4.50 )
        call SetTextTagFadepoint( tt, 2.50 )
        set x = speed * 0.71 / 128
        call SetTextTagVelocity( tt, x * Cos( dir * bj_DEGTORAD ), x * Sin( dir * bj_DEGTORAD ) )
        set tt = null
    endif
endfunction

//-------------------------------------------------------------------------
//                 OTHER ITEM RELATED FUNCTIONS
//-------------------------------------------------------------------------


function itype2TOitemId takes integer itype, integer subtype, integer quality returns integer
    local integer i = 0
    if itype == 1 then
        set i = 'ckng'
    elseif itype == 2 then
        set i = 'rin1'
    elseif itype == 3 then
        if subtype == 1 then //short sword
            set i = 'rat9'
        elseif subtype == 2 then // mace
            set i = 'rde3'
        elseif subtype == 3 then // axe / hammer
            set i = 'rde1'
        elseif subtype == 4 then // polearm
            set i = 'evtl'
        elseif subtype == 5 then // long sword
            set i = 'ajen'
        elseif subtype == 6 then // bow
            set i = 'lgdh'
        elseif subtype == 7 then // dagger
            set i = 'desc'
        elseif subtype == 8 then // wand
            set i = 'ward'
        elseif subtype == 9 then // staff
            set i = 'brac'
        endif
    elseif itype == 4 then //shoes or boot
        set i = 'rag1'
    elseif itype == 5 then //shield
        set i = 'sbch'
    elseif itype == 6 then //ring
        set i = 'rlif'
    elseif itype == 8 then //amulet
        set i = 'spsh'
    elseif itype == 9 then // wing
        set i = 'ccmd'
    elseif itype == 10 then //tome
        set i = 'hval'
    elseif itype == 11 then //charm
        set i = 'cnob'
    endif
    return i
endfunction

function RemoveItemData takes integer id returns nothing
    if LoadInteger(udg_CItem_Table, id, 0) > 0 then
        call RemoveBagContent(id)
    endif
    call FlushChildHashtable(udg_CItem_Table, id)
endfunction

function StackingItemType takes integer ilv returns boolean
    if ilv == 0 then
        return false
    else
        if ilv < 100 or (ilv > 200 and (ilv < 1902 or ilv > 1905)) then
            return true
        else
            return false
        endif
    endif
endfunction

function ClearSlot takes integer cv, integer slot returns nothing
    call SaveInteger(udg_Stat_Table, cv, - slot, 0)
    call SaveBoolean(udg_Stat_Table, - cv, - slot, false)
    call SaveInteger(udg_Stat_Table, 9000 + cv, slot, 0)
    call SaveInteger(udg_Stat_Table, 9000 + cv, - slot, 0)
    call SaveInteger(udg_Stat_Table, - 9000 - cv, - slot, 0)
    call SaveInteger(udg_Stat_Table, 18000 + cv, slot, 0)
    call SaveInteger(udg_Stat_Table, 18000 + cv, - slot, 0)
    call RemoveSavedHandle(udg_Stat_Table, cv, slot)
endfunction

function RemoveItemRot takes item itm, boolean remove returns nothing
    local integer i = LoadInteger(udg_CItem_Table, GetHandleId(itm), 101)
    if i > 0 then
        if (remove and IsItemVisible(udg_Item_Item[i]) and not IsItemOwned(udg_Item_Item[i])) or udg_Item_Item[i] == null then
            if udg_Item_Item[i] != null then
                call RemoveItemData(GetHandleId(itm))
                call RemoveItem(udg_Item_Item[i])
            else
                call FlushChildHashtable(udg_CItem_Table, udg_Item_Id[i])
            endif
        else
            call SaveInteger(udg_CItem_Table, udg_Item_Id[i], 102, 0)
            call SaveInteger(udg_CItem_Table, udg_Item_Id[i], 101, 0)
        endif
        if i != udg_Item_Max then
            loop
                exitwhen i > udg_Item_Max
                set udg_Item_Item[i] = udg_Item_Item[i + 1]
                set udg_Item_Id[i] = udg_Item_Id[i + 1]
                call SaveInteger(udg_CItem_Table, udg_Item_Id[i], 101, i)
                set i = i + 1
            endloop
        endif
        set udg_Item_Item[udg_Item_Max] = null
        set udg_Item_Max = udg_Item_Max - 1
    endif
endfunction

function AddItemRot takes item itm, integer owner returns nothing
    if IsItemVisible(itm) and not IsItemOwned(itm) then //LoadInteger (udg_CItem_Table, GetHandleId(itm), 101) == 0
        if udg_Item_Max > MAX_ITEM() then
            //call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, "|cffffff00Warning: Too much item on map|r")
            call RemoveItemRot (udg_Item_Item[1], true)
        endif
        set udg_Item_Max = udg_Item_Max + 1
        set udg_Item_Item[udg_Item_Max] = itm
        set udg_Item_Id[udg_Item_Max] = GetHandleId(itm)
        call SaveInteger(udg_CItem_Table, udg_Item_Id[udg_Item_Max], 101, udg_Item_Max)
        call SaveInteger(udg_CItem_Table, udg_Item_Id[udg_Item_Max], 102, owner)
        if GetItemTypeId(itm) != 'gold' then
            call SetItemUserData(itm, owner)
        endif
    endif
endfunction

function SetItemBaseData takes item itm, integer itype, integer subtype, integer quality, integer grade, integer lvreq, integer ethernal, real dur, real maxdur, integer maxsocket, integer setid returns nothing
    local integer id = GetHandleId(itm)
    local integer str = 0
    local integer agi = 0
    local integer int = 0
    local integer price = grade * 10
    local integer class = 0
    local real r = 0

    if itype == 5 and subtype == 0 then
        set subtype = 1
    endif

    if lvreq > 0 then
        if itype < 5 and itype != 3 then
            if subtype == 1 then
                set class = 1
                set str = lvreq * 3 + 5
                set agi = lvreq * 1 + 5
            elseif subtype == 2 then
                set class = 3
                set str = lvreq * 1 + 5
                set agi = lvreq * 3 + 5
            elseif subtype == 3 then
                set class = 5
                set str = lvreq * 1 + 5
                set int = lvreq * 3 + 5
            endif
        elseif itype == 3 or itype == 5 then
            if subtype < 3 or itype == 5 then
                set class = 2
                set str = lvreq * 2 + 5
                set agi = lvreq * 2 + 5
            elseif subtype == 3 then
                set class = 1
                set str = lvreq * 4 + 5
                set agi = lvreq + 5
            elseif subtype < 6 then
                set class = 2
                set str = lvreq * 4 + 5
                set agi = lvreq + 5
            elseif subtype < 8 then
                set str = lvreq + 5
                set agi = lvreq * 4 + 5
                if subtype == 6 then
                    set class = 3
                else
                    set class = 4
                endif
            elseif subtype == 8 then
                set class = 5
                set str = lvreq * 2 + 5
                set int = lvreq * 3 + 5
            elseif subtype == 9 then
                set class = 5
                set str = lvreq + 5
                set int = lvreq * 4 + 5
            endif
        endif
    endif

    if maxdur == 0 then
        if itype == 1 then
            set r = 1.5
        elseif itype == 2 then
            set r = 2
        elseif itype == 3 then
            set r = 2.8
        elseif itype == 4 then
            set r = 1.2
        elseif itype == 5 then
            set r = 2.4
        elseif itype == 6 then
            set r = 1.7
        elseif itype == 8 then
            set r = 1.9
        elseif itype == 9 then
            set r = 2.3
        endif

        set maxdur = (grade * 5.00 + 33) * r
        set dur = maxdur

        if quality == 0 then
            set dur = dur / 3.00 + 10
            set maxdur = dur * 2.00
            set price = price / 2
        elseif quality == 1 then
            set dur = dur / 3.00 + 10
            set maxdur = dur * 2.00
            set price = price / 2
        elseif quality == 6 then
            set dur = dur * 1.2
            set maxdur = dur
            set price = R2I(price * 1.2)
        elseif quality == 7 then
            set dur = dur * 1.5
            set maxdur = dur
            set price = R2I(price * 1.5)
        endif
    endif

    if maxsocket == - 1 then
        set maxsocket = GetRandomInt(quality, quality * 2 + 1)
    endif

    if itype == 10 or itype == 11 then
        set price = price * 2
        set maxsocket = 0
        set lvreq = 0
    elseif itype == 6 or itype == 8 or itype == 5 then
        set maxsocket = 0
    endif

    call SaveInteger(udg_CItem_Table, id, 1, GetItemTypeId(itm))
    call SaveInteger(udg_CItem_Table, id, 2, itype)
    call SaveInteger(udg_CItem_Table, id, 3, subtype)
    call SaveInteger(udg_CItem_Table, id, 4, quality)
    call SaveInteger(udg_CItem_Table, id, 6, class)
    call SaveInteger(udg_CItem_Table, id, 7, grade)
    call SaveInteger(udg_CItem_Table, id, 8, lvreq)
    call SaveInteger(udg_CItem_Table, id, 12, price)
    if itype != 11 then
        call SaveInteger(udg_CItem_Table, id, 9, str)
        call SaveInteger(udg_CItem_Table, id, 10, agi)
        call SaveInteger(udg_CItem_Table, id, 11, int)
        call SaveInteger(udg_CItem_Table, id, 13, ethernal)
        call SaveReal(udg_CItem_Table, id, 14, dur)
        call SaveReal(udg_CItem_Table, id, 15, maxdur)
        call SaveInteger(udg_CItem_Table, id, 20, maxsocket)
        if setid > 0 then
            call SaveInteger(udg_CItem_Table, id, 5, setid)
        endif
    endif
endfunction


function AddCustomItem takes real x, real y, integer itype, integer subtype, integer quality returns item
    local integer i = itype2TOitemId(itype, subtype, quality)
    if itype > 0 and itype < 12 and i != 0 then
        return CreateItem(i, x, y)
    else
        return null
    endif
endfunction

function AddItem2Slot takes integer cv, item itm, integer slot returns nothing
    local unit u = udg_UDexUnits[cv]
    local integer i = 0
    local item it = null
    local integer dummy = 'tfar'
    set udg_Stop_Stack[cv] = true
    loop
        exitwhen i > 5 or i > slot
        set it = UnitItemInSlot(u, i)
        if it == itm then
            call UnitRemoveItem(u, itm)
            set it = null
        endif
        if it == null and i != slot then
            call UnitAddItemToSlotById (u, dummy, i)
        endif
        set i = i + 1
    endloop
    if not IsItemVisible(itm) then
        call SetItemVisible(itm, true)
    endif
    call UnitAddItem(u, itm)
    call RemoveItemRot (itm, false)
    set i = 0
    loop
        exitwhen i > 5 or i > slot
        set it = UnitItemInSlot(u, i)
        if it != null then
            if GetItemTypeId(it) == dummy then
                call RemoveItem(it)
            endif
        endif
        set i = i + 1
    endloop
    set udg_Stop_Stack[cv] = false
    set it = null
    set u = null
endfunction

// item name functions

function GetClassName takes integer class, integer ilv returns string
    if class == 1 then
        if ilv < 105 and ilv > 100 and ilv !=103 then
            return "Paladin, Warrior"
        else
            return "Paladin"
        endif
    elseif class == 2 then
        return "Warrior"
    elseif class == 3 then
        if ilv < 105 and ilv > 100 and ilv !=103 then
            return "Archer, Assassin"
        else
            return "Archer"
        endif
    elseif class == 4 then
        return "Assassin"
    elseif class == 5 then
        return "Mage"
    else
        return ""
    endif
endfunction

function GetArmorType takes integer itype, integer subtype returns string
    if itype == 1 or itype == 2 or itype == 4 then
        if subtype == 1 then
            return "Heavy "
        elseif subtype == 2 then
            return "Light "
        elseif subtype == 3 then
            return "Mage "
        else
            return ""
        endif
    else
        return ""
    endif
endfunction

function GetItemQuality takes integer quality, integer itype returns string
    if quality == 0 then
        return " |cffddddddCracked "
    elseif quality == 1 then
        if itype == 11 then
            return " |cff7777eeCommon "
        else
            return " |cffeeeeeeLow quality "
        endif
    elseif quality == 2 then
        if itype == 11 then
            return " |cff0000ffUncommon "
        else
            return " |cfff5f5f5Normal "
        endif
    elseif quality == 3 then
        if itype == 11 then
            return " |cffffff00Superior "
        else
            return " |cff9999ffEnhanced "
        endif
    elseif quality == 4 then
        return " |cffffff55Rare "
    elseif quality == 5 then
        return " |cfffff000Very Rare "
    elseif quality == 6 then
        return " |cff77ff77Excelent "
    elseif quality == 7 then
        return " |cffff7733Unique "
    else
        return " |cffffffff"
    endif
endfunction

function GetFullItemName takes item itm, boolean showRefine returns string
    local integer ilv = GetItemLevel(itm)
    local integer subtype
    local integer id
    local integer ref
    local integer q //quality
    if ilv>= 100 and ilv < 200 then
        if ilv == 199 then
            set id = LoadInteger(udg_CItem_Table, GetHandleId(itm), 0)
            if id > 0 then
                return "|cff3377ff" + GetItemName(itm) + "|r |cffffffaa(" + I2S(id) + "/" + I2S(BAG_SIZE_MAX()) + ")|r"
            else
                return "|cff3377ff" + GetItemName(itm) + "|r |cffaaaaaa(empty)|r"
            endif
        elseif ilv == BOX_LEVEL() then
            return "|cff3377ff" + GetItemName(itm) + "|r"
        else
            set id = GetHandleId(itm)
            set ref = LoadInteger(udg_CItem_Table, id, 16)
            set q = LoadInteger(udg_CItem_Table, id, 4)
            set subtype = LoadInteger (udg_CItem_Table, id, 3)
            if ref > 0 and showRefine then
                return (GetItemQuality(q, ilv - 100) + GetArmorType(ilv - 100, subtype) + GetItemName(itm) + "|r |cffaaaaff(Gr. " + I2S(LoadInteger (udg_CItem_Table, id, 7)) + "|r)|r |cffffff77+" + I2S(ref) + "|r" )
            else
                return (GetItemQuality(q, ilv - 100) + GetArmorType(ilv - 100, subtype) + GetItemName(itm) + "|r |cffaaaaff(Gr. " + I2S(LoadInteger (udg_CItem_Table, id, 7)) + ")|r ")
            endif
        endif
    else
        if GetItemCharges(itm) > 0 then
            return " |cffffff00" + GetItemName(itm) + "|r x |cffaaaaff" + I2S(GetItemCharges(itm)) + "|r"
        else
            return " |cffffff00" + GetItemName(itm) + "|r"
        endif
    endif
    return ""
endfunction

//-------------------------------------------------------------------------
//             OVER TIME THINGS: Damage, Heal, Mana over time
//-------------------------------------------------------------------------


function AddOT takes unit u1, unit u2, integer t, real value, integer dur returns nothing
    set udg_OT_Max = udg_OT_Max + 1
    set udg_OT_Source[udg_OT_Max] = u1
    set udg_OT_Target[udg_OT_Max] = u2
    set udg_OT_Type[udg_OT_Max] = t
    set udg_OT_Timer[udg_OT_Max] = dur
    set udg_OT_Value[udg_OT_Max] = value
endfunction


//-------------------------------------------------------------------------
//                              STAT MODIFYING FUNCTIONS
//-------------------------------------------------------------------------


function AddHPMP takes boolean HP, integer v, unit u returns nothing
    local integer a
    local integer s
    local integer i
    local integer l
    local integer cv
    local integer mv

    if HP then
        set a = ADDHP_ID()
    else
        set a = ADDMP_ID()
    endif

    if ( v >= 0 ) then
        set s = 1
        set cv = v
    else
        set s = 5
        set cv = v * - 1
    endif
    set mv = cv - ( cv / 1000 ) * 1000
    set l = cv / 1000
    set i = 1
    loop
        exitwhen i > l
        call UnitAddAbility( u, a )
        call SetUnitAbilityLevel( u, a, ( 4 + s ) )
        call UnitRemoveAbility( u, a )
        set i = i + 1
    endloop
    set cv = mv
    set mv = cv - ( cv / 100 ) * 100
    set l = cv / 100
    set cv = mv
    set i = 1
    loop
        exitwhen i > l
        call UnitAddAbility( u, a )
        call SetUnitAbilityLevel( u, a, ( 3 + s ) )
        call UnitRemoveAbility( u, a )
        set i = i + 1
    endloop
    set mv = cv - ( cv / 10 ) * 10
    set l = cv / 10
    set cv = mv
    set i = 1
    loop
        exitwhen i > l
        call UnitAddAbility( u, a )
        call SetUnitAbilityLevel( u, a, ( 2 + s ) )
        call UnitRemoveAbility( u, a )
        set i = i + 1
    endloop
    set i = 1
    loop
        exitwhen i > cv
        call UnitAddAbility( u , a )
        call SetUnitAbilityLevel( u, a, ( 1 + s ) )
        call UnitRemoveAbility( u, a )
        set i = i + 1
    endloop
    set u = null
endfunction

function AddDMG takes boolean DMG, integer cv, integer v returns nothing
    local integer i = 0
    local integer n = 0
    local integer a1 = 0
    local integer a2 = 0
    local integer a3 = 0
    local integer a4 = 0
    local unit u = udg_UDexUnits[cv]
    
    if not DMG then
        set a1 = 'A001'//udg_Abilities2[14]
        set a2 = 'A005'//udg_Abilities2[15]
        set a3 = 'A006'//udg_Abilities2[16]
        set i = v
        set n = i / 100 + 1
        call SetUnitAbilityLevel( u, a3, n )
        set i = i - ( i / 100 ) * 100
        set n = i / 10 + 1
        call SetUnitAbilityLevel( u, a2, n )
        set i = i - ( i / 10 ) * 10
        set n = i + 1
        call SetUnitAbilityLevel( u, a1, n )
    else
        set a1 = 'A002'//udg_Abilities2[17]
        set a2 = 'A007'//udg_Abilities2[18]
        set a3 = 'A008'//udg_Abilities2[19]
        set a4 = 'A009'//udg_Abilities2[20]
        set i = v
        set n = i / 1000 + 1
        call SetUnitAbilityLevel( u, a4, n )
        set i = i - ( i / 1000 ) * 1000
        set n = i / 100 + 1
        call SetUnitAbilityLevel( u, a3, n )
        set i = i - ( i / 100 ) * 100
        set n = i / 10 + 1
        call SetUnitAbilityLevel( u, a2, n )
        set i = i - ( i / 10 ) * 10
        set n = i + 1
        call SetUnitAbilityLevel( u, a1, n )
    endif
    set u = null
endfunction

function AddBonusMod takes unit u, integer n, integer v returns nothing
    local integer a
    local integer i
    local integer lv
    local integer max
    local integer cv = GetUnitUserData(u)
    local integer x
    if n != 0 then
        if v == 1 then
            set a = 15
            set i = 11
            set lv = R2I(udg_Total_HP_Regen[cv])
            set udg_Total_HP_Regen[cv] = lv + n
            set x = lv
        elseif v == 2 then
            set a = 26
            set i = 11
            set lv = R2I(udg_Total_MP_Regen[cv])
            set udg_Total_MP_Regen[cv] = lv + n
            set x = lv
        endif

        set max = udg_Pow2[i + 1] - 1

        if x + n > max then
            set x = max
        elseif (x + n) <= 0 then
            set x = 0
        else
            set x = x + n
        endif
        loop
            set lv = GetUnitAbilityLevel (u, udg_Abilities[a + i])
            if x >= udg_Pow2[i] and x > 0 then
                if lv == 0 then
                    call UnitAddAbility(u, udg_Abilities[a + i])
                    call UnitMakeAbilityPermanent(u, true, udg_Abilities[a + i])
                endif
                set x = x - udg_Pow2[i]
            else
                if lv > 0 then
                    call UnitRemoveAbility(u, udg_Abilities[a + i])
                endif
            endif
        
            set i = i - 1
            exitwhen i < 0
        endloop
    endif
endfunction


//-------------------------------------------------------------------------
//        FULL SCREEN INFERFACE AND BASE CALCULATION FUNCTIONS
//-------------------------------------------------------------------------
function StringColoring takes string s, integer red1, integer green1, integer blue1, integer red2, integer green2, integer blue2 returns string
    local integer len = StringLength(s)
    local real redX = (red1 - red2) / len
    local real greenX = (green1 - green2) / len
    local real blueX = (blue1 - blue2) / len
    local integer redY
    local integer greenY
    local integer blueY
    local integer redZ
    local integer greenZ
    local integer blueZ
    local string hexS = "0123456789abcdef"
    local string CS = ""
    local integer i = 1

    loop
        exitwhen i > len
        set redY = R2I(red1 - redX * i)
        set redZ = redY / 16
        set greenY = R2I(green1 - greenX * i)
        set greenZ = greenY / 16
        set blueY = R2I(blue1 - blueX * i)
        set blueZ = blueY / 16
        set CS = CS + "|cff" + SubString(hexS, redZ, redZ + 1) + SubString(hexS, redY - redZ * 16, redY - redZ * 16 + 1) + SubString(hexS, greenZ, greenZ + 1) + SubString(hexS, greenY - greenZ * 16, greenY - greenZ * 16 + 1) + SubString(hexS, blueZ, blueZ + 1) + SubString(hexS, blueY - blueZ * 16, blueY - blueZ * 16 + 1) + SubString(s, i - 1, i) + "|r"
   
        set i = i + 1
    endloop
    set hexS = null
    set s = CS
    set CS = null
    return s
endfunction

function GetStringPos takes string s1, string s2 returns integer
    local integer i = 0
    local integer len = StringLength(s1)
    local integer slen = StringLength(s2)
    local integer a = 0
    loop
        exitwhen i >= len or a > 0
        if SubString(s1, i, i + slen) == s2 then
            set a = i
        endif
        set i = i + 1
    endloop
    return a
endfunction

function AddSpace takes string s, integer nr returns string
    local integer i = 1
    local string t = ""
    set nr = R2I(nr * 1.5)
    loop
        exitwhen i > nr
        set t = t + s
        set i = i + 1
    endloop
    set s = t
    set t = null
    return s
endfunction

function FlushFT_Stat takes integer pl returns nothing
    local integer a = 1
    local integer i = LoadInteger(udg_FSS, pl + 500, 0)
    local destructable d
    loop
        exitwhen a > i
        call DestroyTextTag(LoadTextTagHandle(udg_FSS, pl + 500, a))
        set a = a + 1
    endloop
    call FlushChildHashtable(udg_FSS, pl + 500)
    set i = 0
    loop
        set d = LoadDestructableHandle(udg_FSS, 0, 500+i)
        exitwhen d == null
        call ShowDestructable(d, false)
        set i = i + 1
    endloop
    set d = null
endfunction

function FT_Stat takes player p, string txt, real fsize, real x, real y, integer alpha returns nothing
    local integer pl = GetPlayerId(p) + 1
    local integer i = LoadInteger(udg_FSS, pl + 500, 0) + 1
    local texttag tt = null
    call SaveInteger(udg_FSS, pl + 500, 0, i)
    if GetLocalPlayer() == p then
        set tt = CreateTextTag( )
        call SetTextTagText( tt, txt, fsize * 0.023 )
        call SetTextTagPos( tt, x, y, 100.00 )
        call SetTextTagColor( tt, 255, 255, 255, alpha )
        call SetTextTagPermanent( tt, true )
    endif
    call SaveTextTagHandle(udg_FSS, pl + 500, i, tt)
    set tt = null
endfunction

function StatRefresh takes integer cv returns nothing
    local unit u = udg_UDexUnits[cv]
    local integer str = 0
    local integer agi = 0
    local integer int = 0
    local real r1 = udg_Total_HP_Regen[cv]
    local real r2 = udg_Total_MP_Regen[cv]
    local real r3
    local real r4
    if LoadBoolean(udg_Stat_Table, 8890, GetHandleId(u)) then
        if IsUnitType(u, UNIT_TYPE_HERO) then
            set str = GetHeroStr(u, true)
            set agi = GetHeroAgi(u, true)
            set int = GetHeroInt(u, true)
        endif
        set udg_Global_Acc[cv] = udg_Stat_Acc[cv] + agi * 7
        set udg_Global_Eva[cv] = udg_Stat_Eva[cv] + agi * 4
        set udg_Global_Crit[cv] = udg_Stat_Crit[cv] + agi / 20 + 1
        set udg_Global_CritDmg[cv] = udg_Stat_CritDmg[cv]
        set udg_Global_AttLv[cv] = udg_Stat_AttackLv[cv]
        set udg_Global_DefLv[cv] = udg_Stat_DefLv[cv]
        set udg_Global_Pdef[cv] = udg_Stat_Pdef[cv] + R2I(udg_Stat_Pdef[cv] * str / 100.00 )
        set udg_Global_Mdef1[cv] = udg_Stat_Mdef1[cv] + R2I(udg_Stat_Mdef1[cv] * int / 100.00 )
        set udg_Global_Mdef2[cv] = udg_Stat_Mdef2[cv] + R2I(udg_Stat_Mdef2[cv] * int / 100.00 )
        set udg_Global_Mdef3[cv] = udg_Stat_Mdef3[cv] + R2I(udg_Stat_Mdef3[cv] * int / 100.00 )
        set udg_Global_Mdef4[cv] = udg_Stat_Mdef4[cv] + R2I(udg_Stat_Mdef4[cv] * int / 100.00 )
        set udg_Global_Mdef5[cv] = udg_Stat_Mdef5[cv] + R2I(udg_Stat_Mdef5[cv] * int / 100.00 )
        set udg_Global_Reflect[cv] = udg_Stat_Reflect[cv] // + udg_B_Ref[cv]
        set udg_Global_LifeSteal[cv] = udg_Stat_LifeSteal[cv] // + udg_B_LS[cv]
        set udg_Global_ManaSteal[cv] = udg_Stat_ManaSteal[cv]
        set udg_TotalSpellPower[cv] = udg_Stat_SpellPower[cv] + udg_Stat_SpellPower[cv] * (int + udg_B_SP[cv]) / 100

        if udg_CombatTimer[cv] < 1 then
            set r3 = udg_Stat_HpRegen[cv] * 2
            set r4 = udg_Stat_MpRegen[cv] * 2
        else
            set r3 = udg_Stat_HpRegen[cv]
            set r4 = udg_Stat_MpRegen[cv]
        endif

        if r1 != r3 then
            call AddBonusMod(u, R2I(r3 - r1), 1)
        endif
        if r2 != r4 then
            call AddBonusMod(u, R2I(r4 - r2), 2)
        endif
    endif
    set u = null
endfunction

//this function show the charater stat properties if u are in inventory
function ShowStat takes integer pl returns nothing
    local real x = LoadReal(udg_FSS, 0, 1)
    local real y = LoadReal(udg_FSS, 0, 2)
    local integer cv = udg_Inv_Unit[pl]
    local unit u = udg_UDexUnits[cv]
    local string c = "|cff9999ff"
    local destructable d
    call StatRefresh(cv)
    call FlushFT_Stat(pl)
    if udg_Trader[pl] == 0 then
        call FT_Stat(Player(pl - 1), StringColoring("Character Stat", 100, 100, 255, 255, 255, 255), 1.5, x + 864, y + 540, 200)
        call FT_Stat(Player(pl - 1), StringColoring("Phy. Dmg: ", 255, 255, 0, 255, 255, 255) + c + I2S(udg_Total_Dmg[cv] + LoadInteger(udg_FSS, 634, GetUnitTypeId(u)) + GetHeroStr(u, true)) + "|r", 0.9, x + 814, y + 512 - 40, 200) // + udg_B_Crit[cv]
        call FT_Stat(Player(pl - 1), StringColoring("Critical chance: ", 255, 255, 0, 255, 255, 255) + c + I2S(udg_Global_Crit[cv]) + "%%|r", 0.8, x + 814, y + 512 - 70, 200) // + udg_B_Crit[cv]
        call FT_Stat(Player(pl - 1), StringColoring("Critical damage: ", 255, 255, 0, 255, 255, 255) + c + I2S(200 + udg_Global_CritDmg[cv]) + "%%|r", 0.8, x + 814, y + 512 - 90, 200)//udg_B_CritDmg[cv]
        call FT_Stat(Player(pl - 1), StringColoring("Attack speed: ", 255, 255, 0, 255, 255, 255) + c + I2S(100+GetHeroAgi(u, true)) + "%%|r", 0.8, x + 814, y + 512 - 110, 200)
        call FT_Stat(Player(pl - 1), StringColoring("Movement speed: ", 255, 255, 0, 255, 255, 255) + c + I2S(R2I(GetUnitMoveSpeed (u))) + "|r" , 0.8, x + 814, y + 512 - 130, 200)
        call FT_Stat(Player(pl - 1), StringColoring("Accurancy: ", 255, 255, 0, 255, 255, 255) + c + I2S(udg_Global_Acc[cv]) + "|r", 0.8, x + 814, y + 512 - 150, 200)//udg_B_Acc[cv]
        call FT_Stat(Player(pl - 1), StringColoring("Evasion: ", 255, 255, 0, 255, 255, 255) + c + I2S(udg_Global_Eva[cv]) + "|r", 0.8, x + 814, y + 512 - 170, 200)//udg_B_Eva[cv]
        call FT_Stat(Player(pl - 1), StringColoring("Armor pen.: ", 255, 255, 0, 255, 255, 255) + c + I2S(udg_Global_ArmorBreak[cv]) + "%%|r", 0.8, x + 814, y + 512 - 190, 200)
        call FT_Stat(Player(pl - 1), StringColoring("Reflect damage: ", 255, 255, 0, 255, 255, 255) + c + I2S(udg_Global_Reflect[cv]) + "%%|r", 0.8, x + 814, y + 512 - 210, 200)
        call FT_Stat(Player(pl - 1), StringColoring("Attack level: ", 255, 255, 0, 255, 255, 255) + c + I2S(udg_Global_AttLv[cv]) + "|r", 0.8, x + 814, y + 512 - 230, 200)//udg_B_AttLv[cv])
        call FT_Stat(Player(pl - 1), StringColoring("Life Steal: ", 255, 255, 0, 255, 255, 255) + c + I2S(udg_Global_LifeSteal[cv]) + "%%|r", 0.8, x + 814, y + 512 - 250, 200)
        call FT_Stat(Player(pl - 1), StringColoring("Experience: ", 255, 255, 0, 255, 255, 255) + c + I2S(100 + udg_Stat_Exp[cv] ) + "%%|r", 0.8, x + 814, y + 512 - 270, 200)// + udg_B_Exp[cv] + udg_Global_Exp_Buff[a]
        call FT_Stat(Player(pl - 1), StringColoring("Mag. Dmg: ", 255, 255, 0, 255, 255, 255) + c + I2S(udg_TotalSpellPower[cv]) + "|r", 0.9, x + 1032, y + 512 - 40, 200) // + udg_B_Crit[cv]
        call FT_Stat(Player(pl - 1), StringColoring("Physical def.: ", 255, 255, 0, 255, 255, 255) + c + I2S(udg_Global_Pdef[cv]) + "|r", 0.8, x + 1032, y + 512 - 70, 200)//udg_B_Pdef[cv]
        call FT_Stat(Player(pl - 1), StringColoring("Fire ressist: ", 255, 255, 0, 255, 255, 255) + c + I2S(udg_Global_Mdef1[cv]) + "|r", 0.8, x + 1032, y + 512 - 90, 200)//udg_B_Mdef[cv]
        call FT_Stat(Player(pl - 1), StringColoring("Water ressist: ", 255, 255, 0, 255, 255, 255) + c + I2S(udg_Global_Mdef2[cv]) + "|r", 0.8, x + 1032, y + 512 - 110, 200)//udg_B_Mdef[cv]
        call FT_Stat(Player(pl - 1), StringColoring("Lightning ressist: ", 255, 255, 0, 255, 255, 255) + c + I2S(udg_Global_Mdef3[cv]) + "|r", 0.8, x + 1032, y + 512 - 130, 200)//udg_B_Mdef[cv]
        call FT_Stat(Player(pl - 1), StringColoring("Poison ressist: ", 255, 255, 0, 255, 255, 255) + c + I2S(udg_Global_Mdef4[cv]) + "|r", 0.8, x + 1032, y + 512 - 150, 200)//udg_B_Mdef[cv]
        call FT_Stat(Player(pl - 1), StringColoring("Earth ressist: ", 255, 255, 0, 255, 255, 255) + c + I2S(udg_Global_Mdef5[cv]) + "|r", 0.8, x + 1032, y + 512 - 170, 200)//udg_B_Mdef[cv]
        call FT_Stat(Player(pl - 1), StringColoring("HP regen: ", 255, 255, 0, 255, 255, 255) + c + R2SW(udg_Total_HP_Regen[cv], 4, 2) + " /s|r", 0.8, x + 1032, y + 512 - 190, 200)
        call FT_Stat(Player(pl - 1), StringColoring("MP regen: ", 255, 255, 0, 255, 255, 255) + c + R2SW(udg_Total_MP_Regen[cv], 4, 2) + " /s|r", 0.8, x + 1032, y + 512 - 210, 200)
        call FT_Stat(Player(pl - 1), StringColoring("Defence level: ", 255, 255, 0, 255, 255, 255) + c + I2S(udg_Global_DefLv[cv]) + "|r", 0.8, x + 1032, y + 512 - 230, 200)//udg_B_DefLv[cv])
        call FT_Stat(Player(pl - 1), StringColoring("Mana Steal: ", 255, 255, 0, 255, 255, 255) + c + I2S(udg_Global_ManaSteal[cv]) + "%%|r", 0.8, x + 1032, y + 512 - 250, 200)
        call FT_Stat(Player(pl - 1), StringColoring("Block chance: ", 255, 255, 0, 255, 255, 255) + c + I2S(udg_Stat_BlockDmg[cv]) + "%%|r", 0.8, x + 1032, y + 512 - 270, 200)
        if udg_Stat_Point[cv] > 0 then
            set c = "|cff0000ff"
        endif
        call FT_Stat(Player(pl - 1), StringColoring("Unspent stat point: ", 255, 255, 0, 255, 255, 255) + c + I2S(udg_Stat_Point[cv]) + "|r", 0.9, x + 890, y + 512 - 500, 200)
        set cv = 0
        loop
            set d = LoadDestructableHandle(udg_FSS, 0, 500+cv)
            exitwhen d == null
              call ShowDestructable(d, true)
              set cv = cv + 1
        endloop
    endif
    set d = null
    set u = null
    set c = null
endfunction

function GetCraftLv takes integer value, boolean flat returns integer
    local integer i = 9
    local integer lv = 1
    loop
        exitwhen lv != 1 or i < 1
        if value >= (R2I(i * i * i / 7.00) + 7) then
            set lv = i + 1
        endif
        set i = i - 1
    endloop

    if not flat then
        if value == 0 or lv == 10 then
            set lv = 0
        else
            set i = R2I(((lv) * (lv) * (lv)) / 7.00 + 7)
            set lv = R2I(value * 100 / i)
        endif
    endif
    return lv
endfunction

function HitChance takes integer cv1, integer cv2 returns integer
    local integer acc = udg_Global_Acc[cv1]
    local integer eva = udg_Global_Eva[cv2]
    local real i = R2I(100.00 - ( eva - 1.00 ) / ( ( 2.00 * acc ) + ( eva - 1.00 ) ) * 100.00)
    if i > 100.00 then
        return 100
    elseif i < 0.00 then
        return 0
    else
        return R2I(i)
    endif
endfunction

function GetShopUniqueId takes integer mc, integer sc, integer ls returns integer
    local integer id
    if mc > 0 and sc > 0 and ls > 0 then
        set id = LoadInteger(udg_Shop_Table, mc, - sc)
        if id > 0 then
            return LoadInteger(udg_Shop_Table, id, - ls)
        else
            return 0
        endif
    else
        return 0
    endif
endfunction

function SetChargesText takes integer pl returns nothing
    local real x
    local real y
    local integer ilv
    local integer charge
    local integer i = 100
    local texttag tt = null
    local integer mc
    local integer sc
    local integer id1
    local integer id2
    local integer max = 205
    local integer cv = udg_Inv_Unit[pl]
    local unit u = udg_UDexUnits[cv]
    local item itm
    if udg_Camera_Lock[pl] == 1 then
        set max = 205
    elseif udg_Camera_Lock[pl] == 2 then
        set mc = LoadInteger(udg_FSS, 2402, pl) - 2000 //selected main category
        set sc = LoadInteger(udg_FSS, 2402, 20 + pl) - 2100 //selected sub category
        set id1 = LoadInteger(udg_Shop_Table, mc, - sc)
        set max = 2224
    elseif udg_Camera_Lock[pl] == 3 then
        set max = 2224
    endif

    loop
        exitwhen i > max
        if LoadTextTagHandle(udg_FSS, 1000 + pl, i) != null then
            call DestroyTextTag (LoadTextTagHandle(udg_FSS, 1000 + pl, i))
            call SaveTextTagHandle(udg_FSS, 1000 + pl, i, null)
        endif


        set x = LoadReal(udg_FSS, i, 1) + 15 + 8
        set y = LoadReal(udg_FSS, i, 2) - 27

        set ilv = 0
        set charge = 0
        if i < 300 then
            if i < 200 then
                set ilv = LoadInteger(udg_Stat_Table, cv, - i)
                if ilv > 0 and (ilv >= 200 or ilv < 100)then
                    set charge = GetItemCharges(LoadItemHandle(udg_Stat_Table, cv, i))
                endif
            else
                if udg_Camera_Lock[pl] > 1 then
                    set i = 1000
                else
                    if GetItemLevel(UnitItemInSlot(u, i - 200)) != BOX_LEVEL() then
                        set charge = GetItemCharges(UnitItemInSlot(u, i - 200))
                    endif
                endif
            endif
        elseif i > 2200 then
            call DestroyTextTag (LoadTextTagHandle(udg_FSS, 1000 + pl, i))
            if udg_Camera_Lock[pl] == 2 then
                if id1 != 0 and mc > 0 and sc > 0 then
                    set id2 = LoadInteger(udg_Shop_Table, id1, i - 2200)
                    set ilv = LoadInteger(udg_FSS, 603, id2)
                    if (ilv >= 200 or ilv < 100) and ilv != 0 then
                        set charge = GetShopUniqueId (mc, sc, i - 2200)
                    else
                        set charge = 0
                    endif
                endif
            elseif udg_Camera_Lock[pl] == 3 and udg_Inv_Bag[pl] > 0 then
                set itm = LoadItemHandle(udg_CItem_Table, udg_Inv_Bag[pl], i - 2200)
                if itm != null then
                    set ilv = GetItemLevel(itm)
                    if (ilv >= 200 or ilv < 100) and ilv != 0 then
                        set charge = GetItemCharges(itm)
                    else
                        set charge = 0
                    endif
                endif
            endif
        endif

        if charge > 0 then
            if GetLocalPlayer() == Player(pl - 1) then
                set tt = CreateTextTag( )
                if charge < 10 then
                    set x = x - 8
                endif
                call SetTextTagText( tt, I2S(charge), 0.7 * 0.023 )
                call SetTextTagPos( tt, x, y, 35.00 )
                call SetTextTagColor( tt, 255, 255, 255, 255 )
                call SetTextTagPermanent( tt, true )
            endif
            call SaveTextTagHandle(udg_FSS, 1000 + pl, i, tt)
        endif
        if i==119 then
            if udg_Camera_Lock[pl] == 1 then
                set i = 199
            elseif udg_Camera_Lock[pl] > 1 then
                set i = 2200
            endif
        endif
        set i = i + 1
    endloop
    if udg_Trader[pl] > 0 then
       //-------------------------------------------------------
         //charged text it is but still not done
       //-------------------------------------------------------
    endif
    set u = null
    set itm = null
    set tt = null
endfunction

//-------------------------------------------------------------------------
//                  BUFF: ADD, REFRESH, REMOVE
//-------------------------------------------------------------------------
function ApplyBuff takes integer cv, integer bt, integer bv, boolean b returns nothing
    local unit u = udg_UDexUnits[cv]
    if LoadBoolean(udg_Stat_Table, 8890, GetHandleId(u)) then
        if bt == 1 then
            set udg_Stat_Acc[cv] = udg_Stat_Acc[cv] + bv
        elseif bt == 2 then
            set udg_Stat_AttackLv[cv] = udg_Stat_AttackLv[cv] + bv
        elseif bt == 3 then
            set udg_Stat_DefLv[cv] = udg_Stat_DefLv[cv] + bv
        elseif bt == 4 then
            set udg_Stat_Crit[cv] = udg_Stat_Crit[cv] + bv
        elseif bt == 5 then
            set udg_Stat_CritDmg[cv] = udg_Stat_CritDmg[cv] + bv
        elseif bt == 6 then
            set udg_Global_DmgInc[cv] = udg_Global_DmgInc[cv] + bv
        elseif bt == 7 then
            set udg_Global_DmgRed[cv] = udg_Global_DmgRed[cv] + bv
        elseif bt == 8 then
            set udg_Stat_Eva[cv] = udg_Stat_Eva[cv] + bv
        elseif bt == 9 then
            set udg_Stat_LifeSteal[cv] = udg_Stat_LifeSteal[cv] + bv
        elseif bt == 10 then
            set udg_Stat_ManaSteal[cv] = udg_Stat_ManaSteal[cv] + bv
        elseif bt == 11 then
            set udg_Stat_Reflect[cv] = udg_Stat_Reflect[cv] + bv
        elseif bt == 12 then
            set udg_Stat_Exp[cv] = udg_Stat_Exp[cv] + bv
        elseif bt == 13 then
            call AddHPMP (true, bv, u)
        elseif bt == 14 then
            call AddHPMP (false, bv, u)
        elseif bt == 15 then
            set udg_Stat_Pdef[cv] = udg_Stat_Pdef[cv] + bv
        elseif bt == 16 then
            set udg_Stat_Mdef1[cv] = udg_Stat_Mdef1[cv] + bv
        elseif bt == 17 then
            set udg_Stat_Mdef2[cv] = udg_Stat_Mdef2[cv] + bv
        elseif bt == 18 then
            set udg_Stat_Mdef3[cv] = udg_Stat_Mdef3[cv] + bv
        elseif bt == 19 then
            set udg_Stat_Mdef4[cv] = udg_Stat_Mdef4[cv] + bv
        elseif bt == 20 then
            set udg_Stat_Mdef5[cv] = udg_Stat_Mdef5[cv] + bv
        elseif bt == 21 then
             //reserved
        endif
    else
        if bt == 1 then
            set udg_Global_Acc[cv] = udg_Global_Acc[cv] + bv
        elseif bt == 2 then
            set udg_Global_AttLv[cv] = udg_Global_AttLv[cv] + bv
        elseif bt == 3 then
            set udg_Global_DefLv[cv] = udg_Global_DefLv[cv] + bv
        elseif bt == 4 then
            set udg_Global_Crit[cv] = udg_Global_Crit[cv] + bv
        elseif bt == 5 then
            set udg_Global_CritDmg[cv] = udg_Global_CritDmg[cv] + bv
        elseif bt == 6 then
            set udg_Global_DmgInc[cv] = udg_Global_DmgInc[cv] + bv
        elseif bt == 7 then
            set udg_Global_DmgRed[cv] = udg_Global_DmgRed[cv] + bv
        elseif bt == 8 then
            set udg_Global_Eva[cv] = udg_Global_Eva[cv] + bv
        elseif bt == 9 then
            set udg_Global_LifeSteal[cv] = udg_Global_LifeSteal[cv] + bv
        elseif bt == 10 then
            set udg_Global_ManaSteal[cv] = udg_Global_ManaSteal[cv] + bv
        elseif bt == 11 then
            set udg_Global_Reflect[cv] = udg_Global_Reflect[cv] + bv
        elseif bt == 12 then
            set udg_Global_Exp[cv] = udg_Global_Exp[cv] + bv
        elseif bt == 13 then
            call AddHPMP (true, bv, u)
        elseif bt == 14 then
            call AddHPMP (false, bv, u)
        elseif bt == 15 then
            set udg_Global_Pdef[cv] = udg_Global_Pdef[cv] + bv
        elseif bt == 16 then
            set udg_Global_Mdef1[cv] = udg_Global_Mdef1[cv] + bv
        elseif bt == 17 then
            set udg_Global_Mdef2[cv] = udg_Global_Mdef2[cv] + bv
        elseif bt == 18 then
            set udg_Global_Mdef3[cv] = udg_Global_Mdef3[cv] + bv
        elseif bt == 19 then
            set udg_Global_Mdef4[cv] = udg_Global_Mdef4[cv] + bv
        elseif bt == 20 then
            set udg_Global_Mdef5[cv] = udg_Global_Mdef5[cv] + bv
        elseif bt == 21 then
    //reserved
        endif
    endif
    set u = null
endfunction

function AddUnitBuff takes unit u, integer bt, integer bv, integer dur, integer eff, integer perc returns nothing
    local integer cv = GetUnitUserData(u)
    local integer a = cv + 36000
    local integer b = cv + 45000
    if LoadInteger( udg_Stat_Table, cv + 36000, - bt ) == 0 then
        //call DisplayTextToForce( GetPlayersAll(), "Added a new buff to |cffffff00" + GetUnitName(u) + "|r buff type is " + I2S(bt) + ", buff value is " + I2S(bv))
        if udg_Buff_Count[cv] == 0 then
            set udg_Buff_Max = ( udg_Buff_Max + 1 )
            set udg_Buff_List[udg_Buff_Max] = cv
        endif
        set udg_Buff_Count[cv] = udg_Buff_Count[cv] + 1
        call SaveInteger(udg_Stat_Table, a, udg_Buff_Count[cv], bt)
        call SaveInteger(udg_Stat_Table, - a, - bt, bv)
        call SaveInteger(udg_Stat_Table, a, - bt, dur)
        if perc > 0 then
            call SaveInteger(udg_Stat_Table, b, - bt, perc)
        endif
        if eff > 0 then
            call SaveEffectHandle(udg_Stat_Table, b, bt, AddSpecialEffectTarget(EFFECT(eff), udg_UDexUnits[cv], EFFECT_POINT(eff)))
        endif
        call ApplyBuff (cv, bt, bv, false)
        set bt = GetPlayerId(GetOwningPlayer(u)) + 1
        call StatRefresh(cv)
        if udg_Inv_Unit[bt] == cv and udg_Camera_Lock[bt] == 1 then
            call ShowStat(bt)
        endif
    else
        call ApplyBuff (cv, bt, -LoadInteger(udg_Stat_Table, -a, -bt), false)
        call ApplyBuff (cv, bt, bv, false)
        call SaveInteger(udg_Stat_Table, -a, -bt, bv)
        call SaveInteger(udg_Stat_Table, a, -bt, dur) //reset the timer
    endif
endfunction

function RemoveUnitBuff takes integer cv, integer bc returns integer
    local integer bv
    local integer tl
    local integer b = 36000 + cv
    local integer c = 45000 + cv
    local integer bt = LoadInteger(udg_Stat_Table, b, bc)
    local integer bt2 = bt
    local integer bv2 = LoadInteger(udg_Stat_Table, - b, - bt)
    call SaveInteger(udg_Stat_Table, b, - bt, 0) //reset timer
    call SaveInteger(udg_Stat_Table, - b, - bt, 0) //reset buff value
    call DestroyEffect(LoadEffectHandle(udg_Stat_Table, c, bt))
    call RemoveSavedHandle(udg_Stat_Table, c, bt)
    call SaveInteger(udg_Stat_Table, c, - bt, 0) //reset timer
    set bt = LoadInteger(udg_Stat_Table, b, udg_Buff_Count[cv])
    set tl = LoadInteger(udg_Stat_Table, b, - bt)
    set bv = LoadInteger(udg_Stat_Table, - b, - bt)

    if bc != udg_Buff_Count[cv] then
        call SaveInteger(udg_Stat_Table, b, bc, bt) // save buff type from last record
        call SaveInteger(udg_Stat_Table, - b, - bt, bv) // save buff value from last record
        call SaveInteger(udg_Stat_Table, b, - bt, tl) // save buff timer from last record
        set bc = bc - 1
    endif
    call SaveInteger(udg_Stat_Table, b, udg_Buff_Count[cv], 0) // reset buff type
    set udg_Buff_Count[cv] = udg_Buff_Count[cv] - 1

    set bv = - bv2
    set bt = bt2
    call ApplyBuff (cv, bt2, -bv2, false)
    set bt2 = GetPlayerId(GetOwningPlayer(udg_UDexUnits[cv])) + 1
    call StatRefresh(cv)
    if udg_Inv_Unit[bt2] == cv and udg_Camera_Lock[bt2] == 1 then
        call ShowStat(bt2)
    endif
    return bc
endfunction

function RemoveUnitBuffs takes integer i returns nothing
    local integer cv = udg_Buff_List[i]
    local integer bc = udg_Buff_Count[cv]
    loop
        exitwhen bc == 0
        call RemoveUnitBuff(cv, bc)
        set bc = bc - 1
    endloop
    if i != udg_Buff_Max then
        set udg_Buff_List[i] = udg_Buff_List[udg_Buff_Max]
    endif
    set udg_Buff_List[udg_Buff_Max] = 0
endfunction



//---------------------------------------------------------------------
//           ATTACHMENT FUNCTIONS FOR VILLAGERS
//---------------------------------------------------------------------


function SetAttackAnimation takes integer cv returns nothing
    local unit u = udg_UDexUnits[cv]
    local integer ilv = LoadInteger(udg_Stat_Table, cv, - 3)
    local integer id = GetHandleId(LoadItemHandle(udg_Stat_Table, cv, 3))
    local integer subtype
    local string s
    call AddUnitAnimationProperties( u, LoadStr(udg_Stat_Table, - cv, 3), false )
    if ilv == 103 then
        set subtype = LoadInteger(udg_CItem_Table, id, 3)
        if subtype < 3 then
            set s = ""
        elseif subtype < 4 then
            set s = "Channel"
        elseif subtype < 6 then
            set s = "Flesh"
        elseif subtype == 6 then
            set s = "Lumber"
        elseif subtype == 7 then
            set s = "Gold"
        else
            set s = "none"
        endif
        call SaveStr(udg_Stat_Table, - cv, 3, s )
    else
        set s = "none"
        call SaveStr(udg_Stat_Table, - cv, 3, s )
    endif
    call AddUnitAnimationProperties( u, s, true )
    set s = null
endfunction

function AddAttachment takes integer cv, integer opt returns nothing
    local unit u = udg_UDexUnits[cv]
    local integer pl
    local integer itype
    local integer subtype
    local integer i
    local integer w
    local integer id
    local string p = "Equipment\\"
    //local real x = GetRandomReal( GetRectMinX( GetPlayableMapRect( ) ), GetRectMaxX( GetPlayableMapRect( ) ) )
    //local real y = GetRandomReal( GetRectMinY( GetPlayableMapRect( ) ), GetRectMaxY( GetPlayableMapRect( ) ) )
    if LoadBoolean(udg_FSS, 631, GetUnitTypeId(u)) then
        set pl = GetPlayerId(GetOwningPlayer(u)) + 1
        set i = 1
        set w = LoadInteger(udg_Stat_Table, cv, - 3 )
        set p = "Equipment\\"
        loop
            exitwhen i > 9
            set id = LoadInteger(udg_Stat_Table, cv, - i )
            if id > 0 then
                set itype = GetItemTypeId(LoadItemHandle(udg_Stat_Table, cv, i))
                if (i < 3 or i == 4) and (opt == 3 or opt == 4 or opt == 1) then
                    if i == 1 then
                        call SaveEffectHandle(udg_Stat_Table, 9000 + cv, 1, AddSpecialEffectTarget(p + LoadStr(udg_FSS, 601, itype) , u, "head" ))
                    elseif i == 2 then
                        call SaveEffectHandle(udg_Stat_Table, 9000 + cv, 2, AddSpecialEffectTarget(p + LoadStr(udg_FSS, 601, itype) , u, "chest" ))
                    elseif i == 4 then
                        call SaveEffectHandle(udg_Stat_Table, 9000 + cv, 4, AddSpecialEffectTarget(p + LoadStr(udg_FSS, 601, itype) , u, "foot right" ))
                        call SaveEffectHandle(udg_Stat_Table, 9000 + cv, - 4, AddSpecialEffectTarget(p + LoadStr(udg_FSS, 601, itype) , u, "foot left" ))
                    endif
                elseif i == 9 and (opt == 4 or opt == 2 or opt == 3) then
                    call SaveEffectHandle(udg_Stat_Table, 9000 + cv, 9, AddSpecialEffectTarget(p + LoadStr(udg_FSS, 601, itype) , u, "chest" ))
                elseif i == 5 and (opt == 0 or opt == 3) then
                    call SaveEffectHandle(udg_Stat_Table, 9000 + cv, 5, AddSpecialEffectTarget(p + LoadStr(udg_FSS, 601, itype) , u, "hand right" ))
                elseif i == 3 then
                       // in template i created here unit what got same name than equiped weapon class, reason for make ability requiment to weapon depend
                       //if ( udg_WeaponClass == 1 and udg_Weapon_Dummy_unit == null ) then
                       //    set udg_Weapon_Dummy_unit = CreateUnit( Player( pl ), 'h00D', x, y, 0 )
                       //else
                       //    if ( ( udg_WeaponClass == 2 or udg_WeaponClass == 3 ) and udg_Weapon_Dummy_unit == null ) then
                       //        set udg_Weapon_Dummy_unit = CreateUnit( Player( pl ), 'h00C', x, y, 0 )
                       //    else
                       //        if ( udg_WeaponClass == 4 or udg_Weapon_Dummy_unit == null ) then
                       //            set udg_Weapon_Dummy_unit = CreateUnit( Player( pl ), 'h00F', x, y, 0 )
                       //        else
                       //            if ( udg_WeaponClass == 5 and udg_Weapon_Dummy_unit == null ) then
                       //                set udg_Weapon_Dummy_unit = CreateUnit( Player( pl ), 'h00E', x, y, 0 )
                       //            else
                       //                if ( ( udg_WeaponClass == 6 or udg_WeaponClass == 7 ) and udg_Weapon_Dummy_unit == null ) then
                       //                    set udg_Weapon_Dummy_unit = CreateUnit( Player( pl ), 'h00G', x, y, 0 )
                       //                endif
                       //            endif
                       //        endif
                       //    endif
                       //endif
                    set subtype = LoadInteger(udg_CItem_Table, GetHandleId(LoadItemHandle(udg_Stat_Table, cv, i)), 3 )
                    if subtype < 3 then
                        call SaveEffectHandle(udg_Stat_Table, 9000 + cv, 3, AddSpecialEffectTarget(p + LoadStr(udg_FSS, 601, itype) , u, "hand left" ))
                    elseif subtype == 3 then
                        call SaveEffectHandle(udg_Stat_Table, 9000 + cv, 3, AddSpecialEffectTarget(p + LoadStr(udg_FSS, 601, itype) , u, "hand left" ))
                    elseif subtype == 6 then
                        call SaveEffectHandle(udg_Stat_Table, 9000 + cv, 3, AddSpecialEffectTarget(p + LoadStr(udg_FSS, 601, itype) , u, "hand left" ))
                        call SaveEffectHandle(udg_Stat_Table, 9000 + cv, - 3, AddSpecialEffectTarget(p + "Quiver.mdx" , u, "chest" ))

                    else
                        call SaveEffectHandle(udg_Stat_Table, 9000 + cv, 3, AddSpecialEffectTarget(p + LoadStr(udg_FSS, 601, itype) , u, "hand right" ))
                        if subtype == 7 then
                            call SaveEffectHandle(udg_Stat_Table, 9000 + cv, - 3, AddSpecialEffectTarget(p + LoadStr(udg_FSS, 601, itype) , u, "hand left" ))
                        endif
                    endif
                endif
            endif
   
            set i = i + 1
            if i == 6 then
                set i = 9
            endif
        endloop
    endif
    set u = null
    set p = null
endfunction

function RemoveAttachment takes integer cv, integer opt returns nothing
    local unit u = udg_UDexUnits[cv]
    local integer pl
    local integer a
    local integer a1
    local integer id
    local integer subtype
    if LoadBoolean(udg_FSS, 631, GetUnitTypeId(u)) then
        set pl = GetPlayerId(GetOwningPlayer(u)) + 1
        set a = BEARFORM_ID() // ability raw code what trasfom to bear form
        set a1 = MELEE2RANGED_ID() // ability raw code what trasfom melee to ranged form
        set id = GetHandleId(LoadItemHandle(udg_Stat_Table, cv, 3 ))
        set subtype = LoadInteger(udg_CItem_Table, id, 3 )
        if opt == 1 or opt == 3 then
            call DestroyEffect( LoadEffectHandle(udg_Stat_Table, 9000 + cv, 2) )
            call DestroyEffect( LoadEffectHandle(udg_Stat_Table, 9000 + cv, 4) )
            call DestroyEffect( LoadEffectHandle(udg_Stat_Table, 9000 + cv, - 4) )
            call DestroyEffect( LoadEffectHandle(udg_Stat_Table, 9000 + cv, 1) )
        endif
        if opt == 2 or opt == 3 then
            call DestroyEffect( LoadEffectHandle(udg_Stat_Table, 9000 + cv, 9) )
        endif
        if opt == 0 or opt == 3 then
            call DestroyEffect( LoadEffectHandle(udg_Stat_Table, 9000 + cv, 5) )
        //if ( LoadInteger(udg_Stat_Table, 3, 99 ) != 0 ) then
            //if ( udg_Weapon_Dummy_unit[pl] != null ) then
            //    call RemoveUnit( udg_Weapon_Dummy_unit[cv] )
            //    set udg_Weapon_Dummy_unit[pl] = null
            //endif
            call DestroyEffect( LoadEffectHandle(udg_Stat_Table, 9000 + cv, 3) )//normal weapon attachment
            call DestroyEffect( LoadEffectHandle(udg_Stat_Table, 9000 + cv, - 3) )//dual handed like dagger and quiver
        //endif
        endif
        call UnitAddAbility( u, a )
        call IssueImmediateOrder( u, "bearform" )
        call UnitRemoveAbility( u, a )
        if subtype == 6 then
            if ( GetUnitTypeId( u ) == HERO_MELEE() ) then
                call SetPlayerAbilityAvailable( Player( pl - 1 ), a1, true )
                call IssueImmediateOrder( u, "metamorphosis" )
                call SetPlayerAbilityAvailable( Player( pl - 1 ), a1, false )
            endif
        else
            if ( GetUnitTypeId( u ) == HERO_RANGED() ) then
                call SetPlayerAbilityAvailable( Player( pl - 1 ), a1, true )
                call IssueImmediateOrder( u, "metamorphosis" )
                call SetPlayerAbilityAvailable( Player( pl - 1 ), a1, false )
            endif
        endif
    endif
    set u = null
endfunction

function DummyVillagerAttachmentRefresh takes nothing returns nothing
    local integer pl = 1
    local integer LP = GetPlayerId(GetLocalPlayer()) + 1
    local integer cv = udg_Inv_Unit[LP]
    local integer i
    local integer p = 1
    local integer ilv
    local unit u = LoadUnitHandle(udg_FSS, 550, 0)
    local integer alpha = 0
    local integer glp
    local real y1 = 250
    local real y2 = 300
    local real y = LoadReal(udg_FSS, 0, 2)
    local string path
    local string QuiverPath = ""
    local real UScale = 1.2
    local integer subtype
    local integer BearForm = DBEARFORM_ID()//dummy bear form ability id

    call UnitAddAbility( u, BearForm )
    call IssueImmediateOrder( u, "bearform" )
    call UnitRemoveAbility( u, BearForm )

    call SetUnitFacing(u, 90)

    if not LoadBoolean(udg_FSS, 631, GetUnitTypeId(udg_UDexUnits[cv])) then
        set alpha = 0
    elseif udg_Camera_Lock[LP] == 1 then
        set alpha = 255
        set QuiverPath = "Equipment\\Quiver.mdx"
    endif

    if LoadInteger(udg_Stat_Table, cv, - 9) == 0 then
        set UScale = 2
        set y = y + y1
    else
        set UScale = 1.2
        set y = y + y2
    endif

    call SetUnitVertexColor(u, 255, 255, 255, alpha)
    call SetUnitY(u, y)

    call SetUnitScale(u, UScale, UScale, UScale)

    loop
        exitwhen pl > 10
        if udg_Camera_Lock[pl] == 1 then
            set i = 1
            loop
                exitwhen i == 10
                if i == 1 or i == 2 or i == 5 or i == 9 then
                    call DestroyEffect(LoadEffectHandle(udg_FSS, 650 + pl, i))
                elseif i == 3 or i == 4 then
                    call DestroyEffect(LoadEffectHandle(udg_FSS, 650 + pl, i))
                    call DestroyEffect(LoadEffectHandle(udg_FSS, 650 + pl, i + 100))
                endif
                set ilv = LoadInteger(udg_Stat_Table, cv, - i)
                if ilv > 0 and alpha > 0 then
                    set path = ""
                    if GetLocalPlayer() == Player(pl - 1) then
                        set path = "Equipment\\" + LoadStr(udg_FSS, 601, GetItemTypeId(LoadItemHandle(udg_Stat_Table, cv, i)))
                    endif
                    if i == 1 then
                        call SaveEffectHandle(udg_FSS, 650 + pl, i, AddSpecialEffectTarget(path, u, "head"))
                    elseif i == 2 or i == 9 then
                        call SaveEffectHandle(udg_FSS, 650 + pl, i, AddSpecialEffectTarget(path, u, "chest"))
                    elseif i == 3 then
                        set subtype = LoadInteger(udg_CItem_Table, GetHandleId(LoadItemHandle(udg_Stat_Table, cv, i)), 3)
                        if subtype < 3 then
                            call SaveEffectHandle(udg_FSS, 650 + pl, i, AddSpecialEffectTarget(path, u, "hand left"))
                        elseif subtype == 6 then
                            call SaveEffectHandle(udg_FSS, 650 + pl, i, AddSpecialEffectTarget(path, u, "hand left"))
                            call SaveEffectHandle(udg_FSS, 650 + pl, i + 100, AddSpecialEffectTarget(QuiverPath, u, "chest"))
                        elseif subtype == 7 then
                            call SaveEffectHandle(udg_FSS, 650 + pl, i, AddSpecialEffectTarget(path, u, "hand left"))
                            call SaveEffectHandle(udg_FSS, 650 + pl, i + 100, AddSpecialEffectTarget(path, u, "hand right"))
                        else
                            call SaveEffectHandle(udg_FSS, 650 + pl, i, AddSpecialEffectTarget(path, u, "hand right"))
                        endif
                    elseif i == 4 then
                        call SaveEffectHandle(udg_FSS, 650 + pl, i, AddSpecialEffectTarget(path, u, "foot left"))
                        call SaveEffectHandle(udg_FSS, 650 + pl, i + 100, AddSpecialEffectTarget(path, u, "foot right"))
                    elseif i == 5 then
                        call SaveEffectHandle(udg_FSS, 650 + pl, i, AddSpecialEffectTarget(path, u, "hand right"))
                    endif
                endif
                if i == 5 then
                    set i = 8
                endif
                set i = i + 1
            endloop
        endif
        set pl = pl + 1
    endloop

    set path = null
    set QuiverPath = null
    set u = null
endfunction

//---------------------------------------------------------------------
//           FULL SCREEN ICON and INTERFACE HANDLING
//---------------------------------------------------------------------

function EnableBlackWindow takes integer pl returns nothing
    local real x1Img = LoadReal(udg_FSS, 0, 1) - 150
    local real y1Img = LoadReal(udg_FSS, 0, 2) - 150
    local real x2Img = LoadReal(udg_FSS, 0, 4)
    local real y2Img = LoadReal(udg_FSS, 0, 5)
    local integer alphaImg = 0
    local image Img
    if GetLocalPlayer() == Player(pl - 1) then
        call FogEnable(false)
        call FogMaskEnable(false)
        set alphaImg = 255
    endif
    set Img = CreateImage("Background.tga", x2Img, y2Img, 50, x1Img, y1Img, 50, 0, 0, 50, 2)
    call SetImageRenderAlways (Img, true)
    call SetImageColor(Img, 255, 255, 255, alphaImg)
    call SaveImageHandle(udg_FSS, 0, 800 + pl, Img)
    set Img = null
endfunction


function DisableBlackWindow takes integer pl returns nothing
    call DestroyImage(LoadImageHandle(udg_FSS, 0, 800 + pl))
endfunction


function ShowFakeInterface takes nothing returns nothing
    local integer i = 0
    local destructable d
    local unit u
    local integer alpha = 255
    local boolean b = true
    local integer pl = GetPlayerId(GetLocalPlayer()) + 1
    if udg_Camera_Lock[pl] > 0 then
        set alpha = 0
        set b = false
    endif
    loop
        set d = LoadDestructableHandle(udg_FSS, 1400, i)
        exitwhen d == null
        call ShowDestructable(d, b)
        set i = i + 1
    endloop
    set i = 0
    loop
        set u = LoadUnitHandle(udg_FSS, 1401, i)
        exitwhen u == null
        call SetUnitVertexColor(u, 255, 255, 255, alpha)
        set i = i + 1
    endloop
    set d = null
    set u = null
endfunction

function ShowTradeWindow takes nothing returns nothing
    local integer i = 0
    local destructable d = null
    local boolean b = false
    local integer pl = GetPlayerId(GetLocalPlayer()) + 1
    local integer plt = udg_Trader[GetPlayerId(GetLocalPlayer()) + 1]
    local real x
    local real y
    local texttag tt = null
    local string s
    call DestroyTextTag(LoadTextTagHandle(udg_FSS, 1250 + pl, 6))
    call DestroyTextTag(LoadTextTagHandle(udg_FSS, 1250 + plt, 6))
    call DestroyTextTag(LoadTextTagHandle(udg_FSS, 1250 + pl, 5))
    call DestroyTextTag(LoadTextTagHandle(udg_FSS, 1250 + plt, 5))
    if udg_Camera_Lock[pl] == 1 and udg_Trader[pl] > 0 then
        set b = true
        set s = GetPlayerName(GetLocalPlayer()) + " trade with " + GetPlayerName(Player(udg_Trader[pl] - 1))
        set x = LoadReal(udg_FSS, 0, 1) + 946 - (StringLength(s) * 4)
        set y = LoadReal(udg_FSS, 0, 2) + 300
        set s = StringColoring ( s, 200, 200, 255, 50, 50, 255 )
        set tt = CreateTextTag( )
        call SetTextTagText( tt, s, 0.8 * 0.023 )
        call SetTextTagPos( tt, x , y, 100.00 )
        call SetTextTagPermanent( tt, true )
        call SaveTextTagHandle(udg_FSS, 1250 + pl, 5, tt)
        if GetLocalPlayer() == Player(pl - 1) then
            set x = LoadReal(udg_FSS, 0, 1) + 778+64
        elseif GetLocalPlayer() == Player(udg_Trader[pl] - 1) then
            set x = LoadReal(udg_FSS, 0, 1) + 1020+64
        endif
        set y = LoadReal(udg_FSS, 0, 2) + 215
        set tt = CreateTextTag( )
        call SetTextTagText( tt, I2S(LoadInteger(udg_FSS, 1250 + pl, 7)), 0.8 * 0.023 )
        call SetTextTagPos( tt, x , y, 100.00 )
        call SetTextTagPermanent( tt, true )
        call SetTextTagColor(tt, 200, 200, 200, 100)
        call SaveTextTagHandle(udg_FSS, 1250 + pl, 6, tt)
        if GetLocalPlayer() == Player(pl - 1) then
            set x = LoadReal(udg_FSS, 0, 1) + 1020+64
        elseif GetLocalPlayer() == Player(udg_Trader[pl] - 1) then
            set x = LoadReal(udg_FSS, 0, 1) + 778+64
        endif
        set tt = CreateTextTag( )
        call SetTextTagText( tt, I2S(LoadInteger(udg_FSS, 1250 + udg_Trader[pl], 7)), 0.8 * 0.023 )
        call SetTextTagPos( tt, x , y, 100.00 )
        call SetTextTagPermanent( tt, true )
        call SetTextTagColor(tt, 200, 200, 200, 100)
        call SaveTextTagHandle(udg_FSS, 1250 + udg_Trader[pl], 6, tt)
        set tt = null
        set s = null
    elseif udg_Camera_Lock[pl] == 1 then
        if LoadInteger(udg_FSS, 1250 + pl, 7) > 0 then
            call SetPlayerState(Player(pl - 1), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(Player(pl - 1), PLAYER_STATE_RESOURCE_GOLD) + LoadInteger(udg_FSS, 1250 + pl, 7))
            call SaveInteger(udg_FSS, 1250 + pl, 7, 0)
        endif
         //LoadInteger(udg_FSS, 1250+udg_Trader[pl],7)
        set i = 1200
        loop
            exitwhen i > 1205//1205
            if LoadInteger(udg_FSS, 1249 + pl, i) > 0 then
                call SaveInteger(udg_FSS, 1249 + pl, i, 0)
                call RemoveDestructable(LoadDestructableHandle(udg_FSS, 2409 + pl, i ))
            endif
            call RemoveDestructable(LoadDestructableHandle(udg_FSS, 2409 + pl, i + 6 ))
            call RemoveDestructable(LoadDestructableHandle(udg_FSS, 2409 + udg_Trader[pl], i + 6 ))
            if LoadInteger(udg_FSS, 1249 + udg_Trader[pl], i) > 0 then
                call SaveInteger(udg_FSS, 1249 + udg_Trader[pl], i, 0)
                call RemoveDestructable(LoadDestructableHandle(udg_FSS, 2409 + udg_Trader[pl], i + 6 ))
            endif
            set i = i + 1
        endloop
    endif
    set i = 0
    loop
        set d = LoadDestructableHandle(udg_FSS, 1200 + i, 0)
        exitwhen d == null
        call ShowDestructable(d, b)
        set i = i + 1
    endloop
    set i = 0
    if udg_Camera_Lock[pl] == 1 and udg_Trader[pl] > 0 then
        set b = true
    endif
    loop
        set d = LoadDestructableHandle(udg_FSS, 0, 2000 + i)
        exitwhen d == null
        call ShowDestructable(d, b)
        set i = i + 1
    endloop
    set i = 0
    loop
        set d = LoadDestructableHandle(udg_FSS, 1300 + i, 0)
        exitwhen d == null
        call ShowDestructable(d, b)
        set i = i + 1
        if i == 4 then
            set b = false
            set i = 10
        endif
    endloop
    if LoadInteger(udg_FSS, 1275 + pl, 1) > 0 then
        call SaveInteger(udg_FSS, 1275 + pl, 1, 0)
    endif
    set d = null
    set s = null
endfunction

function ShowCraftBox takes nothing returns nothing
    local destructable d
    local boolean b = false
    local integer pl = GetPlayerId(GetLocalPlayer()) + 1
    local integer i = 0
    if LoadInteger(udg_FSS, 2405, pl) == 1 then
        set b = true
    endif
    loop
        set d = LoadDestructableHandle(udg_FSS, 2400, i)
        exitwhen i == 6 or d == null
        call ShowDestructable(d, b)
        set i = i + 1
    endloop
    
    call ShowDestructable(LoadDestructableHandle(udg_FSS, 2303, 0), b)
    call ShowDestructable(LoadDestructableHandle(udg_FSS, 2304, 0), b)
    call ShowDestructable(LoadDestructableHandle(udg_FSS, 2305, 0), b)
    //if LoadTextTagHandle(udg_FSS,2400, i -10-20) != null then
    //     call DestroyTextTag(tt)
    //endif
    set d = null
endfunction

function UpdateGoldinShop takes integer pl returns nothing
    local texttag tt = null
    local real x = LoadReal(udg_FSS, 0, 1)
    local real y = LoadReal(udg_FSS, 0, 2)
    call DestroyTextTag(LoadTextTagHandle(udg_FSS, 2402, 60 + pl))
    if GetLocalPlayer() == Player(pl - 1) then
        set x = LoadReal(udg_FSS, 0, 1)
        set y = LoadReal(udg_FSS, 0, 2)
        set tt = CreateTextTag( )
        call SetTextTagText( tt, StringColoring(I2S(GetPlayerState(Player(pl - 1), PLAYER_STATE_RESOURCE_GOLD)), 255, 255, 100, 255, 255, 255), 1 * 0.023 )
        call SetTextTagPos( tt, x + 128, y + 260, 100.00 )
        call SetTextTagPermanent( tt, true )
    endif
    call SaveTextTagHandle(udg_FSS, 2402, 60 + pl, tt)
    set tt = null
endfunction

function ShowInventoryBox takes nothing returns nothing
    local destructable d
    local boolean b = false
    local integer pl = GetPlayerId(GetLocalPlayer()) + 1
    local integer i = 0
    if udg_Camera_Lock[pl] > 0 then
        set b = true
    endif
    loop
        set d = LoadDestructableHandle(udg_FSS, 0, 200+i)
        exitwhen d == null or i > 299
        call ShowDestructable(d, b)
        set i = i + 1
    endloop
    set d = null
endfunction

function CWInterface takes nothing returns nothing
    local integer i = 0
    local destructable d
    local integer alpha = 0
    local boolean b = false
    local integer pl = GetPlayerId(GetLocalPlayer()) + 1
    local unit u = LoadUnitHandle(udg_FSS, 550, 0)
    if udg_Camera_Lock[pl] == 1 then
        set b = true
    endif
    
    set i = 0
    loop
        set d = LoadDestructableHandle(udg_FSS, 0, 300+i)
        exitwhen d == null
        call ShowDestructable(d, b)
        set i = i + 1
    endloop

    set i = 1
    loop
        set d = LoadDestructableHandle(udg_FSS, i, 0)
        exitwhen i > 307
        if udg_Camera_Lock[pl] == 2 or udg_Camera_Lock[pl] == 3 then
            if i >= 100 and i < 120 then
                set b = true
            else
                set b = false
            endif
        elseif udg_Camera_Lock[pl] == 1 then
            set b = true
        endif
        call ShowDestructable(d, b)
        set i = i + 1
        if i == 12 then
            set i = 100
        elseif i == 120 then
            set i = 200
        elseif i == 206 then
            set i = 300
        endif
    endloop

    if udg_Camera_Lock[pl] == 1 then
        set alpha = 255
    endif
    set b = false
    if udg_Camera_Lock[pl] == 2 then
        set b = true
    endif

    set i = 1
    loop
        set d = LoadDestructableHandle(udg_FSS, 2000, i)
        exitwhen d == null
        call ShowDestructable(d, b)
        set i = i + 1
    endloop

    set i = 0
    loop
        set d = LoadDestructableHandle(udg_FSS, 2100, i)
        exitwhen d == null
        call ShowDestructable(d, b)
        set i = i + 1
    endloop

    set i = 1
    loop
        set d = LoadDestructableHandle(udg_FSS, 2000 + i, 0)
        exitwhen d == null
        call ShowDestructable(d, b)
        set i = i + 1
    endloop

    set i = 1
    loop
        set d = LoadDestructableHandle(udg_FSS, 2100 + i, 0)
        exitwhen d == null
        call ShowDestructable(d, b)
        set i = i + 1
    endloop

    set i = 0
    loop
        set d = LoadDestructableHandle(udg_FSS, 2200 + i, 0)
        exitwhen d == null
        call ShowDestructable(d, b)
        set i = i + 1
    endloop
    set i = 0
    loop
        set d = LoadDestructableHandle(udg_FSS, 2300 + i, 0)
        exitwhen d == null
        call ShowDestructable(d, b)
        set i = i + 1
    endloop

    if LoadInteger(udg_FSS, 2405, pl) == 1 then
        call ShowDestructable(LoadDestructableHandle(udg_FSS, 2302, 0), true)
    else
        call ShowDestructable(LoadDestructableHandle(udg_FSS, 2302, 0), false)
    endif
    set b = false
    if LoadInteger(udg_FSS, 2405, 20 + pl) == 1 then
        set b = true
    endif
    set i = 0
    loop
        set d = LoadDestructableHandle(udg_FSS, 675, i)
        exitwhen d == null
        call ShowDestructable(d, b)
        set i = i + 1
    endloop

    if not LoadBoolean(udg_FSS, 631, GetUnitTypeId(udg_UDexUnits[udg_Inv_Unit[pl]])) then
        set alpha = 0
    endif
    call SetUnitVertexColor(u, 255, 255, 255, alpha)
    set b = false

    if udg_Camera_Lock[pl] == 3 or udg_Camera_Lock[pl] == 2 then
        set b = true
    endif
    set i = 0
    loop
        set d = LoadDestructableHandle(udg_FSS, 2200 + i, 0)
        exitwhen d == null
        call ShowDestructable(d, b)
        set i = i + 1
    endloop
    set i = 1
    loop
        set d = LoadDestructableHandle(udg_FSS, 2423, i)
        exitwhen d == null
        call ShowDestructable(d, b)
        set i = i + 1
    endloop

    set d = LoadDestructableHandle(udg_FSS, 2100, 6)

    if udg_Camera_Lock[pl] > 0 then
       call ShowDestructable(d, true)
    endif

    call ShowCraftBox()
    call ShowInventoryBox()
    set u = null
    set d = null
endfunction

// ------- clear screen :D if somebody remember to old old Qbasic :P
function CLS takes integer pl returns nothing
   if GetLocalPlayer() == Player(pl-1) then
      call ClearTextMessages()
   endif
endfunction

function ShowItemToInventory takes integer pl, integer cv returns nothing
    local item itm
    local integer i
    local integer dt
    local destructable d
    local real x
    local real y
//check inventory
    set i = 100
    loop
        exitwhen i > 119
        set itm = LoadItemHandle(udg_Stat_Table, cv, i)
        if itm != null then
            set dt = LoadInteger(udg_FSS, 600, GetItemTypeId(itm))
            set x = LoadReal(udg_FSS, i, 1)
            set y = LoadReal(udg_FSS, i, 2)
            if dt > 0 then
                set d = LoadDestructableHandle(udg_FSS, 2409 + pl, i)
                if d != null then
                    call RemoveDestructable(d)
                endif
                set d = CreateDestructableZ(dt, x, y, 5, 0, 0.6, 0)
                call SaveDestructableHandle(udg_FSS, 2409 + pl, i, d)
                call ShowDestructable(d, false)
                if GetLocalPlayer() == Player(pl - 1) then
                    call ShowDestructable(d, true)
                endif
            endif
        endif
        set i = i + 1
    endloop
    if udg_Camera_Lock[pl] == 2 or udg_Camera_Lock[pl] == 3 then
        call UpdateGoldinShop(pl)
    endif
    set itm = null
    set d = null
endfunction

function ShowBagContent takes integer pl returns nothing
    local integer i
    local integer dt
    local destructable d
    local real x
    local real y
    local integer id = udg_Inv_Bag[pl]
    local item itm
    local integer O = 2200
    call CWInterface()
//check inventory
    if id > 0 then
        set i = O + 1
        loop
            set itm = LoadItemHandle(udg_CItem_Table, id, i - O)
            exitwhen i > O + BAG_SIZE_MAX()
            if itm != null then
                set dt = LoadInteger(udg_FSS, 600, GetItemTypeId(itm))
                set x = LoadReal(udg_FSS, i, 1)
                set y = LoadReal(udg_FSS, i, 2)
                if dt > 0 then
                    set d = CreateDestructableZ(dt, x, y, 5, 0, 0.6, 0)
                    call SaveDestructableHandle(udg_FSS, 2409 + pl, i, d)
                    call ShowDestructable(d, false)
                    if GetLocalPlayer() == Player(pl - 1) then
                        call ShowDestructable(d, true)
                    endif
                endif
            endif
            set i = i + 1
        endloop
    endif
    set d = null
endfunction

function StartShop takes integer pl returns nothing
    local integer ilv
    local integer i
    local real x = 0
    local real y = 0
    local integer cv = udg_Inv_Unit[pl]
    local texttag tt = null
    call IssueImmediateOrder( udg_UDexUnits[cv], "stop" )
    if GetLocalPlayer() == Player(pl - 1) then
        call ClearSelection()
        call SelectUnit(udg_UDexUnits[udg_Inv_Unit[pl]], true)
    endif
    call UpdateGoldinShop(pl)
    call DestroyTextTag(LoadTextTagHandle(udg_FSS, 2402, 80 + pl))
    set x = LoadReal(udg_FSS, 0, 1)
    set y = LoadReal(udg_FSS, 0, 2)
    if GetLocalPlayer() == Player(pl - 1) then
        set tt = CreateTextTag( )
        call SetTextTagText( tt, StringColoring("Welcome (Shop)", 100, 100, 255, 255, 255, 255), 1.4 * 0.023 )
        call SetTextTagPos( tt, x + 32, y + 480, 100.00 )
        call SetTextTagPermanent( tt, true )
    endif
    call SaveTextTagHandle(udg_FSS, 2402, 80 + pl, tt)
    set tt = null
    call ShowItemToInventory (pl, cv)
    call FlushFT_Stat(pl)
    call CLS (pl)
    call CWInterface()
    call SetChargesText(pl)
    call ShowTradeWindow()
endfunction

function StartBagpack takes integer pl returns nothing
    call UpdateGoldinShop(pl)
    call SetChargesText(pl)
    call ShowBagContent(pl)
    call CLS (pl)
    call ShowItemToInventory(pl, udg_Inv_Unit[pl])
    if GetLocalPlayer() == Player(pl - 1) then
        call ClearSelection()
        call SelectUnit(udg_UDexUnits[udg_Inv_Unit[pl]], true)
    endif
endfunction

function CreateDummyUnit takes integer pl, string path, real x, real y, real z, real sc, integer p returns nothing
    local integer c = LoadInteger(udg_FSS, 0, -pl*20)+1
    local integer dr = DUMMY_ID()
    local string s = ""
    local effect e
    local unit u = CreateUnit( Player(pl-1), dr, LoadReal(udg_FSS, 0, 1)+x, LoadReal(udg_FSS, 0, 2)+y, 270 )
    call SaveInteger(udg_FSS, 0, -pl*20,c)
    if GetLocalPlayer() == Player(pl-1) then
       set s = path
    endif
    call UnitAddAbility(u, 'Amrf')
    call UnitRemoveAbility(u, 'Amrf')
    call SetUnitAnimationByIndex(u, p )
    call SetUnitScale(u, sc,sc,sc)
    call SetUnitFlyHeight(u, z, 0)
    set e = AddSpecialEffectTarget(  s, u, "chest" )
    call SaveUnitHandle(  udg_FSS, 0, -pl*20-c*2-1, u)
    call SaveEffectHandle(udg_FSS, 0, -pl*20-c*2, e)
    set u = null
    set e = null
    set s = null
endfunction

function StartInventory takes integer pl returns nothing
    local integer ilv
    local integer cv = udg_Inv_Unit[pl]
    local integer i
    local integer dt
    local destructable d
    local item itm
    local real x
    local real y
    local unit u = udg_UDexUnits[cv]
    local unit u2
    call DummyVillagerAttachmentRefresh()

    call IssueImmediateOrder( u, "stop" )
    if GetLocalPlayer() == Player(pl - 1) then
        call ClearSelection()
        call SelectUnit(u, true)
    endif

    call CreateDummyUnit (pl, "Doodads\\Felwood\\Plants\\FelwoodBush\\FelwoodBush0.mdx", 500, 220, 100, 0.7, 155)
    call CreateDummyUnit (pl, "Doodads\\LordaeronSummer\\Props\\LanternPost\\LanternPost1.mdl", 630, 250, 150, 1.1, 175)
    call CreateDummyUnit (pl, "units\\critters\\BlackStagMale\\BlackStagMale.mdl", 500, 250, 50, 1.3, 155)

//check inventory
    set i = 1
    loop
        exitwhen i == 11
        set ilv = LoadInteger(udg_Stat_Table, cv, - i)
        if ilv != 0 then
            set dt = LoadInteger(udg_FSS, 600, GetItemTypeId(LoadItemHandle(udg_Stat_Table, cv, i)))
            set x = LoadReal(udg_FSS, i, 1)
            set y = LoadReal(udg_FSS, i, 2)
            if dt > 0 then
                set d = CreateDestructableZ(dt, x, y, 5, 0, 0.6, 0)
                call SaveDestructableHandle(udg_FSS, 2409 + pl, i, d)
                call ShowDestructable(d, false)
                if GetLocalPlayer() == Player(pl - 1) then
                    call ShowDestructable(d, true)
                endif
            endif
        endif
        set i = i + 1
    endloop
    call ShowItemToInventory(pl, cv)
    set i = 200
    loop
        exitwhen i > 205
        set itm = UnitItemInSlot(u, i - 200)
        if itm != null then
            set ilv = GetItemLevel(itm)
            set dt = LoadInteger(udg_FSS, 600, GetItemTypeId(itm))
            set x = LoadReal(udg_FSS, i, 1)
            set y = LoadReal(udg_FSS, i, 2)
            if dt > 0 then
                set d = CreateDestructableZ(dt, x, y, 5, 0, 0.6, 0)
                call SaveDestructableHandle(udg_FSS, 2409 + pl, i, d)//i - 200
                call ShowDestructable(d, false)
                if GetLocalPlayer() == Player(pl - 1) then
                    call ShowDestructable(d, true)
                endif
            endif
        endif
        set i = i + 1
    endloop
    //we clear the screen from text
    call CLS (pl)
    call ShowStat(pl)
    call SetChargesText(pl)
    call CWInterface()
    call ShowTradeWindow()
    set i = GetUnitTypeId(u)
    if LoadStr(udg_FSS, 635, i) != null then
         call CreateDummyUnit (pl, LoadStr(udg_FSS, 635, i), 580, 160, 50, LoadReal(udg_FSS, 632, i), 170)
    endif
    call UpdateGoldinShop(pl)
    set itm = null
    set u = null
endfunction

function EnableCamLock takes integer pl, integer CamType returns nothing
    local integer i
    local integer a = 10 * pl + 100
    call SaveReal(udg_FSS, 0, a, GetCameraTargetPositionX())
    call SaveReal(udg_FSS, 0, a + 1, GetCameraTargetPositionY())
    call SaveReal(udg_FSS, 0, a + 2, GetCameraTargetPositionZ())
    call SaveReal(udg_FSS, 0, a + 3, GetCameraField(CAMERA_FIELD_TARGET_DISTANCE))
    call SaveReal(udg_FSS, 0, a + 4, GetCameraField(CAMERA_FIELD_FARZ))
    call SaveReal(udg_FSS, 0, a + 5, GetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK))
    call SaveReal(udg_FSS, 0, a + 6, GetCameraField(CAMERA_FIELD_FIELD_OF_VIEW))
    call SaveReal(udg_FSS, 0, a + 7, GetCameraField(CAMERA_FIELD_ROLL))
    call SaveReal(udg_FSS, 0, a + 8, GetCameraField(CAMERA_FIELD_ROTATION))
    call SaveReal(udg_FSS, 0, a + 9, GetCameraField(CAMERA_FIELD_ZOFFSET))
    //call DisplayTextToPlayer(Player(pl - 1), 0, 0, R2S(GetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK)))
    call SetUnitPropWindow (udg_UDexUnits[udg_Inv_Unit[pl]], 0)
    call EnableBlackWindow(pl)
    set udg_Cam_Index = udg_Cam_Index + 1
    set i = udg_Cam_Index
    set udg_Cam_Pl[i] = pl
    set udg_Camera_Lock[pl] = CamType
    if CamType == 1 then
        call StartInventory(pl)
    elseif CamType == 2 then
        call StartShop(pl)
    elseif CamType == 3 then
        call StartBagpack(pl)
    endif
    set udg_Inv_Prev[pl] = 0
    //call DisplayTimedTextToForce( GetPlayersAll(), 30, "camera enable for player "+I2S(pl)+" camera index"+I2S(udg_Cam_Index))
   //if udg_Camera_Lock[udg_Cam_Pl[i]] then
   //call DisplayTimedTextToForce( GetPlayersAll(), 30,"camplayer "+I2S(udg_Cam_Pl[i])+" camera index"+I2S(udg_Cam_Index)+" i= "+I2S(i))
   //endif
    call ShowFakeInterface()
    if i == 1 then
        call EnableTrigger( gg_trg_Periodic_camera_lock )
    endif
    if GetLocalPlayer() == Player(pl - 1) then
        call CameraSetupApplyForceDuration(udg_Cam1, true, 0.00)
    endif
    if udg_Mb_Type[pl] > 0 then
        call DestroyMultiboard(udg_Mb_Table[pl])
        set udg_Mb_Type[pl] = 0
    endif
endfunction
 
function DisableCamLock takes integer pl returns nothing
    local integer index = 0
    local integer i = 1
    local integer a = 100 + 10 * pl
    local unit u = udg_UDexUnits[udg_Inv_Unit[pl]]
    loop
        exitwhen i > udg_Cam_Index or index != 0
        if udg_Cam_Pl[i] == pl then
            set index = i
        endif
        set i = i + 1
    endloop
    if index == udg_Cam_Index then
        set udg_Cam_Pl[index] = 0
    else
        set udg_Cam_Pl[index] = udg_Cam_Pl[udg_Cam_Index]
    endif
    if udg_Cam_Index > 0 then
        set udg_Cam_Index = udg_Cam_Index - 1
    endif
    set udg_Camera_Lock[pl] = 0
    call DisableBlackWindow(pl)
    call SetUnitPropWindow(u, GetUnitDefaultPropWindow(u))
    if GetLocalPlayer() == Player(pl - 1) then
        call ResetToGameCamera(0.00)
        call ClearSelection()
        call SelectUnit(u, true)
    endif

    if GetLocalPlayer() == Player(pl - 1) then
        call FogEnable(true)
        call FogMaskEnable(true)
    endif

    call ShowFakeInterface()

    if udg_Cam_Index == 0 then
        call DisableTrigger( gg_trg_Periodic_camera_lock )
    endif
    set udg_Inv_Prev[pl] = 0
    if Player(pl - 1) == GetLocalPlayer() then
        call SetCameraPosition(LoadReal(udg_FSS, 0, a), LoadReal(udg_FSS, 0, a + 1))
        call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, LoadReal(udg_FSS, 0, a + 3), 0)
        call SetCameraField(CAMERA_FIELD_FARZ, LoadReal(udg_FSS, 0, a + 4), 0)
        call SetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK, bj_RADTODEG * LoadReal(udg_FSS, 0, a + 5), 0)
        call SetCameraField(CAMERA_FIELD_FIELD_OF_VIEW, bj_RADTODEG * LoadReal(udg_FSS, 0, a + 6), 0)
        call SetCameraField(CAMERA_FIELD_ROLL, bj_RADTODEG * LoadReal(udg_FSS, 0, a + 7), 0)
        call SetCameraField(CAMERA_FIELD_ROTATION, bj_RADTODEG * LoadReal(udg_FSS, 0, a + 8), 0)
        call SetCameraField(CAMERA_FIELD_ZOFFSET, LoadReal(udg_FSS, 0, a + 9), 0)
    endif
    set u = null
endfunction


//---------------------------------------------------------------------
//                             MULTIBOARDS
//---------------------------------------------------------------------


function UpdateMb takes multiboard m, integer x, integer y, string t returns nothing
    local multiboarditem mbitem = MultiboardGetItem(m, x, y)
    call MultiboardSetItemValue(mbitem, t)
    call MultiboardReleaseItem(mbitem)
    set mbitem = null
endfunction

function scaning takes unit u, unit ut, player p returns nothing
    local integer pl = GetPlayerId(p) + 1
    local integer lv
    local integer lvt
    local integer cv = GetUnitUserData(u)
    local integer cvt = GetUnitUserData(ut)
    local integer crit = udg_Global_Crit[cvt]
    local real eva = udg_Global_Eva[cv]
    local real evat = udg_Global_Eva[cvt]
    local real acc = udg_Global_Acc[cv]
    local real acct = udg_Global_Acc[cvt]
    local integer hit
    local integer hitt
    local integer hpt = R2I(GetWidgetLife(ut))
    local integer mpt = R2I(GetUnitState(ut, UNIT_STATE_MANA))
    local integer maxhpt = R2I(GetUnitState(ut, UNIT_STATE_MAX_LIFE))
    local integer maxmpt = R2I(GetUnitState(ut, UNIT_STATE_MAX_MANA))
    local real dmg = udg_Total_Dmg[cv] + 27
    local real spelldmg = udg_TotalSpellPower[cv]
    local integer AttLv = udg_Global_AttLv[cv]// + udg_B_AttLv[cv]
    local integer AttLvt = udg_Global_AttLv[cvt]// + udg_B_AttLv[cvt]
    local integer DefLv = udg_Global_DefLv[cvt]// + udg_B_DefLv[cvt]
    local integer critdmg = udg_Global_CritDmg[cv] + 200// + udg_B_CritDmg[cv]
    local integer pdef = udg_Global_Pdef[cvt]// + udg_B_Pdef[cvt]
    local integer mdef1 = udg_Global_Mdef1[cvt]// + udg_B_Mdef[cvt]
    local integer mdef2 = udg_Global_Mdef2[cvt]// + udg_B_Mdef[cvt]
    local integer mdef3 = udg_Global_Mdef3[cvt]// + udg_B_Mdef[cvt]
    local integer mdef4 = udg_Global_Mdef4[cvt]// + udg_B_Mdef[cvt]
    local integer mdef5 = udg_Global_Mdef5[cvt]// + udg_B_Mdef[cvt]
    local integer ap = GetPlayerId(GetOwningPlayer(ut)) + 1
    local real pdefr
    local real mdef1r
    local real mdef2r
    local real mdef3r
    local real mdef4r
    local real mdef5r
    local multiboarditem mbitem
    local multiboard m = CreateMultiboard()
    local integer i = 0
    local string ttype
    local integer exp = R2I(udg_Global_Exp[cvt] * (100 + udg_Stat_Exp[cv]) / 100.00) // = R2I((udg_Global_Exp[cvt] * udg_Difficulty * (100 + udg_Stat_Exp[pl] + udg_B_Exp[cv]) / 100.00) / 2) + 50
    if udg_Mb_Type[pl] != 0 then
        call DestroyMultiboard( udg_Mb_Table[pl] )
    endif
    set udg_Mb_Table[pl] = m
    call MultiboardClear( m )
    set udg_Mb_Type[pl] = 2
    call MultiboardSetRowCount(m, 22)
    call MultiboardSetColumnCount(m, 2)
    call MultiboardSetTitleText(m, "Scan board")
    call MultiboardSetTitleTextColor(m, 255, 200, 200, 255)
    loop
        exitwhen i > 22
        set mbitem = MultiboardGetItem(m, i, 0)
        call MultiboardSetItemWidth(mbitem, 12 / 100.0)
        call MultiboardSetItemValueColor(mbitem, 230, 230, 230, 255)
        call MultiboardSetItemStyle(mbitem, true, false)
        call MultiboardReleaseItem(mbitem)
        set mbitem = MultiboardGetItem(m, i, 1)
        call MultiboardSetItemValue(mbitem, " ")
        call MultiboardSetItemValueColor(mbitem, 150, 150, 150, 255)
        call MultiboardSetItemWidth(mbitem, 8 / 100.0)
        call MultiboardSetItemStyle(mbitem, true, false)
        call MultiboardReleaseItem(mbitem)
        set i = i + 1
    endloop

    if IsUnitType(u, UNIT_TYPE_HERO) then
        set lv = GetHeroLevel(u)
    else
        set lv = GetUnitLevel(u)
    endif

    if IsUnitType(ut, UNIT_TYPE_HERO) then
        set lvt = GetHeroLevel(ut)
    else
        set lvt = GetUnitLevel(ut)
    endif

    if udg_Hero[ap] != ut then
        if GetUnitPointValue(ut) == 50 then
            set ttype = "Fire"
        elseif GetUnitPointValue(ut) == 51 then
            set ttype = "Water"
        elseif GetUnitPointValue(ut) == 52 then
            set ttype = "Lightning"
        elseif GetUnitPointValue(ut) == 53 then
            set ttype = "Poison"
        elseif GetUnitPointValue(ut) == 54 then
            set ttype = "Earth"
        else
            set ttype = "Physical"
        endif

    else
        set ttype = "Hero"
    endif

    set dmg = dmg + (udg_Global_DmgInc[cv] - udg_Global_DmgRed[cvt]) / 100.00 * dmg
    set spelldmg = spelldmg + (udg_Global_DmgInc[cv] - udg_Global_DmgRed[cvt]) / 100.00 * spelldmg

    set pdefr = ((1 - pdef / ( 40.00 * lv + pdef + 25.00)) * 100.00 )
    set mdef1r = ((1 - mdef1 / ( 40.00 * lv + mdef1 + 25.00)) * 100.00 )
    set mdef2r = ((1 - mdef2 / ( 40.00 * lv + mdef2 + 25.00)) * 100.00 )
    set mdef3r = ((1 - mdef3 / ( 40.00 * lv + mdef3 + 25.00)) * 100.00 )
    set mdef4r = ((1 - mdef4 / ( 40.00 * lv + mdef4 + 25.00)) * 100.00 )
    set mdef5r = ((1 - mdef5 / ( 40.00 * lv + mdef5 + 25.00)) * 100.00 )

    if mdef1 < 0 then
        set mdef1 = 0
    endif
    if mdef2 < 0 then
        set mdef2 = 0
    endif
    if mdef3 < 0 then
        set mdef3 = 0
    endif
    if mdef4 < 0 then
        set mdef4 = 0
    endif
    if mdef5 < 0 then
        set mdef5 = 0
    endif
    if pdef < 0 then
        set pdef = 0
    endif

    if ( AttLv > DefLv ) then
        set dmg = 0//dmg * ( 1 + ( AttLv - DefLv ) / 100.00 ) * pdefr / 100.00
        set spelldmg = 0//spelldmg * ( 1 + ( AttLv - DefLv ) / 100.00 ) * mdefr / 100.00
    else
        set dmg = 0//dmg / ( 1.00 + ( DefLv - AttLv ) / 120.00) * pdefr / 100.00
        set spelldmg = 0//spelldmg / ( 1.00 + ( DefLv - AttLv ) / 120.00) * mdefr / 100.00
    endif

    set hit = HitChance(cv, cvt)
    set hitt = 100 - HitChance(cvt, cv)
    set mbitem = MultiboardGetItem(m, 0, 0)
    call MultiboardSetItemValue(mbitem, "Level")
    call MultiboardReleaseItem(mbitem)
    set mbitem = MultiboardGetItem(m, 1, 0)
    call MultiboardSetItemValue(mbitem, "Type")
    call MultiboardReleaseItem(mbitem)
    set mbitem = MultiboardGetItem(m, 2, 0)
    call MultiboardSetItemValue(mbitem, "Attack Type")
    call MultiboardReleaseItem(mbitem)
    set mbitem = MultiboardGetItem(m, 3, 0)
    call MultiboardSetItemValue(mbitem, "HP")
    call MultiboardReleaseItem(mbitem)
    set mbitem = MultiboardGetItem(m, 4, 0)
    call MultiboardSetItemValue(mbitem, "Critical Chance")
    call MultiboardReleaseItem(mbitem)
    set mbitem = MultiboardGetItem(m, 5, 0)
    call MultiboardSetItemValue(mbitem, "Attack Level")
    call MultiboardReleaseItem(mbitem)
    set mbitem = MultiboardGetItem(m, 6, 0)
    call MultiboardSetItemValue(mbitem, "Def. Level")
    call MultiboardReleaseItem(mbitem)
    set mbitem = MultiboardGetItem(m, 7, 0)
    call MultiboardSetItemValue(mbitem, "Life Steal")
    call MultiboardReleaseItem(mbitem)
    set mbitem = MultiboardGetItem(m, 8, 0)
    call MultiboardSetItemValue(mbitem, "Mana Steal")
    call MultiboardReleaseItem(mbitem)
    set mbitem = MultiboardGetItem(m, 9, 0)
    call MultiboardSetItemValue(mbitem, "Reflect")
    call MultiboardReleaseItem(mbitem)
    set mbitem = MultiboardGetItem(m, 10, 0)
    call MultiboardSetItemValue(mbitem, "Armor Break")
    call MultiboardReleaseItem(mbitem)
    set mbitem = MultiboardGetItem(m, 11, 0)
    call MultiboardSetItemValue(mbitem, "-")
    call MultiboardReleaseItem(mbitem)
    set mbitem = MultiboardGetItem(m, 12, 0)
    call MultiboardSetItemValue(mbitem, "Phy. defence")
    call MultiboardReleaseItem(mbitem)
    set mbitem = MultiboardGetItem(m, 13, 0)
    call MultiboardSetItemValue(mbitem, "Fire ress.")
    call MultiboardReleaseItem(mbitem)
    set mbitem = MultiboardGetItem(m, 14, 0)
    call MultiboardSetItemValue(mbitem, "Water ress.")
    call MultiboardReleaseItem(mbitem)
    set mbitem = MultiboardGetItem(m, 15, 0)
    call MultiboardSetItemValue(mbitem, "Light. ress.")
    call MultiboardReleaseItem(mbitem)
    set mbitem = MultiboardGetItem(m, 16, 0)
    call MultiboardSetItemValue(mbitem, "Poison. ress.")
    call MultiboardReleaseItem(mbitem)
    set mbitem = MultiboardGetItem(m, 17, 0)
    call MultiboardSetItemValue(mbitem, "Earth. ress.")
    call MultiboardReleaseItem(mbitem)
    set mbitem = MultiboardGetItem(m, 18, 0)
    call MultiboardSetItemValue(mbitem, "Accurancy")
    call MultiboardReleaseItem(mbitem)
    set mbitem = MultiboardGetItem(m, 19, 0)
    call MultiboardSetItemValue(mbitem, "Evasion")
    call MultiboardReleaseItem(mbitem)
    set mbitem = MultiboardGetItem(m, 20, 0)
    call MultiboardSetItemValue(mbitem, "Exp.")
    call MultiboardReleaseItem(mbitem)
    set mbitem = MultiboardGetItem(m, 21, 0)
    call MultiboardSetItemValue(mbitem, "Block chance")
    call MultiboardReleaseItem(mbitem)
    call UpdateMb (m, 0, 1, I2S(lvt))
    call UpdateMb (m, 1, 1, GetUnitName(ut))
    call UpdateMb (m, 2, 1, ttype)
    call UpdateMb (m, 3, 1, "|cffffff00" + I2S(R2I(GetWidgetLife(ut))) + "|r / |cffff3300" + I2S(R2I(GetUnitState(ut, UNIT_STATE_MAX_LIFE))) + "|r")
    call UpdateMb (m, 4, 1, (I2S(crit) + " %%"))
    call UpdateMb (m, 5, 1, I2S(AttLvt))
    call UpdateMb (m, 6, 1, I2S(DefLv))
    call UpdateMb (m, 7, 1, (I2S(udg_Global_LifeSteal[cvt] ) + " %%"))// + udg_B_LS[cvt]
    call UpdateMb (m, 8, 1, (I2S(R2I(udg_Global_ManaSteal[cvt])) + " %%"))
    call UpdateMb (m, 9, 1, (I2S(udg_Global_Reflect[cvt]) + " %%"))// + udg_B_Ref[cvt]
    call UpdateMb (m, 10, 1, (I2S(udg_Global_ArmorBreak[cvt]) + " %%"))
    call UpdateMb (m, 11, 1, "....")
    call UpdateMb (m, 12, 1, I2S(pdef) + " |cff999900(" + R2S(100 - pdefr) + "%%)|r")
    call UpdateMb (m, 13, 1, I2S(mdef1) + " |cff999900(" + R2S(100 - mdef1r) + "%%)|r")
    call UpdateMb (m, 14, 1, I2S(mdef2) + " |cff999900(" + R2S(100 - mdef2r) + "%%)|r")
    call UpdateMb (m, 15, 1, I2S(mdef3) + " |cff999900(" + R2S(100 - mdef3r) + "%%)|r")
    call UpdateMb (m, 16, 1, I2S(mdef4) + " |cff999900(" + R2S(100 - mdef4r) + "%%)|r")
    call UpdateMb (m, 17, 1, I2S(mdef5) + " |cff999900(" + R2S(100 - mdef5r) + "%%)|r")
    call UpdateMb (m, 18, 1, I2S(udg_Global_Acc[cvt]) + " |cff999900(" + I2S(hit) + "%%)|r")
    call UpdateMb (m, 19, 1, I2S(udg_Global_Eva[cvt]) + " |cff999900(" + I2S(hitt) + "%%)|r")
    call UpdateMb (m, 20, 1, I2S(exp))
    call UpdateMb (m, 21, 1, I2S(udg_Global_Block[cvt]) + " %%")
    call MultiboardMinimize(m, true)
    call MultiboardMinimize(m, false)
    call MultiboardDisplay( m, false )
    if GetLocalPlayer() == p then
        call MultiboardDisplay( m, true )
    endif
    set m = null
    set mbitem = null
    set ttype = null
endfunction


function Mb_Item_ToolTip takes item itm, integer cv, integer cv2, integer slot returns nothing
    local integer ilv = GetItemLevel(itm)
    local integer itmId = GetHandleId(itm)
    local integer itype = 0
    local integer dur
    local integer maxdur = 0
    local integer ref
    local integer refv
    local integer socket
    local integer subtype
    local integer maxsocket
    local integer quality
    local integer charge = GetItemCharges(itm)
    local integer rcost = 0
    local integer i = 1
    local integer str
    local integer agi
    local integer int
    local integer hlv
    local integer lvR
    local integer strR
    local integer agiR
    local integer intR
    local integer b = 0
    local integer c = 0
    local integer price = 0
    local string reqColor1 = "|cffff3333"
    local string reqColor2 = "|cffff3333"
    local string noreqColor = "|cffffff33"
    local integer place = 0
    local integer RowCount = 0
    local string s
    local string title
    local string array MbRow
    local multiboarditem mbitem
    local string array qc
    local unit u = udg_UDexUnits[cv]
    local integer pl = GetPlayerId(GetOwningPlayer(u)) + 1
    local integer viewer = pl
    local integer hclass = LoadInteger(udg_FSS, 633, GetUnitTypeId(u))
    local integer iclass
    local integer act_id
    if charge == 100 then
        set charge = 1
    endif

        //itm name fix
    set lvR = LoadInteger(udg_CItem_Table, itmId, 8)
    set hlv = GetHeroLevel(u)

    if ilv >= 100 and ilv < 200 then
        set title = GetFullItemName (itm, true)
        if ilv == BAG_LEVEL() then
            set itype = GetItemTypeId(itm)
            set b = 0
            loop
                exitwhen i > 24
                if LoadItemHandle(udg_CItem_Table, itmId, i) != null then
                    set b = b + 1
                    set MbRow[b] = GetFullItemName (LoadItemHandle(udg_CItem_Table, itmId, i), true)
                endif
                set i = i + 1
            endloop
            set i = b + 1
            if b == 0 then
                if LoadStr(udg_FSS, 647, itype) != null then
                    set MbRow[i] = "|caaaaffaa" + LoadStr(udg_FSS, 647, itype) + "|r"
                    if LoadStr(udg_FSS, 648, itype) != null then
                        set i = i + 1
                        set MbRow[i] = "|caaaaffaa" + LoadStr(udg_FSS, 648, itype) + "|r"
                        if LoadStr(udg_FSS, 649, itype) != null then
                            set i = i + 1
                            set MbRow[i] = "|caaaaffaa" + LoadStr(udg_FSS, 649, itype) + "|r"
                        endif
                    endif
                    set i = i + 1
                endif
            endif
            set b = 0
        elseif ilv == BOX_LEVEL() then
            set itype = GetItemTypeId(itm)
            if LoadStr(udg_FSS, 647, itype) != null then
                set MbRow[i] = "|caaaaffaa" + LoadStr(udg_FSS, 647, itype) + "|r"
                if LoadStr(udg_FSS, 648, itype) != null then
                    set i = i + 1
                    set MbRow[i] = "|caaaaffaa" + LoadStr(udg_FSS, 648, itype) + "|r"
                    if LoadStr(udg_FSS, 649, itype) != null then
                        set i = i + 1
                        set MbRow[i] = "|caaaaffaa" + LoadStr(udg_FSS, 649, itype) + "|r"
                    endif
                endif
                set i = i + 1
            endif
        else
            set quality = LoadInteger(udg_CItem_Table, itmId, 4)
            set subtype = LoadInteger(udg_CItem_Table, itmId, 3)
            set place = ilv - 100
            set str = GetHeroStr(u, true)
            set agi = GetHeroAgi(u, true)
            set int = GetHeroInt(u, true)
            set strR = LoadInteger(udg_CItem_Table, itmId, 9)
            set agiR = LoadInteger(udg_CItem_Table, itmId, 10)
            set intR = LoadInteger(udg_CItem_Table, itmId, 11)
            set ref = LoadInteger(udg_CItem_Table, itmId, 16)
            set refv = LoadInteger(udg_CItem_Table, itmId, 17)
            set socket = LoadInteger(udg_CItem_Table, itmId, 18)
            set maxsocket = LoadInteger(udg_CItem_Table, itmId, 20)
            set maxdur = R2I(LoadReal(udg_CItem_Table, itmId, 15))
            set dur = R2I(LoadReal(udg_CItem_Table, itmId, 14))
            set iclass = LoadInteger(udg_CItem_Table, itmId, 6)
            if place == 3 then
                set act_id = LoadInteger(udg_CItem_Table, itmId, 25)
            else
                set act_id = 0
            endif
            if place != 10 then
                if place == 11 then
                    set price = LoadInteger(udg_CItem_Table, itmId, 12)
                    set rcost = 0
                else
                    set rcost = R2I(maxdur - dur)
                    set price = R2I(LoadInteger(udg_CItem_Table, itmId, 12) * (dur / maxdur))
                endif
            else
                set price = 1000
                set rcost = 0
            endif
           //set title = (GetItemQuality(quality,place)+GetArmorType(place, subtype)+GetItemName(itm)+"|r |cffaaaaff(Gr. "+I2S(LoadInteger (udg_CItem_Table, itmId, 7))+")|r ")

            set s = ""
            if lvR > 0 then
                if hlv >= lvR then
                    set reqColor1 = noreqColor
                endif
                set MbRow[i] = "|cff999999Requiments:|r           |cffffffaaLevel |r" + reqColor1 + I2S(lvR) + "|r"
                set i = i + 1
                set s = "          "
                set reqColor1 = "|cffff3333"
                if strR > 0 and agiR > 0 then
                    if str >= strR then
                        set reqColor1 = noreqColor
                    endif
                    if agi >= agiR then
                        set reqColor2 = noreqColor
                    endif
                    set s = s + "|cff777777STR:|r " + reqColor1 + I2S(strR) + "|r   |cff777777AGI:|r " + reqColor2 + I2S(agiR) + "|r"
                elseif strR > 0 and intR > 0 then
                    if str >= strR then
                        set reqColor1 = noreqColor
                    endif
                    if int >= intR then
                        set reqColor2 = noreqColor
                    endif
                    set s = s + "|cff777777INT:|r " + reqColor2 + I2S(intR) + "|r   |cff777777STR:|r " + reqColor1 + I2S(strR) + "|r"
                endif
                set s = s + "|r"
                set MbRow[i] = s
                set i = i + 1
                set s = null
            endif
            if iclass > 0 then
                set reqColor1 = "|cffff3333"
                if hclass == 0 or hclass == iclass or (((iclass == 1 and hclass == 2) or (iclass == 3 and hclass == 4)) and ilv < 105 and ilv != 103) then
                    set reqColor1 = noreqColor
                endif
                set s = "        " + reqColor1 + GetClassName(iclass, ilv) + " only |r"
                set MbRow[i] = s
                set i = i + 1
            endif
            if place == 11 then
                set s = "Charm"
            elseif place == 10 then
                set s = "Tome"
            elseif place == 2 then
                set s = "Armor"
            elseif place == 1 then
                set s = "Helmet"
            elseif place == 4 then
                set s = "Boot"
            elseif place == 9 then
                set s = "Wing"
            elseif place == 6 then
                set s = "Ring"
            elseif place == 8 then
                set s = "Amulet"
            elseif place == 5 then
                set s = "Shield"
            elseif place == 3 and subtype < 3 then
                set s = "One-Handed"
            elseif place == 3 and subtype > 2 then
                set s = "Two-Handed"
            endif
            set MbRow[i] = "|cff999999Type:|r           |cffffff77" + s + "|r"
            set i = i + 1
            if place < 10 then
                if ref > 0 then
                    set MbRow[i] = "|cff999999Refine:|r           |cffffff77+" + I2S(ref) + "|r"
                    set i = i + 1
                endif
                if place != 10 and place == 11 then
                    if LoadInteger(udg_CItem_Table, itmId, 67) == 0 then
                        set MbRow[i] = "|cff999999Duratibility:|r           |cffffff77" + I2S(dur) + "/" + I2S(maxdur) + "|r"
                    else
                        set MbRow[i] = "|cff999999Duratibility:|r           |cff7777ff" + I2S(dur) + "/" + I2S(maxdur) + "|r"
                    endif
                    set i = i + 1
                endif
                if maxsocket > 0 then
                    set MbRow[i] = "|cff999999Socket:|r           |cffffff77" + I2S(socket) + "/" + I2S(maxsocket) + "|r"
                    set i = i + 1
                //we list the gems
                    if socket > 0 then
                        set b = 0
                        loop
                            exitwhen b > socket
                            set c = LoadInteger(udg_CItem_Table, itmId, 1000 + b)
                            if c > 0 then
                                set MbRow[i] = "                |cffffff00" + GetObjectName(LoadInteger(udg_CItem_Table, itmId, 1500 + b)) + "|r x |cffffff77" + I2S(c) + "|r"
                                set i = i + 1
                            endif
                            set b = b + 1
                        endloop
                    endif
                endif
            endif
            if LoadInteger(udg_CItem_Table, itmId, 52) > 0 then
                set MbRow[i] = "|cff999999Physical damage:|r           |cffffff77+" + I2S(LoadInteger(udg_CItem_Table, itmId, 52)) + "|r"
                if place == 3 and ref > 0 and subtype < 8 then
                    set MbRow[i] = MbRow[i] + " |cff999900(+" + I2S(refv) + ")|r"
                endif
                set i = i + 1
            elseif place == 3 and subtype < 8 and ref > 0 then
                set MbRow[i] = "|cff999999Physical Damage:|r 0" + " |cff999900(+" + I2S(refv) + ")|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 53) > 0 then
                set MbRow[i] = "|cff999999Magic damage:|r           |cffffff77+" + I2S(LoadInteger(udg_CItem_Table, itmId, 53)) + "|r"
                if place == 3 and ref > 0 and subtype > 7 then
                    set MbRow[i] = MbRow[i] + " |cff999900(+" + I2S(refv) + ")|r"
                endif
                set i = i + 1
            elseif place == 3 and subtype > 7 and ref > 0 then
                set MbRow[i] = "|cff999999Magic damage:|r 0" + " |cff999900(+" + I2S(refv) + ")|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 26) > 0 then
                set MbRow[i] = "|cff999999HP:|r;|cffffff77+" + I2S(LoadInteger(udg_CItem_Table, itmId, 26)) + "|r"
                if (place == 1 or place == 2 or place == 4) and ref > 0 then
                    set MbRow[i] = MbRow[i] + " |cff999900(+" + I2S(refv) + ")|r"
                endif
                set i = i + 1
            elseif (place == 1 or place == 2 or place == 4) and ref > 0 then
                set MbRow[i] = "|cff999999HP:|r;" + " |cff999900(+" + I2S(refv) + ")|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 30) > 0 then
                set MbRow[i] = "|cff999999MP:|r;|cffffff77+" + I2S(LoadInteger(udg_CItem_Table, itmId, 30)) + "|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 56) > 0 then
                set MbRow[i] = "|cff999999Pet Power:|r;|cffffff77+" + I2S(LoadInteger(udg_CItem_Table, itmId, 56)) + " %% |r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 34) > 0 then
                set MbRow[i] = "|cff999999Physical Defence:|r;|cffffff77+" + I2S(LoadInteger(udg_CItem_Table, itmId, 34)) + "|r"
                if (place == 5 or place == 8) and ref > 0 then
                    set MbRow[i] = MbRow[i] + " |cff999900(+" + I2S(refv) + ")|r"
                endif
                set i = i + 1
            elseif (place == 5 or place == 8) and ref > 0 then
                set MbRow[i] = "|cff999999Physical Defence:|r;" + "|cff999900(+" + I2S(refv) + ")|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 35) > 0 then
                set MbRow[i] = "|cff999999Fire Ressist:|r;|cffffff77+" + I2S(LoadInteger(udg_CItem_Table, itmId, 35)) + "|r"
                if (place == 6 or place == 7) and ref > 0 then
                    set MbRow[i] = MbRow[i] + " |cff999900(+" + I2S(refv) + ")|r"
                endif
                set i = i + 1
            elseif (place == 6 or place == 7) and ref > 0 then
                set MbRow[i] = "|cff999999Fire Ressist:|r;" + "|cff999900(+" + I2S(refv) + ")|r"
                set i = i + 1
            endif

            if LoadInteger(udg_CItem_Table, itmId, 36) > 0 then
                set MbRow[i] = "|cff999999Water Ressist:|r;|cffffff77+" + I2S(LoadInteger(udg_CItem_Table, itmId, 36)) + "|r"
                if (place == 6 or place == 7) and ref > 0 then
                    set MbRow[i] = MbRow[i] + " |cff999900(+" + I2S(refv) + ")|r"
                endif
                set i = i + 1
            elseif (place == 6 or place == 7) and ref > 0 then
                set MbRow[i] = "|cff999999Water Ressist:|r;" + "|cff999900(+" + I2S(refv) + ")|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 37) > 0 then
                set MbRow[i] = "|cff999999Lightning Ressist:|r;|cffffff77+" + I2S(LoadInteger(udg_CItem_Table, itmId, 37)) + "|r"
                if (place == 6 or place == 7) and ref > 0 then
                    set MbRow[i] = MbRow[i] + " |cff999900(+" + I2S(refv) + ")|r"
                endif
                set i = i + 1
            elseif (place == 6 or place == 7) and ref > 0 then
                set MbRow[i] = "|cff999999Lightning Ressist:|r;" + "|cff999900(+" + I2S(refv) + ")|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 38) > 0 then
                set MbRow[i] = "|cff999999Poison Ressist:|r;|cffffff77+" + I2S(LoadInteger(udg_CItem_Table, itmId, 38)) + "|r"
                if (place == 6 or place == 7) and ref > 0 then
                    set MbRow[i] = MbRow[i] + " |cff999900(+" + I2S(refv) + ")|r"
                endif
                set i = i + 1
            elseif (place == 6 or place == 7) and ref > 0 then
                set MbRow[i] = "|cff999999Poison Ressist:|r;" + "|cff999900(+" + I2S(refv) + ")|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 39) > 0 then
                set MbRow[i] = "|cff999999Earth Ressist:|r;|cffffff77+" + I2S(LoadInteger(udg_CItem_Table, itmId, 39)) + "|r"
                if (place == 6 or place == 7) and ref > 0 then
                    set MbRow[i] = MbRow[i] + " |cff999900(+" + I2S(refv) + ")|r"
                endif
                set i = i + 1
            elseif (place == 6 or place == 7) and ref > 0 then
                set MbRow[i] = "|cff999999Earth Ressist:|r;" + "|cff999900(+" + I2S(refv) + ")|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 43) > 0 then
                set MbRow[i] = "|cff999999Block Damage Chance:|r;|cffffff77+" + I2S(LoadInteger(udg_CItem_Table, itmId, 43)) + " %% |r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 54) > 0 then
                set MbRow[i] = "|cff999999Critical Strike:|r;|cffffff77+" + I2S(LoadInteger(udg_CItem_Table, itmId, 54)) + " %% |r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 41) > 0 then
                set MbRow[i] = "|cff999999Accurancy:|r;|cffffff77+" + I2S(LoadInteger(udg_CItem_Table, itmId, 41)) + "|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 42) > 0 then
                set MbRow[i] = "|cff999999Evasion:|r;|cffffff77+" + I2S(LoadInteger(udg_CItem_Table, itmId, 42)) + "|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 50) > 0 then
                set MbRow[i] = "|cff999999Attack Level:|r;|cffffff77+" + I2S(LoadInteger(udg_CItem_Table, itmId, 50)) + "|r"
                if place == 9 and ref > 0 then
                    set MbRow[i] = MbRow[i] + " |cff999900(+" + I2S(refv) + ")|r"
                endif
                set i = i + 1
            elseif place == 9 and ref > 0 then
                set MbRow[i] = "|cff999999Attack Level:|r;" + " |cff999900(+" + I2S(refv) + ")|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 51) > 0 then
                set MbRow[i] = "|cff999999Defence Level:|r;|cffffff77+" + I2S(LoadInteger(udg_CItem_Table, itmId, 51)) + "|r"
                if place == 9 and ref > 0 then
                    set MbRow[i] = MbRow[i] + " |cff999900(+" + I2S(refv) + ")|r"
                endif
                set i = i + 1
            elseif place == 9 and ref > 0 then
                set MbRow[i] = "|cff999999Defence Level:|r;" + " |cff999900(+" + I2S(refv) + ")|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 40) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 40)) + "|r |cff9999ffMovement Speed|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 47) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 47)) + " %%|r |cff9999ffAttack Speed|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 27) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 27)) + " |cff9999ffHP Regen|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 31) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 31)) + " |cff9999ffMP Regen|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 28) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 28)) + " %% |r|cff9999ffLife Steal|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 29) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 29)) + "|r |cff9999ffLife per kill|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 32) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 32)) + " %% |r|cff9999ffMana Steal|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 33) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 33)) + " |r|cff9999ffMana per kill|r"
                set i = i + 1
            endif

            if LoadInteger(udg_CItem_Table, itmId, 22) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 22)) + " %% |r|cff9999ffExperience|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 23) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 23)) + " %% |r|cff9999ffRare drop|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 24) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 24)) + " %% |r|cff9999ffGold Drop|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 44) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 44)) + "|r |cff9999ffStrength|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 45) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 45)) + "|r |cff9999ffAgility|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 46) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 46)) + "|r |cff9999ffIntelligence|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 48) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 48)) + " %% |r|cff9999ffReflect|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 55) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 55)) + " %% |r|cff9999ffCritical Strike Dmg|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 49) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 49)) + " %% |r|cff9999ffArmor penetration|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 57) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 57)) + " |r|cff9999ffFire Damage|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 58) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 58)) + " |r|cff9999ffWater Damage|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 59) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 59)) + " |r|cff9999ffLightning Damage|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 60) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 60)) + " |r|cff9999ffPoison Damage|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 61) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 61)) + " |r|cff9999ffEarth Damage Addon|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 62) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 62)) + "|r |cff9999ffPhysical Attack|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 63) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 63)) + "|r |cff9999ffMagical Attack|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 64) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 64)) + "|r |cff9999ffLife|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 65) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 65)) + "|r |cff9999ffMana|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 66) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 66)) + "%%|r |cff9999ffCritical strike|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 67) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 67)) + "|r |cff9999ffDuratibility|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 68) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 68)) + "|r |cff9999ffSocket|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 69) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 69)) + "|r |cff9999ffAttack Level|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 70) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 70)) + "|r |cff9999ffDefence Level|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 71) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 71)) + "%%|r |cff9999ffBlock chance|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 72) != 0 then
                set MbRow[i] = "     |cffffff99" + I2S(LoadInteger(udg_CItem_Table, itmId, 72)) + "|r |cff9999ffLevel requiment|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 73) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 73)) + "|r |cff9999ffAccurancy|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 74) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 74)) + "|r |cff9999ffEvasion|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 75) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 75)) + "|r |cff9999ffPhysical Defence|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 76) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 76)) + "|r |cff9999ffFire Ressist|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 77) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 77)) + "|r |cff9999ffWater Ressist|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 78) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 78)) + "|r |cff9999ffLightning Ressist|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 79) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 79)) + "|r |cff9999ffPoison Ressist|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 80) > 0 then
                set MbRow[i] = "     |cffffff99+" + I2S(LoadInteger(udg_CItem_Table, itmId, 80)) + "|r |cff9999ffEarth Ressist|r"
                set i = i + 1
            endif
            if LoadInteger(udg_CItem_Table, itmId, 81) > 0 then
                set MbRow[i] = "     |cffffff99-" + I2S(LoadInteger(udg_CItem_Table, itmId, 81)) + " %% |r|cff9999ffShop Price|r"
                set i = i + 1
            endif
            if act_id > 0 then
                if act_id == 1 then
                    set MbRow[i] = "|cffff3333Sacrificial Assault:|r |cffeeffddMinor chance|r"
                    set i = i + 1
                    set MbRow[i] = "|cffeeffdd for double damage|r"
                    set i = i + 1
                    set MbRow[i] = "|cffeeffdd but cost 5%% Max HP.|r"
                elseif act_id == 2 then
                    set MbRow[i] = "|cffff3333Bless:|r |cffeeffddMinor chance for|r"
                    set i = i + 1
                    set MbRow[i] = "|cffeeffdd recover back 10%% Max HP|r"
                    set i = i + 1
                    set MbRow[i] = "|cffeeffdd is last 20 second.|r"
                elseif act_id == 3 then
                    set MbRow[i] = "|cffff3333Bleed:|r |cffeeffddMinor chance for|r"
                    set i = i + 1
                    set MbRow[i] = "|cffeeffdd make target bleed|r"
                    set i = i + 1
                    set MbRow[i] = "|cffeeffdd is last 20 second.|r"
                elseif act_id == 4 then
                    set MbRow[i] = "|cffff3333Rage:|r |cffeeffddMinor chance for|r"
                    set i = i + 1
                    set MbRow[i] = "|cffeeffdd increase the dealed and|r"
                    set i = i + 1
                    set MbRow[i] = "|cffeeffdd taked damage, 5 second.|r"
                elseif act_id == 5 then
                    set MbRow[i] = "|cffff3333Streaming:|r |cffeeffddMinor chance for|r"
                    set i = i + 1
                    set MbRow[i] = "|cffeeffdd increase life & mana steal|r"
                    set i = i + 1
                    set MbRow[i] = "|cffeeffdd by 13%%, is last 6 second.|r"
                elseif act_id == 6 then
                    set MbRow[i] = "|cffff3333Amplify:|r |cffeeffddMinor chance for|r"
                    set i = i + 1
                    set MbRow[i] = "|cffeeffdd increase every damage on|r"
                    set i = i + 1
                    set MbRow[i] = "|cffeeffdd target by 15%%|r"
                    set i = i + 1
                    set MbRow[i] = "|cffeeffdd is last 5 second.|r"
                elseif act_id == 7 then
                    set MbRow[i] = "|cffff3333Thorn:|r |cffeeffddMinor chance for|r"
                    set i = i + 1
                    set MbRow[i] = "|cffeeffdd reflect back every|r"
                    set i = i + 1
                    set MbRow[i] = "|cffeeffdd damage, 4 second.|r"
                elseif act_id == 8 then
                    set MbRow[i] = "|cffff3333Protection:|r |cffeeffddMinor chance for|r"
                    set i = i + 1
                    set MbRow[i] = "|cffeeffdd increase defences by 60%%|r"
                    set i = i + 1
                    set MbRow[i] = "|cffeeffdd in last 20 second.|r"
                elseif act_id == 9 then
                    set MbRow[i] = "|cffff3333Eagle-Eye:|r |cffeeffddMinor chance for|r"
                    set i = i + 1
                    set MbRow[i] = "|cffeeffdd increase critical strike|r"
                    set i = i + 1
                    set MbRow[i] = "|cffeeffdd damage by 50%%|r"
                    set i = i + 1
                    set MbRow[i] = "|cffeeffdd is last 5 second.|r"
                endif
                set i = i + 1
            endif

            if LoadStr(udg_CItem_Table, itmId, 21) != null and LoadStr(udg_CItem_Table, itmId, 21) != "" then
                set MbRow[i] = "|cff7777ffCrafter:|r |cffffff77" + LoadStr(udg_CItem_Table, itmId, 21) + " |r"
                set i = i + 1
            endif
            if slot > 0 and cv2 == cv then
                if LoadInteger(udg_Stat_Table, 18000 + cv, - slot) > 0 then
                    set MbRow[i] = "|cff999900Set Bonus 1:|r  |cffffff99+" + I2S(LoadInteger(udg_Stat_Table, 18000 + cv, - slot)) + " Defence Lv |r"
                    set i = i + 1
                endif
                if LoadInteger(udg_Stat_Table, 18000 + cv, slot) > 0 then
                    set MbRow[i] = "|cff999900Set Bonus 2:|r  |cffffff99+" + I2S(LoadInteger(udg_Stat_Table, 18000 + cv, slot)) + " Defence Lv |r"
                    set i = i + 1
                endif
            endif
 
            if udg_Camera_Lock[pl] == 1 then
                if rcost > 0 then
                    set i = i + 1
                    set MbRow[i] = "|cffffff33Repair Cost:|r |cffffff88" + I2S(rcost) + " Gold|r"
                    set i = i + 1
                else
                    if udg_Camera_Lock[pl] == 2 or rcost == 0 then
                        set i = i + 1
                        set MbRow[i] = "|cffffff33Price:|r |cffffff88" + I2S(price / 2) + " Gold|r"
                        set i = i + 1
                    endif
                endif
            elseif udg_Camera_Lock[pl] == 2 or udg_Camera_Lock[pl] == 3 then
                set i = i + 1
                set MbRow[i] = "|cffffff33Price:|r |cffffff88" + I2S(price / 2) + " Gold|r"
                set i = i + 1
            endif
        endif
    else
        set title = GetItemName(itm)
        set s = ""
        set price = LoadInteger(udg_FSS, 602, GetItemTypeId(itm))
        if charge > 0 and (ilv < 1902 or ilv > 1905) then
            set s = "|cffffff00 x " + I2S(charge) + "|r"
            set price = price * charge
        elseif ilv > 1901 and ilv < 1906 then

            if lvR > 0 then
                if hlv >= lvR then
                    set reqColor1 = noreqColor
                endif
                set MbRow[i] = "|cff999999Requiments:|r           |cffffffaaLevel |r" + reqColor1 + I2S(lvR) + "|r"
                set i = i + 1
            endif

            set i = i + 1
            if ilv == 1902 then
                set MbRow[i] = "|cffaaaaffRestore " + I2S(LoadInteger(udg_CItem_Table, itmId, 26)) + " hit point|r"
            elseif ilv == 1903 then
                set MbRow[i] = "|cffaaaaffRestore " + I2S(LoadInteger(udg_CItem_Table, itmId, 30)) + " mana point|r"
            elseif ilv == 1904 then
                set MbRow[i] = "|cffaaaaffRegenerate " + I2S(LoadInteger(udg_CItem_Table, itmId, 26)) + " hit point|r"
                set i = i + 1
                set MbRow[i] = "|cffaaaaffin last 30 second.|r"
            elseif ilv == 1905 then
                set MbRow[i] = "|cffaaaaffRegenerate " + I2S(LoadInteger(udg_CItem_Table, itmId, 30)) + " mana point|r"
                set i = i + 1
                set MbRow[i] = "|cffaaaaffin last 30 second.|r"
            endif

            set price = LoadInteger(udg_CItem_Table, itmId, 12)
            set rcost = 0
            set i = i + 1
        endif
        set title = StringColoring(GetItemName(itm), 100, 100, 255, 255, 255, 255) + s
        if charge > 0 then
            if itype != 0 then
                if LoadStr(udg_FSS, 647, itype) != null then
                    set i = i + 1
                    set MbRow[i] = "|cffaaaaaa" + LoadStr(udg_FSS, 647, itype) + "|r"
                    if LoadStr(udg_FSS, 648, itype) != null then
                        set i = i + 1
                        set MbRow[i] = "|cffaaaaaa" + LoadStr(udg_FSS, 648, itype) + "|r"
                        if LoadStr(udg_FSS, 649, itype) != null then
                            set i = i + 1
                            set MbRow[i] = "|cffaaaaaa" + LoadStr(udg_FSS, 649, itype) + "|r"
                        endif
                    endif
                    set i = i + 1
                endif
            endif
            if udg_Camera_Lock[pl] == 2 then
                set i = i + 1
                set MbRow[i] = "|cffffff33Price:|r |cffffff88" + I2S(price / 2) + " Gold|r"
                set i = i + 1
            endif
        endif
    endif

    if udg_Mb_Table[viewer] != null then
        call DestroyMultiboard(udg_Mb_Table[viewer])
    endif
    set RowCount = i
    if RowCount > 0 then
        call MultiboardClear(udg_Mb_Table[viewer])
        call DestroyMultiboard(udg_Mb_Table[viewer])
        set udg_Mb_Table[viewer] = CreateMultiboard()
        set udg_Mb_Type[viewer] = 1
        call MultiboardSetRowCount(udg_Mb_Table[viewer], RowCount)
        call MultiboardSetColumnCount(udg_Mb_Table[viewer], 1)
        call MultiboardSetTitleText(udg_Mb_Table[viewer], title)
        call MultiboardSetTitleTextColor(udg_Mb_Table[viewer], 255, 200, 200, 255)
        set i = 0
        loop
            exitwhen i > RowCount
            set mbitem = MultiboardGetItem(udg_Mb_Table[viewer], i, 0)
            call MultiboardSetItemWidth(mbitem, 16 / 100.0)
            call MultiboardSetItemStyle(mbitem, true, false)
            set b = GetStringPos (MbRow[i], ";")
            if b > 0 then
                set s = SubString(MbRow[i], 0, b)
                call MultiboardSetItemValue(mbitem, s + AddSpace (" ", 35 - StringLength(s)) + SubString(MbRow[i], b + 1, 0))
            else
                call MultiboardSetItemValue(mbitem, MbRow[i])
            endif
            call MultiboardReleaseItem(mbitem)
            set MbRow[i] = null
            set i = i + 1
        endloop

        call MultiboardDisplay(udg_Mb_Table[viewer], false)

        if ( GetLocalPlayer() == Player(viewer - 1) ) then
            call MultiboardDisplay(udg_Mb_Table[viewer], true)
            call MultiboardMinimize(udg_Mb_Table[viewer], false)
        endif
    endif
    set u = null
endfunction

function Mb_ToolTip takes integer viewer, integer pl, integer slot returns nothing
    local integer ilv
    local item itm
    local string s
    local string title
    local integer cv = udg_Inv_Unit[pl]

    if slot < 200 then
        set ilv = LoadInteger(udg_Stat_Table, cv, - slot)
        set itm = LoadItemHandle(udg_Stat_Table, cv, slot)
    else
        if udg_Camera_Lock[viewer] == 1 then
            set itm = UnitItemInSlot(udg_UDexUnits[udg_Inv_Unit[pl]], slot - 200)
            set ilv = GetItemLevel(itm)
        elseif slot > 2200 and slot < 2225 then
            set itm = LoadItemHandle(udg_CItem_Table, udg_Inv_Bag[pl], slot - 2200)
            if itm != null then
                set ilv = - 1
            endif
        endif
    endif
     
    if ilv == - 1 then
        call Mb_Item_ToolTip (itm, cv, 0, 0)
    elseif ilv > 0 then
        call Mb_Item_ToolTip (itm, cv, cv, slot)
    elseif (slot >= 300 and slot < 350) or (slot >= 1300 and slot < 1302) then
        set s = ""
        if slot == 300 then
            set s = "            Drop"
        elseif slot == 301 then
            set s = "           Repair"
        elseif slot == 302 then
            set s = "          Repair All"
        elseif slot == 303 then
            set s = "           Close "
        elseif slot == 307 then
            set s = "           Restat "
        elseif slot == 306 then
            set s = "           +1 Str "
        elseif slot == 305 then
            set s = "           +1 Agi "
        elseif slot == 304 then
            set s = "           +1 Int "
        elseif slot == 1300 then
            if udg_Trader[pl] > 0 then
                if LoadInteger(udg_FSS, 1275 + pl, 1) == 0 then
                    set s = "          Locked "
                else
                    set s = "         Unlocked "
                endif
            endif
        elseif slot == 1301 then
            if udg_Trader[pl] > 0 then
                set s = "            Trade "
            endif
        endif
        call MultiboardClear(udg_Mb_Table[viewer])
        call DestroyMultiboard(udg_Mb_Table[viewer])
        if s != "" then
            set udg_Mb_Table[viewer] = CreateMultiboard()
            set udg_Mb_Type[viewer] = 1
            call MultiboardSetRowCount(udg_Mb_Table[viewer], 0)
            call MultiboardSetColumnCount(udg_Mb_Table[viewer], 0)
            call MultiboardSetTitleText(udg_Mb_Table[viewer], "|cffffff00 " + s + " |r")
            call MultiboardSetTitleTextColor(udg_Mb_Table[viewer], 255, 200, 200, 255)
            call MultiboardDisplay(udg_Mb_Table[viewer], false)

            if ( GetLocalPlayer() == Player(viewer - 1) ) then
                call MultiboardDisplay(udg_Mb_Table[viewer], true)
                call MultiboardMinimize(udg_Mb_Table[viewer], true)
            endif
        endif
    else
        call DestroyMultiboard(udg_Mb_Table[viewer])
        set udg_Mb_Type[viewer] = 0
    endif
    set s = null
    set itm = null
    set title = null
endfunction

//-------------------------------------------------------------------------
//                              EQUIPING FUNCTIONS
//-------------------------------------------------------------------------


function EquipAItem takes integer cv, item itm, boolean equip returns nothing
    local integer pl = GetPlayerId(GetOwningPlayer(udg_UDexUnits[cv])) + 1
    local unit u = udg_UDexUnits[cv]
    local integer i = 1
    local integer ii = 0
    local integer id = GetHandleId(itm)
    local integer ilv = GetItemLevel(itm)
    local integer array ids
    local integer g1
    local integer g2
    local integer g3
    local integer q1
    local integer q2
    local integer q3
    local integer sl = ilv - 100
    local integer s1
    local integer s2
    local integer s3
    local integer q
    local integer SB1
    local integer SB2
    local integer x = 1
    local integer hp = 0
    local integer mp = 0
    local integer amount = 0
    local integer reflv = LoadInteger(udg_CItem_Table, id, 16 )
    local integer refv = LoadInteger(udg_CItem_Table, id, 17 )
    local integer socket = LoadInteger(udg_CItem_Table, id, 18 )

    if ilv == 103 then
        if equip then
            set udg_Global_Act_Id[cv] = LoadInteger(udg_CItem_Table, id, 25 )
        else
            set udg_Global_Act_Id[cv] = 0
        endif
    endif
    if equip then
        if sl == 1 or sl == 2 or sl == 4 then
            if LoadInteger(udg_Stat_Table, cv, - 1 ) > 0 then
                set ids[1] = GetHandleId(LoadItemHandle(udg_Stat_Table, cv, 1 ))
            else
                set ids[1] = 0
            endif
            if LoadInteger(udg_Stat_Table, cv, - 2 ) > 0 then
                set ids[2] = GetHandleId(LoadItemHandle(udg_Stat_Table, cv, 2 ))
            else
                set ids[2] = 0
            endif
            if LoadInteger(udg_Stat_Table, cv, - 4 ) > 0 then
                set ids[3] = GetHandleId(LoadItemHandle(udg_Stat_Table, cv, 4 ))
            else
                set ids[3] = 0
            endif

            if sl == 4 then
                set q = LoadInteger(udg_CItem_Table, ids[3], 4 )
            else
                set q = LoadInteger(udg_CItem_Table, ids[sl], 4 )
            endif

            set SB1 = R2I(q * 1) + 1
            set SB2 = R2I(q * 1.5) + 2

            if ids[1] > 0 and ids[2] > 0 and ids[3] > 0 then
                set s1 = LoadInteger(udg_CItem_Table, ids[1], 3 )
                set q1 = LoadInteger(udg_CItem_Table, ids[1], 4 )
                set g1 = LoadInteger(udg_CItem_Table, ids[1], 7 )

                set s2 = LoadInteger(udg_CItem_Table, ids[2], 3 )
                set q2 = LoadInteger(udg_CItem_Table, ids[2], 4 )
                set g2 = LoadInteger(udg_CItem_Table, ids[2], 7 )

                set s3 = LoadInteger(udg_CItem_Table, ids[3], 3 )
                set q3 = LoadInteger(udg_CItem_Table, ids[3], 4 )
                set g3 = LoadInteger(udg_CItem_Table, ids[3], 7 )

                if s1 == s2 and s2 == s3 and q1 == q2 and q2 == q3 and g1 == g2 and g2 == g3 then
                    if LoadInteger(udg_Stat_Table, 18000 + cv, 1 ) == 0 then
                        call SaveInteger(udg_Stat_Table, 18000 + cv, 1, SB2 )
                        set udg_Stat_DefLv[cv] = udg_Stat_DefLv[cv] + SB2
                    endif
                    if LoadInteger(udg_Stat_Table, 18000 + cv, 2 ) == 0 then
                        call SaveInteger(udg_Stat_Table, 18000 + cv, 2, SB2 )
                        set udg_Stat_DefLv[cv] = udg_Stat_DefLv[cv] + SB2
                    endif
                    if LoadInteger(udg_Stat_Table, 18000 + cv, 4 ) == 0 then
                        call SaveInteger(udg_Stat_Table, 18000 + cv, 4, SB2 )
                        set udg_Stat_DefLv[cv] = udg_Stat_DefLv[cv] + SB2
                    endif
                endif
            endif
            if ids[1] > 0 and ids[2] > 0 then
                set s1 = LoadInteger(udg_CItem_Table, ids[1], 3 )
                set q1 = LoadInteger(udg_CItem_Table, ids[1], 4 )
                set g1 = LoadInteger(udg_CItem_Table, ids[1], 7 )
                set s2 = LoadInteger(udg_CItem_Table, ids[2], 3 )
                set q2 = LoadInteger(udg_CItem_Table, ids[2], 4 )
                set g2 = LoadInteger(udg_CItem_Table, ids[2], 7 )
                if s1 == s2 and q1 == q2 and g1 == g2 then
                    if LoadInteger(udg_Stat_Table, 18000 + cv, - 1 ) == 0 then
                        call SaveInteger(udg_Stat_Table, 18000 + cv, - 1, SB1 )
                        set udg_Stat_DefLv[cv] = udg_Stat_DefLv[cv] + SB1
                    endif
                    if LoadInteger(udg_Stat_Table, 18000 + cv, - 2 ) == 0 then
                        call SaveInteger(udg_Stat_Table, 18000 + cv, - 2, SB1 )
                        set udg_Stat_DefLv[cv] = udg_Stat_DefLv[cv] + SB1
                    endif
                endif
            endif
            if ids[2] > 0 and ids[3] > 0 then
                set s1 = LoadInteger(udg_CItem_Table, ids[2], 3 )
                set q1 = LoadInteger(udg_CItem_Table, ids[2], 4 )
                set g1 = LoadInteger(udg_CItem_Table, ids[2], 7 )

                set s2 = LoadInteger(udg_CItem_Table, ids[3], 3 )
                set q2 = LoadInteger(udg_CItem_Table, ids[3], 4 )
                set g2 = LoadInteger(udg_CItem_Table, ids[3], 7 )
                if s1 == s2 and q1 == q2 and g1 == g2 then
                    if LoadInteger(udg_Stat_Table, 18000 + cv, - 2 ) == 0 then
                        call SaveInteger(udg_Stat_Table, 18000 + cv, - 2, SB1 )
                        set udg_Stat_DefLv[cv] = udg_Stat_DefLv[cv] + SB1
                    endif
                    if LoadInteger(udg_Stat_Table, 18000 + cv, - 4 ) == 0 then
                        call SaveInteger(udg_Stat_Table, 18000 + cv, - 4, SB1 )
                        set udg_Stat_DefLv[cv] = udg_Stat_DefLv[cv] + SB1
                    endif
                endif
            endif
            if ids[1] > 0 and ids[3] > 0 then
                set s1 = LoadInteger(udg_CItem_Table, ids[1], 3 )
                set q1 = LoadInteger(udg_CItem_Table, ids[1], 4 )
                set g1 = LoadInteger(udg_CItem_Table, ids[1], 7 )

                set s2 = LoadInteger(udg_CItem_Table, ids[3], 3 )
                set q2 = LoadInteger(udg_CItem_Table, ids[3], 4 )
                set g2 = LoadInteger(udg_CItem_Table, ids[3], 7 )
                if s1 == s2 and q1 == q2 and g1 == g2 then
                    if LoadInteger(udg_Stat_Table, 18000 + cv, - 1 ) == 0 then
                        call SaveInteger(udg_Stat_Table, 18000 + cv, - 1, SB1 )
                        set udg_Stat_DefLv[cv] = udg_Stat_DefLv[cv] + SB1
                    endif
                    if LoadInteger(udg_Stat_Table, 18000 + cv, - 4 ) == 0 then
                        call SaveInteger(udg_Stat_Table, 18000 + cv, - 4, SB1 )
                        set udg_Stat_DefLv[cv] = udg_Stat_DefLv[cv] + SB1
                    endif
                endif
            endif
        endif
    else
        if sl == 1 or sl == 2 or sl == 4 then
            set ids[1] = GetHandleId(LoadItemHandle(udg_Stat_Table, cv, 1 ))
            set ids[2] = GetHandleId(LoadItemHandle(udg_Stat_Table, cv, 2 ))
            set ids[3] = GetHandleId(LoadItemHandle(udg_Stat_Table, cv, 4 ))
            if ids[1] > 0 and ids[2] > 0 and ids[3] > 0 then
                set udg_Stat_DefLv[cv] = udg_Stat_DefLv[cv] - LoadInteger(udg_Stat_Table, 18000 + cv, 1 )
                set udg_Stat_DefLv[cv] = udg_Stat_DefLv[cv] - LoadInteger(udg_Stat_Table, 18000 + cv, 2 )
                set udg_Stat_DefLv[cv] = udg_Stat_DefLv[cv] - LoadInteger(udg_Stat_Table, 18000 + cv, 4 )
                call SaveInteger(udg_Stat_Table, 18000 + cv, 1, 0 )
                call SaveInteger(udg_Stat_Table, 18000 + cv, 2, 0 )
                call SaveInteger(udg_Stat_Table, 18000 + cv, 4, 0 )
            endif
            if ids[1] > 0 and ids[2] > 0 then
                set udg_Stat_DefLv[cv] = udg_Stat_DefLv[cv] - LoadInteger(udg_Stat_Table, 18000 + cv, - 1 )
                set udg_Stat_DefLv[cv] = udg_Stat_DefLv[cv] - LoadInteger(udg_Stat_Table, 18000 + cv, - 2 )
                call SaveInteger(udg_Stat_Table, 18000 + cv, - 1, 0 )
                call SaveInteger(udg_Stat_Table, 18000 + cv, - 2, 0 )
            elseif ids[2] > 0 and ids[3] > 0 then
                set udg_Stat_DefLv[cv] = udg_Stat_DefLv[cv] - LoadInteger(udg_Stat_Table, 18000 + cv, - 2 )
                set udg_Stat_DefLv[cv] = udg_Stat_DefLv[cv] - LoadInteger(udg_Stat_Table, 18000 + cv, - 4 )
                call SaveInteger(udg_Stat_Table, 18000 + cv, - 2, 0 )
                call SaveInteger(udg_Stat_Table, 18000 + cv, - 4, 0 )
            elseif ids[1] > 0 and ids[3] > 0 then
                set udg_Stat_DefLv[cv] = udg_Stat_DefLv[cv] - LoadInteger(udg_Stat_Table, 18000 + cv, - 1 )
                set udg_Stat_DefLv[cv] = udg_Stat_DefLv[cv] - LoadInteger(udg_Stat_Table, 18000 + cv, - 4 )
                call SaveInteger(udg_Stat_Table, 18000 + cv, - 1, 0 )
                call SaveInteger(udg_Stat_Table, 18000 + cv, - 4, 0 )
            endif
        endif
        set x = - 1
    endif


    if socket > 0 and (sl < 5 or sl == 9 ) then
        set i = 0
        loop
            exitwhen i > socket - 1
            set amount = LoadInteger(udg_CItem_Table, id, 1000 + i)
            set ii = LoadInteger(udg_CItem_Table, id, 1500 + i)
            if amount > 0 then
                set amount = amount * x
                if sl == 1 or sl == 2 or sl == 4 then
                    if ii == 'I001' then
                        set hp = hp + 25 * amount
                    elseif ii == 'I002' then
                        set hp = hp + 50 * amount
                    elseif ii == 'I003' then
                        set hp = hp + 75 * amount
                    elseif ii == 'I004' then
                        set hp = hp + 100 * amount
                    elseif ii == 'I005' then
                        set hp = hp + 125 * amount
                    elseif ii == 'I006' then
                        set hp = hp + 175 * amount
                    endif
                elseif sl == 3 then
                    if ii == 'I001' then
                        set udg_Stat_AttackLv[cv] = udg_Stat_AttackLv[cv] + 1 * amount
                    elseif ii == 'I002' then
                        set udg_Stat_AttackLv[cv] = udg_Stat_AttackLv[cv] + 2 * amount
                    elseif ii == 'I003' then
                        set udg_Stat_AttackLv[cv] = udg_Stat_AttackLv[cv] + 3 * amount
                    elseif ii == 'I004' then
                        set udg_Stat_AttackLv[cv] = udg_Stat_AttackLv[cv] + 4 * amount
                    elseif ii == 'I005' then
                        set udg_Stat_AttackLv[cv] = udg_Stat_AttackLv[cv] + 5 * amount
                    elseif ii == 'I006' then
                        set udg_Stat_AttackLv[cv] = udg_Stat_AttackLv[cv] + 7 * amount
                    endif
                elseif sl == 9 then
                    if ii == 'I001' then
                        set udg_Stat_HpRegen[cv] = udg_Stat_HpRegen[cv] + 2 * amount
                    elseif ii == 'I002' then
                        set udg_Stat_HpRegen[cv] = udg_Stat_HpRegen[cv] + 4 * amount
                    elseif ii == 'I003' then
                        set udg_Stat_HpRegen[cv] = udg_Stat_HpRegen[cv] + 6 * amount
                    elseif ii == 'I004' then
                        set udg_Stat_HpRegen[cv] = udg_Stat_HpRegen[cv] + 8 * amount
                    elseif ii == 'I005' then
                        set udg_Stat_HpRegen[cv] = udg_Stat_HpRegen[cv] + 10 * amount
                    elseif ii == 'I006' then
                        set udg_Stat_HpRegen[cv] = udg_Stat_HpRegen[cv] + 15 * amount
                    endif
                endif
            endif
            set i = i + 1
        endloop
    endif
        
    if reflv > 0 then
        if ( refv > 0 ) then
            if sl == 3 then
                if ( ilv >= 1000 ) then
                    set udg_Stat_SpellPower[cv] = udg_Stat_SpellPower[cv] + refv * x
                else
                    set udg_Stat_Dmg[cv] = udg_Stat_Dmg[cv] + refv * x
                endif
            else
                if sl == 6 or sl == 7 then
                    set udg_Stat_Mdef1[cv] = udg_Stat_Mdef1[cv] + refv * x
                    set udg_Stat_Mdef2[cv] = udg_Stat_Mdef2[cv] + refv * x
                    set udg_Stat_Mdef3[cv] = udg_Stat_Mdef3[cv] + refv * x
                    set udg_Stat_Mdef4[cv] = udg_Stat_Mdef4[cv] + refv * x
                    set udg_Stat_Mdef5[cv] = udg_Stat_Mdef5[cv] + refv * x
                elseif sl == 8 then
                    set udg_Stat_Pdef[cv] = udg_Stat_Pdef[cv] + refv * x
                elseif sl == 9 then
                    set udg_Stat_AttackLv[cv] = udg_Stat_AttackLv[cv] + refv * x
                    set udg_Stat_DefLv[cv] = udg_Stat_DefLv[cv] + refv * x
                elseif sl == 5 then
                    set udg_Stat_Pdef[cv] = udg_Stat_Pdef[cv] + refv * x
                elseif sl == 1 or sl == 2 or sl == 4 then
                    set hp = hp + refv * x
                endif
            endif
        endif
    endif

    set udg_Stat_SpellPower[cv] = udg_Stat_SpellPower[cv] + (LoadInteger(udg_CItem_Table, id, 53) + LoadInteger(udg_CItem_Table, id, 63)) * x
    set udg_Stat_AttackLv[cv] = udg_Stat_AttackLv[cv] + (LoadInteger(udg_CItem_Table, id, 50) + LoadInteger(udg_CItem_Table, id, 69)) * x
    set udg_Stat_AttackSpeed[cv] = udg_Stat_AttackSpeed[cv] + LoadInteger(udg_CItem_Table, id, 47) * x
    set udg_Stat_Reflect[cv] = udg_Stat_Reflect[cv] + LoadInteger(udg_CItem_Table, id, 48) * x
    set udg_Stat_BlockDmg[cv] = udg_Stat_BlockDmg[cv] + LoadInteger(udg_CItem_Table, id, 43) * x
    set udg_Stat_Crit[cv] = udg_Stat_Crit[cv] + (LoadInteger(udg_CItem_Table, id, 54) + LoadInteger(udg_CItem_Table, id, 66)) * x
    set udg_Stat_Dmg[cv] = udg_Stat_Dmg[cv] + (LoadInteger(udg_CItem_Table, id, 52) + LoadInteger(udg_CItem_Table, id, 62)) * x
    set udg_Stat_CritDmg[cv] = udg_Stat_CritDmg[cv] + LoadInteger(udg_CItem_Table, id, 55) * x
    set udg_Stat_Acc[cv] = udg_Stat_Acc[cv] + (LoadInteger(udg_CItem_Table, id, 42) + LoadInteger(udg_CItem_Table, id, 73)) * x
    set udg_Stat_Eva[cv] = udg_Stat_Eva[cv] + (LoadInteger(udg_CItem_Table, id, 42) + LoadInteger(udg_CItem_Table, id, 74)) * x
    set udg_Stat_DefLv[cv] = udg_Stat_DefLv[cv] + (LoadInteger(udg_CItem_Table, id, 51) + LoadInteger(udg_CItem_Table, id, 70)) * x
    set udg_Stat_HpRegen[cv] = udg_Stat_HpRegen[cv] + LoadInteger(udg_CItem_Table, id, 27) * x
    set udg_Stat_LifeSteal[cv] = udg_Stat_LifeSteal[cv] + LoadInteger(udg_CItem_Table, id, 28) * x
    set udg_Stat_Pdef[cv] = udg_Stat_Pdef[cv] + (LoadInteger(udg_CItem_Table, id, 34) + LoadInteger(udg_CItem_Table, id, 75)) * x
        //here we need add 5 elemental def, hp per kill, mp per kill, drop chance, 5 elemental dmg
    set udg_Stat_Mdef1[cv] = udg_Stat_Mdef1[cv] + (LoadInteger(udg_CItem_Table, id, 35) + LoadInteger(udg_CItem_Table, id, 76)) * x
    set udg_Stat_Mdef2[cv] = udg_Stat_Mdef2[cv] + (LoadInteger(udg_CItem_Table, id, 36) + LoadInteger(udg_CItem_Table, id, 77)) * x
    set udg_Stat_Mdef3[cv] = udg_Stat_Mdef3[cv] + (LoadInteger(udg_CItem_Table, id, 37) + LoadInteger(udg_CItem_Table, id, 78)) * x
    set udg_Stat_Mdef4[cv] = udg_Stat_Mdef4[cv] + (LoadInteger(udg_CItem_Table, id, 38) + LoadInteger(udg_CItem_Table, id, 79)) * x
    set udg_Stat_Mdef5[cv] = udg_Stat_Mdef5[cv] + (LoadInteger(udg_CItem_Table, id, 39) + LoadInteger(udg_CItem_Table, id, 80)) * x
    set udg_Stat_ManaSteal[cv] = udg_Stat_ManaSteal[cv] + LoadInteger(udg_CItem_Table, id, 32) * x
    set udg_Stat_MovSpeed[cv] = udg_Stat_MovSpeed[cv] + LoadInteger(udg_CItem_Table, id, 40) * x
    set udg_Stat_MpRegen[cv] = udg_Stat_MpRegen[cv] + LoadInteger(udg_CItem_Table, id, 31) * x
    set udg_Stat_Exp[cv] = udg_Stat_Exp[cv] + LoadInteger(udg_CItem_Table, id, 22) * x
    set udg_Stat_Drop_Bonus[cv] = udg_Stat_Drop_Bonus[cv] + LoadInteger(udg_CItem_Table, id, 23) * x
    set udg_Stat_Gold_Bonus[cv] = udg_Stat_Gold_Bonus[cv] + LoadInteger(udg_CItem_Table, id, 24) * x
    set udg_Global_Acc[cv] = udg_Global_Acc[cv] + (LoadInteger(udg_CItem_Table, id, 41) + LoadInteger(udg_CItem_Table, id, 73)) * x
        //set udg_Global_MattackAddon[cv] = udg_Global_MattackAddon[cv] + LoadInteger(udg_Item_Table, id, 18) * x
    set udg_Global_Hp4Kill[cv] = udg_Global_Hp4Kill[cv] + LoadInteger(udg_CItem_Table, id, 29) * x
    set udg_Global_Mp4Kill[cv] = udg_Global_Mp4Kill[cv] + LoadInteger(udg_CItem_Table, id, 33) * x
    set udg_Global_ArmorBreak[cv] = udg_Global_ArmorBreak[cv] + LoadInteger(udg_CItem_Table, id, 49) * x
    set udg_Global_MDmg1[cv] = udg_Global_MDmg1[cv] + LoadInteger(udg_CItem_Table, id, 57) * x
    set udg_Global_MDmg2[cv] = udg_Global_MDmg2[cv] + LoadInteger(udg_CItem_Table, id, 58) * x
    set udg_Global_MDmg3[cv] = udg_Global_MDmg3[cv] + LoadInteger(udg_CItem_Table, id, 59) * x
    set udg_Global_MDmg4[cv] = udg_Global_MDmg4[cv] + LoadInteger(udg_CItem_Table, id, 60) * x
    set udg_Global_MDmg5[cv] = udg_Global_MDmg5[cv] + LoadInteger(udg_CItem_Table, id, 61) * x
        
    set hp = hp + (LoadInteger(udg_CItem_Table, id, 26) + LoadInteger(udg_CItem_Table, id, 64)) * x
    set mp = mp + (LoadInteger(udg_CItem_Table, id, 30) + LoadInteger(udg_CItem_Table, id, 65)) * x
    call SetHeroStr(u, GetHeroStr(u, true) + LoadInteger(udg_CItem_Table, id, 44) * x , true)
    call SetHeroAgi(u, GetHeroAgi(u, true) + LoadInteger(udg_CItem_Table, id, 45) * x , true)
    call SetHeroInt(u, GetHeroInt(u, true) + LoadInteger(udg_CItem_Table, id, 46) * x , true)
    set udg_Global_Discount[cv] = udg_Global_Discount[cv] + LoadInteger(udg_CItem_Table, id, 81) * x
    call AddHPMP(true, hp, u)
    call AddHPMP(false, mp, u)

    if GetHeroStr(u, true) > GetHeroAgi(u, true) then
        set udg_Total_Dmg[cv] = udg_Stat_Dmg[cv] + udg_Stat_Dmg[cv] * (GetHeroStr(u, true) / 400)
    else
        set udg_Total_Dmg[cv] = udg_Stat_Dmg[cv] + udg_Stat_Dmg[cv] * (GetHeroAgi(u, true) / 400)
    endif

    call AddDMG(false, cv, (udg_Stat_AttackSpeed[cv] + (GetHeroAgi(u, true) / 2)))
    call AddDMG(true, cv, udg_Total_Dmg[cv])
    call StatRefresh(cv)
    if udg_Camera_Lock[pl] == 1 then
        call ShowStat(pl)
    endif
endfunction

function EquipItem takes integer cv, integer slot, boolean equip returns nothing
    local item itm = LoadItemHandle(udg_Stat_Table, cv, slot)
    local integer ilv = LoadInteger(udg_Stat_Table, cv, - slot )
  
    if ilv > 0 then
        if ilv != 111 then
            call DummyVillagerAttachmentRefresh()
        endif
        call EquipAItem(cv, itm, equip)
    endif
    set itm = null
endfunction

function ForcedUnequip takes integer cv, integer slot returns nothing
    local integer i = 100
    local integer Quit = 0
    local integer a = 0
    local integer ilv = LoadInteger(udg_Stat_Table, cv, - slot)
    local integer id
    local integer dur = 1
    local unit u = udg_UDexUnits[cv]
    local integer pl = GetPlayerId(GetOwningPlayer(u)) + 1
    local real x = GetUnitX(u)
    local real y = GetUnitY(u)
    local item itm
    if ilv > 0 then
        set itm = LoadItemHandle(udg_Stat_Table, cv, slot)
        set id = GetHandleId(itm)
        call EquipItem(pl, slot, false)
        call SetAttackAnimation (cv)
        call RemoveAttachment (cv, 3)
        call ClearSlot (cv, slot)
        call AddAttachment (cv, 3)
 
        set udg_Stop_Stack[cv] = true
        set i = 100
        loop
            exitwhen i == 206 or Quit == 1
            if i < 200 then
                if LoadInteger(udg_Stat_Table, cv, - i) == 0 then
                    call SaveInteger(udg_Stat_Table, cv, - i, ilv)
                    call SaveItemHandle(udg_Stat_Table, cv, i, itm)
                    set Quit = 1
                endif
            else
                if UnitItemInSlot(u, i - 200) == null then
                    call AddItem2Slot (cv, itm, i - 200)
                    set Quit = 1
                endif
            endif
            if i==119 then
                set i = 199
            endif
            set i = i + 1
        endloop

        if Quit == 0 then
            call SetItemVisible(itm, true)
            call SetItemPosition(itm, x, y)
        endif
    endif
    set udg_Stop_Stack[cv] = false
    set itm = null
    set u = null
endfunction

//-------------------------------------------------------------------------
//                              DROP FUNCTIONS
//-------------------------------------------------------------------------



function SetUnitDrop takes integer utype, real C1, real LvDrop, integer DSId, real C2 returns nothing
    local integer a1 = R2I(C1 / 100)
    local integer a2 = R2I(C2 / 100)
    local integer aLvD = R2I(LvDrop / 100)
    set C1 = C1 - a1 * 100
    set C2 = C2 - a2 * 100
    set LvDrop = LvDrop - aLvD * 100

    call SaveInteger(udg_Drop_Table, utype, 701, a1) // default drop amount
    call SaveInteger(udg_Drop_Table, utype, 702, a2) // shared drop amount
    call SaveInteger(udg_Drop_Table, utype, 710, DSId) // shared drop id
    call SaveInteger(udg_Drop_Table, utype, 703, aLvD) // general level drop amount

    call SaveReal(udg_Drop_Table, utype, 711, C1) // default drop chance
    call SaveReal(udg_Drop_Table, utype, 712, C2) // shared drop chance
    call SaveReal(udg_Drop_Table, utype, 713, LvDrop) // general level drop chance
endfunction

function AddLevelDrop takes integer lv, integer itype, real chance returns nothing
    local integer i = 0
    local integer a = 1
    local integer Index
    if lv < 0 then
        set lv = - lv
    endif
    
    set Index = LoadInteger(udg_Drop_Table, - lv, 0) // saved item count in level category
    if chance > 0 then
        loop
            exitwhen i > Index or a == - 1
            set a = LoadInteger(udg_Drop_Table, - lv, i)
            if a == itype then
                call SaveReal(udg_Drop_Table, - lv, - Index, chance)
                set a = - 1
            endif
            set i = i + 1
        endloop
    endif

    if Index < 512 then
        if a != - 1 then
            //increase the index
            call SaveInteger(udg_Drop_Table, - lv, 0, Index + 1)
            // save the itemtypeid and chance
            call SaveInteger(udg_Drop_Table, - lv, Index + 1, itype)
            call SaveReal(udg_Drop_Table, - lv, - Index - 1, chance)
        endif
    endif
endfunction

function AddUnitDrop takes integer utype, integer itype, real chance returns nothing
    local integer Index = LoadInteger(udg_Drop_Table, utype, 0) // saved item count
    local integer i = 1
    local integer a = 1

//we check if the item already exist on list or no
//if yes then we just upgrade the drop chance
    if chance > 0 then
        loop
            exitwhen i > Index or a == - 1
            set a = LoadInteger(udg_Drop_Table, utype, i)
            if a == itype then
                call SaveReal(udg_Drop_Table, utype, - Index, chance)
                set a = - 1
            endif
            set i = i + 1
        endloop

        //if we dont got the item in drop list then we add it
        if Index < 512 then
            if a != - 1 then
            //increase the index
                call SaveInteger(udg_Drop_Table, utype, 0, Index + 1)
            // save the itemtypeid and chance
                call SaveInteger(udg_Drop_Table, utype, Index + 1, itype)
                call SaveReal(udg_Drop_Table, utype, - Index, chance)
            endif
        endif
    endif
endfunction

function RemoveItemDropFromUnit takes integer utype, integer itype returns nothing
    local integer i = 1
    local integer Index = LoadInteger(udg_Drop_Table, utype, 0) // saved item count
    local integer a = 1
    loop
        exitwhen i > Index or a == - 1
        set a = LoadInteger(udg_Drop_Table, utype, i)
        if a == itype then
            if i != Index then
                call SaveInteger(udg_Drop_Table, utype, i, LoadInteger(udg_Drop_Table, utype, Index))
                call SaveReal(udg_Drop_Table, utype, - i, LoadReal(udg_Drop_Table, utype, - i))
            endif
            call SaveInteger(udg_Drop_Table, utype, 0, Index - 1 )
        endif
        set i = i + 1
    endloop
endfunction

function GetDefaultDropItem takes integer utype returns integer
    local integer i
    local integer itemId = 0
    local integer Index = LoadInteger(udg_Drop_Table, utype, 0) // saved item count
    local integer rndI
    local real rndC
    if Index > 0 then
        loop
            exitwhen itemId > 0
            set rndI = GetRandomInt(1, Index)
            set rndC = GetRandomReal(0, 100)
            if LoadReal(udg_Drop_Table, utype, - rndI) > rndC then
                set itemId = LoadInteger(udg_Drop_Table, utype, rndI)
            endif
        endloop
    endif
    return itemId
endfunction

function GetLevelDropItem takes integer lv returns integer
    local integer i
    local integer itemId = 0
    local integer Index = LoadInteger(udg_Drop_Table, - lv, 0) // saved item count
    local integer rndI
    local real rndC
    if Index > 0 then
        loop
            exitwhen itemId != 0
            set rndI = GetRandomInt(1, Index)
            set rndC = GetRandomReal(0, 100)
            if LoadReal(udg_Drop_Table, - lv, - rndI) > rndC then
                set itemId = LoadInteger(udg_Drop_Table, - lv, rndI)
            endif
        endloop
    endif
    return itemId
endfunction
Last edited:
Top