function Debug takes string s returns nothing
call DisplayTextToPlayer(GetLocalPlayer(), 0,0, s)
endfunction
Name | Type | is_array | initial_value |
DemoDialog | dialog | No | |
DemoDialogButtons | button | Yes | |
MSort_Ascending | boolean | No | |
MSort_EndIndex | integer | No | |
MSort_IndexInitial | integer | Yes | |
MSort_Indices | integer | Yes | |
MSort_Left | real | Yes | |
MSort_Right | real | Yes | |
MSort_StartIndex | integer | No | |
MSort_Values | real | Yes | |
Point | location | Yes | |
SORTGROUP__Buffs | integer | No | |
SORTGROUP__BuffsNeg | integer | No | |
SORTGROUP__BuffsPos | integer | No | |
SORTGROUP__CustomData | integer | No | |
SORTGROUP__Distance | integer | No | |
SORTGROUP__FacingToLoc | integer | No | |
SORTGROUP__FlyHeight | integer | No | |
SORTGROUP__Hp | integer | No | |
SORTGROUP__HpLost | integer | No | |
SORTGROUP__HpMax | integer | No | |
SORTGROUP__HpPercent | integer | No | |
SORTGROUP__Level | integer | No | |
SORTGROUP__MoveSpeed | integer | No | |
SORTGROUP__Mp | integer | No | |
SORTGROUP__MpLost | integer | No | |
SORTGROUP__MpMax | integer | No | |
SORTGROUP__MpPercent | integer | No | |
SortGroupAscending | boolean | No | |
SortGroupAutoDestroy | boolean | No | |
SortGroupCustomData | real | No | |
SortGroupCustomDataAdjust | real | No | |
SortGroupCustomDataTrigger | trigger | No | |
SortGroupGroup | group | No | |
SortGroupModus | integer | No | |
SortGroupOrigin | location | No | |
SortGroupOriginX | real | No | |
SortGroupOriginY | real | No | |
SortGroupResult | unit | Yes | |
SortGroupResultValue | real | Yes |
//TESH.scrollpos=89
//TESH.alwaysfold=0
// Merge Sort [GUI Friendly] v1.01
// by Flux
// http://www.hiveworkshop.com/forums/members/flux/
//
// Merge Sort is an efficient sorting algorithm
// that has a worst case performance of O(n logn)
// This system allows you to sort values of an array
// in either ascending or descending order
// Additionally, it this system allows you to get the
// sorted indices of the array values.
//
// Purely written in JASS and doesn't require anything
function MSort_Display takes nothing returns nothing
local integer i = udg_MSort_StartIndex
call BJDebugMsg("========== |cffffcc00[Merge Sort]:|r Data ===============")
loop
exitwhen i > udg_MSort_EndIndex
call BJDebugMsg("MSort_Values[" + I2S(i) + "] = " + R2S(udg_MSort_Values[i]) + ", MSort_Indices[" + I2S(i) + "] = " + I2S(udg_MSort_Indices[i]))
set i = i + 1
endloop
call BJDebugMsg("============== End Display =================\n")
endfunction
function MSort_Merge takes integer leftStart, integer leftEnd, integer rightStart, integer rightEnd returns nothing
local integer i = leftStart
local integer j = rightStart
local integer k = i
loop
exitwhen i > leftEnd or j > rightEnd
if udg_MSort_Ascending then
if udg_MSort_Left[i] < udg_MSort_Right[j] then
set udg_MSort_Values[k] = udg_MSort_Left[i]
set udg_MSort_Indices[k] = udg_MSort_IndexInitial[i]
set k = k + 1
set i = i + 1
else
set udg_MSort_Values[k] = udg_MSort_Right[j]
set udg_MSort_Indices[k] = udg_MSort_IndexInitial[j]
set k = k + 1
set j = j + 1
endif
else
if udg_MSort_Left[i] > udg_MSort_Right[j] then
set udg_MSort_Values[k] = udg_MSort_Left[i]
set udg_MSort_Indices[k] = udg_MSort_IndexInitial[i]
set k = k + 1
set i = i + 1
else
set udg_MSort_Values[k] = udg_MSort_Right[j]
set udg_MSort_Indices[k] = udg_MSort_IndexInitial[j]
set k = k + 1
set j = j + 1
endif
endif
endloop
//Fill up remaining
loop
exitwhen i > leftEnd
set udg_MSort_Values[k] = udg_MSort_Left[i]
set udg_MSort_Indices[k] = udg_MSort_IndexInitial[i]
set k = k + 1
set i = i + 1
endloop
loop
exitwhen j > rightEnd
set udg_MSort_Values[k] = udg_MSort_Right[j]
set udg_MSort_Indices[k] = udg_MSort_IndexInitial[j]
set k = k + 1
set j = j + 1
endloop
//Update IndexInitial
set i = leftStart
loop
exitwhen i == k
set udg_MSort_IndexInitial[i] = udg_MSort_Indices[i]
set i = i + 1
endloop
endfunction
//Recursive Function
function MSort_Merge_Sort takes integer start, integer end returns nothing
local integer i = start
local integer mid
if end - start >= 1 then
set mid = (end + start)/2
call MSort_Merge_Sort(start, mid)
call MSort_Merge_Sort(mid+1, end)
loop
exitwhen i > mid
set udg_MSort_Left[i] = udg_MSort_Values[i]
set i = i + 1
endloop
loop
exitwhen i > end
set udg_MSort_Right[i] = udg_MSort_Values[i]
set i = i + 1
endloop
call MSort_Merge(start, mid, mid+1, end)
//call MSort_Display()
// ^uncomment to display values
endif
endfunction
function Trig_Merge_Sort_Main takes nothing returns boolean
call MSort_Merge_Sort(udg_MSort_StartIndex, udg_MSort_EndIndex)
return false
endfunction
//===========================================================================
function InitTrig_Merge_Sort takes nothing returns nothing
set gg_trg_Merge_Sort = CreateTrigger()
call TriggerAddCondition(gg_trg_Merge_Sort, Condition(function Trig_Merge_Sort_Main))
endfunction
//SortGroup 1.3a
// by Tasyen
// This System gives your an unit-array out of a group beeing sorted ascending/descending by an choosen Stat.
//=========================================================================================================
// function SortGroupOfGroup takes group g, real x, real y, integer modus returns nothing
// Or Run the SortGroupOfGroup Trigger
// Credits Flux for Merge Sort
//
// 1.3a insert functions to be used with GUI-Sator
// PercentHP/Mana were incorrect the result was 1/wanted result.
//=========================================================================================================
function SortGroupInser takes unit u, real currentValue, real adjust returns nothing
set udg_MSort_EndIndex = udg_MSort_EndIndex + 1
set udg_MSort_Values[udg_MSort_EndIndex] = currentValue + adjust
set udg_MSort_IndexInitial[udg_MSort_EndIndex] = udg_MSort_EndIndex
set udg_SortGroupResult[udg_MSort_EndIndex] = u
set udg_SortGroupResultValue[udg_MSort_EndIndex] = currentValue
endfunction
function SortGroupDistance takes nothing returns nothing
local unit u = GetEnumUnit()
local real dx = udg_SortGroupOriginX - GetUnitX(u)
local real dy = udg_SortGroupOriginY - GetUnitY(u)
local real currentValue = SquareRoot(dx * dx + dy * dy)
call SortGroupInser(u,currentValue,0)
set u = null
endfunction
function SortGroupHp takes nothing returns nothing
local unit u = GetEnumUnit()
local real currentValue = GetWidgetLife(u)
call SortGroupInser(u,currentValue,0)
set u = null
endfunction
function SortGroupHpLost takes nothing returns nothing
local unit u = GetEnumUnit()
local real currentValue = GetUnitState(u, UNIT_STATE_MAX_LIFE) - GetUnitState(u, UNIT_STATE_LIFE)
call SortGroupInser(u,currentValue,0)
set u = null
endfunction
function SortGroupHpMax takes nothing returns nothing
local unit u = GetEnumUnit()
local real currentValue = GetUnitState(u, UNIT_STATE_MAX_LIFE)
call SortGroupInser(u,currentValue,0)
set u = null
endfunction
function SortGroupMp takes nothing returns nothing
local unit u = GetEnumUnit()
local real currentValue = GetUnitState(u, UNIT_STATE_MANA)
call SortGroupInser(u,currentValue,0)
set u = null
endfunction
function SortGroupHpPercent takes nothing returns nothing
local unit u = GetEnumUnit()
local real currentValue = GetUnitState(u, UNIT_STATE_LIFE)
local real max = GetUnitState(u, UNIT_STATE_MAX_LIFE)
if max != 0 then
set currentValue = currentValue / max
endif
call SortGroupInser(u,currentValue * 100,0)
set u = null
endfunction
function SortGroupMpPercent takes nothing returns nothing
local unit u = GetEnumUnit()
local real currentValue = GetUnitState(u, UNIT_STATE_MANA)
local real max = GetUnitState(u, UNIT_STATE_MAX_MANA)
if max != 0 then
set currentValue = currentValue / max
endif
call SortGroupInser(u,currentValue * 100,0)
set u = null
endfunction
function SortGroupMpLost takes nothing returns nothing
local unit u = GetEnumUnit()
local real currentValue = GetUnitState(u, UNIT_STATE_MAX_MANA) - GetUnitState(u, UNIT_STATE_MANA)
call SortGroupInser(u,currentValue,0)
set u = null
endfunction
function SortGroupMpMax takes nothing returns nothing
local unit u = GetEnumUnit()
local real currentValue = GetUnitState(u, UNIT_STATE_MAX_MANA)
call SortGroupInser(u,currentValue,0)
set u = null
endfunction
function SortGroupBuffsNeg takes nothing returns nothing
local unit u = GetEnumUnit()
local real currentValue = UnitCountBuffsEx(u, false, true, false, false, false, true, false)
call SortGroupInser(u,currentValue,0)
set u = null
endfunction
function SortGroupBuffsAny takes nothing returns nothing
local unit u = GetEnumUnit()
local real currentValue = UnitCountBuffsEx(u, true, true, false, false, false, true, false)
call SortGroupInser(u,currentValue,0)
set u = null
endfunction
function SortGroupBuffsPos takes nothing returns nothing
local unit u = GetEnumUnit()
local real currentValue = UnitCountBuffsEx(u, true, false, false, false, false, true, false)
call SortGroupInser(u,currentValue,0)
set u = null
endfunction
function SortGroupMoveSpeed takes nothing returns nothing
local unit u = GetEnumUnit()
local real currentValue = GetUnitMoveSpeed(u)
call SortGroupInser(u,currentValue,0)
set u = null
endfunction
function SortGroupFlyHeight takes nothing returns nothing
local unit u = GetEnumUnit()
local real currentValue = GetUnitFlyHeight(u)
call SortGroupInser(u,currentValue,0)
set u = null
endfunction
function SortGroupCustomData takes nothing returns nothing
call TriggerExecute(udg_SortGroupCustomDataTrigger)
call SortGroupInser(GetEnumUnit(),udg_SortGroupCustomData,udg_SortGroupCustomDataAdjust)
endfunction
//Credits to chobibo from hiveworkshop
function GetFacingDiffToXY takes unit u, real x1, real y1 returns real
local real xUnit=GetUnitX(u)
local real yUnit=GetUnitY(u)
local real unitFacing=GetUnitFacing(u)
local real angleToLoc=Atan2(y1-yUnit,x1-xUnit) *bj_RADTODEG
local real anglediff
// Make negative angle form angleToLoc positive
if angleToLoc < 0 then
set angleToLoc = 360 + angleToLoc
endif
set anglediff = RAbsBJ( unitFacing - angleToLoc)
//Treat clockwise and anticlockwise the same.
if anglediff >= 180 then
set anglediff = 360 - anglediff
endif
return anglediff
endfunction
function SortGroupFacingToLoc takes nothing returns nothing
local unit u = GetEnumUnit()
local real currentValue = GetFacingDiffToXY(u, udg_SortGroupOriginX,udg_SortGroupOriginY)
call SortGroupInser(u,currentValue,0)
set u = null
endfunction
function SortGroupLevel takes nothing returns nothing
local unit u = GetEnumUnit()
local real currentValue
local real adjust
//I make it simply by giving an hero + 9000 so its always above a non hero.
if IsUnitType(u, UNIT_TYPE_HERO) then
set currentValue = GetHeroLevel(u)
set adjust = 9000
else
set currentValue = GetUnitLevel(u)
set adjust = 0
endif
call SortGroupInser(u,currentValue,adjust)
set u = null
endfunction
function SortGroupReset takes boolean ascending returns nothing
set udg_SortGroupResult[1] = null
set udg_SortGroupResultValue[1] = 0
set udg_MSort_StartIndex = 1
set udg_MSort_EndIndex = 0
set udg_MSort_Ascending = ascending
endfunction
//Makes the result more simple to use, but is more heavy +4 x n.
function SortGroupReOrder takes boolean reOrder returns nothing
local integer LoopA = 1
local real array realSaved
local unit array unitSaved
if reOrder then
loop
exitwhen LoopA > udg_MSort_EndIndex
set realSaved[LoopA] = udg_SortGroupResultValue[udg_MSort_Indices[LoopA]]
set unitSaved[LoopA] = udg_SortGroupResult[udg_MSort_Indices[LoopA]]
set LoopA = LoopA + 1
endloop
loop
set LoopA = LoopA - 1 //start with "-" cause the counter is 1 to big.
exitwhen LoopA < 1
set udg_SortGroupResultValue[LoopA] = realSaved[LoopA]
set udg_SortGroupResult[LoopA] = unitSaved[LoopA]
set unitSaved[LoopA] = null
endloop
endif
endfunction
//Function Used by GUISator
function SortGroupLoc takes group g, integer modus, location loc, boolean ascending, boolean cleanLoc, boolean cleanGroup, boolean reOrderSortGroupResult returns nothing
call SortGroupReset(ascending)
if modus == udg_SORTGROUP__Distance then
set udg_SortGroupOriginX = GetLocationX(loc)
set udg_SortGroupOriginY = GetLocationY(loc)
call ForGroup(g, function SortGroupDistance)
elseif modus == udg_SORTGROUP__FacingToLoc then
set udg_SortGroupOriginX = GetLocationX(loc)
set udg_SortGroupOriginY = GetLocationY(loc)
call ForGroup(g, function SortGroupFacingToLoc)
else //Invalid call
set udg_MSort_Indices[1] = 1
return
endif
call TriggerEvaluate(gg_trg_Merge_Sort)
if cleanLoc then
call RemoveLocation(loc)
endif
if cleanGroup then
call DestroyGroup(g)
endif
call SortGroupReOrder(reOrderSortGroupResult)
endfunction
//Function Used by GUISator
function SortGroupDefault takes group g, integer modus, boolean ascending, boolean cleanGroup, boolean reOrderSortGroupResult returns nothing
call SortGroupReset(ascending)
if modus == udg_SORTGROUP__MpPercent then
call ForGroup(g, function SortGroupMpPercent)
elseif modus == udg_SORTGROUP__HpPercent then
call ForGroup(g, function SortGroupHpPercent)
elseif modus == udg_SORTGROUP__MpMax then
call ForGroup(g, function SortGroupMpMax)
elseif modus == udg_SORTGROUP__HpMax then
call ForGroup(g, function SortGroupHpMax)
elseif modus == udg_SORTGROUP__CustomData then
call ForGroup(g, function SortGroupCustomData)
elseif modus == udg_SORTGROUP__MoveSpeed then
call ForGroup(g, function SortGroupMoveSpeed)
elseif modus == udg_SORTGROUP__FlyHeight then
call ForGroup(g, function SortGroupFlyHeight)
elseif modus == udg_SORTGROUP__Buffs then
call ForGroup(g, function SortGroupBuffsAny)
elseif modus == udg_SORTGROUP__BuffsPos then
call ForGroup(g, function SortGroupBuffsPos)
elseif modus == udg_SORTGROUP__BuffsNeg then
call ForGroup(g, function SortGroupBuffsNeg)
elseif modus == udg_SORTGROUP__Mp then
call ForGroup(g, function SortGroupMp)
elseif modus == udg_SORTGROUP__MpLost then
call ForGroup(g, function SortGroupMpLost)
elseif modus == udg_SORTGROUP__Hp then
call ForGroup(g, function SortGroupHp)
elseif modus == udg_SORTGROUP__HpLost then
call ForGroup(g, function SortGroupHpLost)
elseif modus == udg_SORTGROUP__Level then
call ForGroup(g, function SortGroupLevel)
else //Invalid call
set udg_MSort_Indices[1] = 1
return
endif
call TriggerEvaluate(gg_trg_Merge_Sort)
if cleanGroup then
call DestroyGroup(g)
endif
call SortGroupReOrder(reOrderSortGroupResult)
endfunction
//BackwardsCompatible
function SortGroup takes group g, real x, real y, integer modus returns nothing
call SortGroupReset(udg_SortGroupAscending)
if modus == udg_SORTGROUP__MpPercent then
call ForGroup(g, function SortGroupMpPercent)
elseif modus == udg_SORTGROUP__HpPercent then
call ForGroup(g, function SortGroupHpPercent)
elseif modus == udg_SORTGROUP__MpMax then
call ForGroup(g, function SortGroupMpMax)
elseif modus == udg_SORTGROUP__HpMax then
call ForGroup(g, function SortGroupHpMax)
elseif modus == udg_SORTGROUP__FacingToLoc then
set udg_SortGroupOriginX = x
set udg_SortGroupOriginY = y
call ForGroup(g, function SortGroupFacingToLoc)
elseif modus == udg_SORTGROUP__CustomData then
call ForGroup(g, function SortGroupCustomData)
elseif modus == udg_SORTGROUP__MoveSpeed then
call ForGroup(g, function SortGroupMoveSpeed)
elseif modus == udg_SORTGROUP__FlyHeight then
call ForGroup(g, function SortGroupFlyHeight)
elseif modus == udg_SORTGROUP__Buffs then
call ForGroup(g, function SortGroupBuffsAny)
elseif modus == udg_SORTGROUP__BuffsPos then
call ForGroup(g, function SortGroupBuffsPos)
elseif modus == udg_SORTGROUP__BuffsNeg then
call ForGroup(g, function SortGroupBuffsNeg)
elseif modus == udg_SORTGROUP__Mp then
call ForGroup(g, function SortGroupMp)
elseif modus == udg_SORTGROUP__MpLost then
call ForGroup(g, function SortGroupMpLost)
elseif modus == udg_SORTGROUP__Hp then
call ForGroup(g, function SortGroupHp)
elseif modus == udg_SORTGROUP__HpLost then
call ForGroup(g, function SortGroupHpLost)
elseif modus == udg_SORTGROUP__Level then
call ForGroup(g, function SortGroupLevel)
elseif modus == udg_SORTGROUP__Distance then
set udg_SortGroupOriginX = x
set udg_SortGroupOriginY = y
call ForGroup(g, function SortGroupDistance)
endif
call TriggerEvaluate(gg_trg_Merge_Sort)
if udg_SortGroupAutoDestroy then
call DestroyGroup(g)
call RemoveLocation(udg_SortGroupOrigin)
set udg_SortGroupAutoDestroy = false
set udg_SortGroupOrigin = null
endif
endfunction
function SortGroupAction takes nothing returns nothing
call SortGroup(udg_SortGroupGroup, GetLocationX(udg_SortGroupOrigin),GetLocationY(udg_SortGroupOrigin), udg_SortGroupModus)
endfunction
//===========================================================================
function InitTrig_SortGroup takes nothing returns nothing
set gg_trg_SortGroup = CreateTrigger( )
call TriggerAddAction( gg_trg_SortGroup , function SortGroupAction )
set udg_SORTGROUP__HpPercent = 16
set udg_SORTGROUP__MpPercent = 15
set udg_SORTGROUP__MpMax = 14
set udg_SORTGROUP__HpMax = 13
set udg_SORTGROUP__FacingToLoc = 12
set udg_SORTGROUP__CustomData = 11
set udg_SORTGROUP__MoveSpeed = 10
set udg_SORTGROUP__FlyHeight = 9
set udg_SORTGROUP__Buffs = 8
set udg_SORTGROUP__BuffsNeg = 7
set udg_SORTGROUP__BuffsPos = 6
set udg_SORTGROUP__Distance = 5
set udg_SORTGROUP__Hp = 4
set udg_SORTGROUP__HpLost = 3
set udg_SORTGROUP__Level = 2
set udg_SORTGROUP__Mp = 1
set udg_SORTGROUP__MpLost = 0
endfunction