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

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

Ответ
 
Krol

offline
Опыт: 17,884
Активность:
Вот, помогите мну!

Krol добавил:
Вот код, что здесь нетак?

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

function Spell_Action takes nothing returns nothing
    local unit   Caster = GetSpellAbilityUnit()  
    local player p  = GetOwningPlayer  (Caster)
    local real   X  = GetUnitX         (Caster)           
    local real   Y  = GetUnitY         (Caster)
    local group  gr = CreateGroup()
    local effect array ef
    local integer i = 0
    local unit   u
    call DisplayTimedTextToPlayer(Player(0),0,0,60,"1")
    call SetUnitAnimation( Caster, "morph alternate" )
    call GroupEnumUnitsInRange(gr, X, Y, 512, null)
    loop
        set u = FirstOfGroup(gr)
        exitwhen u == null
        if IsPlayerEnemy (GetOwningPlayer(u), p) then
            set ef = AddSpecialEffectTarget("Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl", u, "overhead")
            call SetUnitState ( u, UNIT_STATE_LIFE, RMaxBJ(0, GetUnitState(u, UNIT_STATE_LIFE) - 100))
            set i = i + 1
        endif
        call GroupRemoveUnit (gr, u)
    endloop
    call DestroyGroup (gr)
    call TriggerSleepAction (1)
    set i = 0
    loop
        exitwhen ef[i] == null
        call DestroyEffect(ef[i])   
        set ef[i] = null
        set i = i + 1 
    endloop
    set Caster =null
    set gr     =null
endfunction

//===========================================================================
function InitTrig_Spell takes nothing returns nothing    
    local trigger trig = CreateTrigger()
    local integer i = 0        
    call TriggerAddAction( trig, function Spell_Action)
    loop             
        exitwhen i > 15
        call TriggerRegisterPlayerUnitEvent(trig, Player(i), EVENT_PLAYER_UNIT_SPELL_CAST, Condition(function Spell_Conditions))
        set i = i + 1
    endloop
endfunction


[i]Krol добавил:

Не работает ваще! Создайте тригер в моей карте с названием "Spell" -и вставьте это туда, ID подходит, хз в чём дело=/
Прикрепленные файлы
Тип файла: w3x spell.w3x (8.9 Кбайт, 14 просмотров )
Старый 04.02.2007, 19:35
DeT

offline
Опыт: 5,715
Активность:
Krol
у мну када юзал GetSpellAbilityUnit() брался таргет юнит,т.е. цель пришлось GetTriggerUnit
Старый 05.02.2007, 10:03
J
expert
offline
Опыт: 48,447
Активность:
Помойму я понял - Попробуй вместо этого:
Код:
function InitTrig_Spell takes nothing returns nothing    
    local trigger trig = CreateTrigger()
    local integer i = 0        
    call TriggerAddAction( trig, function Spell_Action)
    loop             
        exitwhen i > 15
        call TriggerRegisterPlayerUnitEvent(trig, Player(i), EVENT_PLAYER_UNIT_SPELL_CAST, Condition(function Spell_Conditions))
        set i = i + 1
    endloop
endfunction

Вставить это:
Код:
function InitTrig_Spell takes nothing returns nothing    
    local trigger trig = CreateTrigger()
    local integer i = 0        
    call TriggerAddAction( trig, function Spell_Action)
    loop             
        exitwhen i > 15
        call TriggerRegisterPlayerUnitEvent(trig, Player(i), EVENT_PLAYER_UNIT_SPELL_CAST, null)
        set i = i + 1
    endloop
    call TriggerAddCondition( trig, Condition(function Spell_Conditions))
endfunction
Старый 05.02.2007, 10:47
adic3x

offline
Опыт: 108,439
Активность:
Jon, а кста такой вопросег: что лучше (в плане оптимизации конечно), делать кондитион отдельной функцией или в коде использовать условный оператор иф?

ADOLF добавил:
Да, походу в TriggerRegisterPlayerUnitEvent кондишин не для трига, а для добавления события, я правильно понял?
Старый 05.02.2007, 11:21
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
Сообщение от ADOLF
Jon, а кста такой вопросег: что лучше (в плане оптимизации конечно), делать кондитион отдельной функцией или в коде использовать условный оператор иф?

лучше использовать как оператор для функции, но как ты уже заметил, это не всегда работает.
Цитата:
Сообщение от ADOLF
Да, походу в TriggerRegisterPlayerUnitEvent кондишин не для трига, а для добавления события, я правильно понял?

В TriggerRegisterPlayerUnitEvent оператор который является фильтрем, и может уловить только те обьекты, для кого он создан (они обозначаются GetFilter<тип>), в данном случае юнита "GetFilterUnit()"
но в условии улавливается именно спел "GetSpellAbilityId()", потому эта функция возвращала null, и потому условуие возвращало false, потому триггер и не работал.
потому Фильтер выгоднее ставить на проверку юнита кастера, а для типа спела надо делать как отдельное добовление условия.
Старый 05.02.2007, 11:43
Krol

offline
Опыт: 17,884
Активность:
Джоник молодец, молодец, спасибо!!! Помогло поменять! Фсё, темку прикрываем, хотя незнаю, мож ещё какой нить вопросег будет, да наверн будет)

Krol добавил:
Эээммм мну теперь нада сделать два уровня, что бы если спелл первого уровня, То 100 урона, если второго, то 150...
Старый 05.02.2007, 18:01
J
expert
offline
Опыт: 48,447
Активность:
Код:
function Spell_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A000'
endfunction

function Spell_Action takes nothing returns nothing
    local unit   Caster = GetSpellAbilityUnit()  
    local player p  = GetOwningPlayer  (Caster)
    local real   X  = GetUnitX         (Caster)           
    local real   Y  = GetUnitY         (Caster)
    local group  gr = CreateGroup()
    local integer level = GetUnitAbilityLevel(Caster, 'A000')
    local real live
    local effect array ef
    local integer i = 0
    local unit   u
    call DisplayTimedTextToPlayer(Player(0),0,0,60,"1")
    call SetUnitAnimation( Caster, "morph alternate" )
    call GroupEnumUnitsInRange(gr, X, Y, 512, null)
    loop
        set u = FirstOfGroup(gr)
        exitwhen u == null
        set live = GetUnitState(u, UNIT_STATE_LIFE)
        if IsPlayerEnemy (GetOwningPlayer(u), p) and (live > 0) then
            set ef[i] = AddSpecialEffectTarget("Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl", u, "chest")
            call SetUnitState ( u, UNIT_STATE_LIFE, RMaxBJ(0, live - 150 - 50*level))
            set i = i + 1
        endif
        call GroupRemoveUnit (gr, u)
    endloop
    call DestroyGroup (gr)
    call TriggerSleepAction (1)
    set i = 0
    loop
        exitwhen ef[i] == null
        call DestroyEffect(ef[i])   
        set ef[i] = null
        set i = i + 1 
    endloop
    set Caster =null
    set gr     =null
endfunction

//===========================================================================
function InitTrig_Spell takes nothing returns nothing    
    local trigger trig = CreateTrigger()
    local integer i = 0        
    call TriggerAddAction( trig, function Spell_Action)
    loop             
        exitwhen i > 15
        call TriggerRegisterPlayerUnitEvent(trig, Player(i), EVENT_PLAYER_UNIT_SPELL_CAST, null)
        set i = i + 1
    endloop
    call TriggerAddCondition( trig, Condition(function Spell_Conditions))
endfunction

Отредактировано Jon, 05.02.2007 в 19:04.
Старый 05.02.2007, 18:03
Krol

offline
Опыт: 17,884
Активность:
Спасибо Джон! Ты прям с первого раза целый код исправил и всё получилось!;)
Старый 05.02.2007, 19:09
J
expert
offline
Опыт: 48,447
Активность:
;): ну это же я ;):
Старый 05.02.2007, 19:10
exAres
I love magic :)
offline
Опыт: 7,788
Активность:
Цитата:
call SetUnitState ( u, UNIT_STATE_LIFE, RMaxBJ(0, live - 150 - 50*level))
- это есть жесть :) лучше наносить урон а не минусовать жизнь.

ЗЫ а зачем "RMaxBJ" ?
Старый 05.02.2007, 19:16
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
Сообщение от MrSmiLe
во-вторых первый уровень отминусует 100 жизни а второй 50 =) лол.

мда.. no comment... ты не осилиш эту мудрость
Цитата:
Сообщение от MrSmiLe
во-первых лучше наносить урон а не минусовать жизнь

какой был первоночальный код... такой я и правил... может так и нужно.. у аффтора спроси...
Цитата:
Сообщение от MrSmiLe
а зачем "RMaxBJ" ?

хз
покрайне мере в BJ функция так... у меня всю руки не поднимутся проверить что будет если будет <0, наверно скорее всего "ничего", но мне лень
Старый 05.02.2007, 19:19
exAres
I love magic :)
offline
Опыт: 7,788
Активность:
Jon насчёт первого прогнал ;)
Старый 05.02.2007, 19:20
Krol

offline
Опыт: 17,884
Активность:
Цитата:
лучше наносить урон а не минусовать жизнь

Ну а разница? У юнита отнимается стока то жизней от скока у него было!
Старый 05.02.2007, 19:20
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
Ну а разница? У юнита отнимается стока то жизней от скока у него было!

при нанесении урона учитывается тип брони, и вообще какая броня, также тип урона, а отнять жизни, это просто ровненько отнимает...
Старый 05.02.2007, 19:22
Krol

offline
Опыт: 17,884
Активность:
Ну а если честно, то триги у мну русские, а тот тригер с дамагом не перевили, гады=/)

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

Ну и пофиг, игрок не догодается=)) Ему не доэтого будет=))
Старый 05.02.2007, 19:23
J
expert
offline
Опыт: 48,447
Активность:
Krol а если у него броня сдерживющая 70% урона
думаю он будет удивлюн когда получит 200-250 урона, а не 60-75
Старый 05.02.2007, 19:37
Krol

offline
Опыт: 17,884
Активность:
Ну лана, где какую и куда строку нада в коде всавить?
Старый 05.02.2007, 19:57
J
expert
offline
Опыт: 48,447
Активность:
сделай таг:
Код:
function Spell_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A000'
endfunction

function Spell_Action takes nothing returns nothing
    local unit   Caster = GetSpellAbilityUnit()  
    local player p  = GetOwningPlayer  (Caster)
    local real   X  = GetUnitX         (Caster)           
    local real   Y  = GetUnitY         (Caster)
    local group  gr = CreateGroup()
    local integer level = GetUnitAbilityLevel(Caster, 'A000')
    local effect array ef
    local integer i = 0
    local unit   u
    call SetUnitAnimation( Caster, "morph alternate" )
    call GroupEnumUnitsInRange(gr, X, Y, 512, null)
    loop
        set u = FirstOfGroup(gr)
        exitwhen u == null
        if IsPlayerEnemy (GetOwningPlayer(u), p) and (GetUnitState(u, UNIT_STATE_LIFE) > 0) then
            set ef[i] = AddSpecialEffectTarget("Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl", u, "chest")
            call UnitDamageTarget(Caster, u, 150+50*level, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_LIGHTNING, WEAPON_TYPE_WHOKNOWS)
            set i = i + 1
        endif
        call GroupRemoveUnit (gr, u)
    endloop
    call DestroyGroup (gr)
    call TriggerSleepAction (1)
    set i = 0
    loop
        exitwhen ef[i] == null
        call DestroyEffect(ef[i])   
        set ef[i] = null
        set i = i + 1 
    endloop
    set Caster =null
    set gr     =null
endfunction

//===========================================================================
function InitTrig_Spell takes nothing returns nothing    
    local trigger trig = CreateTrigger()
    local integer i = 0        
    call TriggerAddAction( trig, function Spell_Action)
    loop             
        exitwhen i > 15
        call TriggerRegisterPlayerUnitEvent(trig, Player(i), EVENT_PLAYER_UNIT_SPELL_CAST, null)
        set i = i + 1
    endloop
    call TriggerAddCondition( trig, Condition(function Spell_Conditions))
endfunction

Отредактировано Jon, 05.02.2007 в 20:18.
Старый 05.02.2007, 20:05
Krol

offline
Опыт: 17,884
Активность:
Во спасибо, всё потестил, работает!
И ненужна мну единица на экране=)
Старый 05.02.2007, 20:15
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
Сообщение от Krol
И ненужна мну единица на экране=)

сори.. забыл
Старый 05.02.2007, 20:18
Ответ

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

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

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

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



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