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

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

Ответ
 
0pJl9lTa

offline
Опыт: 3,397
Активность:
Вылетает варик при этом
Код:
call TriggerRegisterUnitEvent( datr, tar, EVENT_UNIT_DAMAGED )

Где tar = GetSpellTargetUnit()
если вместо него ставить null то все ок.
datr - локальный триг, создаваемый при касте спела.
Как править?
Старый 28.03.2006, 00:36
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
0pJl9lTa, вопрос может ламовский, но ты все переменные объявил != null выше этого действия? У меня такого косяка не было (оно и понятно, я в Джассе 2-ой ень :)). Вообще, выложи сам код, в 50% ошибка сидит не в косяке близзофф, а в самом построении.
Старый 28.03.2006, 08:17
NETRAT

offline
Опыт: 83,712
Активность:
0pJl9lTa очевидно что tar на самом деле не является юнитом. Для проверки поставь вместо этой строки вывод имени юнита tar - TEXT("Noau:"+GetUnitName(tar)) тут может быть два варианта - либо ты используешь не ту функцию то есть GetSpellTargetUnit() возможно не для того триггера(банально, но такое бывает), либо это глюк, но не функции TriggerRegisterUnitEvent
Старый 28.03.2006, 09:01
0pJl9lTa

offline
Опыт: 3,397
Активность:
NETRAT Самый прикол, если вместе "tar" поставить "cas" то все работает :)
Час погляжу

0pJl9lTa добавил:
Вот весь код... все равно вылетает
Код:
function Trig_Dark_label_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A03J'
endfunction

function label_Conditions takes nothing returns boolean
    return GetEventDamageSource() == I2U(GetStoredInteger(udg_Cashe,I2S(H2I(GetTriggeringTrigger() ) ), "cas" ))
endfunction

function label_Actions takes nothing returns nothing
    local real r = GetEventDamage()
    local unit cas = I2U(GetStoredInteger(udg_Cashe,I2S(H2I(GetTriggeringTrigger() ) ), "cas" ))
    local unit tar = I2U(GetStoredInteger(udg_Cashe,I2S(H2I(GetTriggeringTrigger() ) ), "tar" ))
    set r = (r*(33.3* I2R(GetUnitAbilityLevelSwapped('A03J', cas)) ) )/100
    call UnitDamageTargetBJ( cas, tar, r, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )
    call EffToUn ("Abilities\\Spells\\NightElf\\ManaBurn\\ManaBurnTarget.mdl", tar, "chest", 1.5)
    set r = 0
    set cas = null
    set tar = null
endfunction

function Trig_Dark_label_Actions takes nothing returns nothing
    local unit tar = GetSpellTargetUnit()
    local unit cas = GetSpellAbilityUnit()
    local trigger label = CreateTrigger()
    call StoreInteger (udg_Cashe, I2S(H2I(label)), "cas", H2I(cas))
    call StoreInteger (udg_Cashe, I2S(H2I(label)), "tar", H2I(tar))
    call TriggerRegisterUnitEvent( label, I2U (GetStoredInteger(udg_Cashe,I2S(H2I(label) ), "tar" )), EVENT_UNIT_DAMAGED )
    call TriggerAddCondition( label, Condition( function label_Conditions ) )
    call TriggerAddAction( label, function label_Actions )
    call PolledWait (GetRandomReal(10,20))
    set cas = null
    set tar = null
    call FlushStoredMission (udg_Cashe,I2S(H2I(label)))
    call DestroyTrigger (label)
    set label = null
endfunction
Старый 28.03.2006, 11:58
NETRAT

offline
Опыт: 83,712
Активность:
0pJl9lTa ничего удивительного - у тебя наверняка абила без указания цели, напиши вот так
Код:
function Trig_Dark_label_Actions takes nothing returns nothing
    local unit tar = GetSpellTargetUnit()
    local unit cas = GetSpellAbilityUnit()
    local trigger label = CreateTrigger()
    call DisplayTextToPlayer(GetLocalPlayer(),"Target name is "+GetUnitName(tar)+" caster name is "+GetUnitName(cas))
    call StoreInteger (udg_Cashe, I2S(H2I(label)), "cas", H2I(cas))
    call StoreInteger (udg_Cashe, I2S(H2I(label)), "tar", H2I(tar))
    call TriggerRegisterUnitEvent( label, I2U (GetStoredInteger(udg_Cashe,I2S(H2I(label) ), "tar" )), EVENT_UNIT_DAMAGED )
    call TriggerAddCondition( label, Condition( function label_Conditions ) )
    call TriggerAddAction( label, function label_Actions )
    call PolledWait (GetRandomReal(10,20))
    set cas = null
    set tar = null
    call FlushStoredMission (udg_Cashe,I2S(H2I(label)))
    call DestroyTrigger (label)
    set label = null
endfunction
Я думаю что сразу все станет понятно

NETRAT добавил:
call PolledWait (GetRandomReal(10,20)) фи, как некрасиво - во-первых дурацкое ожидание, лучше тогда возьми TriggerSleepAction если уж очень нужно вешать этот поток, во-вторых рандом для real - где не надо рандом лучше не использовать - это математически достаточно сложная функция, жрет цп

NETRAT добавил:
и вот эти H2I(label) лучше занеси заранее в локалку - это же неудобно и неоптимально
Старый 28.03.2006, 12:09
0pJl9lTa

offline
Опыт: 3,397
Активность:
NETRAT спел с указанием цели на основе Forked Lightning (разветвелнной молнии)
Да, насчетп полед ваейте чуток ступил )

эээ в твоем варианте ниче кроме строчки не добавилось... а как она может повлиять??
Старый 28.03.2006, 13:04
NETRAT

offline
Опыт: 83,712
Активность:
0pJl9lTa что выводит на экран эта строка? [Test InGame]
проверим для начала что выдает функция GetSpellTargetUnit() то есть выведем на экран имя юнита в переменной tar

То есть закомменти ту строчку, которая вылетает и проверь что выводит на экран это сообщение

NETRAT добавил:
Оптимизация твоего триггера выглядет примерно так:
Код:
function Trig_Dark_label_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A03J'
endfunction

function label_Actions takes nothing returns nothing
    local trigger t = GetTriggeringTrigger()
    local integer it = H2I(t)
    local unit cas = I2U(GetStoredInteger(udg_Cashe,I2S(it), "cas" ))
    local unit tar = I2U(GetStoredInteger(udg_Cashe,I2S(it), "tar" ))
    if GetEventDamageSource() == cas then
        call UnitDamageTarget( cas, tar, (GetEventDamage()*(33.3* I2R(GetUnitAbilityLevelSwapped('A03J', cas)) ) )/100,true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
        call EffToUn ("Abilities\\Spells\\NightElf\\ManaBurn\\ManaBurnTarget.mdl", tar, "chest", 1.5)
    endif
    call FlushStoredMission (udg_Cashe,I2S(it))
    call DestroyTrigger(t)
    set cas = null
    set tar = null
endfunction

function Trig_Dark_label_Actions takes nothing returns nothing
    local unit tar = GetSpellTargetUnit()
    local unit cas = GetSpellAbilityUnit()
    local integer itar = H2I(tar)
    local integer icas = H2I(cas)
    local trigger label = CreateTrigger()
    local integer ilabel = H2I(label)
    call StoreInteger (udg_Cashe, I2S(ilabel), "cas", icas)
    call StoreInteger (udg_Cashe, I2S(ilabel), "tar", itar)
    call TriggerRegisterUnitEvent( label, tar, EVENT_UNIT_DAMAGED )
    call TriggerAddAction( label, function label_Actions )
    set cas = null
    set tar = null
    set label = null
endfunction
Старый 28.03.2006, 13:53
0pJl9lTa

offline
Опыт: 3,397
Активность:
Ты думаешь твой вариант не будет вылетать???
Час попробую... а вообще странное дело, всего один String и игра не вылетает... хм...

0pJl9lTa добавил:
Кстати скрипт твой совершено под мой спел не подходит. Там после первого получения даага триг выключаеца, и ниче не делается.
Кроме того зачем ты проверку убрал??? Вернее вставил ее в действия. Вот эти строки
Код:
local trigger t = GetTriggeringTrigger()
    local integer it = H2I(t)
    local unit cas = I2U(GetStoredInteger(udg_Cashe,I2S(it), "cas" ))
    local unit tar = I2U(GetStoredInteger(udg_Cashe,I2S(it), "tar" ))

Будут выполняеться зря очень много раз... зачем это нада???
Еще ты локалку t не обнулил :-P
Старый 28.03.2006, 16:52
NETRAT

offline
Опыт: 83,712
Активность:
0pJl9lTa для полной оптимизации нужно знать весь триггер, локалку обнулить забыл(или забил?)
Поверь, это
Код:
local unit cas = I2U(GetStoredInteger(udg_Cashe,I2S(H2I(GetTriggeringTrigger() ) ), "cas" ))
    local unit tar = I2U(GetStoredInteger(udg_Cashe,I2S(H2I(GetTriggeringTrigger() ) ), "tar" ))

Намного хуже чем это
Код:
local integer it = H2I(t)
    local unit cas = I2U(GetStoredInteger(udg_Cashe,I2S(it), "cas" ))
    local unit tar = I2U(GetStoredInteger(udg_Cashe,I2S(it), "tar" ))

Ага, я просто немного не понял когда он должен был выключаться
Старый 28.03.2006, 19:48
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
NETRAT, каким образом в варе определяется рандом? Где можно просмотреть сам код функции?
Код:
local integer it = H2I(t)
Действительно удобнее, минус один вызов функции H2I в данном случае
Старый 29.03.2006, 08:26
NETRAT

offline
Опыт: 83,712
Активность:
FellGuard датчик(генератор базовой случайной величины) Маклорена-Марсальи, сам код никак не посмотришь
Старый 29.03.2006, 23:25
0pJl9lTa

offline
Опыт: 3,397
Активность:
Ответ довольно простой и глупый. Действие = событие. Т.е. наносится дамаг и сразу по нему наностся еще дамаг... а там еще.. и еще... и вылетает )
вот.
Старый 02.04.2006, 21:09
Markiz

offline
Опыт: 11,432
Активность:
:rofl:
у мну нет слов. нетрат тут насоветовал всего,а тут на тебе :D
Старый 02.04.2006, 23:05
0pJl9lTa

offline
Опыт: 3,397
Активность:
Markiz Да, я тоге долго улыбался :)
Старый 03.04.2006, 10:16
NETRAT

offline
Опыт: 83,712
Активность:
:lol: в любом случае дело говорил =)
Старый 03.04.2006, 18:17
0pJl9lTa

offline
Опыт: 3,397
Активность:
NETRAT неа, упрощение скрипта нифига не упращение :)
лана забыли.. но ваще тупо :D
Старый 03.04.2006, 18:41
NETRAT

offline
Опыт: 83,712
Активность:
Просто попрактикуйся в этом, возможно тебе кажется что это сложнее или хуже или некрасиво, но это обычный процесс оптимизации, вполне очевидный для кодера. Что именно тебе не понравилось в моих методах?
Старый 04.04.2006, 00:17
tysch_tysch
Работаем
offline
Опыт: отключен
оффтопик: нт считает себя уберсупер кодером?=)
Старый 04.04.2006, 00:21
NETRAT

offline
Опыт: 83,712
Активность:
Есть вещи, которые просто очевидны, например, зачем писать
set a = MegaFunction()
set b = Megafunction()
если можно написать
set a = MegaFunction()
set b = a

я просто хочу им стать, но до Алексея мне еще далеко

NETRAT добавил:
Я не страдаю завышенной самооценкой, обычно наоборот =)
Старый 04.04.2006, 01:53
0pJl9lTa

offline
Опыт: 3,397
Активность:
В твоем случае ничего.
А вот допустим
local group gr = CreateGroup ()
local group gr2 = gr
Большая разница...
И вообще, зачем создавать лишние локалки если моно обойтись без них??? А потом еще и обнулять... жуть
Старый 04.04.2006, 12:13
Ответ

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

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

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

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



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