XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
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
Mngame

offline
Опыт: 1,137
Активность:
Сработавший таймер
call DestroyTimer(t)
set t = null
а ошибки не заметил
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
Helpmeplz

offline
Опыт: 11,738
Активность:
в одном случае ты используешь Number, в другом udg_FrostUnitsNumber. Две разные переменные, непонятно использование первой. Неправильная смена местами элементов массива таймеров. Читаем здесь про точки и группы и думаем как надо менять таймеры.
на остальной говнокод вроде обнуление real и integer тебе укажут другие пользователи.
Старый 24.08.2011, 16:05
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 02:39.