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

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

Ответ
 
EviLInside

offline
Опыт: 3,543
Активность:
Вопрос по спеллу с хешем
Вобщем есть спелл МУИ с хешем, глобалок нет.
Смысл его притягивать юнита, ну вот я применил на юнита спелл, и он потихоньку ко мне тянется,
и тут его в момент притягивания, на него кто то применил такой же спелл притянуть, и получается лажа, он начинает мелькать, то на траекторию моего спелла, то на траекторию притягивания второго применяемого спелла и тп. Вобщем мне нужно как то отловить что если юнит находится в моменте притягивание уже одним спеллом, и на него кастуется другое притяжение, как то отменить первый спелл действующий, отключить как то таймер, обнулить всё, и тд. Но я незнаю как смастерить это. (Спелл делался на примере из статьи про хеш)
//==========================
function DeathGripAct2 takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer h = GetHandleId(t)
    local location p = LoadLocationHandle(udg_hash,h,4)
    local location p2 = LoadLocationHandle(udg_hash,h,5)
    local unit u = LoadUnitHandle(udg_hash,h,1)
    local unit u2 = LoadUnitHandle(udg_hash,h,2)
    local integer i = LoadInteger(udg_hash,h,3)
       if  ( R2I(DistanceBetweenPoints(GetUnitLoc(u2), p)) > 40 )  then
        call DisplayTextToForce( GetPlayersAll(), I2S(i) )
        call SetUnitPositionLocFacingLocBJ( u2, PolarProjectionBJ(p2, I2R(i), AngleBetweenPoints(p, p2)), p )
        call SaveInteger(udg_hash,h,3,i-10)               
    else
              call DestroyTimer(t)
              call FlushChildHashtable(udg_hash,h)
            set u = null
            set u2 = null
            set t = null
       call RemoveLocation(p)
       call RemoveLocation(p2)
    endif
endfunction

function Trig_DeathGrip_Actions takes nothing returns nothing
    local unit u = GetSpellAbilityUnit()
    local unit u2 = GetSpellTargetUnit()
    local timer t = CreateTimer()
    local integer h = GetHandleId(t)
    local location p = GetUnitLoc(u)
    local location p2 = GetUnitLoc(u2)

    call SaveLocationHandle(udg_hash,h,4,p)
    call SaveLocationHandle(udg_hash,h,5,p2)
    call SaveUnitHandle(udg_hash,h,1,u)
    call SaveUnitHandle(udg_hash,h,2,u2)
    call SaveInteger(udg_hash,h,3,1)    
    call TimerStart(t,0.03,true,function DeathGripAct2)    
    set u = null
    set u2 = null
    set t = null
endfunction

function Trig_DeathGrip_Conditions takes nothing returns boolean
     return GetSpellAbilityId() == 'A007'
endfunction
Старый 05.06.2012, 22:57
Sladkoegka
Забыл что хотел...
offline
Опыт: 7,477
Активность:
EviLInside, Код не читал попробуй так типа когда юнит применяет способность:отслеживать есть ли на цели УЖЕ БАФФ,если есть то отменять действия "1 притягивания"и начинать действия второго,иначе все как обычно.
Старый 05.06.2012, 23:01
EviLInside

offline
Опыт: 3,543
Активность:
Понял тебя, конечно так не догадался сделать спелл с бафом. Но а если спелл без бафа (мне на будущее)? У меня вот таргет притягивания не имеет никаких бафов, вот если без них как отловить этого юнита? Вообще если у кого то есть время доделайте мой спелл, и прокоментируйте. Я вот лично запутался, есть мысль конечно в группу его локальную сажать, потом сохранять так же в хеш группу и потом проверять. Смысл понятен конечно, но организовать не смогу. Хочу пример с комментами)
Старый 05.06.2012, 23:15
DimanTOoBS

offline
Опыт: 5,791
Активность:
ну по идее во время каста тебе надо записывать созданный таймер в хендл цели заклинания и для проверки логическое значение "да" когда таймер активен.
когда кастуешь спелл проверяешь это логическое значение, если "да" стопаешь записанный таймер и перезаписываешь новый
ну как то так
Старый 05.06.2012, 23:25
Hate
конь вакуумный
online
Опыт: 43,030
Активность:
добавлять цель в группу, вешать на хэндл юнита целочисленную/логическую/реальную, задавать UnitUserData, выбирай
добавляешь в тикающую функцию проверку на то что юнит не в группе, целочисленнная не равна тому то, логическая не тру, реальная не такая то, юнит юсер дата не тот....
Старый 05.06.2012, 23:28
EviLInside

offline
Опыт: 3,543
Активность:
Вот что такое UnitUserDate я хз...Ладно не буду вас мучить, может кто то пример сделает, на словах я не всё понимаю
Старый 05.06.2012, 23:32
Hate
конь вакуумный
online
Опыт: 43,030
Активность:
специальное число юнита. Да можно банально давать абилку без иконки юниту и проверять на лвл способности а в конце отбирать ее.
Старый 05.06.2012, 23:37
Extremator

offline
Опыт: 39,812
Активность:
всё не читал, ибо много...
Притяжение я где то делал, хоть и на гуи, зато муишно, вот оно.
Дальше... что касаемо проверки на то что юнит уже притягивается...
чисто логически...
нужно взять всех юнитов над которыми проводится работа, и каждого из них сравнить с целью на которую ты применяешь спелл...
предположим если я вот делаю в массивах, то выглядеть это должно было бы так
Цикл А от 1 до ("число работ")
Если (Unit[A]) = (Target ability being cast)
То:
Действия........
В под действиями я подрузомиваю новый установки, цель к кому притянуть, скорость, или время эффекта
set Hero[A] = (Triggering Unit)
set Speed[A] = (формула какая-нить)
set Time[A] = (5.00)
ну это число пример...
В общем ты должен в момент каста сравнить всех притягиваемых юнитов в данный момент с тем юнитом на которого применяется спелл... и в случаи совпадении просто перезаписать все денные... если у тебя там таймер какой нить, то запаузи его и запусти заново... назначь нового героя который является для этого юнита "камером"... и т.д.
Старый 06.06.2012, 00:08
Hate
конь вакуумный
online
Опыт: 43,030
Активность:
Extremator:
Hatsume_Hate:
по твоему варианту это надо сохранять все хэндлы таймеров что бы из них потом извлекать юнита и сравнивать с целью. омг одним словом.
я к тому... что нужно просто проверить юнитов...
это можно сделать даже через простое занесение юнитов в группу
Pick units in (Group)
Если (Picked Unit) = (Target ability being cast)
То - пляшем
ну по хендлу думаю найти нужный таймер и всё-всё можно... верно?
хоспаде, прочти уже что такое хэш таблица
нужно где то сохранять ВСЕ хэндлы таймеров, из них перебором загружать циклом и сравнивать юнитов, а это.... нет слов вообщем
касательно группы я уже писал
Hatsume_Hate:
добавлять цель в группу, вешать на хэндл юнита целочисленную/логическую/реальную, задавать UnitUserData, выбирай
добавляешь в тикающую функцию проверку на то что юнит не в группе, целочисленнная не равна тому то, логическая не тру, реальная не такая то, юнит юсер дата не тот....
Старый 06.06.2012, 00:58
Hate
конь вакуумный
online
Опыт: 43,030
Активность:
Extremator:
Hatsume_Hate:
нужно где то сохранять ВСЕ хэндлы таймеров, из них перебором загружать циклом и сравнивать юнитов, а это.... нет слов вообщем
чорд... ну нафиг тогда это хеш-смеш-треш >< гуи тащат! xD
вся проблема в первом посте решается одной глобальной группой, либо той же хэш таблицей. Гуи не оптимизирован и в большинстве случаев утечен, жрет много ресурсов, особенно с малыми периодами и вынуждает делать кучу глобалок. Только перейдя на жасс и узнав его поближе я понял что за страшная вещь гуи.
Старый 06.06.2012, 01:11
Ответ

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

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

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

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



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