Добавлен Zahanc
Есть код:
function OppositeFilter takes nothing returns boolean
return IsPlayerInForce(GetOwningPlayer(GetFilterUnit()), udg_Opposite)
endfunction
function CalculatePercentOfAttackers takes unit Point returns integer
local integer p
local integer s
local integer A
local integer D
local location loc = GetUnitLoc(Point)
local group g = GetUnitsInRangeOfLocMatching( 1280.00, loc, Condition(function OppositeFilter) )
local unit f
if CountUnitsInGroup(g) > 0 then
call Say("Loop starts")
loop
set f = FirstOfGroup(g)
if f == null then
call Say("Loop ends")
endif
exitwhen f == null
if IsPlayerAlly( GetOwningPlayer(Point), GetOwningPlayer(f)) == true then
set D = D + GetUnitLevel(f)
call Say(GetUnitName(f)+I2S(GetHandleId(f))+" is defender.")
elseif IsPlayerEnemy( GetOwningPlayer(Point), GetOwningPlayer(f)) == true then
set A = A + GetUnitLevel(f)
call Say(GetUnitName(f)+I2S(GetHandleId(f))+" is attacker.")
else
call Say(GetUnitName(f)+I2S(GetHandleId(f))+" is neutral.")
endif
call GroupRemoveUnit( g, f )
endloop
call Say("Defenders level="+I2S(D)+"Attackers level="+I2S(A))
set s = A + D
if s == 0 then
set s = 1
endif
set p = A*100/s
else
set p = 0
endif
call RemoveLocation(loc)
set loc = null
call DestroyGroup(g)
set g = null
set f = null
call Say( GetUnitName(Point)+I2S(GetHandleId(Point))+" calculations result = "+I2S(p) )
return p
endfunction
Его предназначение — посчитать соотношение сил вокруг точки. Это нужно для системы захвата точек. Но сам цикл почему-то не работает. Кто может сказать мне, почему?
Принятый ответ
function CalculatePercentOfAttackers takes unit Point returns integer
local integer p = 0
local integer s = 0
local integer A = 0
local integer D = 0
local group g = CreateGroup()
local unit f
GroupEnumUnitsInRange(g, GetWidgetX(Point), GetWidgetY(Point), 1280., null)
if CountUnitsInGroup(g) > 0 then
call Say("Loop starts")
loop
set f = FirstOfGroup(g)
if f == null then
call Say("Loop ends")
endif
exitwhen f == null
if (IsUnitInForce(f, udg_Opposite) then
if IsUnitAlly(Point, GetOwningPlayer(f)) then
set D = D + GetUnitLevel(f)
call Say(GetUnitName(f)+I2S(GetHandleId(f))+" is defender.")
elseif IsUnitEnemy(Point, GetOwningPlayer(f)) then
set A = A + GetUnitLevel(f)
call Say(GetUnitName(f)+I2S(GetHandleId(f))+" is attacker.")
else
call Say(GetUnitName(f)+I2S(GetHandleId(f))+" is neutral.")
endif
endif
call GroupRemoveUnit(g, f)
endloop
call Say("Defenders level="+I2S(D)+"Attackers level="+I2S(A))
set s = A + D
if s == 0 then
set s = 1
endif
set p = A*100/s
else
set p = 0
endif
call Say(GetUnitName(Point)+I2S(GetHandleId(Point))+" calculations result = "+I2S(p))
call DestroyGroup(g)
set g = null
set f = null
return p
endfunction
Числовые и реальные переменные инициализируйте, иначе в качестве их значения выступит всякий числовой мусор. Поправил Вам код, по логике должен работать, проверить не могу :)
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Короче ситуацию в целом опишите никогда не будет равно нулю, согласно коду
Возможно дизинфа.
Ред. Zahanc
Отображается ли Loop starts? Если нет- проблема в фильтре.
Ред. Ty3uK