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

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

Ответ
 
Ghostlolka3

offline
Опыт: 142
Активность:
Копьё на JASS с использованием Hash-таблицы
» Кот

Код:
function Spear_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A006'
endfunction
function Spear_filter takes nothing returns boolean
    return IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()), GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit()) > 0.405 and not IsUnitType(GetFilterUnit(), UNIT_TYPE_FLYING)
endfunction

function newX takes real source,real dist, real angle returns real
    return source + dist * Cos(angle * bj_DEGTORAD)
endfunction

function newY takes real source,real dist, real angle returns real
    return source + dist * Sin(angle * bj_DEGTORAD)
endfunction

function GetAngle takes real casterX,real casterY, real targetX,real targetY returns real
    return Atan2(targetY-casterY,targetX-casterX)
endfunction

function Spear_Move takes nothing returns nothing
    local boolean b=false
    local timer t = GetExpiredTimer()
    local integer h = GetHandleId(t)
    local unit caster=LoadUnitHandle(udg_Hash,h,1)
    local unit dummy = LoadUnitHandle(udg_Hash,h,2)
    local integer count=LoadInteger(udg_Hash,GetHandleId(t),3)
    local real ang=LoadReal(udg_Hash,GetHandleId(t),4)
    local real dX=GetUnitX(dummy)
    local real dY=GetUnitY(dummy)
    local group g=CreateGroup()
    local unit N
    call SetUnitPosition(dummy,newX(dX,50,ang),newY(dY,50,ang))
    call GroupEnumUnitsInRange(g,newX(dX,50,ang),newY(dY,50,ang),400,Condition(function Spear_filter))
    if count>0 then
        loop
            set N=FirstOfGroup(g)
            exitwhen N == null
            call UnitDamageTarget(caster, N, 1000, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null)
            call GroupRemoveUnit(g, N)
            set b=true
        endloop
        call SaveInteger(udg_Hash,h,3,count-1)
    else 
        set b=true
    endif
    if(b) then
        call FlushChildHashtable(udg_Hash,GetHandleId(t))
        call DestroyTimer(t)
        call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Orc\\WarStomp\\WarStompCaster.mdl", GetUnitX(dummy), GetUnitY(dummy)))
        call RemoveUnit(dummy)
    endif
    set t=null
    set caster=null
    set dummy=null
    set g=null
    set N=null    
endfunction

function Spear_Actions takes nothing returns nothing
    local timer t=CreateTimer()
    local unit caster=GetTriggerUnit()
    local real cX=GetUnitX(caster)
    local real cY=GetUnitY(caster)
    local real tX=GetLocationX(GetSpellTargetLoc())
    local real tY=GetLocationY(GetSpellTargetLoc())
    local real R=GetAngle(cX,cY,tX,tY)/bj_DEGTORAD
    local unit dummy=CreateUnit(GetOwningPlayer(caster),'u00C',cX,cY,R)
    call SaveUnitHandle(udg_Hash,GetHandleId(t),1,caster)
    call SaveUnitHandle(udg_Hash,GetHandleId(t),2,dummy)
    call SaveInteger(udg_Hash,GetHandleId(t),3,30)
    call SaveReal(udg_Hash,GetHandleId(t),4,R)
    call TimerStart(t,0.05,true,function Spear_Move)
    set t=null
    set caster=null
    set dummy=null
endfunction

//===========================================================================
function InitTrig_Arrow takes nothing returns nothing
    set gg_trg_Arrow = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Arrow, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_Arrow, Condition( function Spear_Conditions ) )
    call TriggerAddAction( gg_trg_Arrow, function Spear_Actions )
endfunction



Добрый ночи. Вчера мне помогли со статьями. Сделал скилл. Проблема в том, что ошибок нет, но он не работает. В чём суть: летит птица, но во время полёта отказывается создаваться группа с юнитами внутри. В следствии чего ни птица не уничтожается, ни урон не наносится. Она просто пролетает мимо. Что я сделал не так? Есть догадка, что группа после первого цикла перестаёт работать, но ведь это какая-то глупость оО.


Инициализация хэша в инициализации карты.
Старый 31.12.2013, 01:01
ScorpioT1000
Работаем
offline
Опыт: отключен
инициализация где?
Старый 31.12.2013, 01:02
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
добавьте дебаг и повторите попытку снова
Старый 31.12.2013, 01:07
Ghostlolka3

offline
Опыт: 142
Активность:
Цитата:
Сообщение от Hate
добавьте дебаг и повторите попытку снова

Не очень понимаю о чём вы. Я использовал дебаг в виде вывода сообщений во время игры для того, чтобы убедится что полёт снаряда нормальный. Как отловить работу енумератора без работоспособности группы не представляю возможности. Если вам не сложно-укажите на мою ошибку либо покажите кодом как нужно и что отлавливать.
Старый 31.12.2013, 01:12
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
Ghostlolka3:
Как отловить работу енумератора без работоспособности группы не представляю возможности
чтооо?
еще раз, добавьте дебаг, и сразу увидите в чем проблема
Старый 31.12.2013, 01:55
Ghostlolka3

offline
Опыт: 142
Активность:
Цитата:
Сообщение от Hate
~Ghostlolka3:
> Как отловить работу енумератора без работоспособности группы не представляю возможности

чтооо?

еще раз, добавьте дебаг, и сразу увидите в чем проблема

Не понимаю о чём вы.
Старый 31.12.2013, 02:07
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
Старый 31.12.2013, 02:09
Ghostlolka3

offline
Опыт: 142
Активность:
Цитата:
Сообщение от Hate
http://xgm.ru/p/wc3/debugging

Я всё это уже делал.
Старый 31.12.2013, 02:28
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
....и?
Старый 31.12.2013, 02:30
Borodach

offline
Опыт: 5,837
Активность:
Ghostlolka3, после локальных переменных, проверь cообщением чему равно сount
Старый 31.12.2013, 02:39
Ghostlolka3

offline
Опыт: 142
Активность:
Цитата:
Сообщение от Hate
....и?

Если убрать булехпр, то моя стрела взорвётся и нанесёт урон мне сразу. Иначе юниты в группу то ли не добавляются то ли что.

Ghostlolka3 добавил:
Цитата:
Сообщение от Borodach
~Ghostlolka3, после локальных переменных, проверь cообщением чему равно сount

Проверял. Пока идёт цикл уменьшается от 30 до 0.
Старый 31.12.2013, 02:50
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
тоесть вы не додумались что проблема в фильтре. и не додумались поудалять условия что бы локализовать проблему. и не нашли таким способом что гет триггер юнит в кондишене (там вообще должен быть фильтр, а у вас кондишн, что вы тоже могли сами узнать если не писали тут и ждали, а сами проверили) является нулл
Старый 31.12.2013, 02:59
Ghostlolka3

offline
Опыт: 142
Активность:
Цитата:
Сообщение от Hate
тоесть вы не додумались что проблема в фильтре. и не додумались поудалять условия что бы локализовать проблему. и не нашли таким способом что гет триггер юнит в кондишене (там вообще должен быть фильтр, а у вас кондишн, что вы тоже могли сами узнать если не писали тут и ждали, а сами проверили) является нулл

Как раз таки я его и проверял. Менял енеми на no ally, но всё равно я что-то не понимаю как этот кондишн работает и почему, как вы говорите, он даёт нулл. Оставив лишь
Код:
IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()), GetOwningPlayer(GetFilterUnit())) and not IsUnitType(GetFilterUnit(), UNIT_TYPE_FLYING)
, что для меня смотрится как: добавлять в группу только врагов и не летающих. Всё смотрится логично и как раз подходит мне. Что не так? Помогите с разъяснением.

И всё таки, что мне нужно убрать\заменить чтобы группа формировалась?
Старый 31.12.2013, 03:05
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
Hate:
и не нашли таким способом что гет триггер юнит в кондишене (там вообще должен быть фильтр, а у вас кондишн, что вы тоже могли сами узнать если не писали тут и ждали, а сами проверили) является нулл
Старый 31.12.2013, 03:06
Borodach

offline
Опыт: 5,837
Активность:
Ghostlolka3, В Spear_Filter TriggerUnit уже не используется, так как вызван таймером, а не событием.
IsPlayerEnemy(GetOwningPlayer(LoadUnitHandle(udg_Hash,GetHandleId(GetExpiredTimer()),1)), GetOwningPlayer(GetFilterUnit())) замени и будет работать
Старый 31.12.2013, 03:07
Ghostlolka3

offline
Опыт: 142
Активность:
Ох уж эти зоны видимости :>
Borodach, Hate, Спасибо Вам большое!
Старый 31.12.2013, 03:16
Ответ

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

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

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

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



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