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

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

Закрытая тема
 
zer0ne

offline
Опыт: 11,219
Активность:
GroupEnumUnitsInRange
у меня тут возникла проблема со спеллом, весь его код выложить не могу, потому что он на конкурс Spell Contest 2.
Код:
private struct spell
 real x2
 real y2
 location target
endstruct


private function Timer takes nothing returns nothing
     local timer t=GetExpiredTimer()
     local spell s=GetInt(t)
………
endfunction

private function Trig_Actions takes nothing returns nothing
    local spell s=spell.create()
    local timer t=CreateTimer()
    set s.target = GetSpellTargetLoc ( )
    set s.x2 = GetLocationX (s.target)
    set s.y2 = GetLocationY (s.target)

  call GroupEnumUnitsInRange(gr_temp,s.x2,s.y2,Range,cnd)
  call SetInt(t, integer(s))
  call TimerStart(t, 1.2, false, function Timer)
endfunction
в конце идет XAT


Вообщем функция GroupEnumUnitsInRange запускается только из "Trig_Actions", а из "Timer" не работает, нет никаких ошибок, просто не действует, хотя в "Timer" есть "EnumDestructablesInRect", она работает. Как мне запустить "GroupEnumUnitsInRange" из "Timer"?

Если нужна еще какая то информация о коде пишите

Отредактировано zer0ne, 30.09.2008 в 17:52.
Старый 30.09.2008, 17:17
J
expert
offline
Опыт: 48,447
Активность:
Код:
private function Timer takes nothing returns nothing
    local timer ct = GetExpiredTimer()
    local spell s = GetStoredInteger(cache, I2S(H2I(ct)), "s") 
    call GroupEnumUnitsInRange(gr_temp,s.x2,s.y2,Range,cnd)

endfunction

private function Trig_Actions takes nothing returns nothing
    local spell s=spell.create()
    local timer t=CreateTimer()

    set s.x2 = GetLocationX (s.target)
    set s.y2 = GetLocationY (s.target)

    call TimerStart(t, 1.2, false, function Timer)
    call StoreInteger(cache, I2S(H2I(t)), "s", s) 

endfunction
Старый 30.09.2008, 17:28
zer0ne

offline
Опыт: 11,219
Активность:
Jon
я не совсем понял что тут, но на всякий случай говорю, что использую XAT и там есть call SetInt(t, integer(s)) перед call TimerStart(t, 1.2, false, function Timer), а в функции Timer есть
Код:
local timer t=GetExpiredTimer()
 local spell s=GetInt(t)

и в Timer есть переменные s.___ и они работают
Старый 30.09.2008, 17:33
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Что тебе нужно сделать в функции Timer? Пикнуть новых юнитов или пройтись по группе существующих? Если первое, то не вижу особой проблемы, аттачь на таймер структуру и по таймеру доставай оттуда x, y и пикай.
Код:
private function Timer takes nothing returns nothing
  local spell s = GetInt(GetExpiredTimer()) // getting attach
  call GroupEnumUnitsInRange(gr_temp,s.x2,s.y2,Range,cnd)
  // . . .
endfunction

private function Trig_Actions takes nothing returns nothing
  local spell s=spell.create()
  local timer t=CreateTimer()
  // . . .
  set s.x2 = GetLocationX (s.target)
  set s.y2 = GetLocationY (s.target)

  call GroupEnumUnitsInRange(gr_temp,s.x2,s.y2,Range,cnd)
  call SetInt(t, s) // attaching
  call TimerStart(t, 1.2, false, function Timer)
endfunction

Вообще лучше выложить часть кода функции Timer, который имеет непосредственное отношение к этому (вызов пика юнитов, изменение передаваемых в него аргументов)
Старый 30.09.2008, 17:35
zer0ne

offline
Опыт: 11,219
Активность:
ShadoW DaemoN
у меня точная копия твоего кода, не работает, причем как я писал
Цитата:
Вообщем функция GroupEnumUnitsInRange запускается только из "Trig_Actions", а из "Timer" не работает, нет никаких ошибок, просто не действует, хотя в "Timer" есть "EnumDestructablesInRect", она работает.


zer0ne добавил:
Jon
ок, сейчас допишу)
Старый 30.09.2008, 17:37
J
expert
offline
Опыт: 48,447
Активность:
также невижу в структуре точку target, и невижу как ты ее получаеш, я конешно понимаю это ниипацо совершено секретно, но хотябы правельность кода в вопросе нужно соблюдать, откуда можно знать толи есть это часть кода то ли ее нет...
[+] замечание от ADOLF: мат) я всетаки поймал тебя)
Старый 30.09.2008, 17:40
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Попробуй так (хотя имхо мало толку, но все же):
Код:
private function Timer takes nothing returns nothing
  local spell s = spell(GetInt(GetExpiredTimer()))
  call BJDebugMsg(I2S(integer(s)) + "   " + R2S(s.x2) + "   " + R2S(s.y2))
  // . . .
endfunction

Первое выведенное на экран число должно быть больше 0.

Jon, не придирайся по мелочам... И так ясно, что он там есть. иначе бы we выдал бы синтакс. ошибку.
Старый 30.09.2008, 17:44
zer0ne

offline
Опыт: 11,219
Активность:
Еще наверно нужно добавить: мне не надо GroupEnumUnitsInRange в Trig_Action, только в Timer, я так написал сдесь, что бы показать, что она толь от туда запускается

zer0ne добавил:
ShadoW DaemoN
5 сек, сейчас попробую

zer0ne добавил:
вышло "1"
Старый 30.09.2008, 17:50
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
Jon, не придирайся по мелочам... И так ясно, что он там есть. иначе бы we выдал бы синтакс. ошибку.
все я правельно делаю, вопрос должен быть нормальным

zer0ne, ты опять не все написал, cnd - это че? как я понял это фильтр что создается заранее, покажика его, там есть функции подобные GetSpellAbilityUnit или подобные?
Старый 30.09.2008, 17:54
zer0ne

offline
Опыт: 11,219
Активность:
Код:
private function flt takes nothing returns boolean
   local unit castunit = GetTriggerUnit (  )
   local unit u = GetFilterUnit ( )
   local integer level = GetUnitAbilityLevel (castunit, Spell_ID)
 
...
ДЕЙСТВИЯ С ЮНИТАМИ
...
  
   set u        = null
   set castunit = null
   return false
endfunction
Старый 30.09.2008, 17:55
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
local unit castunit = GetTriggerUnit ( )

вот в этом вся проблема
Старый 30.09.2008, 17:56
zer0ne

offline
Опыт: 11,219
Активность:
Jon
А как ее решить? castunit мне нужен)
Старый 30.09.2008, 17:57
J
expert
offline
Опыт: 48,447
Активность:
создай спецальную глобальную переменую integer, я обычно ее называю IndexForGroup (используй эту переменую не для конкретного спела, а вообще для всех, т.е. не пересоздава ее)
создай в структуре юнита Caster
присваевай структуре кастера (set s.Caster = GetSpellAbilityUnit())
перед использованием GroupEnumUnitsInRange(), присваевай глобальной целочисленой переменой индекс структуры (set IndexForGroup = s), в фильтре доставай структуру (local spell s = IndexForGroup) и получай отуда кастера

Отредактировано Jon, 30.09.2008 в 18:11.
Старый 30.09.2008, 17:58
zer0ne

offline
Опыт: 11,219
Активность:
ок сейчас попробую
Старый 30.09.2008, 18:05
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Жон прав. Добавлю еще, что в Trig_Actions фильтр работает нормально, так как пик юнитов напрямую вызывался из этой функции => доступны все событийные функции (типа GetSpellAbilityUnit, GetSpellAbilityId).
Старый 30.09.2008, 18:24
zer0ne

offline
Опыт: 11,219
Активность:
Ок, Jon, ShadoW DaemoN, спасибо, теперь все работает!
Старый 30.09.2008, 18:35
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
создай спецальную глобальную переменую integer, я обычно ее называю IndexForGroup (используй эту переменую не для конкретного спела, а вообще для всех, т.е. не пересоздава ее)
создай в структуре юнита Caster
присваевай структуре кастера (set s.Caster = GetSpellAbilityUnit())
перед использованием GroupEnumUnitsInRange(), присваевай глобальной целочисленой переменой индекс структуры (set IndexForGroup = s), в фильтре доставай структуру (local spell s = IndexForGroup) и получай отуда кастера


это как вариант... я лично использую более глобальный набор таких "глобалок"

т.е. если тебе в фильтре надо получить только кастера то создавай глобалку юнит "кастер" и присвайвай значение ей, и обращайся к ней через фильтр (это будет немного правильнее)
Старый 01.10.2008, 14:06
Закрытая тема

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

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

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

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



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