Сейчас 13:10:30 Воскресенье, 5 мая, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Интересная загводздка с PolledWait
Интересная загводздка с PolledWait
EnforcerДата: Воскресенье, 27 Июня 2010, 00:24:56 | Сообщение # 1
Энф
Когда-то смотрел за порядком
Группа: Ветераны
Сообщений: 3127
Награды: 7
Репутация: 981
Блокировки:
Есть следующий код.
Code

function KillCurUnit takes unit CurUnit returns nothing
local unit NeedKillUnit = CurUnit
  call PolledWait( 0.5 )
call DisplayTextToForce( GetPlayersAll(), " Выстрел " +  GetUnitName(GetTriggerUnit()) + " в " + GetUnitName(NeedKillUnit) )
call UnitDamageTargetBJ( GetTriggerUnit(), NeedKillUnit, ( I2R(GetHeroStatBJ(bj_HEROSTAT_INT, GetTriggerUnit(), true)) * ( I2R(GetUnitAbilityLevelSwapped('A051', GetTriggerUnit())) * 10.00 ) ), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )
call DisplayTextToForce( GetPlayersAll(), ( I2S(( GetHeroStatBJ(bj_HEROSTAT_INT, GetTriggerUnit(), true) * ( ( GetUnitAbilityLevelSwapped('A051', GetTriggerUnit()) * 10 ) * 1 ) )) + " " ) )
     
endfunction

function Trig_Drago4a_Func003Func001A takes nothing returns nothing
     if ( Trig_Drago4a_Func003Func001Func001C() ) then
     local unit Dummy
     local unit NeedKillUnit
         call CreateNUnitsAtLoc( 1, 'u007', GetTriggerPlayer(), GetUnitLoc(GetTriggerUnit()), bj_UNIT_FACING )
         set Dummy = GetLastCreatedUnit()
         set NeedKillUnit = GetEnumUnit()
         call UnitAddAbilityBJ( 'A052', Dummy)
         call IssueTargetOrderBJ( Dummy, "fingerofdeath", NeedKillUnit )

          call KillCurUnit(NeedKillUnit)
          
         call RemoveUnit( Dummy )
         set Dummy = null
     else
     endif
endfunction

Есть спелл на основе Заклинания крови который ежесекундно рандомно поражает ближайшего юнита и наносит урон в зависимости от разума героя и прокачки спелла. Собственно это всё видно в коде.

Проблема в 1ой функции KillCurUnit, которая отвечает за задержку перед кастом пустышки заклинания для анимации урона и непосредственное поражения. Если из неё убрать call PolledWait( 0.5 ) Функция сработает до конца, но не будет видно анимации урона если этот урон добьет юнита. Если её оставить то функция не отработает до конца и не будет нанесен урон (даже информационного сообщения перед уроном). То есть будет фактически проигрываться чисто анимация атаки.
Целые числа тоже не катят, хотя та же функция задержки спокойно работает в цикле.

Неохота делать другую процедуру проигрывания анимации. Может кто то знает в чем проблема.


 

The_ExecutorДата: Воскресенье, 27 Июня 2010, 18:11:25 | Сообщение # 2
3 уровень
Группа: Пользователи
Сообщений: 40
Награды: 0
Репутация: 19
Блокировки:
Enforcer,
А ведь таймеры на что? Сразу видно, код сделан конверсией из триггера.
То есть можно сделать так:
Code
function KillCurUnit_Child takes nothing returns nothing
     local timer t = GetExpiredTimer()
     local unit NeedKillUnit = LoadUnitHandle(udg_Hashtable,GetHandleId(t),0)
     local unit tu = LoadUnitHandle(udg_Hashtable,GetHandleId(t),1)
     local real damage = GetHeroInt(tu,true) * GetUnitAbilityLevel(tu,'A051') * 10.
      
     call DisplayTextToPlayer(GetLocalPlayer(),0,0,"Âûñòðåë " + GetUnitName(tu) + " â " + GetUnitName(NeedKillUnit))
     call UnitDamageTarget(tu,NeedKillUnit,damage,true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
      
     call FlushChildHashtable(udg_Hashtable,GetHandleId(t))
     call DestroyTimer(t)
      
     set t = null
     set tu = null
     set NeedKillUnit = null
endfunction

function KillCurUnit takes unit CurUnit returns nothing
     local unit NeedKillUnit = CurUnit
     local timer t = CreateTimer()
      
     call TimerStart(t,0.5,false,function KillCurUnit_Child)
     call SaveUnitHandle(udg_Hashtable,GetHandleId(t),0,CurUnit)
     call SaveUnitHandle(udg_Hashtable,GetHandleId(t),1,GetTriggerUnit())
      
     set t = null
endfunction

Требует глобальную переменную Hashtable типа Хэш-таблица.

 

EnforcerДата: Воскресенье, 27 Июня 2010, 20:55:16 | Сообщение # 3
Энф
Когда-то смотрел за порядком
Группа: Ветераны
Сообщений: 3127
Награды: 7
Репутация: 981
Блокировки:
The_Executor, да не было приводить в божеский вид, хотел еще вчера сделать героя, но из за проблем с удалением дамми пришлось конвертировать в jass, но из за этой проблемы не получалось. Попробую оптимизировать триггер и еще раз заюзать PolledWait, если нет, то таймеры.
Глобальные переменные не рекомендуется, поскольку однотипных героев может быть много.




Сообщение отредактировал Enforcer - Воскресенье, 27 Июня 2010, 20:56:06
 

The_ExecutorДата: Понедельник, 28 Июня 2010, 10:35:38 | Сообщение # 4
3 уровень
Группа: Пользователи
Сообщений: 40
Награды: 0
Репутация: 19
Блокировки:
Всё равно, не советую никому и никогда использовать PolledWait. Ужасная функция и баганая. У тебя же жасс знания - используй таймеры!
 

EnforcerДата: Понедельник, 28 Июня 2010, 10:51:36 | Сообщение # 5
Энф
Когда-то смотрел за порядком
Группа: Ветераны
Сообщений: 3127
Награды: 7
Репутация: 981
Блокировки:
У меня нубские знания Jass :) Сделал на GUI, вывев урон за пределы IF и всё заработало.

 

Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Интересная загводздка с PolledWait
  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz