Praudmur
в поисках идей...
offline
Опыт:
3,604Активность: |
не работает функция
Спешу показать свой УГо-код. Смысл в том, что при атаке специального юнита скорость противника снижается на 50. Эффект истекает через 2 секунды, но новая атака продлевает эффект и усиливает его.
Используются 3 глобальные переменные: FrostUnits (юнит, массив), FrostUnitsNumber (интегер, показывает размер вышеидущего массива) и Timer ( тоже массив).
Проблема в том, что эффект не стакается и не снимается.
P.S. чуть позже сделаю так, чтобы при смерти цели или при снятии эффекта все переменные с большим, чем у этого юнита индексом уменьшали свой индекс на один
((код jass
function Frost takes nothing returns nothing
local timer t=GetExpiredTimer() local integer i=1 local integer ti loop exitwhen i>udg_FrostUnitsNumber if (t==udg_Timer[i]) then set ti=i endif set i=i+1 endloop call SetUnitMoveSpeed(udg_FrostUnits[ti], GetUnitDefaultMoveSpeed(udg_FrostUnits[ti])) set t=null set i=0 set ti=0 endfunction function Trig_Frost_attack_Conditions takes nothing returns boolean
if ( not ( GetUnitTypeId(GetAttacker()) == 'H001' ) ) then return false endif return true endfunction function Trig_Frost_attack_Actions takes nothing returns nothing
local unit u=GetTriggerUnit() local unit att=GetAttacker() local real x1=GetUnitX(att) local real y1=GetUnitY(att) local real x2=GetUnitX(u) local real y2=GetUnitY(u) local integer i=1 local integer Number=udg_FrostUnitsNumber local timer t=CreateTimer() ENDLOCALS call TriggerSleepAction( ( DistanceBetweenPoints(Location(x1, y1), Location(x2, y2)) / 5000.00 ) ) call SetUnitMoveSpeed( u, ( GetUnitMoveSpeed(u) - 50.00 ) ) loop exitwhen i>udg_FrostUnitsNumber if (u==udg_FrostUnits[i]) then call DestroyTimer(udg_Timer[i]) call TimerStart(t, 2.00, false, function Frost) set udg_Timer[i]=t else set Number=Number-1 endif set i=i+1 endloop if (Number==0) then set udg_FrostUnits[udg_FrostUnitsNumber+1]=u call TimerStart(t, 2.00, false, function Frost) set udg_Timer[udg_FrostUnitsNumber+1]=t endif REMOVELOCALS set i=0 set Number=0 set t=null set u=null set att=null set x1=0 set x2=0 set y1=0 set y2=0 endfunction ===========================================================================
function InitTrig_FrostAttack takes nothing returns nothing local trigger trg = CreateTrigger( ) local integer i=1 local integer Number=udg_FrostUnitsNumber local unit u=GetTriggerUnit() local timer t=CreateTimer() call TriggerRegisterAnyUnitEventBJ( trg, EVENT_PLAYER_UNIT_ATTACKED ) call TriggerAddCondition( trg, Condition( function Trig_Frost_attack_Conditions ) ) call TriggerAddAction( trg, function Trig_Frost_attack_Actions ) set trg=null endfunction )) Praudmur добавил: кстати, сработавший таймер вроде тоже надо разрушать? |
24.08.2011, 15:29 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Mngame
offline
Опыт:
1,137Активность: |
Сработавший таймер
а ошибки не заметил
Mngame добавил: Кстати, не заметил, чтобы к udg_FrostUnitsNumber что-то прибавлялось. Если не понял: Кинул бафф на юнита => udg_FrostUnitsNumber = 0 На другого udg_FrostUnitsNumber = 1 На третьего udg_FrostUnitsNumber = 2 Соответственно Юнит[udg_FrostUnitsNumber] будет нести одного юнита, тут я такого не заметил. 1, 2, 3 и Ный юнит будут записаны, как Юнит[udg_FrostUnitsNumber + 1], но сама переменная не изменится! |
24.08.2011, 15:54 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Helpmeplz
offline
Опыт:
11,698Активность: |
в одном случае ты используешь Number, в другом udg_FrostUnitsNumber. Две разные переменные, непонятно использование первой. Неправильная смена местами элементов массива таймеров. Читаем здесь про точки и группы и думаем как надо менять таймеры.
на остальной говнокод вроде обнуление real и integer тебе укажут другие пользователи. |
24.08.2011, 16:05 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|