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

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

Ответ
 
Castiel

offline
Опыт: 2,093
Активность:
Помогите с оптимизацией
На самом деле я ещё новичок в этом деле, но всетакие я прошу помочь. Мой друг сказал что сдесь можно сделать оптимизацию кода. Вот я и ломаю голову над этим. Если кто может, помогите, пожалуйста.

Код:
function Trig_Judgement_attack_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'AOcl'
endfunction

function Trig_Judgement_attack_Func002C takes nothing returns boolean
    if ( not ( GetUnitLifePercent(GetSpellTargetUnit()) <= 20.00 ) ) then
        return false
    endif
    if ( not ( udg_i_Paladin_JudgementAttack >= 60 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Judgement_attack_Actions takes nothing returns nothing
    set udg_i_Paladin_JudgementAttack = GetRandomInt(1, 100)
    if ( Trig_Judgement_attack_Func002C() ) then
        call AddSpecialEffectTargetUnitBJ( "overhead", GetSpellTargetUnit(), "Abilities\\Spells\\Human\\Resurrect\\ResurrectCaster.mdl" )
        call DestroyEffectBJ( GetLastCreatedEffectBJ() )
        call TriggerSleepAction( 0.70 )
        call UnitDamageTargetBJ( GetSpellAbilityUnit(), GetSpellTargetUnit(), 50000.00, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_POISON )
    else
    endif
endfunction

Отредактировано Castiel, 09.03.2009 в 21:53.
Старый 09.03.2009, 21:12
J
expert
offline
Опыт: 48,447
Активность:
Код:
function Trig_Judgement_attack_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'AOcl'
endfunction

function Trig_Judgement_attack_Actions takes nothing returns nothing 
    local unit Caster = GetSpellAbilityUnit()
    local unit Target = GetSpellTargetUnit()
    local integer JudgementAttack = GetRandomInt(1, 100)
    if ((JudgementAttack >= 60) and (GetUnitStatePercent(Target, UNIT_STATE_LIFE, UNIT_STATE_MAX_LIFE) <= 20.)) then
        call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Human\\Resurrect\\ResurrectCaster.mdl", Target, "overhead"))
        call TriggerSleepAction(0.7)
        call UnitDamageTarget(Caster, Target, 50000., true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_POISON, WEAPON_TYPE_WHOKNOWS)
    endif
    set Caster = null 
    set Target = null
endfunction

Отредактировано J, 10.03.2009 в 13:02.
Старый 09.03.2009, 21:32
Castiel

offline
Опыт: 2,093
Активность:
Большое спасибо. Я все понял но вот я немного исправил свой верхний код. Просто там надо было вместо 75 поставить GetRandomInt(1, 100).
Как тогда поставить
GetUnitLifePercent(GetSpellTargetUnit()) <= 20.00
и ещё
udg_i_Paladin_JudgementAttack >= 60
А у тебя стоит только про 20% жизни.
Старый 09.03.2009, 21:54
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
А у тебя стоит только про 20% жизни.

ты прямо перед ифом ставиш ей щначение 75, она всяко будет больше 60

но рас поставил рандом то тогда... вообщем поправил...
Старый 09.03.2009, 22:09
Castiel

offline
Опыт: 2,093
Активность:
Низкий поклон. Просто я хотел понять как делать это с двумя условиями)))

Ребят у меня тут возник ещё один вопрос. А как вот такой оптимизировать. А то я бился с ним и ничего не происходило
Код:
function Trig_Attack_Divine_Func001C takes nothing returns boolean
    if ( not ( GetUnitTypeId(GetAttacker()) == 'Hpal' ) ) then
        return false
    endif
    if ( not ( IsUnitEnemy(GetAttackedUnitBJ(), GetOwningPlayer(GetAttacker())) == true ) ) then
        return false
    endif
    return true
endfunction

function Trig_Attack_Divine_Conditions takes nothing returns boolean
    if ( not Trig_Attack_Divine_Func001C() ) then
        return false
    endif
    return true
endfunction

function Trig_Attack_Divine_Actions takes nothing returns nothing
    call UnitDamageTargetBJ( GetAttacker(), GetAttackedUnitBJ(), I2R(( 4 * GetUnitAbilityLevelSwapped('Awar', GetAttacker()) )), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_POISON )
    call AddSpecialEffectTargetUnitBJ( "chest", GetAttackedUnitBJ(), "Abilities\\Spells\\Other\\Incinerate\\IncinerateBuff.mdl" )
    call DestroyEffectBJ( GetLastCreatedEffectBJ() )
endfunction

Отредактировано Castiel, 10.03.2009 в 00:29.
Старый 09.03.2009, 22:14
alexkill

offline
Опыт: 18,872
Активность:
Цитата:
Просто я хотел понять как делать это с двумя условиями)))

двух условий там не может быть по определению нормальности кодинга (конечно, при желании можно и с 4-мя попробовать =))
Код:
function Trig_Attack_Divine_Actions takes nothing returns nothing
    if GetUnitTypeId(GetAttacker()) == 'Hpal' and IsUnitEnemy(GetTriggerUnit(), GetOwningPlayer(GetAttacker())) then
       call UnitDamageTarget( GetAttacker(), GetTriggerUnit(), 4 * GetUnitAbilityLevel(GetAttacker(), 'Awar'), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_POISON, null )
       call DestroyEffect(AddSpecialEffectTarget( "chest", GetTriggerUnit(), "Abilities\\Spells\\Other\\Incinerate\\IncinerateBuff.mdl" ))
    endif
endfunction

Отредактировано alexkill, 10.03.2009 в 12:58.
Старый 10.03.2009, 12:26
NETRAT

offline
Опыт: 83,712
Активность:
alexkill зачем функцию check выделил?
Старый 10.03.2009, 12:35
alexkill

offline
Опыт: 18,872
Активность:
fixed.
NT, ну чтоб не совсем человека отдалить от триггерных вариантов.
Старый 10.03.2009, 12:57
Castiel

offline
Опыт: 2,093
Активность:
Всем спасибо. А вот там в самом верху где "J" поставил локальные переменные, а сдесь нет. Скажите а там вообще они обязательны? Или можно поставить везде getunit.
и как ещё можно заменить "UnitHasBuffBJ"

Отредактировано Castiel, 10.03.2009 в 14:57.
Старый 10.03.2009, 13:46
Артте
Open up your eyes
offline
Опыт: 23,423
Активность:
Там идет ожидание и глобальная переменная TriggerUnit поменяется. А тут все действия происходят мгновенно с точки зрения вара
Старый 10.03.2009, 14:56
J
expert
offline
Опыт: 48,447
Активность:
Castiel, функции медленнее переменных, потому если ты используеш одну и туже функцию несколько раз то лучше ее будет занести в переменную и пользоваться уже ей...
Старый 10.03.2009, 15:02
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Castiel,
UnitHasBuffBJ==GetUnitAbilityLevel(unit,buffcode)>0
Старый 10.03.2009, 17:19
Castiel

offline
Опыт: 2,093
Активность:
Ребят! У меня ещё один вопрос. Вот у меня было 2 триггера:
1. Если герой прокачивает свою способность №1, то он включает триггер №2 и выключает триггер №1 ( Где герой который прокачал скил наносит с каждым ударом противнику доп. урон). Но я тут подумал а нельзя ли сделать из них 1 триггер и кое что сделал:


Правильно ли я сделал ?


Код:
function Trig_Attack_Divine_Conditions takes nothing returns boolean
return GetUnitAbilityLevel(GetAttacker(),'Awar')>0
endfunction

function Trig_Attack_Divine_Actions takes nothing returns nothing
if ( GetUnitTypeId(GetAttacker()) == 'Hpal') and ( IsUnitEnemy(GetTriggerUnit(), GetOwningPlayer(GetAttacker()))) then
       call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\Incinerate\\IncinerateBuff.mdl", GetTriggerUnit(), "chest"))
       call UnitDamageTarget( GetAttacker(), GetTriggerUnit(), 4 * GetUnitAbilityLevel(GetAttacker(), 'Awar'), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_POISON, null )
    endif
endfunction
//===========================================================================
function InitTrig_Attack_Divine takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddCondition( t, Condition( function Trig_Attack_Divine_Conditions ) )
    call TriggerAddAction( t, function Trig_Attack_Divine_Actions )
endfunction
Старый 10.03.2009, 18:00
NETRAT

offline
Опыт: 83,712
Активность:
скорее всего - да, то есть, совершенно очевидно что так как ты описал сначала, способности не пишут - большинство жассеров почти никогда не используют отключение и включение триггера - либо создают либо удаляют, отключение используется только для того что бы избежать зацикливания, но обычно зацикливание исключается на этапе проектирования
Старый 10.03.2009, 18:15
Castiel

offline
Опыт: 2,093
Активность:
просто мне вот интересно, если несколько раз прокачать одну и ту же способность, то не создается ли несколько таких триггеров? Ну то есть прокал, побил и создалось может несколько триггеров, а потом прокачал ещё и побил и создалось ещё несколько триггеров. Или просто создался триггер и все, бей не бей там плевать.Так это или нет ?
Старый 10.03.2009, 18:24
Ответ

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

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

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

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



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