Сейчас 12:56:44 Среда, 15 января, 2025 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Вопрос] Про функцию Wait
sumertДата: Воскресенье, 09 Октября 2011, 13:34:09 | Сообщение # 1
10 уровень
Группа: Проверенные
Сообщений: 2330
Награды: 2
Репутация: 1094
Блокировки:
Эта функция или call TriggerSleepAction( ) у меня соверщенно не работает. Просто хотелось бы понять почему.
Сам триггер довольно простой: при кастовании вражеским юнитам в радиусе 150 наносится ежесекундно 1 ед урона в течении 5 секунд.
Однако до call TriggerSleepAction( ) все идет нормально, даже если удалить его, то цикл пройдется 5 раз. Как это исправить?
Code

function PoisionCond takes nothing returns boolean
      local unit filter=GetFilterUnit()
      local unit spell=GetSpellAbilityUnit()
      local real LifeFilter=GetUnitState(filter, UNIT_STATE_LIFE)
      local player P=GetOwningPlayer(spell)
             if ((LifeFilter> 0) and ( IsUnitEnemy(filter,P) == true ) ) then
                   return true
                   else   
                   return false
             endif
      set filter=null
      set spell=null
endfunction

function Trig_Poison_Func003A takes nothing returns nothing
      local integer i=1
      local unit u=GetEnumUnit()
      loop
          call UnitDamageTarget( udg_Player, u, 1, true, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_WHOKNOWS )
          exitwhen (i==5)
          set i=i+1
          call TriggerSleepAction( 3.00 )
      endloop
      set u=null
endfunction

function Trig_Poison_Actions takes nothing returns nothing
      local integer id=GetSpellAbilityId()
      local unit u=GetSpellAbilityUnit()
      local location l=GetUnitLoc(u)
      if ( id == 'A005' ) then
           call ForGroup( GetUnitsInRangeOfLocMatching(150.00, l, Condition(function PoisionCond)), function Trig_Poison_Func003A )
      endif
      set u=null
      call RemoveLocation(l)
      set l=null
endfunction

//===========================================================================
function InitTrig_Poison takes nothing returns nothing
      set gg_trg_Poison = CreateTrigger(  )
      call TriggerRegisterAnyUnitEventBJ( gg_trg_Poison, EVENT_PLAYER_UNIT_SPELL_EFFECT )
      call TriggerAddAction( gg_trg_Poison, function Trig_Poison_Actions )
endfunction


Сообщение отредактировал sumert - Воскресенье, 09 Октября 2011, 13:34:25
 

Ty3uKДата: Воскресенье, 09 Октября 2011, 14:27:38 | Сообщение # 2
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Во-первых, видимо конверт из гуи в жасс рулит. Но это не самое страшное. Далее- лучше делать так:
loop
exitwhen

т.е. объявлять условие выхода сразу после луп. Далее кондишн. Тут страшно. Ты, видимо проверяешь, жив ли юнит или нет. Твоя проверка- кака, надо делать так. Можно сразу без переменных, т.е.
(IsUnitType(GetFilterUnit()) == UNIT_TYPE_DEAD) == false and IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(GetTriggerUnit())) == true
пишу по памяти, но принцип думаю ясен

Добавлено (09 Октябрь 2011, 14:24:59)
---------------------------------------------
return (IsUnitType(GetFilterUnit()) ==
UNIT_TYPE_DEAD) == false and
IsUnitEnemy(GetFilterUnit(),
GetOwningPlayer(GetTriggerUnit
())) == true

Добавлено (09 Октябрь 2011, 14:26:02)
---------------------------------------------
И вообще, юзай таймер- в твоем случае это проще простого

Добавлено (09 Октябрь 2011, 14:27:38)
---------------------------------------------
И не юзай спеллабилитиюнит, юзай триггерюнит


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

sumertДата: Воскресенье, 09 Октября 2011, 14:28:56 | Сообщение # 3
10 уровень
Группа: Проверенные
Сообщений: 2330
Награды: 2
Репутация: 1094
Блокировки:
Ty3uK, хватит умничать. Ты ничтожно помог мне с моим вопросом. Буду знать, что из тебя никакой помощник. Спелл я сделал на скорую руку, да это и не важно. Перечитай первые 4 строчки.
 

Ty3uKДата: Воскресенье, 09 Октября 2011, 14:30:40 | Сообщение # 4
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Да... После этого помогать отпало желание. Иди учи таймеры

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

lawsonДата: Воскресенье, 09 Октября 2011, 14:30:57 | Сообщение # 5
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Ty3uK,Возьми весь код в код, а то хрен прочитаешь.

Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!
 

Ty3uKДата: Воскресенье, 09 Октября 2011, 14:31:40 | Сообщение # 6
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Раз взялся писать на жассе- никаких пауз и вейтов, парень

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

lawsonДата: Воскресенье, 09 Октября 2011, 14:31:53 | Сообщение # 7
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
sumert, Да ты сумашедший в цикле использовать вэйт. Тузик прав все проблемы решаються через таймер, посмотрев на этот нубокод все такого мнения.

Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Воскресенье, 09 Октября 2011, 14:32:45
 

Ty3uKДата: Воскресенье, 09 Октября 2011, 14:32:41 | Сообщение # 8
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Лавс, он ему нафиг не нужен- тру кодер в деле, не мешайте

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

sumertДата: Понедельник, 10 Октября 2011, 08:25:05 | Сообщение # 9
10 уровень
Группа: Проверенные
Сообщений: 2330
Награды: 2
Репутация: 1094
Блокировки:
Ty3uK, сам-то нуб еще какой. Я писал спелл на скорую руку. Между прочим, у меня много там утечек, а ты их не заметил. По нормальному, там над инициализацию триггера переписать и функцию группы видоизменить. Кстати, GetFilterUnit(), GetTriggerUnit() и GetOwnerPlayer() вызывают утечки, не?
Впрочем, не важно: я спрашиваю, с какого перепугу wait не работает, даже при трех секундах? Я не понимаю, зачем писать таймеры для такого типичного спелла? Это все равно, что для того, чтобы вычислить сумму цифр, писать целый калькулятор.

Добавлено (10 Октябрь 2011, 08:25:05)
---------------------------------------------
Так вот переписал на таймеры.
Code

function Trig_Timer_Exprice takes nothing returns nothing
       local timer t = GetExpiredTimer()   
       local integer id = GetHandleId(t)   
       call UnitDamageTarget( udg_Player, LoadUnitHandle(udg_Hash, id, 1), 1, true, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_WHOKNOWS )
       call FlushChildHashtable(udg_Hash, id)   
       call DestroyTimer(t)   
       set t = null    
endfunction

function Trig_Poison_Func003A takes nothing returns nothing
      local integer i=1
      local unit u=GetEnumUnit()
      local timer t=CreateTimer()
      local integer id = GetHandleId(t)   
      loop
          call SaveAgentHandle(udg_Hash, id, 1, u)   
          call TimerStart(t, i, false, function Trig_Timer_Exprice)   
      exitwhen i>=5
      set i=i+1
      endloop
      set u=null
      set t=null
endfunction


Сообщение отредактировал sumert - Понедельник, 10 Октября 2011, 08:28:06
 

Ty3uKДата: Понедельник, 10 Октября 2011, 08:39:00 | Сообщение # 10
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Ммм... Таймер нужен для того, чтобы сделать все хорошо- вейты это говно. Юниты и игрок, которых ты выписал- не утечны. В событие никаких утечек нет. Я, может быть, и нуб, но по крайней мере не юзаю вейты, а тем более в цикле. Мой тебе совет- почитай про таймеры- они помогут тебе решить эту "проблему". А также почитай про утечки. Что и куда утекает, потому как ты этого, видимо, не знаешь. И юзать таймер для такого пустякового спелла- не верх кретинизма- нормальные люди, которые пишут на жассе так и делают. Плюс еще можно было фильтр и форгрупп засунуть в одну функцию. Засовывать ид спелла в переменную не обязательно, если ты не хочешь юзать формулы с его участием, юзать локу- ужасно глупо, надо юзать координаты и так далее. Вообщем, повторю еще раз- юзай таймер и все будет хорошо. А насчет того, что делал на скорую руку- не верю. Пооткрывать все бж, засунуть в локалки пустяковые ссылки, да это выглядело так: написал на гуи, перевел в жасс и целенаправленно минут пять раскрывал бж и делал прочее. Почему конверт из гуи? Да потому, что только гуи дает такие дурацкие названия функциям. Плюс юзает форгрупп. Короче, зря отмазывался... Код говно, характер у тебя тоже. Тебе помогают- ты быка включаешь. Давай, удачи, и напоследок еще раз- периодический таймер, офк.

Добавлено (10 Октябрь 2011, 08:36:59)
---------------------------------------------
Ммм... Зачем таймер в лупе? Не понимаю. Периодический таймер запустил и все. Иначе обычный таймер у тебя в лупе перезапустит себя несколько раз

Добавлено (10 Октябрь 2011, 08:39:00)
---------------------------------------------

Quote
Кстати,
GetFilterUnit(), GetTriggerUnit() и
GetOwnerPlayer() вызывают
утечки, не?
ни в жисть, где ты такой чуши понабрался?


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

sumertДата: Понедельник, 10 Октября 2011, 09:03:46 | Сообщение # 11
10 уровень
Группа: Проверенные
Сообщений: 2330
Награды: 2
Репутация: 1094
Блокировки:
Quote (Ty3uK)
. В событие никаких утечек нет

Quote (sumert)
call TriggerRegisterAnyUnitEventBJ

Вроде она вызывает другую утечную функцию, поэтому надо циклом всех игроков проверять.
Quote (Ty3uK)
Плюс еще можно было фильтр и форгрупп засунуть в одну функцию.

В курсе, просто лень пока это делать. Я уж думал, не заметил.
Quote (Ty3uK)
юзать локу- ужасно глупо, надо юзать координаты

Разница, если я все равно в локальную переменную и обнуляю её потом?
Quote (Ty3uK)
очему конверт из гуи? Да потому, что только гуи дает такие дурацкие названия функциям.

Не припомню, чтобы я отрицал это.
Quote (Ty3uK)
Тебе помогают- ты быка включаешь.

Ты помог там, где я не просил вовсе. Я же не спрашивал: как оптимизировать код или в таком духе.
Кстати, ты не заметил в таймере одну ошибку, впрочем, черт с ней. Периодический таймер. Ты предлагаешь запустить таймер и в фнкции Trig_Timer_Exprice запустить оставшиеся 4 раза?
 

Ty3uKДата: Понедельник, 10 Октября 2011, 09:28:48 | Сообщение # 12
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Нет. Сейчас кину код и посмотришь.

Добавлено (10 Октябрь 2011, 09:28:48)
---------------------------------------------

Code
function Trig_Spell_Filter takes nothing returns boolean
     local timer t = GetExpiredTimer()
     local integer hid = GetHandleId(t)
     local unit caster = LoadUnitHandle(udg_hash, hid, 0)
     local unit target = GetFilterUnit()
     if IsUnitEnemy(target, GetOwningPlayer(caster)) and IsUnitType(target, UNIT_TYPE_DEAD) == false then
         call UnitDamageTarget(caster, target, 50., true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
     endif
     set t = null
     set caster = null
     set target = null
     return false
endfunction

function Trig_Spell_Timer takes nothing returns nothing
     local timer t = GetExpiredTimer()
     local integer hid = GetHandleId(t)
     local unit caster = LoadUnitHandle(udg_hash, hid, 0)
     local integer i = LoadInteger(udg_hash, hid, 1)
     local group g = CreateGroup()
     local filterfunc f = Filter(function Trig_Spell_Filter)
     if i != 5 then
         set i = i + 1
         call GroupEnumUnitsInRange(g, GetWidgetX(caster), GetWidgetY(caster), 500., f)
         call SaveInteger(udg_hash, hid, 1, i)
     else
         call PauseTimer(t)
         call DestroyTimer(t)
         call FlushChildHashtable(udg_hash, hid)
     endif
     call DestroyGroup(g)
     call DestroyFilter(f)
     set t = null
     set g = null
     set f = null
     set caster = null
endfunction

function Trig_Spell_Actions takes nothing returns nothing
     local timer t = CreateTimer()
     local integer hid = GetHandleId(t)
     local unit caster =GetTriggerUnit()
     call SaveUnitHandle(udg_hash, hid, 0, caster)
     call SaveInteger(udg_hash, hid, 1, 0)
     call TimerStart(t, 1., true, function Trig_Spell_Timer)
     set t = null
     set caster = null
endfunction
Вот и все. Все гениальное- просто


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

sumertДата: Понедельник, 10 Октября 2011, 09:48:37 | Сообщение # 13
10 уровень
Группа: Проверенные
Сообщений: 2330
Награды: 2
Репутация: 1094
Блокировки:
А зачем return false в функции Trig_Spell_Filter?
Quote (Ty3uK)
Вот и все. Все гениальное- просто

Ага, забыл я, что TimerStart(...,..., true) - это многократный таймер.
Хех, все равно не работает.
 

Ty3uKДата: Понедельник, 10 Октября 2011, 09:50:24 | Сообщение # 14
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
sumert, я проверял у себя - все работает

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

sumertДата: Понедельник, 10 Октября 2011, 09:54:05 | Сообщение # 15
10 уровень
Группа: Проверенные
Сообщений: 2330
Награды: 2
Репутация: 1094
Блокировки:
Ty3uK, да? У меня просто этот цикл повторяется бесконечное число раз. При этом никакого урона не наносится.
Quote (sumert)
А зачем return false в функции Trig_Spell_Filter?


Сообщение отредактировал sumert - Понедельник, 10 Октября 2011, 09:54:29
 

Ty3uKДата: Понедельник, 10 Октября 2011, 09:56:20 | Сообщение # 16
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
sumert, потому что фильтр должен возвращать false
и свой я проверил - там все работает. я числа поменял, чтобы нагляднее выглдяело


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

sumertДата: Понедельник, 10 Октября 2011, 10:01:48 | Сообщение # 17
10 уровень
Группа: Проверенные
Сообщений: 2330
Награды: 2
Репутация: 1094
Блокировки:
Гм, очень странно. Я еще добавил функции вывода текста. Самое интересное, что все тексты в любых местах показывает. Но вот урона все равно никакого. И тексты бесконечное число раз показываются.
 

Ty3uKДата: Понедельник, 10 Октября 2011, 10:06:02 | Сообщение # 18
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек


Сообщение отредактировал Ty3uK - Понедельник, 10 Октября 2011, 10:08:23
 

sumertДата: Понедельник, 10 Октября 2011, 10:10:57 | Сообщение # 19
10 уровень
Группа: Проверенные
Сообщений: 2330
Награды: 2
Репутация: 1094
Блокировки:
Я поставил показывать i:
Code

function Trig_Spell_Timer takes nothing returns nothing  
      local timer t = GetExpiredTimer()  
      local integer hid = GetHandleId(t)  
      local unit caster = LoadUnitHandle(udg_Hash, hid, 0)  
      local integer i = LoadInteger(udg_Hash, hid, 1)  
      local group g = CreateGroup()  
      local filterfunc f = Filter(function Trig_Spell_Filter)  
      if i != 5 then  
          set i = i + 1  

call DisplayTextToForce( GetPlayersAll(), I2S(i) )

          call GroupEnumUnitsInRange(g, GetWidgetX(caster), GetWidgetY(caster), 150, f)  
          call SaveInteger(udg_Hash, hid, 1, i)  
      else  
          call PauseTimer(t)  
          call DestroyTimer(t)  
          call FlushChildHashtable(udg_Hash, hid)  
      endif  
      call DestroyGroup(g)  
      call DestroyFilter(f)  
      set t = null  
      set g = null  
      set f = null  
      set caster = null  
endfunction  

Так вот i постоянно равно 1.

Добавлено (10 Октябрь 2011, 10:10:57)
---------------------------------------------
А этот глюк может связан с тем, что у меня есть еще одна функция, использующая хеш?

Code


function removeunittimed takes nothing returns nothing  
local timer t = GetExpiredTimer()  
local unit u = LoadUnitHandle(udg_Hash, GetHandleId(t), 1)  
call RemoveUnit(u)  
call FlushChildHashtable(udg_Hash, GetHandleId(t))  
call DestroyTimer(t)  
set t = null  
set u = null  
endfunction  

function RemUT takes unit u, real time returns nothing  
local timer t = CreateTimer()  
call SaveUnitHandle(udg_Hash, GetHandleId(t), 1, u)  
call TimerStart(t, time, false, function removeunittimed)  
set t = null  
endfunction  

function Trig_RemoveUnit_Actions takes nothing returns nothing
local unit u
set u=GetTriggerUnit()
call RemUT(u, 60)  
set u=null
endfunction

//===========================================================================
function InitTrig_RemoveUnit takes nothing returns nothing
     set gg_trg_RemoveUnit = CreateTrigger(  )
     call TriggerRegisterAnyUnitEventBJ( gg_trg_RemoveUnit, EVENT_PLAYER_UNIT_DEATH )
     call TriggerAddAction( gg_trg_RemoveUnit, function Trig_RemoveUnit_Actions )
endfunction
 

Ty3uKДата: Понедельник, 10 Октября 2011, 10:16:21 | Сообщение # 20
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
хз, погляди второй спойлер, где секунды считаются. У меня все норм -
1 секунда
2 секунда
3 секунда
4 секунда
5 секунда
и таймер останавливается


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

sumertДата: Понедельник, 10 Октября 2011, 10:20:22 | Сообщение # 21
10 уровень
Группа: Проверенные
Сообщений: 2330
Награды: 2
Репутация: 1094
Блокировки:
http://rghost.ru/24952481
смотри сам.
 

Ty3uKДата: Понедельник, 10 Октября 2011, 10:31:58 | Сообщение # 22
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
зачем ты убрал кондишн и поставил иф зен в дефствиях? %)

Добавлено (10 Октябрь 2011, 10:29:16)
---------------------------------------------
Ухахахаха! А таблтцу кто инициализировать будет? :D

Добавлено (10 Октябрь 2011, 10:31:58)
---------------------------------------------
держи ;)


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

sumertДата: Понедельник, 10 Октября 2011, 10:36:57 | Сообщение # 23
10 уровень
Группа: Проверенные
Сообщений: 2330
Награды: 2
Репутация: 1094
Блокировки:
Ty3uK, блин. Я-то думал,раз глобалка, сама инициализироваться будет. Спасибо.
 

Ty3uKДата: Понедельник, 10 Октября 2011, 10:38:42 | Сообщение # 24
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
sumert, не за что ^_^

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

sumertДата: Понедельник, 10 Октября 2011, 10:42:31 | Сообщение # 25
10 уровень
Группа: Проверенные
Сообщений: 2330
Награды: 2
Репутация: 1094
Блокировки:
Хотя, нет, погоди. Это не совсем то, что мне надо было. Урон наносится каждую секунду вокруг кастующего. А мне надо было, чтобы юниты словно отравились. То бишь один раз кастанул и юнитам, попавшим в зону действия, наносися урон. Думаю, я сам уже это исправлю)))
 

  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

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