Это спелл - Slash, наносит урон всем юнитам в радиусе удара. Задача кода - воспроизвести эффект рубящего удара и воспроизвести нужный звук. Вообщем код то работает, но эффекты нет.
function SlashEffect takes nothing returns nothing local timer t = GetExpiredTimer() local integer id = GetHandleId(t) local unit u = LoadUnitHandle(udg_Hash, id, 0) local effect e = LoadEffectHandle(udg_Hash, id, 1) local location p = LoadLocationHandle(udg_Hash, id, 2) local real a = LoadReal(udg_Hash, id, 3) local real s = LoadReal(udg_Hash, id, 4) local real r = 15.00 local integer i = 1
if ( IsUnitAliveBJ(u) == true ) then call DestroyEffect( AddSpecialEffectLoc( "Abilities\\Spells\\Other\\Volcano\\VolcanoDeath.mdl", PolarProjectionBJ(p, 125.00, a) ) ) loop exitwhen i > 6 call DestroyEffect( AddSpecialEffectLoc( "Abilities\\Spells\\Other\\Volcano\\VolcanoDeath.mdl", PolarProjectionBJ(p, 125.00, ( a + r )) ) ) call DestroyEffect( AddSpecialEffectLoc( "Abilities\\Spells\\Other\\Volcano\\VolcanoDeath.mdl", PolarProjectionBJ(p, 125.00, ( a - r )) ) ) set r = r + 11.00 set i = i + 1 endloop endif
set t = null set e = null set p = null set u = null endfunction
function Trig_Slash_Actions takes nothing returns nothing local timer t = CreateTimer() local integer id = GetHandleId(t) local unit u = GetSpellAbilityUnit() local location p1 = GetUnitLoc(u) local location p2 = GetSpellTargetLoc() local real s = GetUnitDefaultMoveSpeed(u) local real a = AngleBetweenPoints(p1, p2) local effect e = AddSpecialEffectTarget( "Abilities\\Weapons\\PhoenixMissile\\Phoenix_Missile_mini.mdl", u, "weapon" )
call SetUnitMoveSpeed( u, 0.00 ) call SetUnitFacingToFaceLocTimed( u, p2, 0 ) call RemoveLocation(p1) call SaveAgentHandle(udg_Hash, id, 0, u) call SaveAgentHandle(udg_Hash, id, 1, e) call SaveAgentHandle(udg_Hash, id, 2, p1) call SaveReal(udg_Hash, id, 3, a) call SaveReal(udg_Hash, id, 4, s) call TimerStart( t, 0.40, false, function SlashEffect ) set t = null set u = null set p1 = null set p2 = null set e = null endfunction
//=========================================================================== function InitTrig_Slash takes nothing returns nothing set gg_trg_Slash = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Slash, EVENT_PLAYER_UNIT_SPELL_CHANNEL ) call TriggerAddCondition( gg_trg_Slash, Condition( function Trig_Slash_Conditions ) ) call TriggerAddAction( gg_trg_Slash, function Trig_Slash_Actions ) endfunction
Не работает вот эта часть
Code
if ( IsUnitAliveBJ(u) == true ) then call DestroyEffect( AddSpecialEffectLoc( "Abilities\\Spells\\Other\\Volcano\\VolcanoDeath.mdl", PolarProjectionBJ(p, 125.00, a) ) ) loop exitwhen i > 6 call DestroyEffect( AddSpecialEffectLoc( "Abilities\\Spells\\Other\\Volcano\\VolcanoDeath.mdl", PolarProjectionBJ(p, 125.00, ( a + r )) ) ) call DestroyEffect( AddSpecialEffectLoc( "Abilities\\Spells\\Other\\Volcano\\VolcanoDeath.mdl", PolarProjectionBJ(p, 125.00, ( a - r )) ) ) set r = r + 11.00 set i = i + 1 endloop endif
Щито это за втф?! Нах бж? IsUnitType(unit, UNIT_TYPE_DEAD)- это раз. Два- какие нах полярки? Ты чего?! Кодишь на жассе- уж будь добр используй координаты, а иначе какой смысл? И еще- не все эффекты работают, если их создавать в функе удаления
нет Ватсон, ложный след... Дело в том что автор сделал все на гуи потом конвертировал в текст и чтото мутит, а вскрытие показало что причину нерабочеих бжшек невозможно открыть изза неясных переменных a и r, а также изза нечитабельности кода в целом.
Холмс, вы как всегда правы, но след не совсем ложный, ибо некоторые эффекты не срабатывают в функе удаления (у меня так через раз работал столб огня Келя). Ну а насчет кода- да, согласен, это ужасно... мои глаза вытекли, когда прочиталь код полностью... вот полностью рабочий код:
Code
function Trig_Slash_Timer takes nothing returns nothing local timer t = GetExpiredTimer() local integer id = GetHandleId(t) local unit u = LoadUnitHandle(udg_Hash, id, 0) local real angle = LoadReal(udg_Hash, id, 2) local real r = 15. local real x local real y local integer i = 0 set x = GetWidgetX(u) + 125. * Cos(angle) set y = GetWidgetY(u) + 125. * Sin(angle) call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Volcano\\VolcanoDeath.mdl", x, y)) loop exitwhen i > 5 call BJDebugMsg(I2S(i)) set x = GetWidgetX(u) + 125. * Cos(angle + r * .017) set y = GetWidgetY(u) + 125. * Sin(angle + r * .017) call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Volcano\\VolcanoDeath.mdl", x, y)) set x = GetWidgetX(u) + 125. * Cos(angle - r * .017) set y = GetWidgetY(u) + 125. * Sin(angle - r * .017) call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Volcano\\VolcanoDeath.mdl", x, y)) set r = r + 11. set i = i + 1 endloop call AttachSoundToUnit(gg_snd_MirrorImage, u) call SetSoundVolume(gg_snd_MirrorImage, 127) call StartSound(gg_snd_MirrorImage) call DestroyTimer(t) call DestroyEffect(LoadEffectHandle(udg_Hash, id, 1)) call PauseUnit(u, false) call FlushChildHashtable(udg_Hash, id) set t = null set u = null endfunction
function Trig_Slash_Conditions takes nothing returns boolean local timer t local integer id local unit u = GetTriggerUnit() local real angle = Atan2(GetSpellTargetY() - GetWidgetY(u), GetSpellTargetX() - GetWidgetX(u)) if GetSpellAbilityId() == 'AHtc' then set t = CreateTimer() set id = GetHandleId(t) call SaveUnitHandle(udg_Hash, id, 0, u) call SaveEffectHandle(udg_Hash, id, 1, AddSpecialEffectTarget("Abilities\\Weapons\\PhoenixMissile\\Phoenix_Missile_mini.mdl", u, "weapon")) call SaveReal(udg_Hash, id, 2, angle) call SetUnitFacing(u, 57.295 * angle) call PauseUnit(u, true) call TimerStart(t, .4, false, function Trig_Slash_Timer) endif set t = null set u = null return false endfunction
function InitTrig_Slash takes nothing returns nothing set gg_trg_Slash = CreateTrigger() call TriggerRegisterAnyUnitEventBJ(gg_trg_Slash, EVENT_PLAYER_UNIT_SPELL_EFFECT) call TriggerAddCondition(gg_trg_Slash, Condition(function Trig_Slash_Conditions)) endfunction
Всем спс. Свою ошибку я нашёл. Я пользовался точкой которую до этого удалил
Ty3uK, твой код работает? А то у меня вопрос по поводу паузы. У меня пауза подразумевается как отсрочка приказа. Например если юнит заюзал абилу, и сработала пауза, то после выхода их паузы юнит снова повторит приказ. И снова пауза. И снова приказ, который не успевает свершиться. Короче юнит застрял. Как работать с паузами, что бы например если юнит прыгает и наносит удар сверху, или производит какую то анимацию, то ему нельзя было дать другой приказ.
PauseUnit(твой юнит) блокирует передвежение, атаку, активные абилки но можно перемещать триггерно+ использовать дамми для эффектов да и SetUnitAnimation() ни кто не запрещает использовать на запаузенного юнита
Quote (FatalBlade)
Atan2
Quote
Это что?
в след раз посмотри в википедии, а потом спрашивай это функция берущая 2 значения(x,y) и возвращающая угол между точками (0,0) и (x,y) в радианах 1 градус = 0.017 радиан 360 градусов = 2Pi радиан = 3.14*2 радиан = 6.18 радиан x градусов = x*(180/Pi) радиан Pi = число пи = ~ 3.14
Добавлено (18 Ноябрь 2011, 16:10:34) --------------------------------------------- ну блеан!!! Ватсон! вечно пока я пишу длинный пост ты отвечешь до меня ты что там на телефоне каждую минуту смотришь нет ли апдейтов?????????
паузу поставил как альернативу установки скорости движения на 0
Ок. В принципе я сделал то же самое только наоборот Скорость на 0 как альтернатива паузе.
Quote (Hexing)
но можно перемещать триггерно+ использовать дамми для эффектов да и SetUnitAnimation() ни кто не запрещает использовать на запаузенного юнита
Знаю... Зачем дамми для эффектов? А как насчёт самих абилок? У меня юнит не успевает заюзать абилку и сразу уходит в паузу. При выходе их паузы он повторяет попытку кастануть абилку. В итоге - у юнита вечная пауза.
Сообщение отредактировал FatalBlade - Пятница, 18 Ноября 2011, 16:39:50
IssueTargetOrder()//твой каст TriggerSleepAction(0.)//подождем цикл всего кода+обработки ии приказов PauseUnit(u, true)//а теперь уже паузим и не надо рычать что какого фига триггер слип мол надо таймер, мне просто не хочется обьяснять про таймер и хэшь ибо это долго
Вообще ждать не надо, ибо событие "юнит тащит эффект заклинания" срабатывает тогда, когда кд спелла уже пошел
мм.. Но там помоему невозможно вычислить цель спелла
Quote (Hexing)
IssueTargetOrder()//твой каст TriggerSleepAction(0.)//подождем цикл всего кода+обработки ии приказов PauseUnit(u, true)//а теперь уже паузим и не надо рычать что какого фига триггер слип мол надо таймер, мне просто не хочется обьяснять про таймер и хэшь ибо это долго
Я пользуюсь таймерами а не TriggerSleepAction. И про хэш тоже знаю И приказы в качестве событий не использую, по той причине что их легко отменить.