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

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

Ответ
 
inhuman89

offline
Опыт: 3,019
Активность:
не работает действие
» Код
function DSsys_main_Actions takes nothing returns nothing
    local effect e
    local unit ut = GetTriggerUnit()
    local integer it = GetPlayerId(GetOwningPlayer(ut))+1
    local unit us = GetEventDamageSource()
    local integer is = GetPlayerId(GetOwningPlayer(us))+1
    local integer dmgI = R2I(GetEventDamage())
    local real dmgR = GetEventDamage()
    if (dmgR >= 0.60) and (IsUnitAliveBJ(ut) == true ) then
        if ((GetRandomInt(1, 100)<=(GetHeroStr(ut,true))+udg_GG_chanceBLCbonus[it])and(IsUnitType(ut,UNIT_TYPE_STRUCTURE)==fal​se)and(IsUnitType(ut,UNIT_TYPE_HERO)==true)and(GetUnitStateSwap(UNIT_STATE_LIFE,ut)<( GetUnitStateSwap(UNIT_STATE_MAX_LIFE,ut)-dmgR))) then
            // ===============   Block damage   ===============
            call PlaySoundOnUnitBJ(udg_DSsys_soundHIT[GetRandomInt(4,6)],100,ut)
            set e = AddSpecialEffectTarget( "Abilities\\Weapons\\WingedSerpentMissile\\WingedSerpentMissile.mdl" ,ut,"chest")
            call SetUnitLifeBJ(ut,(GetUnitStateSwap(UNIT_STATE_LIFE,ut)+dmgR))
            call TextTag ((GetUnitX(ut)-50), GetUnitY(ut),80,12, "|cFF00AAFF" , "<BLOCK>" ,"" )
        else
            if ((GetRandomInt(1, 100)<=(GetHeroAgi(us,true))+udg_GG_chanceCRTbonus[is])and(IsUnitType(ut,UNIT_TYPE_STRUCTURE)==fal​se)and(IsUnitType(us,UNIT_TYPE_HERO)==true)) then
                // ===============   Crit damage   ===============
                call PlaySoundOnUnitBJ(udg_DSsys_soundHIT[GetRandomInt(7,9)],100,us)
                set e = AddSpecialEffectTarget( "Abilities\\Spells\\Other\\Stampede\\StampedeMissileDeath.mdl" ,ut, "chest" )
                call DisableTrigger(gg_trg_DSsys_main)
                //НЕ РАБОТАЕТ СЛЕДУЮЮЩЕЕ ДЕЙСТАИЕ:
                call UnitDamageTarget(us,ut,dmgR,true,false,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_UNIVERSAL,WEAPON_TYPE_WHOKNOWS)​
                //НЕ РАБОТАЕТ ВЕРХНЕЕ ДЕЙСТВИЕ
                call EnableTrigger(gg_trg_DSsys_main)
                call TextTag ((GetUnitX(ut)-50),GetUnitY(ut),80,12, "|cFFFF0000-" ,I2S(dmgI*2), "!" )
            else
                // ===============   Normal damage   ===============
                call PlaySoundOnUnitBJ( udg_DSsys_soundHIT[GetRandomInt(1,3)],100,us)
                set e = AddSpecialEffectTarget( "Objects\\Spawnmodels\\Critters\\Albatross\\CritterBloodAlbatross.mdl", ut, "chest" )
                call TextTag ((GetUnitX(ut)-50), GetUnitY(ut),80,12, "|cFFD2D2D2-" ,I2S(dmgI), "" )
            endif
        endif
    else
    endif
    // ==================================================
    set ut = null
    set us = null
    call DestroyEffect(e)
    set e = null
endfunction

//===========================================================================
function InitTrig_DSsys_main takes nothing returns nothing
    set gg_trg_DSsys_main = CreateTrigger(  )
    call TriggerAddAction( gg_trg_DSsys_main, function DSsys_main_Actions )
endfunction
вобщем проблема такова: когда этот триггер бы в ГУИ, все работало, но после перевода его в жасс, перестало работать действие, отмеченное выше, причем тексттаг вылетает нужный а дамаг не наносится
помогите разобраться
Старый 26.08.2010, 16:27
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
call DisableTrigger(gg_trg_DSsys_main)
call UnitDamageTarget(us,ut,dmgR,true,false,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_UNIVERSAL,WEAPON_TYPE_WHOKNOWS)​&#8203;
call EnableTrigger(gg_trg_DSsys_main)
все эти танцы с бубном стирай
и ставь:
call SetWidgetLife(ut,GetWidgetLife(ut)-dmgR)
Код оптимизируй, и уберай бж на более практичные вещи
к примеру:
call SetUnitLifeBJ(ut,(GetUnitStateSwap(UNIT_STATE_LIFE,ut)+dmgR))
замени на
call SetWidgetLife(ut,GetWidgetLife(ut)+dmgR)
и код при таких действиях уменьшится в разы, и быстрее исполнятся будет, + легче писать =O
и виджет лайф(жизни всмысле) в переменную заноси дабы не высчитывать вару >1 раза
Старый 26.08.2010, 18:41
inhuman89

offline
Опыт: 3,019
Активность:
AlexKARASb:
call SetWidgetLife(ut,GetWidgetLife(ut)-dmgR)
а если это убьет юнита? кому печеньки пойдут?
Старый 26.08.2010, 18:43
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Событие юнит получает урон срабатывает перед нанесением урона.
Ты изменишь хп, а дальше урон сработает и все будет как часы.
Старый 26.08.2010, 18:44
inhuman89

offline
Опыт: 3,019
Активность:
AlexKARASb, ну чтож если так то спасибо!
inhuman89 добавил:
хм, тока что проверил, при убийстве с обычным уроном все норм а при убийстве через крит (котороый "добивается" через SetWidgetLife, killing unit = null, стало быть событие срабатывает после нанесения =0
Старый 26.08.2010, 18:52
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Хм чет непонял.. В системах бессмертия, востановление хп происходит через сет лайф, позже наносится урон и у юнита остается 1 оставшийся хп, стало быть урон наносится после.
Ну тогда вот альтернатива:
1.У триггера получения урона поставь условие
return GetWidgetLife(GetTriggerUnit())>0.405
2.Замени сет виджет с минусом на это:
real hp = GetWidgetLife(ut)
if hp > GetEventDamage() then
	call SetWidgetLife(ut,GetWidgetLife(ut)-dmgR)
else
	call UnitDamageTraget(us,ut,dmgR,true,false,AT,DT,WT) //где ат,дт,вт соответстввующие типы
endif
Старый 26.08.2010, 19:03
inhuman89

offline
Опыт: 3,019
Активность:
но тогда придется все равно делать так:
call DisableTrigger(gg_trg_DSsys_main)
call UnitDamageTarget(us,ut,dmgR,true,false,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_UNIVERSAL,WEAPON_TYPE_WHOKNOWS)​&#8203;
call EnableTrigger(gg_trg_DSsys_main)
но тогда у меня почему то не наносится дамаг, хотя на гуи наносился. -_-
Старый 26.08.2010, 19:42
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
не придется -.-, для этого я тебе и написал пункт 1 про условие
попробуй как я написал
А не демажит тк ты отключаешь триггер
Старый 26.08.2010, 19:52
inhuman89

offline
Опыт: 3,019
Активность:
что то я не понял как ты имеешь в виду, можешь сделать то что ты хочешь в коде из первого поста?
inhuman89 добавил:
AlexKARASb:
А не демажит тк ты отключаешь триггер
в гуи же дамажило D:
Старый 28.08.2010, 21:37
Doc

offline
Опыт: 63,163
Активность:
AlexKARASb, так отнимать это бред -_- к тому же чтобы это работало надо отнимать не в акшенач в кондишнах.
Старый 28.08.2010, 22:23
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
function DSsys_main_Actions takes nothing returns nothing
    local unit ut = GetTriggerUnit()
    local unit us = GetEventDamageSource()
    local integer it = GetPlayerId(GetOwningPlayer(ut))+1
    local integer is = GetPlayerId(GetOwningPlayer(us))+1
    local integer dmgI = R2I(GetEventDamage())
    local real dmgR = GetEventDamage()
    local real hp = GetWidgetLife(ut)
    if (dmgR >= 0.60) and (GetWidgetLife(ut) >.405) then
        if ((GetRandomInt(1, 100)<=(GetHeroStr(ut,true))+udg_GG_chanceBLCbonus[it])and(IsUnitType(ut,UNIT_TYPE_STRUCTURE)==fal​?se)and(IsUnitType(ut,UNIT_TYPE_HERO)==true)and(GetUnitStateSwap(UNIT_STATE_LIFE,ut)<( GetUnitStateSwap(UNIT_STATE_MAX_LIFE,ut)-dmgR))) then
            // ===============   Block damage   ===============
            call PlaySoundOnUnitBJ(udg_DSsys_soundHIT[GetRandomInt(4,6)],100,ut)
            call DestroyEffect(AddSpecialEffectTarget( "Abilities\\Weapons\\WingedSerpentMissile\\WingedSerpentMissile.mdl" ,ut,"chest"))
            call SetWidgetLife(ut,hp+dmgR))
            call TextTag ((GetUnitX(ut)-50), GetUnitY(ut),80,12, "|cFF00AAFF" , "<BLOCK>" ,"" )
        else
            if ((GetRandomInt(1, 100)<=(GetHeroAgi(us,true))+udg_GG_chanceCRTbonus[is])and(IsUnitType(ut,UNIT_TYPE_STRUCTURE)==fal​?se)and(IsUnitType(us,UNIT_TYPE_HERO)==true)) then
                // ===============   Crit damage   ===============
                call PlaySoundOnUnitBJ(udg_DSsys_soundHIT[GetRandomInt(7,9)],100,us)
                call DestroyEffect(AddSpecialEffectTarget( "Abilities\\Spells\\Other\\Stampede\\StampedeMissileDeath.mdl" ,ut, "chest" ))
                if hp > dmgR then
                    call SetWidgetLife(ut,hp-dmgR)
                else
                    call UnitDamageTraget(us,ut,dmgR,true,false,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_UNIVERSAL,WEAPON_TYPE_WHOKNOWS)​?
                endif
                call TextTag ((GetUnitX(ut)-50),GetUnitY(ut),80,12, "|cFFFF0000-" ,I2S(dmgI*2), "!" )
            else
                // ===============   Normal damage   ===============
                call PlaySoundOnUnitBJ( udg_DSsys_soundHIT[GetRandomInt(1,3)],100,us)
                call DestroyEffect(AddSpecialEffectTarget( "Objects\\Spawnmodels\\Critters\\Albatross\\CritterBloodAlbatross.mdl", ut, "chest" ))
                call TextTag ((GetUnitX(ut)-50), GetUnitY(ut),80,12, "|cFFD2D2D2-" ,I2S(dmgI), "" )
            endif
        endif
    endif
    // ==================================================
    set ut = null
    set us = null
endfunction

//===========================================================================
function InitTrig_DSsys_main takes nothing returns nothing
    set gg_trg_DSsys_main = CreateTrigger(  )
    call TriggerAddAction( gg_trg_DSsys_main, function DSsys_main_Actions )
endfunction
Doc, знаю, но лучше придумать пока не могу. +всегда когда делаешь не себе меньше инициативность =O
Старый 28.08.2010, 22:29
JassMan
свободен
offline
Опыт: 4,193
Активность:
function InitTrig_DSsys_main takes nothing returns nothing
set gg_trg_DSsys_main = CreateTrigger( )
call TriggerAddAction( gg_trg_DSsys_main, function DSsys_main_Actions )
endfunction
собственно, а как триггер работает без события?
Старый 28.08.2010, 23:00
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
События автор добавляет в других местах я так понимаю.
Старый 28.08.2010, 23:09
inhuman89

offline
Опыт: 3,019
Активность:
AlexKARASb, спасибо, все понял
Doc, если не сложно, можешь пример как в кондишинах?
JassMan, я через другой триггер событие вставляю
Старый 28.08.2010, 23:13
Ответ

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

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

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

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



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