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

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

Ответ
 
Redok

offline
Опыт: 2,249
Активность:
Проблема выполнения
Цитата:
function Trig_Rasengan7_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A00D' ) ) then
return false
endif
if ( not ( GetUnitTypeId(GetSpellTargetUnit()) == 'H000' ) ) then
return false
endif
return true
endfunction

function Trig_Rasengan7_Actions takes nothing returns nothing
local unit rasengan_unitspelling
local unit rasengan_unitspelled
set rasengan_unitspelling=GetSpellAbilityUnit()
call PauseUnitBJ( true, rasengan_unitspelling )
call SetUnitAnimationByIndex( rasengan_unitspelling, 6 )
call PolledWait( 0.50 )
call SetUnitTimeScalePercent( rasengan_unitspelling, 0.00 )
set rasengan_unitspelled = GroupPickRandomUnit(GetUnitsOfTypeIdAll('H001'))
call UnitAddAbilityBJ( 'Aloc', rasengan_unitspelled )
call IssueImmediateOrderBJ( rasengan_unitspelled, "stop" )
call SetUnitFacingToFaceUnitTimed( rasengan_unitspelled, rasengan_unitspelling, 0 )
call IssuePointOrderLocBJ( rasengan_unitspelled, "move", GetUnitLoc(rasengan_unitspelling) )
call SetUnitFacingToFaceUnitTimed( rasengan_unitspelling, rasengan_unitspelled, 0 )
call PolledWait( ( ( DistanceBetweenPoints(GetUnitLoc(rasengan_unitspelled), GetUnitLoc(rasengan_unitspelling)) - 200.00 ) / GetUnitMoveSpeed(rasengan_unitspelled) ) )
call IssueImmediateOrderBJ( rasengan_unitspelled, "stop" )
call SetUnitAnimationByIndex( rasengan_unitspelled, 2 )
call PlaySoundAtPointBJ( gg_snd_StartRasengan1, 100, GetUnitLoc(rasengan_unitspelling), 0 )
call PolledWait( 0.50 )
call PlaySoundAtPointBJ( gg_snd_StartRasengan1, 100, GetUnitLoc(rasengan_unitspelling), 0 )
call PolledWait( 0.50 )
call ResetUnitAnimation( rasengan_unitspelled )
call SetUnitAnimationByIndex( rasengan_unitspelled, 2 )
call PlaySoundAtPointBJ( gg_snd_StartRasengan1, 100, GetUnitLoc(rasengan_unitspelling), 0 )
call PolledWait( 0.50 )
call PlaySoundAtPointBJ( gg_snd_StartRasengan1, 100, GetUnitLoc(rasengan_unitspelling), 0 )
call PolledWait( 0.50 )
call ResetUnitAnimation( rasengan_unitspelled )
call SetUnitAnimationByIndex( rasengan_unitspelled, 2 )
call PlaySoundAtPointBJ( gg_snd_StartRasengan1, 100, GetUnitLoc(rasengan_unitspelling), 0 )
call PolledWait( 0.50 )
call PlaySoundAtPointBJ( gg_snd_StartRasengan1, 100, GetUnitLoc(rasengan_unitspelling), 0 )
call PolledWait( 0.50 )
call ResetUnitAnimation( rasengan_unitspelled )
call PlaySoundAtPointBJ( gg_snd_RasenganEnd, 100, GetUnitLoc(rasengan_unitspelling), 0 )
call AddSpecialEffectTargetUnitBJ( "right hand", rasengan_unitspelling, "Abilities\\Weapons\\FrostWyrmMissile\\FrostWyrmMissile.mdl" )
call SetPlayerAbilityAvailableBJ( false, 'A00D', GetOwningPlayer(rasengan_unitspelling) )
call rasengan_level_abillity(rasengan_unitspelling, rasengan_unitspelling)
set udg_rasengan_e = GetLastCreatedEffectBJ()
call UnitRemoveAbilityBJ( 'Aloc', rasengan_unitspelled )
call PolledWait( 1.00 )
call SetUnitTimeScalePercent( rasengan_unitspelling, 100.00 )
call PauseUnitBJ( false, rasengan_unitspelling )
call ResetUnitAnimation( rasengan_unitspelling )
set rasengan_unitspelled = null
set rasengan_unitspelling=null
endfunction

//===========================================================================
function InitTrig_Rasengan7 takes nothing returns nothing
set gg_trg_Rasengan7 = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Rasengan7, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Rasengan7, Condition( function Trig_Rasengan7_Conditions ) )
call TriggerAddAction( gg_trg_Rasengan7, function Trig_Rasengan7_Actions )
endfunction

Слушайте в чём проблема, этот код ведёт себя очень странно. Смысл такой, я вызываю юнитов, переменная rasengan_unitspelled выбирает случайного юнита из группы вызывах юнитов, после чего я делаю способность rasengan юнит всё делает правильно, после чего когда они умерают или истекает срок их действия, я вызваю новых юнитов, и делаю опять rasengan, то переменная rasengan_unitspelled выбирает того же мёртвого юнита, а должна выбрать только из живых !
Старый 11.06.2008, 12:33
dk

offline
Опыт: 60,293
Активность:
Скорее всего это происходит из-за того что, при стандартных настройках умершие юниты еще какое-то время хранятся в памяти вара и с ними можно производить действия, а выбираешь ты юнитов по типу и никакой проверки на то что юнит живой нет... А выбирается один и тот же мб потому что у тебя в настройках вара фиксированный рандом
Цитата:
2.14 У меня проблема: Я сделал триггер в котором каждые 5 секунд генерируются случайное число. Но каждый раз когда я запускаю карту последовательность этих чисел всегда одинаковая. Например 78,62,29,6... Как сделать, чтобы каждый раз генерировались разные числа?
Файл=> Параметры=> Проверка карты=> Фиксировать случайный разброс - уберите галочку напротив данного параметра.


Ну и вобще криво написан спелл, такое обилие поледвайтов и бж функции...
Цитата:
call UnitRemoveAbilityBJ( 'Aloc', rasengan_unitspelled )

Насколько я помню, алок нельзя ремувнуть просто так...
Старый 11.06.2008, 15:56
Redok

offline
Опыт: 2,249
Активность:
Я знаю что криво, ведь я в JASS не сильно шарю и не умею оптимезировать. И почему они хранятся, если в конце функции я обнуляю локалки ?
Кстати вот я хочу узнать каким образом удалить aloc ? может это уже оффтоп, но всё таки я уже от безысходности, не знаю что мне с этим делать и решил оставить =) но всё таки всеравно прилдётся решать и эту проблему
Насчёт разных выборов спасиба, а вообще всеравно моя трабла не решилась !
Старый 11.06.2008, 16:14
dk

offline
Опыт: 60,293
Активность:
Цитата:
GroupPickRandomUnit(GetUnitsOfTypeIdAll('H001'))

Этим действием ты выбираешь случайного юнита из всех юнитов на карте типа 'H001'... А умершие юниты некоторое время продолжают находится на карте) А обнуляя локалки юнитов-то ты не удаляешь...
Попробуй добавить в карту такой триггер:
Код:
Events:
 Unit owned by (Игрок, управляемый компом)
 Unit owned by (Его противник, тоже управляемый компом)
Conditions:
 (Dying Unit) is a Building equal to false
 (Dying Unit) is a Hero equal to false
Actions:
Unit – Remove (Dying Unit)

Не могу вспомнить нормальный способ удаления умерших юнитов, поэтому попробуй триггером...

Отредактировано dk, 13.06.2008 в 11:19.
Старый 11.06.2008, 16:25
Redok

offline
Опыт: 2,249
Активность:
Слушай а может просто Unit – Remove (Dying Unit) добавить в конец моего кода и всё ? )))
только прописать вот так Unit – Remove (rasengan_unitspelled)
Старый 11.06.2008, 16:58
dk

offline
Опыт: 60,293
Активность:
Цитата:
Unit – Remove (rasengan_unitspelled)

Можно наверное, смотря что ты хочешь) При добавлении такого действия у тебя по оканчании действия триггера юнит "rasengan_unitspelled" будет просто исчезать, а значит повторно его триггер уже не выберет
Цитата:
а должна выбрать только из живых

Но в этом тебе не поможет...
Старый 13.06.2008, 11:20
Ответ

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

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

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

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



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