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

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

Ответ
 
Dreii
define{name=Dreii age=17}
offline
Опыт: 5,246
Активность:
Некорректно работает код
Вот код(как засунуть под спойлер хз)
Код:
function Trig_fire_Timer takes nothing returns nothing 
     local timer t=GetExpiredTimer() 
     local group g=CreateGroup() 
     local integer ID=GetHandleId(t) 
     local unit e 
     local unit u=LoadUnitHandle(udg_Hash,ID,0) 
     local integer c=LoadInteger(udg_Hash,ID,1)-1 
     local real dmg=GetHeroInt(u,true)*GetUnitAbilityLevel(u,'A001')*2 
     local texttag txt 
     local player p=GetOwningPlayer(u) 
     call GroupEnumUnitsInRange(g,GetWidgetX(u),GetWidgetY(u),750,null) 
     loop 
         set e=FirstOfGroup(g) 
         exitwhen e==null 
         if c==0 or GetWidgetLife(e)<=.0 then 
         call PauseTimer(t) 
         call DestroyTimer(t)  
         call FlushChildHashtable(udg_Hash,ID) 
         else 
         call SaveInteger(udg_Hash,ID,1,c) 
         if GetRandomInt(1,100)<=5 then 
         call SetHeroInt(u,GetHeroInt(u,true)+1,true) 
         call SetHeroInt(e,GetHeroInt(e,true)-1,true) 
         endif 
         endif 
         if IsUnitEnemy(e,p) and GetWidgetLife(e)>.0 then 
             call UnitDamageTarget(u,e,dmg,true,false,ATTACK_TYPE_HERO,DAMAGE_TYPE_FIRE,WEAPON_TYP  E_WHOKNOWS) 
             set txt = CreateTextTag() 
             call SetTextTagText(txt,"|c00C80000" +I2S(R2I(dmg)),.023) 
             call SetTextTagPosUnit(txt,e,0.) 
             call SetTextTagColor(txt,255,0,0,255) 
             call SetTextTagVelocity(txt,.001,.03) 
             call SetTextTagFadepoint(txt,.75) 
             call SetTextTagLifespan(txt,1.5) 
             call SetTextTagPermanent(txt,false) 
             call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl",e,"chest")) 
             call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Human\\FlameStrike\\FlameStrikeTarget.mdl",e,"orign")) 
             endif 
         call GroupRemoveUnit(g,e) 
         endloop 
     call DestroyGroup(g) 
     set g=null 
     set u=null 
     set t=null 
     set p=null 
     set txt=null 
endfunction 
function Trig_fire_Actions takes nothing returns nothing 
     local timer t 
     local integer ID 
     if GetSpellAbilityId()=='A001' then 
         set t=CreateTimer() 
         set ID=GetHandleId(t) 
         call SaveUnitHandle(udg_Hash,ID,0,GetSpellAbilityUnit()) 
         call SaveInteger(udg_Hash,ID,1,5) 
         call TimerStart(t,1.,true,function Trig_fire_Timer) 
           set t = null 
     endif 
   endfunction 
function InitTrig_fire takes nothing returns nothing 
     local integer i=0 
     set gg_trg_fire=CreateTrigger() 
     loop 
         call TriggerRegisterPlayerUnitEvent(gg_trg_fire,Player(i),EVENT_PLAYER_UNIT_SPELL_EFF  ECT,null) 
       set i= i+1 
         exitwhen i==11 
     endloop 
      set udg_Hash=InitHashtable() 
     call TriggerAddAction(gg_trg_fire, function Trig_fire_Actions ) 
endfunction


Суть:Герой применяет заклинания и в диапазоне от кастера пикаються юниты. И каждому пикнутому юниту наноситься удар огнем.Импульсов 5 с переодичностью 1 секунда.
Работает все хорошо,но когда применяеш заклинание второй раз, импульс только один.
Старый 18.01.2011, 21:46
Hanabishi
COOL STATUS
offline
Опыт: отключен
код абсолютно рабочий сколько угодно раз (проверил)
Старый 18.01.2011, 22:12
Dreii
define{name=Dreii age=17}
offline
Опыт: 5,246
Активность:
Hanabishi, странно у мня первый раз все ок а потом по 1 разу тока,и еще те кто скачивал тоже жаловались
Старый 18.01.2011, 22:34
Hanabishi
COOL STATUS
offline
Опыт: отключен
может внешнее влияние?
прикладываю карту я туда твой код скопировал и пашет всё норм
Hanabishi добавил:
ха я вот сейчас проверял много раз, действительно иногда выкидывает меньшее количество!
Hanabishi добавил:
но код абсолютно верный непонимаю в чём дело
Прикрепленные файлы
Тип файла: w3x 1.w3x (20.0 Кбайт, 10 просмотров )
Старый 18.01.2011, 22:44
Dreii
define{name=Dreii age=17}
offline
Опыт: 5,246
Активность:
твоя работает,возможно из-за способности вот смотри карту

Dreii добавил:
можно конечно добавить абилку и убрать,но не думаю что из-за способности стандартной такое
Прикрепленные файлы
Тип файла: w3x FireFXD.w3x (20.7 Кбайт, 7 просмотров )
Старый 18.01.2011, 23:05
J64_

offline
Опыт: 4,724
Активность:
Может из-за того, что ты дестришь таймер в цикле, который в некоторых случаях может выполниться, т.е. выйдет сразу при кол-ве юнитов 0. -> таймер остается, вся беда.
Вывод: перед циклом проверяй переменную.
Также используй глобальную группу. А не создавай и разрушай каждый раз.
[+] замечание от alexkill: 1.2 (учим русский язык)

Отредактировано alexkill, 19.01.2011 в 12:53.
Старый 19.01.2011, 00:18
Dreii
define{name=Dreii age=17}
offline
Опыт: 5,246
Активность:
AdamanTX, ничего не понял

Dreii добавил:
какую
Цитата:
Сообщение от AdamanTX
перед циклом проверяй переменную.
?
Старый 19.01.2011, 14:24
Hanabishi
COOL STATUS
offline
Опыт: отключен
Dreii, я понял, спелл прекращается если любой из юнитов попавших под каст умирает
вот так переделай
function Trig_fire_Timer takes nothing returns nothing 
    local timer t=GetExpiredTimer() 
    local group g=CreateGroup() 
    local integer ID=GetHandleId(t) 
    local unit e 
    local unit u=LoadUnitHandle(udg_Hash,ID,0) 
    local integer c=LoadInteger(udg_Hash,ID,1)-1 
    local real dmg=GetHeroInt(u,true)*GetUnitAbilityLevel(u,'A001')*2 
    local texttag txt 
    local player p=GetOwningPlayer(u) 
    call GroupEnumUnitsInRange(g,GetWidgetX(u),GetWidgetY(u),750,null) 
    loop 
        set e=FirstOfGroup(g) 
        exitwhen e==null
        if IsUnitEnemy(e,p) and GetWidgetLife(e)>.0 then 
            call UnitDamageTarget(u,e,dmg,true,false,ATTACK_TYPE_HERO,DAMAGE_TYPE_FIRE,WEAPON_TYPE_WHOKNOWS) 
            set txt = CreateTextTag() 
            call SetTextTagText(txt,"|c00C80000" +I2S(R2I(dmg)),.023) 
            call SetTextTagPosUnit(txt,e,0.) 
            call SetTextTagColor(txt,255,0,0,255) 
            call SetTextTagVelocity(txt,.001,.03) 
            call SetTextTagFadepoint(txt,.75) 
            call SetTextTagLifespan(txt,1.5) 
            call SetTextTagPermanent(txt,false) 
            call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl",e,&qu​ot;chest")) 
            call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Human\\FlameStrike\\FlameStrikeTarget.​mdl",e,"orign")) 
        else
            if GetRandomInt(1,100)<=5 then 
                call SetHeroInt(u,GetHeroInt(u,true)+1,true) 
                call SetHeroInt(e,GetHeroInt(e,true)-1,true) 
            endif 
        endif
        call GroupRemoveUnit(g,e) 
    endloop 
    call DestroyGroup(g)
    if c==0 then 
        call PauseTimer(t) 
        call DestroyTimer(t)  
        call FlushChildHashtable(udg_Hash,ID) 
    else 
        call SaveInteger(udg_Hash,ID,1,c) 
    endif 
    set g=null 
    set u=null 
    set t=null 
    set p=null 
    set txt=null 
endfunction

function Trig_fire_Actions takes nothing returns nothing 
    local timer t 
    local integer ID 
    if GetSpellAbilityId()=='A001' then 
        set t=CreateTimer() 
        set ID=GetHandleId(t) 
        call SaveUnitHandle(udg_Hash,ID,0,GetSpellAbilityUnit()) 
        call SaveInteger(udg_Hash,ID,1,5) 
        call TimerStart(t,1.,true,function Trig_fire_Timer) 
        set t = null 
    endif 
endfunction

function InitTrig_fire takes nothing returns nothing 
    local integer i=0 
    set gg_trg_fire=CreateTrigger() 
    loop 
        call TriggerRegisterPlayerUnitEvent(gg_trg_fire,Player(i),EVENT_PLAYER_UNIT_SPELL_EFFECT,null) 
    set i= i+1 
        exitwhen i==11 
    endloop 
    set udg_Hash=InitHashtable() 
    call TriggerAddAction(gg_trg_fire, function Trig_fire_Actions ) 
endfunction

Отредактировано Hanabishi, 19.01.2011 в 14:50.
Старый 19.01.2011, 14:30
Dreii
define{name=Dreii age=17}
offline
Опыт: 5,246
Активность:
Hanabishi,мм и что ты испарвил?)
Старый 19.01.2011, 14:34
Hanabishi
COOL STATUS
offline
Опыт: отключен
if c==0 then 
    call PauseTimer(t) 
    call DestroyTimer(t)  
    call FlushChildHashtable(udg_Hash,ID) 
else 
    call SaveInteger(udg_Hash,ID,1,c) 
endif 
вынес из цикла
Старый 19.01.2011, 14:47
J64_

offline
Опыт: 4,724
Активность:
И вообще прохождение по группе через цикл плохая идея, в плане оптимизации. Лучше через condition'ы. И используй глобальную группу.
Старый 19.01.2011, 16:41
Ответ

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

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

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

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



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